summary refs log tree commit diff
path: root/src/rt/sync
diff options
context:
space:
mode:
authorChris Peterson <cpeterson@mozilla.com>2012-02-19 23:15:35 -0800
committerChris Peterson <cpeterson@mozilla.com>2012-02-19 23:15:35 -0800
commitfed81c2cfc2c16e4a2c66f25b83e34985af70f8d (patch)
tree177f7980a4f1ec422a12bba0c45df1bd298723c9 /src/rt/sync
parent9f492932324aded094042759eeb5824c64aa98e0 (diff)
rt: Add some lock_and_signal assertions
Assert that locks are not reentered on the same thread, unlocked by a
different thread, or deleted while locked.
Diffstat (limited to 'src/rt/sync')
-rw-r--r--src/rt/sync/lock_and_signal.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/rt/sync/lock_and_signal.cpp b/src/rt/sync/lock_and_signal.cpp
index 99861ae4279..fa19b63385d 100644
--- a/src/rt/sync/lock_and_signal.cpp
+++ b/src/rt/sync/lock_and_signal.cpp
@@ -43,6 +43,7 @@ lock_and_signal::lock_and_signal()
 #endif
 
 lock_and_signal::~lock_and_signal() {
+    assert(_holding_thread == INVALID_THREAD);
 #if defined(__WIN32__)
     CloseHandle(_event);
     DeleteCriticalSection(&_cs);
@@ -53,6 +54,7 @@ lock_and_signal::~lock_and_signal() {
 }
 
 void lock_and_signal::lock() {
+    assert(!lock_held_by_current_thread());
 #if defined(__WIN32__)
     EnterCriticalSection(&_cs);
     _holding_thread = GetCurrentThreadId();
@@ -63,6 +65,7 @@ void lock_and_signal::lock() {
 }
 
 void lock_and_signal::unlock() {
+    assert(lock_held_by_current_thread());
     _holding_thread = INVALID_THREAD;
 #if defined(__WIN32__)
     LeaveCriticalSection(&_cs);
@@ -81,9 +84,11 @@ void lock_and_signal::wait() {
     LeaveCriticalSection(&_cs);
     WaitForSingleObject(_event, INFINITE);
     EnterCriticalSection(&_cs);
+    assert(_holding_thread == INVALID_THREAD);
     _holding_thread = GetCurrentThreadId();
 #else
     CHECKED(pthread_cond_wait(&_cond, &_mutex));
+    assert(_holding_thread == INVALID_THREAD);
     _holding_thread = pthread_self();
 #endif
 }