aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8/libgo/runtime/getncpu-linux.c
blob: 0122b77c9ffcd75302e62e8eb33354060e40f436 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include <features.h>
#include <sched.h>

// CPU_COUNT is only provided by glibc 2.6 or higher
#if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 6)
#define CPU_COUNT(set) _CPU_COUNT((unsigned int *)(set), sizeof(*(set))/sizeof(unsigned int))
static int _CPU_COUNT(unsigned int *set, size_t len) {
	int cnt;

	cnt = 0;
	while (len--)
		cnt += __builtin_popcount(*set++);
	return cnt;
}
#endif

#include "runtime.h"
#include "defs.h"

int32
getproccount(void)
{
	cpu_set_t set;
	int32 r, cnt;

	cnt = 0;
	r = sched_getaffinity(0, sizeof(set), &set);
	if(r == 0)
		cnt += CPU_COUNT(&set);

	return cnt ? cnt : 1;
}