tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

top on machines with more than 9 CPUs



Hi,

one of my users at work, monitoring his computation on our 12-CPU amd64,
noticed that the output of top is slightly distorted.

I investigated, and found that this is caused by a formatting that only
checks for 1 or more than 1 CPU, but assumes fixed column positions.

Also, the width computation is off by one per column, leading to 
unnecessary early switch to the abbreviated format.

I found that changing top/dist/display.c to thus:

diff -u -r1.7 display.c
--- display.c   5 May 2009 18:52:13 -0000       1.7
+++ display.c   24 Jun 2010 14:35:11 -0000
@@ -854,7 +854,8 @@
            *ip++ = cpustate_total_length;
            if ((i = strlen(*pp++)) > 0)
            {
-               cpustate_total_length += i + 8;
+               cpustate_total_length += i + 7;
+               /* strlen(" 100% ") is 6, strlen(" 99.9% ") is 7. Never 8. */
            }
        }
     }

and to change cpustates_tag() to read (sorry, the diff is longer and
unreadable).

static char *
cpustates_tag(int c)
 
{
    unsigned width, u;
    static char fmttag[100]; 
 
    const char *short_tag = !multi || ncpu <= 1 ? "CPU: " : "CPU%0*d";

    const char *long_tag = !multi || ncpu <= 1 ?
        "CPU states: " : "CPU%0*d states: ";

    for (width=0, u=ncpu; u>0; u /= 10) {
        ++width;
    }
    /* if length + strlen(long_tag) > screen_width, then we have to
       use the shorter tag */

    snprintf(fmttag, sizeof(fmttag), long_tag, width, c);

    if (cpustate_total_length + (signed)strlen(fmttag)  > screen_width) {
        snprintf(fmttag, sizeof(fmttag), short_tag, width, c);
    }

    /* set x_cpustates accordingly then return result */
    x_cpustates = strlen(fmttag);
    return(fmttag);
}

fixes both problems. I'll commit next week unless serious objections 
arise. Of course I'll feed the change upstreams.

Regards,
        -is


Home | Main Index | Thread Index | Old Index