fixes #709 Desire debugging mutexes by default.
diff --git a/src/utils/mutex.c b/src/utils/mutex.c
index 293b71c..0db890c 100644
--- a/src/utils/mutex.c
+++ b/src/utils/mutex.c
@@ -23,25 +23,44 @@
#include "mutex.h"
#include "err.h"
+#include <stdlib.h>
+
#ifdef NN_HAVE_WINDOWS
void nn_mutex_init (nn_mutex_t *self)
{
InitializeCriticalSection (&self->mutex);
+ self->owner = 0;
+ self->debug = (getenv("NN_NO_MUTEX_DEBUG") != NULL) ? 0 : 1;
}
void nn_mutex_term (nn_mutex_t *self)
{
+ if (self->debug) {
+ /* Make sure we don't free a locked mutex. */
+ nn_assert(self->owner == 0);
+ }
DeleteCriticalSection (&self->mutex);
}
void nn_mutex_lock (nn_mutex_t *self)
{
EnterCriticalSection (&self->mutex);
+
+ if (self->debug) {
+ /* Make sure we don't recursively enter mutexes. */
+ nn_assert(self->owner == 0);
+ self->owner = GetCurrentThreadId();
+ }
}
void nn_mutex_unlock (nn_mutex_t *self)
{
+ if (self->debug) {
+ /* Make sure that we own the mutex we are releasing. */
+ nn_assert(self->owner == GetCurrentThreadId());
+ self->owner = 0;
+ }
LeaveCriticalSection (&self->mutex);
}
@@ -50,9 +69,15 @@
void nn_mutex_init (nn_mutex_t *self)
{
int rc;
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ if (getenv("NN_NO_MUTEX_DEBUG") == NULL) {
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
+ }
rc = pthread_mutex_init (&self->mutex, NULL);
errnum_assert (rc == 0, rc);
+ pthread_mutexattr_destroy(&attr);
}
void nn_mutex_term (nn_mutex_t *self)
diff --git a/src/utils/mutex.h b/src/utils/mutex.h
index 509fcf5..0144050 100644
--- a/src/utils/mutex.h
+++ b/src/utils/mutex.h
@@ -34,6 +34,8 @@
implementation. */
#ifdef NN_HAVE_WINDOWS
CRITICAL_SECTION mutex;
+ DWORD owner;
+ int debug;
#else
pthread_mutex_t mutex;
#endif