* 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
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)
if (*mutex == NULL)
return FALSE;
pthread_mutex_init(&(*mutex)->mutex, NULL);
+ (*mutex)->locked = FALSE;
return TRUE;
#else
return FALSE;
#ifdef SILC_THREADS
if (mutex) {
if (pthread_mutex_lock(&mutex->mutex))
- assert(FALSE);
+ SILC_ASSERT(FALSE);
+ mutex->locked = TRUE;
}
#endif /* SILC_THREADS */
}
#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 ******************************/
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)
#ifdef SILC_THREADS
if (mutex) {
EnterCriticalSection(&mutex->mutex);
- assert(mutex->locked == FALSE);
+ SILC_ASSERT(mutex->locked == FALSE);
mutex->locked = TRUE;
}
#endif /* SILC_THREADS */
{
#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 ******************************/