[Pkg-wmaker-commits] [wmtop] 08/11: wmtop: Use proper int types.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Mon Feb 8 15:03:20 UTC 2016


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch upstream
in repository wmtop.

commit b61276e799710437905caf18f5dfaa198adc5e1e
Author: Doug Torrance <dtorrance at piedmont.edu>
Date:   Sun Feb 7 21:36:23 2016 -0500

    wmtop: Use proper int types.
    
    Based partially on a patch by wbk to fix Gentoo bug #410093 [1].  From the
    bug report:
    
      After fixing the /proc/meminfo issue, another bug will emerge on systems
      where total system RAM in bytes exceeds INT_MAX. The correct top three
      processes will be identified, but their load bars will have the wrong
      value. This is caused by a value overflow due to storing total system
      memory in an "int" type variable. We will end up thinking ((Total RAM)
      modulo (INT_MAX)) is our total system RAM, so our percentages will be
      inflated when drawing the load bar. This fix will require a bit more care
      to follow the flow of data and ensure this value isn't being cast to "int"
      along the way. Function return types will need to be changed.
    
    [1] https://bugs.gentoo.org/show_bug.cgi?id=410093
---
 wmtop.c | 64 +++++++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 37 insertions(+), 27 deletions(-)

diff --git a/wmtop.c b/wmtop.c
index 9125ffc..afe7e24 100644
--- a/wmtop.c
+++ b/wmtop.c
@@ -185,12 +185,12 @@ struct process {
     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;
 };
@@ -239,8 +239,8 @@ struct process *new_process(int p) {
 
     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);*/
@@ -259,11 +259,11 @@ int calculate_cpu(struct process *);
 void process_cleanup(void);
 void delete_process(struct process *);
 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);
@@ -460,7 +460,7 @@ int process_parse_procfs(struct process *process) {
     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;
@@ -468,6 +468,8 @@ int process_parse_procfs(struct process *process) {
 		int endl;
 #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) */
 
@@ -505,9 +507,10 @@ int process_parse_procfs(struct process *process) {
 
 #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);
@@ -572,6 +575,9 @@ int process_parse_procfs(struct process *process) {
     /*
      * Extract cpu times from data in /proc/<pid>/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,
@@ -585,11 +591,14 @@ int process_parse_procfs(struct process *process) {
     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;
@@ -731,7 +740,7 @@ void delete_process(struct process *p) {
 void draw_processes() {
     int i,n;
     struct process *best[3] = { 0, 0, 0 };
-    int total;
+    unsigned long total;
 
     /*
      * Invalidate time stamps
@@ -788,21 +797,21 @@ void draw_processes() {
 /* 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) */
 
@@ -825,7 +834,7 @@ int calc_cpu_total() {
 /* Calculate each processes cpu           */
 /******************************************/
 
-void calc_cpu_each(int total) {
+void calc_cpu_each(unsigned long total) {
     struct process *p = first_process;
     while (p) {
 
@@ -843,7 +852,8 @@ void calc_cpu_each(int total) {
 /******************************************/
 
 #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[1024];
     char *ptr;
@@ -873,10 +883,10 @@ int calc_mem_total() {
 /******************************************/
 
 #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;
     }
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmtop.git



More information about the Pkg-wmaker-commits mailing list