summaryrefslogtreecommitdiff
path: root/thread-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread-utils.c')
-rw-r--r--thread-utils.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/thread-utils.c b/thread-utils.c
index 55e7e2904e..a2135e0743 100644
--- a/thread-utils.c
+++ b/thread-utils.c
@@ -1,9 +1,7 @@
#include "cache.h"
+#include "thread-utils.h"
-#ifdef _WIN32
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#elif defined(hpux) || defined(__hpux) || defined(_hpux)
+#if defined(hpux) || defined(__hpux) || defined(_hpux)
# include <sys/pstat.h>
#endif
@@ -26,7 +24,7 @@ int online_cpus(void)
long ncpus;
#endif
-#ifdef _WIN32
+#ifdef GIT_WINDOWS_NATIVE
SYSTEM_INFO info;
GetSystemInfo(&info);
@@ -37,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)
@@ -46,3 +60,18 @@ int online_cpus(void)
return 1;
}
+
+int init_recursive_mutex(pthread_mutex_t *m)
+{
+ pthread_mutexattr_t a;
+ int ret;
+
+ ret = pthread_mutexattr_init(&a);
+ if (!ret) {
+ ret = pthread_mutexattr_settype(&a, PTHREAD_MUTEX_RECURSIVE);
+ if (!ret)
+ ret = pthread_mutex_init(m, &a);
+ pthread_mutexattr_destroy(&a);
+ }
+ return ret;
+}