X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=kern%2Fsem.c;h=9e5905f6ae4db7c34777c0a5b7d04d752ef03d97;hb=b6b9bf085c6a02bca4441599d176344e0153a612;hp=25cf79e636c0be5704888cedb339b2be5f0ff445;hpb=96f0ef786b54356c56cc3d4e4f0838df2505cfcc;p=bertos.git diff --git a/kern/sem.c b/kern/sem.c index 25cf79e6..9e5905f6 100755 --- a/kern/sem.c +++ b/kern/sem.c @@ -13,15 +13,21 @@ * \author Bernardo Innocenti */ -/* - * $Log$ - * 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. - * - */ +/*#* + *#* $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" @@ -49,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; @@ -60,7 +70,8 @@ bool sem_attempt(struct Semaphore *s) ENABLE_INTS; return true; } - ENABLE_INTS; + + ENABLE_IRQRESTORE(flags); return false; } @@ -79,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); } } @@ -117,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) @@ -142,6 +161,6 @@ void sem_release(struct Semaphore *s) } } - ENABLE_INTS; + ENABLE_IRQRESTORE(flags); }