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 >
Wrap
Text File
|
1990-08-29
|
2KB
|
60 lines
/* basicdd.c - Basic Device Driver task */
#include <synrtx.h>
#define ACQUIRE 0
#define RELEASE 1
#define EXCEPTION 2
#define NOBODY (task_t)0
static task_t owner;
static handler Acquire(msg_t *msg_p) {
register task_t caller = msg_p->srcTid;
register task_t self = msg_p->dstTid;
owner = caller;
/* interrupt caller.Grant */
msg_p->srcTid = self;
msg_p->dstTid = caller;
msg_p->dstHid = /* caller's GRANT handler id */
msg_p->type = msg_type_SYNC;
task_interrupt(&msg);
}
static handler Release(msg_t *msg_p) {
register TID caller = msg_p->srcTid;
register TID self = msg_p->dstTid;
if (owner == caller)
owner = NOBODY;
else {
/* interrupt self.Exception(caller) */
msg_p->srcTid = msg_p->dstTid = self;
msg_p->dstHid = EXCEPTION;
msg_p->type = msg_type_WORD;
msg_p->value.w = (word)caller;
task_interrupt(msg_p);
}
}
static handler Exception(msg_t *msg_p) {
io_putf("Illegal Access to Device Driver by Task #%w\n", msg_p->value.w);
}
task BasicDeviceDriver(void) {
task_setHandler(3, Acquire, Release, Exception);
owner = NOBODY;
loop {
task_enableWait(NO_TIMEOUT, 1, ACQUIRE);
do /* The owner can now used the device ...
* only the client (owner) can release it.
*/
task_enableWait(NO_TIMEOUT, 2, RELEASE, EXCEPTION);
while (owner != NOBODY);
}
}
}