gettime-thread: set and allow multiple CPUs
[fio.git] / os / os-solaris.h
index 7a0a3f0bfecab77a7e603f690a0350c8facde982..5b78cc2cc43cb384fb8d5e6e1f952bd6f618c1b6 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <errno.h>
 #include <malloc.h>
+#include <unistd.h>
 #include <sys/types.h>
 #include <sys/fcntl.h>
 #include <sys/pset.h>
@@ -103,15 +104,33 @@ static inline int fio_set_odirect(int fd)
 #define fio_cpu_clear(mask, cpu)       pset_assign(PS_NONE, (cpu), NULL)
 #define fio_cpu_set(mask, cpu)         pset_assign(*(mask), (cpu), NULL)
 
-static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+static inline int fio_cpu_isset(os_cpu_mask_t *mask, int cpu)
 {
-       if (pset_create(mask) < 0)
-               return -1;
+       const unsigned int max_cpus = sysconf(_SC_NPROCESSORS_ONLN);
+       unsigned int num_cpus;
+       processorid_t *cpus;
+       int i, ret;
 
-       return 0;
+       cpus = malloc(sizeof(*cpus) * max_cpus);
+
+       if (pset_info(*mask, NULL, &num_cpus, cpus) < 0) {
+               free(cpus);
+               return 0;
+       }
+
+       ret = 0;
+       for (i = 0; i < num_cpus; i++) {
+               if (cpus[i] == cpu) {
+                       ret = 1;
+                       break;
+               }
+       }
+
+       free(cpus);
+       return ret;
 }
 
-static inline int fio_cpuset_count(os_cpu_mask_t *mask)
+static inline int fio_cpu_count(os_cpu_mask_t *mask)
 {
        unsigned int num_cpus;
 
@@ -121,6 +140,14 @@ static inline int fio_cpuset_count(os_cpu_mask_t *mask)
        return num_cpus;
 }
 
+static inline int fio_cpuset_init(os_cpu_mask_t *mask)
+{
+       if (pset_create(mask) < 0)
+               return -1;
+
+       return 0;
+}
+
 static inline int fio_cpuset_exit(os_cpu_mask_t *mask)
 {
        if (pset_destroy(*mask) < 0)