aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvalid-ptr <konstantin.matveyev@eligovision.ru>2018-11-26 18:27:26 +0300
committerKonstantin S. Matveyev <root@zorro.ev>2018-11-26 18:28:52 +0300
commit1e8656f3d9f920b23a5106de2dd6167471ccbdb2 (patch)
tree1ee9b66b46479e3d515b8fdc5e756e0a26935cee /src
parent7809a2c08bd3dbea49af2f19a24346372f219b5b (diff)
downloadlanes-1e8656f3d9f920b23a5106de2dd6167471ccbdb2.tar.gz
lanes-1e8656f3d9f920b23a5106de2dd6167471ccbdb2.tar.bz2
lanes-1e8656f3d9f920b23a5106de2dd6167471ccbdb2.zip
Compilation of 'threading.c' fixed for macos
Diffstat (limited to 'src')
-rw-r--r--src/threading.c4
-rw-r--r--src/threading_osx.h59
2 files changed, 63 insertions, 0 deletions
diff --git a/src/threading.c b/src/threading.c
index c0e6a55..7b75986 100644
--- a/src/threading.c
+++ b/src/threading.c
@@ -58,6 +58,10 @@ THE SOFTWARE.
58 volatile bool_t sudo; 58 volatile bool_t sudo;
59#endif 59#endif
60 60
61#ifdef PLATFORM_OSX
62# include "threading_osx.h"
63#endif
64
61/* Linux with older glibc (such as Debian) don't have pthread_setname_np, but have prctl 65/* Linux with older glibc (such as Debian) don't have pthread_setname_np, but have prctl
62*/ 66*/
63#if defined PLATFORM_LINUX 67#if defined PLATFORM_LINUX
diff --git a/src/threading_osx.h b/src/threading_osx.h
new file mode 100644
index 0000000..93da8c3
--- /dev/null
+++ b/src/threading_osx.h
@@ -0,0 +1,59 @@
1/*
2 * THREADING_OSX.H
3 * http://yyshen.github.io/2015/01/18/binding_threads_to_cores_osx.html
4 */
5#ifndef __threading_osx_h__
6#define __threading_osx_h__ 1
7
8#include <mach/mach_types.h>
9#include <mach/thread_act.h>
10#include <sys/sysctl.h>
11
12#define SYSCTL_CORE_COUNT "machdep.cpu.core_count"
13
14typedef struct cpu_set {
15 uint32_t count;
16} cpu_set_t;
17
18static inline void CPU_ZERO(cpu_set_t *cs) { cs->count = 0; }
19static inline void CPU_SET(int num, cpu_set_t *cs) { cs->count |= (1 << num); }
20static inline int CPU_ISSET(int num, cpu_set_t *cs) { return (cs->count & (1 << num)); }
21
22int sched_getaffinity(pid_t pid, size_t cpu_size, cpu_set_t *cpu_set)
23{
24 int32_t core_count = 0;
25 size_t len = sizeof(core_count);
26 int ret = sysctlbyname(SYSCTL_CORE_COUNT, &core_count, &len, 0, 0);
27 if (ret)
28 {
29// printf("error while get core count %d\n", ret);
30 return -1;
31 }
32 cpu_set->count = 0;
33 for (int i = 0; i < core_count; i++)
34 {
35 cpu_set->count |= (1 << i);
36 }
37
38 return 0;
39}
40
41int pthread_setaffinity_np(pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
42{
43 thread_port_t mach_thread;
44 int core = 0;
45
46 for (core = 0; core < 8 * cpu_size; core++)
47 {
48 if (CPU_ISSET(core, cpu_set))
49 break;
50 }
51// printf("binding to core %d\n", core);
52 thread_affinity_policy_data_t policy = { core };
53 mach_thread = pthread_mach_thread_np(thread);
54 thread_policy_set(mach_thread, THREAD_AFFINITY_POLICY, (thread_policy_t)&policy, 1);
55
56 return 0;
57}
58
59#endif