• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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