mirror of https://github.com/zrafa/xinu-avr.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1004 B
35 lines
1004 B
/* semreset.c - semreset */ |
|
|
|
#include <xinu.h> |
|
|
|
/*------------------------------------------------------------------------ |
|
* semreset - Reset a semaphore's count and release waiting processes |
|
*------------------------------------------------------------------------ |
|
*/ |
|
syscall semreset( |
|
sid32 sem, /* ID of semaphore to reset */ |
|
int32 count /* New count (must be >= 0) */ |
|
) |
|
{ |
|
intmask mask; /* Saved interrupt mask */ |
|
struct sentry *semptr; /* Ptr to semaphore table entry */ |
|
qid16 semqueue; /* Semaphore's process queue ID */ |
|
pid32 pid; /* ID of a waiting process */ |
|
|
|
mask = disable(); |
|
|
|
if (count < 0 || isbadsem(sem) || semtab[sem].sstate==S_FREE) { |
|
restore(mask); |
|
return SYSERR; |
|
} |
|
|
|
semptr = &semtab[sem]; |
|
semqueue = semptr->squeue; /* Free any waiting processes */ |
|
resched_cntl(DEFER_START); |
|
while ((pid=getfirst(semqueue)) != EMPTY) |
|
ready(pid); |
|
semptr->scount = count; /* Reset count as specified */ |
|
resched_cntl(DEFER_STOP); |
|
restore(mask); |
|
return OK; |
|
}
|
|
|