BUILD/MEDIUM: threads: enable cpu_affinity on osx
Enable it but on a per thread basis only using Darwin native API.
This commit is contained in:
parent
7fa6fdf86a
commit
5e4c8e2a67
2
Makefile
2
Makefile
|
@ -356,7 +356,7 @@ endif
|
||||||
# Mac OS/X
|
# Mac OS/X
|
||||||
ifeq ($(TARGET),osx)
|
ifeq ($(TARGET),osx)
|
||||||
set_target_defaults = $(call default_opts, \
|
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
|
EXPORT_SYMBOL = -export_dynamic
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,11 @@
|
||||||
#endif
|
#endif
|
||||||
#include <pthread_np.h>
|
#include <pthread_np.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <mach/mach_types.h>
|
||||||
|
#include <mach/thread_act.h>
|
||||||
|
#include <mach/thread_policy.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_PRCTL)
|
#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);
|
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]);
|
sched_setaffinity(0, sizeof(unsigned long), (void *)&global.cpu_map.proc[proc]);
|
||||||
#endif
|
#endif
|
||||||
#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 */
|
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 */
|
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__)
|
#if defined(__FreeBSD__) || defined(__NetBSD__)
|
||||||
cpuset_t cpuset;
|
cpuset_t cpuset;
|
||||||
#else
|
#else
|
||||||
|
@ -3393,6 +3409,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
pthread_setaffinity_np(ha_thread_info[i].pthread,
|
pthread_setaffinity_np(ha_thread_info[i].pthread,
|
||||||
sizeof(cpuset), &cpuset);
|
sizeof(cpuset), &cpuset);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* !USE_CPU_AFFINITY */
|
#endif /* !USE_CPU_AFFINITY */
|
||||||
|
|
Loading…
Reference in New Issue