X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FOSThreads.c;h=44db42fef4516e9e4f4fa0e7580481204cf543c4;hb=7d9eb2e45b4a9ff4cb053b1ec37602be88528b62;hp=13a3666b63c1767b5c158301e3da628befdaf678;hpb=0ee85183fac8129a3c1b890849f32f30fd3940ec;p=ghc-hetmet.git diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 13a3666..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 @@ -232,12 +232,60 @@ forkOS_createThread ( HsStablePtr entry ) (unsigned*)&pId) == 0); } -void CCallEnterCriticalSection(LPCRITICAL_SECTION s) { - EnterCriticalSection(s); +nat +getNumberOfProcessors (void) +{ + static nat nproc = 0; + + if (nproc == 0) { + SYSTEM_INFO si; + GetSystemInfo(&si); + nproc = si.dwNumberOfProcessors; + } + + return nproc; } -void CCallLeaveCriticalSection(LPCRITICAL_SECTION s) { - LeaveCriticalSection(s); +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) */