summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Kyle J. McKay <mackyle@gmail.com>2015-03-07 23:14:37 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2015-03-10 15:13:28 -0700
commita25b5a32c76630f2433b860fef7bc28a9380a8f6 (patch)
tree98834d20fde1ef9e6b4a84ace375411bf71d9eec
parentconfigure: support HAVE_BSD_SYSCTL option (diff)
downloadtgif-a25b5a32c76630f2433b860fef7bc28a9380a8f6.tar.xz
thread-utils.c: detect CPU count on older BSD-like systems
Not all systems support using sysconf to detect the number of available CPU cores. Older BSD and BSD-derived systems only provide the information via the sysctl function. If HAVE_BSD_SYSCTL is defined attempt to retrieve the number of available CPU cores using the sysctl function. If HAVE_BSD_SYSCTL is not defined or the sysctl function fails, we still attempt to get the information via sysconf. Signed-off-by: Kyle J. McKay <mackyle@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--thread-utils.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/thread-utils.c b/thread-utils.c
index 97396a75ae..a2135e0743 100644
--- a/thread-utils.c
+++ b/thread-utils.c
@@ -35,7 +35,23 @@ int online_cpus(void)
if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0))
return (int)psd.psd_proc_cnt;
-#endif
+#elif defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU)
+ int mib[2];
+ size_t len;
+ int cpucount;
+
+ mib[0] = CTL_HW;
+# ifdef HW_AVAILCPU
+ mib[1] = HW_AVAILCPU;
+ len = sizeof(cpucount);
+ if (!sysctl(mib, 2, &cpucount, &len, NULL, 0))
+ return cpucount;
+# endif /* HW_AVAILCPU */
+ mib[1] = HW_NCPU;
+ len = sizeof(cpucount);
+ if (!sysctl(mib, 2, &cpucount, &len, NULL, 0))
+ return cpucount;
+#endif /* defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU) */
#ifdef _SC_NPROCESSORS_ONLN
if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0)