1 #define _GNU_SOURCE
2 #include <sched.h>
3 #include <string.h>
4 #include "pthread_impl.h"
5 #include "syscall.h"
6
sched_setaffinity(pid_t tid, size_t size, const cpu_set_t *set)7 int sched_setaffinity(pid_t tid, size_t size, const cpu_set_t *set)
8 {
9 #ifdef __LITEOS_A__
10 if (size != sizeof(cpu_set_t)) {
11 errno = EINVAL;
12 return -1;
13 }
14 return syscall(SYS_sched_setaffinity, tid, (unsigned short)(set->__bits[0]), MUSL_TYPE_PROCESS);
15 #else
16 return syscall(SYS_sched_setaffinity, tid, size, set);
17 #endif
18 }
19
pthread_setaffinity_np(pthread_t td, size_t size, const cpu_set_t *set)20 int pthread_setaffinity_np(pthread_t td, size_t size, const cpu_set_t *set)
21 {
22 #ifdef __LITEOS_A__
23 if (size != sizeof(cpu_set_t)) {
24 return EINVAL;
25 }
26 return -__syscall(SYS_sched_setaffinity, td->tid, (unsigned short)(set->__bits[0]), MUSL_TYPE_THREAD);
27 #else
28 return -__syscall(SYS_sched_setaffinity, td->tid, size, set);
29 #endif
30 }
31
32 #ifdef __LITEOS_A__
do_getaffinity(pid_t tid, size_t size, cpu_set_t *set, int flag)33 static int do_getaffinity(pid_t tid, size_t size, cpu_set_t *set, int flag)
34 {
35 unsigned int cpuset;
36 if (size != sizeof(cpu_set_t)) {
37 return -EINVAL;
38 }
39 int ret = __syscall(SYS_sched_getaffinity, tid, &cpuset, flag);
40 if (ret < 0) {
41 return ret;
42 }
43 set->__bits[0] = (long)cpuset;
44 return 0;
45 }
46 #else
do_getaffinity(pid_t tid, size_t size, cpu_set_t *set)47 static int do_getaffinity(pid_t tid, size_t size, cpu_set_t *set)
48 {
49 long ret = __syscall(SYS_sched_getaffinity, tid, size, set);
50 if (ret < 0) return ret;
51 if (ret < size) memset((char *)set+ret, 0, size-ret);
52 return 0;
53 }
54 #endif
55
sched_getaffinity(pid_t tid, size_t size, cpu_set_t *set)56 int sched_getaffinity(pid_t tid, size_t size, cpu_set_t *set)
57 {
58 #ifdef __LITEOS_A__
59 return __syscall_ret(do_getaffinity(tid, size, set, MUSL_TYPE_PROCESS));
60 #else
61 return __syscall_ret(do_getaffinity(tid, size, set));
62 #endif
63 }
64
pthread_getaffinity_np(pthread_t td, size_t size, cpu_set_t *set)65 int pthread_getaffinity_np(pthread_t td, size_t size, cpu_set_t *set)
66 {
67 #ifdef __LITEOS_A__
68 return -do_getaffinity(td->tid, size, set, MUSL_TYPE_THREAD);
69 #else
70 return -do_getaffinity(td->tid, size, set);
71 #endif
72 }
73