xref: /freebsd/contrib/xz/src/common/tuklib_cpucores.c (revision 3f0164abf32b9b761e0a2cb4bdca3a8b84f156d4)
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 
31 extern uint32_t
32 tuklib_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