summaryrefslogtreecommitdiff
path: root/rts/win32
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-09-14 15:58:44 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-09-14 15:58:44 +0000
commit09895ff7da70ae311b8deb47d77d612fe9964403 (patch)
treec25da85559d70937b33ddcdd04e1ddc9f3e2c533 /rts/win32
parent3091b23097768655d9db8aafd18d90f5eff4f20b (diff)
downloadhaskell-09895ff7da70ae311b8deb47d77d612fe9964403.tar.gz
implement setThreadAffinity on Windows (#1741)
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) */