*** INTERRUPTS ***

Interrupts are used to signal another process to jump to a pre-specified
procedure. If you look at the talker server and client code you can see that
the server interrupts the client when it has data for it. 

   Interrupts are controlled by the following commands: onint, interrupt, 
timer, ei & di. "onint" sets up what to do when an interrupt is received,
"interrupt" causes an interrupt to be sent, "timer" specifies when a timer
interrupt will be received , "ei" enables interrupts and "di" disables them.

The system variable $int_mesg stores the pid of the interrupting process and
the data it sent to us (if a timer interrupt is received it has the value
"0 TIMER") so for example if process 2 interrupts process 3 with the
following command: interrupt 3 with "this is a test" , then the $int_mesg
variable for 2 will be set to "2 this is a test". To extract the pid of the
interrupting process simply do: set pid [head $int_mesg]

Processes can receive three different types of interrupts in Avios and they 
are the following:

CHILD_INT 
   An interrupt from a child process of the current process. A child process
   is considered only to be an *immediate* descendent , not a grandchild etc.

NONCHILD_INT 
   An interrupt from any process that is not a child one.
 
TIMER_INT
   An interrupt from the timer.

All these states are very short lived so you will hardly ever see them as
the status of a process. Read up further on the commands in the commands 
documentation file.


Recursion problems
------------------
Since recursion is not allowed in Avios problems will occur if an interrupt
procedure is a procedure which is already somewhere on the stack.
Eg: If an interrupt occurs whilst in procedure A and the program has been set
    to jump to procedure A on an interrupt an error will occur when this 
    interrupt occurs. Similarly if the interrupt jumps to procedure B which 
    *then* calls A an error will also occur.
To get around these problems you must use the "di on <procedure>" command 
which disables interrupts as soon as the given procedure is called. If the
program had "di on A" in it then no interrupt could ever occur while it was
in procedure A so no recursion error could occur. Once it leaves the procedure
interrupts are *automatically* reset to what they were before (ie enabled or
still disabled).