home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 6 / Sonderheft_6-96.iso / pd / libraries / wbstart / src / handler.c < prev    next >
C/C++ Source or Header  |  1996-11-03  |  4KB  |  190 lines

  1. /*
  2.  * handler.c  V2.2
  3.  *
  4.  * WBStart handler entry point
  5.  *
  6.  * (c) 1991-1996 Stefan Becker
  7.  */
  8.  
  9. #include "wbstart.h"
  10.  
  11. /* Global data */
  12. struct Library *DOSBase;
  13. struct Library *IconBase;
  14. struct Library *UtilityBase;
  15.  
  16. /* Handler entry point */
  17. __geta4 void WBStartHandler(void)
  18. {
  19.  struct Message *msg;
  20.  
  21.  /* Wait for and retrieve startup message */
  22.  {
  23.   struct MsgPort *p = &((struct Process *) FindTask(NULL))->pr_MsgPort;
  24.  
  25.   /* Wait for startup message */
  26.   WaitPort(p);
  27.  
  28.   /* Retrieve startup message */
  29.   msg = GetMsg(p);
  30.  }
  31.  
  32.  /* Set error reply code */
  33.  msg->mn_Node.ln_Name = (char *) RETURN_FAIL;
  34.  
  35.  DEBUGLOG(kprintf("Handler startup.\n");)
  36.  
  37.  /* Open dos.library */
  38.  if (DOSBase = OpenLibrary(DosName, 39)) {
  39.  
  40.   /* Open icon.library */
  41.   if (IconBase = OpenLibrary("icon.library", 39)) {
  42.  
  43.    /* Open utility.library */
  44.    if (UtilityBase = OpenLibrary("utility.library", 39)) {
  45.  
  46.     /* Initialize memory */
  47.     if (InitMemory()) {
  48.      BYTE sig;
  49.  
  50.      /* Allocate signal for message port */
  51.      if ((sig = AllocSignal(-1)) >= 0) {
  52.       struct MsgPort *p;
  53.  
  54.       /* Allocate memory for handler message port */
  55.       if (p = AllocateMemory(sizeof(struct MsgPort))) {
  56.        ULONG portmask, waitmask, active;
  57.  
  58.        DEBUGLOG(kprintf("Handler resources allocated.\n");)
  59.  
  60.        /* Initialize message port */
  61.        p->mp_Flags   = PA_SIGNAL;
  62.        p->mp_SigBit  = sig;
  63.        p->mp_SigTask = FindTask(NULL);
  64.  
  65.        /* Initialize message list */
  66.        NewList(&p->mp_MsgList);
  67.  
  68.        /* Set handler port in library base */
  69.        WBStartBase->wbsb_Port = p;
  70.  
  71.        /* All resources allocated */
  72.        msg->mn_Node.ln_Name = (char *) RETURN_OK;
  73.  
  74.        /* Reply startup message */
  75.        ReplyMsg(msg);
  76.  
  77.        /* Install Workbench path */
  78.        InstallWorkbenchPath();
  79.  
  80.        /* Generate signal masks */
  81.        portmask = 1L << sig;
  82.        waitmask = portmask | SIGBREAKF_CTRL_C;
  83.  
  84.        /* No active tasks */
  85.        active = 0;
  86.  
  87.        /* Event loop */
  88.        while (1) {
  89.         ULONG signals;
  90.  
  91.         /* Wait for signal */
  92.         signals = Wait(waitmask);
  93.  
  94.         /* New message arrived? */
  95.         if (signals & portmask) {
  96.  
  97.          /* Retrieve message from port */
  98.          while (msg = GetMsg(p)) {
  99.  
  100.           /* Reply message? */
  101.           if (msg->mn_Node.ln_Type == NT_REPLYMSG) {
  102.  
  103.            DEBUGLOG(kprintf("WB process 0x%08lx left.\n", msg);)
  104.  
  105.            /* Yes, one Workbench process has been completed */
  106.            active--;
  107.  
  108.            /* Free allocated resources for this process */
  109.            FreeProcessData(msg, TRUE);
  110.  
  111.           } else {
  112.  
  113.            DEBUGLOG(kprintf("Please start program.\n");)
  114.  
  115.            /* No, IPC message. Start program and set return code */
  116.            if ((msg->mn_Node.ln_Name =
  117.                 (char *) StartProgram((struct TagItem *) msg->mn_Node.ln_Name))
  118.                 == RETURN_OK)
  119.  
  120.             /* One process started */
  121.             active++;
  122.  
  123.            /* Reply message */
  124.            ReplyMsg(msg);
  125.           }
  126.          }
  127.         }
  128.  
  129.         /* Stop signal, no active processes and can we lock the library base? */
  130.         if ((signals & SIGBREAKF_CTRL_C) && (active == 0) &&
  131.             AttemptSemaphore(&WBStartBase->wbsb_Semaphore)) {
  132.  
  133.          /* Remove handler port from library base */
  134.          WBStartBase->wbsb_Port = NULL;
  135.  
  136.          /* Release semaphore */
  137.          ReleaseSemaphore(&WBStartBase->wbsb_Semaphore);
  138.  
  139.          DEBUGLOG(kprintf("Handler leaving.\n");)
  140.  
  141.          /* Leave loop */
  142.          break;
  143.         }
  144.        }
  145.  
  146.        /* Remove possible outstanding IPC message */
  147.        if (msg = GetMsg(p)) {
  148.  
  149.         /* Set error reply code */
  150.         msg->mn_Node.ln_Name = (char *) RETURN_FAIL;
  151.  
  152.         /* Reply message */
  153.         ReplyMsg(msg);
  154.        }
  155.  
  156.        /* Startup message already replied */
  157.        msg = NULL;
  158.  
  159.        /* Remove Workbench path */
  160.        RemoveWorkbenchPath();
  161.  
  162.        FreeMemory(p);
  163.       }
  164.       FreeSignal(sig);
  165.      }
  166.      DeleteMemory();
  167.     }
  168.     CloseLibrary(UtilityBase);
  169.    }
  170.    CloseLibrary(IconBase);
  171.   }
  172.   CloseLibrary(DOSBase);
  173.  }
  174.  
  175.  /* Error in resource allocation? */
  176.  if (msg)
  177.  
  178.   /* Yes, reply message with an error code */
  179.   ReplyMsg(msg);
  180.  
  181.  else {
  182.  
  183.   /* No, switch to mono-tasking before leaving */
  184.   Forbid();
  185.  
  186.   /* Handler is going inactive now */
  187.   WBStartBase->wbsb_State = WBSTART_HANDLER_INACTIVE;
  188.  }
  189. }
  190.