From 474b2e4bfb46cf1bb8db0faa6ecfdb3fd157b117 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Tue, 29 Sep 2009 09:17:30 -0700 Subject: [PATCH] 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(+) diff --git a/configure b/configure index ceb6e205078..d05447a9edc 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 d489f007d41..27ae652560e 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 d4bbce64070..0be8f4dde28 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -645,6 +645,9 @@ /* Define to 1 if you have the 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 8b367ca6721..211cefecc1c 100644 --- a/server/thread.c +++ b/server/thread.c @@ -35,6 +35,9 @@ #ifdef HAVE_POLL_H #include #endif +#ifdef HAVE_SCHED_H +#include +#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