home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Netzwerk / NETMU17.LHA / accounts / daemon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-02  |  2.0 KB  |  96 lines

  1. /*
  2. **    $VER: daemon.c 1.0 (02.11.94)
  3. **
  4. **    start & stop a daemon process in a shared library
  5. **
  6. **    © Copyright 1994 by Norbert Püschel
  7. **    All Rights Reserved
  8. */
  9.  
  10. #include "daemon.h"
  11.  
  12. #include <dos/dostags.h>
  13.  
  14. void InitDaemon(volatile struct Daemon *dm)
  15.  
  16. {
  17.   InitSemaphore((struct SignalSemaphore *)&dm->dm_Sync);
  18.   dm->dm_Process = 0;
  19.   dm->dm_Signal = -1;
  20.   dm->dm_Startup = 0;
  21. }
  22.  
  23. BOOL StartDaemon(volatile struct Daemon *dm,void (*func)(void),STRPTR name,BYTE pri)
  24.  
  25. {
  26.   Forbid();
  27.   if(dm->dm_Process == 0) {
  28.     dm->dm_Process = CreateNewProcTags(NP_Entry,func,
  29.                                        NP_Name,name,
  30.                                        NP_Priority,pri,
  31.                                        NP_WindowPtr,-1,
  32.                                        TAG_DONE);
  33.     if(dm->dm_Process) {
  34.       DoPkt1((struct MsgPort *)&dm->dm_Process->pr_MsgPort,0,(LONG)dm);
  35.     }
  36.   }
  37.   Permit();
  38.  
  39.   return((BOOL)(dm->dm_Process != 0));
  40. }
  41.  
  42. void StopDaemon(volatile struct Daemon *dm)
  43.  
  44. {
  45.   Forbid();
  46.   if(dm->dm_Process) {
  47.     Signal((struct Task *)(dm->dm_Process),1L << dm->dm_Signal);
  48.     
  49.     ObtainSemaphore((struct SignalSemaphore *)&dm->dm_Sync);
  50.     ReleaseSemaphore((struct SignalSemaphore *)&dm->dm_Sync);
  51.  
  52.     dm->dm_Process = 0;
  53.     dm->dm_Signal = -1;
  54.     dm->dm_Startup = 0;
  55.   }
  56.   Permit();
  57. }
  58.  
  59. volatile struct Daemon *DaemonInit(void)
  60.  
  61. {
  62.   volatile struct Daemon *dm;
  63.   struct DosPacket *startup;
  64.  
  65.   startup = WaitPkt();
  66.  
  67.   dm = (volatile struct Daemon *)startup->dp_Arg1;
  68.  
  69.   dm->dm_Signal = AllocSignal(-1);
  70.   dm->dm_Startup = startup;
  71.  
  72.   return(dm);
  73. }
  74.  
  75. void DaemonInitOK(volatile struct Daemon *dm)
  76.  
  77. {
  78.   ObtainSemaphore((struct SignalSemaphore *)&dm->dm_Sync);
  79.   PutMsg(dm->dm_Startup->dp_Port,dm->dm_Startup->dp_Link);
  80.   dm->dm_Startup = 0;
  81. }
  82.  
  83. void DaemonExit(volatile struct Daemon *dm)
  84.  
  85. {
  86.   if(dm->dm_Signal != -1) FreeSignal(dm->dm_Signal);
  87.   Forbid();
  88.   if(dm->dm_Startup) {
  89.     PutMsg(dm->dm_Startup->dp_Port,dm->dm_Startup->dp_Link);
  90.     dm->dm_Startup = 0;
  91.   }
  92.   else {
  93.     ReleaseSemaphore((struct SignalSemaphore *)&dm->dm_Sync);
  94.   }
  95. }
  96.