diff --git a/configure.ac b/configure.ac index 9773993..2678f64 100644 --- a/configure.ac +++ b/configure.ac @@ -68,7 +68,7 @@ AC_SYS_LARGEFILE AC_FUNC_MALLOC AC_FUNC_REALLOC AC_FUNC_STRTOD -AC_CHECK_FUNCS([memchr memmove memset strerror strtol]) +AC_CHECK_FUNCS([memchr memmove memset strerror strtol sched_getaffinity]) AC_CHECK_HEADER([sys/endian.h], [ AC_CHECK_DECLS([htole64, le64toh], [], [], [ diff --git a/src/cpu.c b/src/cpu.c index c0155ef..3d2e813 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -1,5 +1,28 @@ +#define _GNU_SOURCE + #include +#include "config.h" + +#ifdef HAVE_SCHED_GETAFFINITY + +#include +#include + +size_t num_threads(void) { + cpu_set_t cpu_set; + CPU_ZERO(&cpu_set); + + if (sched_getaffinity(0, sizeof cpu_set, &cpu_set) == -1) + return sysconf(_SC_NPROCESSORS_ONLN); + else + return CPU_COUNT(&cpu_set); +} + +#else + size_t num_threads(void) { return sysconf(_SC_NPROCESSORS_ONLN); } + +#endif