From 3a77131c5f9f16bd97c08bc5dd2e0c9333c75259 Mon Sep 17 00:00:00 2001 From: bernie Date: Sat, 22 Jan 2005 04:21:32 +0000 Subject: [PATCH] Add integrity checks. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@349 38d2e660-2303-0410-9eaa-f027e97ec537 --- kern/sem.c | 18 ++++++++++++++++++ mware/list.h | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/kern/sem.c b/kern/sem.c index 05488e4c..eab3e5db 100755 --- a/kern/sem.c +++ b/kern/sem.c @@ -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. *#* @@ -42,6 +45,14 @@ #include "proc_p.h" #include "signal.h" #include "hw.h" +#include + +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 diff --git a/mware/list.h b/mware/list.h index 4762c3b2..e28abb43 100755 --- a/mware/list.h +++ b/mware/list.h @@ -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 { \ -- 2.25.1