diff options
Diffstat (limited to 'statuses/cpuusage.c')
-rw-r--r-- | statuses/cpuusage.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/statuses/cpuusage.c b/statuses/cpuusage.c new file mode 100644 index 0000000..fa92829 --- /dev/null +++ b/statuses/cpuusage.c @@ -0,0 +1,85 @@ +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include "cpuusage.h" +#include "../config.h" + +#ifndef NUM_CPUS + #define NUM_CPUS 1 +#endif +#ifndef CPU_HISTORY_SIZE + #define CPU_HISTORY_SIZE 1 +#endif +#if CPU_HISTORY_SIZE < 1 + #define CPU_HISTORY_SIZE 1 +#endif + + +unsigned long last_cpu_used = 0; +unsigned long last_cpu_total = 0; +float cpu_history[CPU_HISTORY_SIZE]; // don't care about init values + +void status_cpuusage() +{ + double loadavg[3] = { -13.37, -13.37, -13.37 } ; + + char *stline = NULL; + size_t stlen; + FILE *stfile; + + unsigned long cpu_user; + unsigned long cpu_nice; + unsigned long cpu_sys; + unsigned long cpu_used; + unsigned long cpu_idle; + unsigned long cpu_total; + int i; + + + fputs("^fg(yellow)", stdout); // Error signaling color + + stfile = fopen("/proc/stat", "r"); + if (stfile != NULL) + { + for(i = CPU_HISTORY_SIZE - 1; i > 0; i--) + cpu_history[i] = cpu_history[i - 1]; + + stlen = getline(&stline, &stlen, stfile); + fclose(stfile); + + if ( 4 == sscanf(stline, "%*s %ld %ld %ld %ld", &cpu_user, &cpu_nice, &cpu_sys, &cpu_idle) ); + { + cpu_used = cpu_user + cpu_nice + cpu_sys; + cpu_total = cpu_used + cpu_idle; + + // Now do the percentage + cpu_history[0] = (float)(cpu_used - last_cpu_used) / + (float)(cpu_total - last_cpu_total); + + last_cpu_used = cpu_used; + last_cpu_total = cpu_total; + + + if (cpu_history[0] < 0.4) + fputs("^fg(#0077FF)", stdout); // CPU idling OK + else + fputs("^fg(#FF00FF)", stdout); // CPU busy + + //printf(" CPU: %.0f%% ", cpu_history[0] * 100); + } + + free(stline); + } + + + if (getloadavg(loadavg, 3) > 0); + printf(" %s%.0f,%.0f,%.0f,%.0f ", + cpu_history[0] < 0.1000 ? " " : "", + cpu_history[0] * 100, + loadavg[0] * (100 / 1), + loadavg[1] * (100 / 1), // (100 / NUM_CPUS) + loadavg[2] * (100 / 1)); + + //fputs(" CPU usage ", stdout); +} |