diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-08-29 13:51:50 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-08-29 13:51:50 +0000 |
commit | 7cb50e3aea11f934fd1430c5f056f4f0f93f1f23 (patch) | |
tree | 8d8096566bda48dd35a791f249d7169f528aa025 /rts/win32/IOManager.c | |
parent | 213fbc81db6cc02bde330dacd4bec55ac589d1ee (diff) | |
download | haskell-7cb50e3aea11f934fd1430c5f056f4f0f93f1f23.tar.gz |
fix some rerrors in the worker counting
Diffstat (limited to 'rts/win32/IOManager.c')
-rw-r--r-- | rts/win32/IOManager.c | 16 |
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 |