On Fri, Jun 26, 2020 at 04:48:53PM +0200, Klemens Nanni wrote:
> The internal handle used to pass process information is a needless
> abstraction, after previously removing an unused member, it now only has
> one member pointing to a pointer to a process struct, i.e. a simple list
> of processes.
>
> Remove the abstraction layer and (re)use the existing list of
> (pointers to) kinfo_proc structs. The diff is straight forward and I
> tested it on amd64 and sparc64.
>
> With this, scrolling does not even deserve its own helper, we can merely
> point at the process to format with an offset in the list now.
Updated diff that uses a `procp' variable in the for loop and does not
rename format_next_process() (separate diff).
Feedback? OK?
Index: commands.c
===================================================================
RCS file: /cvs/src/usr.bin/top/commands.c,v
retrieving revision 1.33
diff -u -p -r1.33 commands.c
--- commands.c 8 Oct 2019 07:26:59 -0000 1.33
+++ commands.c 3 Jul 2020 10:57:15 -0000
@@ -36,6 +36,7 @@
*/
#include <sys/types.h>
+#include <sys/sysctl.h>
#include <stdio.h>
#include <err.h>
#include <ctype.h>
Index: display.c
===================================================================
RCS file: /cvs/src/usr.bin/top/display.c,v
retrieving revision 1.62
diff -u -p -r1.62 display.c
--- display.c 27 Jun 2020 01:09:57 -0000 1.62
+++ display.c 3 Jul 2020 10:57:15 -0000
@@ -46,6 +46,7 @@
*/
#include <sys/types.h>
+#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/sched.h>
#include <curses.h>
Index: machine.c
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.106
diff -u -p -r1.106 machine.c
--- machine.c 26 Jun 2020 20:55:55 -0000 1.106
+++ machine.c 3 Jul 2020 11:28:51 -0000
@@ -60,12 +60,6 @@ static char *format_comm(struct kinfo_pr
static int cmd_matches(struct kinfo_proc *, char *);
static char **get_proc_args(struct kinfo_proc *);
-/* get_process_info passes back a handle. This is what it looks like: */
-
-struct handle {
- struct kinfo_proc **next_proc; /* points to next valid proc pointer */
-};
-
/* what we consider to be process size: */
#define PROCSIZE(pp) ((pp)->p_vm_tsize + (pp)->p_vm_dsize + (pp)->p_vm_ssize)
@@ -127,7 +121,7 @@ static int nproc;
static int onproc = -1;
static int pref_len;
static struct kinfo_proc *pbase;
-static struct kinfo_proc **pref;
+struct kinfo_proc **pref;
/* these are for getting the memory statistics */
static int pageshift; /* log base 2 of the pagesize */
@@ -308,8 +302,6 @@ get_system_info(struct system_info *si)
si->last_pid = -1;
}
-static struct handle handle;
-
struct kinfo_proc *
getprocs(int op, int arg, int *cnt)
{
@@ -408,7 +400,7 @@ cmd_matches(struct kinfo_proc *proc, cha
return 0;
}
-struct handle *
+void
get_process_info(struct system_info *si, struct process_select *sel,
int (*compare) (const void *, const void *))
{
@@ -484,10 +476,6 @@ get_process_info(struct system_info *si,
/* remember active and total counts */
si->p_total = total_procs;
si->p_active = pref_len = active_procs;
-
- /* pass back a handle */
- handle.next_proc = pref;
- return &handle;
}
char fmt[MAX_COLS]; /* static area where result is built */
@@ -531,24 +519,14 @@ format_comm(struct kinfo_proc *kp)
return (buf);
}
-void
-skip_processes(struct handle *hndl, int n)
-{
- hndl->next_proc += n;
-}
-
char *
-format_next_process(struct handle *hndl, const char *(*get_userid)(uid_t, int),
+format_next_process(struct kinfo_proc *pp, const char *(*get_userid)(uid_t,
int),
pid_t *pid)
{
char *p_wait;
- struct kinfo_proc *pp;
int cputime;
double pct;
char buf[16];
-
- /* find and remember the next proc structure */
- pp = *(hndl->next_proc++);
cputime = pp->p_rtime_sec + ((pp->p_rtime_usec + 500000) / 1000000);
Index: machine.h
===================================================================
RCS file: /cvs/src/usr.bin/top/machine.h,v
retrieving revision 1.29
diff -u -p -r1.29 machine.h
--- machine.h 25 Jun 2020 20:38:41 -0000 1.29
+++ machine.h 3 Jul 2020 11:28:54 -0000
@@ -87,11 +87,10 @@ extern int display_init(struct stat
extern int machine_init(struct statics *);
extern char *format_header(char *);
extern void get_system_info(struct system_info *);
-extern struct handle
-*get_process_info(struct system_info *, struct process_select *,
+extern void
+get_process_info(struct system_info *, struct process_select *,
int (*) (const void *, const void *));
-extern void skip_processes(struct handle *, int);
-extern char *format_next_process(struct handle *,
+extern char *format_next_process(struct kinfo_proc *,
const char *(*)(uid_t, int), pid_t *);
extern uid_t proc_owner(pid_t);
Index: top.c
===================================================================
RCS file: /cvs/src/usr.bin/top/top.c,v
retrieving revision 1.103
diff -u -p -r1.103 top.c
--- top.c 25 Jun 2020 20:38:41 -0000 1.103
+++ top.c 3 Jul 2020 11:28:54 -0000
@@ -29,6 +29,7 @@
*/
#include <sys/types.h>
+#include <sys/sysctl.h>
#include <curses.h>
#include <err.h>
#include <errno.h>
@@ -70,6 +71,8 @@ int rundisplay(void);
static int max_topn; /* maximum displayable processes */
static int skip; /* how many processes to skip (scroll) */
+extern struct kinfo_proc **pref;
+
extern int ncpu;
extern int ncpuonline;
@@ -341,7 +344,7 @@ main(int argc, char *argv[])
int preset_argc = 0, ac = argc, active_procs, i, ncpuonline_now;
sigset_t mask, oldmask;
time_t curr_time;
- struct handle *processes;
+ struct kinfo_proc *procp;
/* set the buffer for stdout */
#ifdef DEBUG
@@ -511,8 +514,7 @@ restart:
}
/* get the current set of processes */
- processes = get_process_info(&system_info, &ps,
- proc_compares[order_index]);
+ get_process_info(&system_info, &ps, proc_compares[order_index]);
/* display the load averages */
i_loadave(system_info.last_pid, system_info.load_avg);
@@ -569,13 +571,12 @@ restart:
*/
if (skip + active_procs > system_info.p_active)
skip = system_info.p_active - active_procs;
- skip_processes(processes, skip);
- /* now show the top "n" processes. */
for (i = 0; i < active_procs; i++) {
pid_t pid;
char * s;
- s = format_next_process(processes,
+ procp = (pref + skip)[i],
+ s = format_next_process(procp,
ps.threads ? NULL : get_userid, &pid);
i_process(i, s, pid == hlpid);
}