aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/top/machine.c
diff options
context:
space:
mode:
authorEitan Adler <eadler@FreeBSD.org>2018-06-22 09:21:01 +0000
committerEitan Adler <eadler@FreeBSD.org>2018-06-22 09:21:01 +0000
commit51c834c4902a0f0bc73906dd801544c9b9b6d92a (patch)
tree667e9baa7792afbf6faa53e064e00aa61a2b3ac9 /usr.bin/top/machine.c
parent520c8e1852dcf472b22af234984dd65704864896 (diff)
downloadsrc-51c834c4902a0f0bc73906dd801544c9b9b6d92a.tar.gz
src-51c834c4902a0f0bc73906dd801544c9b9b6d92a.zip
top(1): reimplement header formatting as sbuf
The current header formatting is a giant format string that changes global state during the format process. Make the following changes: - use sbuf to build up the header rather than use the above pseudo-dynamic one - Change name length to 10 - Reduce size of RES and SIZE by making humanize more aggressive - Restore a version number line to the copyright. This may be required by the copyright (and may not be; its unclear) This is also a pre-req to implementing TOPCOLOR from newer versions of top(1) Discussed with: allanjude, rpolka, danfe, rgrimes Differential Revision: https://reviews.freebsd.org/D15801
Notes
Notes: svn path=/head/; revision=335539
Diffstat (limited to 'usr.bin/top/machine.c')
-rw-r--r--usr.bin/top/machine.c119
1 files changed, 41 insertions, 78 deletions
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 3cb5c8a9ead3..d8c1d95cdb9f 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -22,6 +22,7 @@
#include <sys/priority.h>
#include <sys/proc.h>
#include <sys/resource.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/user.h>
@@ -49,18 +50,14 @@
#include "layout.h"
#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
-#define SMPUNAMELEN 13
-#define UPUNAMELEN 15
extern struct timeval timeout;
static int smpmode;
enum displaymodes displaymode;
-static int namelength = 8;
+static const int namelength = 10;
/* TOP_JID_LEN based on max of 999999 */
-#define TOP_JID_LEN 7
-#define TOP_SWAP_LEN 6
-static int jidlength;
-static int swaplength;
+#define TOP_JID_LEN 6
+#define TOP_SWAP_LEN 5
static int cmdlengthdelta;
/* get_process_info passes back a handle. This is what it looks like: */
@@ -92,23 +89,11 @@ static const char io_header[] =
static const char io_Proc_format[] =
"%5d%*s %-*.*s %6ld %6ld %6ld %6ld %6ld %6ld %6.2f%% %.*s";
-/* XXX: build up header instead of statically defining them.
- * This will also allow for a "format string" to be supplied
- * as an argument to top(1) instead of having predefined options */
-static const char smp_header_thr_and_pid[] =
- " %s%*s %-*.*s THR PRI NICE SIZE RES%*s STATE C TIME %7s COMMAND";
-static const char smp_header_id_only[] =
- " %s%*s %-*.*s PRI NICE SIZE RES%*s STATE C TIME %7s COMMAND";
static const char smp_Proc_format[] =
- "%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s %2d%7s %6.2f%% %.*s";
+ "%5d%*s %-*.*s %s%3d %4s%6s %5s%*.*s %-6.6s %2d%7s %6.2f%% %.*s";
-static char up_header_thr_and_pid[] =
- " %s%*s %-*.*s THR PRI NICE SIZE RES%*s STATE TIME %7s COMMAND";
-static char up_header_id_only[] =
- " %s%*s %-*.*s PRI NICE SIZE RES%*s STATE TIME %7s COMMAND";
static char up_Proc_format[] =
- "%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s%.0d%7s %6.2f%% %.*s";
-
+ "%5d%*s %-*.*s %s%3d %4s%6s %5s%*.*s %-6.6s%.0d%7s %6.2f%% %.*s";
/* process state names for the "STATE" column of the display */
/* the extra nulls in the string "run" are for adding a slash and
@@ -325,12 +310,6 @@ machine_init(struct statics *statics)
NULL, 0) == 0 && carc_en == 1)
carc_enabled = 1;
- namelength = MAXLOGNAME;
- if (smpmode && namelength > SMPUNAMELEN)
- namelength = SMPUNAMELEN;
- else if (namelength > UPUNAMELEN)
- namelength = UPUNAMELEN;
-
kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open");
if (kd == NULL)
return (-1);
@@ -407,63 +386,46 @@ machine_init(struct statics *statics)
return (0);
}
-const char *
+char *
format_header(const char *uname_field)
{
- static char Header[128];
- const char *prehead;
-
- if (ps.jail)
- jidlength = TOP_JID_LEN + 1; /* +1 for extra left space. */
- else
- jidlength = 0;
+ static struct sbuf* header = NULL;
- if (ps.swap)
- swaplength = TOP_SWAP_LEN + 1; /* +1 for extra left space */
- else
- swaplength = 0;
+ /* clean up from last time. */
+ if (header != NULL) {
+ sbuf_delete(header);
+ }
+ header = sbuf_new_auto();
switch (displaymode) {
- case DISP_CPU:
- /*
- * The logic of picking the right header is confusing, and
- * depends on too much. We should instead have a struct of
- * "header name", and "header format" which we build up.
- * This would also fix the duplicate of effort into up vs smp
- * mode.
- */
- if (smpmode) {
- prehead = ps.thread ?
- smp_header_id_only : smp_header_thr_and_pid;
- snprintf(Header, sizeof(Header), prehead,
- ps.thread_id ? " THR" : "PID",
- jidlength, ps.jail ? " JID" : "",
- namelength, namelength, uname_field,
- swaplength, ps.swap ? " SWAP" : "",
- ps.wcpu ? "WCPU" : "CPU");
- } else {
- prehead = ps.thread ?
- up_header_id_only : up_header_thr_and_pid;
- snprintf(Header, sizeof(Header), prehead,
- ps.thread_id ? " THR" : "PID",
- jidlength, ps.jail ? " JID" : "",
- namelength, namelength, uname_field,
- swaplength, ps.swap ? " SWAP" : "",
- ps.wcpu ? "WCPU" : "CPU");
- }
+ case DISP_CPU: {
+ sbuf_printf(header, " %s", ps.thread_id ? " THR" : "PID");
+ sbuf_printf(header, "%*s", ps.jail ? TOP_JID_LEN : 0,
+ ps.jail ? " JID" : "");
+ sbuf_printf(header, " %-*.*s", namelength, namelength, uname_field);
+ sbuf_cat(header, " THR PRI NICE SIZE RES");
+ sbuf_printf(header, "%*s", ps.swap ? TOP_SWAP_LEN : 0,
+ ps.swap ? " SWAP" : "");
+ sbuf_printf(header, "%s", smpmode ? " STATE C " : " STATE ");
+ sbuf_cat(header, "TIME");
+ sbuf_printf(header, " %7s", ps.wcpu ? "WCPU" : "CPU");
+ sbuf_cat(header, " COMMAND");
+ sbuf_finish(header);
break;
- case DISP_IO:
- prehead = io_header;
- snprintf(Header, sizeof(Header), prehead,
+ }
+ case DISP_IO: {
+ sbuf_printf(header, io_header,
ps.thread_id ? " THR" : "PID",
- jidlength, ps.jail ? " JID" : "",
+ ps.jail ? TOP_JID_LEN : 0, ps.jail ? " JID" : "",
namelength, namelength, uname_field);
break;
+ }
case DISP_MAX:
assert("displaymode must not be set to DISP_MAX");
}
- cmdlengthdelta = strlen(Header) - 7;
- return (Header);
+
+ cmdlengthdelta = sbuf_len(header) - 7;
+ return sbuf_data(header);
}
static int swappgsin = -1;
@@ -923,7 +885,7 @@ format_next_process(void* xhandle, char *(*get_userid)(int), int flags)
long p_tot, s_tot;
const char *proc_fmt;
char thr_buf[6];
- char jid_buf[TOP_JID_LEN + 1], swap_buf[TOP_SWAP_LEN + 1];
+ char jid_buf[TOP_JID_LEN], swap_buf[TOP_SWAP_LEN];
char *cmdbuf = NULL;
char **args;
const int cmdlen = 128;
@@ -1081,13 +1043,13 @@ format_next_process(void* xhandle, char *(*get_userid)(int), int flags)
jid_buf[0] = '\0';
else
snprintf(jid_buf, sizeof(jid_buf), "%*d",
- jidlength - 1, pp->ki_jid);
+ TOP_JID_LEN - 1, pp->ki_jid);
if (ps.swap == 0)
swap_buf[0] = '\0';
else
snprintf(swap_buf, sizeof(swap_buf), "%*s",
- swaplength - 1,
+ TOP_SWAP_LEN - 1,
format_k(pagetok(ki_swap(pp)))); /* XXX */
if (displaymode == DISP_IO) {
@@ -1109,7 +1071,7 @@ format_next_process(void* xhandle, char *(*get_userid)(int), int flags)
snprintf(fmt, sizeof(fmt), io_Proc_format,
pp->ki_pid,
- jidlength, jid_buf,
+ ps.jail ? TOP_JID_LEN : 0, jid_buf,
namelength, namelength, (*get_userid)(pp->ki_ruid),
rup->ru_nvcsw,
rup->ru_nivcsw,
@@ -1142,16 +1104,17 @@ format_next_process(void* xhandle, char *(*get_userid)(int), int flags)
snprintf(thr_buf, sizeof(thr_buf), "%*d ",
(int)(sizeof(thr_buf) - 2), pp->ki_numthreads);
+
snprintf(fmt, sizeof(fmt), proc_fmt,
(ps.thread_id) ? pp->ki_tid : pp->ki_pid,
- jidlength, jid_buf,
+ ps.jail ? TOP_JID_LEN : 0, jid_buf,
namelength, namelength, (*get_userid)(pp->ki_ruid),
thr_buf,
pp->ki_pri.pri_level - PZERO,
format_nice(pp),
format_k(PROCSIZE(pp)),
format_k(pagetok(pp->ki_rssize)),
- swaplength, swaplength, swap_buf,
+ ps.swap ? TOP_SWAP_LEN : 0, ps.swap ? TOP_SWAP_LEN : 0, swap_buf,
status,
cpu,
format_time(cputime),