25 // sys/param.h may have its own define
28 # include <sys/param.h>
29 # define SYS_PARAM_INCLUDED
37 # ifndef SYS_PARAM_INCLUDED
38 # include <sys/param.h>
40 # include <sys/sysctl.h>
51 static int parsecpuinfo()
53 unsigned char cpubitmap
[128];
55 memset(cpubitmap
,0,sizeof(cpubitmap
));
57 FILE *f
= fopen("/proc/cpuinfo","r");
62 while (fgets(buf
,sizeof(buf
),f
)) {
63 // we don't like newlines
64 for (char *p
= buf
;*p
;++p
) {
72 for (char *p
= buf
;*p
;++p
) {
80 size_t kl
= strlen(buf
);
81 while (kl
> 0 && (buf
[kl
- 1] == '\t' || buf
[kl
- 1] == ' ')) {
87 while (*v
&& (*v
== ' ' || *v
== '\t'))
91 if (strcasecmp(buf
,"processor") == 0 && v
) {
93 long n
= strtol(v
,&endp
,10);
94 if (endp
&& endp
> v
&& n
>= 0 && n
< sizeof(cpubitmap
) * 8)
95 cpubitmap
[n
/ 8] |= 1 << (n
% 8);
101 // count bits in bitmap
103 for (size_t n
= 0;n
< sizeof(cpubitmap
) * 8;++n
)
104 if (cpubitmap
[n
/ 8] & (1 << (n
% 8)))
111 #include "cpucount.h"
116 #ifdef _SC_NPROCESSORS_ONLN
117 ncpu
= (int)sysconf(_SC_NPROCESSORS_ONLN
);
122 // try parsing /proc/cpuinfo
123 ncpu
= parsecpuinfo();
128 const int ctlname
[2] = {CTL_HW
,HW_NCPU
};
129 size_t ctllen
= sizeof(ncpu
);
130 if (sysctl(ctlname
,2,&ncpu
,&ctllen
,0,0) < 0)