foxygit / doom Log in
commit 0d4e0453946cbdde4995b108c2cc0b8431be2168
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Sat Sep 20 18:18:06 2008 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Sat Sep 20 18:18:06 2008 +0000

    Set processor affinity under non-Windows platforms using the POSIX API.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 1243
---
 src/i_main.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/i_main.c b/src/i_main.c
index 748a72be..74b164b1 100644
--- a/src/i_main.c
+++ b/src/i_main.c
@@ -32,6 +32,9 @@
 #ifdef _WIN32
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
+#else
+#include <unistd.h>
+#include <sched.h>
 #endif

 #include "doomdef.h"
@@ -46,16 +49,27 @@ int main(int argc, char **argv)
     myargc = argc;
     myargv = argv;

-#ifdef _WIN32
-    // Set the process affinity mask to 1 on Windows, so that all threads
+    // Set the process affinity mask so that all threads
     // run on the same processor.  This is a workaround for a bug in
     // SDL_mixer that causes occasional crashes.

+#ifdef _WIN32
     if (!SetProcessAffinityMask(GetCurrentProcess(), 1))
     {
         fprintf(stderr, "Failed to set process affinity mask (%d)\n",
                 (int) GetLastError());
     }
+#else
+    // POSIX version:
+
+    {
+        cpu_set_t set;
+
+        CPU_ZERO(&set);
+        CPU_SET(0, &set);
+
+        sched_setaffinity(getpid(), sizeof(set), &set);
+    }
 #endif

     // start doom