Index: base/lock_impl_win.cc |
=================================================================== |
--- base/lock_impl_win.cc (revision 11968) |
+++ base/lock_impl_win.cc (working copy) |
@@ -13,6 +13,7 @@ |
#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 @@ |
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 @@ |
::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 @@ |
#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 |