Windows-specific fix for #1185 patch
[ghc-hetmet.git] / rts / win32 / ThrIOManager.c
index 76747c2..50dd4fb 100644 (file)
@@ -8,7 +8,7 @@
  * ---------------------------------------------------------------------------*/\r
 \r
 #include "Rts.h"\r
-#include "ThrIOManager.h"\r
+#include "IOManager.h"\r
 #include "Prelude.h"\r
 #include <windows.h>\r
 \r
@@ -34,7 +34,7 @@ getIOManagerEvent (void)
         hRes = CreateEvent ( NULL, // no security attrs\r
                              TRUE, // manual reset\r
                              FALSE, // initial state,\r
-                             "IO Manager Event" );\r
+                             NULL ); // event name: NULL for private events\r
         if (hRes == NULL) {\r
             sysErrorBelch("getIOManagerEvent");\r
             stg_exit(EXIT_FAILURE);\r
@@ -67,8 +67,8 @@ readIOManagerEvent (void)
 #if defined(THREADED_RTS)\r
     HsWord32 res;\r
 \r
-    ACQUIRE_LOCK(&event_buf_mutex);\r
     if (io_manager_event != INVALID_HANDLE_VALUE) {\r
+        ACQUIRE_LOCK(&event_buf_mutex);\r
         if (next_event == 0) {\r
             res = 0; // no event to return\r
         } else {\r
@@ -80,10 +80,10 @@ readIOManagerEvent (void)
                 }\r
             }\r
         }\r
+        RELEASE_LOCK(&event_buf_mutex);\r
     } else {\r
         res = 0;\r
     }\r
-    RELEASE_LOCK(&event_buf_mutex);\r
     // debugBelch("readIOManagerEvent: %d\n", res);\r
     return res;\r
 #else\r
@@ -96,8 +96,8 @@ sendIOManagerEvent (HsWord32 event)
 {\r
 #if defined(THREADED_RTS)\r
     // debugBelch("sendIOManagerEvent: %d\n", event);\r
-    ACQUIRE_LOCK(&event_buf_mutex);\r
     if (io_manager_event != INVALID_HANDLE_VALUE) {\r
+        ACQUIRE_LOCK(&event_buf_mutex);\r
         if (next_event == EVENT_BUFSIZ) {\r
             errorBelch("event buffer overflowed; event dropped");\r
         } else {\r
@@ -107,18 +107,18 @@ sendIOManagerEvent (HsWord32 event)
             }        \r
             event_buf[next_event++] = (StgWord32)event;\r
         }\r
+        RELEASE_LOCK(&event_buf_mutex);\r
     }\r
-    RELEASE_LOCK(&event_buf_mutex);\r
 #endif\r
 }    \r
 \r
-#if defined(THREADED_RTS)\r
 void\r
 ioManagerWakeup (void)\r
 {\r
     sendIOManagerEvent(IO_MANAGER_WAKEUP);\r
 }\r
 \r
+#if defined(THREADED_RTS)\r
 void\r
 ioManagerDie (void)\r
 {\r
@@ -137,7 +137,11 @@ ioManagerStart (void)
     Capability *cap;\r
     if (io_manager_event == INVALID_HANDLE_VALUE) {\r
        cap = rts_lock();\r
+#if defined(mingw32_HOST_OS) && defined(__PIC__)\r
+       rts_evalIO(cap,_imp__base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);\r
+#else\r
        rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);\r
+#endif\r
        rts_unlock(cap);\r
     }\r
 }\r