summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2007-08-16 15:45:16 +0000
committerIan Lynagh <igloo@earth.li>2007-08-16 15:45:16 +0000
commit0ee85183fac8129a3c1b890849f32f30fd3940ec (patch)
treec86e5eb41f10229607353a742abdac55783696e5
parent0065868100d8e62bc2cc07fcac6c00da0810ffee (diff)
downloadhaskell-0ee85183fac8129a3c1b890849f32f30fd3940ec.tar.gz
Fix the threaded RTS on Windows
When calling EnterCriticalSection and LeaveCriticalSection from C-- code, we go via wrappers which use ccall (rather than stdcall).
-rw-r--r--includes/OSThreads.h7
-rw-r--r--rts/win32/OSThreads.c9
2 files changed, 14 insertions, 2 deletions
diff --git a/includes/OSThreads.h b/includes/OSThreads.h
index 9a3b5aa6c7..dd7f91a92d 100644
--- a/includes/OSThreads.h
+++ b/includes/OSThreads.h
@@ -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
diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c
index 24fbabeaad..13a3666b63 100644
--- a/rts/win32/OSThreads.c
+++ b/rts/win32/OSThreads.c
@@ -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