26 // sys/param.h may have its own define
29 # include <sys/param.h>
30 # define SYS_PARAM_INCLUDED
38 # ifndef SYS_PARAM_INCLUDED
39 # include <sys/param.h>
41 # include <sys/sysctl.h>
52 static int parsecpuinfo()
54 unsigned char cpubitmap
[128];
56 memset(cpubitmap
,0,sizeof(cpubitmap
));
58 FILE *f
= fopen("/proc/cpuinfo","r");
63 while (fgets(buf
,sizeof(buf
),f
)) {
64 // we don't like newlines
65 for (char *p
= buf
;*p
;++p
) {
73 for (char *p
= buf
;*p
;++p
) {
81 size_t kl
= strlen(buf
);
82 while (kl
> 0 && (buf
[kl
- 1] == '\t' || buf
[kl
- 1] == ' ')) {
88 while (*v
&& (*v
== ' ' || *v
== '\t'))
92 if (strcasecmp(buf
,"processor") == 0 && v
) {
94 long n
= strtol(v
,&endp
,10);
95 if (endp
&& endp
> v
&& n
>= 0 && n
< sizeof(cpubitmap
) * 8)
96 cpubitmap
[n
/ 8] |= 1 << (n
% 8);
102 // count bits in bitmap
104 for (size_t n
= 0;n
< sizeof(cpubitmap
) * 8;++n
)
105 if (cpubitmap
[n
/ 8] & (1 << (n
% 8)))
115 #ifdef _SC_NPROCESSORS_ONLN
116 ncpu
= (int)sysconf(_SC_NPROCESSORS_ONLN
);
121 // try parsing /proc/cpuinfo
122 ncpu
= parsecpuinfo();
127 const int ctlname
[2] = {CTL_HW
,HW_NCPU
};
128 size_t ctllen
= sizeof(ncpu
);
129 if (sysctl(ctlname
,2,&ncpu
,&ctllen
,0,0) < 0)