#define cpuset_nbits(setsize) (8 * (setsize))
+extern int get_max_number_of_cpus(void);
+
extern cpu_set_t *cpuset_alloc(int ncpus, size_t *setsize, size_t *nbits);
extern void cpuset_free(cpu_set_t *set);
#include <errno.h>
#include <string.h>
#include <ctype.h>
+#include <sys/syscall.h>
#include "cpuset.h"
return q;
}
+/*
+ * Number of bits in a CPU bitmask on current system
+ */
+int get_max_number_of_cpus(void)
+{
+ int n, cpus = 2048;
+ size_t setsize;
+ cpu_set_t *set = cpuset_alloc(cpus, &setsize, NULL);
+
+ if (!set)
+ return -1; /* error */
+
+ for (;;) {
+ CPU_ZERO_S(setsize, set);
+
+ /* the library version does not return size of cpumask_t */
+ n = syscall(SYS_sched_getaffinity, 0, setsize, set);
+
+ if (n < 0 && errno == EINVAL && cpus < 1024 * 1024) {
+ cpuset_free(set);
+ cpus *= 2;
+ set = cpuset_alloc(cpus, &setsize, NULL);
+ if (!set)
+ return -1; /* error */
+ continue;
+ }
+ cpuset_free(set);
+ return n * 8;
+ }
+ return -1;
+}
+
/*
* Allocates a new set for ncpus and returns size in bytes and size in bits
*/
CPU_ZERO_S(setsize, set);
while (ptr >= str) {
- char val = char_to_val(*ptr);
+ char val;
+
+ /* cpu masks in /sys uses comma as a separator */
+ if (*ptr == ',')
+ ptr--;
+
+ val = char_to_val(*ptr);
if (val == (char) -1)
return -1;
if (val & 1)
#include <errno.h>
#include <string.h>
#include <ctype.h>
-#include <sys/syscall.h>
#include <err.h>
#include "cpuset.h"
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}
-/*
- * Number of bits in a CPU bitmask on current system
- */
-static int max_number_of_cpus(void)
-{
- int n, cpus = 2048;
- size_t setsize;
- cpu_set_t *set = cpuset_alloc(cpus, &setsize, NULL);
-
- if (!set)
- goto err;
-
- for (;;) {
- CPU_ZERO_S(setsize, set);
-
- /* the library version does not return size of cpumask_t */
- n = syscall(SYS_sched_getaffinity, 0, setsize, set);
-
- if (n < 0 && errno == EINVAL && cpus < 1024 * 1024) {
- cpuset_free(set);
- cpus *= 2;
- set = cpuset_alloc(cpus, &setsize, NULL);
- if (!set)
- goto err;
- continue;
- }
- cpuset_free(set);
- return n * 8;
- }
-err:
- errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting"));
- return 0;
-}
-
int main(int argc, char *argv[])
{
cpu_set_t *new_set, *cur_set;
|| (pid && (argc - optind < 1 || argc - optind > 2)))
usage(stderr);
- ncpus = max_number_of_cpus();
+ ncpus = get_max_number_of_cpus();
+ if (ncpus <= 0)
+ errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting"));
/*
* cur_set is always used for the sched_getaffinity call