linux/src/sysinfo_linux.c (29 lines of code) (raw):

// Copyright (C) Microsoft Corporation. All rights reserved. #include <inttypes.h> #include <unistd.h> #include "macro_utils/macro_utils.h" #include "c_logging/logger.h" #include "c_pal/sysinfo.h" uint32_t sysinfo_get_processor_count(void) { /* Codes_SRS_SYSINFO_01_001: [ sysinfo_get_processor_count shall obtain the processor count as reported by the operating system. ]*/ /* Codes_SRS_SYSINFO_LINUX_01_001: [ sysinfo_get_processor_count shall call sysconf with SC_NPROCESSORS_ONLN to obtain the number of configured processors. ]*/ uint32_t result; long sysconf_result = sysconf(_SC_NPROCESSORS_ONLN); if (sysconf_result < 0) { /* Codes_SRS_SYSINFO_01_002: [ If any error occurs, `sysinfo_get_processor_count` shall return 0. ]*/ /* Codes_SRS_SYSINFO_LINUX_01_002: [ If any error occurs, `sysinfo_get_processor_count` shall return 0. ]*/ LogError("sysconf(_SC_NPROCESSORS_ONLN) failed with %ld", sysconf_result); result = 0; } else { /* Codes_SRS_SYSINFO_LINUX_01_003: [ If sysconf returns a number bigger than UINT32_MAX, sysinfo_get_processor_count shall fail and return 0. ]*/ if (sysconf_result > UINT32_MAX) { LogError("sysconf(_SC_NPROCESSORS_ONLN) returned %ld, wow that's a lot of processors!", sysconf_result); result = 0; } else { result = (uint32_t)sysconf_result; LogInfo("Detected %" PRIu32 " processors", result); } } return result; }