Get types in osFreeMBlocks in sync with osGetMBlocks
[ghc.git] / rts / win32 / AwaitEvent.c
index 43e188f..5158102 100644 (file)
@@ -8,7 +8,7 @@
  * If the Scheduler is otherwise out of work, it'll block
  * herein waiting for external events to occur.
  *
- * This file mirrors the select()-based functionality 
+ * This file mirrors the select()-based functionality
  * for POSIX / Unix platforms in rts/Select.c, but for
  * Win32.
  *
 #include "AwaitEvent.h"
 #include <windows.h>
 #include "win32/AsyncIO.h"
+#include "win32/ConsoleHandler.h"
 
 // Used to avoid calling abandonRequestWait() if we don't need to.
 // Protected by sched_mutex.
-static nat workerWaitingForRequests = 0;
+static uint32_t workerWaitingForRequests = 0;
 
 void
 awaitEvent(rtsBool wait)
 {
-  int ret;
-
   do {
     /* Try to de-queue completed IO requests
      */
     workerWaitingForRequests = 1;
-    ret = awaitRequests(wait);
+    awaitRequests(wait);
     workerWaitingForRequests = 0;
-    if (!ret) { 
-      return; /* still hold the lock */
+
+    // If a signal was raised, we need to service it
+    // XXX the scheduler loop really should be calling
+    // startSignalHandlers(), but this is the way that posix/Select.c
+    // does it and I'm feeling too paranoid to refactor it today --SDM
+    if (stg_pending_events != 0) {
+        startSignalHandlers(&MainCapability);
+        return;
     }
 
-    // Return to the scheduler if:
+    // The return value from awaitRequests() is a red herring: ignore
+    // it.  Return to the scheduler if !wait, or
     //
     //  - we were interrupted
-    //  - new threads have arrived
+    //  - the run-queue is now non- empty
 
   } while (wait
-          && sched_state == SCHED_RUNNING
-          && emptyRunQueue(&MainCapability)
+           && sched_state == SCHED_RUNNING
+           && emptyRunQueue(&MainCapability)
       );
 }
 #endif