1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 
5 #include <features.h>
6 #include <sched.h>
7 
8 // CPU_COUNT is only provided by glibc 2.6 or higher
9 #ifndef CPU_COUNT
10 #define CPU_COUNT(set) _CPU_COUNT((unsigned int *)(set), sizeof(*(set))/sizeof(unsigned int))
_CPU_COUNT(unsigned int * set,size_t len)11 static int _CPU_COUNT(unsigned int *set, size_t len) {
12 	int cnt;
13 
14 	cnt = 0;
15 	while (len--)
16 		cnt += __builtin_popcount(*set++);
17 	return cnt;
18 }
19 #endif
20 
21 #include "runtime.h"
22 #include "defs.h"
23 
24 int32
getproccount(void)25 getproccount(void)
26 {
27 	cpu_set_t set;
28 	int32 r, cnt;
29 
30 	cnt = 0;
31 	r = sched_getaffinity(0, sizeof(set), &set);
32 	if(r == 0)
33 		cnt += CPU_COUNT(&set);
34 
35 	return cnt ? cnt : 1;
36 }
37