Xinqi Bao's Git

0cc1f880a7242b9ffea2cbe53bc71b19e09562af
[slstatus.git] / cpu.c
1 #include <stdio.h>
2 #include <string.h>
3
4 #include "util.h"
5
6 const char *
7 cpu_freq(void)
8 {
9 int freq;
10
11 return (pscanf("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq",
12 "%i", &freq) == 1) ?
13 bprintf("%d", (freq + 500) / 1000) : NULL;
14 }
15
16 const char *
17 cpu_perc(void)
18 {
19 int perc;
20 static long double a[7];
21 static int valid;
22 long double b[7];
23
24 memcpy(b, a, sizeof(b));
25 if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
26 &a[3], &a[4], &a[5], &a[6]) != 7) {
27 return NULL;
28 }
29 if (!valid) {
30 valid = 1;
31 return NULL;
32 }
33
34 perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) /
35 ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
36
37 return bprintf("%d", perc);
38 }
39
40 const char *
41 cpu_iowait(void)
42 {
43 int perc;
44 static int valid;
45 static long double a[7];
46 long double b[7];
47
48 memcpy(b, a, sizeof(b));
49 if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
50 &a[3], &a[4], &a[5], &a[6]) != 7) {
51 return NULL;
52 }
53 if (!valid) {
54 valid = 1;
55 return NULL;
56 }
57
58 perc = 100 * ((b[4]) - (a[4])) /
59 ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
60
61 return bprintf("%d", perc);
62 }