source: trunk/athena/bin/mon/mon.c @ 356

Revision 356, 3.7 KB checked in by kaufer, 37 years ago (diff)
changes for the ibmrt
Line 
1/*
2 *      $Source: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v $
3 *      $Author: kaufer $
4 *      $Locker:  $
5 *      $Header: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v 1.2 1987-04-21 14:16:36 kaufer Exp $
6 */
7
8#ifndef lint
9static char *rcsid_mon_c = "$Header: /afs/dev.mit.edu/source/repository/athena/bin/mon/mon.c,v 1.2 1987-04-21 14:16:36 kaufer Exp $";
10#endif  lint
11
12/*
13 *                      M O N . C
14 *
15 *  A program to moniter system activity.
16 *   Rework of earlier mon program.  17 Aug 84 - Phillip Dykstra
17 *
18 */
19
20#include "mon.h"
21#include <curses.h>
22#include <signal.h>
23
24struct  sgttyb ttyb;
25int done();
26
27/*
28 *  The namelist array.  Uses to get the kernal variables needed
29 *  by all the MON routines.  The order of this list MUST correspond
30 *  to the order of the definitions in mon.h
31 */
32struct nlist namelist[] = {
33        { "_dk_busy" },
34        { "_dk_mspw" },
35        { "_hz" },
36        { "_cp_time" },
37        { "_rate" },
38        { "_total" },
39        { "_deficit" },
40        { "_dk_xfer" },
41#ifdef vax
42        { "_mbdinit" },
43        { "_ubdinit" },
44#endif
45#ifdef sun
46        { "_mbdinit" },
47        { "_dummy" },
48#endif
49#ifdef ibm032
50        { "_ioccdinit" },
51        { "_dummy" },
52#endif
53        { "_ifnet" },
54        { "_dk_time" },
55        { "_dk_wds" },
56        { "_dk_seek" },
57        { "_tk_nin" },
58        { "_tk_nout" },
59        { "_avenrun" },
60        { "_cp2_time" },        /* 2nd CPU stats */
61        { "_slavestart" },      /* Used to detect 2nd CPU */
62        { 0 }
63};
64
65main(argc,argv)
66int argc;
67char *argv[];
68{
69        register i;
70        double f1, f2;
71        extern char *ctime();
72
73/*
74 * fill the namelist and open /dev/kmem
75 */
76        nlist("/vmunix", namelist);
77        if(namelist[X_DK_BUSY].n_type == 0) {
78                printf("dk_busy not found in /vmunix namelist\n");
79                exit(1);
80        }
81        kmem = open("/dev/kmem", 0);
82        if(kmem < 0) {
83                printf("cannot open /dev/kmem\n");
84                exit(1);
85        }
86        if(argc > 1)
87                intv = (atoi(argv[1]));
88        else intv = 1;
89
90/*
91 * do all things that need to be done only once
92 */
93        lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0);
94        read(kmem, s.dk_mspw, sizeof s.dk_mspw);
95        lseek(kmem, (long)namelist[X_HZ].n_value, 0);
96        read(kmem, &hz, sizeof hz);
97        read_names();
98        dualcpu = 0;
99        if (namelist[X_SLAVESTART].n_type)
100                dualcpu++;       
101/*
102 * monitor parameters forever
103 */
104        worker();
105        /* NOTREACHED */
106}
107
108char obuf[BUFSIZ];      /* Output buffer */
109
110worker()
111{
112        long clock;
113        struct timeval tintv;
114        int i, tin;
115
116        /* set up signals */
117        signal(SIGINT, done);
118        signal(SIGQUIT, done);
119
120        /* set CBREAK mode with no buffering on stdin */
121        setbuf(stdin, 0);
122        setbuf(stdout, obuf);
123        ioctl(0, TIOCGETP, &ttyb);
124        ttyb.sg_flags |= CBREAK;
125        ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);
126
127        tintv.tv_sec = intv;
128        tintv.tv_usec = 0;
129        initscr();      /* init curses package */
130        nifinit();      /* get initial net interfaces data */
131        dispinit();     /* initialize display */
132        for(;;){
133                vm();
134                io();
135                nifupdate();
136                /* get load average */
137                lseek(kmem, (long)namelist[LOADAV].n_value, 0);
138                read(kmem, &loadavg[0], sizeof loadavg);
139                mvprintw(0,13,"%4.2f %4.2f %4.2f %4.2f", loadavg[3], loadavg[0], loadavg[1], loadavg[2]);
140                time(&clock);
141                mvprintw(0,40,ctime(&clock));
142                dispupdate();
143                mvprintw(23, 0, "CMD> ");
144                refresh();
145                tin = 1;
146                i = select(2, &tin, (int *)0, (int *)0, &tintv);
147                if (i && tin) {
148                        i = getchar();
149                        if (i == 12)
150                                dispinit();
151                        else if (i == 'q')
152                                done();
153                }
154        }
155}
156
157/*
158 * DONE - put the term back in non CBREAK mode and exit.
159 */
160done()
161{
162        ioctl(0, TIOCGETP, &ttyb);
163        ttyb.sg_flags &= ~CBREAK;
164        ioctl(fileno(stdin), TIOCSETP, (char *)&ttyb);
165        mvprintw(23,0,"\n");
166        refresh();
167        exit(1);
168}
Note: See TracBrowser for help on using the repository browser.