Xinqi Bao's Git

slstatus: add cpu_iowait
authorKurt Van Dijck <[email protected]>
Thu, 14 Sep 2017 21:58:38 +0000 (23:58 +0200)
committerAaron Marcher <[email protected]>
Sat, 16 Sep 2017 11:46:40 +0000 (13:46 +0200)
This commit introduces the cpu_iowait item, this is the percentage
of cpu time spent waiting on disks. High numbers typically indicate
that your system is not responsive due to disk IO.
This commit also avoid sleeping inside the cpu_perc and cpu_iowait
functions: waiting in either one implies lost info for the other.

Signed-off-by: Kurt Van Dijck <[email protected]>
config.def.h
slstatus.c

index 0e28d1e..6370008 100644 (file)
@@ -16,6 +16,7 @@ static const char unknown_str[] = "n/a";
  * battery_power        battery power usage             battery name
  * battery_state        battery charging state          battery name
  * cpu_perc             cpu usage in percent            NULL
  * battery_power        battery power usage             battery name
  * battery_state        battery charging state          battery name
  * cpu_perc             cpu usage in percent            NULL
+ * cpu_iowait           cpu iowait in percent           NULL
  * cpu_freq             cpu frequency in MHz            NULL
  * datetime             date and time                   format string
  * disk_free            free disk space in GB           mountpoint path
  * cpu_freq             cpu frequency in MHz            NULL
  * datetime             date and time                   format string
  * disk_free            free disk space in GB           mountpoint path
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 *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);
 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)
 {
 static const char *
 cpu_perc(void)
 {
-       struct timespec delay;
        int perc;
        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;
        }
                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;
        }
 
                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);
 }
 
        return bprintf("%d", perc);
 }