diff options
Diffstat (limited to 'base/lock_impl_win.cc')
-rw-r--r-- | base/lock_impl_win.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/base/lock_impl_win.cc b/base/lock_impl_win.cc index 8bb1943..503f105 100644 --- a/base/lock_impl_win.cc +++ b/base/lock_impl_win.cc @@ -13,6 +13,7 @@ LockImpl::LockImpl() { #ifndef NDEBUG recursion_count_shadow_ = 0; recursion_used_ = false; + owning_thread_id_ = 0; #endif // NDEBUG // The second parameter is the spin count, for short-held locks it avoid the // contending thread from going to sleep which helps performance greatly. @@ -26,6 +27,9 @@ LockImpl::~LockImpl() { bool LockImpl::Try() { if (::TryEnterCriticalSection(&os_lock_) != FALSE) { #ifndef NDEBUG + // ONLY access data after locking. + owning_thread_id_ = PlatformThread::CurrentId(); + DCHECK_NE(owning_thread_id_, 0); recursion_count_shadow_++; if (2 == recursion_count_shadow_ && !recursion_used_) { recursion_used_ = true; @@ -41,6 +45,8 @@ void LockImpl::Lock() { ::EnterCriticalSection(&os_lock_); #ifndef NDEBUG // ONLY access data after locking. + owning_thread_id_ = PlatformThread::CurrentId(); + DCHECK_NE(owning_thread_id_, 0); recursion_count_shadow_++; if (2 == recursion_count_shadow_ && !recursion_used_) { recursion_used_ = true; @@ -53,6 +59,15 @@ void LockImpl::Unlock() { #ifndef NDEBUG --recursion_count_shadow_; // ONLY access while lock is still held. DCHECK(0 <= recursion_count_shadow_); + owning_thread_id_ = 0; #endif // NDEBUG ::LeaveCriticalSection(&os_lock_); } + +// In non-debug builds, this method is declared as an empty inline method. +#ifndef NDEBUG +void LockImpl::AssertAcquired() { + DCHECK(recursion_count_shadow_ > 0); + DCHECK_EQ(owning_thread_id_, PlatformThread::CurrentId()); +} +#endif |