--- wmtop.c 2001-01-19 15:41:20.000000000 -0600 +++ ../../wmtop-0.9.0/wmtop.c 2012-03-29 22:36:49.906684353 -0500 @@ -182,12 +182,12 @@ pid_t pid; char *name; float amount; - int user_time; - int kernel_time; - int previous_user_time; - int previous_kernel_time; - int vsize; - int rss; + unsigned long user_time; + unsigned long kernel_time; + unsigned long previous_user_time; + unsigned long previous_kernel_time; + unsigned long vsize; + long rss; int time_stamp; int counted; }; @@ -236,8 +236,8 @@ process->pid = p; process->time_stamp = 0; - process->previous_user_time = INT_MAX; - process->previous_kernel_time = INT_MAX; + process->previous_user_time = ULONG_MAX; + process->previous_kernel_time = ULONG_MAX; process->counted = 1; /* process_find_name(process);*/ @@ -256,11 +256,11 @@ void process_cleanup(void); void delete_process(struct process *); inline void draw_processes(void); -int calc_cpu_total(void); -void calc_cpu_each(int); +unsigned long calc_cpu_total(void); +void calc_cpu_each(unsigned long total); #if defined(LINUX) -int calc_mem_total(void); -void calc_mem_each(int); +unsigned long calc_mem_total(void); +void calc_mem_each(unsigned long total); #endif int process_find_top_three(struct process **); void draw_bar(int, int, int, int, float, int, int); @@ -457,13 +457,15 @@ char line[WMTOP_BUFLENGTH],filename[WMTOP_BUFLENGTH],procname[WMTOP_BUFLENGTH]; int ps; struct stat sbuf; - int user_time,kernel_time; + unsigned long user_time,kernel_time; int rc; #if defined(LINUX) char *r,*q; char deparenthesised_name[WMTOP_BUFLENGTH]; #endif /* defined(LINUX) */ #if defined(FREEBSD) + /* TODO: needs analysis. Probably needs same data type fix as LINUX (use + * long types). Need to check FreeBSD docs and test. -wbk */ int us,um,ks,km; #endif /* defined(FREEBSD) */ @@ -501,9 +503,10 @@ #if defined(LINUX) /* - * Extract cpu times from data in /proc filesystem + * Extract cpu times from data in /proc filesystem. + * For conversion types see man proc(5). */ - rc = sscanf(line,"%*s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d %d %*s %*s %*s %*s %*s %*s %*s %d %d", + rc = sscanf(line,"%*s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %lu %lu %*s %*s %*s %*s %*s %*s %*s %lu %ld", procname, &process->user_time,&process->kernel_time, &process->vsize,&process->rss); @@ -527,6 +530,9 @@ /* * Extract cpu times from data in /proc//stat * XXX: Process name extractor for FreeBSD is untested right now. + * + * [TODO: FREEBSD code probably needs similar data type changes to + * those made for LINUX above. Need to check docs. -wbk] */ rc = sscanf(line,"%s %*s %*s %*s %*s %*s %*s %*s %d,%d %d,%d", procname, @@ -540,11 +546,14 @@ process->kernel_time = ks*1000+km/1000; #endif /* defined(FREEBSD) */ + /* not portable (especially unsuitable for redistributable executables. + * On some systems, getpagesize() is a preprocessor macro). + */ process->rss *= getpagesize(); - if (process->previous_user_time==INT_MAX) + if (process->previous_user_time==ULONG_MAX) process->previous_user_time = process->user_time; - if (process->previous_kernel_time==INT_MAX) + if (process->previous_kernel_time==ULONG_MAX) process->previous_kernel_time = process->kernel_time; user_time = process->user_time-process->previous_user_time; @@ -686,7 +695,7 @@ void draw_processes() { int i,n; struct process *best[3] = { 0, 0, 0 }; - int total; + unsigned long total; /* * Invalidate time stamps @@ -743,21 +752,21 @@ /* Calculate cpu total */ /******************************************/ -int calc_cpu_total() { - int total,t; - static int previous_total = INT_MAX; +unsigned long calc_cpu_total() { + unsigned long total,t; + static unsigned long previous_total = ULONG_MAX; #if defined(LINUX) int rc; int ps; char line[WMTOP_BUFLENGTH]; - int cpu,nice,system,idle; + unsigned long cpu,nice,system,idle; ps = open("/proc/stat",O_RDONLY); rc = read(ps,line,sizeof(line)); close(ps); if (rc<0) return 0; - sscanf(line,"%*s %d %d %d %d",&cpu,&nice,&system,&idle); + sscanf(line,"%*s %lu %lu %lu %lu",&cpu,&nice,&system,&idle); total = cpu+nice+system+idle; #endif /* defined(LINUX) */ @@ -780,7 +789,7 @@ /* Calculate each processes cpu */ /******************************************/ -void calc_cpu_each(int total) { +void calc_cpu_each(unsigned long total) { struct process *p = first_process; while (p) { @@ -798,7 +807,8 @@ /******************************************/ #if defined(LINUX) -int calc_mem_total() { +/* INT_MAX won't always hold total system RAM, especially on a 64 bit system. */ +unsigned long calc_mem_total() { int ps; char line[512]; char *ptr; @@ -810,11 +820,12 @@ if (rc<0) return 0; - if ((ptr = strstr(line, "Mem:")) == NULL) { + if ((ptr = strstr(line, "MemTotal:")) == NULL) { return 0; } else { - ptr += 4; - return atoi(ptr); + ptr += 9; /* move into whitespace */ + /* wbk - old Mem: Total was bytes. MemTotal: is KB */ + return (unsigned long)atoi(ptr) * 1024; } } @@ -825,10 +836,10 @@ /******************************************/ #if defined(LINUX) -void calc_mem_each(int total) { +void calc_mem_each(unsigned long total) { struct process *p = first_process; while (p) { - p->amount = 100*(float)p->rss/total; + p->amount = 100*(double)p->rss/total; p = p->next; } }