comparison toys/other/taskset.c @ 734:7e0cea8fbc3e

Use sched_{set,get}affinity directly so musl doesn't have to provide wrappers.
author Rob Landley <rob@landley.net>
date Mon, 03 Dec 2012 16:16:06 -0600
parents 786841fdb1e0
children 144d5ba7d410
comparison
equal deleted inserted replaced
733:0cd93dd23b8d 734:7e0cea8fbc3e
21 */ 21 */
22 22
23 #define FOR_taskset 23 #define FOR_taskset
24 #include "toys.h" 24 #include "toys.h"
25 25
26 // Prototype for syscall wrappers sched.h refuses to give us 26 #include <sys/syscall.h>
27 int sched_setaffinity(pid_t pid, size_t size, void *cpuset); 27 #define sched_setaffinity(pid, size, cpuset) \
28 int sched_getaffinity(pid_t pid, size_t size, void *cpuset); 28 syscall(__NR_sched_setaffinity, (pid_t)pid, (size_t)size, (void *)cpuset)
29 #define sched_getaffinity(pid, size, cpuset) \
30 syscall(__NR_sched_getaffinity, (pid_t)pid, (size_t)size, (void *)cpuset)
29 31
30 // mask is an array of long, which makes the layout a bit weird on big 32 // mask is an array of long, which makes the layout a bit weird on big
31 // endian systems but as long as it's consistent... 33 // endian systems but as long as it's consistent...
32 34
33 static void do_taskset(pid_t pid, int quiet) 35 static void do_taskset(pid_t pid, int quiet)
38 40
39 for (i=0; ; i++) { 41 for (i=0; ; i++) {
40 if (!quiet) { 42 if (!quiet) {
41 int j = sizeof(toybuf), flag = 0; 43 int j = sizeof(toybuf), flag = 0;
42 44
43 if (sched_getaffinity(pid, sizeof(toybuf), (void *)mask)) 45 if (-1 == sched_getaffinity(pid, sizeof(toybuf), (void *)mask))
44 perror_exit(failed, "get", pid); 46 perror_exit(failed, "get", pid);
45 47
46 printf("pid %d's %s affinity mask: ", pid, i ? "new" : "current"); 48 printf("pid %d's %s affinity mask: ", pid, i ? "new" : "current");
47 49
48 while (j--) { 50 while (j--) {
68 if (digit > 9) digit = 10 + tolower(*s)-'a'; 70 if (digit > 9) digit = 10 + tolower(*s)-'a';
69 if (digit > 15) error_exit("bad mask '%s'", *toys.optargs); 71 if (digit > 15) error_exit("bad mask '%s'", *toys.optargs);
70 mask[j/(2*sizeof(long))] |= digit << 4*(j&((2*sizeof(long))-1)); 72 mask[j/(2*sizeof(long))] |= digit << 4*(j&((2*sizeof(long))-1));
71 } 73 }
72 74
73 if (sched_setaffinity(pid, sizeof(toybuf), (void *)mask)) 75 if (-1 == sched_setaffinity(pid, sizeof(toybuf), (void *)mask))
74 perror_exit(failed, "set", pid); 76 perror_exit(failed, "set", pid);
75 } 77 }
76 } 78 }
77 79
78 static int task_callback(struct dirtree *new) 80 static int task_callback(struct dirtree *new)