From ad99eeb273149559bb5f6e86ae9661532c3c8a51 Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Wed, 2 Mar 2022 18:36:57 +1300 Subject: owned_critical_section: Replace CRITICAL_SECTION with SRWLOCK on Windows. --- src/cubeb_utils_win.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/cubeb_utils_win.h b/src/cubeb_utils_win.h index 4c47f45..48e7b1b 100644 --- a/src/cubeb_utils_win.h +++ b/src/cubeb_utils_win.h @@ -11,24 +11,23 @@ #include "cubeb-internal.h" #include -/* This wraps a critical section to track the owner in debug mode, adapted from +/* This wraps an SRWLock to track the owner in debug mode, adapted from NSPR and http://blogs.msdn.com/b/oldnewthing/archive/2013/07/12/10433554.aspx */ class owned_critical_section { public: owned_critical_section() + : srwlock(SRWLOCK_INIT) #ifndef NDEBUG - : owner(0) + , + owner(0) #endif { - InitializeCriticalSection(&critical_section); } - ~owned_critical_section() { DeleteCriticalSection(&critical_section); } - void lock() { - EnterCriticalSection(&critical_section); + AcquireSRWLockExclusive(&srwlock); #ifndef NDEBUG XASSERT(owner != GetCurrentThreadId() && "recursive locking"); owner = GetCurrentThreadId(); @@ -41,7 +40,7 @@ public: /* GetCurrentThreadId cannot return 0: it is not a the valid thread id */ owner = 0; #endif - LeaveCriticalSection(&critical_section); + ReleaseSRWLockExclusive(&srwlock); } /* This is guaranteed to have the good behaviour if it succeeds. The behaviour @@ -55,12 +54,12 @@ public: } private: - CRITICAL_SECTION critical_section; + SRWLOCK srwlock; #ifndef NDEBUG DWORD owner; #endif - // Disallow copy and assignment because CRICICAL_SECTION cannot be copied. + // Disallow copy and assignment because SRWLock cannot be copied. owned_critical_section(const owned_critical_section &); owned_critical_section & operator=(const owned_critical_section &); }; -- cgit v1.2.3