1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       tuklib_cpucores.c
4/// \brief      Get the number of CPU cores online
5//
6//  Author:     Lasse Collin
7//
8//  This file has been put into the public domain.
9//  You can do whatever you want with this file.
10//
11///////////////////////////////////////////////////////////////////////////////
12
13#include "tuklib_cpucores.h"
14
15#if defined(TUKLIB_CPUCORES_SYSCTL)
16#	ifdef HAVE_SYS_PARAM_H
17#		include <sys/param.h>
18#	endif
19#	include <sys/sysctl.h>
20
21#elif defined(TUKLIB_CPUCORES_SYSCONF)
22#	include <unistd.h>
23
24// HP-UX
25#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC)
26#	include <sys/param.h>
27#	include <sys/pstat.h>
28#endif
29
30
31extern uint32_t
32tuklib_cpucores(void)
33{
34	uint32_t ret = 0;
35
36#if defined(TUKLIB_CPUCORES_SYSCTL)
37	int name[2] = { CTL_HW, HW_NCPU };
38	int cpus;
39	size_t cpus_size = sizeof(cpus);
40	if (sysctl(name, 2, &cpus, &cpus_size, NULL, 0) != -1
41			&& cpus_size == sizeof(cpus) && cpus > 0)
42		ret = cpus;
43
44#elif defined(TUKLIB_CPUCORES_SYSCONF)
45#	ifdef _SC_NPROCESSORS_ONLN
46	// Most systems
47	const long cpus = sysconf(_SC_NPROCESSORS_ONLN);
48#	else
49	// IRIX
50	const long cpus = sysconf(_SC_NPROC_ONLN);
51#	endif
52	if (cpus > 0)
53		ret = cpus;
54
55#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC)
56	struct pst_dynamic pst;
57	if (pstat_getdynamic(&pst, sizeof(pst), 1, 0) != -1)
58		ret = pst.psd_proc_cnt;
59#endif
60
61	return ret;
62}
63