From 2aa4a82499d4becd2284cdb482213d541b8804dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 16:29:10 +0200 Subject: Adding upstream version 86.0.1. Signed-off-by: Daniel Baumann --- media/libcubeb/src/cubeb_utils_win.h | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 media/libcubeb/src/cubeb_utils_win.h (limited to 'media/libcubeb/src/cubeb_utils_win.h') diff --git a/media/libcubeb/src/cubeb_utils_win.h b/media/libcubeb/src/cubeb_utils_win.h new file mode 100644 index 0000000000..0112ad6d3c --- /dev/null +++ b/media/libcubeb/src/cubeb_utils_win.h @@ -0,0 +1,71 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(CUBEB_UTILS_WIN) +#define CUBEB_UTILS_WIN + +#include +#include "cubeb-internal.h" + +/* This wraps a critical section 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() +#ifndef NDEBUG + : owner(0) +#endif + { + InitializeCriticalSection(&critical_section); + } + + ~owned_critical_section() + { + DeleteCriticalSection(&critical_section); + } + + void lock() + { + EnterCriticalSection(&critical_section); +#ifndef NDEBUG + XASSERT(owner != GetCurrentThreadId() && "recursive locking"); + owner = GetCurrentThreadId(); +#endif + } + + void unlock() + { +#ifndef NDEBUG + /* GetCurrentThreadId cannot return 0: it is not a the valid thread id */ + owner = 0; +#endif + LeaveCriticalSection(&critical_section); + } + + /* This is guaranteed to have the good behaviour if it succeeds. The behaviour + is undefined otherwise. */ + void assert_current_thread_owns() + { +#ifndef NDEBUG + /* This implies owner != 0, because GetCurrentThreadId cannot return 0. */ + XASSERT(owner == GetCurrentThreadId()); +#endif + } + +private: + CRITICAL_SECTION critical_section; +#ifndef NDEBUG + DWORD owner; +#endif + + // Disallow copy and assignment because CRICICAL_SECTION cannot be copied. + owned_critical_section(const owned_critical_section&); + owned_critical_section& operator=(const owned_critical_section&); +}; + +#endif /* CUBEB_UTILS_WIN */ -- cgit v1.2.3