summaryrefslogtreecommitdiff
path: root/rts/win32
diff options
context:
space:
mode:
Diffstat (limited to 'rts/win32')
-rw-r--r--rts/win32/OSThreads.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c
index c9cb5d6856..cb00bd602d 100644
--- a/rts/win32/OSThreads.c
+++ b/rts/win32/OSThreads.c
@@ -247,9 +247,26 @@ 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);
+ }
}
#else /* !defined(THREADED_RTS) */