src/wmsysmon.c | 59 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/wmsysmon.c b/src/wmsysmon.c index b780ead..b260495 100644 --- a/src/wmsysmon.c +++ b/src/wmsysmon.c @@ -83,13 +83,20 @@ int wmsysmon_mask_height = 64; long start_time = 0; long start_uptime = 0; int counter = 0; -int Mem_l; /* line in /proc/meminfo "Mem:" is on */ -int Swap_l; /* line in /proc/meminfo "Swap:" is on */ -int intr_l; /* line in /proc/stat "intr" is on */ -int rio_l; /* line in /proc/stat "disk_rio" is on */ -int wio_l; /* line in /proc/stat "disk_wio" is on */ -int page_l; /* line in /proc/stat "page" is on */ -int swap_l; /* line in /proc/stat "swap" is on */ +int Mem_l = -1; /* line in /proc/meminfo "Mem:" is on */ +int Swap_l = -1; /* line in /proc/meminfo "Swap:" is on */ +int MemTotal_l = -1; /* line in /proc/meminfo "MemTotal:" is on (2.6.x specific)*/ +int MemFree_l = -1; /* line in /proc/meminfo "MemFree:" is on (2.6.x specific)*/ +int Buffers_l = -1; /* line in /proc/meminfo "Buffers:" is on (2.6.x specific)*/ +int Cached_l = -1; /* line in /proc/meminfo "Cached:" is on (2.6.x specific)*/ +int SwapTotal_l = -1; /* line in /proc/meminfo "MemTotal:" is on (2.6.x specific)*/ +int SwapFree_l = -1; /* line in /proc/meminfo "MemFree:" is on (2.6.x specific)*/ +int intr_l = -1; /* line in /proc/stat "intr" is on */ +int rio_l = -1; /* line in /proc/stat "disk_rio" is on */ +int wio_l = -1; /* line in /proc/stat "disk_wio" is on */ +int page_l = -1; /* line in /proc/stat "page" is on */ +int swap_l = -1; /* line in /proc/stat "swap" is on */ +int cpu_l = -1; /* line in /proc/stat "cpu" is on (2.6.x is in wider format) */ long io_max; long io_max_diff; @@ -248,6 +255,13 @@ void wmsysmon_routine(int argc, char **argv) for(i = 0; fgets(buf, 1024, memfp); i++) { if(strstr(buf, "Mem:")) Mem_l = i; else if(strstr(buf, "Swap:")) Swap_l = i; + else if(strstr(buf, "MemTotal:")) MemTotal_l = i; + else if(strstr(buf, "MemFree:")) MemFree_l = i; + else if(strstr(buf, "Buffers:")) Buffers_l = i; + else if(strstr(buf, "SwapCached:")) /*just ignore it*/; + else if(strstr(buf, "SwapTotal:")) SwapTotal_l = i; + else if(strstr(buf, "SwapFree:")) SwapFree_l = i; + else if(strstr(buf, "Cached:")) Cached_l = i; } /* /proc/stat */ @@ -257,6 +271,7 @@ void wmsysmon_routine(int argc, char **argv) else if(strstr(buf, "page")) page_l = i; else if(strstr(buf, "swap")) swap_l = i; else if(strstr(buf, "intr")) intr_l = i; + else if(strstr(buf, "cpu ")) cpu_l = i; } while(1) { @@ -441,13 +456,19 @@ void DrawStuff( void ) static long stage; static long *tints; - stage = io = iodiff = iopercent = pageins = pageouts = swapins = swapouts = 0; + static long iowait; + + stage = iowait = io = iodiff = iopercent = pageins = pageouts = swapins = swapouts = 0; statfp = freopen("/proc/stat", "r", statfp); for(i = 0, ents = 0; ents < 5 && fgets(buf, 1024, statfp); i++) { - if(i == rio_l) { + if(i == cpu_l) { + if(sscanf(buf, "%*s %*li %*li %*li %*li %li", &iowait)) { + io = iowait; + } + } else if(i == rio_l) { tok = strtok(buf, seps); io += atoi(tok); @@ -523,14 +544,13 @@ void DrawStuff( void ) io_max = io; - if(io_max_diff !=0) iopercent = ((float) iodiff / (float) io_max_diff) * 100.0; else iopercent = 0; if(iodiff > io_max_diff) io_max_diff = iodiff; if (iopercent > 100) iopercent = 100; - + if(iopercent != io_last || first) { io_last = iopercent; @@ -732,6 +752,7 @@ void DrawMem(void) static int last_mem = 0, last_swap = 0, first = 1; static long mem_total = 0; static long mem_used = 0; + static long mem_free = 0; static long mem_buffers = 0; static long mem_cache = 0; static long swap_total = 0; @@ -764,6 +785,22 @@ void DrawMem(void) &swap_used, &swap_free); ents++; + } else if(i == MemTotal_l) { + sscanf(buf, "%*s %ld", &mem_total); + mem_used = mem_total - mem_free; + } else if(i == MemFree_l) { + sscanf(buf, "%*s %ld", &mem_free); + mem_used = mem_total - mem_free; + } else if(i == Buffers_l) { + sscanf(buf, "%*s %ld", &mem_buffers); + } else if(i == Cached_l) { + sscanf(buf, "%*s %ld", &mem_cache); + } else if(i == SwapTotal_l) { + sscanf(buf, "%*s %ld", &swap_total); + swap_used = swap_total - swap_free; + } else if(i == SwapFree_l) { + sscanf(buf, "%*s %ld", &swap_free); + swap_used = swap_total - swap_free; } }