tuklib_cpucores.c revision 207753
1207753Smm///////////////////////////////////////////////////////////////////////////////
2207753Smm//
3207753Smm/// \file       tuklib_cpucores.c
4207753Smm/// \brief      Get the number of CPU cores online
5207753Smm//
6207753Smm//  Author:     Lasse Collin
7207753Smm//
8207753Smm//  This file has been put into the public domain.
9207753Smm//  You can do whatever you want with this file.
10207753Smm//
11207753Smm///////////////////////////////////////////////////////////////////////////////
12207753Smm
13207753Smm#include "tuklib_cpucores.h"
14207753Smm
15207753Smm#if defined(TUKLIB_CPUCORES_SYSCTL)
16207753Smm#	ifdef HAVE_SYS_PARAM_H
17207753Smm#		include <sys/param.h>
18207753Smm#	endif
19207753Smm#	include <sys/sysctl.h>
20207753Smm
21207753Smm#elif defined(TUKLIB_CPUCORES_SYSCONF)
22207753Smm#	include <unistd.h>
23207753Smm#endif
24207753Smm
25207753Smm
26207753Smmextern uint32_t
27207753Smmtuklib_cpucores(void)
28207753Smm{
29207753Smm	uint32_t ret = 0;
30207753Smm
31207753Smm#if defined(TUKLIB_CPUCORES_SYSCTL)
32207753Smm	int name[2] = { CTL_HW, HW_NCPU };
33207753Smm	int cpus;
34207753Smm	size_t cpus_size = sizeof(cpus);
35207753Smm	if (sysctl(name, 2, &cpus, &cpus_size, NULL, 0) != -1
36207753Smm			&& cpus_size == sizeof(cpus) && cpus > 0)
37207753Smm		ret = (uint32_t)cpus;
38207753Smm
39207753Smm#elif defined(TUKLIB_CPUCORES_SYSCONF)
40207753Smm#	ifdef _SC_NPROCESSORS_ONLN
41207753Smm	// Most systems
42207753Smm	const long cpus = sysconf(_SC_NPROCESSORS_ONLN);
43207753Smm#	else
44207753Smm	// IRIX
45207753Smm	const long cpus = sysconf(_SC_NPROC_ONLN);
46207753Smm#	endif
47207753Smm	if (cpus > 0)
48207753Smm		ret = (uint32_t)cpus;
49207753Smm#endif
50207753Smm
51207753Smm	return ret;
52207753Smm}
53