Deleted Added
full compact
23c23
< * $FreeBSD: head/usr.bin/top/machine.c 131310 2004-06-30 04:19:23Z alfred $
---
> * $FreeBSD: head/usr.bin/top/machine.c 131402 2004-07-01 09:12:38Z alfred $
65a66
> enum displaymodes displaymode;
70a72
> int compare_pid(const void *a, const void *b);
89a92,96
> #define RU(pp) (&(pp)->ki_rusage)
> #define RUTOT(pp) \
> (RU(pp)->ru_inblock + RU(pp)->ru_oublock + RU(pp)->ru_majflt)
>
>
95a103,108
> static char io_header[] =
> " PID %-*.*s READ WRITE FAULT TOTAL COMMAND";
>
> #define io_Proc_format \
> "%5d %-*.*s %6d %6d %6d %6d %.*s"
>
178a192,195
> static struct kinfo_proc *previous_procs;
> static struct kinfo_proc **previous_pref;
> static int previous_proc_count = 0;
> static int previous_proc_count_max = 0;
265a283
> const char *prehead;
267c285,294
< snprintf(Header, sizeof(Header), smpmode ? smp_header : up_header,
---
> switch (displaymode) {
> case DISP_CPU:
> prehead = smpmode ? smp_header : up_header;
> break;
> case DISP_IO:
> prehead = io_header;
> break;
> }
>
> snprintf(Header, sizeof(Header), prehead,
389a417,453
> const struct kinfo_proc *
> get_old_proc(struct kinfo_proc *pp)
> {
> struct kinfo_proc **oldpp, *oldp;
>
> if (previous_proc_count == 0)
> return (NULL);
> oldpp = bsearch(&pp, previous_pref, previous_proc_count,
> sizeof(struct kinfo_proc *), compare_pid);
> if (oldpp == NULL)
> return (NULL);
> oldp = *oldpp;
> if (bcmp(&oldp->ki_start, &pp->ki_start, sizeof(pp->ki_start)) != 0)
> return (NULL);
> return (oldp);
> }
>
> long
> get_io_total(struct kinfo_proc *pp)
> {
> const struct kinfo_proc *oldp;
> static struct kinfo_proc dummy;
> long ret;
>
> oldp = get_old_proc(pp);
> if (oldp == NULL) {
> bzero(&dummy, sizeof(dummy));
> oldp = &dummy;
> }
>
> ret =
> (RU(pp)->ru_inblock - RU(oldp)->ru_inblock) +
> (RU(pp)->ru_oublock - RU(oldp)->ru_oublock) +
> (RU(pp)->ru_majflt - RU(oldp)->ru_majflt);
> return (ret);
> }
>
411a476,498
> /*
> * Save the previous process info.
> */
> if (previous_proc_count_max < nproc) {
> free(previous_procs);
> previous_procs = malloc(nproc * sizeof(struct kinfo_proc));
> free(previous_pref);
> previous_pref = malloc(nproc * sizeof(struct kinfo_proc *));
> if (previous_procs == NULL || previous_pref == NULL) {
> (void) fprintf(stderr, "top: Out of memory.\n");
> quit(23);
> }
> previous_proc_count_max = nproc;
> }
> if (nproc) {
> for (i = 0; i < nproc; i++)
> previous_pref[i] = &previous_procs[i];
> bcopy(pbase, previous_procs, nproc * sizeof(struct kinfo_proc));
> qsort(previous_pref, nproc,
> sizeof(struct kinfo_proc *), compare_pid);
> }
> previous_proc_count = nproc;
>
450,451c537,539
< (show_idle || (pp->ki_pctcpu != 0) ||
< (pp->ki_stat == SRUN)) &&
---
> (displaymode == DISP_CPU &&
> (show_idle || (pp->ki_pctcpu != 0) || pp->ki_stat == SRUN)) ||
> (show_idle || (displaymode == DISP_IO && get_io_total(pp))) &&
496a585
> const struct kinfo_proc *oldp;
501a591
> struct rusage ru, *rup;
563a654,677
> if (displaymode == DISP_IO) {
> oldp = get_old_proc(pp);
> if (oldp != NULL) {
> ru.ru_inblock = RU(pp)->ru_inblock - RU(oldp)->ru_inblock;
> ru.ru_oublock = RU(pp)->ru_oublock - RU(oldp)->ru_oublock;
> ru.ru_majflt = RU(pp)->ru_majflt - RU(oldp)->ru_majflt;
> rup = &ru;
> } else {
> rup = RU(pp);
> }
>
> sprintf(fmt, io_Proc_format,
> pp->ki_pid,
> namelength, namelength,
> (*get_userid)(pp->ki_ruid),
> (int)rup->ru_inblock,
> (int)rup->ru_oublock,
> (int)rup->ru_majflt,
> (int)(rup->ru_inblock + rup->ru_oublock + rup->ru_majflt),
> screen_width > cmdlengthdelta ?
> screen_width - cmdlengthdelta : 0,
> printable(pp->ki_comm));
> return (fmt);
> }
619a734,746
> int
> compare_pid(p1, p2)
> const void *p1, *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();
>
> return ((*pp1)->ki_pid - (*pp2)->ki_pid);
> }
>
816a944,953
> int
> io_compare(pp1, pp2)
> struct kinfo_proc **pp1, **pp2;
> {
> long t1, t2;
>
> t1 = get_io_total(*pp1);
> t2 = get_io_total(*pp2);
> return (t2 - t1);
> }