Xinqi Bao's Git

slstatus: add cpu_iowait
[slstatus.git] / slstatus.c
index e69423b..cbc35a4 100644 (file)
@@ -40,6 +40,7 @@ static const char *battery_power(const char *bat);
 static const char *battery_state(const char *bat);
 static const char *cpu_freq(void);
 static const char *cpu_perc(void);
+static const char *cpu_iowait(void);
 static const char *datetime(const char *fmt);
 static const char *disk_free(const char *mnt);
 static const char *disk_perc(const char *mnt);
@@ -177,26 +178,47 @@ cpu_freq(void)
 static const char *
 cpu_perc(void)
 {
-       struct timespec delay;
        int perc;
-       long double a[4], b[4];
+       static long double a[7];
+       static int valid;
+       long double b[7];
 
-       if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
-                  &a[3]) != 4) {
+       memcpy(b, a, sizeof(b));
+       if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
+                  &a[3], &a[4], &a[5], &a[6]) != 7) {
                return unknown_str;
        }
+       if (!valid) {
+               valid = 1;
+               return unknown_str;
+       }
+
+       perc = 100 * ((b[0]+b[1]+b[2]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[5]+a[6])) /
+              ((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]));
 
-       delay.tv_sec = (interval / 2) / 1000;
-       delay.tv_nsec = ((interval / 2) % 1000) * 1000000;
-       nanosleep(&delay, NULL);
+       return bprintf("%d", perc);
+}
 
-       if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf", &b[0], &b[1], &b[2],
-                  &b[3]) != 4) {
+static const char *
+cpu_iowait(void)
+{
+       int perc;
+       static int valid;
+       static long double a[7];
+       long double b[7];
+
+       memcpy(b, a, sizeof(b));
+       if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf", &a[0], &a[1], &a[2],
+                  &a[3], &a[4], &a[5], &a[6]) != 7) {
+               return unknown_str;
+       }
+       if (!valid) {
+               valid = 1;
                return unknown_str;
        }
 
-       perc = 100 * ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) /
-              ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
+       perc = 100 * ((b[4]) - (a[4])) /
+              ((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]));
 
        return bprintf("%d", perc);
 }