1*1306Sbill static char *sccsid = "@(#)time.c 4.1 10/09/80"; 2*1306Sbill 3*1306Sbill #include "sh.h" 4*1306Sbill 5*1306Sbill /* 6*1306Sbill * C Shell - routines handling process timing and niceing 7*1306Sbill */ 8*1306Sbill #ifdef VMUNIX 9*1306Sbill struct vtimes vm0; 10*1306Sbill #else 11*1306Sbill struct tms times0; 12*1306Sbill struct tms timesdol; 13*1306Sbill #endif 14*1306Sbill 15*1306Sbill settimes() 16*1306Sbill { 17*1306Sbill 18*1306Sbill time(&time0); 19*1306Sbill #ifdef VMUNIX 20*1306Sbill vtimes(&vm0, 0); 21*1306Sbill #else 22*1306Sbill times(×0); 23*1306Sbill #endif 24*1306Sbill } 25*1306Sbill 26*1306Sbill /* 27*1306Sbill * dotime is only called if it is truly a builtin function and not a 28*1306Sbill * prefix to another command 29*1306Sbill */ 30*1306Sbill dotime() 31*1306Sbill { 32*1306Sbill time_t timedol; 33*1306Sbill #ifdef VMUNIX 34*1306Sbill struct vtimes vm1, vmch; 35*1306Sbill 36*1306Sbill vtimes(&vm1, &vmch); 37*1306Sbill vmsadd(&vm1, &vmch); 38*1306Sbill #endif 39*1306Sbill 40*1306Sbill time(&timedol); 41*1306Sbill #ifdef VMUNIX 42*1306Sbill pvtimes(&vm0, &vm1, timedol - time0); 43*1306Sbill #else 44*1306Sbill times(×dol); 45*1306Sbill ptimes(timedol - time0, ×0, ×dol); 46*1306Sbill #endif 47*1306Sbill } 48*1306Sbill 49*1306Sbill /* 50*1306Sbill * donice is only called when it on the line by itself or with a +- value 51*1306Sbill */ 52*1306Sbill donice(v) 53*1306Sbill register char **v; 54*1306Sbill { 55*1306Sbill register char *cp; 56*1306Sbill 57*1306Sbill v++, cp = *v++; 58*1306Sbill if (cp == 0) { 59*1306Sbill #ifndef V6 60*1306Sbill nice(20); 61*1306Sbill nice(-10); 62*1306Sbill #endif 63*1306Sbill nice(4); 64*1306Sbill } else if (*v == 0 && any(cp[0], "+-")) { 65*1306Sbill #ifndef V6 66*1306Sbill nice(20); 67*1306Sbill nice(-10); 68*1306Sbill #endif 69*1306Sbill nice(getn(cp)); 70*1306Sbill } 71*1306Sbill } 72*1306Sbill 73*1306Sbill #ifndef VMUNIX 74*1306Sbill ptimes(utime, stime, etime) 75*1306Sbill register time_t utime, stime, etime; 76*1306Sbill { 77*1306Sbill 78*1306Sbill p60ths(utime); 79*1306Sbill printf("u "); 80*1306Sbill p60ths(stime); 81*1306Sbill printf("s "); 82*1306Sbill psecs(etime); 83*1306Sbill printf(" %d%%\n", (int) (100 * (utime+stime) / 84*1306Sbill (60 * (etime ? etime : 1)))); 85*1306Sbill } 86*1306Sbill 87*1306Sbill #else 88*1306Sbill vmsadd(vp, wp) 89*1306Sbill register struct vtimes *vp, *wp; 90*1306Sbill { 91*1306Sbill 92*1306Sbill vp->vm_utime += wp->vm_utime; 93*1306Sbill vp->vm_stime += wp->vm_stime; 94*1306Sbill vp->vm_nswap += wp->vm_nswap; 95*1306Sbill vp->vm_idsrss += wp->vm_idsrss; 96*1306Sbill vp->vm_ixrss += wp->vm_ixrss; 97*1306Sbill if (vp->vm_maxrss < wp->vm_maxrss) 98*1306Sbill vp->vm_maxrss = wp->vm_maxrss; 99*1306Sbill vp->vm_majflt += wp->vm_majflt; 100*1306Sbill vp->vm_minflt += wp->vm_minflt; 101*1306Sbill vp->vm_inblk += wp->vm_inblk; 102*1306Sbill vp->vm_oublk += wp->vm_oublk; 103*1306Sbill } 104*1306Sbill 105*1306Sbill pvtimes(v0, v1, sec) 106*1306Sbill register struct vtimes *v0, *v1; 107*1306Sbill time_t sec; 108*1306Sbill { 109*1306Sbill register time_t t = 110*1306Sbill (v1->vm_utime-v0->vm_utime)+(v1->vm_stime-v0->vm_stime); 111*1306Sbill register char *cp; 112*1306Sbill register int i; 113*1306Sbill register struct varent *vp = adrof("time"); 114*1306Sbill 115*1306Sbill cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww"; 116*1306Sbill if (vp && vp->vec[0] && vp->vec[1]) 117*1306Sbill cp = vp->vec[1]; 118*1306Sbill for (; *cp; cp++) 119*1306Sbill if (*cp != '%') 120*1306Sbill putchar(*cp); 121*1306Sbill else if (cp[1]) switch(*++cp) { 122*1306Sbill 123*1306Sbill case 'U': 124*1306Sbill p60ths(v1->vm_utime - v0->vm_utime); 125*1306Sbill break; 126*1306Sbill 127*1306Sbill case 'S': 128*1306Sbill p60ths(v1->vm_stime - v0->vm_stime); 129*1306Sbill break; 130*1306Sbill 131*1306Sbill case 'E': 132*1306Sbill psecs(sec); 133*1306Sbill break; 134*1306Sbill 135*1306Sbill case 'P': 136*1306Sbill printf("%d%%", (int) ((100 * t) / (60 * (sec ? sec : 1)))); 137*1306Sbill break; 138*1306Sbill 139*1306Sbill case 'W': 140*1306Sbill i = v1->vm_nswap - v0->vm_nswap; 141*1306Sbill printf("%d", i); 142*1306Sbill break; 143*1306Sbill 144*1306Sbill case 'X': 145*1306Sbill printf("%d", t == 0 ? 0 : (v1->vm_ixrss-v0->vm_ixrss)/(2*t)); 146*1306Sbill break; 147*1306Sbill 148*1306Sbill case 'D': 149*1306Sbill printf("%d", t == 0 ? 0 : (v1->vm_idsrss-v0->vm_idsrss)/(2*t)); 150*1306Sbill break; 151*1306Sbill 152*1306Sbill case 'K': 153*1306Sbill printf("%d", t == 0 ? 0 : ((v1->vm_ixrss+v1->vm_idsrss) - 154*1306Sbill (v0->vm_ixrss+v0->vm_idsrss))/(2*t)); 155*1306Sbill break; 156*1306Sbill 157*1306Sbill case 'M': 158*1306Sbill printf("%d", v1->vm_maxrss/2); 159*1306Sbill break; 160*1306Sbill 161*1306Sbill case 'F': 162*1306Sbill printf("%d", v1->vm_majflt-v0->vm_majflt); 163*1306Sbill break; 164*1306Sbill 165*1306Sbill case 'R': 166*1306Sbill printf("%d", v1->vm_minflt-v0->vm_minflt); 167*1306Sbill break; 168*1306Sbill 169*1306Sbill case 'I': 170*1306Sbill printf("%d", v1->vm_inblk-v0->vm_inblk); 171*1306Sbill break; 172*1306Sbill 173*1306Sbill case 'O': 174*1306Sbill printf("%d", v1->vm_oublk-v0->vm_oublk); 175*1306Sbill break; 176*1306Sbill 177*1306Sbill } 178*1306Sbill putchar('\n'); 179*1306Sbill } 180*1306Sbill #endif 181