| 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);
 | 
|  }
 | 
| 
 |