X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FIOManager.c;h=764be698722627b2b92c5cbfa20ae04b38e919ff;hb=ed12b7043fa98928f75c289a756fbcef546315f8;hp=e69b8bc8851fc7e27de444b3808096f4ba0b0d92;hpb=610de7d17e09318272b7516bd9b97e8b2cbd170c;p=ghc-hetmet.git diff --git a/rts/win32/IOManager.c b/rts/win32/IOManager.c index e69b8bc..764be69 100644 --- a/rts/win32/IOManager.c +++ b/rts/win32/IOManager.c @@ -4,6 +4,9 @@ * * (c) sof, 2002-2003. */ + +#if !defined(THREADED_RTS) + #include "Rts.h" #include "IOManager.h" #include "WorkQueue.h" @@ -220,10 +223,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 +343,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 @@ -522,3 +529,5 @@ abandonWorkRequest ( int reqID ) */ LeaveCriticalSection(&ioMan->active_work_lock); } + +#endif