X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fsem.c;h=9e5905f6ae4db7c34777c0a5b7d04d752ef03d97;hb=ba39842cde8d33243188a2dc22baa8f1581b1c2d;hp=98646e939047200abe5cd7bf64876aaafc3812c2;hpb=1cc167e20f21d2e81527ca47ccd4a21a6198f86f;p=bertos.git diff --git a/kern/sem.c b/kern/sem.c index 98646e93..9e5905f6 100755 --- a/kern/sem.c +++ b/kern/sem.c @@ -3,7 +3,7 @@ * * * \brief Semaphore based synchronization services. @@ -13,12 +13,21 @@ * \author Bernardo Innocenti */ -/* - * $Log$ - * Revision 1.1 2004/05/23 17:27:00 bernie - * Import kern/ subdirectory. - * - */ +/*#* + *#* $Log$ + *#* Revision 1.4 2004/08/25 14:12:09 rasky + *#* Aggiornato il comment block dei log RCS + *#* + *#* Revision 1.3 2004/08/08 05:53:23 bernie + *#* Use DISABLE_IRQSAVE/ENABLE_IRQRESTORE; Cleanup documentation. + *#* + *#* Revision 1.2 2004/06/03 11:27:09 bernie + *#* Add dual-license information. + *#* + *#* Revision 1.1 2004/05/23 17:27:00 bernie + *#* Import kern/ subdirectory. + *#* + *#*/ #include "sem.h" #include "proc.h" @@ -46,10 +55,14 @@ void sem_init(struct Semaphore *s) * * \note each call to sem_attempt() must be matched by a * call to sem_release(). + * + * \see sem_obtain() sem_release() */ bool sem_attempt(struct Semaphore *s) { - DISABLE_INTS; + cpuflags_t flags; + DISABLE_IRQSAVE(flags); + if ((!s->owner) || (s->owner == CurrentProcess)) { s->owner = CurrentProcess; @@ -57,7 +70,8 @@ bool sem_attempt(struct Semaphore *s) ENABLE_INTS; return true; } - ENABLE_INTS; + + ENABLE_IRQRESTORE(flags); return false; } @@ -76,30 +90,34 @@ bool sem_attempt(struct Semaphore *s) * the most common case: the semaphore is free or locked * by the calling process itself. Rearranging this code * is probably a bad idea. + * + * \sa sem_release() sem_attempt() */ void sem_obtain(struct Semaphore *s) { - DISABLE_INTS; + cpuflags_t flags; + DISABLE_IRQSAVE(flags); /* Is the semaphore already locked by another process? */ - if (s->owner && (s->owner != CurrentProcess)) + if (UNLIKELY(s->owner && (s->owner != CurrentProcess))) { /* Append calling process to the wait queue */ ADDTAIL(&s->wait_queue, (Node *)CurrentProcess); - ENABLE_INTS; + ENABLE_IRQRESTORE(flags); - /* We will awake only when the current owner calls - * ReleaseSemaphore(). Then, the semaphore will already + /* + * We will wake up only when the current owner calls + * sem_release(). Then, the semaphore will already * be locked for us. */ proc_schedule(); } else { - /* The semaphore is free: lock it */ + /* The semaphore was free: lock it */ s->owner = CurrentProcess; s->nest_count++; - ENABLE_INTS; + ENABLE_IRQRESTORE(flags); } } @@ -114,12 +132,16 @@ void sem_obtain(struct Semaphore *s) * the most common case: the semaphore has been locked just * once and nobody else was waiting for it. Rearranging * this code is probably a bad idea. + * + * \sa sem_obtain() sem_attempt() */ void sem_release(struct Semaphore *s) { - DISABLE_INTS; + cpuflags_t flags; + DISABLE_IRQSAVE(flags); - /* Decremement nesting count and check if the semaphore + /* + * Decremement nesting count and check if the semaphore * has been fully unlocked */ if (--s->nest_count == 0) @@ -139,6 +161,6 @@ void sem_release(struct Semaphore *s) } } - ENABLE_INTS; + ENABLE_IRQRESTORE(flags); }