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