home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_12 / 8n12084a < prev    next >
Text File  |  1990-08-29  |  2KB  |  60 lines

  1. /* basicdd.c - Basic Device Driver task */
  2.  
  3. #include <synrtx.h>
  4.  
  5. #define ACQUIRE    0
  6. #define RELEASE    1
  7. #define EXCEPTION  2 
  8. #define NOBODY     (task_t)0
  9.  
  10. static task_t owner;
  11.  
  12. static handler Acquire(msg_t *msg_p) {
  13.     register task_t caller = msg_p->srcTid;
  14.     register task_t self   = msg_p->dstTid;
  15.  
  16.     owner = caller;
  17.  
  18.     /* interrupt caller.Grant */
  19.     msg_p->srcTid = self;
  20.     msg_p->dstTid = caller;
  21.     msg_p->dstHid = /* caller's GRANT handler id */
  22.     msg_p->type   = msg_type_SYNC;
  23.     task_interrupt(&msg);
  24. }
  25.  
  26. static handler Release(msg_t *msg_p) {
  27.     register TID caller = msg_p->srcTid;
  28.     register TID self   = msg_p->dstTid;
  29.  
  30.     if (owner == caller)
  31.         owner = NOBODY;
  32.     else {
  33.         /* interrupt self.Exception(caller) */
  34.         msg_p->srcTid = msg_p->dstTid = self;
  35.         msg_p->dstHid = EXCEPTION;
  36.         msg_p->type   = msg_type_WORD;
  37.         msg_p->value.w = (word)caller;
  38.         task_interrupt(msg_p);
  39.     }
  40. }
  41.  
  42. static handler Exception(msg_t *msg_p) {
  43.     io_putf("Illegal Access to Device Driver by Task #%w\n", msg_p->value.w);
  44. }
  45.  
  46. task BasicDeviceDriver(void) {
  47.     task_setHandler(3, Acquire, Release, Exception);
  48.  
  49.     owner = NOBODY;
  50.     loop {
  51.         task_enableWait(NO_TIMEOUT, 1, ACQUIRE);
  52.         do  /* The owner can now used the device ...
  53.              * only the client (owner) can release it.
  54.              */
  55.             task_enableWait(NO_TIMEOUT, 2, RELEASE, EXCEPTION);
  56.         while (owner != NOBODY);
  57.         }
  58.     }
  59. }
  60.