// spurios wakeups are returned as zero.\r
// console events are ((event<<1) | 1)\r
\r
+#if defined(THREADED_RTS)\r
+\r
+#define EVENT_BUFSIZ 256\r
+Mutex event_buf_mutex;\r
+StgWord32 event_buf[EVENT_BUFSIZ];\r
+nat next_event;\r
+\r
+#endif\r
+\r
HANDLE\r
getIOManagerEvent (void)\r
{\r
#ifdef THREADED_RTS\r
HANDLE hRes;\r
\r
+ ACQUIRE_LOCK(&event_buf_mutex);\r
+\r
if (io_manager_event == INVALID_HANDLE_VALUE) {\r
hRes = CreateEvent ( NULL, // no security attrs\r
TRUE, // manual reset\r
stg_exit(EXIT_FAILURE);\r
}\r
io_manager_event = hRes;\r
- return hRes;\r
} else {\r
- return io_manager_event;\r
+ hRes = io_manager_event;\r
}\r
+\r
+ RELEASE_LOCK(&event_buf_mutex);\r
+ return hRes;\r
#else\r
return NULL;\r
#endif\r
}\r
\r
\r
-#if defined(THREADED_RTS)\r
-\r
-#define EVENT_BUFSIZ 256\r
-Mutex event_buf_mutex;\r
-StgWord32 event_buf[EVENT_BUFSIZ];\r
-nat next_event;\r
-\r
-#endif\r
-\r
HsWord32\r
readIOManagerEvent (void)\r
{\r
#if defined(THREADED_RTS)\r
HsWord32 res;\r
\r
+ ACQUIRE_LOCK(&event_buf_mutex);\r
+\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
}\r
}\r
}\r
- RELEASE_LOCK(&event_buf_mutex);\r
} else {\r
res = 0;\r
}\r
+\r
+ RELEASE_LOCK(&event_buf_mutex);\r
+\r
// debugBelch("readIOManagerEvent: %d\n", res);\r
return res;\r
#else\r
sendIOManagerEvent (HsWord32 event)\r
{\r
#if defined(THREADED_RTS)\r
+ ACQUIRE_LOCK(&event_buf_mutex);\r
+\r
// debugBelch("sendIOManagerEvent: %d\n", event);\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
} \r
event_buf[next_event++] = (StgWord32)event;\r
}\r
- RELEASE_LOCK(&event_buf_mutex);\r
}\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
sendIOManagerEvent(IO_MANAGER_DIE);\r
+ // IO_MANAGER_DIE must be idempotent, as it is called\r
+ // repeatedly by shutdownCapability(). Try conc059(threaded1) to\r
+ // illustrate the problem.\r
+ ACQUIRE_LOCK(&event_buf_mutex);\r
+ io_manager_event = INVALID_HANDLE_VALUE;\r
+ RELEASE_LOCK(&event_buf_mutex);\r
// ToDo: wait for the IO manager to pick up the event, and\r
// then release the Event and Mutex objects we've allocated.\r
}\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
+ rts_evalIO(cap,_imp__base_GHCziConcziIO_ensureIOManagerIsRunning_closure,NULL);\r
#else\r
- rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);\r
+ rts_evalIO(cap,&base_GHCziConcziIO_ensureIOManagerIsRunning_closure,NULL);\r
#endif\r
rts_unlock(cap);\r
}\r