FIX #1177, partially at least.
[ghc-hetmet.git] / rts / win32 / AsyncIO.c
index 2ff92d9..20de8bb 100644 (file)
@@ -4,6 +4,9 @@
  *
  * (c) sof, 2002-2003.
  */
+
+#if !defined(THREADED_RTS)
+
 #include "Rts.h"
 #include "RtsUtils.h"
 #include <windows.h>
@@ -45,8 +48,8 @@ typedef struct CompletedReq {
 #define MAX_REQUESTS 200
 
 static CRITICAL_SECTION queue_lock;
-static HANDLE           completed_req_event;
-static HANDLE           abandon_req_wait;
+static HANDLE           completed_req_event = INVALID_HANDLE_VALUE;
+static HANDLE           abandon_req_wait = INVALID_HANDLE_VALUE;
 static HANDLE           wait_handles[2];
 static CompletedReq     completedTable[MAX_REQUESTS];
 static int              completed_hw;
@@ -171,10 +174,21 @@ startupAsyncIO()
 }
 
 void
-shutdownAsyncIO()
+shutdownAsyncIO(rtsBool wait_threads)
 {
-    CloseHandle(completed_req_event);
-    ShutdownIOManager();
+    ShutdownIOManager(wait_threads);
+    if (completed_req_event != INVALID_HANDLE_VALUE) {
+        CloseHandle(completed_req_event);
+       completed_req_event = INVALID_HANDLE_VALUE;
+    }
+    if (abandon_req_wait != INVALID_HANDLE_VALUE) {
+        CloseHandle(abandon_req_wait);
+       abandon_req_wait = INVALID_HANDLE_VALUE;
+    }
+    if (completed_table_sema != NULL) {
+        CloseHandle(completed_table_sema);
+       completed_table_sema = NULL;
+    }
 }
 
 /*
@@ -343,3 +357,4 @@ resetAbandonRequestWait( void )
     ResetEvent(abandon_req_wait);
 }
 
+#endif /* !defined(THREADED_RTS) */