From 09895ff7da70ae311b8deb47d77d612fe9964403 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 14 Sep 2010 15:58:44 +0000 Subject: [PATCH] implement setThreadAffinity on Windows (#1741) --- rts/win32/OSThreads.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index c9cb5d6..cb00bd6 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) */ -- 1.7.10.4