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>
57 static int parsecpuinfo(void)
59 unsigned char cpubitmap
[128];
61 memset(cpubitmap
,0,sizeof(cpubitmap
));
63 FILE *f
= fopen("/proc/cpuinfo","r");
68 while (fgets(buf
,sizeof(buf
),f
)) {
69 // we don't like newlines
70 for (char *p
= buf
;*p
;++p
) {
78 for (char *p
= buf
;*p
;++p
) {
86 size_t kl
= strlen(buf
);
87 while (kl
> 0 && (buf
[kl
- 1] == '\t' || buf
[kl
- 1] == ' ')) {
93 while (*v
&& (*v
== ' ' || *v
== '\t'))
97 if (strcasecmp(buf
,"processor") == 0 && v
) {
99 long n
= strtol(v
,&endp
,10);
100 if (endp
&& endp
> v
&& n
>= 0 && (size_t)n
< sizeof(cpubitmap
) * 8)
101 cpubitmap
[n
/ 8] |= 1 << (n
% 8);
107 // count bits in bitmap
109 for (size_t n
= 0;n
< sizeof(cpubitmap
) * 8;++n
)
110 if (cpubitmap
[n
/ 8] & (1 << (n
% 8)))
120 #ifdef _SC_NPROCESSORS_ONLN
121 ncpu
= (int)sysconf(_SC_NPROCESSORS_ONLN
);
126 // try parsing /proc/cpuinfo
127 // NOTE seems cygwin can provide this too, idk if need tho
128 ncpu
= parsecpuinfo();
133 const int ctlname
[2] = {CTL_HW
,HW_NCPU
};
134 size_t ctllen
= sizeof(ncpu
);
135 if (sysctl(ctlname
,2,&ncpu
,&ctllen
,0,0) < 0)
142 GetSystemInfo(&sysinfo
);
143 ncpu
= (int)sysinfo
.dwNumberOfProcessors
;