home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / exec_library / signals / signals.e
Text File  |  1995-04-08  |  2KB  |  72 lines

  1. -> signals.e
  2.  
  3. -> E-Note: eCodeTask() protects an E function so you can call it from other
  4. ->         tasks and have access to the global variables of this program
  5. MODULE 'amigalib/tasks',
  6.        'other/ecode',
  7.        'dos/dos'
  8.  
  9. ENUM ERR_NONE, ERR_ECODE, ERR_SIG, ERR_TASK
  10.  
  11. RAISE ERR_SIG IF AllocSignal()=-1
  12.  
  13. DEF mainsignum=-1, mainsig, wakeupsigs, maintask=NIL, subtask=NIL
  14.  
  15. PROC main() HANDLE
  16.   DEF done=FALSE, waitingForSubtask=TRUE, ecode, subtaskname
  17.   subtaskname:='RKM_signal_subtask'
  18.  
  19.   -> We must allocate any special signals we want to receive.
  20.   mainsignum:=AllocSignal(-1)
  21.  
  22.   mainsig:=Shl(1, mainsignum)  -> subtask can access this global
  23.   maintask:=FindTask(NIL)      -> subtask can access this global
  24.  
  25.   WriteF('We alloc a signal, create a task, wait for signals\n')
  26.   IF NIL=(ecode:=eCodeTask({subtaskcode})) THEN Raise(ERR_ECODE)
  27.   IF NIL=(subtask:=createTask(subtaskname, 0, ecode, 2000)) THEN Raise(ERR_TASK)
  28.  
  29.   WriteF('After subtask signals, press CTRL-C or CTRL-D to exit\n')
  30.  
  31.   REPEAT
  32.     -> Wait on the combined mask for all of the signals we are interested in.
  33.     -> All processes have the CTRL_C thru CTRL_F signals.  We're also Waiting
  34.     -> on the mainsig we allocated for our subtask to signal us with.  We could
  35.     -> also Wait on the signals of any ports/windows our main task created...
  36.     wakeupsigs:=Wait(mainsig OR SIGBREAKF_CTRL_C OR SIGBREAKF_CTRL_D)
  37.  
  38.     -> Deal with all signals that woke us up - may be more than one
  39.     IF wakeupsigs AND mainsig
  40.       WriteF('Signalled by subtask\n')
  41.       waitingForSubtask:=FALSE  -> OK to kill subtask now
  42.     ENDIF
  43.     IF wakeupsigs AND SIGBREAKF_CTRL_C
  44.       WriteF('Got CTRL-C signal\n')
  45.       done:=TRUE
  46.     ENDIF
  47.     IF wakeupsigs AND SIGBREAKF_CTRL_D
  48.       WriteF('Got CTRL-D signal\n')
  49.       done:=TRUE
  50.     ENDIF
  51.   UNTIL done AND (waitingForSubtask=FALSE)
  52. EXCEPT DO
  53.   IF subtask
  54.     Forbid()
  55.     deleteTask(subtask)
  56.     Permit()
  57.   ENDIF
  58.   IF mainsignum<>-1 THEN FreeSignal(mainsignum)
  59.   SELECT exception
  60.   CASE ERR_SIG;   WriteF('No signals available\n')
  61.   CASE ERR_TASK;  WriteF('Can''t create subtask\n')
  62.   CASE ERR_ECODE; WriteF('Ran out of memory in eCodeTask()\n')
  63.   ENDSELECT
  64. ENDPROC
  65.  
  66. PROC subtaskcode()
  67.   Signal(maintask, mainsig)
  68.   Wait(NIL)  -> Safe state in which this subtask can be deleted
  69. ENDPROC
  70.  
  71. verstag: CHAR 0, '$VER: signals 37.1 (28.3.91)', 0
  72.