1 #include <sys/sysinfo.h>
2 #include <ctype.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include "syscall.h"
8
9 #define _GNU_SOURCE
10 #include <dirent.h>
11
get_cpu_default()12 int get_cpu_default() {
13 int i, cnt;
14 unsigned char set[128] = {1};
15 __syscall(SYS_sched_getaffinity, 0, sizeof(set), set);
16 for ((i = cnt = 0); (i < sizeof(set)); i++)
17 for (; set[i]; (set[i] &= set[i] - 1), cnt++);
18 return cnt;
19 }
20
get_nprocs_conf()21 int get_nprocs_conf()
22 {
23 struct dirent *de;
24 int cnt = 0;
25 DIR *d = opendir("/sys/devices/system/cpu");
26 if (!d)
27 return get_cpu_default();
28 while ((de = readdir(d))) {
29 if ((de->d_type == DT_DIR) &&
30 (strlen(de->d_name) > 3) &&
31 (de->d_name[0] == 'c') &&
32 (de->d_name[1] == 'p') &&
33 (de->d_name[2] == 'u') &&
34 (isdigit(de->d_name[3])))
35 cnt++;
36 }
37 closedir(d);
38 return cnt;
39 }
40
get_nprocs()41 int get_nprocs()
42 {
43 int cnt;
44 FILE* fp = fopen("/sys/devices/system/cpu/online", "re");
45 if (fp != NULL) {
46 char buf[128];
47 memset(buf, 0, sizeof(buf));
48 if (!fgets(buf, sizeof(buf), fp)) {
49 return 1;
50 }
51 cnt = 0;
52 char *tmp, *p;
53 tmp = strtok_r(buf, ",", &p);
54 while (tmp != NULL) {
55 char *tok = strstr(tmp, "-");
56 if (tok) {
57 tok++;
58 cnt += atoi(tok) - atoi(tmp) + 1;
59 } else {
60 cnt += 1;
61 }
62 tmp = strtok_r(NULL, ",", &p);
63 }
64 fclose(fp);
65 return cnt;
66 }
67 return get_cpu_default();
68 }
69
get_phys_pages()70 long get_phys_pages()
71 {
72 return sysconf(_SC_PHYS_PAGES);
73 }
74
get_avphys_pages()75 long get_avphys_pages()
76 {
77 return sysconf(_SC_AVPHYS_PAGES);
78 }
79