Xin LI <delp...@delphij.net> writes: > Hi, > > Here is a patch that makes top(1) to inverse its table header (PID > USERNAME THR, etc). >
That MAX_COLS change in it makes `top -b' produce too much extra whitespace that's not trimmed and spans several lines, e.g. $ stty -a | sed 1q speed 38400 baud; 57 rows; 79 columns; $ top -b last pid: 54799; load averages: 1.90, 2.16, 2.16 up 0+04:28:34 10:18:15 91 processes: 4 running, 85 sleeping, 2 stopped Mem: 540M Active, 243M Inact, 2934M Wired, 79M Cache, 417M Buf, 136M Free Swap: 4097M Total, 8856K Used, 4088M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 1730 holo 14 46 0 358M 197M ucond 1 1:24 0.00% firefox-bin FYI, using inverse color for header line can also be achieved on top-3.8b1 without touching source at all $ export TOPCOLORS='header=,#7' edwin@ planned to update top(1) but stalled, not sure why. http://docs.freebsd.org/cgi/mid.cgi?20080928054620.GA80250 And I for one still use his branch with below diff.
against svn://svn.freebsd.org/base/user/edwin/top/top-3.8b1 - cherry-pick changes from /head (r189626, r200979, r211419) - report realtime priority like /head - lower min_screenwidth for FLG field, for 80 col tty sake - use int type for counter - fix amd64/i386 cross-compilation - remove `-g', prefer DEBUG_FLAGS - abbreviate Kern/Kernel row like Mem/Memory - adjust whitespace --- Index: contrib/top/display.c =================================================================== --- contrib/top/display.c (revision 215416) +++ contrib/top/display.c (working copy) @@ -993,7 +993,6 @@ if (*bt != -1) { uptime = *tod - *bt; - uptime += 30; uptime_days = uptime / 86400; tm = gmtime(&uptime); @@ -1312,7 +1311,7 @@ } /* - * *_kernel(stats) - print "Kernel: " followed by the kernel summary string + * *_kernel(stats) - print "Kern: " followed by the kernel summary string * * Assumptions: cursor is on "lastline", the previous line */ @@ -1323,7 +1322,7 @@ { if (num_kernel > 0) { - display_write(0, y_kernel, 0, 0, "Kernel: "); + display_write(0, y_kernel, 0, 0, "Kern: "); /* format and print the kernel summary */ summary_format(x_kernel, y_kernel, stats, kernel_names, kernel_cidx); Index: contrib/top/username.c =================================================================== --- contrib/top/username.c (revision 215416) +++ contrib/top/username.c (working copy) @@ -53,7 +53,6 @@ #include <sys/types.h> #include <pwd.h> -#include <utmp.h> #include "top.h" #include "utils.h" @@ -72,7 +71,7 @@ struct hash_data { int uid; - char name[UT_NAMESIZE + 1]; /* big enough? */ + char name[MAXLOGNAME]; /* big enough? */ time_t expire; }; @@ -120,7 +119,7 @@ { if ((pw = getpwuid(uid)) != NULL) { - strncpy(data->name, pw->pw_name, UT_NAMESIZE); + strncpy(data->name, pw->pw_name, MAXLOGNAME - 1); data->expire = now + EXPIRETIME; dprintf("username: updating %d with %s, expires %d\n", data->uid, data->name, data->expire); Index: contrib/top/hash.c =================================================================== --- contrib/top/hash.c (revision 215416) +++ contrib/top/hash.c (working copy) @@ -99,7 +99,7 @@ next_prime(int x) { - double i, j; + int i, j; int f; i = x; @@ -108,7 +108,7 @@ f=1; for (j=2; j<i; j++) { - if ((i/j)==floor(i/j)) + if (((double)i/j)==floor(i/j)) { f=0; break; @@ -116,7 +116,7 @@ } if (f) { - return (int)i; + return i; } } return 1; Index: contrib/top/layout.h =================================================================== --- contrib/top/layout.h (revision 215416) +++ contrib/top/layout.h (working copy) @@ -59,9 +59,9 @@ #define Y_BRKDN 1 #define X_CPUSTATES 0 #define Y_CPUSTATES 2 -#define X_KERNEL 8 +#define X_KERNEL 7 #define Y_KERNEL 3 -#define X_MEM 5 +#define X_MEM 7 #define Y_MEM 3 #define X_SWAP 6 #define Y_SWAP 4 Index: usr.bin/top/machine.c =================================================================== --- usr.bin/top/machine.c (revision 215416) +++ usr.bin/top/machine.c (working copy) @@ -617,7 +617,68 @@ fmt_nice(char *buf, int sz, struct kinfo_proc *pp) { - return snprintf(buf, sz, "%4d", PP(pp, nice) - NZERO); + const char *fifo, *kthread; + int rtpri, retval; + + fifo = PRI_NEED_RR(PP(pp, pri.pri_class)) ? "" : "F"; + kthread = (PP(pp, flag) & P_KTHREAD) ? "k" : ""; + + switch (PRI_BASE(PP(pp, pri.pri_class))) { + + case PRI_ITHD: + retval = snprintf(buf, sz, " -"); + break; + + case PRI_REALTIME: + /* + * XXX: the kernel doesn't tell us the original rtprio and + * doesn't really know what it was, so to recover it we + * must be more chummy with the implementation than the + * implementation is with itself. pri_user gives a + * constant "base" priority, but is only initialized + * properly for user threads. pri_native gives what the + * kernel calls the "base" priority, but it isn't constant + * since it is changed by priority propagation. pri_native + * also isn't properly initialized for all threads, but it + * is properly initialized for kernel realtime and idletime + * threads. Thus we use pri_user for the base priority of + * user threads (it is always correct) and pri_native for + * the base priority of kernel realtime and idletime threads + * (there is nothing better, and it is usually correct). + * + * The field width and thus the buffer are too small for + * values like "kr31F", but such values shouldn't occur, + * and if they do then the tailing "F" is not displayed. + */ + rtpri = ((PP(pp, flag) & P_KTHREAD) ? PP(pp, pri.pri_native) : + PP(pp, pri.pri_user)) - PRI_MIN_REALTIME; + retval = snprintf(buf, sz, "%*sr%d%s", (rtpri < 10) + 1, + kthread, rtpri, fifo); + break; + + case PRI_TIMESHARE: + if (PP(pp, flag) & P_KTHREAD) { + retval = snprintf(buf, sz, " -"); + break; + } + + retval = snprintf(buf, sz, "%4d", PP(pp, nice) - NZERO); + break; + + case PRI_IDLE: + /* XXX: as above. */ + rtpri = ((PP(pp, flag) & P_KTHREAD) ? PP(pp, pri.pri_native) : + PP(pp, pri.pri_user)) - PRI_MIN_IDLE; + retval = snprintf(buf, sz, "%*si%d%s", (rtpri < 10) + 1, + kthread, rtpri, fifo); + break; + + default: + retval = snprintf(buf, sz, "?"); + break; + } + + return(retval); } int @@ -903,7 +964,7 @@ { "SIZE", 5, 1, 0, fmt_size }, { "RES", 5, 1, 0, fmt_res }, { "STATE", 6, 0, 0, fmt_state }, - { "FLG", 3, 0, 84, fmt_flags }, + { "FLG", 3, 0, 75, fmt_flags }, { "C", 1, 0, 0, fmt_c }, { "TIME", 6, 1, 0, fmt_time }, { "CPU", 6, 1, 0, fmt_cpu }, @@ -1156,7 +1217,7 @@ static unsigned int swap_delay = 0; static long long swapavail = 0; static long long swapfree = 0; - static int bufspace = 0; + static long bufspace = 0; get_vm_sum(&sum); Index: usr.bin/top/Makefile =================================================================== --- usr.bin/top/Makefile (revision 215416) +++ usr.bin/top/Makefile (working copy) @@ -7,8 +7,9 @@ SRCS= commands.c display.c machine.c screen.c top.c \ username.c utils.c version.c color.c hash.c SRCS+= sigdesc.h config.h +WARNS?= 2 CFLAGS+= -DHAVE_GETOPT -DHAVE_STRERROR -DORDER -DTOPSIGWINCH -DHAS_SHOWTHREADS -CFLAGS+= -I${.CURDIR} -I${TOPDIR} -I. -Wall -g +CFLAGS+= -I${.CURDIR} -I${TOPDIR} -I. # # Uncomment the following line if you want users to be able to set -s @@ -47,7 +48,6 @@ ${.IMPSRC} > ${.TARGET} CLEANFILES+= config.h -CPU!= uname -m config.h: config.h.in @${ECHO} Making ${.TARGET} from ${.ALLSRC:T} sed \ @@ -55,7 +55,7 @@ -e 's/@DEFAULT_DELAY@/2/' \ -e 's/@HAVE_GETOPT_LONG@/1/' \ -e 's/@ENABLE_KILL@/1/' \ - -e "s/@CPU@/${CPU}/" \ + -e "s/@CPU@/${MACHINE}/" \ < ${.ALLSRC} > ${.TARGET} CLEANFILES+= top.1.local
_______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"