diff --git a/ghc/rts/win32/IOManager.c b/ghc/rts/win32/IOManager.c index ca5fd4d684002d737a3ba76c37d89373ec16c4eb..c08c4e3014b9e546691fc63e187465b49067da15 100644 --- a/ghc/rts/win32/IOManager.c +++ b/ghc/rts/win32/IOManager.c @@ -70,6 +70,11 @@ IOWorkerProc(PVOID param) */ rc = WaitForMultipleObjects( 2, hWaits, FALSE, INFINITE ); + if (rc == WAIT_OBJECT_0) { + // we received the exit event + return 0; + } + EnterCriticalSection(&iom->manLock); /* Signal that the thread is 'non-idle' and about to consume * a work item. @@ -78,10 +83,7 @@ IOWorkerProc(PVOID param) iom->queueSize--; LeaveCriticalSection(&iom->manLock); - if ( WAIT_OBJECT_0 == rc ) { - /* shutdown */ - return 0; - } else if ( (WAIT_OBJECT_0 + 1) == rc ) { + if ( rc == (WAIT_OBJECT_0 + 1) ) { /* work item available, fetch it. */ if (FetchWork(pq,(void**)&work)) { if ( work->workKind & WORKER_READ ) {