summaryrefslogtreecommitdiffstats
path: root/base/lock_impl_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/lock_impl_win.cc')
-rw-r--r--base/lock_impl_win.cc15
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