X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FOSThreads.c;h=44db42fef4516e9e4f4fa0e7580481204cf543c4;hb=fff1f6194c3c39de53cd645bda9865fb131b1c68;hp=410346916bddde9122bbd95a906fac5cdb602ce7;hpb=4c22e67ec95fd5fb54dbd758325f562831e7d19d;p=ghc-hetmet.git diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 4103469..44db42f 100644 --- a/rts/win32/OSThreads.c +++ b/rts/win32/OSThreads.c @@ -86,7 +86,7 @@ waitCondition ( Condition* pCond, Mutex* pMut ) void yieldThread() { - Sleep(0); + SwitchToThread(); return; } @@ -247,9 +247,45 @@ getNumberOfProcessors (void) } void -setThreadAffinity (nat n STG_UNUSED, nat m STG_UNUSED) +setThreadAffinity (nat n, nat m) // cap N of M { - /* ToDo */ + HANDLE hThread; + DWORD_PTR mask, r; // 64-bit win is required to handle more than 32 procs + nat nproc, i; + + hThread = GetCurrentThread(); + + nproc = getNumberOfProcessors(); + + mask = 0; + for (i = n; i < nproc; i+=m) { + mask |= 1 << i; + } + + r = SetThreadAffinityMask(hThread, mask); + if (r == 0) { + sysErrorBelch("SetThreadAffinity"); + stg_exit(EXIT_FAILURE); + } +} + +typedef BOOL (WINAPI *PCSIO)(HANDLE); + +void +interruptOSThread (OSThreadId id) +{ + HANDLE hdl; + PCSIO pCSIO; + if (!(hdl = OpenThread(THREAD_TERMINATE,FALSE,id))) { + sysErrorBelch("interruptOSThread: OpenThread"); + stg_exit(EXIT_FAILURE); + } + pCSIO = (PCSIO) GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")), "CancelSynchronousIo"); + if ( NULL != pCSIO ) { + pCSIO(hdl); + } else { + // Nothing to do, unfortunately + } } #else /* !defined(THREADED_RTS) */