Fix NonRecursiveMutex on x64. The signature of the...

Fix NonRecursiveMutex on x64.  The signature of the faux-InterlockedCompareExchange function was wrong:  It works with LONG and not PVOID objects, and it needs to have the target marked as volatile.  Further, it is not needed at all for x64 targets, since that platform always has the real McCoy.
parent 7bca027f
...@@ -15,14 +15,14 @@ typedef struct NRMUTEX { ...@@ -15,14 +15,14 @@ typedef struct NRMUTEX {
HANDLE hevent ; HANDLE hevent ;
} NRMUTEX, *PNRMUTEX ; } NRMUTEX, *PNRMUTEX ;
typedef PVOID WINAPI interlocked_cmp_xchg_t(PVOID *dest, PVOID exc, PVOID comperand) ; typedef LONG WINAPI interlocked_cmp_xchg_t(LONG volatile *dest, LONG exc, LONG comperand) ;
/* Sorry mate, but we haven't got InterlockedCompareExchange in Win95! */ /* Sorry mate, but we haven't got InterlockedCompareExchange in Win95! */
static PVOID WINAPI static LONG WINAPI
interlocked_cmp_xchg(PVOID *dest, PVOID exc, PVOID comperand) interlocked_cmp_xchg(LONG volatile *dest, LONG exc, LONG comperand)
{ {
static LONG spinlock = 0 ; static LONG spinlock = 0 ;
PVOID result ; LONG result ;
DWORD dwSleep = 0; DWORD dwSleep = 0;
/* Acqire spinlock (yielding control to other threads if cant aquire for the moment) */ /* Acqire spinlock (yielding control to other threads if cant aquire for the moment) */
...@@ -76,10 +76,12 @@ InitializeNonRecursiveMutex(PNRMUTEX mutex) ...@@ -76,10 +76,12 @@ InitializeNonRecursiveMutex(PNRMUTEX mutex)
return mutex->hevent != NULL ; /* TRUE if the mutex is created */ return mutex->hevent != NULL ; /* TRUE if the mutex is created */
} }
#ifndef MS_WIN64
#ifdef InterlockedCompareExchange #ifdef InterlockedCompareExchange
#undef InterlockedCompareExchange #undef InterlockedCompareExchange
#endif #endif
#define InterlockedCompareExchange(dest,exchange,comperand) (ixchg((dest), (exchange), (comperand))) #define InterlockedCompareExchange(dest,exchange,comperand) (ixchg((dest), (exchange), (comperand)))
#endif
VOID VOID
DeleteNonRecursiveMutex(PNRMUTEX mutex) DeleteNonRecursiveMutex(PNRMUTEX mutex)
...@@ -98,7 +100,7 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, BOOL wait) ...@@ -98,7 +100,7 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, BOOL wait)
/* InterlockedIncrement(&mutex->owned) == 0 means that no thread currently owns the mutex */ /* InterlockedIncrement(&mutex->owned) == 0 means that no thread currently owns the mutex */
if (!wait) if (!wait)
{ {
if (InterlockedCompareExchange((PVOID *)&mutex->owned, (PVOID)0, (PVOID)-1) != (PVOID)-1) if (InterlockedCompareExchange(&mutex->owned, 0, -1) != -1)
return WAIT_TIMEOUT ; return WAIT_TIMEOUT ;
ret = WAIT_OBJECT_0 ; ret = WAIT_OBJECT_0 ;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment