]> pd.if.org Git - pdclib/blobdiff - platform/win32/functions/threads/mtx_lock.c
PDCLib includes with quotes, not <>.
[pdclib] / platform / win32 / functions / threads / mtx_lock.c
index 70af8ae35bd7cd65c7785527544d7cf7778e2776..b76c8ec5ad66d7c0efa4c3208f5894b7f918a754 100644 (file)
@@ -6,31 +6,25 @@ int mtx_lock(mtx_t *mtx)
 {\r
     DWORD myId = GetCurrentThreadId();\r
 \r
-    if(mtx->_ThreadId == myId) {\r
+    if(mtx->_ThreadId == (long) myId) {\r
         mtx->_NestCount++;\r
         return thrd_success;\r
     }\r
 \r
-    DWORD res = InterlockedIncrement(&mtx->_State);\r
-    if(res == 0) {\r
-        mtx->_ThreadId = myId;\r
-        return thrd_success;\r
-    }\r
+    for(;;) {\r
+        LONG prev = InterlockedCompareExchange(&mtx->_ThreadId, myId, 0);\r
+        if(prev == 0)\r
+            return thrd_success;\r
 \r
-    // If that increment didn't leave the state == 0, then we have contention\r
-    //  -> block on the wait event handle\r
-    DWORD rv = WaitForSingleObject(mtx->_WaitEvHandle, INFINITE);\r
-    if(rv != WAIT_OBJECT_0) \r
-        return thrd_error;\r
-\r
-    // We now own the mutex - so set it up for our use\r
-    mtx->_ThreadId = myId;\r
-    return thrd_success;\r
+        DWORD rv = WaitForSingleObject(mtx->_WaitEvHandle, INFINITE);\r
+        if(rv != WAIT_OBJECT_0)\r
+            return thrd_error;\r
+    }\r
 }\r
 #endif\r
 \r
 #ifdef TEST\r
-#include <_PDCLIB_test.h>\r
+#include "_PDCLIB_test.h"\r
 \r
 int main( void )\r
 {\r