cvs commit: src/usr.bin/top machine.c

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Apr 18 03:43:22 PDT 2005


On 2005-04-18 15:57, Bruce Evans <bde at zeta.org.au> wrote:
>On Sun, 17 Apr 2005, Giorgos Keramidas wrote:
>>On 2005-04-17 23:01, Bruce Evans <bde at zeta.org.au> wrote:
>>> Just removing the CPU column doesn't seem right.  ps has a -C flag
>>> to switch between WCPU and CPU.
>>
>> We can add a new toggle command to top, i.e. 'C', that toggles
>> between displaying WCPU or CPU.  This should regain us a lot of the
>> space lost from COMMAND after I added THR.
>
> I like that.

Unfortunately, David has already said he doesn't, so making such a
chance wouldn't be good enough, but thanks :)

>> --- contrib/top/commands.c	14 Apr 2005 15:02:03 -0000	1.11
>> +++ contrib/top/commands.c	17 Apr 2005 13:53:19 -0000
>> @@ -71,6 +71,7 @@
>> d       - change number of displays to show\n\
>> e       - list errors generated by last \"kill\" or \"renice\" command\n\
>> i or I  - toggle the displaying of idle processes\n\
>> +C       - toggle the displaying of weighted CPU percentage\n\
>> H       - toggle the displaying of threads\n\
>> k       - kill processes; send a signal to a list of processes\n\
>> m       - toggle the display between 'cpu' and 'io' modes\n\
>
> Further unsorting of a sorted list.  The list was previously unsorted by
> adding H after I.

I'll add the C option to the right place in my local copy.  Moving H too
is an option, but that should probably be done as part of a different
style-sweep of top, which has an amazing number of style bugs already.

>> --- contrib/top/machine.h	17 Jul 2003 23:56:40 -0000	1.6
>> +++ contrib/top/machine.h	17 Apr 2005 13:37:40 -0000
>> @@ -60,6 +60,7 @@
>>     int self;		/* show self */
>>     int system;		/* show system processes */
>>     int thread;		/* show threads */
>> +    int wcpu;		/* show weighted cpu */
>>     int uid;		/* only this uid (unless uid == -1) */
>>     char *command;	/* only this command (unless == NULL) */
>> };
>
> More unsorting of a sorted list.

Fixed, thanks :-)

>> Index: contrib/top/top.c
>> ===================================================================
>> RCS file: /home/ncvs/src/contrib/top/top.c,v
>> retrieving revision 1.16
>> diff -u -r1.16 top.c
>> --- contrib/top/top.c	14 Apr 2005 15:02:03 -0000	1.16
>> +++ contrib/top/top.c	17 Apr 2005 13:43:26 -0000
>> @@ -193,9 +193,9 @@
>>     fd_set readfds;
>>
>> #ifdef ORDER
>> -    static char command_chars[] = "\f qh?en#sdkriIutHmSo";
>> +    static char command_chars[] = "\f qh?en#sdkriIutHCmSo";
>> #else
>> -    static char command_chars[] = "\f qh?en#sdkriIutHmS";
>> +    static char command_chars[] = "\f qh?en#sdkriIutHCmS";
>> #endif
>
> Unsorting of unsorted lists.

These arrays are used as arrays of characters matching the CMD_xxx
options.  I'm not sure if it is possible to keep both the list of
CMD_xxx defines *and* the characters in command_chars[] sorted, or
if it's worth the extra trouble.

>> /* these defines enumerate the "strchr"s of the commands in command_chars
>>  */
>>  #define CMD_redraw	0
>>  @@ -216,10 +216,11 @@
>>  #define CMD_user	14
>>  #define CMD_selftog	15
>>  #define CMD_thrtog	16
>> -#define CMD_viewtog	17
>> -#define CMD_viewsys	18
>> +#define	CMD_wcputog	17
>> +#define CMD_viewtog	18
>> +#define CMD_viewsys	19
>>  #ifdef ORDER
>> -#define CMD_order       19
>> +#define CMD_order       20
>>  #endif
> >
> >    /* set the buffer for stdout */
>
> Adding at the end of this list would be acceptable, to avoid
> renumbering everything.  But iterations of that is apparently
> how the order of command_chars[] became random (historical).

I know :-/

The diffs of the changes that touch this list seem to insert the option
somewhere and then renumber everything as needed.  I don't like this,
but it seems to be the way it's been done since practically forever.

> >--- usr.bin/top/machine.c	16 Apr 2005 15:43:38 -0000	1.71
> >+++ usr.bin/top/machine.c	17 Apr 2005 13:51:12 -0000
>
> I thought that you would have to change the sorting method to switch
> between WCPU and CPU, but the existing sorting is only on CPU.  It is
> just more bogus to sort on CPU while only displaying WCPU.

Ah, yes.  Good point.  I thought about it for a while, but was
undecided.  Changing the sort order needs a new sorting method,
but it's definitely something I can easily add.

I'm not sure if I got all the details right, but changing ORDER_PCTCPU
seems to be the easiest way to do this without having to introduce
changes to a lot of places.  The top.wcputog2.diff diff at my personal
space on freefall does this, with a modification to the macro:
http://people.freebsd.org/~keramida/diff/top.wcputog2.diff

%  #define ORDERKEY_PCTCPU(a, b) do { \
% -       long diff = (long)(b)->ki_pctcpu - (long)(a)->ki_pctcpu; \
% +       long diff; \
% +       if (ps.wcpu) \
% +               diff = floor(100.0 * weighted_cpu(pctdouble((a)->ki_pctcpu), (b))) - \
% +                   floor(100.0 * weighted_cpu(pctdouble((a)->ki_pctcpu), (a))); \
% +       else \
% +               diff = (long)(b)->ki_pctcpu - (long)(a)->ki_pctcpu; \
%         if (diff != 0) \
%                 return (diff > 0 ? 1 : -1); \
%  } while (0)

> >@@ -780,8 +780,7 @@
> >	    status,
> >	    smpmode ? pp->ki_lastcpu : 0,
> >	    format_time(cputime),
> >-	    100.0 * weighted_cpu(pct, pp),
> >-	    100.0 * pct,
> >+	    ps.wcpu ? (100.0 * weighted_cpu(pct, pp)) : (100.0 * pct),
>
> Excessive parentheses.

Removed, thanks :)

- Giorgos



More information about the cvs-src mailing list