implement setThreadAffinity on Windows (#1741)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 14 Sep 2010 15:58:44 +0000 (15:58 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 14 Sep 2010 15:58:44 +0000 (15:58 +0000)
rts/win32/OSThreads.c

index c9cb5d6..cb00bd6 100644 (file)
@@ -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) */