diff --git a/windows/JackWinMutex.cpp b/windows/JackWinMutex.cpp index 6d3680a6..30f3fa05 100644 --- a/windows/JackWinMutex.cpp +++ b/windows/JackWinMutex.cpp @@ -31,11 +31,11 @@ namespace Jack fOwner = GetCurrentThreadId(); return true; } else { - jack_log("JackWinMutex::Lock res = %d", res); + jack_log("JackBaseWinMutex::Lock res = %d", res); return false; } } else { - jack_error("JackWinMutex::Lock mutex already locked by thread = %d", GetCurrentThreadId()); + jack_error("JackBaseWinMutex::Lock mutex already locked by thread = %d", GetCurrentThreadId()); return false; } } @@ -48,11 +48,11 @@ namespace Jack fOwner = GetCurrentThreadId(); return true; } else { - jack_log("JackWinMutex::Trylock res = %d", res); + jack_log("JackBaseWinMutex::Trylock res = %d", res); return false; } } else { - jack_error("JackWinMutex::Trylock mutex already locked by thread = %d", GetCurrentThreadId()); + jack_error("JackBaseWinMutex::Trylock mutex already locked by thread = %d", GetCurrentThreadId()); return false; } } @@ -65,11 +65,11 @@ namespace Jack if (res != 0) { return true; } else { - jack_log("JackWinMutex::Unlock res = %d", res); + jack_log("JackBaseWinMutex::Unlock res = %d", res); return false; } } else { - jack_error("JackWinMutex::Unlock mutex not locked by thread = %d", GetCurrentThreadId()); + jack_error("JackBaseWinMutex::Unlock mutex not locked by thread = %d", GetCurrentThreadId()); return false; } } @@ -89,7 +89,7 @@ namespace Jack if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)) { return true; } else { - jack_log("JackWinProcessSync::Lock WaitForSingleObject err = %d", GetLastError()); + jack_log("JackWinProcessSync::Trylock WaitForSingleObject err = %d", GetLastError()); return false; } } diff --git a/windows/JackWinProcessSync.cpp b/windows/JackWinProcessSync.cpp index 00282d05..fa058b8e 100644 --- a/windows/JackWinProcessSync.cpp +++ b/windows/JackWinProcessSync.cpp @@ -91,7 +91,6 @@ bool JackWinProcessSync::LockedTimedWait(long usec) return TimedWait(usec); } - /* // Code from APPLE CAGuard.cpp : does not seem to work as expected... @@ -106,6 +105,28 @@ void JackWinProcessSync::Wait() } } +// Variant that behaves differently depending of the mutex state +void JackWinProcessSync::Wait() +{ + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + DWORD res = WaitForMultipleObjects(2, handles, true, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::LockedWait WaitForMultipleObjects err = %d", GetLastError()); + } + } else { + jack_error("JackWinProcessSync::Wait ReleaseMutex err = %d", GetLastError()); + DWORD res = WaitForSingleObject(fEvent, INFINITE); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::Wait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedWait ResetEvent err = %d", GetLastError()); + } +} + void JackWinProcessSync::LockedWait() { if (!ReleaseMutex(fMutex)) { @@ -137,6 +158,30 @@ bool JackWinProcessSync::TimedWait(long usec) return (res == WAIT_OBJECT_0); } +// Variant that behaves differently depending of the mutex state +bool JackWinProcessSync::TimedWait(long usec) +{ + if (ReleaseMutex(fMutex)) { + HANDLE handles[] = { fMutex, fEvent }; + DWORD res = WaitForMultipleObjects(2, handles, true, usec / 1000); + if ((res != WAIT_OBJECT_0) && (res != WAIT_TIMEOUT)) { + jack_error("JackWinProcessSync::LockedTimedWait WaitForMultipleObjects err = %d", GetLastError()); + } + } else { + jack_error("JackWinProcessSync::TimedWait ReleaseMutex err = %d", GetLastError()); + DWORD res = WaitForSingleObject(fEvent, usec / 1000); + if (res != WAIT_OBJECT_0) { + jack_error("JackWinProcessSync::TimedWait WaitForSingleObject err = %d", GetLastError()); + } + } + + if (!ResetEvent(fEvent)) { + jack_error("JackWinProcessSync::LockedTimedWait ResetEvent err = %d", GetLastError()); + } + + return (res == WAIT_OBJECT_0); +} + bool JackWinProcessSync::LockedTimedWait(long usec) { if (!ReleaseMutex(fMutex)) { diff --git a/windows/JackWinProcessSync.h b/windows/JackWinProcessSync.h index 4e95a8d8..57fb83ea 100644 --- a/windows/JackWinProcessSync.h +++ b/windows/JackWinProcessSync.h @@ -46,6 +46,7 @@ class JackWinProcessSync : public JackWinMutex //fEvent = CreateEvent(NULL, TRUE, FALSE, buffer); // Needs ResetEvent fEvent = CreateEvent(NULL, FALSE, FALSE, buffer); // Auto-reset event } else { + //fEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Needs ResetEvent fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Auto-reset event }