X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/b34093218d7c5119d10c743d7aa00e4e48e5a71c..3ffa6b49df5b42905c5290d9e6c4e71de0d15fd6:/usr/src/bin/csh/proc.c diff --git a/usr/src/bin/csh/proc.c b/usr/src/bin/csh/proc.c index fdf3b69401..ee9735dc9c 100644 --- a/usr/src/bin/csh/proc.c +++ b/usr/src/bin/csh/proc.c @@ -1,9 +1,9 @@ -static char *sccsid = "@(#)proc.c 4.6 (Berkeley) 81/05/03"; +static char *sccsid = "@(#)proc.c 4.12 (Berkeley) 83/07/01"; #include "sh.h" #include "sh.dir.h" #include "sh.proc.h" -#include +#include #include /* @@ -26,19 +26,13 @@ pchild() register int pid; union wait w; int jobflags; -#ifdef VMUNIX - struct vtimes vt; -#endif + struct rusage ru; if (!timesdone) timesdone++, times(&shtimes); loop: pid = wait3(&w.w_status, (setintr ? WNOHANG|WUNTRACED:WNOHANG), -#ifndef VMUNIX - 0); -#else - &vt); -#endif + &ru); if (pid <= 0) { if (errno == EINTR) { errno = 0; @@ -63,15 +57,13 @@ found: time_t oldcutimes, oldcstimes; oldcutimes = shtimes.tms_cutime; oldcstimes = shtimes.tms_cstime; - time(&pp->p_etime); + gettimeofday(&pp->p_etime, (struct timezone *)0); times(&shtimes); pp->p_utime = shtimes.tms_cutime - oldcutimes; pp->p_stime = shtimes.tms_cstime - oldcstimes; } else times(&shtimes); -#ifdef VMUNIX - pp->p_vtimes = vt; -#endif + pp->p_rusage = ru; if (WIFSIGNALED(w)) { if (w.w_termsig == SIGINT) pp->p_flags |= PINTERRUPTED; @@ -82,11 +74,7 @@ found: pp->p_reason = w.w_termsig; } else { pp->p_reason = w.w_retcode; -#ifdef IIASA - if (pp->p_reason >= 3) -#else if (pp->p_reason != 0) -#endif pp->p_flags |= PAEXITED; else pp->p_flags |= PNEXITED; @@ -204,6 +192,8 @@ pjwait(pp) register struct process *fp; int jobflags, reason; + while (pp->p_pid != pp->p_jobid) + pp = pp->p_friends; fp = pp; do { if ((fp->p_flags&(PFOREGND|PRUNNING)) == PRUNNING) @@ -222,7 +212,7 @@ pjwait(pp) while((fp = (fp->p_friends)) != pp); if ((jobflags & PRUNNING) == 0) break; - sigpause(SIGCHLD); + sigpause(sigblock(0) &~ mask(SIGCHLD)); } sigrelse(SIGCHLD); if (tpgrp > 0) @@ -266,9 +256,9 @@ dowait() loop: sighold(SIGCHLD); for (pp = proclist.p_next; pp; pp = pp->p_next) - if (pp->p_pid && pp->p_pid == pp->p_jobid && + if (pp->p_pid && /* pp->p_pid == pp->p_jobid && */ pp->p_flags&PRUNNING) { - sigpause(SIGCHLD); + sigpause(sigblock(0) &~ mask(SIGCHLD)); goto loop; } sigrelse(SIGCHLD); @@ -410,7 +400,7 @@ palloc(pid, t) } pp->p_next = proclist.p_next; proclist.p_next = pp; - time(&pp->p_btime); + gettimeofday(&pp->p_btime, (struct timezone *)0); } padd(t) @@ -632,11 +622,10 @@ prcomd: if (pp->p_flags&PPTIME && !(status&(PSTOPPED|PRUNNING))) { if (linp != linbuf) printf("\n\t"); -#ifndef VMUNIX - ptimes(pp->p_utime, pp->p_stime, pp->p_etime-pp->p_btime); -#else - pvtimes(&zvms, &pp->p_vtimes, pp->p_etime - pp->p_btime); -#endif + { static struct rusage zru; + prusage(&zru, &pp->p_rusage, &pp->p_etime, + &pp->p_btime); + } } if (tp == pp->p_friends) { if (linp != linbuf) @@ -659,30 +648,21 @@ prcomd: ptprint(tp) register struct process *tp; { - time_t tetime = 0; -#ifdef VMUNIX - struct vtimes vmt; -#else - time_t tutime = 0, tstime = 0; -#endif + struct timeval tetime, diff; + static struct timeval ztime; + struct rusage ru; + static struct rusage zru; register struct process *pp = tp; - vmt = zvms; + ru = zru; + tetime = ztime; do { -#ifdef VMUNIX - vmsadd(&vmt, &pp->p_vtimes); -#else - tutime += pp->p_utime; - tstime += pp->p_stime; -#endif - if (pp->p_etime - pp->p_btime > tetime) - tetime = pp->p_etime - pp->p_btime; + ruadd(&ru, &pp->p_rusage); + tvsub(&diff, &pp->p_etime, &pp->p_btime); + if (timercmp(&diff, &tetime, >)) + tetime = diff; } while ((pp = pp->p_friends) != tp); -#ifdef VMUNIX - pvtimes(&zvms, &vmt, tetime); -#else - ptimes(tutime, tstime, tetime); -#endif + prusage(&zru, &ru, &tetime, &ztime); } /* @@ -833,6 +813,7 @@ pkill(v, signum) register struct process *pp, *np; register int jobflags = 0; int pid; + char *cp; extern char *sys_errlist[]; int err = 0; @@ -840,8 +821,9 @@ pkill(v, signum) sighold(SIGINT); sighold(SIGCHLD); while (*v) { - if (**v == '%') { - np = pp = pfind(*v); + cp = globone(*v); + if (*cp == '%') { + np = pp = pfind(cp); do jobflags |= np->p_flags; while ((np = np->p_friends) != pp); @@ -852,7 +834,7 @@ pkill(v, signum) case SIGTTIN: case SIGTTOU: if ((jobflags & PRUNNING) == 0) { - printf("%s: Already stopped\n", *v); + printf("%s: Already stopped\n", cp); err++; goto cont; } @@ -860,10 +842,10 @@ pkill(v, signum) killpg(pp->p_jobid, signum); if (signum == SIGTERM || signum == SIGHUP) killpg(pp->p_jobid, SIGCONT); - } else if (!digit(**v)) + } else if (!digit(*cp)) bferr("Arguments should be jobs or process id's"); else { - pid = atoi(*v); + pid = atoi(cp); if (kill(pid, signum) < 0) { printf("%d: ", pid); printf("%s\n", sys_errlist[errno]); @@ -874,6 +856,7 @@ pkill(v, signum) kill(pid, SIGCONT); } cont: + xfree(cp); v++; } sigrelse(SIGCHLD);