Ensure runhaskell is rebuild in stage2
[ghc-hetmet.git] / rts / win32 / IOManager.c
index 993b1fb..81dedda 100644 (file)
@@ -4,6 +4,9 @@
  *
  * (c) sof, 2002-2003.
  */
+
+#if !defined(THREADED_RTS)
+
 #include "Rts.h"
 #include "IOManager.h"
 #include "WorkQueue.h"
@@ -187,7 +190,7 @@ IOWorkerProc(PVOID param)
                     * 
                     * Note: Sleep() is in milliseconds, not micros.
                     */
-                   Sleep(work->workData.delayData.msecs / 1000);
+                   Sleep((work->workData.delayData.msecs + 999) / 1000);
                    len = work->workData.delayData.msecs;
                    complData = NULL;
                    fd = 0;
@@ -340,7 +343,7 @@ depositWorkItem( unsigned int reqID,
        if ( (ioMan->workersIdle < ioMan->queueSize) ) {
            /* No, go ahead and create another. */
            ioMan->numWorkers++;
-           if (NewIOWorkerThread(ioMan)) {
+           if (!NewIOWorkerThread(ioMan)) {
                ioMan->numWorkers--;
            }
        }
@@ -440,25 +443,29 @@ AddProcRequest ( void* proc,
     return depositWorkItem(reqID, wItem);
 }
 
-void ShutdownIOManager ( void )
+void ShutdownIOManager ( rtsBool wait_threads )
 {
     int num;
 
     SetEvent(ioMan->hExitEvent);
   
-    /* Wait for all worker threads to die. */
-    for (;;) {
-        EnterCriticalSection(&ioMan->manLock);
-       num = ioMan->numWorkers;
-       LeaveCriticalSection(&ioMan->manLock);
-       if (num == 0)
-           break;
-       Sleep(10);
+    if (wait_threads) {
+        /* Wait for all worker threads to die. */
+        for (;;) {
+            EnterCriticalSection(&ioMan->manLock);
+            num = ioMan->numWorkers;
+            LeaveCriticalSection(&ioMan->manLock);
+            if (num == 0)
+                break;
+            Sleep(10);
+        }
+        FreeWorkQueue(ioMan->workQueue);
+        CloseHandle(ioMan->hExitEvent);
+        DeleteCriticalSection(&ioMan->active_work_lock);
+        DeleteCriticalSection(&ioMan->manLock);
+        free(ioMan);
+        ioMan = NULL;
     }
-    FreeWorkQueue(ioMan->workQueue);
-    CloseHandle(ioMan->hExitEvent);
-    free(ioMan);
-    ioMan = NULL;
 }
 
 /* Keep track of WorkItems currently being serviced. */
@@ -526,3 +533,5 @@ abandonWorkRequest ( int reqID )
      */
     LeaveCriticalSection(&ioMan->active_work_lock);
 }
+
+#endif