1/* $Header: /src/pub/tcsh/sh.time.c,v 3.28 2005/03/03 16:49:16 kim Exp $ */ |
2/* 3 * sh.time.c: Shell time keeping and printing. 4 */ 5/*- 6 * Copyright (c) 1980, 1991 The Regents of the University of California. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without --- 17 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33#include "sh.h" 34 |
35RCSID("$Id: sh.time.c,v 3.28 2005/03/03 16:49:16 kim Exp $") |
36 37#ifdef SUNOS4 38# include <machine/param.h> 39#endif /* SUNOS4 */ 40 41/* 42 * C Shell - routines handling process timing and niceing 43 */ --- 111 unchanged lines hidden (view full) --- 155} 156 157/* 158 * donice is only called when it on the line by itself or with a +- value 159 */ 160/*ARGSUSED*/ 161void 162donice(v, c) |
163 Char **v; |
164 struct command *c; 165{ |
166 Char *cp; |
167 int nval = 0; 168 169 USE(c); 170 v++, cp = *v++; 171 if (cp == 0) 172 nval = 4; 173 else if (*v == 0 && any("+-", cp[0])) 174 nval = getn(cp); |
175#ifdef HAVE_SETPRIORITY |
176 if (setpriority(PRIO_PROCESS, 0, nval) == -1 && errno) 177 stderror(ERR_SYSTEM, "setpriority", strerror(errno)); |
178#else /* !HAVE_SETPRIORITY */ |
179 (void) nice(nval); |
180#endif /* HAVE_SETPRIORITY */ |
181} 182 183#ifdef BSDTIMES 184void 185ruadd(ru, ru2) |
186 struct sysrusage *ru, *ru2; |
187{ 188 tvadd(&ru->ru_utime, &ru2->ru_utime); 189 tvadd(&ru->ru_stime, &ru2->ru_stime); |
190#ifndef _OSD_POSIX |
191 if (ru2->ru_maxrss > ru->ru_maxrss) 192 ru->ru_maxrss = ru2->ru_maxrss; 193 194 ru->ru_ixrss += ru2->ru_ixrss; 195 ru->ru_idrss += ru2->ru_idrss; 196 ru->ru_isrss += ru2->ru_isrss; 197 ru->ru_minflt += ru2->ru_minflt; 198 ru->ru_majflt += ru2->ru_majflt; 199 ru->ru_nswap += ru2->ru_nswap; 200 ru->ru_inblock += ru2->ru_inblock; 201 ru->ru_oublock += ru2->ru_oublock; 202 ru->ru_msgsnd += ru2->ru_msgsnd; 203 ru->ru_msgrcv += ru2->ru_msgrcv; 204 ru->ru_nsignals += ru2->ru_nsignals; 205 ru->ru_nvcsw += ru2->ru_nvcsw; 206 ru->ru_nivcsw += ru2->ru_nivcsw; |
207#endif /*bs2000*/ |
208 209# ifdef convex 210 tvadd(&ru->ru_exutime, &ru2->ru_exutime); 211 ru->ru_utotal += ru2->ru_utotal; 212 ru->ru_usamples += ru2->ru_usamples; 213 ru->ru_stotal += ru2->ru_stotal; 214 ru->ru_ssamples += ru2->ru_ssamples; 215# endif /* convex */ 216} 217 218#else /* BSDTIMES */ 219# ifdef _SEQUENT_ 220void 221ruadd(ru, ru2) |
222 struct process_stats *ru, *ru2; |
223{ 224 tvadd(&ru->ps_utime, &ru2->ps_utime); 225 tvadd(&ru->ps_stime, &ru2->ps_stime); 226 if (ru2->ps_maxrss > ru->ps_maxrss) 227 ru->ps_maxrss = ru2->ps_maxrss; 228 229 ru->ps_pagein += ru2->ps_pagein; 230 ru->ps_reclaim += ru2->ps_reclaim; --- 55 unchanged lines hidden (view full) --- 286# define IADJUST(i) (((i) << 10) / CLK_TCK * 100) 287# else /* convex */ 288# define IADJUST(i) (i) 289# endif /* convex */ 290#endif /* SUNOS4 */ 291 292void 293prusage(r0, r1, e, b) |
294 struct sysrusage *r0, *r1; |
295 timeval_t *e, *b; 296 297#else /* BSDTIMES */ 298# ifdef _SEQUENT_ 299void 300prusage(r0, r1, e, b) |
301 struct process_stats *r0, *r1; |
302 timeval_t *e, *b; 303 304# else /* _SEQUENT_ */ 305void 306prusage(bs, es, e, b) 307 struct tms *bs, *es; 308 309# ifndef POSIX 310 time_t e, b; 311 312# else /* POSIX */ 313 clock_t e, b; 314 315# endif /* POSIX */ 316# endif /* _SEQUENT_ */ 317#endif /* BSDTIMES */ 318{ 319#ifdef BSDTIMES |
320 time_t t = |
321 (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec) * 100 + 322 (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 10000 + 323 (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 100 + 324 (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 10000; 325 326#else 327# ifdef _SEQUENT_ |
328 time_t t = |
329 (r1->ps_utime.tv_sec - r0->ps_utime.tv_sec) * 100 + 330 (r1->ps_utime.tv_usec - r0->ps_utime.tv_usec) / 10000 + 331 (r1->ps_stime.tv_sec - r0->ps_stime.tv_sec) * 100 + 332 (r1->ps_stime.tv_usec - r0->ps_stime.tv_usec) / 10000; 333 334# else /* _SEQUENT_ */ 335# ifndef POSIX |
336 time_t t = (es->tms_utime - bs->tms_utime + |
337 es->tms_stime - bs->tms_stime) * 100 / HZ; 338 339# else /* POSIX */ |
340 clock_t t = (es->tms_utime - bs->tms_utime + |
341 es->tms_stime - bs->tms_stime) * 100 / clk_tck; 342 343# endif /* POSIX */ 344# endif /* _SEQUENT_ */ 345#endif /* BSDTIMES */ 346 |
347 const char *cp; 348 long i; 349 struct varent *vp = adrof(STRtime); |
350 351#ifdef BSDTIMES 352# ifdef convex 353 static struct system_information sysinfo; 354 long long memtmp; /* let memory calculations exceede 2Gb */ 355# endif /* convex */ 356 int ms = (int) 357 ((e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000); --- 100 unchanged lines hidden (view full) --- 458#else /* convex */ 459 i = (ms == 0) ? 0 : (long)(t * 1000.0 / ms); 460#endif /* convex */ 461 xprintf("%ld.%01ld%%", i / 10, i % 10); /* nn.n% */ 462 break; 463 464#ifdef BSDTIMES 465 case 'W': /* number of swaps */ |
466#ifdef _OSD_POSIX 467 i = 0; 468#else |
469 i = r1->ru_nswap - r0->ru_nswap; |
470#endif |
471 xprintf("%ld", i); 472 break; 473 474#ifdef convex 475 case 'X': /* (average) shared text size */ 476 memtmp = (t == 0 ? 0LL : IADJUST((long long)r1->ru_ixrss - 477 (long long)r0->ru_ixrss) / 478 (long long)t); --- 17 unchanged lines hidden (view full) --- 496 ((long long)r0->ru_ixrss + 497 (long long)r0->ru_idrss + 498 (long long)r0->ru_isrss)) / 499 (long long)t); 500 xprintf("%lu", (unsigned long)memtmp); 501 break; 502#else /* !convex */ 503 case 'X': /* (average) shared text size */ |
504#ifdef _OSD_POSIX 505 xprintf("0",0); 506#else |
507 xprintf("%ld", t == 0 ? 0L : 508 IADJUST(r1->ru_ixrss - r0->ru_ixrss) / t); |
509#endif |
510 break; 511 512 case 'D': /* (average) unshared data size */ |
513#ifdef _OSD_POSIX 514 xprintf("0",0); 515#else |
516 xprintf("%ld", t == 0 ? 0L : 517 IADJUST(r1->ru_idrss + r1->ru_isrss - 518 (r0->ru_idrss + r0->ru_isrss)) / t); |
519#endif |
520 break; 521 522 case 'K': /* (average) total data memory used */ |
523#ifdef _OSD_POSIX 524 xprintf("0",0); 525#else |
526 xprintf("%ld", t == 0 ? 0L : 527 IADJUST((r1->ru_ixrss + r1->ru_isrss + r1->ru_idrss) - 528 (r0->ru_ixrss + r0->ru_idrss + r0->ru_isrss)) / t); |
529#endif |
530 break; 531#endif /* convex */ 532 case 'M': /* max. Resident Set Size */ 533#ifdef SUNOS4 534 xprintf("%ld", pagetok(r1->ru_maxrss)); 535#else 536# ifdef convex 537 xprintf("%ld", r1->ru_maxrss * 4L); 538# else /* !convex */ |
539# ifdef _OSD_POSIX 540 xprintf("0",0); 541# else |
542 xprintf("%ld", r1->ru_maxrss / 2L); |
543# endif |
544# endif /* convex */ 545#endif /* SUNOS4 */ 546 break; 547 548 case 'F': /* page faults */ |
549#ifdef _OSD_POSIX 550 xprintf("0",0); 551#else |
552 xprintf("%ld", r1->ru_majflt - r0->ru_majflt); |
553#endif |
554 break; 555 556 case 'R': /* page reclaims */ |
557#ifdef _OSD_POSIX 558 xprintf("0",0); 559#else |
560 xprintf("%ld", r1->ru_minflt - r0->ru_minflt); |
561#endif |
562 break; 563 564 case 'I': /* FS blocks in */ |
565#ifdef _OSD_POSIX 566 xprintf("0",0); 567#else |
568 xprintf("%ld", r1->ru_inblock - r0->ru_inblock); |
569#endif |
570 break; 571 572 case 'O': /* FS blocks out */ |
573#ifdef _OSD_POSIX 574 xprintf("0",0); 575#else |
576 xprintf("%ld", r1->ru_oublock - r0->ru_oublock); |
577#endif |
578 break; 579 580# ifdef convex 581 case 'C': /* CPU parallelization factor */ 582 if (r1->ru_usamples != 0LL) { 583 long long parr = ((r1->ru_utotal * 100LL) / 584 r1->ru_usamples); 585 xprintf("%d.%02d", (int)(parr/100), (int)(parr%100)); 586 } else 587 xprintf("?"); 588 break; 589# endif /* convex */ 590 case 'r': /* PWP: socket messages recieved */ |
591#ifdef _OSD_POSIX 592 xprintf("0",0); 593#else |
594 xprintf("%ld", r1->ru_msgrcv - r0->ru_msgrcv); |
595#endif |
596 break; 597 598 case 's': /* PWP: socket messages sent */ |
599#ifdef _OSD_POSIX 600 xprintf("0",0); 601#else |
602 xprintf("%ld", r1->ru_msgsnd - r0->ru_msgsnd); |
603#endif |
604 break; 605 606 case 'k': /* PWP: signals received */ |
607#ifdef _OSD_POSIX 608 xprintf("0",0); 609#else |
610 xprintf("%ld", r1->ru_nsignals - r0->ru_nsignals); |
611#endif |
612 break; 613 614 case 'w': /* PWP: voluntary context switches (waits) */ |
615#ifdef _OSD_POSIX 616 xprintf("0",0); 617#else |
618 xprintf("%ld", r1->ru_nvcsw - r0->ru_nvcsw); |
619#endif |
620 break; 621 622 case 'c': /* PWP: involuntary context switches */ |
623#ifdef _OSD_POSIX 624 xprintf("0",0); 625#else |
626 xprintf("%ld", r1->ru_nivcsw - r0->ru_nivcsw); |
627#endif |
628 break; 629#else /* BSDTIMES */ 630# ifdef _SEQUENT_ 631 case 'W': /* number of swaps */ 632 i = r1->ps_swap - r0->ps_swap; 633 xprintf("%ld", i); 634 break; 635 --- 132 unchanged lines hidden --- |