29#ifdef HAVE_SYS_TYPES_H
30# include <sys/types.h>
32#ifdef HAVE_SYS_PARAM_H
33# include <sys/param.h>
35#ifdef HAVE_SYS__CPUSET_H
36# include <sys/_cpuset.h>
44#ifdef HAVE_SYS_SYSCTL_H
45# include <sys/sysctl.h>
57# ifndef WIN32_LEAN_AND_MEAN
58# define WIN32_LEAN_AND_MEAN 1
61# ifndef ALL_PROCESSOR_GROUPS
62# define ALL_PROCESSOR_GROUPS 0xFFFFu
64#elif defined(_WIN32) && ! defined (__CYGWIN__)
65# error Windows headers are required for Windows build
70#ifdef HAVE_SYS_CPUSET_H
71# include <sys/cpuset.h>
77#if ! defined(HAS_DECL_CPU_SETSIZE) && ! defined(CPU_SETSIZE)
78# define CPU_SETSIZE (1024)
79# define CPU_SETSIZE_SAFE (64)
81# define CPU_SETSIZE_SAFE CPU_SETSIZE
85#if ! defined(HAS_DECL_CTL_HW) && defined(CTL_HW)
86# define HAS_DECL_CTL_HW 1
89#if ! defined(HAS_DECL_HW_NCPUONLINE) && defined(HW_NCPUONLINE)
90# define HAS_DECL_HW_NCPUONLINE 1
93#if ! defined(HAS_DECL_HW_AVAILCPU) && defined(HW_AVAILCPU)
94# define HAS_DECL_HW_AVAILCPU 1
97#if ! defined(HAS_DECL_HW_NCPU) && defined(HW_NCPU)
98# define HAS_DECL_HW_NCPU 1
101#if ! defined(HAS_DECL__SC_NPROCESSORS_ONLN) && defined(_SC_NPROCESSORS_ONLN)
102# define HAS_DECL__SC_NPROCESSORS_ONLN 1
105#if ! defined(HAS_DECL__SC_NPROC_ONLN) && defined(_SC_NPROC_ONLN)
106# define HAS_DECL__SC_NPROC_ONLN 1
109#if ! defined(HAS_DECL__SC_CRAY_NCPU) && defined(_SC_CRAY_NCPU)
110# define HAS_DECL__SC_CRAY_NCPU 1
113#if ! defined(HAS_DECL__SC_NPROCESSORS_CONF) && defined(_SC_NPROCESSORS_CONF)
114# define HAS_DECL__SC_NPROCESSORS_CONF 1
132#if defined(HAVE_SCHED_GETAFFINITY) && defined(HAVE_GETPID)
137 if (0 == sched_getaffinity (getpid (),
sizeof (cur_set), &cur_set))
140 ret = CPU_COUNT (&cur_set);
146 if (CPU_ISSET (i, &cur_set))
154#ifdef HAVE_CPU_COUNT_S
159 static const unsigned int set_size_cpus = 256 *
CPU_SETSIZE;
160 const size_t set_size_bytes = CPU_ALLOC_SIZE (set_size_cpus);
163 p_set = CPU_ALLOC (set_size_cpus);
166 if (0 == sched_getaffinity (getpid (), set_size_bytes, p_set))
168#ifndef MHD_FUNC_CPU_COUNT_S_GETS_CPUS
169 ret = CPU_COUNT_S (set_size_bytes, p_set);
171 ret = CPU_COUNT_S (set_size_cpus, p_set);
195#if defined(HAVE_CPUSET_GETAFFINITY)
202 if (0 == cpuset_getaffinity (CPU_LEVEL_WHICH, CPU_WHICH_PID, (id_t) -1,
203 sizeof (cur_mask), &cur_mask))
206 ret = CPU_COUNT (&cur_mask);
212 if (CPU_ISSET (i, &cur_mask))
220#ifdef HAVE_CPU_COUNT_S
225 static const unsigned int mask_size_cpus = 256 *
CPU_SETSIZE;
226 const size_t mask_size_bytes = CPU_ALLOC_SIZE (mask_size_cpus);
229 p_mask = CPU_ALLOC (mask_size_cpus);
232 if (0 == cpuset_getaffinity (CPU_LEVEL_WHICH, CPU_WHICH_PID, (id_t) -1,
233 mask_size_bytes, p_mask))
235#ifndef MHD_FUNC_CPU_COUNT_S_GETS_CPUS
236 ret = CPU_COUNT_S (mask_size_bytes, p_mask);
238 ret = CPU_COUNT_S (mask_size_cpus, p_mask);
262#if defined(HAVE_SCHED_GETAFFINITY_NP) && defined(HAVE_GETPID)
264 cpuset_t *cpuset_ptr;
265 cpuset_ptr = cpuset_create ();
266 if (
NULL != cpuset_ptr)
268 if (0 == sched_getaffinity_np (getpid (), cpuset_size (cpuset_ptr),
272#if defined(HAVE_SYSCONF) && defined(HAVE_DECL__SC_NPROCESSORS_CONF)
273 unsigned int max_num = 0;
275 sc_value = sysconf (_SC_NPROCESSORS_ONLN);
277 max_num = (
unsigned int) sc_value;
281 for (cpu_num = 0; cpu_num < max_num; ++cpu_num)
282 if (0 < cpuset_isset (cpu_num, cpuset_ptr))
294 res = cpuset_isset (cpu_num++, cpuset_ptr);
308 cpuset_destroy (cpuset_ptr);
327#if defined(_WIN32) && ! defined(__CYGWIN__)
333#define MHDT_MAX_GROUP_COUNT 128
337 int count_by_proc_aff_mask;
338 count_by_proc_aff_mask = -1;
344 if (GetProcessAffinityMask (GetCurrentProcess (), &proc_aff, &sys_aff))
347 for (count_by_proc_aff_mask = 0; 0 != proc_aff; proc_aff &= proc_aff - 1)
348 ++count_by_proc_aff_mask;
351 if (0 < count_by_proc_aff_mask)
354 k32hndl = LoadLibraryA (
"kernel32.dll");
357 typedef BOOL (WINAPI *GPGA_PTR)(HANDLE hProcess,
360 GPGA_PTR ptrGetProcessGroupAffinity;
361 ptrGetProcessGroupAffinity =
362 (GPGA_PTR) (
void *) GetProcAddress (k32hndl,
363 "GetProcessGroupAffinity");
364 if (
NULL == ptrGetProcessGroupAffinity)
368 ret = count_by_proc_aff_mask;
374 USHORT arr_elements = MHDT_MAX_GROUP_COUNT;
375 USHORT groups_arr[MHDT_MAX_GROUP_COUNT];
380 bool single_cpu_group_assigned;
381 struct mhdt_GR_AFFINITY
387 typedef BOOL (WINAPI *GPDCSM_PTR)(HANDLE Process,
388 struct mhdt_GR_AFFINITY *CpuSetMasks,
389 USHORT CpuSetMaskCount,
390 USHORT *RequiredMaskCount);
391 GPDCSM_PTR ptrGetProcessDefaultCpuSetMasks;
392 bool win_fe_or_later;
393 bool cpu_set_mask_assigned;
395 single_cpu_group_assigned =
false;
396 if (ptrGetProcessGroupAffinity (GetCurrentProcess (), &arr_elements,
399 if (1 == arr_elements)
402 single_cpu_group_assigned =
true;
407 typedef BOOL (WINAPI *GTGA_PTR)(HANDLE hThread,
408 struct mhdt_GR_AFFINITY *
410 GTGA_PTR ptrGetThreadGroupAffinity;
411 ptrGetThreadGroupAffinity =
412 (GTGA_PTR) (
void *) GetProcAddress (k32hndl,
413 "GetThreadGroupAffinity");
414 if (
NULL != ptrGetThreadGroupAffinity)
416 struct mhdt_GR_AFFINITY thr_gr_aff;
417 if (ptrGetThreadGroupAffinity (GetCurrentThread (), &thr_gr_aff))
418 proc_aff2 = (ULONG_PTR) thr_gr_aff.Mask;
423 ptrGetProcessDefaultCpuSetMasks =
424 (GPDCSM_PTR) (
void *) GetProcAddress (k32hndl,
425 "GetProcessDefaultCpuSetMasks");
426 if (
NULL != ptrGetProcessDefaultCpuSetMasks)
431 struct mhdt_GR_AFFINITY gr_affs[MHDT_MAX_GROUP_COUNT];
435 win_fe_or_later =
true;
437 if (ptrGetProcessDefaultCpuSetMasks (GetCurrentProcess (), gr_affs,
439 /
sizeof (gr_affs[0]), &num_elm))
444 cpu_set_mask_assigned =
false;
447 cpu_set_mask_assigned =
true;
450 cpu_set_mask_assigned =
true;
454 win_fe_or_later =
false;
455 cpu_set_mask_assigned =
false;
457 if (! win_fe_or_later)
462 ret = count_by_proc_aff_mask;
468 if (cpu_set_mask_assigned)
478 if (! single_cpu_group_assigned)
499 ret = count_by_proc_aff_mask;
504 FreeLibrary (k32hndl);
528#if defined(__linux__) || defined(__GLIBC__)
572#ifdef HAVE_PSTAT_GETDYNAMIC
576 struct pst_dynamic psd_data;
577 memset ((
void *) &psd_data, 0,
sizeof (psd_data));
578 if (1 == pstat_getdynamic (&psd_data,
sizeof (psd_data), (
size_t) 1, 0))
580 if (0 < psd_data.psd_proc_cnt)
581 ret = (int) psd_data.psd_proc_cnt;
585#ifdef HAVE_VXCPUENABLEDGET
590 enb_set = vxCpuEnabledGet ();
592 for (ret = 0; 0 != enb_set; enb_set &= enb_set - 1)
596#if defined(_WIN32) && ! defined (__CYGWIN__)
601 k32hndl = LoadLibraryA (
"kernel32.dll");
604 typedef DWORD (WINAPI *GAPC_PTR)(WORD GroupNumber);
605 GAPC_PTR ptrGetActiveProcessorCount;
607 ptrGetActiveProcessorCount =
608 (GAPC_PTR) (
void *) GetProcAddress (k32hndl,
"GetActiveProcessorCount");
609 if (
NULL != ptrGetActiveProcessorCount)
612 res = ptrGetActiveProcessorCount (ALL_PROCESSOR_GROUPS);
614 if (res != (DWORD) ret)
618 if ((0 >= ret) && (
NULL != k32hndl))
620 typedef void (WINAPI *GNSI_PTR)(SYSTEM_INFO *pSysInfo);
621 GNSI_PTR ptrGetNativeSystemInfo;
624 ptrGetNativeSystemInfo =
625 (GNSI_PTR) (
void *) GetProcAddress (k32hndl,
"GetNativeSystemInfo");
626 if (
NULL != ptrGetNativeSystemInfo)
630 memset ((
void *) &sysInfo, 0,
sizeof (sysInfo));
631 ptrGetNativeSystemInfo (&sysInfo);
632 ret = (int) sysInfo.dwNumberOfProcessors;
633 if (sysInfo.dwNumberOfProcessors != (DWORD) ret)
638 FreeLibrary (k32hndl);
645 memset ((
void *) &sysInfo, 0,
sizeof (sysInfo));
646 GetSystemInfo (&sysInfo);
647 ret = (int) sysInfo.dwNumberOfProcessors;
648 if (sysInfo.dwNumberOfProcessors != (DWORD) ret)
674#ifdef HAVE_SYSCTLBYNAME
677 size_t value_size =
sizeof (ret);
679 if ((0 != sysctlbyname (
"hw.logicalcpu", &ret, &value_size,
681 || (
sizeof (ret) != value_size))
686 size_t value_size =
sizeof (ret);
688 if ((0 != sysctlbyname (
"kern.smp.cpus", &ret, &value_size,
690 || (
sizeof (ret) != value_size))
695 size_t value_size =
sizeof (ret);
697 if ((0 != sysctlbyname (
"hw.activecpu", &ret, &value_size,
699 || (
sizeof (ret) != value_size))
704 size_t value_size =
sizeof (ret);
706 if ((0 != sysctlbyname (
"hw.ncpuonline", &ret, &value_size,
708 || (
sizeof (ret) != value_size))
713 size_t value_size =
sizeof (ret);
715 if ((0 != sysctlbyname (
"hw.availcpu", &ret, &value_size,
717 || (
sizeof (ret) != value_size))
721#if defined(HAVE_SYSCTL) && \
722 defined(HAS_DECL_CTL_HW) && \
723 defined(HAS_DECL_HW_NCPUONLINE)
727 int mib[2] = {CTL_HW, HW_NCPUONLINE};
728 size_t value_size =
sizeof (ret);
729 if ((0 != sysctl (mib, 2, &ret, &value_size,
NULL, 0))
730 || (
sizeof (ret) != value_size))
734#if defined(HAVE_SYSCTL) && \
735 defined(HAS_DECL_CTL_HW) && \
736 defined(HAS_DECL_HW_AVAILCPU)
740 int mib[2] = {CTL_HW, HW_AVAILCPU};
741 size_t value_size =
sizeof (ret);
742 if ((0 != sysctl (mib, 2, &ret, &value_size,
NULL, 0))
743 || (
sizeof (ret) != value_size))
772#ifdef HAVE_SYSCTLBYNAME
775 size_t value_size =
sizeof (ret);
777 if ((0 != sysctlbyname (
"hw.ncpu", &ret, &value_size,
779 || (
sizeof (ret) != value_size))
783#if defined(HAVE_SYSCTL) && \
784 defined(HAS_DECL_CTL_HW) && \
785 defined(HAS_DECL_HW_NCPU)
789 int mib[2] = {CTL_HW, HW_NCPU};
790 size_t value_size =
sizeof (ret);
791 if ((0 != sysctl (mib, 2, &ret, &value_size,
NULL, 0))
792 || (
sizeof (ret) != value_size))
815#if defined(HAVE_SYSCONF) && \
816 (defined(HAS_DECL__SC_NPROCESSORS_ONLN) || defined(HAS_DECL__SC_NPROC_ONLN))
818#ifdef HAS_DECL__SC_NPROCESSORS_ONLN
820 value = sysconf (_SC_NPROCESSORS_ONLN);
822#ifdef HAS_DECL__SC_NPROC_ONLN
824 value = sysconf (_SC_NPROC_ONLN);
829 if ((
long) ret != value)
851#if defined(HAVE_SYSCONF) && \
852 (defined(HAS_DECL__SC_CRAY_NCPU) || defined(HAS_DECL__SC_NPROCESSORS_CONF))
854#ifdef HAS_DECL__SC_CRAY_NCPU
856 value = sysconf (_SC_CRAY_NCPU);
858#ifdef HAS_DECL__SC_NPROCESSORS_CONF
860 value = sysconf (_SC_NPROCESSORS_CONF);
865 if ((
long) ret != value)
899#if ! defined(__linux__) && ! defined(__GLIBC__)
914 if (proc_cpu_count == res)
931#if ! defined(__linux__) && ! defined(__GLIBC__)
additional automatic macros for MHD_config.h