|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)sh.time.c 4.4 (Berkeley) 8/11/83"; ! 3: #endif ! 4: ! 5: #include "sh.h" ! 6: ! 7: /* ! 8: * C Shell - routines handling process timing and niceing ! 9: */ ! 10: struct tms times0; ! 11: struct tms timesdol; ! 12: ! 13: settimes() ! 14: { ! 15: struct rusage ruch; ! 16: ! 17: gettimeofday(&time0, (struct timezone *)0); ! 18: getrusage(RUSAGE_SELF, &ru0); ! 19: getrusage(RUSAGE_CHILDREN, &ruch); ! 20: ruadd(&ru0, &ruch); ! 21: } ! 22: ! 23: /* ! 24: * dotime is only called if it is truly a builtin function and not a ! 25: * prefix to another command ! 26: */ ! 27: dotime() ! 28: { ! 29: struct timeval timedol; ! 30: struct rusage ru1, ruch; ! 31: ! 32: getrusage(RUSAGE_SELF, &ru1); ! 33: getrusage(RUSAGE_CHILDREN, &ruch); ! 34: ruadd(&ru1, &ruch); ! 35: gettimeofday(&timedol, (struct timezone *)0); ! 36: prusage(&ru0, &ru1, &timedol, &time0); ! 37: } ! 38: ! 39: /* ! 40: * donice is only called when it on the line by itself or with a +- value ! 41: */ ! 42: donice(v) ! 43: register char **v; ! 44: { ! 45: register char *cp; ! 46: ! 47: v++, cp = *v++; ! 48: if (cp == 0) { ! 49: #ifndef V6 ! 50: nice(20); ! 51: nice(-10); ! 52: #endif ! 53: nice(4); ! 54: } else if (*v == 0 && any(cp[0], "+-")) { ! 55: #ifndef V6 ! 56: nice(20); ! 57: nice(-10); ! 58: #endif ! 59: nice(getn(cp)); ! 60: } ! 61: } ! 62: ! 63: ruadd(ru, ru2) ! 64: register struct rusage *ru, *ru2; ! 65: { ! 66: register long *lp, *lp2; ! 67: register int cnt; ! 68: ! 69: tvadd(&ru->ru_utime, &ru2->ru_utime); ! 70: tvadd(&ru->ru_stime, &ru2->ru_stime); ! 71: if (ru2->ru_maxrss > ru->ru_maxrss) ! 72: ru->ru_maxrss = ru2->ru_maxrss; ! 73: cnt = &ru->ru_last - &ru->ru_first + 1; ! 74: lp = &ru->ru_first; lp2 = &ru2->ru_first; ! 75: do ! 76: *lp++ += *lp2++; ! 77: while (--cnt > 0); ! 78: } ! 79: ! 80: prusage(r0, r1, e, b) ! 81: register struct rusage *r0, *r1; ! 82: struct timeval *e, *b; ! 83: { ! 84: register time_t t = ! 85: (r1->ru_utime.tv_sec-r0->ru_utime.tv_sec)*100+ ! 86: (r1->ru_utime.tv_usec-r0->ru_utime.tv_usec)/10000+ ! 87: (r1->ru_stime.tv_sec-r0->ru_stime.tv_sec)*100+ ! 88: (r1->ru_stime.tv_usec-r0->ru_stime.tv_usec)/10000; ! 89: register char *cp; ! 90: register int i; ! 91: register struct varent *vp = adrof("time"); ! 92: int ms = ! 93: (e->tv_sec-b->tv_sec)*100 + (e->tv_usec-b->tv_usec)/10000; ! 94: ! 95: cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww"; ! 96: if (vp && vp->vec[0] && vp->vec[1]) ! 97: cp = vp->vec[1]; ! 98: for (; *cp; cp++) ! 99: if (*cp != '%') ! 100: putchar(*cp); ! 101: else if (cp[1]) switch(*++cp) { ! 102: ! 103: case 'U': ! 104: pdeltat(&r1->ru_utime, &r0->ru_utime); ! 105: break; ! 106: ! 107: case 'S': ! 108: pdeltat(&r1->ru_stime, &r0->ru_stime); ! 109: break; ! 110: ! 111: case 'E': ! 112: psecs(ms / 100); ! 113: break; ! 114: ! 115: case 'P': ! 116: printf("%d%%", (int) (t*100 / ((ms ? ms : 1)))); ! 117: break; ! 118: ! 119: case 'W': ! 120: i = r1->ru_nswap - r0->ru_nswap; ! 121: printf("%d", i); ! 122: break; ! 123: ! 124: case 'X': ! 125: printf("%d", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t); ! 126: break; ! 127: ! 128: case 'D': ! 129: printf("%d", t == 0 ? 0 : ! 130: (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t); ! 131: break; ! 132: ! 133: case 'K': ! 134: printf("%d", t == 0 ? 0 : ! 135: ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) - ! 136: (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t); ! 137: break; ! 138: ! 139: case 'M': ! 140: printf("%d", r1->ru_maxrss/2); ! 141: break; ! 142: ! 143: case 'F': ! 144: printf("%d", r1->ru_majflt-r0->ru_majflt); ! 145: break; ! 146: ! 147: case 'R': ! 148: printf("%d", r1->ru_minflt-r0->ru_minflt); ! 149: break; ! 150: ! 151: case 'I': ! 152: printf("%d", r1->ru_inblock-r0->ru_inblock); ! 153: break; ! 154: ! 155: case 'O': ! 156: printf("%d", r1->ru_oublock-r0->ru_oublock); ! 157: break; ! 158: } ! 159: putchar('\n'); ! 160: } ! 161: ! 162: pdeltat(t1, t0) ! 163: struct timeval *t1, *t0; ! 164: { ! 165: struct timeval td; ! 166: ! 167: tvsub(&td, t1, t0); ! 168: printf("%d.%01d", td.tv_sec, td.tv_usec/100000); ! 169: } ! 170: ! 171: tvadd(tsum, t0) ! 172: struct timeval *tsum, *t0; ! 173: { ! 174: ! 175: tsum->tv_sec += t0->tv_sec; ! 176: tsum->tv_usec += t0->tv_usec; ! 177: if (tsum->tv_usec > 1000000) ! 178: tsum->tv_sec++, tsum->tv_usec -= 1000000; ! 179: } ! 180: ! 181: tvsub(tdiff, t1, t0) ! 182: struct timeval *tdiff, *t1, *t0; ! 183: { ! 184: ! 185: tdiff->tv_sec = t1->tv_sec - t0->tv_sec; ! 186: tdiff->tv_usec = t1->tv_usec - t0->tv_usec; ! 187: if (tdiff->tv_usec < 0) ! 188: tdiff->tv_sec--, tdiff->tv_usec += 1000000; ! 189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.