50 lines
1.7 KiB
C
50 lines
1.7 KiB
C
#include <c_HardwareConcurrency.h>
|
|
|
|
/* ================================================================================================================== */
|
|
/* Cross-Platform OS Handle Interceptions */
|
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include <windows.h>
|
|
#elif defined(__linux__) || defined(__ANDROID__) || defined(__hpux) || defined(_AIX)
|
|
#include <unistd.h>
|
|
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/sysctl.h>
|
|
#endif
|
|
|
|
c_size_t c_HardwareConcurrency(void) {
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
SYSTEM_INFO sys_info;
|
|
GetSystemInfo(&sys_info);
|
|
return (c_size_t)sys_info.dwNumberOfProcessors > 0 ? (c_size_t)sys_info.dwNumberOfProcessors : 1;
|
|
|
|
#elif defined(__linux__) || defined(__ANDROID__) || defined(__hpux) || defined(_AIX)
|
|
long cores = sysconf(_SC_NPROCESSORS_ONLN);
|
|
return (cores > 0) ? (c_size_t)cores : 1;
|
|
|
|
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
|
|
int mib[2];
|
|
mib[0] = CTL_HW;
|
|
mib[1] = HW_NCPU; /* Fallback baseline key token selector */
|
|
|
|
#ifdef HW_AVAILCPU
|
|
mib[1] = HW_AVAILCPU; /* Preferred choice: online/available logical cores count query */
|
|
#endif
|
|
|
|
int num_cores = 0;
|
|
size_t len = sizeof(num_cores);
|
|
if (sysctl(mib, 2, &num_cores, &len, NULL, 0) == 0 && num_cores > 0) {
|
|
return (c_size_t)num_cores;
|
|
}
|
|
return 1;
|
|
|
|
#else
|
|
/* Safe fallback anchor primitive for completely unknown or specialized bare-metal setups */
|
|
return 1;
|
|
#endif
|
|
}
|