Juan Lang : server: Use kernel support for thread affinity when available.

Alexandre Julliard julliard at winehq.org
Wed Sep 30 10:56:09 CDT 2009


Module: wine
Branch: master
Commit: 474b2e4bfb46cf1bb8db0faa6ecfdb3fd157b117
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=474b2e4bfb46cf1bb8db0faa6ecfdb3fd157b117

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Sep 29 09:17:30 2009 -0700

server: Use kernel support for thread affinity when available.

---

 configure           |    1 +
 configure.ac        |    1 +
 include/config.h.in |    3 +++
 server/thread.c     |   22 ++++++++++++++++++++++
 4 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/configure b/configure
index ceb6e20..d05447a 100755
--- a/configure
+++ b/configure
@@ -12127,6 +12127,7 @@ for ac_func in \
 	pwrite \
 	readdir \
 	readlink \
+	sched_setaffinity \
 	sched_yield \
 	select \
 	setproctitle \
diff --git a/configure.ac b/configure.ac
index d489f00..27ae652 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1692,6 +1692,7 @@ AC_CHECK_FUNCS(\
 	pwrite \
 	readdir \
 	readlink \
+	sched_setaffinity \
 	sched_yield \
 	select \
 	setproctitle \
diff --git a/include/config.h.in b/include/config.h.in
index d4bbce6..0be8f4d 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -645,6 +645,9 @@
 /* Define to 1 if you have the <sched.h> header file. */
 #undef HAVE_SCHED_H
 
+/* Define to 1 if you have the `sched_setaffinity' function. */
+#undef HAVE_SCHED_SETAFFINITY
+
 /* Define to 1 if you have the `sched_yield' function. */
 #undef HAVE_SCHED_YIELD
 
diff --git a/server/thread.c b/server/thread.c
index 8b367ca..211cefe 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -35,6 +35,9 @@
 #ifdef HAVE_POLL_H
 #include <poll.h>
 #endif
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
 
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
@@ -406,7 +409,26 @@ struct thread *get_thread_from_pid( int pid )
 
 void set_thread_affinity( struct thread *thread, affinity_t affinity )
 {
+#ifdef HAVE_SCHED_SETAFFINITY
+    if (thread->unix_pid != -1)
+    {
+        cpu_set_t set;
+        int i;
+        affinity_t mask;
+
+        CPU_ZERO( &set );
+        for (i = 0, mask = 1; mask; i++, mask <<= 1)
+            if (affinity & mask) CPU_SET( i, &set );
+
+        if (!sched_setaffinity( thread->unix_pid, sizeof(set), &set ))
+            thread->affinity = affinity;
+        else
+            file_set_error();
+    }
+    else set_error( STATUS_ACCESS_DENIED );
+#else
     thread->affinity = affinity;
+#endif
 }
 
 #define THREAD_PRIORITY_REALTIME_HIGHEST 6




More information about the wine-cvs mailing list