aboutsummaryrefslogtreecommitdiff
path: root/libs/usvfs/src/usvfs_dll/semaphore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/usvfs/src/usvfs_dll/semaphore.cpp')
-rw-r--r--libs/usvfs/src/usvfs_dll/semaphore.cpp57
1 files changed, 0 insertions, 57 deletions
diff --git a/libs/usvfs/src/usvfs_dll/semaphore.cpp b/libs/usvfs/src/usvfs_dll/semaphore.cpp
deleted file mode 100644
index 609b2f5..0000000
--- a/libs/usvfs/src/usvfs_dll/semaphore.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#include "semaphore.h"
-#include "exceptionex.h"
-
-RecursiveBenaphore::RecursiveBenaphore() : m_Counter(0), m_OwnerId(0UL), m_Recursion(0)
-{
- m_Semaphore = ::CreateSemaphore(nullptr, 1, 1, nullptr);
-}
-
-RecursiveBenaphore::~RecursiveBenaphore()
-{
- ::CloseHandle(m_Semaphore);
-}
-
-void RecursiveBenaphore::wait(DWORD timeout)
-{
- DWORD tid = ::GetCurrentThreadId();
-
- if (::_InterlockedIncrement(&m_Counter) > 1) {
- if (tid != m_OwnerId) {
- int tries = 3;
- while (::WaitForSingleObject(m_Semaphore, timeout) != WAIT_OBJECT_0) {
- HANDLE owner = ::OpenThread(SYNCHRONIZE, FALSE, m_OwnerId);
- ON_BLOCK_EXIT([owner]() {
- ::CloseHandle(owner);
- });
- if ((tries <= 0) || (::WaitForSingleObject(owner, 0) == WAIT_OBJECT_0)) {
- // owner has quit without releasing the semaphore!
- m_Recursion = 0;
- spdlog::get("usvfs")->error("thread {} never released the mutex", m_OwnerId);
- break;
- } else {
- --tries;
- }
- }
- }
- }
- m_OwnerId = tid;
- ++m_Recursion;
-}
-
-void RecursiveBenaphore::signal()
-{
- if (m_Recursion == 0) {
- return;
- }
- // no validation the signaling thread is the one owning the lock
- DWORD recursion = --m_Recursion;
- if (recursion == 0) {
- m_OwnerId = 0;
- }
- DWORD result = ::_InterlockedDecrement(&m_Counter);
- if (result > 0) {
- if (recursion == 0) {
- ::ReleaseSemaphore(m_Semaphore, 1, nullptr);
- }
- }
-}