diff --git a/webrtc/base/criticalsection.h b/webrtc/base/criticalsection.h index db197d2e0..0b4bb1505 100644 --- a/webrtc/base/criticalsection.h +++ b/webrtc/base/criticalsection.h @@ -27,9 +27,9 @@ #include #endif -#ifdef _DEBUG +#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) #define CS_TRACK_OWNER 1 -#endif // _DEBUG +#endif #if CS_TRACK_OWNER #define TRACK_OWNER(x) x @@ -58,6 +58,8 @@ class LOCKABLE CriticalSection { bool CurrentThreadIsOwner() const { return crit_.OwningThread == reinterpret_cast(GetCurrentThreadId()); } + // Use only for DCHECKing. + bool IsLocked() { return crit_.LockCount != -1; } private: CRITICAL_SECTION crit_; @@ -102,6 +104,10 @@ class LOCKABLE CriticalSection { return true; #endif // CS_TRACK_OWNER } + // Use only for DCHECKing. +#if CS_TRACK_OWNER + bool IsLocked() { return thread_ != 0; } +#endif private: pthread_mutex_t mutex_; diff --git a/webrtc/base/criticalsection_unittest.cc b/webrtc/base/criticalsection_unittest.cc index 6f3c7e931..ff4fdef94 100644 --- a/webrtc/base/criticalsection_unittest.cc +++ b/webrtc/base/criticalsection_unittest.cc @@ -281,4 +281,21 @@ TEST(CriticalSectionTest, Basic) { EXPECT_EQ(0, runner.shared_value()); } +#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) +TEST(CriticalSectionTest, IsLocked) { + // Simple single-threaded test of IsLocked. + CriticalSection cs; + EXPECT_FALSE(cs.IsLocked()); + cs.Enter(); + EXPECT_TRUE(cs.IsLocked()); + cs.Leave(); + EXPECT_FALSE(cs.IsLocked()); + if (!cs.TryEnter()) + FAIL(); + EXPECT_TRUE(cs.IsLocked()); + cs.Leave(); + EXPECT_FALSE(cs.IsLocked()); +} +#endif + } // namespace rtc