Include top-level headers from cfg/ subdir.
[bertos.git] / kern / sem.c
index 05488e4c2fab64d3b057a6d9a5b5c2d526451514..65c07bd17a7661df3998a8de715b8e35754d2808 100755 (executable)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.9  2005/04/11 19:10:28  bernie
+ *#* Include top-level headers from cfg/ subdir.
+ *#*
+ *#* Revision 1.8  2005/01/22 04:20:42  bernie
+ *#* Add integrity checks.
+ *#*
  *#* Revision 1.7  2004/11/28 23:20:25  bernie
  *#* Remove obsolete INITLIST macro.
  *#*
 #include "proc_p.h"
 #include "signal.h"
 #include "hw.h"
+#include <cfg/debug.h>
+
+INLINE void sem_verify(struct Semaphore *s)
+{
+       LIST_ASSERT_VALID(&s->wait_queue);
+       ASSERT(s->nest_count >= 0);
+       ASSERT(s->nest_count < 128);   // heuristic max
+}
 
 
 /*!
@@ -71,6 +85,7 @@ bool sem_attempt(struct Semaphore *s)
        bool result = false;
 
        proc_forbid();
+       sem_verify(s);
        if ((!s->owner) || (s->owner == CurrentProcess))
        {
                s->owner = CurrentProcess;
@@ -103,6 +118,7 @@ bool sem_attempt(struct Semaphore *s)
 void sem_obtain(struct Semaphore *s)
 {
        proc_forbid();
+       sem_verify(s);
 
        /* Is the semaphore already locked by another process? */
        if (UNLIKELY(s->owner && (s->owner != CurrentProcess)))
@@ -120,6 +136,8 @@ void sem_obtain(struct Semaphore *s)
        }
        else
        {
+               ASSERT(ISLISTEMPTY(&s->wait_queue));
+
                /* The semaphore was free: lock it */
                s->owner = CurrentProcess;
                s->nest_count++;
@@ -144,6 +162,9 @@ void sem_obtain(struct Semaphore *s)
 void sem_release(struct Semaphore *s)
 {
        proc_forbid();
+       sem_verify(s);
+
+       ASSERT(s->owner == CurrentProcess);
 
        /*
         * Decrement nesting count and check if the semaphore