| // 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 |
| #ifndef CPU_COUNT |
| #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; |
| } |