diff options
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) */ |
