145e5710bSMark Peek /*
2c80476e4SDavid E. O'Brien * sh.time.c: Shell time keeping and printing.
3c80476e4SDavid E. O'Brien */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California.
6c80476e4SDavid E. O'Brien * All rights reserved.
7c80476e4SDavid E. O'Brien *
8c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without
9c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions
10c80476e4SDavid E. O'Brien * are met:
11c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright
12c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer.
13c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright
14c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the
15c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution.
16c80476e4SDavid E. O'Brien * 3. Neither the name of the University nor the names of its contributors
1729301572SMark Peek * may be used to endorse or promote products derived from this software
18c80476e4SDavid E. O'Brien * without specific prior written permission.
19c80476e4SDavid E. O'Brien *
20c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien * SUCH DAMAGE.
31c80476e4SDavid E. O'Brien */
32c80476e4SDavid E. O'Brien #include "sh.h"
33c80476e4SDavid E. O'Brien #ifdef SUNOS4
34c80476e4SDavid E. O'Brien # include <machine/param.h>
3545e5710bSMark Peek #endif /* SUNOS4 */
36c80476e4SDavid E. O'Brien
37c80476e4SDavid E. O'Brien /*
38c80476e4SDavid E. O'Brien * C Shell - routines handling process timing and niceing
39c80476e4SDavid E. O'Brien */
40c80476e4SDavid E. O'Brien #ifdef BSDTIMES
41c80476e4SDavid E. O'Brien # ifndef RUSAGE_SELF
42c80476e4SDavid E. O'Brien # define RUSAGE_SELF 0
43c80476e4SDavid E. O'Brien # define RUSAGE_CHILDREN -1
44c80476e4SDavid E. O'Brien # endif /* RUSAGE_SELF */
45c80476e4SDavid E. O'Brien #else /* BSDTIMES */
46c80476e4SDavid E. O'Brien struct tms times0;
47c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
48c80476e4SDavid E. O'Brien
49c80476e4SDavid E. O'Brien #if !defined(BSDTIMES) && !defined(_SEQUENT_)
50c80476e4SDavid E. O'Brien # ifdef POSIX
51c80476e4SDavid E. O'Brien static void pdtimet (clock_t, clock_t);
52c80476e4SDavid E. O'Brien # else /* ! POSIX */
53c80476e4SDavid E. O'Brien static void pdtimet (time_t, time_t);
54c80476e4SDavid E. O'Brien # endif /* ! POSIX */
5545e5710bSMark Peek #else /* BSDTIMES || _SEQUENT_ */
56c80476e4SDavid E. O'Brien static void tvadd (timeval_t *, timeval_t *);
5745e5710bSMark Peek static void pdeltat (timeval_t *, timeval_t *);
58c80476e4SDavid E. O'Brien #endif /* BSDTIMES || _SEQUENT_ */
59c80476e4SDavid E. O'Brien
6045e5710bSMark Peek void
settimes(void)6145e5710bSMark Peek settimes(void)
62c80476e4SDavid E. O'Brien {
63c80476e4SDavid E. O'Brien #ifdef BSDTIMES
64c80476e4SDavid E. O'Brien struct sysrusage ruch;
6545e5710bSMark Peek #ifdef convex
66c80476e4SDavid E. O'Brien memset(&ru0, 0, sizeof(ru0));
67c80476e4SDavid E. O'Brien memset(&ruch, 0, sizeof(ruch));
68c80476e4SDavid E. O'Brien #endif /* convex */
69c80476e4SDavid E. O'Brien
70c80476e4SDavid E. O'Brien (void) gettimeofday(&time0, NULL);
71c80476e4SDavid E. O'Brien (void) getrusage(RUSAGE_SELF, (struct rusage *) &ru0);
72c80476e4SDavid E. O'Brien (void) getrusage(RUSAGE_CHILDREN, (struct rusage *) &ruch);
73c80476e4SDavid E. O'Brien ruadd(&ru0, &ruch);
74c80476e4SDavid E. O'Brien #else
75c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
76c80476e4SDavid E. O'Brien struct process_stats ruch;
77c80476e4SDavid E. O'Brien
78c80476e4SDavid E. O'Brien (void) get_process_stats(&time0, PS_SELF, &ru0, &ruch);
79c80476e4SDavid E. O'Brien ruadd(&ru0, &ruch);
80c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
81c80476e4SDavid E. O'Brien seconds0 = time(NULL);
82c80476e4SDavid E. O'Brien time0 = times(×0);
83c80476e4SDavid E. O'Brien times0.tms_stime += times0.tms_cstime;
84c80476e4SDavid E. O'Brien times0.tms_utime += times0.tms_cutime;
858e66bd9eSDavid E. O'Brien times0.tms_cstime = 0;
86c80476e4SDavid E. O'Brien times0.tms_cutime = 0;
87c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
88c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
89c80476e4SDavid E. O'Brien }
90c80476e4SDavid E. O'Brien
91c80476e4SDavid E. O'Brien /*
92c80476e4SDavid E. O'Brien * dotime is only called if it is truly a builtin function and not a
93c80476e4SDavid E. O'Brien * prefix to another command
94c80476e4SDavid E. O'Brien */
95c80476e4SDavid E. O'Brien /*ARGSUSED*/
96c80476e4SDavid E. O'Brien void
dotime(Char ** v,struct command * c)97c80476e4SDavid E. O'Brien dotime(Char **v, struct command *c)
98c80476e4SDavid E. O'Brien {
99c80476e4SDavid E. O'Brien #ifdef BSDTIMES
100c80476e4SDavid E. O'Brien timeval_t timedol;
10145e5710bSMark Peek struct sysrusage ru1, ruch;
102c80476e4SDavid E. O'Brien #ifdef convex
103c80476e4SDavid E. O'Brien memset(&ru1, 0, sizeof(ru1));
104c80476e4SDavid E. O'Brien memset(&ruch, 0, sizeof(ruch));
105c80476e4SDavid E. O'Brien #endif /* convex */
106c80476e4SDavid E. O'Brien
107c80476e4SDavid E. O'Brien (void) getrusage(RUSAGE_SELF, (struct rusage *) &ru1);
108c80476e4SDavid E. O'Brien (void) getrusage(RUSAGE_CHILDREN, (struct rusage *) &ruch);
109c80476e4SDavid E. O'Brien ruadd(&ru1, &ruch);
110c80476e4SDavid E. O'Brien (void) gettimeofday(&timedol, NULL);
111c80476e4SDavid E. O'Brien prusage(&ru0, &ru1, &timedol, &time0);
112c80476e4SDavid E. O'Brien #else
113c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
114c80476e4SDavid E. O'Brien timeval_t timedol;
115c80476e4SDavid E. O'Brien struct process_stats ru1, ruch;
116c80476e4SDavid E. O'Brien
117c80476e4SDavid E. O'Brien (void) get_process_stats(&timedol, PS_SELF, &ru1, &ruch);
118c80476e4SDavid E. O'Brien ruadd(&ru1, &ruch);
119c80476e4SDavid E. O'Brien prusage(&ru0, &ru1, &timedol, &time0);
120c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
121c80476e4SDavid E. O'Brien # ifndef POSIX
122c80476e4SDavid E. O'Brien time_t timedol;
123c80476e4SDavid E. O'Brien # else /* POSIX */
124c80476e4SDavid E. O'Brien clock_t timedol;
125c80476e4SDavid E. O'Brien # endif /* POSIX */
126c80476e4SDavid E. O'Brien
127c80476e4SDavid E. O'Brien struct tms times_dol;
128c80476e4SDavid E. O'Brien
129c80476e4SDavid E. O'Brien timedol = times(×_dol);
130c80476e4SDavid E. O'Brien times_dol.tms_stime += times_dol.tms_cstime;
131c80476e4SDavid E. O'Brien times_dol.tms_utime += times_dol.tms_cutime;
132c80476e4SDavid E. O'Brien times_dol.tms_cstime = 0;
133c80476e4SDavid E. O'Brien times_dol.tms_cutime = 0;
134c80476e4SDavid E. O'Brien prusage(×0, ×_dol, timedol, time0);
135c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
136c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
137c80476e4SDavid E. O'Brien USE(c);
138c80476e4SDavid E. O'Brien USE(v);
139c80476e4SDavid E. O'Brien }
140c80476e4SDavid E. O'Brien
141c80476e4SDavid E. O'Brien /*
142c80476e4SDavid E. O'Brien * donice is only called when it on the line by itself or with a +- value
143c80476e4SDavid E. O'Brien */
144c80476e4SDavid E. O'Brien /*ARGSUSED*/
145c80476e4SDavid E. O'Brien void
donice(Char ** v,struct command * c)146c80476e4SDavid E. O'Brien donice(Char **v, struct command *c)
147c80476e4SDavid E. O'Brien {
148c80476e4SDavid E. O'Brien Char *cp;
149c80476e4SDavid E. O'Brien int nval = 0;
15045e5710bSMark Peek
151c80476e4SDavid E. O'Brien USE(c);
15223338178SMark Peek v++, cp = *v++;
153c80476e4SDavid E. O'Brien if (cp == 0)
154c80476e4SDavid E. O'Brien nval = 4;
155c80476e4SDavid E. O'Brien else if (*v == 0 && any("+-", cp[0]))
156c80476e4SDavid E. O'Brien nval = getn(cp);
157c80476e4SDavid E. O'Brien #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
158c80476e4SDavid E. O'Brien if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno)
159c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, "setpriority", strerror(errno));
160c80476e4SDavid E. O'Brien #else /* !HAVE_SETPRIORITY || !PRIO_PROCESS */
16123338178SMark Peek (void) nice(nval);
1626767bd61SMark Peek #endif /* HAVE_SETPRIORITY && PRIO_PROCESS */
1636767bd61SMark Peek }
16423338178SMark Peek
165c80476e4SDavid E. O'Brien #ifdef BSDTIMES
16623338178SMark Peek void
ruadd(struct sysrusage * ru,struct sysrusage * ru2)167c80476e4SDavid E. O'Brien ruadd(struct sysrusage *ru, struct sysrusage *ru2)
168c80476e4SDavid E. O'Brien {
169c80476e4SDavid E. O'Brien tvadd(&ru->ru_utime, &ru2->ru_utime);
170c80476e4SDavid E. O'Brien tvadd(&ru->ru_stime, &ru2->ru_stime);
17145e5710bSMark Peek #ifndef _OSD_POSIX
172c80476e4SDavid E. O'Brien if (ru2->ru_maxrss > ru->ru_maxrss)
173c80476e4SDavid E. O'Brien ru->ru_maxrss = ru2->ru_maxrss;
174c80476e4SDavid E. O'Brien
17523338178SMark Peek ru->ru_ixrss += ru2->ru_ixrss;
176c80476e4SDavid E. O'Brien ru->ru_idrss += ru2->ru_idrss;
177c80476e4SDavid E. O'Brien ru->ru_isrss += ru2->ru_isrss;
178c80476e4SDavid E. O'Brien ru->ru_minflt += ru2->ru_minflt;
179c80476e4SDavid E. O'Brien ru->ru_majflt += ru2->ru_majflt;
180c80476e4SDavid E. O'Brien ru->ru_nswap += ru2->ru_nswap;
181c80476e4SDavid E. O'Brien ru->ru_inblock += ru2->ru_inblock;
182c80476e4SDavid E. O'Brien ru->ru_oublock += ru2->ru_oublock;
183c80476e4SDavid E. O'Brien ru->ru_msgsnd += ru2->ru_msgsnd;
184c80476e4SDavid E. O'Brien ru->ru_msgrcv += ru2->ru_msgrcv;
185c80476e4SDavid E. O'Brien ru->ru_nsignals += ru2->ru_nsignals;
186c80476e4SDavid E. O'Brien ru->ru_nvcsw += ru2->ru_nvcsw;
187c80476e4SDavid E. O'Brien ru->ru_nivcsw += ru2->ru_nivcsw;
188c80476e4SDavid E. O'Brien #endif /*bs2000*/
189c80476e4SDavid E. O'Brien
190c80476e4SDavid E. O'Brien # ifdef convex
191c80476e4SDavid E. O'Brien tvadd(&ru->ru_exutime, &ru2->ru_exutime);
19223338178SMark Peek ru->ru_utotal += ru2->ru_utotal;
193c80476e4SDavid E. O'Brien ru->ru_usamples += ru2->ru_usamples;
194c80476e4SDavid E. O'Brien ru->ru_stotal += ru2->ru_stotal;
195c80476e4SDavid E. O'Brien ru->ru_ssamples += ru2->ru_ssamples;
196c80476e4SDavid E. O'Brien # endif /* convex */
197c80476e4SDavid E. O'Brien }
198c80476e4SDavid E. O'Brien
199c80476e4SDavid E. O'Brien #else /* BSDTIMES */
200c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
201c80476e4SDavid E. O'Brien void
ruadd(struct process_stats * ru,struct process_stats * ru2)202c80476e4SDavid E. O'Brien ruadd(struct process_stats *ru, struct process_stats *ru2)
203c80476e4SDavid E. O'Brien {
204c80476e4SDavid E. O'Brien tvadd(&ru->ps_utime, &ru2->ps_utime);
205c80476e4SDavid E. O'Brien tvadd(&ru->ps_stime, &ru2->ps_stime);
20645e5710bSMark Peek if (ru2->ps_maxrss > ru->ps_maxrss)
207c80476e4SDavid E. O'Brien ru->ps_maxrss = ru2->ps_maxrss;
208c80476e4SDavid E. O'Brien
209c80476e4SDavid E. O'Brien ru->ps_pagein += ru2->ps_pagein;
210c80476e4SDavid E. O'Brien ru->ps_reclaim += ru2->ps_reclaim;
211c80476e4SDavid E. O'Brien ru->ps_zerofill += ru2->ps_zerofill;
212c80476e4SDavid E. O'Brien ru->ps_pffincr += ru2->ps_pffincr;
213c80476e4SDavid E. O'Brien ru->ps_pffdecr += ru2->ps_pffdecr;
214c80476e4SDavid E. O'Brien ru->ps_swap += ru2->ps_swap;
215c80476e4SDavid E. O'Brien ru->ps_syscall += ru2->ps_syscall;
216c80476e4SDavid E. O'Brien ru->ps_volcsw += ru2->ps_volcsw;
217c80476e4SDavid E. O'Brien ru->ps_involcsw += ru2->ps_involcsw;
218c80476e4SDavid E. O'Brien ru->ps_signal += ru2->ps_signal;
219c80476e4SDavid E. O'Brien ru->ps_lread += ru2->ps_lread;
220c80476e4SDavid E. O'Brien ru->ps_lwrite += ru2->ps_lwrite;
221c80476e4SDavid E. O'Brien ru->ps_bread += ru2->ps_bread;
222c80476e4SDavid E. O'Brien ru->ps_bwrite += ru2->ps_bwrite;
223c80476e4SDavid E. O'Brien ru->ps_phread += ru2->ps_phread;
224c80476e4SDavid E. O'Brien ru->ps_phwrite += ru2->ps_phwrite;
225c80476e4SDavid E. O'Brien }
226c80476e4SDavid E. O'Brien
227c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
228c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
229c80476e4SDavid E. O'Brien
230c80476e4SDavid E. O'Brien #ifdef BSDTIMES
231c80476e4SDavid E. O'Brien
232c80476e4SDavid E. O'Brien /*
233c80476e4SDavid E. O'Brien * PWP: the LOG1024 and pagetok stuff taken from the top command,
234c80476e4SDavid E. O'Brien * written by William LeFebvre
235c80476e4SDavid E. O'Brien */
236c80476e4SDavid E. O'Brien /* Log base 2 of 1024 is 10 (2^10 == 1024) */
237c80476e4SDavid E. O'Brien #define LOG1024 10
238c80476e4SDavid E. O'Brien
239c80476e4SDavid E. O'Brien /* Convert clicks (kernel pages) to kbytes ... */
240c80476e4SDavid E. O'Brien /* If there is no PGSHIFT defined, assume it is 11 */
241c80476e4SDavid E. O'Brien /* Is this needed for compatability with some old flavor of 4.2 or 4.1? */
242c80476e4SDavid E. O'Brien #ifdef SUNOS4
243c80476e4SDavid E. O'Brien # ifndef PGSHIFT
244c80476e4SDavid E. O'Brien # define pagetok(size) ((size) << 1)
245c80476e4SDavid E. O'Brien # else
246c80476e4SDavid E. O'Brien # if PGSHIFT>10
247c80476e4SDavid E. O'Brien # define pagetok(size) ((size) << (PGSHIFT - LOG1024))
248c80476e4SDavid E. O'Brien # else
249c80476e4SDavid E. O'Brien # define pagetok(size) ((size) >> (LOG1024 - PGSHIFT))
250c80476e4SDavid E. O'Brien # endif
251c80476e4SDavid E. O'Brien # endif
252c80476e4SDavid E. O'Brien #endif
253c80476e4SDavid E. O'Brien
254c80476e4SDavid E. O'Brien /*
255c80476e4SDavid E. O'Brien * if any other machines return wierd values in the ru_i* stuff, put
256c80476e4SDavid E. O'Brien * the adjusting macro here:
257c80476e4SDavid E. O'Brien */
258c80476e4SDavid E. O'Brien #ifdef SUNOS4
259c80476e4SDavid E. O'Brien # define IADJUST(i) (pagetok(i)/2)
260c80476e4SDavid E. O'Brien #else /* SUNOS4 */
261c80476e4SDavid E. O'Brien # ifdef convex
262c80476e4SDavid E. O'Brien /*
263c80476e4SDavid E. O'Brien * convex has megabytes * CLK_TCK
264c80476e4SDavid E. O'Brien * multiply by 100 since we use time in 100ths of a second in prusage
265c80476e4SDavid E. O'Brien */
266c80476e4SDavid E. O'Brien # define IADJUST(i) (((i) << 10) / CLK_TCK * 100)
267c80476e4SDavid E. O'Brien # else /* convex */
268c80476e4SDavid E. O'Brien # define IADJUST(i) (i)
269c80476e4SDavid E. O'Brien # endif /* convex */
270c80476e4SDavid E. O'Brien #endif /* SUNOS4 */
271c80476e4SDavid E. O'Brien
272c80476e4SDavid E. O'Brien void
prusage(struct sysrusage * r0,struct sysrusage * r1,timeval_t * e,timeval_t * b)273c80476e4SDavid E. O'Brien prusage(struct sysrusage *r0, struct sysrusage *r1, timeval_t *e, timeval_t *b)
274c80476e4SDavid E. O'Brien
275c80476e4SDavid E. O'Brien #else /* BSDTIMES */
276c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
27745e5710bSMark Peek void
278c80476e4SDavid E. O'Brien prusage(struct process_stats *r0, struct process_stats *r1, timeval_t e,
279c80476e4SDavid E. O'Brien timeval_t b)
280c80476e4SDavid E. O'Brien
281c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
28245e5710bSMark Peek # ifndef POSIX
28345e5710bSMark Peek void
284c80476e4SDavid E. O'Brien prusage(struct tms *bs, struct tms *es, time_t e, time_t b)
285c80476e4SDavid E. O'Brien # else /* POSIX */
286c80476e4SDavid E. O'Brien void
28745e5710bSMark Peek prusage(struct tms *bs, struct tms *es, clock_t e, clock_t b)
28845e5710bSMark Peek # endif /* POSIX */
289c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
29045e5710bSMark Peek #endif /* BSDTIMES */
29145e5710bSMark Peek {
292c80476e4SDavid E. O'Brien int ohaderr = haderr;
293c80476e4SDavid E. O'Brien #ifdef BSDTIMES
294c80476e4SDavid E. O'Brien time_t t =
295c80476e4SDavid E. O'Brien (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec) * 100 +
296c80476e4SDavid E. O'Brien (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 10000 +
29723338178SMark Peek (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 100 +
298c80476e4SDavid E. O'Brien (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 10000;
299c80476e4SDavid E. O'Brien
300c80476e4SDavid E. O'Brien #else
301c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
302c80476e4SDavid E. O'Brien time_t t =
303c80476e4SDavid E. O'Brien (r1->ps_utime.tv_sec - r0->ps_utime.tv_sec) * 100 +
304c80476e4SDavid E. O'Brien (r1->ps_utime.tv_usec - r0->ps_utime.tv_usec) / 10000 +
30523338178SMark Peek (r1->ps_stime.tv_sec - r0->ps_stime.tv_sec) * 100 +
306c80476e4SDavid E. O'Brien (r1->ps_stime.tv_usec - r0->ps_stime.tv_usec) / 10000;
307c80476e4SDavid E. O'Brien
308c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
309c80476e4SDavid E. O'Brien # ifndef POSIX
310c80476e4SDavid E. O'Brien time_t t = (es->tms_utime - bs->tms_utime +
311c80476e4SDavid E. O'Brien es->tms_stime - bs->tms_stime) * 100 / HZ;
312c80476e4SDavid E. O'Brien
31323338178SMark Peek # else /* POSIX */
314c80476e4SDavid E. O'Brien clock_t t = (es->tms_utime - bs->tms_utime +
315c80476e4SDavid E. O'Brien es->tms_stime - bs->tms_stime) * 100 / clk_tck;
316c80476e4SDavid E. O'Brien
31723338178SMark Peek # endif /* POSIX */
318c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
319c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
320c80476e4SDavid E. O'Brien
321c80476e4SDavid E. O'Brien const char *cp;
322c80476e4SDavid E. O'Brien long i;
323c80476e4SDavid E. O'Brien struct varent *vp = adrof(STRtime);
32423338178SMark Peek
32523338178SMark Peek #ifdef BSDTIMES
32623338178SMark Peek # ifdef convex
327c80476e4SDavid E. O'Brien static struct system_information sysinfo;
328c80476e4SDavid E. O'Brien long long memtmp; /* let memory calculations exceede 2Gb */
329c80476e4SDavid E. O'Brien # endif /* convex */
330c80476e4SDavid E. O'Brien int ms = (int)
331c80476e4SDavid E. O'Brien ((e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000);
332c80476e4SDavid E. O'Brien
333c80476e4SDavid E. O'Brien cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww";
334c80476e4SDavid E. O'Brien haderr = 0;
335c80476e4SDavid E. O'Brien #else /* !BSDTIMES */
336c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
337c80476e4SDavid E. O'Brien int ms = (int)
338c80476e4SDavid E. O'Brien ((e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000);
339c80476e4SDavid E. O'Brien
340c80476e4SDavid E. O'Brien cp = "%Uu %Ss %E %P %I+%Oio %Fpf+%Ww";
341c80476e4SDavid E. O'Brien haderr = 0;
342c80476e4SDavid E. O'Brien # else /* !_SEQUENT_ */
343c80476e4SDavid E. O'Brien # ifndef POSIX
344c80476e4SDavid E. O'Brien time_t ms = ((time_t)((e - b) / HZ) * 100) +
345c80476e4SDavid E. O'Brien (time_t)(((e - b) % HZ) * 100) / HZ;
346c80476e4SDavid E. O'Brien # else /* POSIX */
347c80476e4SDavid E. O'Brien clock_t ms = ((clock_t)((e - b) / clk_tck) * 100) +
348c80476e4SDavid E. O'Brien (clock_t)(((e - b) % clk_tck) * 100) / clk_tck;
349c80476e4SDavid E. O'Brien # endif /* POSIX */
350c80476e4SDavid E. O'Brien
351c80476e4SDavid E. O'Brien cp = "%Uu %Ss %E %P";
352c80476e4SDavid E. O'Brien haderr = 0;
353c80476e4SDavid E. O'Brien
354c80476e4SDavid E. O'Brien /*
355c80476e4SDavid E. O'Brien * the tms stuff is not very precise, so we fudge it.
356c80476e4SDavid E. O'Brien * granularity fix: can't be more than 100%
357c80476e4SDavid E. O'Brien * this breaks in multi-processor systems...
358c80476e4SDavid E. O'Brien * maybe I should take it out and let people see more then 100%
359c80476e4SDavid E. O'Brien * utilizations.
360c80476e4SDavid E. O'Brien */
361c80476e4SDavid E. O'Brien # if 0
362c80476e4SDavid E. O'Brien if (ms < t && ms != 0)
363c80476e4SDavid E. O'Brien ms = t;
364c80476e4SDavid E. O'Brien # endif
365c80476e4SDavid E. O'Brien # endif /*! _SEQUENT_ */
366c80476e4SDavid E. O'Brien #endif /* !BSDTIMES */
367c80476e4SDavid E. O'Brien #ifdef TDEBUG
368c80476e4SDavid E. O'Brien xprintf("es->tms_utime %lu bs->tms_utime %lu\n",
369c80476e4SDavid E. O'Brien (unsigned long)es->tms_utime, (unsigned long)bs->tms_utime);
370c80476e4SDavid E. O'Brien xprintf("es->tms_stime %lu bs->tms_stime %lu\n",
371c80476e4SDavid E. O'Brien (unsigned long)es->tms_stime, (unsigned long)bs->tms_stime);
372c80476e4SDavid E. O'Brien xprintf("ms %llu e %p b %p\n", (unsigned long long)ms, e, b);
373c80476e4SDavid E. O'Brien xprintf("t %llu\n", (unsigned long long)t);
374c80476e4SDavid E. O'Brien #endif /* TDEBUG */
375c80476e4SDavid E. O'Brien
37629301572SMark Peek if (vp && vp->vec && vp->vec[0] && vp->vec[1])
377c80476e4SDavid E. O'Brien cp = short2str(vp->vec[1]);
378c80476e4SDavid E. O'Brien for (; *cp; cp++)
379c80476e4SDavid E. O'Brien if (*cp != '%')
380c80476e4SDavid E. O'Brien xputchar(*cp);
381c80476e4SDavid E. O'Brien else if (cp[1])
382c80476e4SDavid E. O'Brien switch (*++cp) {
383c80476e4SDavid E. O'Brien
384c80476e4SDavid E. O'Brien case 'U': /* user CPU time used */
385c80476e4SDavid E. O'Brien #ifdef BSDTIMES
386c80476e4SDavid E. O'Brien pdeltat(&r1->ru_utime, &r0->ru_utime);
387c80476e4SDavid E. O'Brien #else
388c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
389c80476e4SDavid E. O'Brien pdeltat(&r1->ps_utime, &r0->ps_utime);
390c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
391c80476e4SDavid E. O'Brien # ifndef POSIX
392c80476e4SDavid E. O'Brien pdtimet(es->tms_utime, bs->tms_utime);
393c80476e4SDavid E. O'Brien # else /* POSIX */
394c80476e4SDavid E. O'Brien pdtimet(es->tms_utime, bs->tms_utime);
395c80476e4SDavid E. O'Brien # endif /* POSIX */
396c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
397c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
398c80476e4SDavid E. O'Brien break;
399c80476e4SDavid E. O'Brien
400c80476e4SDavid E. O'Brien case 'S': /* system CPU time used */
401c80476e4SDavid E. O'Brien #ifdef BSDTIMES
402c80476e4SDavid E. O'Brien pdeltat(&r1->ru_stime, &r0->ru_stime);
403c80476e4SDavid E. O'Brien #else
404c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
405c80476e4SDavid E. O'Brien pdeltat(&r1->ps_stime, &r0->ps_stime);
406c80476e4SDavid E. O'Brien # else /* _SEQUENT_ */
407c80476e4SDavid E. O'Brien # ifndef POSIX
408c80476e4SDavid E. O'Brien pdtimet(es->tms_stime, bs->tms_stime);
409c80476e4SDavid E. O'Brien # else /* POSIX */
410c80476e4SDavid E. O'Brien pdtimet(es->tms_stime, bs->tms_stime);
411c80476e4SDavid E. O'Brien # endif /* POSIX */
412c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
413c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
414c80476e4SDavid E. O'Brien break;
415c80476e4SDavid E. O'Brien
416c80476e4SDavid E. O'Brien case 'E': /* elapsed (wall-clock) time */
417c80476e4SDavid E. O'Brien #ifdef BSDTIMES
418c80476e4SDavid E. O'Brien pcsecs((long) ms);
419c80476e4SDavid E. O'Brien #else /* BSDTIMES */
420c80476e4SDavid E. O'Brien pcsecs(ms);
421c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
422c80476e4SDavid E. O'Brien break;
423c80476e4SDavid E. O'Brien
424c80476e4SDavid E. O'Brien case 'P': /* percent time spent running */
425c80476e4SDavid E. O'Brien /* check if the process did not run */
426c80476e4SDavid E. O'Brien #ifdef convex
427c80476e4SDavid E. O'Brien /*
428c80476e4SDavid E. O'Brien * scale the cpu %- ages by the number of processors
429c80476e4SDavid E. O'Brien * available on this machine
430c80476e4SDavid E. O'Brien */
431c80476e4SDavid E. O'Brien if ((sysinfo.cpu_count == 0) &&
432c80476e4SDavid E. O'Brien (getsysinfo(SYSINFO_SIZE, &sysinfo) < 0))
433c80476e4SDavid E. O'Brien sysinfo.cpu_count = 1;
4348e66bd9eSDavid E. O'Brien i = (ms == 0) ? 0 : (t * 1000.0 / (ms * sysinfo.cpu_count));
435c80476e4SDavid E. O'Brien #else /* convex */
436d9a02933SDavid E. O'Brien i = (ms == 0) ? 0 : (long)(t * 1000.0 / ms);
437c80476e4SDavid E. O'Brien #endif /* convex */
438c80476e4SDavid E. O'Brien xprintf("%ld.%01ld%%", i / 10, i % 10); /* nn.n% */
439c80476e4SDavid E. O'Brien break;
440c80476e4SDavid E. O'Brien
441c80476e4SDavid E. O'Brien #ifdef BSDTIMES
442c80476e4SDavid E. O'Brien case 'W': /* number of swaps */
44323338178SMark Peek #ifdef _OSD_POSIX
44423338178SMark Peek i = 0;
44523338178SMark Peek #else
446c80476e4SDavid E. O'Brien i = r1->ru_nswap - r0->ru_nswap;
44723338178SMark Peek #endif
448c80476e4SDavid E. O'Brien xprintf("%ld", i);
449c80476e4SDavid E. O'Brien break;
450c80476e4SDavid E. O'Brien
451c80476e4SDavid E. O'Brien #ifdef convex
452c80476e4SDavid E. O'Brien case 'X': /* (average) shared text size */
453c80476e4SDavid E. O'Brien memtmp = (t == 0 ? 0LL : IADJUST((long long)r1->ru_ixrss -
454c80476e4SDavid E. O'Brien (long long)r0->ru_ixrss) /
455c80476e4SDavid E. O'Brien (long long)t);
456c80476e4SDavid E. O'Brien xprintf("%lu", (unsigned long)memtmp);
457c80476e4SDavid E. O'Brien break;
458c80476e4SDavid E. O'Brien
459c80476e4SDavid E. O'Brien case 'D': /* (average) unshared data size */
460c80476e4SDavid E. O'Brien memtmp = (t == 0 ? 0LL : IADJUST((long long)r1->ru_idrss +
461c80476e4SDavid E. O'Brien (long long)r1->ru_isrss -
462c80476e4SDavid E. O'Brien ((long long)r0->ru_idrss +
463c80476e4SDavid E. O'Brien (long long)r0->ru_isrss)) /
464c80476e4SDavid E. O'Brien (long long)t);
465c80476e4SDavid E. O'Brien xprintf("%lu", (unsigned long)memtmp);
466c80476e4SDavid E. O'Brien break;
467c80476e4SDavid E. O'Brien
468c80476e4SDavid E. O'Brien case 'K': /* (average) total data memory used */
469c80476e4SDavid E. O'Brien memtmp = (t == 0 ? 0LL : IADJUST(((long long)r1->ru_ixrss +
470c80476e4SDavid E. O'Brien (long long)r1->ru_isrss +
471c80476e4SDavid E. O'Brien (long long)r1->ru_idrss) -
472c80476e4SDavid E. O'Brien ((long long)r0->ru_ixrss +
473c80476e4SDavid E. O'Brien (long long)r0->ru_idrss +
474c80476e4SDavid E. O'Brien (long long)r0->ru_isrss)) /
475c80476e4SDavid E. O'Brien (long long)t);
476c80476e4SDavid E. O'Brien xprintf("%lu", (unsigned long)memtmp);
477c80476e4SDavid E. O'Brien break;
478c80476e4SDavid E. O'Brien #else /* !convex */
479c80476e4SDavid E. O'Brien case 'X': /* (average) shared text size */
48023338178SMark Peek #ifdef _OSD_POSIX
48123338178SMark Peek xprintf("0",0);
48223338178SMark Peek #else
483c80476e4SDavid E. O'Brien xprintf("%lld", (long long)(t == 0 ? 0L :
484c80476e4SDavid E. O'Brien IADJUST(r1->ru_ixrss - r0->ru_ixrss) / t));
48523338178SMark Peek #endif
486c80476e4SDavid E. O'Brien break;
487c80476e4SDavid E. O'Brien
488c80476e4SDavid E. O'Brien case 'D': /* (average) unshared data size */
48923338178SMark Peek #ifdef _OSD_POSIX
49023338178SMark Peek xprintf("0",0);
49123338178SMark Peek #else
492c80476e4SDavid E. O'Brien xprintf("%lld", (long long)(t == 0 ? 0L :
493c80476e4SDavid E. O'Brien IADJUST(r1->ru_idrss + r1->ru_isrss -
494c80476e4SDavid E. O'Brien (r0->ru_idrss + r0->ru_isrss)) / t));
49523338178SMark Peek #endif
496c80476e4SDavid E. O'Brien break;
497c80476e4SDavid E. O'Brien
498c80476e4SDavid E. O'Brien case 'K': /* (average) total data memory used */
49923338178SMark Peek #ifdef _OSD_POSIX
50023338178SMark Peek xprintf("0",0);
50123338178SMark Peek #else
502c80476e4SDavid E. O'Brien xprintf("%lld", (long long)(t == 0 ? 0L :
503c80476e4SDavid E. O'Brien IADJUST((r1->ru_ixrss + r1->ru_isrss + r1->ru_idrss) -
504c80476e4SDavid E. O'Brien (r0->ru_ixrss + r0->ru_idrss + r0->ru_isrss)) / t));
50523338178SMark Peek #endif
506c80476e4SDavid E. O'Brien break;
507c80476e4SDavid E. O'Brien #endif /* convex */
508c80476e4SDavid E. O'Brien case 'M': /* max. Resident Set Size */
509c80476e4SDavid E. O'Brien #ifdef SUNOS4
510c80476e4SDavid E. O'Brien xprintf("%ld", (long)pagetok(r1->ru_maxrss));
511c80476e4SDavid E. O'Brien #else
512c80476e4SDavid E. O'Brien # ifdef convex
513c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_maxrss * 4L));
514c80476e4SDavid E. O'Brien # else /* !convex */
51523338178SMark Peek # ifdef _OSD_POSIX
51623338178SMark Peek xprintf("0",0);
51723338178SMark Peek # else
518c80476e4SDavid E. O'Brien xprintf("%ld", (long)r1->ru_maxrss);
51923338178SMark Peek # endif
520c80476e4SDavid E. O'Brien # endif /* convex */
521c80476e4SDavid E. O'Brien #endif /* SUNOS4 */
522c80476e4SDavid E. O'Brien break;
523c80476e4SDavid E. O'Brien
524c80476e4SDavid E. O'Brien case 'F': /* page faults */
52523338178SMark Peek #ifdef _OSD_POSIX
52623338178SMark Peek xprintf("0",0);
52723338178SMark Peek #else
528c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_majflt - r0->ru_majflt));
52923338178SMark Peek #endif
530c80476e4SDavid E. O'Brien break;
531c80476e4SDavid E. O'Brien
532c80476e4SDavid E. O'Brien case 'R': /* page reclaims */
53323338178SMark Peek #ifdef _OSD_POSIX
53423338178SMark Peek xprintf("0",0);
53523338178SMark Peek #else
536c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_minflt - r0->ru_minflt));
53723338178SMark Peek #endif
538c80476e4SDavid E. O'Brien break;
539c80476e4SDavid E. O'Brien
540c80476e4SDavid E. O'Brien case 'I': /* FS blocks in */
54123338178SMark Peek #ifdef _OSD_POSIX
54223338178SMark Peek xprintf("0",0);
54323338178SMark Peek #else
544c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_inblock - r0->ru_inblock));
54523338178SMark Peek #endif
546c80476e4SDavid E. O'Brien break;
547c80476e4SDavid E. O'Brien
548c80476e4SDavid E. O'Brien case 'O': /* FS blocks out */
54923338178SMark Peek #ifdef _OSD_POSIX
55023338178SMark Peek xprintf("0",0);
55123338178SMark Peek #else
552c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_oublock - r0->ru_oublock));
55323338178SMark Peek #endif
554c80476e4SDavid E. O'Brien break;
555c80476e4SDavid E. O'Brien
556c80476e4SDavid E. O'Brien # ifdef convex
557c80476e4SDavid E. O'Brien case 'C': /* CPU parallelization factor */
558c80476e4SDavid E. O'Brien if (r1->ru_usamples != 0LL) {
559c80476e4SDavid E. O'Brien long long parr = ((r1->ru_utotal * 100LL) /
560c80476e4SDavid E. O'Brien r1->ru_usamples);
561c80476e4SDavid E. O'Brien xprintf("%d.%02d", (int)(parr/100), (int)(parr%100));
562c80476e4SDavid E. O'Brien } else
563c80476e4SDavid E. O'Brien xprintf("?");
564c80476e4SDavid E. O'Brien break;
565c80476e4SDavid E. O'Brien # endif /* convex */
566c80476e4SDavid E. O'Brien case 'r': /* PWP: socket messages recieved */
56723338178SMark Peek #ifdef _OSD_POSIX
56823338178SMark Peek xprintf("0",0);
56923338178SMark Peek #else
570c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_msgrcv - r0->ru_msgrcv));
57123338178SMark Peek #endif
572c80476e4SDavid E. O'Brien break;
573c80476e4SDavid E. O'Brien
574c80476e4SDavid E. O'Brien case 's': /* PWP: socket messages sent */
57523338178SMark Peek #ifdef _OSD_POSIX
57623338178SMark Peek xprintf("0",0);
57723338178SMark Peek #else
578c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_msgsnd - r0->ru_msgsnd));
57923338178SMark Peek #endif
580c80476e4SDavid E. O'Brien break;
581c80476e4SDavid E. O'Brien
582c80476e4SDavid E. O'Brien case 'k': /* PWP: signals received */
58323338178SMark Peek #ifdef _OSD_POSIX
58423338178SMark Peek xprintf("0",0);
58523338178SMark Peek #else
586c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_nsignals - r0->ru_nsignals));
58723338178SMark Peek #endif
588c80476e4SDavid E. O'Brien break;
589c80476e4SDavid E. O'Brien
590c80476e4SDavid E. O'Brien case 'w': /* PWP: voluntary context switches (waits) */
59123338178SMark Peek #ifdef _OSD_POSIX
59223338178SMark Peek xprintf("0",0);
59323338178SMark Peek #else
594c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_nvcsw - r0->ru_nvcsw));
59523338178SMark Peek #endif
596c80476e4SDavid E. O'Brien break;
597c80476e4SDavid E. O'Brien
598c80476e4SDavid E. O'Brien case 'c': /* PWP: involuntary context switches */
59923338178SMark Peek #ifdef _OSD_POSIX
60023338178SMark Peek xprintf("0",0);
60123338178SMark Peek #else
602c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ru_nivcsw - r0->ru_nivcsw));
60323338178SMark Peek #endif
604c80476e4SDavid E. O'Brien break;
605c80476e4SDavid E. O'Brien #else /* BSDTIMES */
606c80476e4SDavid E. O'Brien # ifdef _SEQUENT_
607c80476e4SDavid E. O'Brien case 'W': /* number of swaps */
608c80476e4SDavid E. O'Brien i = r1->ps_swap - r0->ps_swap;
609c80476e4SDavid E. O'Brien xprintf("%ld", (long)i);
610c80476e4SDavid E. O'Brien break;
611c80476e4SDavid E. O'Brien
612c80476e4SDavid E. O'Brien case 'M':
613c80476e4SDavid E. O'Brien xprintf("%ld", (long)r1->ps_maxrss);
614c80476e4SDavid E. O'Brien break;
615c80476e4SDavid E. O'Brien
616c80476e4SDavid E. O'Brien case 'F':
617c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_pagein - r0->ps_pagein));
618c80476e4SDavid E. O'Brien break;
619c80476e4SDavid E. O'Brien
620c80476e4SDavid E. O'Brien case 'R':
621c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_reclaim - r0->ps_reclaim));
622c80476e4SDavid E. O'Brien break;
623c80476e4SDavid E. O'Brien
624c80476e4SDavid E. O'Brien case 'I':
625c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_bread - r0->ps_bread));
626c80476e4SDavid E. O'Brien break;
627c80476e4SDavid E. O'Brien
628c80476e4SDavid E. O'Brien case 'O':
629c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_bwrite - r0->ps_bwrite));
630c80476e4SDavid E. O'Brien break;
631c80476e4SDavid E. O'Brien
632c80476e4SDavid E. O'Brien case 'k':
633c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_signal - r0->ps_signal));
634c80476e4SDavid E. O'Brien break;
635c80476e4SDavid E. O'Brien
636c80476e4SDavid E. O'Brien case 'w':
637c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_volcsw - r0->ps_volcsw));
638c80476e4SDavid E. O'Brien break;
639c80476e4SDavid E. O'Brien
640c80476e4SDavid E. O'Brien case 'c':
641c80476e4SDavid E. O'Brien xprintf("%ld", r1->ps_involcsw - r0->ps_involcsw);
642c80476e4SDavid E. O'Brien break;
643c80476e4SDavid E. O'Brien
644c80476e4SDavid E. O'Brien case 'Z':
645c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_zerofill - r0->ps_zerofill));
646c80476e4SDavid E. O'Brien break;
647c80476e4SDavid E. O'Brien
648c80476e4SDavid E. O'Brien case 'i':
649c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_pffincr - r0->ps_pffincr));
650c80476e4SDavid E. O'Brien break;
651c80476e4SDavid E. O'Brien
652c80476e4SDavid E. O'Brien case 'd':
653c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_pffdecr - r0->ps_pffdecr));
654c80476e4SDavid E. O'Brien break;
655c80476e4SDavid E. O'Brien
656c80476e4SDavid E. O'Brien case 'Y':
657c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_syscall - r0->ps_syscall));
658c80476e4SDavid E. O'Brien break;
659c80476e4SDavid E. O'Brien
660c80476e4SDavid E. O'Brien case 'l':
661c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_lread - r0->ps_lread));
662c80476e4SDavid E. O'Brien break;
663c80476e4SDavid E. O'Brien
664c80476e4SDavid E. O'Brien case 'm':
665c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_lwrite - r0->ps_lwrite));
666c80476e4SDavid E. O'Brien break;
667c80476e4SDavid E. O'Brien
668c80476e4SDavid E. O'Brien case 'p':
669c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_phread - r0->ps_phread));
670c80476e4SDavid E. O'Brien break;
671c80476e4SDavid E. O'Brien
672c80476e4SDavid E. O'Brien case 'q':
673c80476e4SDavid E. O'Brien xprintf("%ld", (long)(r1->ps_phwrite - r0->ps_phwrite));
674c80476e4SDavid E. O'Brien break;
675c80476e4SDavid E. O'Brien # endif /* _SEQUENT_ */
676c80476e4SDavid E. O'Brien #endif /* BSDTIMES */
677c80476e4SDavid E. O'Brien default:
678c80476e4SDavid E. O'Brien break;
679c80476e4SDavid E. O'Brien }
680c80476e4SDavid E. O'Brien xputchar('\n');
681c80476e4SDavid E. O'Brien haderr = ohaderr;
682c80476e4SDavid E. O'Brien }
683c80476e4SDavid E. O'Brien
684c80476e4SDavid E. O'Brien #if defined(BSDTIMES) || defined(_SEQUENT_)
68545e5710bSMark Peek static void
pdeltat(timeval_t * t1,timeval_t * t0)686c80476e4SDavid E. O'Brien pdeltat(timeval_t *t1, timeval_t *t0)
687c80476e4SDavid E. O'Brien {
688c80476e4SDavid E. O'Brien timeval_t td;
689c80476e4SDavid E. O'Brien
690c80476e4SDavid E. O'Brien tvsub(&td, t1, t0);
691c80476e4SDavid E. O'Brien xprintf("%lld.%03ld", (long long)td.tv_sec, (long)td.tv_usec / 1000L);
692c80476e4SDavid E. O'Brien }
693c80476e4SDavid E. O'Brien
69445e5710bSMark Peek static void
tvadd(timeval_t * tsum,timeval_t * t0)695c80476e4SDavid E. O'Brien tvadd(timeval_t *tsum, timeval_t *t0)
696c80476e4SDavid E. O'Brien {
697c80476e4SDavid E. O'Brien
698c80476e4SDavid E. O'Brien tsum->tv_sec += t0->tv_sec;
699c80476e4SDavid E. O'Brien tsum->tv_usec += t0->tv_usec;
700c80476e4SDavid E. O'Brien if (tsum->tv_usec >= 1000000)
701c80476e4SDavid E. O'Brien tsum->tv_sec++, tsum->tv_usec -= 1000000;
702c80476e4SDavid E. O'Brien }
703c80476e4SDavid E. O'Brien
70445e5710bSMark Peek void
tvsub(timeval_t * tdiff,timeval_t * t1,timeval_t * t0)705c80476e4SDavid E. O'Brien tvsub(timeval_t *tdiff, timeval_t *t1, timeval_t *t0)
706c80476e4SDavid E. O'Brien {
707c80476e4SDavid E. O'Brien
708c80476e4SDavid E. O'Brien tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
709c80476e4SDavid E. O'Brien tdiff->tv_usec = t1->tv_usec - t0->tv_usec;
710c80476e4SDavid E. O'Brien if (tdiff->tv_usec < 0)
711c80476e4SDavid E. O'Brien tdiff->tv_sec--, tdiff->tv_usec += 1000000;
712c80476e4SDavid E. O'Brien }
713c80476e4SDavid E. O'Brien
714c80476e4SDavid E. O'Brien #else /* !BSDTIMES && !_SEQUENT_ */
715c80476e4SDavid E. O'Brien static void
71645e5710bSMark Peek #ifndef POSIX
pdtimet(time_t eval,time_t bval)717c80476e4SDavid E. O'Brien pdtimet(time_t eval, time_t bval)
718c80476e4SDavid E. O'Brien
71945e5710bSMark Peek #else /* POSIX */
720c80476e4SDavid E. O'Brien pdtimet(clock_t eval, clock_t bval)
721c80476e4SDavid E. O'Brien
722c80476e4SDavid E. O'Brien #endif /* POSIX */
723c80476e4SDavid E. O'Brien {
724c80476e4SDavid E. O'Brien #ifndef POSIX
725c80476e4SDavid E. O'Brien time_t val;
726c80476e4SDavid E. O'Brien
727c80476e4SDavid E. O'Brien #else /* POSIX */
728c80476e4SDavid E. O'Brien clock_t val;
729c80476e4SDavid E. O'Brien
730c80476e4SDavid E. O'Brien #endif /* POSIX */
731c80476e4SDavid E. O'Brien
732c80476e4SDavid E. O'Brien #ifndef POSIX
733c80476e4SDavid E. O'Brien val = (eval - bval) * 100 / HZ;
734c80476e4SDavid E. O'Brien #else /* POSIX */
735c80476e4SDavid E. O'Brien val = (eval - bval) * 100 / clk_tck;
736c80476e4SDavid E. O'Brien #endif /* POSIX */
737c80476e4SDavid E. O'Brien
738c80476e4SDavid E. O'Brien xprintf("%lld.%02ld", (long long)(val / 100),
739c80476e4SDavid E. O'Brien (long long)(val - (val / 100 * 100)));
740 }
741 #endif /* BSDTIMES || _SEQUENT_ */
742