home *** CD-ROM | disk | FTP | other *** search
- From: wht@n4hgf.uucp (Warren Tucker)
- Newsgroups: alt.sources
- Subject: u386mon, UNIX/386 system monitor, part 02/02
- Message-ID: <104@n4hgf.uucp>
- Date: 20 Jun 90 01:57:06 GMT
-
- Archive-name: u386mon008/part02
- Submitted-by: wht@n4hgf
-
- #!/bin/sh
- # This is part 02 of u386mon.x0.08
- if touch 2>&1 | fgrep 'mmdd' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= u386mon.c ==============
- echo "x - extracting u386mon.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > u386mon.c &&
- Xchar *revision = "x0.08";
- X/*+-------------------------------------------------------------------------
- X u386mon.c - UNIX 386 system monitor
- X
- X Defined functions:
- X calc_cpu_avg(cpu_ticks)
- X calc_wait_avg(wait_ticks)
- X clear_area(win,y,x,len)
- X clear_area_char(win,y,x,len,fillchar)
- X draw_cpuscale_literals(win,y,x)
- X draw_per_sec_literals(win,y,x)
- X draw_waitscale_literals(win,y,x)
- X extra_info_stuff()
- X extra_static_stuff()
- X get_cpu_avg(cpu_ticks,period)
- X get_elapsed_time(elapsed_seconds)
- X get_wait_avg(wait_ticks,period)
- X leave(exit_code)
- X leave_text(text,exit_code)
- X main(argc,argv,envp)
- X mkpanel(rows,cols,tly,tlx)
- X pflush()
- X update_cpuscale(win,y,x,width,per_state)
- X update_waitscale(win,y,x,width,per_state,total_ticks)
- X wperror(win,desc)
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:06-15-1990-18:32-wht@n4hgf-creation */
- X
- X#define M_TERMINFO
- X
- X#include <curses.h>
- X#include <panel.h>
- X#include <signal.h>
- X#include <string.h>
- X#include <fcntl.h>
- X#include <nlist.h>
- X#include <errno.h>
- X#include <time.h>
- X#include <sys/types.h>
- X#include <sys/utsname.h>
- X#include <sys/stat.h>
- X#include <sys/ascii.h>
- X#undef NGROUPS_MAX
- X#undef NULL
- X#include <sys/param.h>
- X#include <sys/bootinfo.h>
- X#include <sys/tuneable.h>
- X#include <sys/sysinfo.h>
- X#include <sys/sysmacros.h>
- X#include <sys/immu.h>
- X#include <sys/region.h>
- X#include <sys/proc.h>
- X#include <sys/var.h>
- X#include "nlsym.h"
- X#include "libkmem.h"
- X#include "libnlsym.h"
- X#include "u386mon.h"
- X
- X/* screen panel
- X00000000001111111111222222222233333333334444444444555555555566666666667777777777
- X01234567890123456789012345678901234567890123456789012345678901234567890123456789
- X u386mon xxx.xxx mm/dd/yy hh:mm:ss
- X
- X---- CPU --- tot usr ker brk ---------------------------------------------------
- X Instant % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X---- Wait -- tot io swp pio ---------------------------------------------------
- X Instant % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X
- X*/
- X
- X#define PSCR_TLY 1
- X#define PSCR_LINES 25
- X#define BOTT_TLY (PSCR_TLY + PSCR_LINES)
- X#define MSGLINE (LINES - 2)
- X#define CMD_TLY (LINES - 1)
- X
- X#define CPUSCALE_TLY 1
- X#define CPUSCALE_SX 13
- X#define CPUSCALE_WIDTH 50
- X
- X#define WAITSCALE_TLY 5
- X#define WAITSCALE_SX 13
- X#define WAITSCALE_WIDTH 50
- X
- X#define PER_SEC_TLY 9
- X
- X#define LVMSG_Y (LINES - 2)
- X#define LVMSG_X 0
- X
- Xstruct sysinfo sysinfo;
- Xstruct sysinfo sysinfo_last;
- X#define sysidelta(x) (sysinfo.x - sysinfo_last.x)
- X
- Xstruct minfo minfo;
- Xstruct minfo minfo_last;
- X#define midelta(x) (minfo.x - minfo_last.x)
- X
- Xstruct bootinfo bootinfo;
- Xstruct tune tune;
- Xstruct utsname utsname;
- Xstruct var v;
- Xtime_t now;
- Xtime_t then;
- Xint hz;
- Xint nproc;
- Xint nswap;
- Xint maxmem;
- Xint freemem;
- X
- X#define CPU_AVG_MAX 10
- Xint cpu_avg_init = 0;
- Xtime_t *cpu_avg[CPU_AVG_MAX];
- Xtime_t cpu_ticks[5];
- X
- X#define WAIT_AVG_MAX 10
- Xint wait_avg_init = 0;
- Xtime_t *wait_avg[WAIT_AVG_MAX];
- Xtime_t wait_ticks[5];
- X
- Xchar *cpu_states[] =
- X{
- X "idle",
- X "user",
- X "kernel",
- X "wait",
- X "sxbrk"
- X};
- X
- X/*+-------------------------------------------------------------------------
- X pflush() - do update_panels() and doupdate()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xpflush()
- X{
- X update_panels();
- X curs_set(0);
- X doupdate();
- X curs_set(1);
- X} /* end of pflush */
- X
- X/*+-------------------------------------------------------------------------
- X clear_area_char(win,y,x,len,fillchar)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xclear_area_char(win,y,x,len,fillchar)
- XWINDOW *win;
- Xint y;
- Xint x;
- Xint len;
- Xu_char fillchar;
- X{
- X wmove(win,y,x);
- X while(len-- > 0)
- X waddch(win,(chtype)fillchar);
- X wmove(win,y,x);
- X
- X} /* end of clear_area_char */
- X
- X/*+-------------------------------------------------------------------------
- X clear_area(win,y,x,len)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xclear_area(win,y,x,len)
- XWINDOW *win;
- Xint y;
- Xint x;
- Xint len;
- X{
- X clear_area_char(win,y,x,len,' ');
- X} /* end of clear_area_char */
- X
- X/*+-------------------------------------------------------------------------
- X leave(exit_code)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xleave(exit_code)
- Xint exit_code;
- X{
- X pflush();
- X endwin();
- X exit(exit_code);
- X} /* end of leave */
- X
- X/*+-------------------------------------------------------------------------
- X leave_text(text,exit_code)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xleave_text(text,exit_code)
- Xchar *text;
- Xint exit_code;
- X{
- X wmove(stdscr,LVMSG_Y,LVMSG_X);
- X wclrtoeol(stdscr);
- X waddstr(stdscr,text);
- X leave(exit_code);
- X} /* end of leave */
- X
- X/*+-------------------------------------------------------------------------
- X wperror(win,desc)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xwperror(win,desc)
- XWINDOW *win;
- Xchar *desc;
- X{
- Xextern int errno;
- Xextern int sys_nerr;
- Xextern char *sys_errlist[];
- X
- X waddstr(win,desc);
- X waddstr(win,": ");
- X if(errno < sys_nerr)
- X waddstr(win,sys_errlist[errno]);
- X else
- X wprintw(win,"error %u",errno);
- X
- X} /* end of wperror */
- X
- X/*+-------------------------------------------------------------------------
- X mkpanel(rows,cols,tly,tlx)
- X--------------------------------------------------------------------------*/
- XPANEL *
- Xmkpanel(rows,cols,tly,tlx)
- Xint rows;
- Xint cols;
- Xint tly;
- Xint tlx;
- X{
- XWINDOW *win = newwin(rows,cols,tly,tlx);
- XPANEL *pan;
- X
- X if(!win)
- X return((PANEL *)0);
- X if(pan = new_panel(win))
- X return(pan);
- X delwin(win);
- X return((PANEL *)0);
- X} /* end of mkpanel */
- X
- X/*+-----------------------------------------------------------------------
- X char *get_elapsed_time(elapsed_seconds) - "ddd+hh:mm:ss" returned
- X static string address is returned
- X------------------------------------------------------------------------*/
- Xchar *
- Xget_elapsed_time(elapsed_seconds)
- Xtime_t elapsed_seconds;
- X{
- Xstatic char elapsed_time_str[32];
- Xtime_t dd,hh,mm,ss;
- X
- X dd = 0;
- X hh = elapsed_seconds / 3600;
- X if(hh > 24)
- X {
- X dd = hh / 24;
- X elapsed_seconds -= dd * 3600 * 24;
- X hh %= 24;
- X }
- X elapsed_seconds -= hh * 3600;
- X mm = elapsed_seconds / 60L;
- X elapsed_seconds -= mm * 60L;
- X ss = elapsed_seconds;
- X
- X if(dd)
- X sprintf(elapsed_time_str,"%3ld+%02ld:%02ld:%02ld",dd,hh,mm,ss);
- X else
- X sprintf(elapsed_time_str," %2ld:%02ld:%02ld",hh,mm,ss);
- X return(elapsed_time_str);
- X} /* end of get_elapsed_time */
- X
- X/*+-------------------------------------------------------------------------
- X draw_cpuscale_literals(win)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xdraw_cpuscale_literals(win,y,x)
- XWINDOW *win;
- Xint y;
- Xint x;
- X{
- Xint x2 = x;
- X
- X wmove(win,y,x);
- X use_cp(cpBANNER);
- X waddstr(win,"---- CPU --- tot usr ker brk ");
- X getyx(win,y,x2);
- X while(x2 < COLS)
- X waddch(win,(chtype)'-'),x2++;
- X use_cp(cpLIT);
- X wmove(win,y + 1,x);
- X waddstr(win," Instant %");
- X wmove(win,y + 2,x);
- X waddstr(win," 5 Sec Avg %");
- X wmove(win,y + 3,x);
- X waddstr(win,"10 Sec Avg %");
- X
- X} /* end of draw_cpuscale_literals */
- X
- X/*+-------------------------------------------------------------------------
- X update_cpuscale(win,y,width,per_state)
- X
- X000000000011111111112222222222333333333344444444445555555555666666
- X012345678901234567890123456789012345678901234567890123456789012345
- Xtot usr ker misc
- X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X--------------------------------------------------------------------------*/
- X#define _CPUSCALE_TX 0
- X#define _CPUSCALE_UX 4
- X#define _CPUSCALE_KX 8
- X#define _CPUSCALE_BX 12
- X#define _CPUSCALE_SX 16
- X
- Xtime_t
- Xupdate_cpuscale(win,y,x,width,per_state)
- XWINDOW *win;
- Xint y;
- Xint x;
- Xregister width;
- Xtime_t *per_state;
- X{
- Xregister itmp;
- Xint accum = 0;
- Xtime_t idle = per_state[CPU_IDLE] + per_state[CPU_WAIT];
- Xtime_t cpu_ticks_total = idle + per_state[CPU_SXBRK] +
- X per_state[CPU_IDLE] + per_state[CPU_KERNEL] + per_state[CPU_USER];
- Xtime_t percent_user = (per_state[CPU_USER] * 100) / cpu_ticks_total;
- Xtime_t percent_kernel = (per_state[CPU_KERNEL] * 100) / cpu_ticks_total;
- Xtime_t percent_break = (per_state[CPU_SXBRK] * 100) / cpu_ticks_total;
- Xtime_t percent_busy = percent_user + percent_kernel + percent_break;
- X
- X if(!idle) /* take care of integer div truncation */
- X percent_busy = 100;
- X
- X wmove(win,y, x + _CPUSCALE_TX);
- X if(percent_busy < 70)
- X use_cp(cpLOW);
- X else if(percent_busy < 90)
- X use_cp(cpMED);
- X else
- X use_cp(cpHIGH);
- X wprintw(win,"%3ld",percent_busy);
- X
- X wmove(win,y, x + _CPUSCALE_UX);
- X use_cp(cpINFO);
- X wprintw(win,"%3ld",percent_user);
- X
- X wmove(win,y, x + _CPUSCALE_KX);
- X wprintw(win,"%3ld",percent_kernel);
- X
- X wmove(win,y, x + _CPUSCALE_BX);
- X wprintw(win,"%3ld",percent_break);
- X
- X wmove(win,y, x + _CPUSCALE_SX);
- X
- X use_cp(cpLOW);
- X itmp = (width * percent_user) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'u');
- X
- X use_cp(cpMED);
- X itmp = (width * percent_kernel) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'k');
- X
- X use_cp(cpHIGH);
- X itmp = (width * percent_break) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'b');
- X
- X if((percent_busy > 98) && ((width - accum) > 0))
- X {
- X waddch(win,(chtype)'*');
- X accum++;
- X }
- X
- X if((itmp = (width - accum)) > 0)
- X {
- X while(itmp--)
- X waddch(win,(chtype)' ');
- X }
- X return(cpu_ticks_total);
- X} /* end of update_cpuscale */
- X
- X/*+-------------------------------------------------------------------------
- X calc_cpu_avg(cpu_ticks) - add cpu_tick array to avg array
- X--------------------------------------------------------------------------*/
- Xvoid
- Xcalc_cpu_avg(cpu_ticks)
- Xtime_t cpu_ticks[];
- X{
- Xregister itmp;
- X
- X if(!cpu_avg_init)
- X {
- X for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
- X memcpy(cpu_avg[itmp],cpu_ticks,sizeof(time_t) * 5);
- X cpu_avg_init = 1;
- X }
- X else
- X {
- X for(itmp = 0; itmp < CPU_AVG_MAX - 1; itmp++)
- X memcpy(cpu_avg[itmp],cpu_avg[itmp + 1],sizeof(time_t) * 5);
- X memcpy(cpu_avg[itmp],cpu_ticks,sizeof(time_t) * 5);
- X }
- X
- X} /* end of calc_cpu_avg */
- X
- X/*+-------------------------------------------------------------------------
- X get_cpu_avg(cpu_ticks,period)
- X--------------------------------------------------------------------------*/
- Xget_cpu_avg(cpu_ticks,period)
- Xtime_t cpu_ticks[];
- Xint period;
- X{
- Xregister iperiod = CPU_AVG_MAX;
- Xregister istate;
- Xregister count = period;
- X
- X for(istate = 0; istate < 5; istate++)
- X cpu_ticks[istate] = 0;
- X
- X while(count--)
- X {
- X iperiod--;
- X for(istate = 0; istate < 5; istate++)
- X {
- X cpu_ticks[istate] += (cpu_avg[iperiod])[istate];
- X }
- X }
- X
- X for(istate = 0; istate < 5; istate++)
- X cpu_ticks[istate] /= period;
- X
- X} /* end of get_cpu_avg */
- X
- X/*+-------------------------------------------------------------------------
- X draw_waitscale_literals(win)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xdraw_waitscale_literals(win,y,x)
- XWINDOW *win;
- Xint y;
- Xint x;
- X{
- Xint x2 = x;
- X
- X wmove(win,y,x);
- X use_cp(cpBANNER);
- X waddstr(win,"---- Wait -- tot io swp pio -- (% of real time) ");
- X getyx(win,y,x2);
- X while(x2 < COLS)
- X waddch(win,(chtype)'-'),x2++;
- X use_cp(cpLIT);
- X wmove(win,y + 1,x);
- X waddstr(win," Instant %");
- X wmove(win,y + 2,x);
- X waddstr(win," 5 Sec Avg %");
- X wmove(win,y + 3,x);
- X waddstr(win,"10 Sec Avg %");
- X
- X} /* end of draw_waitscale_literals */
- X
- X/*+-------------------------------------------------------------------------
- X draw_per_sec_literals(win)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xdraw_per_sec_literals(win,y,x)
- XWINDOW *win;
- Xint y;
- Xint x;
- X{
- X
- X wmove(win,y,x);
- X use_cp(cpBANNER);
- X waddstr(win,"---- Sysinfo/Minfo --- (last 1 second activity) ");
- X getyx(win,y,x);
- X while(x < COLS)
- X waddch(win,(chtype)'-'),x++;
- X
- X} /* end of draw_per_sec_literals */
- X
- X/*+-------------------------------------------------------------------------
- X update_waitscale(win,y,width,per_state)
- X
- X000000000011111111112222222222333333333344444444445555555555666666
- X012345678901234567890123456789012345678901234567890123456789012345
- Xtot io swp pio
- X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- X--------------------------------------------------------------------------*/
- X#define _WAITSCALE_TX 0
- X#define _WAITSCALE_IX 4
- X#define _WAITSCALE_WX 8
- X#define _WAITSCALE_PX 12
- X#define _WAITSCALE_SX 16
- X
- Xtime_t
- Xupdate_waitscale(win,y,x,width,per_state,total_ticks)
- XWINDOW *win;
- Xint y;
- Xint x;
- Xregister width;
- Xtime_t *per_state;
- Xtime_t total_ticks;
- X{
- Xregister itmp;
- Xint accum = 0;
- Xtime_t percent_io = 0L;
- Xtime_t percent_swap = 0L;
- Xtime_t percent_pio = 0L;
- Xtime_t percent_total_wait;
- Xtime_t total_wait;
- X
- X/* crock: because of latency, total_ticks < all wait ticks sometimes */
- X total_wait = per_state[W_IO] + per_state[W_SWAP] + per_state[W_PIO];
- X if(total_ticks < total_wait)
- X total_ticks = total_wait;
- X
- X if(total_ticks)
- X {
- X percent_io = (per_state[W_IO] * 100) / total_ticks;
- X percent_swap = (per_state[W_SWAP] * 100) / total_ticks;
- X percent_pio = (per_state[W_PIO] * 100) / total_ticks;
- X }
- X
- X percent_total_wait = percent_io + percent_swap + percent_pio;
- X wmove(win,y, x + _WAITSCALE_TX);
- X if(percent_total_wait < 20)
- X use_cp(cpLOW);
- X else if(percent_total_wait < 40)
- X use_cp(cpMED);
- X else
- X use_cp(cpHIGH);
- X wprintw(win,"%3ld",percent_total_wait);
- X
- X wmove(win,y, x + _WAITSCALE_IX);
- X use_cp(cpINFO);
- X wprintw(win,"%3ld",percent_io);
- X
- X wmove(win,y, x + _WAITSCALE_WX);
- X wprintw(win,"%3ld",percent_swap);
- X
- X wmove(win,y, x + _WAITSCALE_PX);
- X wprintw(win,"%3ld",percent_pio);
- X
- X wmove(win,y, x + _WAITSCALE_SX);
- X
- X use_cp(cpLOW);
- X itmp = (width * percent_io) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'i');
- X
- X use_cp(cpMED);
- X itmp = (width * percent_swap) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'s');
- X
- X use_cp(cpHIGH);
- X itmp = (width * percent_pio) / 100;
- X accum += itmp;
- X while(itmp--)
- X waddch(win,(chtype)'p');
- X
- X if((itmp = (width - accum)) > 0)
- X {
- X while(itmp--)
- X waddch(win,(chtype)' ');
- X }
- X
- X} /* end of update_waitscale */
- X
- X/*+-------------------------------------------------------------------------
- X calc_wait_avg(wait_ticks) - add wait_tick array to avg array
- X--------------------------------------------------------------------------*/
- Xvoid
- Xcalc_wait_avg(wait_ticks)
- Xtime_t wait_ticks[];
- X{
- Xregister itmp;
- X
- X if(!wait_avg_init)
- X {
- X for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
- X memcpy(wait_avg[itmp],wait_ticks,sizeof(time_t) * 3);
- X wait_avg_init = 1;
- X }
- X else
- X {
- X for(itmp = 0; itmp < WAIT_AVG_MAX - 1; itmp++)
- X memcpy(wait_avg[itmp],wait_avg[itmp + 1],sizeof(time_t) * 3);
- X memcpy(wait_avg[itmp],wait_ticks,sizeof(time_t) * 3);
- X }
- X
- X} /* end of calc_wait_avg */
- X
- X/*+-------------------------------------------------------------------------
- X get_wait_avg(wait_ticks,period)
- X--------------------------------------------------------------------------*/
- Xget_wait_avg(wait_ticks,period)
- Xtime_t wait_ticks[];
- Xint period;
- X{
- Xregister iperiod = WAIT_AVG_MAX;
- Xregister istate;
- Xregister count = period;
- X
- X for(istate = 0; istate < 3; istate++)
- X wait_ticks[istate] = 0;
- X
- X while(count--)
- X {
- X iperiod--;
- X for(istate = 0; istate < 3; istate++)
- X {
- X wait_ticks[istate] += (wait_avg[iperiod])[istate];
- X }
- X }
- X
- X for(istate = 0; istate < 3; istate++)
- X wait_ticks[istate] /= period;
- X
- X} /* end of get_wait_avg */
- X
- X/*+-------------------------------------------------------------------------
- X extra_static_stuff()/extra_info_stuff() - for 43 line display
- X--------------------------------------------------------------------------*/
- X#define EY1 26
- X#define EX1 0
- X#define EX2 18
- X#define EX3 42
- X#define EX4 61
- Xvoid
- Xextra_static_stuff()
- X{
- X display_var(stdscr,EY1,EX1);
- X display_bootinfo(stdscr,EY1,EX2);
- X display_tune(stdscr,EY1,EX3);
- X} /* end of extra_static_stuff */
- Xvoid
- Xextra_info_stuff()
- X{
- X display_proc(stdscr,EY1,EX4);
- X} /* end of extra_info_stuff */
- X
- X/*+-------------------------------------------------------------------------
- X main(argc,argv,envp)
- X--------------------------------------------------------------------------*/
- Xmain(argc,argv,envp)
- Xint argc;
- Xchar **argv;
- Xchar **envp;
- X{
- Xregister itmp;
- Xregister char *cptr;
- Xtime_t total_ticks;
- Xint y,x;
- Xint invalidity = 0;
- XWINDOW *win = (WINDOW *)0;
- X
- X if(uname(&utsname))
- X {
- X perror("uname");
- X exit(1);
- X }
- X
- X for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
- X {
- X if(!(cpu_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 5)))
- X {
- X fputs("cannot alloc memory!\n",stderr);
- X exit(1);
- X }
- X }
- X
- X for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
- X {
- X if(!(wait_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 3)))
- X {
- X fputs("cannot alloc memory!\n",stderr);
- X exit(1);
- X }
- X }
- X
- X if(!initscr())
- X {
- X printf("curses init failed\n");
- X exit(1);
- X }
- X clear();
- X refresh();
- X win = stdscr;
- X
- X nlsym_read();
- X kinit(0); /* read access only */
- X setuid(getuid());
- X
- X noecho();
- X keypad(win,1);
- X
- X start_color();
- X init_pair(cpLIT,cBLU,cBLK);
- X init_pair(cpINFO,cGRN,cBLK);
- X init_pair(cpLOW,cLTG,cBLK);
- X init_pair(cpMED,cYEL,cBLK);
- X init_pair(cpHIGH,cRED,cBLK);
- X#ifdef COLOR_16_TERMINFO
- X init_pair(cpBANNER,cBLK,cGRY);
- X#else
- X init_pair(cpBANNER,cBLU,cBLK);
- X#endif
- X use_cp(cpLIT);
- X
- X /* a hack for now -- assuming AT char set */
- X#ifdef HI_BIT_CAN_BE_SET
- X acs_map['l'] = A_ALTCHARSET | sTL;
- X acs_map['m'] = A_ALTCHARSET | sTR;
- X acs_map['j'] = A_ALTCHARSET | sBL;
- X acs_map['k'] = A_ALTCHARSET | sBR;
- X acs_map['x'] = A_ALTCHARSET | sVR; /* vertical rule */
- X acs_map['q'] = A_ALTCHARSET | sHR; /* horizontal rule */
- X acs_map['t'] = A_ALTCHARSET | sLT; /* left hand T */
- X acs_map['u'] = A_ALTCHARSET | sRT; /* right hand T */
- X#endif
- X
- X#ifdef REF
- X if(!(p_screen = mkpanel(PSCR_LINES,80,PSCR_TLY,0)))
- X {
- X addstr("cannot make screen panel");
- X refresh();
- X endwin();
- X exit(1);
- X }
- X w_screen = panel_window(p_screen);
- X if(!(p_detail = mkpanel(4,20,PSCR_TLY + getmaxy(w_screen),0)))
- X {
- X addstr("cannot make detail panel");
- X refresh();
- X endwin();
- X exit(1);
- X }
- X w_detail = panel_window(p_detail);
- X winbox(w_detail);
- X hide_panel(p_detail);
- X top_panel(p_screen);
- X#endif /* REF */
- X
- X wmove(win,0,0);
- X use_cp(cpBANNER);
- X wprintw(win," u386mon %s ",revision);
- X wprintw(win," %s - %s %s ",utsname.nodename,
- X utsname.machine,utsname.release);
- X getyx(win,y,x);
- X while(x < 80)
- X waddch(win,(chtype)' '),x++;
- X wmove(win,0,70);
- X waddstr(win,"wht@n4hgf");
- X use_cp(cpLIT);
- X
- X hz = (cptr = getenv("HZ")) ? atoi(cptr) : HZ;
- X kread((caddr_t)&maxmem,maxmemaddr,sizeof(maxmem));
- X kread((caddr_t)&nswap,nswapaddr,sizeof(nswap));
- X kread((caddr_t)&sysinfo_last,sysinfoaddr,sizeof(sysinfo_last));
- X kread((caddr_t)&minfo_last,minfoaddr,sizeof(minfo));
- X kread((caddr_t)&tune,tuneaddr,sizeof(tune));
- X kread((caddr_t)&v,vaddr,sizeof(v));
- X nproc = v.v_proc;
- X kread((caddr_t)&bootinfo,bootinfoaddr,sizeof(bootinfo));
- X
- X draw_cpuscale_literals(win,CPUSCALE_TLY,0);
- X draw_waitscale_literals(win,WAITSCALE_TLY,0);
- X draw_per_sec_literals(win,PER_SEC_TLY,0);
- X
- X if(LINES >= 43)
- X extra_static_stuff();
- X
- X time(&then);
- X while(1)
- X {
- X nap(1000L);
- X time(&now);
- X
- X /* heuristic validity determination */
- X wmove(win,0,45);
- X if((now - then) > 4)
- X {
- X use_cp(cpHIGH);
- X waddstr(win," INVALID ");
- X invalidity += 3;
- X }
- X else if((itmp = ((now - then) > 3)) || (invalidity > 2))
- X {
- X use_cp(cpMED);
- X waddstr(win," INEXACT ");
- X if(itmp)
- X invalidity += 2;
- X }
- X if(invalidity && !(--invalidity))
- X {
- X use_cp(cpBANNER);
- X waddstr(win," ");
- X }
- X time(&then);
- X
- X kread((caddr_t)&freemem,freememaddr,sizeof(freemem));
- X kread((caddr_t)&sysinfo,sysinfoaddr,sizeof(sysinfo));
- X kread((caddr_t)&minfo,minfoaddr,sizeof(minfo));
- X
- X for (itmp = 0; itmp < 5; itmp++)
- X cpu_ticks[itmp] = sysidelta(cpu[itmp]);
- X
- X for (itmp = 0; itmp < 3; itmp++)
- X wait_ticks[itmp] = sysidelta(wait[itmp]);
- X
- X total_ticks = update_cpuscale(win,CPUSCALE_TLY + 1,CPUSCALE_SX,
- X CPUSCALE_WIDTH,
- X cpu_ticks);
- X
- X update_waitscale(win,WAITSCALE_TLY + 1,WAITSCALE_SX,
- X WAITSCALE_WIDTH,
- X wait_ticks,total_ticks);
- X
- X calc_cpu_avg(cpu_ticks);
- X calc_wait_avg(wait_ticks);
- X
- X get_cpu_avg(cpu_ticks,5);
- X total_ticks = update_cpuscale(win,CPUSCALE_TLY + 2,CPUSCALE_SX,
- X CPUSCALE_WIDTH,
- X cpu_ticks);
- X
- X get_wait_avg(wait_ticks,5);
- X update_waitscale(win,WAITSCALE_TLY + 2,WAITSCALE_SX,
- X WAITSCALE_WIDTH,
- X wait_ticks,total_ticks);
- X
- X get_cpu_avg(cpu_ticks,10);
- X total_ticks = update_cpuscale(win,CPUSCALE_TLY + 3,CPUSCALE_SX,
- X CPUSCALE_WIDTH,
- X cpu_ticks);
- X
- X get_wait_avg(wait_ticks,10);
- X update_waitscale(win,WAITSCALE_TLY + 3,WAITSCALE_SX,
- X WAITSCALE_WIDTH,
- X wait_ticks,total_ticks);
- X
- X
- X#define XX1 0
- X#define XX2 15
- X#define XX3 32
- X#define XX4 48
- X#define XX5 63
- X
- X use_cp(cpINFO);
- X y = PER_SEC_TLY + 1;
- X wmove(win,y++,XX1);
- X disp_info_long(win,"bread ","%6ld",sysidelta(bread));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"bwrite ","%6ld",sysidelta(bwrite));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"lread ","%6ld",sysidelta(lread));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"lwrite ","%6ld",sysidelta(lwrite));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"phread ","%6ld",sysidelta(phread));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"phwrit ","%6ld",sysidelta(phwrite));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"iget ","%6ld",sysidelta(iget));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"namei ","%6ld",sysidelta(namei));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"dirblk ","%6ld",sysidelta(dirblk));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"readch ","%6ld",sysidelta(readch));
- X wmove(win,y++,XX1);
- X disp_info_long(win,"writch ","%6ld",sysidelta(writech));
- X
- X y = PER_SEC_TLY + 1;
- X/*
- X wmove(win,y++,XX2);
- X disp_info_long(win,"rcvint ","%5ld",sysidelta(rcvint));
- X wmove(win,y++,XX2);
- X disp_info_long(win,"xmtint ","%5ld",sysidelta(xmtint));
- X wmove(win,y++,XX2);
- X disp_info_long(win,"mdmint ","%5ld\n",sysidelta(mdmint));
- X*/
- X wmove(win,y++,XX2);
- X disp_info_long(win,"rawch ","%5ld\n",sysidelta(rawch));
- X wmove(win,y++,XX2);
- X disp_info_long(win,"canch ","%5ld\n",sysidelta(canch));
- X wmove(win,y++,XX2);
- X disp_info_long(win,"outch ","%5ld\n",sysidelta(outch));
- X
- X y++;
- X wmove(win,y++,XX2);
- X disp_info_long(win,"msg ","%5ld\n",sysidelta(msg));
- X wmove(win,y++,XX2);
- X disp_info_long(win,"sema ","%5ld\n",sysidelta(sema));
- X
- X y++;
- X wmove(win,y++,XX2);
- X disp_static_long(win,"maxmem ","%7ldk",maxmem * NBPP / 1024);
- X wmove(win,y++,XX2);
- X disp_info_long(win, "frmem ","%7ldk",freemem * NBPP / 1024);
- X wmove(win,y++,XX2);
- X disp_info_int (win, "mem used ","%3d%%",
- X 100 - (int)((freemem * 100) / maxmem));
- X
- X wmove(win,y++,XX2);
- X disp_static_long(win,"nswap ","%7ldk",nswap/2);
- X wmove(win,y++,XX2);
- X disp_info_long(win, "frswp ","%7ldk",minfo.freeswap/2);
- X wmove(win,y++,XX2);
- X disp_info_int(win, "swp used ","%3d%%",
- X 100 - (int)((minfo.freeswap * 100) / nswap));
- X
- X y = PER_SEC_TLY + 1;
- X wmove(win,y++,XX3);
- X disp_info_long(win,"pswitch ","%4ld",sysidelta(pswitch));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"syscall ","%4ld",sysidelta(syscall));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"sysread ","%4ld",sysidelta(sysread));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"syswrit ","%4ld",sysidelta(syswrite));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"sysfork ","%4ld",sysidelta(sysfork));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"sysexec ","%4ld",sysidelta(sysexec));
- X
- X y++;
- X wmove(win,y++,XX3);
- X disp_info_long(win,"runque ","%4ld",sysidelta(runque));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"runocc ","%4ld",sysidelta(runocc));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"swpque ","%4ld",sysidelta(swpque));
- X wmove(win,y++,XX3);
- X disp_info_long(win,"swpocc ","%4ld",sysidelta(swpocc));
- X
- X y = PER_SEC_TLY + 1;
- X wmove(win,y++,XX4);
- X disp_info_long(win,"vfault ","%3ld",midelta(vfault));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"demand ","%3ld",midelta(demand));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"pfault ","%3ld",midelta(pfault));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"cw ","%3ld",midelta(cw));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"steal ","%3ld",midelta(steal));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"frdpgs ","%3ld",midelta(freedpgs));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"vfpg ","%3ld",midelta(vfpg));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"sfpg ","%3ld",midelta(sfpg));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"vspg ","%3ld",midelta(vspg));
- X wmove(win,y++,XX4);
- X disp_info_long(win,"sspg ","%3ld",midelta(sspg));
- X wmove(win,y++,XX4);
- X
- X y = PER_SEC_TLY + 1;
- X disp_info_long(win,"unmodsw ","%3ld",midelta(unmodsw));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"unmodfl ","%3ld",midelta(unmodfl));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"psoutok ","%3ld",midelta(psoutok));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"psinfai ","%3ld",midelta(psinfail));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"psinok ","%3ld",midelta(psinok));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"rsout ","%3ld",midelta(rsout));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"rsin ","%3ld",midelta(rsin));
- X
- X y++;
- X wmove(win,y++,XX5);
- X use_cp(cpLIT);
- X waddstr(win,"pages on");
- X wmove(win,y++,XX5);
- X disp_info_long(win,"swap ","%5ld",midelta(swap));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"cache ","%5ld",midelta(cache));
- X wmove(win,y++,XX5);
- X disp_info_long(win,"file ","%5ld",midelta(file));
- X
- X if(LINES >= 43)
- X extra_info_stuff();
- X
- X sysinfo_last = sysinfo;
- X minfo_last = minfo;
- X
- X pflush();
- X }
- X
- X leave(0);
- X} /* end of main */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of u386mon.c */
- SHAR_EOF
- $TOUCH -am 0619213590 u386mon.c &&
- chmod 0644 u386mon.c ||
- echo "restore of u386mon.c failed"
- set `wc -c u386mon.c`;Wc_c=$1
- if test "$Wc_c" != "25595"; then
- echo original size 25595, current size $Wc_c
- fi
- exit 0
-
- ---------------------------------------------------------------------
- Warren Tucker, TuckerWare gatech!n4hgf!wht or wht%n4hgf@gatech.edu
- Any perceptible delay will eventually get on your nerves. --Bob Hyers
-