summaryrefslogtreecommitdiff
path: root/rts/win32/IOManager.c
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-08-29 13:51:50 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-08-29 13:51:50 +0000
commit7cb50e3aea11f934fd1430c5f056f4f0f93f1f23 (patch)
tree8d8096566bda48dd35a791f249d7169f528aa025 /rts/win32/IOManager.c
parent213fbc81db6cc02bde330dacd4bec55ac589d1ee (diff)
downloadhaskell-7cb50e3aea11f934fd1430c5f056f4f0f93f1f23.tar.gz
fix some rerrors in the worker counting
Diffstat (limited to 'rts/win32/IOManager.c')
-rw-r--r--rts/win32/IOManager.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/rts/win32/IOManager.c b/rts/win32/IOManager.c
index e69b8bc885..993b1fb717 100644
--- a/rts/win32/IOManager.c
+++ b/rts/win32/IOManager.c
@@ -220,10 +220,16 @@ IOWorkerProc(PVOID param)
free(work);
} else {
fprintf(stderr, "unable to fetch work; fatal.\n"); fflush(stderr);
+ EnterCriticalSection(&iom->manLock);
+ ioMan->numWorkers--;
+ LeaveCriticalSection(&iom->manLock);
return 1;
}
} else {
fprintf(stderr, "waiting failed (%lu); fatal.\n", rc); fflush(stderr);
+ EnterCriticalSection(&iom->manLock);
+ ioMan->numWorkers--;
+ LeaveCriticalSection(&iom->manLock);
return 1;
}
}
@@ -334,14 +340,12 @@ depositWorkItem( unsigned int reqID,
if ( (ioMan->workersIdle < ioMan->queueSize) ) {
/* No, go ahead and create another. */
ioMan->numWorkers++;
- LeaveCriticalSection(&ioMan->manLock);
- NewIOWorkerThread(ioMan);
- } else {
- LeaveCriticalSection(&ioMan->manLock);
+ if (NewIOWorkerThread(ioMan)) {
+ ioMan->numWorkers--;
+ }
}
- } else {
- LeaveCriticalSection(&ioMan->manLock);
}
+ LeaveCriticalSection(&ioMan->manLock);
if (SubmitWork(ioMan->workQueue,wItem)) {
/* Note: the work item has potentially been consumed by a worker thread