Index: runtime/vm/os_thread_linux.cc |
diff --git a/runtime/vm/os_thread_linux.cc b/runtime/vm/os_thread_linux.cc |
index 5ccb98a162a2f95a90bfc96a9a5e317f901f56bd..f48b6b015ea59c36c2f334aed091bb0e3893a454 100644 |
--- a/runtime/vm/os_thread_linux.cc |
+++ b/runtime/vm/os_thread_linux.cc |
@@ -230,8 +230,8 @@ Mutex::Mutex() { |
result = pthread_mutexattr_destroy(&attr); |
VALIDATE_PTHREAD_RESULT(result); |
- // When running with assertions enabled we do track the owner. |
#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
owner_ = OSThread::kInvalidThreadId; |
#endif // defined(DEBUG) |
} |
@@ -242,8 +242,8 @@ Mutex::~Mutex() { |
// Verify that the pthread_mutex was destroyed. |
VALIDATE_PTHREAD_RESULT(result); |
- // When running with assertions enabled we do track the owner. |
#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
ASSERT(owner_ == OSThread::kInvalidThreadId); |
#endif // defined(DEBUG) |
} |
@@ -254,8 +254,8 @@ void Mutex::Lock() { |
// Specifically check for dead lock to help debugging. |
ASSERT(result != EDEADLK); |
ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors. |
- // When running with assertions enabled we do track the owner. |
#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
owner_ = OSThread::GetCurrentThreadId(); |
#endif // defined(DEBUG) |
} |
@@ -268,8 +268,8 @@ bool Mutex::TryLock() { |
return false; |
} |
ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors. |
- // When running with assertions enabled we do track the owner. |
#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
owner_ = OSThread::GetCurrentThreadId(); |
#endif // defined(DEBUG) |
return true; |
@@ -277,8 +277,8 @@ bool Mutex::TryLock() { |
void Mutex::Unlock() { |
- // When running with assertions enabled we do track the owner. |
#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
ASSERT(IsOwnedByCurrentThread()); |
owner_ = OSThread::kInvalidThreadId; |
#endif // defined(DEBUG) |
@@ -317,10 +317,20 @@ Monitor::Monitor() { |
result = pthread_condattr_destroy(&cond_attr); |
VALIDATE_PTHREAD_RESULT(result); |
+ |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ owner_ = OSThread::kInvalidThreadId; |
+#endif // defined(DEBUG) |
} |
Monitor::~Monitor() { |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(owner_ == OSThread::kInvalidThreadId); |
+#endif // defined(DEBUG) |
+ |
int result = pthread_mutex_destroy(data_.mutex()); |
VALIDATE_PTHREAD_RESULT(result); |
@@ -332,24 +342,41 @@ Monitor::~Monitor() { |
void Monitor::Enter() { |
int result = pthread_mutex_lock(data_.mutex()); |
VALIDATE_PTHREAD_RESULT(result); |
- // TODO(iposva): Do we need to track lock owners? |
+ |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(owner_ == OSThread::kInvalidThreadId); |
+ owner_ = OSThread::GetCurrentThreadId(); |
+#endif // defined(DEBUG) |
} |
void Monitor::Exit() { |
- // TODO(iposva): Do we need to track lock owners? |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(IsOwnedByCurrentThread()); |
+ owner_ = OSThread::kInvalidThreadId; |
+#endif // defined(DEBUG) |
+ |
int result = pthread_mutex_unlock(data_.mutex()); |
VALIDATE_PTHREAD_RESULT(result); |
} |
Monitor::WaitResult Monitor::Wait(int64_t millis) { |
- return WaitMicros(millis * kMicrosecondsPerMillisecond); |
+ Monitor::WaitResult retval = WaitMicros(millis * kMicrosecondsPerMillisecond); |
+ return retval; |
} |
Monitor::WaitResult Monitor::WaitMicros(int64_t micros) { |
- // TODO(iposva): Do we need to track lock owners? |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(IsOwnedByCurrentThread()); |
+ ThreadId saved_owner = owner_; |
+ owner_ = OSThread::kInvalidThreadId; |
+#endif // defined(DEBUG) |
+ |
Monitor::WaitResult retval = kNotified; |
if (micros == kNoTimeout) { |
// Wait forever. |
@@ -364,19 +391,28 @@ Monitor::WaitResult Monitor::WaitMicros(int64_t micros) { |
retval = kTimedOut; |
} |
} |
+ |
+#if defined(DEBUG) |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(owner_ == OSThread::kInvalidThreadId); |
+ owner_ = OSThread::GetCurrentThreadId(); |
+ ASSERT(owner_ == saved_owner); |
+#endif // defined(DEBUG) |
return retval; |
} |
void Monitor::Notify() { |
- // TODO(iposva): Do we need to track lock owners? |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(IsOwnedByCurrentThread()); |
int result = pthread_cond_signal(data_.cond()); |
VALIDATE_PTHREAD_RESULT(result); |
} |
void Monitor::NotifyAll() { |
- // TODO(iposva): Do we need to track lock owners? |
+ // When running with assertions enabled we track the owner. |
+ ASSERT(IsOwnedByCurrentThread()); |
int result = pthread_cond_broadcast(data_.cond()); |
VALIDATE_PTHREAD_RESULT(result); |
} |