]> granicus.if.org Git - python/commitdiff
Fix NonRecursiveMutex on x64. The signature of the faux-InterlockedCompareExchange...
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Mon, 7 May 2007 18:28:12 +0000 (18:28 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Mon, 7 May 2007 18:28:12 +0000 (18:28 +0000)
Python/thread_nt.h

index 27fca72cd88c7d0381cee76bb4dfd69f51a26898..4e6198b3492894d2b482e037f3c2a82f1093a11c 100644 (file)
@@ -15,14 +15,14 @@ typedef struct NRMUTEX {
        HANDLE hevent ;
 } 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! */
-static PVOID WINAPI
-interlocked_cmp_xchg(PVOID *dest, PVOID exc, PVOID comperand)
+static LONG WINAPI
+interlocked_cmp_xchg(LONG volatile *dest, LONG exc, LONG comperand)
 {
        static LONG spinlock = 0 ;
-       PVOID result ;
+       LONG result ;
        DWORD dwSleep = 0;
 
        /* Acqire spinlock (yielding control to other threads if cant aquire for the moment) */
@@ -76,10 +76,12 @@ InitializeNonRecursiveMutex(PNRMUTEX mutex)
        return mutex->hevent != NULL ;  /* TRUE if the mutex is created */
 }
 
+#ifndef MS_WIN64
 #ifdef InterlockedCompareExchange
 #undef InterlockedCompareExchange
 #endif
 #define InterlockedCompareExchange(dest,exchange,comperand) (ixchg((dest), (exchange), (comperand)))
+#endif
 
 VOID
 DeleteNonRecursiveMutex(PNRMUTEX mutex)
@@ -98,7 +100,7 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, BOOL wait)
        /* InterlockedIncrement(&mutex->owned) == 0 means that no thread currently owns the mutex */
        if (!wait)
        {
-               if (InterlockedCompareExchange((PVOID *)&mutex->owned, (PVOID)0, (PVOID)-1) != (PVOID)-1)
+               if (InterlockedCompareExchange(&mutex->owned, 0, -1) != -1)
                        return WAIT_TIMEOUT ;
                ret = WAIT_OBJECT_0 ;
        }