thread-utils.con commit Merge branch 'sb/config-write-fix' (2a2c18f)
   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
  21int 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
  64int 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}