|
|
1.1 ! root 1: #include <jerq.h> ! 2: #include <nlist.h> ! 3: #include <ctype.h> ! 4: ! 5: typedef int bool; ! 6: ! 7: #undef TRUE ! 8: #define TRUE -1 ! 9: #define FALSE 0 ! 10: ! 11: struct ld { ! 12: float l_runq; ! 13: long l_cp[5]; ! 14: }; ! 15: ! 16: #define TIMELEN 6 ! 17: #define LOADLEN 13 ! 18: ! 19: struct nodedef { ! 20: Rectangle bar; /* the bar graph of system use */ ! 21: char load[LOADLEN]; /* load numbers */ ! 22: int vec[5]; /* current use vectors */ ! 23: int oldvec[5]; /* old use vectors */ ! 24: struct ld m_old; /* previous set of poal numbers */ ! 25: struct ld m_new; /* current set of load numbers */ ! 26: } node0; ! 27: ! 28: /* user nice sys queue idle */ ! 29: short black_bits[]={ ! 30: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ! 31: 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ! 32: }; ! 33: Texture black; ! 34: short white_bits[]={ ! 35: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ! 36: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, ! 37: }; ! 38: Texture white; ! 39: short darkgrey_bits[] = { ! 40: 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, ! 41: 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, ! 42: }; ! 43: Texture darkgrey; ! 44: short lightgrey_bits[] = { ! 45: 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, ! 46: 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, ! 47: }; ! 48: Texture lightgrey; ! 49: short grey_bits[] = { ! 50: 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, ! 51: 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, ! 52: }; ! 53: Texture grey; ! 54: ! 55: #ifdef BSD ! 56: #include <sys/param.h> ! 57: #define NUMLOADBAR 4 ! 58: Texture *txt[]={ ! 59: &black, &lightgrey, &darkgrey, &white ! 60: }; ! 61: #else ! 62: #define NUMLOADBAR 5 ! 63: Texture *txt[]={ ! 64: &black, &lightgrey, &darkgrey, &grey, &white ! 65: }; ! 66: #endif BSD ! 67: ! 68: /* size contraints */ ! 69: #define BARHEIGHT 18 ! 70: #define MINBARHEIGHT 4 ! 71: #define MAXBARHEIGHT 24 ! 72: #define TIMEORIGIN 2 ! 73: #define NAMELEN 9 ! 74: int CHARHEIGHT; ! 75: int CHARWIDTH; ! 76: int TIMECORNER; ! 77: int LOADORIGIN; ! 78: int LOADCORNER; ! 79: ! 80: int size; ! 81: int barheight; ! 82: ! 83: main(ac, av) ! 84: int ac; ! 85: char *av[]; ! 86: { ! 87: register i, state; ! 88: int ticks = 5; ! 89: int permin = 60; ! 90: char *p; ! 91: ! 92: /* initialize load gathering */ ! 93: initload(); ! 94: gettime(); ! 95: getload(); ! 96: docpu(); ! 97: ! 98: request(ALARM|KBD|MOUSE); ! 99: initdisplay(ac, av); ! 100: inittextures(); ! 101: ! 102: CHARHEIGHT = fontheight(&defont) - 2; ! 103: CHARWIDTH = strwidth(&defont, "m"); ! 104: TIMECORNER = NAMELEN*CHARWIDTH; ! 105: LOADORIGIN = TIMECORNER; ! 106: LOADCORNER = TIMECORNER + LOADLEN*CHARWIDTH; ! 107: barheight = MAXBARHEIGHT; ! 108: ! 109: /* read the tick value and arguments */ ! 110: if (ac > 1 && av[1][0] == '-') { ! 111: if (isdigit(av[1][1])) { ! 112: ticks = -atoi(av[1]); ! 113: if (ticks < 2) ! 114: ticks = 2; ! 115: } ! 116: av++, ac--; ! 117: } ! 118: ! 119: reshape(); ! 120: alarm(ticks * 60); ! 121: while (TRUE) { ! 122: state = wait(ALARM|KBD|MOUSE); ! 123: if(P->state&RESHAPED) ! 124: reshape(); ! 125: if(state&KBD) ! 126: while(kbdchar() != -1) /* dump any keyboard input */ ! 127: ; ! 128: if(state&ALARM) { ! 129: getinfo(); ! 130: docpu(); ! 131: drawload(); ! 132: getload(); ! 133: drawload(); ! 134: drawbar(); ! 135: if(permin++ >= 60/ticks){ ! 136: drawtime(); ! 137: gettime(); ! 138: drawtime(); ! 139: permin = 0; ! 140: } ! 141: alarm(ticks * 60); ! 142: } ! 143: } ! 144: } ! 145: ! 146: inittextures() ! 147: { ! 148: black = ToTexture(black_bits); ! 149: white = ToTexture(white_bits); ! 150: darkgrey = ToTexture(darkgrey_bits); ! 151: lightgrey = ToTexture(lightgrey_bits); ! 152: grey = ToTexture(grey_bits); ! 153: } ! 154: ! 155: reshape() ! 156: { ! 157: register int i; ! 158: ! 159: P->state&=~RESHAPED; ! 160: rectf(&display, Drect, F_CLR); ! 161: ! 162: /* resize objects */ ! 163: size = Drect.corner.x-Drect.origin.x; ! 164: barheight = (Drect.corner.y-Drect.origin.y-2) - CHARHEIGHT; ! 165: if (barheight < MINBARHEIGHT) ! 166: barheight = MINBARHEIGHT; ! 167: ! 168: /* redraw */ ! 169: nodeinit(); ! 170: drawload(); ! 171: drawtime(); ! 172: } ! 173: ! 174: ! 175: /* clear out the bar and write in the node name */ ! 176: nodeinit() ! 177: { ! 178: register struct nodedef *n = &node0; ! 179: register int i; ! 180: ! 181: /* make the bar */ ! 182: n->bar.origin.x = Drect.origin.x; ! 183: n->bar.origin.y = Drect.origin.y + 0*(barheight+CHARHEIGHT); ! 184: n->bar.corner.x = Drect.origin.x + size; ! 185: n->bar.corner.y = n->bar.origin.y + barheight; ! 186: n->bar = inset(n->bar, 4); ! 187: rectf(&display, inset(n->bar, -2), F_OR); ! 188: rectf(&display, n->bar, F_CLR); ! 189: ! 190: /* init the node */ ! 191: for(i = 0; i<NUMLOADBAR - 1; i++) ! 192: n->vec[i] = n->oldvec[i] = 0; ! 193: n->vec[i]=n->oldvec[i]=size; ! 194: }; ! 195: ! 196: /* draw the bar graph for a system's CPU time */ ! 197: drawbar () ! 198: { ! 199: struct nodedef *n = &node0; ! 200: Point pt[2]; ! 201: register i; ! 202: ! 203: rectf(&display, n->bar, F_CLR); ! 204: pt[0].y = n->bar.origin.y; ! 205: pt[0].x = n->bar.origin.x; ! 206: pt[1].y = n->bar.corner.y; ! 207: for(i=0; i< NUMLOADBAR - 1; i++){ ! 208: if (!n->vec[i]) ! 209: continue; ! 210: pt[1].x = pt[0].x + n->vec[i]; ! 211: if (pt[1].x > n->bar.corner.x) ! 212: pt[1].x = n->bar.corner.x; ! 213: texture(&display, Rpt(pt[0], pt[1]), txt[i], F_XOR); ! 214: pt[0].x = pt[1].x; ! 215: } ! 216: } ! 217: ! 218: static char *timestr; ! 219: ! 220: drawtime() ! 221: { ! 222: if (size < TIMECORNER) ! 223: return; ! 224: string(&defont, timestr, &display, ! 225: Pt (Drect.origin.x+TIMEORIGIN, Drect.origin.y+barheight-2), F_XOR); ! 226: } ! 227: ! 228: gettime() ! 229: { ! 230: char *p, *ctime(); ! 231: long l; ! 232: ! 233: l = time ((long *)0); ! 234: p = ctime(&l); ! 235: timestr = p+11; ! 236: *(p+11+TIMELEN-1) = 0; ! 237: } ! 238: ! 239: drawload() ! 240: { ! 241: struct nodedef *n = &node0; ! 242: ! 243: if (size < LOADCORNER) ! 244: return; ! 245: string(&defont, n->load, &display, ! 246: Pt (Drect.origin.x+LOADORIGIN, n->bar.origin.y+barheight-6), F_XOR); ! 247: } ! 248: ! 249: getload() ! 250: { ! 251: double fabs(); ! 252: ! 253: sprintf(node0.load, " %.2f %c%.2f", node0.m_new.l_runq, ! 254: "-+"[node0.m_new.l_runq>node0.m_old.l_runq], ! 255: fabs(node0.m_new.l_runq-node0.m_old.l_runq)); ! 256: node0.m_old.l_runq = node0.m_new.l_runq; ! 257: } ! 258: ! 259: /* CPU percentages */ ! 260: docpu() ! 261: { ! 262: register long *ln, *lo; ! 263: register int sum; ! 264: long diff[5]; ! 265: register long i; ! 266: ! 267: #ifndef BSD ! 268: i = node0.m_new.l_cp[3]; ! 269: node0.m_new.l_cp[3] = node0.m_new.l_cp[4]; ! 270: node0.m_new.l_cp[4] = i; ! 271: #endif BSD ! 272: ln = node0.m_new.l_cp; ! 273: lo = node0.m_old.l_cp; ! 274: for(sum=i=0; i < NUMLOADBAR; i++) { ! 275: diff[i] = *ln - *lo; ! 276: sum += diff[i]; ! 277: *lo++ = *ln++; ! 278: } ! 279: sum = sum ? sum : 1; ! 280: ln = node0.vec; ! 281: lo = diff; ! 282: for (i=0; i<NUMLOADBAR; i++) { ! 283: *ln = (*lo * size) / sum; ! 284: *ln++; *lo++; ! 285: } ! 286: } ! 287: ! 288: /* globals */ ! 289: struct nlist nl[] ={ ! 290: {"_intrtime",0}, ! 291: {"_cp_time",0}, ! 292: {"_avenrun",0}, ! 293: { 0,0 }, ! 294: }; ! 295: ! 296: #ifdef BSD ! 297: char *sys = "/vmunix"; ! 298: #else ! 299: char *sys = "/unix"; ! 300: #endif BSD ! 301: char *core = "/dev/kmem"; ! 302: int mem; ! 303: ! 304: /* imported */ ! 305: extern long lseek(); ! 306: ! 307: /* initialize */ ! 308: initload() ! 309: { ! 310: nlist(sys, nl); ! 311: ! 312: mem = open(core, 0); ! 313: if (mem<0) { ! 314: printf("can't open %s\n", core); ! 315: exit(1); ! 316: } ! 317: getinfo(); ! 318: node0.m_old = node0.m_new; ! 319: } ! 320: ! 321: getinfo() ! 322: { ! 323: long avenrun; ! 324: ! 325: lseek(mem, (long)nl[1].n_value, 0); ! 326: read(mem, (char *)node0.m_new.l_cp, sizeof(node0.m_new.l_cp)); ! 327: lseek(mem, (long)nl[2].n_value, 0); ! 328: #ifdef BSD ! 329: read(mem, (char *)&avenrun, sizeof(avenrun)); ! 330: node0.m_new.l_runq = (float)avenrun/FSCALE; ! 331: #else ! 332: read(mem, (char *)&(node0.m_new.l_runq), sizeof(node0.m_new.l_runq)); ! 333: #endif ! 334: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.