xref: /csrg-svn/bin/csh/time.c (revision 1306)
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(&times0);
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(&timesdol);
45*1306Sbill 	ptimes(timedol - time0, &times0, &timesdol);
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