* Copyright (c) 1980, 1991 The Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)time.c 5.14 (Berkeley) %G%";
* C Shell - routines handling process timing and niceing
static void pdeltat
__P((struct timeval
*, struct timeval
*));
(void) gettimeofday(&time0
, NULL
);
(void) getrusage(RUSAGE_SELF
, &ru0
);
(void) getrusage(RUSAGE_CHILDREN
, &ruch
);
* dotime is only called if it is truly a builtin function and not a
* prefix to another command
(void) getrusage(RUSAGE_SELF
, &ru1
);
(void) getrusage(RUSAGE_CHILDREN
, &ruch
);
(void) gettimeofday(&timedol
, NULL
);
prusage(&ru0
, &ru1
, &timedol
, &time0
);
* donice is only called when it on the line by itself or with a +- value
else if (*v
== 0 && any("+-", cp
[0]))
(void) setpriority(PRIO_PROCESS
, 0, nval
);
register struct rusage
*ru
, *ru2
;
tvadd(&ru
->ru_utime
, &ru2
->ru_utime
);
tvadd(&ru
->ru_stime
, &ru2
->ru_stime
);
if (ru2
->ru_maxrss
> ru
->ru_maxrss
)
ru
->ru_maxrss
= ru2
->ru_maxrss
;
ru
->ru_ixrss
+= ru2
->ru_ixrss
;
ru
->ru_idrss
+= ru2
->ru_idrss
;
ru
->ru_isrss
+= ru2
->ru_isrss
;
ru
->ru_minflt
+= ru2
->ru_minflt
;
ru
->ru_majflt
+= ru2
->ru_majflt
;
ru
->ru_nswap
+= ru2
->ru_nswap
;
ru
->ru_inblock
+= ru2
->ru_inblock
;
ru
->ru_oublock
+= ru2
->ru_oublock
;
ru
->ru_msgsnd
+= ru2
->ru_msgsnd
;
ru
->ru_msgrcv
+= ru2
->ru_msgrcv
;
ru
->ru_nsignals
+= ru2
->ru_nsignals
;
ru
->ru_nvcsw
+= ru2
->ru_nvcsw
;
ru
->ru_nivcsw
+= ru2
->ru_nivcsw
;
register struct rusage
*r0
, *r1
;
(r1
->ru_utime
.tv_sec
- r0
->ru_utime
.tv_sec
) * 100 +
(r1
->ru_utime
.tv_usec
- r0
->ru_utime
.tv_usec
) / 10000 +
(r1
->ru_stime
.tv_sec
- r0
->ru_stime
.tv_sec
) * 100 +
(r1
->ru_stime
.tv_usec
- r0
->ru_stime
.tv_usec
) / 10000;
register struct varent
*vp
= adrof(STRtime
);
(e
->tv_sec
- b
->tv_sec
) * 100 + (e
->tv_usec
- b
->tv_usec
) / 10000;
cp
= "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww";
if (vp
&& vp
->vec
[0] && vp
->vec
[1])
cp
= short2str(vp
->vec
[1]);
case 'U': /* user CPU time used */
pdeltat(&r1
->ru_utime
, &r0
->ru_utime
);
case 'S': /* system CPU time used */
pdeltat(&r1
->ru_stime
, &r0
->ru_stime
);
case 'E': /* elapsed (wall-clock) time */
case 'P': /* percent time spent running */
/* check if it did not run at all */
i
= (ms
== 0) ? 0 : (t
* 1000 / ms
);
xprintf("%ld.%01ld%%", i
/ 10, i
% 10); /* nn.n% */
case 'W': /* number of swaps */
i
= r1
->ru_nswap
- r0
->ru_nswap
;
case 'X': /* (average) shared text size */
xprintf("%ld", t
== 0 ? 0L : (r1
->ru_ixrss
- r0
->ru_ixrss
) / t
);
case 'D': /* (average) unshared data size */
xprintf("%ld", t
== 0 ? 0L :
(r1
->ru_idrss
+ r1
->ru_isrss
-
(r0
->ru_idrss
+ r0
->ru_isrss
)) / t
);
case 'K': /* (average) total data memory used */
xprintf("%ld", t
== 0 ? 0L :
((r1
->ru_ixrss
+ r1
->ru_isrss
+ r1
->ru_idrss
) -
(r0
->ru_ixrss
+ r0
->ru_idrss
+ r0
->ru_isrss
)) / t
);
case 'M': /* max. Resident Set Size */
xprintf("%ld", r1
->ru_maxrss
/ 2L);
case 'F': /* page faults */
xprintf("%ld", r1
->ru_majflt
- r0
->ru_majflt
);
case 'R': /* page reclaims */
xprintf("%ld", r1
->ru_minflt
- r0
->ru_minflt
);
case 'I': /* FS blocks in */
xprintf("%ld", r1
->ru_inblock
- r0
->ru_inblock
);
case 'O': /* FS blocks out */
xprintf("%ld", r1
->ru_oublock
- r0
->ru_oublock
);
case 'r': /* socket messages recieved */
xprintf("%ld", r1
->ru_msgrcv
- r0
->ru_msgrcv
);
case 's': /* socket messages sent */
xprintf("%ld", r1
->ru_msgsnd
- r0
->ru_msgsnd
);
case 'k': /* number of signals recieved */
xprintf("%ld", r1
->ru_nsignals
- r0
->ru_nsignals
);
case 'w': /* num. voluntary context switches (waits) */
xprintf("%ld", r1
->ru_nvcsw
- r0
->ru_nvcsw
);
case 'c': /* num. involuntary context switches */
xprintf("%ld", r1
->ru_nivcsw
- r0
->ru_nivcsw
);
xprintf("%d.%01d", td
.tv_sec
, td
.tv_usec
/ 100000);
struct timeval
*tsum
, *t0
;
tsum
->tv_sec
+= t0
->tv_sec
;
tsum
->tv_usec
+= t0
->tv_usec
;
if (tsum
->tv_usec
> 1000000)
tsum
->tv_sec
++, tsum
->tv_usec
-= 1000000;
struct timeval
*tdiff
, *t1
, *t0
;
tdiff
->tv_sec
= t1
->tv_sec
- t0
->tv_sec
;
tdiff
->tv_usec
= t1
->tv_usec
- t0
->tv_usec
;
tdiff
->tv_sec
--, tdiff
->tv_usec
+= 1000000;