Mercurial > hg > toybox
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) |