Add integrity checks.
authorbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Sat, 22 Jan 2005 04:21:32 +0000 (04:21 +0000)
committerbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Sat, 22 Jan 2005 04:21:32 +0000 (04:21 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@349 38d2e660-2303-0410-9eaa-f027e97ec537

kern/sem.c
mware/list.h

index 05488e4c2fab64d3b057a6d9a5b5c2d526451514..eab3e5db475d26a1d2b46b5eb46429c69d30ae7c 100755 (executable)
@@ -15,6 +15,9 @@
 
 /*#*
  *#* $Log$
+ *#* 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 <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 +82,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 +115,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 +133,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 +159,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
index 4762c3b2ae81cfd77942ea61de0623151b659da0..e28abb43da95097c2e1bcfe03a3bf0021c6da908 100755 (executable)
@@ -15,6 +15,9 @@
 
 /*#*
  *#* $Log$
+ *#* Revision 1.12  2005/01/22 04:21:32  bernie
+ *#* Add integrity checks.
+ *#*
  *#* Revision 1.11  2004/12/31 16:44:11  bernie
  *#* list_remHead(), list_remTail(): Name like normal functions.
  *#*
@@ -118,6 +121,26 @@ typedef struct _List
                (l)->tail = (Node *)(&(l)->head); \
        } while (0)
 
+/* Make sure that a list is valid (it was initialized and is not corrupted) */
+#ifdef _DEBUG
+       #define LIST_ASSERT_VALID(l) \
+               do { \
+                       Node *n, *pred; \
+                       ASSERT((l)->head != NULL); \
+                       ASSERT((l)->null == NULL); \
+                       ASSERT((l)->tail != NULL); \
+                       pred = (Node *)(&(l)->head); \
+                       FOREACHNODE(n, l) \
+                       { \
+                               ASSERT(n->pred == pred); \
+                               pred = n; \
+                       } \
+                       ASSERT(n == (Node *)(&(l)->null)); \
+               } while (0)
+#else
+       #define LIST_ASSERT_VALID(l) do {} while (0)
+#endif
+
 /*! Add node to list head. */
 #define ADDHEAD(l,n) \
        do { \