#include "Rts.h"
#if defined(THREADED_RTS)
-#include "OSThreads.h"
#include "RtsUtils.h"
#include <windows.h>
void
yieldThread()
{
- Sleep(0);
+ SwitchToThread();
return;
}
shutdownThread()
{
_endthreadex(0);
+ barf("_endthreadex returned"); // avoid gcc warning
}
int
(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);
+ }
}
#else /* !defined(THREADED_RTS) */