30 #ifdef HAVE_PTHREAD_NP_H
31 #include <pthread_np.h>
34 #ifdef HAVE_SYS_CPUSET_H
35 #include <sys/param.h>
36 #include <sys/cpuset.h>
40 #if !defined(HAVE_PTHREAD_AFFINITY_NP) && defined HAVE_THREAD_POLICY
41 #include <mach/mach.h>
42 #include <mach/thread_policy.h>
51 #if (!(HAVE_CPU_SET_T) && HAVE_CPUSET_T)
53 typedef cpuset_t cpu_set_t;
61 return (
int)sysconf(_SC_NPROCESSORS_CONF);
65 return (
int)sysconf(_SC_NPROCESSORS_ONLN);
74 #if defined HAVE_PTHREAD_AFFINITY_NP
79 CPU_SET(
core, &cpuset);
81 int rc = pthread_setaffinity_np(thread,
sizeof(cpu_set_t), &cpuset);
82 return (rc == 0 ? 0 : -1);
88 int rc = pthread_getaffinity_np(thread,
sizeof(cpu_set_t), &cpuset);
95 bool core_found =
false;
96 for (
unsigned i = 0; i < CPU_SETSIZE; i++) {
97 if (CPU_ISSET(i, &cpuset)) {
109 return (core_found ? 0 : -1);
112 #elif defined HAVE_THREAD_POLICY
116 mach_port_t mach_thread = pthread_mach_thread_np(thread);
118 thread_affinity_policy_data_t policy = {
core + 1 };
120 kern_return_t rc = thread_policy_set(mach_thread,
121 THREAD_AFFINITY_POLICY,
122 (thread_policy_t) &policy,
123 THREAD_AFFINITY_POLICY_COUNT);
125 return (rc == KERN_SUCCESS ? 0 : -1);
131 mach_port_t mach_thread = pthread_mach_thread_np(thread);
132 thread_affinity_policy_data_t policy;
133 mach_msg_type_number_t count = THREAD_AFFINITY_POLICY_COUNT;
134 boolean_t get_default = FALSE;
136 kern_return_t rc = thread_policy_get(mach_thread,
137 THREAD_AFFINITY_POLICY,
138 (thread_policy_t) &policy, &count,
140 *
core = (unsigned)policy.affinity_tag;
142 return (rc == KERN_SUCCESS ? 0 : -1);