summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h1
-rw-r--r--slstatus.c44
2 files changed, 34 insertions, 11 deletions
diff --git a/config.def.h b/config.def.h
index 0e28d1e..6370008 100644
--- a/config.def.h
+++ b/config.def.h
@@ -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
+ * 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
diff --git a/slstatus.c b/slstatus.c
index e69423b..cbc35a4 100644
--- a/slstatus.c
+++ b/slstatus.c
@@ -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);
}