diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/OSThreads.h | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/includes/OSThreads.h b/includes/OSThreads.h index fd57f56606..d79b9affc7 100644 --- a/includes/OSThreads.h +++ b/includes/OSThreads.h @@ -23,7 +23,6 @@ #else #include <pthread.h> -#include <errno.h> typedef pthread_cond_t Condition; typedef pthread_mutex_t Mutex; @@ -35,27 +34,48 @@ typedef pthread_key_t ThreadLocalKey; #define INIT_COND_VAR PTHREAD_COND_INITIALIZER #ifdef LOCK_DEBUG -#define LOCK_DEBUG_BELCH(what, mutex) \ - debugBelch("%s(0x%p) %s %d\n", what, mutex, __FILE__, __LINE__) -#else -#define LOCK_DEBUG_BELCH(what, mutex) /* nothing */ -#endif -/* Always check the result of lock and unlock. */ #define ACQUIRE_LOCK(mutex) \ - LOCK_DEBUG_BELCH("ACQUIRE_LOCK", mutex); \ + debugBelch("ACQUIRE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); \ + pthread_mutex_lock(mutex) +#define RELEASE_LOCK(mutex) \ + debugBelch("RELEASE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); \ + pthread_mutex_unlock(mutex) +#define ASSERT_LOCK_HELD(mutex) /* nothing */ + +#elif defined(DEBUG) && defined(linux_HOST_OS) +#include <errno.h> +/* + * On Linux, we can use extensions to determine whether we already + * hold a lock or not, which is useful for debugging. + */ +#define ACQUIRE_LOCK(mutex) \ if (pthread_mutex_lock(mutex) == EDEADLK) { \ barf("multiple ACQUIRE_LOCK: %s %d", __FILE__,__LINE__); \ } - #define RELEASE_LOCK(mutex) \ - LOCK_DEBUG_BELCH("RELEASE_LOCK", mutex); \ if (pthread_mutex_unlock(mutex) != 0) { \ barf("RELEASE_LOCK: I do not own this lock: %s %d", __FILE__,__LINE__); \ } #define ASSERT_LOCK_HELD(mutex) ASSERT(pthread_mutex_lock(mutex) == EDEADLK) +#define ASSERT_LOCK_NOTHELD(mutex) \ + if (pthread_mutex_lock(mutex) != EDEADLK) { \ + pthread_mutex_unlock(mutex); \ + } else { \ + ASSERT(0); \ + } + + +#else + +#define ACQUIRE_LOCK(mutex) pthread_mutex_lock(mutex) +#define RELEASE_LOCK(mutex) pthread_mutex_unlock(mutex) +#define ASSERT_LOCK_HELD(mutex) /* nothing */ + +#endif + #endif // CMINUSMINUS # elif defined(HAVE_WINDOWS_H) |