2727#include <string.h>
2828#include <sched.h>
2929#include <sys/types.h>
30+ #ifdef __NetBSD__
31+ #include <sys/cpuset.h>
32+ #include <stdlib.h>
33+ #endif
3034
3135/* //////////////////////////////////////////////////////////////////////////////////////
3236 * implementation
@@ -36,7 +40,28 @@ tb_bool_t tb_sched_setaffinity(tb_size_t pid, tb_cpuset_ref_t cpuset)
3640 // check
3741 tb_assert_and_check_return_val (cpuset , tb_false );
3842
39- // set cpu affinity
43+ #ifdef __NetBSD__
44+ // NetBSD uses cpuset_t API
45+ cpuset_t * cpu_set ;
46+ size_t size ;
47+ if (cpuset_getaffinity (CPU_LEVEL_WHICH , CPU_WHICH_PID , (pid_t )pid , sizeof (cpuset_t ), NULL , & size ) != 0 )
48+ return tb_false ;
49+ cpu_set = (cpuset_t * )malloc (size );
50+ if (!cpu_set )
51+ return tb_false ;
52+ cpuset_zero (cpu_set );
53+
54+ tb_int_t i ;
55+ for (i = 0 ; i < TB_CPUSET_SIZE ; i ++ )
56+ {
57+ if (TB_CPUSET_ISSET (i , cpuset ))
58+ cpuset_set (i , cpu_set );
59+ }
60+ tb_bool_t ok = cpuset_setaffinity (CPU_LEVEL_WHICH , CPU_WHICH_PID , (pid_t )pid , size , cpu_set ) == 0 ;
61+ free (cpu_set );
62+ return ok ;
63+ #else
64+ // Linux uses cpu_set_t API
4065 tb_int_t i ;
4166 cpu_set_t cpu_set ;
4267 CPU_ZERO (& cpu_set );
@@ -46,13 +71,41 @@ tb_bool_t tb_sched_setaffinity(tb_size_t pid, tb_cpuset_ref_t cpuset)
4671 CPU_SET (i , & cpu_set );
4772 }
4873 return sched_setaffinity ((pid_t )pid , sizeof (cpu_set_t ), & cpu_set ) == 0 ;
74+ #endif
4975}
5076tb_bool_t tb_sched_getaffinity (tb_size_t pid , tb_cpuset_ref_t cpuset )
5177{
5278 // check
5379 tb_assert_and_check_return_val (cpuset , tb_false );
5480
55- // get cpu affinity
81+ #ifdef __NetBSD__
82+ // NetBSD uses cpuset_t API
83+ cpuset_t * cpu_set ;
84+ size_t size ;
85+ if (cpuset_getaffinity (CPU_LEVEL_WHICH , CPU_WHICH_PID , (pid_t )pid , sizeof (cpuset_t ), NULL , & size ) != 0 )
86+ return tb_false ;
87+ cpu_set = (cpuset_t * )malloc (size );
88+ if (!cpu_set )
89+ return tb_false ;
90+
91+ if (cpuset_getaffinity (CPU_LEVEL_WHICH , CPU_WHICH_PID , (pid_t )pid , size , cpu_set , NULL ) != 0 )
92+ {
93+ free (cpu_set );
94+ return tb_false ;
95+ }
96+
97+ // save cpuset
98+ tb_int_t i ;
99+ TB_CPUSET_ZERO (cpuset );
100+ for (i = 0 ; i < TB_CPUSET_SIZE ; i ++ )
101+ {
102+ if (cpuset_isset (i , cpu_set ))
103+ TB_CPUSET_SET (i , cpuset );
104+ }
105+ free (cpu_set );
106+ return tb_true ;
107+ #else
108+ // Linux uses cpu_set_t API
56109 cpu_set_t cpu_set ;
57110 CPU_ZERO (& cpu_set );
58111 if (sched_getaffinity ((pid_t )pid , sizeof (cpu_set_t ), & cpu_set ) != 0 )
@@ -67,4 +120,5 @@ tb_bool_t tb_sched_getaffinity(tb_size_t pid, tb_cpuset_ref_t cpuset)
67120 TB_CPUSET_SET (i , cpuset );
68121 }
69122 return tb_true ;
123+ #endif
70124}
0 commit comments