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