| @@ -31,11 +31,11 @@ namespace Jack | |||||
| fOwner = GetCurrentThreadId(); | fOwner = GetCurrentThreadId(); | ||||
| return true; | return true; | ||||
| } else { | } else { | ||||
| jack_log("JackWinMutex::Lock res = %d", res); | |||||
| jack_log("JackBaseWinMutex::Lock res = %d", res); | |||||
| return false; | return false; | ||||
| } | } | ||||
| } else { | } 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; | return false; | ||||
| } | } | ||||
| } | } | ||||
| @@ -48,11 +48,11 @@ namespace Jack | |||||
| fOwner = GetCurrentThreadId(); | fOwner = GetCurrentThreadId(); | ||||
| return true; | return true; | ||||
| } else { | } else { | ||||
| jack_log("JackWinMutex::Trylock res = %d", res); | |||||
| jack_log("JackBaseWinMutex::Trylock res = %d", res); | |||||
| return false; | return false; | ||||
| } | } | ||||
| } else { | } 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; | return false; | ||||
| } | } | ||||
| } | } | ||||
| @@ -65,11 +65,11 @@ namespace Jack | |||||
| if (res != 0) { | if (res != 0) { | ||||
| return true; | return true; | ||||
| } else { | } else { | ||||
| jack_log("JackWinMutex::Unlock res = %d", res); | |||||
| jack_log("JackBaseWinMutex::Unlock res = %d", res); | |||||
| return false; | return false; | ||||
| } | } | ||||
| } else { | } 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; | return false; | ||||
| } | } | ||||
| } | } | ||||
| @@ -89,7 +89,7 @@ namespace Jack | |||||
| if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)) { | if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)) { | ||||
| return true; | return true; | ||||
| } else { | } else { | ||||
| jack_log("JackWinProcessSync::Lock WaitForSingleObject err = %d", GetLastError()); | |||||
| jack_log("JackWinProcessSync::Trylock WaitForSingleObject err = %d", GetLastError()); | |||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| @@ -91,7 +91,6 @@ bool JackWinProcessSync::LockedTimedWait(long usec) | |||||
| return TimedWait(usec); | return TimedWait(usec); | ||||
| } | } | ||||
| /* | /* | ||||
| // Code from APPLE CAGuard.cpp : does not seem to work as expected... | // 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() | void JackWinProcessSync::LockedWait() | ||||
| { | { | ||||
| if (!ReleaseMutex(fMutex)) { | if (!ReleaseMutex(fMutex)) { | ||||
| @@ -137,6 +158,30 @@ bool JackWinProcessSync::TimedWait(long usec) | |||||
| return (res == WAIT_OBJECT_0); | 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) | bool JackWinProcessSync::LockedTimedWait(long usec) | ||||
| { | { | ||||
| if (!ReleaseMutex(fMutex)) { | if (!ReleaseMutex(fMutex)) { | ||||
| @@ -46,6 +46,7 @@ class JackWinProcessSync : public JackWinMutex | |||||
| //fEvent = CreateEvent(NULL, TRUE, FALSE, buffer); // Needs ResetEvent | //fEvent = CreateEvent(NULL, TRUE, FALSE, buffer); // Needs ResetEvent | ||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, buffer); // Auto-reset event | fEvent = CreateEvent(NULL, FALSE, FALSE, buffer); // Auto-reset event | ||||
| } else { | } else { | ||||
| //fEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Needs ResetEvent | |||||
| fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Auto-reset event | fEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Auto-reset event | ||||
| } | } | ||||