Annotation of 43BSDReno/usr.bin/systat/pigs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)pigs.c     5.7 (Berkeley) 5/29/89";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Pigs display from Bill Reeves at Lucasfilm
                     13:  */
                     14: 
                     15: #include "systat.h"
                     16: #include <sys/dir.h>
                     17: #include <sys/time.h>
                     18: #include <sys/proc.h>
                     19: #include <pwd.h>
                     20: #include <paths.h>
                     21: 
                     22: WINDOW *
                     23: openpigs()
                     24: {
                     25:        return (subwin(stdscr, LINES-5-1, 0, 5, 0));
                     26: }
                     27: 
                     28: closepigs(w)
                     29:        WINDOW *w;
                     30: {
                     31:        if (w == NULL)
                     32:                return;
                     33:        wclear(w);
                     34:        wrefresh(w);
                     35:        delwin(w);
                     36: }
                     37: 
                     38: int    maxind;
                     39: int     factor;
                     40: float   total;
                     41: struct  passwd *getpwuid();
                     42: char    pidname[30];
                     43: long   stime[CPUSTATES];
                     44: double idle;
                     45: 
                     46: showpigs()
                     47: {
                     48:        register short auid;
                     49:        register int i, j, y;
                     50:        register float max;
                     51:        register struct p_times *ptptr;
                     52:        struct p_times temppt;
                     53:        register struct users *knptr;
                     54:        char *getpname(), *pnamp;
                     55: 
                     56:        if (pt == NULL)
                     57:                return;
                     58:        /* Accumulate the percent of cpu per user. */
                     59:        ptptr = pt;
                     60:        numprocs = 0;
                     61:        total = 0.0;
                     62:        for (i = 0; i < nproc; i++) {
                     63:                /* discard inactive processes */
                     64:                if (ptptr->pt_uid == -1) {
                     65:                        ptptr++;
                     66:                        continue;
                     67:                }
                     68:                /* Accumulate the percentage. */
                     69:                total += ptptr->pt_pctcpu;
                     70:                numprocs++;
                     71:                ptptr++;
                     72:        }
                     73: 
                     74:        pt[numprocs].pt_pctcpu = idle;
                     75:        total += idle;
                     76:        pt[numprocs].pt_uid = -1;
                     77:        pt[numprocs].pt_pid = -1;
                     78:        pt[numprocs].pt_pp = NULL;
                     79: 
                     80:        if (total < 1.0)
                     81:                total = 1.0;
                     82:        factor = 50.0/total;
                     83: 
                     84:        /* Find the top few by executing a "bubble pass" ten times. */
                     85:        y = numprocs + 1;
                     86:        if (y > wnd->_maxy-1)
                     87:                y = wnd->_maxy-1;
                     88:        for (i = 0; i < y; i++) {
                     89:                ptptr = &pt[i];
                     90:                max = -10000.0;
                     91:                maxind = i;
                     92:                for (j = i; j < numprocs + 1; j++) {
                     93:                        if (ptptr->pt_pctcpu > max) {
                     94:                                max = ptptr->pt_pctcpu;
                     95:                                maxind = j;
                     96:                        }
                     97:                        ptptr++;
                     98:                }
                     99:                if (maxind != i) {
                    100:                        temppt = pt[i];
                    101:                        pt[i] = pt[maxind];
                    102:                        pt[maxind] = temppt;
                    103:                }
                    104:        }
                    105:        y = 1;
                    106:        ptptr = pt;
                    107:        i = numprocs + 1;
                    108:        if (i > wnd->_maxy-1)
                    109:                i = wnd->_maxy-1;
                    110:        for (; i > 0 && ptptr->pt_pctcpu > 0.01; i--) {
                    111:                /* Find the user's name. */
                    112:                knptr = known;
                    113:                auid = ptptr->pt_uid;
                    114:                for (j = numknown - 1; j >= 0; j--) {
                    115:                        if (knptr->k_uid == auid) {
                    116:                                namp = knptr->k_name;
                    117:                                break;
                    118:                        }
                    119:                        knptr++;
                    120:                }
                    121:                if (j < 0) {
                    122:                        if (numknown < 30) {
                    123:                                knptr = &known[numknown];
                    124:                                namp = strncpy(knptr->k_name,
                    125:                                    getpwuid(auid)->pw_name, 15);
                    126:                                knptr->k_name[15] = '\0';
                    127:                                knptr->k_uid = auid;
                    128:                                numknown++;
                    129:                        } else
                    130:                                namp = getpwuid(auid)-> pw_name;
                    131:                }
                    132:                pnamp = getpname(ptptr->pt_pid, ptptr->pt_pp);
                    133:                wmove(wnd, y, 0);
                    134:                wclrtoeol(wnd);
                    135:                mvwaddstr(wnd, y, 0, namp);
                    136:                sprintf(pidname, "%10.10s", pnamp);
                    137:                mvwaddstr(wnd, y, 9, pidname);
                    138:                wmove(wnd, y++, 20);
                    139:                for (j = ptptr->pt_pctcpu*factor + 0.5; j > 0; j--)
                    140:                        waddch(wnd, 'X');
                    141:                ptptr++;
                    142:        }
                    143:        wmove(wnd, y, 0); wclrtobot(wnd);
                    144: }
                    145: 
                    146: static struct nlist nlst[] = {
                    147: #define X_PROC          0
                    148:        { "_proc" },
                    149: #define X_NPROC         1
                    150:        { "_nproc" },
                    151: #define X_USRPTMAP      2
                    152:        { "_Usrptmap" },
                    153: #define X_USRPT         3
                    154:        { "_usrpt" },
                    155: #define X_CPTIME       4
                    156:        { "_cp_time" },
                    157:        { "" }
                    158: };
                    159: 
                    160: initpigs()
                    161: {
                    162:        if (nlst[X_PROC].n_type == 0) {
                    163:                nlist(_PATH_UNIX, nlst);
                    164:                if (nlst[X_PROC].n_type == 0) {
                    165:                        error("namelist on %s failed", _PATH_UNIX);
                    166:                        return(0);
                    167:                }
                    168:        }
                    169:        if (procp == NULL) {
                    170:                procp = getw(nlst[X_PROC].n_value);
                    171:                nproc = getw(nlst[X_NPROC].n_value);
                    172:        }
                    173:        if (kprocp == NULL)
                    174:                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
                    175:        if (usrpt != NULL)
                    176:                return(1);
                    177:        usrpt = (struct pte *)nlst[X_USRPT].n_value;
                    178:        Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
                    179:        if (pt == NULL)
                    180:                pt = (struct p_times *)calloc(nproc, sizeof (struct p_times));
                    181:        lseek(kmem, (long)nlst[X_CPTIME].n_value, L_SET);
                    182:        read(kmem, stime, sizeof stime);
                    183:        return(1);
                    184: }
                    185: 
                    186: fetchpigs()
                    187: {
                    188:        register int i;
                    189:        register struct p_times *prt;
                    190:        register float time;
                    191:        register struct proc *pp;
                    192:        long ctime[CPUSTATES];
                    193:        double t;
                    194: 
                    195:        if (nlst[X_PROC].n_type == 0)
                    196:                return;
                    197:        if (kprocp == NULL) {
                    198:                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
                    199:                if (kprocp == NULL)
                    200:                        return;
                    201:        }
                    202:        if (pt == NULL) {
                    203:                pt = (struct p_times *)calloc(nproc, sizeof (struct p_times));
                    204:                if (pt == NULL)
                    205:                        return;
                    206:        }
                    207:        prt = pt;
                    208:        lseek(kmem, procp, L_SET);
                    209:        read(kmem, kprocp, sizeof (struct proc) * nproc);
                    210:        for (i = 0, pp = kprocp; i < nproc; i++, pp++) {
                    211:                time = pp->p_time;
                    212:                if (time == 0 || (pp->p_flag & SLOAD) == 0)
                    213:                        continue;
                    214:                prt->pt_pid = pp->p_pid;
                    215:                prt->pt_pp = pp;
                    216:                prt->pt_pctcpu = ((double) pp->p_pctcpu / fscale) /
                    217:                                (1.0 - exp(time * lccpu));
                    218:                prt->pt_uid = pp->p_uid;
                    219:                prt++;
                    220:        }
                    221:        for (; prt < &pt[nproc]; prt++)
                    222:                prt->pt_uid = -1;
                    223:        lseek(kmem, (long)nlst[X_CPTIME].n_value, L_SET);
                    224:        read(kmem, ctime, sizeof ctime);
                    225:        t = 0;
                    226:        for (i = 0; i < CPUSTATES; i++)
                    227:                t += ctime[i] - stime[i];
                    228:        if (t == 0.0)
                    229:                t = 1.0;
                    230:        idle = (ctime[CP_IDLE] - stime[CP_IDLE]) / t;
                    231:        for (i = 0; i < CPUSTATES; i++)
                    232:                stime[i] = ctime[i];
                    233: }
                    234: 
                    235: labelpigs()
                    236: {
                    237:        wmove(wnd, 0, 0); wclrtoeol(wnd);
                    238:        mvwaddstr(wnd, 0, 20,
                    239:            "/0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100");
                    240: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.