X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FIOManager.c;h=c9a759fffbce2655f971f220272fb409ed7b4a06;hb=7d9eb2e45b4a9ff4cb053b1ec37602be88528b62;hp=6e7cd25b7ad3542bd751e407e97de7e5685678da;hpb=eb5791fe867f6441d270344298678f45ed4a75e4;p=ghc-hetmet.git diff --git a/rts/win32/IOManager.c b/rts/win32/IOManager.c index 6e7cd25..c9a759f 100644 --- a/rts/win32/IOManager.c +++ b/rts/win32/IOManager.c @@ -16,6 +16,7 @@ #include #include #include +#include /* * Internal state maintained by the IO manager. @@ -181,7 +182,15 @@ IOWorkerProc(PVOID param) len = write(work->workData.ioData.fd, work->workData.ioData.buf, work->workData.ioData.len); - if (len == -1) { errCode = errno; } + if (len == -1) { + errCode = errno; + // write() gets errno wrong for + // ERROR_NO_DATA, we have to fix it here: + if (errCode == EINVAL && + GetLastError() == ERROR_NO_DATA) { + errCode = EPIPE; + } + } } complData = work->workData.ioData.buf; fd = work->workData.ioData.fd; @@ -461,6 +470,8 @@ void ShutdownIOManager ( rtsBool wait_threads ) } FreeWorkQueue(ioMan->workQueue); CloseHandle(ioMan->hExitEvent); + DeleteCriticalSection(&ioMan->active_work_lock); + DeleteCriticalSection(&ioMan->manLock); free(ioMan); ioMan = NULL; }