diff --git a/Makefile b/Makefile index 9cacb9330..fd8edc596 100644 --- a/Makefile +++ b/Makefile @@ -356,7 +356,7 @@ endif # Mac OS/X ifeq ($(TARGET),osx) set_target_defaults = $(call default_opts, \ - USE_POLL USE_TPROXY USE_LIBCRYPT USE_THREAD USE_KQUEUE) + USE_POLL USE_TPROXY USE_LIBCRYPT USE_THREAD USE_CPU_AFFINITY USE_KQUEUE) EXPORT_SYMBOL = -export_dynamic endif diff --git a/src/haproxy.c b/src/haproxy.c index db6f21f56..a4f2e0df5 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -59,6 +59,11 @@ #endif #include #endif +#ifdef __APPLE__ +#include +#include +#include +#endif #endif #if defined(USE_PRCTL) @@ -3164,7 +3169,7 @@ int main(int argc, char **argv) } ret = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(cpuset), &cpuset); } -#else +#elif defined(__linux__) sched_setaffinity(0, sizeof(unsigned long), (void *)&global.cpu_map.proc[proc]); #endif #endif @@ -3377,6 +3382,17 @@ int main(int argc, char **argv) if (i < MAX_THREADS && /* only the first 32/64 threads may be pinned */ global.cpu_map.thread[i]) {/* only do this if the thread has a THREAD map */ +#if defined(__APPLE__) + int j; + unsigned long cpu_map = global.cpu_map.thread[i]; + + while ((j = ffsl(cpu_map)) > 0) { + thread_affinity_policy_data_t cpu_set = { j - 1 }; + thread_port_t mthread = pthread_mach_thread_np(ha_thread_info[i].pthread); + thread_policy_set(mthread, THREAD_AFFINITY_POLICY, (thread_policy_t)&cpu_set, 1); + cpu_map &= ~(1UL << (j - 1)); + } +#else #if defined(__FreeBSD__) || defined(__NetBSD__) cpuset_t cpuset; #else @@ -3393,6 +3409,7 @@ int main(int argc, char **argv) } pthread_setaffinity_np(ha_thread_info[i].pthread, sizeof(cpuset), &cpuset); +#endif } } #endif /* !USE_CPU_AFFINITY */