top(1): top warnings and cleanup

- Add const where helpful
- add missing 'static' for file-local functions
- use nitems where possible
- convert manual abort() to assert
- use strndup instead of homegrown version

Tested with clang, gcc7, and gcc9
This commit is contained in:
Eitan Adler 2018-06-03 22:42:54 +00:00
parent aac30b753f
commit 9f8096e339
6 changed files with 93 additions and 112 deletions

View File

@ -66,12 +66,12 @@ static int display_width = MAX_COLS;
/* buffer of proc information lines for display updating */
static char *screenbuf = NULL;
static char **procstate_names;
static char **cpustate_names;
static char **memory_names;
static char **arc_names;
static char **carc_names;
static char **swap_names;
static const char * const *procstate_names;
static const char * const *cpustate_names;
static const char * const *memory_names;
static const char * const *arc_names;
static const char * const *carc_names;
static const char * const *swap_names;
static int num_procstates;
static int num_cpustates;
@ -735,8 +735,8 @@ static int header_length;
* allocated area with the trimmed header.
*/
char *
trim_header(char *text)
const char *
trim_header(const char *text)
{
char *s;
int width;
@ -745,11 +745,9 @@ trim_header(char *text)
width = display_width;
header_length = strlen(text);
if (header_length >= width) {
s = calloc((width + 1), sizeof(char));
s = strndup(text, width);
if (s == NULL)
return (NULL);
strncpy(s, text, width);
s[width] = '\0';
}
return (s);
}
@ -761,9 +759,9 @@ trim_header(char *text)
*/
void
i_header(char *text)
i_header(const char *text)
{
char *s;
const char *s;
s = trim_header(text);
if (s != NULL)
@ -783,7 +781,7 @@ i_header(char *text)
}
void
u_header(char *text __unused)
u_header(const char *text __unused)
{
if (header_status == ERASE)

View File

@ -9,7 +9,7 @@
int display_updatecpus(struct statics *statics);
void clear_message(void);
int display_resize(void);
void i_header(char *text);
void i_header(const char *text);
char *printable(char *string);
void display_header(int t);
int display_init(struct statics *statics);
@ -26,12 +26,12 @@ void i_timeofday(time_t *tod);
void i_uptime(struct timeval *bt, time_t *tod);
void new_message(int type, const char *msgfmt, ...);
int readline(char *buffer, int size, int numeric);
char *trim_header(char *text);
const char *trim_header(const char *text);
void u_arc(int *stats);
void u_carc(int *stats);
void u_cpustates(int *states);
void u_endscreen(int hi);
void u_header(char *text);
void u_header(const char *text);
void u_loadave(int mpid, double *avenrun);
void u_memory(int *stats);
void u_message(void);

View File

@ -18,6 +18,7 @@
#include <sys/param.h>
#include <sys/errno.h>
#include <sys/file.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/resource.h>
#include <sys/rtprio.h>
@ -92,27 +93,27 @@ struct handle {
* These definitions control the format of the per-process area
*/
static char io_header[] =
static const char io_header[] =
" PID%*s %-*.*s VCSW IVCSW READ WRITE FAULT TOTAL PERCENT COMMAND";
#define io_Proc_format \
"%5d%*s %-*.*s %6ld %6ld %6ld %6ld %6ld %6ld %6.2f%% %.*s"
static const char io_Proc_format[] =
"%5d%*s %-*.*s %6ld %6ld %6ld %6ld %6ld %6ld %6.2f%% %.*s";
static char smp_header_thr_and_pid[] =
static const char smp_header_thr_and_pid[] =
" PID%*s %-*.*s THR PRI NICE SIZE RES%*s STATE C TIME %7s COMMAND";
static char smp_header_tid_only[] =
static const char smp_header_tid_only[] =
" THR%*s %-*.*s " "PRI NICE SIZE RES%*s STATE C TIME %7s COMMAND";
#define smp_Proc_format \
"%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s %2d%7s %6.2f%% %.*s"
static const char smp_Proc_format[] =
"%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s %2d%7s %6.2f%% %.*s";
static char up_header_thr_and_pid[] =
" PID%*s %-*.*s THR PRI NICE SIZE RES%*s STATE TIME %7s COMMAND";
static char up_header_tid_only[] =
" THR%*s %-*.*s " "PRI NICE SIZE RES%*s STATE TIME %7s COMMAND";
#define up_Proc_format \
"%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s%.0d%7s %6.2f%% %.*s"
static char up_Proc_format[] =
"%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s%.0d%7s %6.2f%% %.*s";
/* process state names for the "STATE" column of the display */
@ -147,7 +148,7 @@ static long cp_diff[CPUSTATES];
/* these are for detailing the process states */
static int process_states[8];
static char *procstatenames[] = {
static const char *procstatenames[] = {
"", " starting, ", " running, ", " sleeping, ", " stopped, ",
" zombie, ", " waiting, ", " lock, ",
NULL
@ -156,32 +157,32 @@ static char *procstatenames[] = {
/* these are for detailing the cpu states */
static int cpu_states[CPUSTATES];
static char *cpustatenames[] = {
static const char *cpustatenames[] = {
"user", "nice", "system", "interrupt", "idle", NULL
};
/* these are for detailing the memory statistics */
static int memory_stats[7];
static char *memorynames[] = {
static const char *memorynames[] = {
"K Active, ", "K Inact, ", "K Laundry, ", "K Wired, ", "K Buf, ",
"K Free", NULL
};
static int arc_stats[7];
static char *arcnames[] = {
static const char *arcnames[] = {
"K Total, ", "K MFU, ", "K MRU, ", "K Anon, ", "K Header, ", "K Other",
NULL
};
static int carc_stats[4];
static char *carcnames[] = {
static const char *carcnames[] = {
"K Compressed, ", "K Uncompressed, ", ":1 Ratio, ",
NULL
};
static int swap_stats[7];
static char *swapnames[] = {
static const char *swapnames[] = {
"K Total, ", "K Used, ", "K Free, ", "% Inuse, ", "K In, ", "K Out",
NULL
};
@ -412,8 +413,8 @@ machine_init(struct statics *statics)
return (0);
}
char *
format_header(char *uname_field)
const char *
format_header(const char *uname_field)
{
static char Header[128];
const char *prehead;
@ -660,7 +661,7 @@ get_old_proc(struct kinfo_proc *pp)
* store the values individually in the pointers passed in.
*/
static long
get_io_stats(struct kinfo_proc *pp, long *inp, long *oup, long *flp,
get_io_stats(const struct kinfo_proc *pp, long *inp, long *oup, long *flp,
long *vcsw, long *ivcsw)
{
const struct kinfo_proc *oldp;
@ -734,7 +735,7 @@ proc_used_cpu(struct kinfo_proc *pp)
* Return the total number of block in/out and faults by a process.
*/
static long
get_io_total(struct kinfo_proc *pp)
get_io_total(const struct kinfo_proc *pp)
{
long dummy;
@ -935,7 +936,7 @@ format_next_process(caddr_t xhandle, char *(*get_userid)(int), int flags)
char thr_buf[6];
char jid_buf[TOP_JID_LEN + 1], swap_buf[TOP_SWAP_LEN + 1];
char *cmdbuf = NULL;
char **args;
const char * const *args;
const int cmdlen = 128;
/* find and remember the next proc structure */
@ -988,10 +989,11 @@ format_next_process(caddr_t xhandle, char *(*get_userid)(int), int flags)
break;
default:
if (state < sizeof(state_abbrev) / sizeof(*state_abbrev))
if (state < nitems(state_abbrev)) {
sprintf(status, "%.6s", state_abbrev[state]);
else
} else {
sprintf(status, "?%5zu", state);
}
break;
}
@ -1254,8 +1256,7 @@ compare_pid(const void *p1, const void *p2)
const struct kinfo_proc * const *pp1 = p1;
const struct kinfo_proc * const *pp2 = p2;
if ((*pp2)->ki_pid < 0 || (*pp1)->ki_pid < 0)
abort();
assert((*pp2)->ki_pid >= 0 && (*pp1)->ki_pid >= 0);
return ((*pp1)->ki_pid - (*pp2)->ki_pid);
}
@ -1266,8 +1267,7 @@ compare_tid(const void *p1, const void *p2)
const struct kinfo_proc * const *pp1 = p1;
const struct kinfo_proc * const *pp2 = p2;
if ((*pp2)->ki_tid < 0 || (*pp1)->ki_tid < 0)
abort();
assert((*pp2)->ki_tid >= 0 && (*pp1)->ki_tid >= 0);
return ((*pp1)->ki_tid - (*pp2)->ki_tid);
}
@ -1371,45 +1371,9 @@ compare_cpu(const void *arg1, const void *arg2)
return (0);
}
/* "cpu" compare routines */
static int compare_size(const void *arg1, const void *arg2);
static int compare_res(const void *arg1, const void *arg2);
static int compare_time(const void *arg1, const void *arg2);
static int compare_prio(const void *arg1, const void *arg2);
static int compare_threads(const void *arg1, const void *arg2);
/*
* "io" compare routines. Context switches aren't i/o, but are displayed
* on the "io" display.
*/
static int compare_iototal(const void *arg1, const void *arg2);
static int compare_ioread(const void *arg1, const void *arg2);
static int compare_iowrite(const void *arg1, const void *arg2);
static int compare_iofault(const void *arg1, const void *arg2);
static int compare_vcsw(const void *arg1, const void *arg2);
static int compare_ivcsw(const void *arg1, const void *arg2);
int (*compares[])(const void *arg1, const void *arg2) = {
compare_cpu,
compare_size,
compare_res,
compare_time,
compare_prio,
compare_threads,
compare_iototal,
compare_ioread,
compare_iowrite,
compare_iofault,
compare_vcsw,
compare_ivcsw,
compare_jid,
compare_swap,
NULL
};
/* compare_size - the comparison function for sorting by total memory usage */
int
static int
compare_size(const void *arg1, const void *arg2)
{
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
@ -1427,7 +1391,7 @@ compare_size(const void *arg1, const void *arg2)
/* compare_res - the comparison function for sorting by resident set size */
int
static int
compare_res(const void *arg1, const void *arg2)
{
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
@ -1445,7 +1409,7 @@ compare_res(const void *arg1, const void *arg2)
/* compare_time - the comparison function for sorting by total cpu time */
int
static int
compare_time(const void *arg1, const void *arg2)
{
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
@ -1463,7 +1427,7 @@ compare_time(const void *arg1, const void *arg2)
/* compare_prio - the comparison function for sorting by priority */
int
static int
compare_prio(const void *arg1, const void *arg2)
{
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
@ -1519,8 +1483,8 @@ compare_jid(const void *arg1, const void *arg2)
static int
compare_swap(const void *arg1, const void *arg2)
{
const struct kinfo_proc *p1 = *(const struct kinfo_proc **)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
ORDERKEY_SWAP(p1, p2);
ORDERKEY_PCTCPU(p1, p2);
@ -1535,11 +1499,11 @@ compare_swap(const void *arg1, const void *arg2)
/* assorted comparison functions for sorting by i/o */
int
static int
compare_iototal(const void *arg1, const void *arg2)
{
struct kinfo_proc * const p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc * const p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc * const p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc * const p2 = *(const struct kinfo_proc * const *)arg2;
return (get_io_total(p2) - get_io_total(p1));
}
@ -1547,8 +1511,8 @@ compare_iototal(const void *arg1, const void *arg2)
static int
compare_ioread(const void *arg1, const void *arg2)
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
long dummy, inp1, inp2;
(void) get_io_stats(p1, &inp1, &dummy, &dummy, &dummy, &dummy);
@ -1560,8 +1524,8 @@ compare_ioread(const void *arg1, const void *arg2)
static int
compare_iowrite(const void *arg1, const void *arg2)
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
long dummy, oup1, oup2;
(void) get_io_stats(p1, &dummy, &oup1, &dummy, &dummy, &dummy);
@ -1573,8 +1537,8 @@ compare_iowrite(const void *arg1, const void *arg2)
static int
compare_iofault(const void *arg1, const void *arg2)
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
long dummy, flp1, flp2;
(void) get_io_stats(p1, &dummy, &dummy, &flp1, &dummy, &dummy);
@ -1586,8 +1550,8 @@ compare_iofault(const void *arg1, const void *arg2)
static int
compare_vcsw(const void *arg1, const void *arg2)
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
long dummy, flp1, flp2;
(void) get_io_stats(p1, &dummy, &dummy, &dummy, &flp1, &dummy);
@ -1596,11 +1560,11 @@ compare_vcsw(const void *arg1, const void *arg2)
return (flp2 - flp1);
}
int
static int
compare_ivcsw(const void *arg1, const void *arg2)
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
const struct kinfo_proc *p1 = *(const struct kinfo_proc * const *)arg1;
const struct kinfo_proc *p2 = *(const struct kinfo_proc * const *)arg2;
long dummy, flp1, flp2;
(void) get_io_stats(p1, &dummy, &dummy, &dummy, &dummy, &flp1);
@ -1609,6 +1573,25 @@ compare_ivcsw(const void *arg1, const void *arg2)
return (flp2 - flp1);
}
int (*compares[])(const void *arg1, const void *arg2) = {
compare_cpu,
compare_size,
compare_res,
compare_time,
compare_prio,
compare_threads,
compare_iototal,
compare_ioread,
compare_iowrite,
compare_iofault,
compare_vcsw,
compare_ivcsw,
compare_jid,
compare_swap,
NULL
};
/*
* proc_owner(pid) - returns the uid that owns process "pid", or -1 if
* the process does not exist.

View File

@ -17,13 +17,13 @@
*/
struct statics
{
char **procstate_names;
char **cpustate_names;
char **memory_names;
char **arc_names;
char **carc_names;
char **swap_names;
char **order_names;
const char * const *procstate_names;
const char * const *cpustate_names;
const char * const *memory_names;
const char * const *arc_names;
const char * const *carc_names;
const char * const *swap_names;
const char * const *order_names;
int ncpus;
};
@ -75,7 +75,7 @@ struct process_select
/* routines defined by the machine dependent module */
char *format_header(char *uname_field);
const char *format_header(const char *uname_field);
char *format_next_process(caddr_t handle, char *(*get_userid)(int),
int flags);
void toggle_pcpustats(void);

View File

@ -78,7 +78,7 @@ static void (*d_arc)(int *stats) = i_arc;
static void (*d_carc)(int *stats) = i_carc;
static void (*d_swap)(int *stats) = i_swap;
static void (*d_message)(void) = i_message;
static void (*d_header)(char *text) = i_header;
static void (*d_header)(const char *text) = i_header;
static void (*d_process)(int line, char *thisline) = i_process;
static void reset_display(void);
@ -207,8 +207,8 @@ main(int argc, char *argv[])
int sel_ret = 0;
time_t curr_time;
char *(*get_userid)(int) = username;
char *uname_field = "USERNAME";
char *header_text;
const char *uname_field = "USERNAME";
const char *header_text;
char *env_top;
char **preset_argv;
int preset_argc = 0;
@ -228,7 +228,7 @@ main(int argc, char *argv[])
fd_set readfds;
char old_system = false;
static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJwop";
static const char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJwop";
/* these defines enumerate the "strchr"s of the commands in command_chars */
#define CMD_redraw 0
#define CMD_update 1

View File

@ -89,7 +89,7 @@ char *itoa(unsigned int val)
}
/*
* (val) - like itoa, except the number is right justified in a 7
* itoa7(val) - like itoa, except the number is right justified in a 7
* character field. This code is a duplication of itoa instead of
* a front end to a more general routine for efficiency.
*/