Added silc_mutex_assert_locked.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 6 Nov 2006 16:28:25 +0000 (16:28 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 6 Nov 2006 16:28:25 +0000 (16:28 +0000)
lib/silcutil/silcmutex.h
lib/silcutil/unix/silcunixthread.c
lib/silcutil/win32/silcwin32thread.c

index 52407855d648726701c08bda6cb032282fd3230d..37f08add5715266a1c68e573538527f9956e1a65 100644 (file)
@@ -112,10 +112,24 @@ void silc_mutex_lock(SilcMutex mutex);
  * NOTES
  *
  *    The caller must not call the silc_mutex_unlock for an unlocked
- *    mutex or mutex not locked by the current thread.  It is fatal
- *    error if this occurs.
+ *    mutex or mutex not locked by the current thread.
  *
  ***/
 void silc_mutex_unlock(SilcMutex mutex);
 
+/****f* silcutil/SilcMutexAPI/silc_mutex_assert_locked
+ *
+ * SYNOPSIS
+ *
+ *    void silc_mutex_assert_locked(SilcMutex mutex);
+ *
+ * DESCRIPTION
+ *
+ *    Asserts that the `mutex' is locked.  It is fatal error if the mutex
+ *    is not locked.  If debugging is not compiled in this function has
+ *    no effect (SILC_DEBUG define).
+ *
+ ***/
+void silc_mutex_assert_locked(SilcMutex mutex);
+
 #endif
index 487faf051d1343591ade8af90addb71df65f77db..3985a6174fe26f5fd37397d45705a2f7a52b35c5 100644 (file)
@@ -104,9 +104,8 @@ SilcBool silc_thread_wait(SilcThread thread, void **exit_value)
 struct SilcMutexStruct {
 #ifdef SILC_THREADS
   pthread_mutex_t mutex;
-#else
-  void *tmp;
 #endif /* SILC_THREADS */
+  unsigned int locked : 1;
 };
 
 SilcBool silc_mutex_alloc(SilcMutex *mutex)
@@ -116,6 +115,7 @@ SilcBool silc_mutex_alloc(SilcMutex *mutex)
   if (*mutex == NULL)
     return FALSE;
   pthread_mutex_init(&(*mutex)->mutex, NULL);
+  (*mutex)->locked = FALSE;
   return TRUE;
 #else
   return FALSE;
@@ -137,7 +137,8 @@ void silc_mutex_lock(SilcMutex mutex)
 #ifdef SILC_THREADS
   if (mutex) {
     if (pthread_mutex_lock(&mutex->mutex))
-      assert(FALSE);
+      SILC_ASSERT(FALSE);
+    mutex->locked = TRUE;
   }
 #endif /* SILC_THREADS */
 }
@@ -147,11 +148,20 @@ void silc_mutex_unlock(SilcMutex mutex)
 #ifdef SILC_THREADS
   if (mutex) {
     if (pthread_mutex_unlock(&mutex->mutex))
-      assert(FALSE);
+      SILC_ASSERT(FALSE);
+    mutex->locked = FALSE;
   }
 #endif /* SILC_THREADS */
 }
 
+void silc_mutex_assert_locked(SilcMutex mutex)
+{
+#ifdef SILC_THREADS
+  if (mutex)
+    SILC_ASSERT(mutex->locked);
+#endif /* SILC_THREADS */
+}
+
 
 /**************************** SILC Cond API ******************************/
 
index 0d82f5598d5fd25e0c30c1562b7f4ffc835a3eae..97e516bcc6ceeea5d3ede7bda015767c75458729 100644 (file)
@@ -153,10 +153,8 @@ SilcBool silc_thread_wait(SilcThread thread, void **exit_value)
 struct SilcMutexStruct {
 #ifdef SILC_THREADS
   CRITICAL_SECTION mutex;
-  BOOL locked;
-#else
-  void *tmp;
 #endif /* SILC_THREADS */
+  unsigned int locked : 1;
 };
 
 SilcBool silc_mutex_alloc(SilcMutex *mutex)
@@ -187,7 +185,7 @@ void silc_mutex_lock(SilcMutex mutex)
 #ifdef SILC_THREADS
   if (mutex) {
     EnterCriticalSection(&mutex->mutex);
-    assert(mutex->locked == FALSE);
+    SILC_ASSERT(mutex->locked == FALSE);
     mutex->locked = TRUE;
   }
 #endif /* SILC_THREADS */
@@ -197,13 +195,21 @@ void silc_mutex_unlock(SilcMutex mutex)
 {
 #ifdef SILC_THREADS
   if (mutex) {
-    assert(mutex->locked == TRUE);
+    SILC_ASSERT(mutex->locked == TRUE);
     mutex->locked = FALSE;
     LeaveCriticalSection(&mutex->mutex);
   }
 #endif /* SILC_THREADS */
 }
 
+void silc_mutex_assert_locked(SilcMutex mutex)
+{
+#ifdef SILC_THREADS
+  if (mutex)
+    SILC_ASSERT(mutex->locked);
+#endif /* SILC_THREADS */
+}
+
 
 /**************************** SILC Cond API ******************************/