]> pd.if.org Git - pdclib/blobdiff - platform/win32/functions/threads/mtx_lock.c
dos2unix
[pdclib] / platform / win32 / functions / threads / mtx_lock.c
index 70af8ae35bd7cd65c7785527544d7cf7778e2776..f2a17419b4b982498388bfc3be2f3f1303d43a22 100644 (file)
@@ -1,40 +1,34 @@
-#ifndef REGTEST\r
-#include <threads.h>\r
-#include <windows.h>\r
-\r
-int mtx_lock(mtx_t *mtx)\r
-{\r
-    DWORD myId = GetCurrentThreadId();\r
-\r
-    if(mtx->_ThreadId == 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
-\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
-}\r
-#endif\r
-\r
-#ifdef TEST\r
-#include <_PDCLIB_test.h>\r
-\r
-int main( void )\r
-{\r
-    return TEST_RESULTS;\r
-}\r
-\r
+#ifndef REGTEST
+#include <threads.h>
+#include <windows.h>
+
+int mtx_lock(mtx_t *mtx)
+{
+    DWORD myId = GetCurrentThreadId();
+
+    if(mtx->_ThreadId == (long) myId) {
+        mtx->_NestCount++;
+        return thrd_success;
+    }
+
+    for(;;) {
+        LONG prev = InterlockedCompareExchange(&mtx->_ThreadId, myId, 0);
+        if(prev == 0)
+            return thrd_success;
+
+        DWORD rv = WaitForSingleObject(mtx->_WaitEvHandle, INFINITE);
+        if(rv != WAIT_OBJECT_0)
+            return thrd_error;
+    }
+}
+#endif
+
+#ifdef TEST
+#include "_PDCLIB_test.h"
+
+int main( void )
+{
+    return TEST_RESULTS;
+}
+
 #endif
\ No newline at end of file