diff options
author | Simon Marlow <marlowsd@gmail.com> | 2010-09-14 15:58:44 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2010-09-14 15:58:44 +0000 |
commit | 09895ff7da70ae311b8deb47d77d612fe9964403 (patch) | |
tree | c25da85559d70937b33ddcdd04e1ddc9f3e2c533 /rts/win32 | |
parent | 3091b23097768655d9db8aafd18d90f5eff4f20b (diff) | |
download | haskell-09895ff7da70ae311b8deb47d77d612fe9964403.tar.gz |
implement setThreadAffinity on Windows (#1741)
Diffstat (limited to 'rts/win32')
-rw-r--r-- | rts/win32/OSThreads.c | 21 |
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) */ |