Merge branch 'mh/ref-directory-file'
[git] / thread-utils.c
1 #include "cache.h"
2 #include "thread-utils.h"
3
4 #if defined(hpux) || defined(__hpux) || defined(_hpux)
5 #  include <sys/pstat.h>
6 #endif
7
8 /*
9  * By doing this in two steps we can at least get
10  * the function to be somewhat coherent, even
11  * with this disgusting nest of #ifdefs.
12  */
13 #ifndef _SC_NPROCESSORS_ONLN
14 #  ifdef _SC_NPROC_ONLN
15 #    define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN
16 #  elif defined _SC_CRAY_NCPU
17 #    define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU
18 #  endif
19 #endif
20
21 int online_cpus(void)
22 {
23 #ifdef _SC_NPROCESSORS_ONLN
24         long ncpus;
25 #endif
26
27 #ifdef GIT_WINDOWS_NATIVE
28         SYSTEM_INFO info;
29         GetSystemInfo(&info);
30
31         if ((int)info.dwNumberOfProcessors > 0)
32                 return (int)info.dwNumberOfProcessors;
33 #elif defined(hpux) || defined(__hpux) || defined(_hpux)
34         struct pst_dynamic psd;
35
36         if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0))
37                 return (int)psd.psd_proc_cnt;
38 #elif defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU)
39         int mib[2];
40         size_t len;
41         int cpucount;
42
43         mib[0] = CTL_HW;
44 #  ifdef HW_AVAILCPU
45         mib[1] = HW_AVAILCPU;
46         len = sizeof(cpucount);
47         if (!sysctl(mib, 2, &cpucount, &len, NULL, 0))
48                 return cpucount;
49 #  endif /* HW_AVAILCPU */
50         mib[1] = HW_NCPU;
51         len = sizeof(cpucount);
52         if (!sysctl(mib, 2, &cpucount, &len, NULL, 0))
53                 return cpucount;
54 #endif /* defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU) */
55
56 #ifdef _SC_NPROCESSORS_ONLN
57         if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0)
58                 return (int)ncpus;
59 #endif
60
61         return 1;
62 }
63
64 int init_recursive_mutex(pthread_mutex_t *m)
65 {
66         pthread_mutexattr_t a;
67         int ret;
68
69         ret = pthread_mutexattr_init(&a);
70         if (!ret) {
71                 ret = pthread_mutexattr_settype(&a, PTHREAD_MUTEX_RECURSIVE);
72                 if (!ret)
73                         ret = pthread_mutex_init(m, &a);
74                 pthread_mutexattr_destroy(&a);
75         }
76         return ret;
77 }