diff options
Diffstat (limited to 'src/common/cpucores.h')
-rw-r--r-- | src/common/cpucores.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/common/cpucores.h b/src/common/cpucores.h new file mode 100644 index 00000000..7e1a1438 --- /dev/null +++ b/src/common/cpucores.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////// +// +/// \file cpucores.h +/// \brief Get the number of online CPU cores +// +// This code has been put into the public domain. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef CPUCORES_H +#define CPUCORES_H + +#if defined(HAVE_NCPU_SYSCONF) +# include <unistd.h> + +#elif defined(HAVE_NCPU_SYSCTL) +# ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +# endif +# ifdef HAVE_SYS_SYSCTL_H +# include <sys/sysctl.h> +# endif +#endif + + +static inline uint32_t +cpucores(void) +{ + uint32_t ret = 0; + +#if defined(HAVE_CPUCORES_SYSCONF) + const long cpus = sysconf(_SC_NPROCESSORS_ONLN); + if (cpus > 0) + ret = (uint32_t)(cpus); + +#elif defined(HAVE_CPUCORES_SYSCTL) + int name[2] = { CTL_HW, HW_NCPU }; + int cpus; + size_t cpus_size = sizeof(cpus); + if (!sysctl(name, &cpus, &cpus_size, NULL, NULL) + && cpus_size == sizeof(cpus) && cpus > 0) + ret = (uint32_t)(cpus); +#endif + + return ret; +} + +#endif |