Fix the threaded RTS on Windows
authorIan Lynagh <igloo@earth.li>
Thu, 16 Aug 2007 15:45:16 +0000 (15:45 +0000)
committerIan Lynagh <igloo@earth.li>
Thu, 16 Aug 2007 15:45:16 +0000 (15:45 +0000)
When calling EnterCriticalSection and LeaveCriticalSection from C--
code, we go via wrappers which use ccall (rather than stdcall).

includes/OSThreads.h
rts/win32/OSThreads.c

index 9a3b5aa..dd7f91a 100644 (file)
@@ -82,8 +82,11 @@ typedef pthread_key_t   ThreadLocalKey;
 
 #if CMINUSMINUS
 
-#define ACQUIRE_LOCK(mutex) EnterCriticalSection(mutex)
-#define RELEASE_LOCK(mutex) LeaveCriticalSection(mutex)
+/* We jump through a hoop here to get a CCall EnterCriticalSection
+   and LeaveCriticalSection, as that's what C-- wants. */
+
+#define ACQUIRE_LOCK(mutex) CCallEnterCriticalSection(mutex)
+#define RELEASE_LOCK(mutex) CCallLeaveCriticalSection(mutex)
 #define ASSERT_LOCK_HELD(mutex) /* nothing */
 
 #else
index 24fbabe..13a3666 100644 (file)
@@ -13,6 +13,7 @@
 #if defined(THREADED_RTS)
 #include "OSThreads.h"
 #include "RtsUtils.h"
+#include <windows.h>
 
 /* For reasons not yet clear, the entire contents of process.h is protected 
  * by __STRICT_ANSI__ not being defined.
@@ -231,6 +232,14 @@ forkOS_createThread ( HsStablePtr entry )
                           (unsigned*)&pId) == 0);
 }
 
+void CCallEnterCriticalSection(LPCRITICAL_SECTION s) {
+    EnterCriticalSection(s);
+}
+
+void CCallLeaveCriticalSection(LPCRITICAL_SECTION s) {
+    LeaveCriticalSection(s);
+}
+
 #else /* !defined(THREADED_RTS) */
 
 int