X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2Fwin32%2FOSThreads.c;h=44db42fef4516e9e4f4fa0e7580481204cf543c4;hp=929b8171e7736e8fcd0d1deb163ac1ae5967f60b;hb=83d563cb9ede0ba792836e529b1e2929db926355;hpb=0ee0be109fd00ec629f7a2ad6a597885a0c9d5b4 diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 929b817..44db42f 100644 --- a/rts/win32/OSThreads.c +++ b/rts/win32/OSThreads.c @@ -11,7 +11,6 @@ #include "Rts.h" #if defined(THREADED_RTS) -#include "OSThreads.h" #include "RtsUtils.h" #include @@ -87,7 +86,7 @@ waitCondition ( Condition* pCond, Mutex* pMut ) void yieldThread() { - Sleep(0); + SwitchToThread(); return; } @@ -95,6 +94,7 @@ void shutdownThread() { _endthreadex(0); + barf("_endthreadex returned"); // avoid gcc warning } int @@ -246,6 +246,48 @@ getNumberOfProcessors (void) return nproc; } +void +setThreadAffinity (nat n, nat m) // cap N of M +{ + 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) */ int