X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/02c45551ed6e685f527b4a0b5f3031fe1c279d5b..943685687a914f34bb028d07fefeff4a802b6d5b:/usr/src/sys/kern/kern_exit.c diff --git a/usr/src/sys/kern/kern_exit.c b/usr/src/sys/kern/kern_exit.c index 2bd4ec4d41..375ce2db25 100644 --- a/usr/src/sys/kern/kern_exit.c +++ b/usr/src/sys/kern/kern_exit.c @@ -1,21 +1,21 @@ -/* kern_exit.c 4.2 83/05/31 */ +/* kern_exit.c 6.4 84/08/29 */ #include "../machine/reg.h" #include "../machine/psl.h" -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/map.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/kernel.h" -#include "../h/proc.h" -#include "../h/buf.h" -#include "../h/wait.h" -#include "../h/vm.h" -#include "../h/file.h" -#include "../h/mbuf.h" -#include "../h/inode.h" +#include "param.h" +#include "systm.h" +#include "map.h" +#include "dir.h" +#include "user.h" +#include "kernel.h" +#include "proc.h" +#include "buf.h" +#include "wait.h" +#include "vm.h" +#include "file.h" +#include "mbuf.h" +#include "inode.h" /* * Exit system call: pass back caller's arg @@ -41,7 +41,7 @@ exit(rv) int rv; { register int i; - register struct proc *p, *q; + register struct proc *p, *q, *nq; register int x; struct mbuf *m = m_getclr(M_WAIT, MT_ZOMBIE); @@ -51,14 +51,10 @@ exit(rv) p = u.u_procp; p->p_flag &= ~(STRC|SULOCK); p->p_flag |= SWEXIT; - (void) spl6(); - /* we know SIG_IGN is 1 */ - p->p_siga0 = ~0; - p->p_siga1 = 0; - (void) spl0(); + p->p_sigignore = ~0; p->p_cpticks = 0; p->p_pctcpu = 0; - for (i=0; ip_prev = p->p_nxt) /* off allproc queue */ + p->p_nxt->p_prev = p->p_prev; + if (p->p_nxt = zombproc) /* onto zombproc */ + p->p_nxt->p_prev = &p->p_nxt; + p->p_prev = &zombproc; + zombproc = p; multprog--; p->p_stat = SZOMB; noproc = 1; @@ -126,42 +123,41 @@ panic("exit: m_getclr"); p->p_ru = mtod(m, struct rusage *); *p->p_ru = u.u_ru; ruadd(p->p_ru, &u.u_cru); - for (q = proc; q < procNPROC; q++) - if (q->p_pptr == p) { - if (q->p_osptr) - q->p_osptr->p_ysptr = q->p_ysptr; - if (q->p_ysptr) - q->p_ysptr->p_osptr = q->p_osptr; - if (proc[1].p_cptr) - proc[1].p_cptr->p_ysptr = q; - q->p_osptr = proc[1].p_cptr; - q->p_ysptr = NULL; - proc[1].p_cptr = q; + if (p->p_cptr) /* only need this if any child is S_ZOMB */ + wakeup((caddr_t)&proc[1]); + for (q = p->p_cptr; q != NULL; q = nq) { + nq = q->p_osptr; + if (nq != NULL) + nq->p_ysptr = NULL; + if (proc[1].p_cptr) + proc[1].p_cptr->p_ysptr = q; + q->p_osptr = proc[1].p_cptr; + q->p_ysptr = NULL; + proc[1].p_cptr = q; - q->p_pptr = &proc[1]; - q->p_ppid = 1; - wakeup((caddr_t)&proc[1]); - /* - * Traced processes are killed - * since their existence means someone is screwing up. - * Stopped processes are sent a hangup and a continue. - * This is designed to be ``safe'' for setuid - * processes since they must be willing to tolerate - * hangups anyways. - */ - if (q->p_flag&STRC) { - q->p_flag &= ~STRC; - psignal(q, SIGKILL); - } else if (q->p_stat == SSTOP) { - psignal(q, SIGHUP); - psignal(q, SIGCONT); - } - /* - * Protect this process from future - * tty signals, clear TSTP/TTIN/TTOU if pending. - */ - (void) spgrp(q, -1); + q->p_pptr = &proc[1]; + q->p_ppid = 1; + /* + * Traced processes are killed + * since their existence means someone is screwing up. + * Stopped processes are sent a hangup and a continue. + * This is designed to be ``safe'' for setuid + * processes since they must be willing to tolerate + * hangups anyways. + */ + if (q->p_flag&STRC) { + q->p_flag &= ~STRC; + psignal(q, SIGKILL); + } else if (q->p_stat == SSTOP) { + psignal(q, SIGHUP); + psignal(q, SIGCONT); } + /* + * Protect this process from future + * tty signals, clear TSTP/TTIN/TTOU if pending. + */ + (void) spgrp(q, -1); + } psignal(p->p_pptr, SIGCHLD); wakeup((caddr_t)p->p_pptr); swtch(); @@ -179,7 +175,9 @@ wait() u.u_error = wait1(u.u_ar0[R0], &ru); if (u.u_error) return; - (void) copyout((caddr_t)&ru, (caddr_t)rup, sizeof (struct rusage)); + if (rup != (struct rusage *)0) + u.u_error = copyout((caddr_t)&ru, (caddr_t)rup, + sizeof (struct rusage)); } /* @@ -198,8 +196,8 @@ wait1(options, ru) f = 0; loop: - for (p = proc; p < procNPROC; p++) - if (p->p_pptr == u.u_procp) { + q = u.u_procp; + for (p = q->p_cptr; p; p = p->p_osptr) { f++; if (p->p_stat == SZOMB) { u.u_r.r_val1 = p->p_pid; @@ -213,6 +211,10 @@ loop: p->p_stat = NULL; p->p_pid = 0; p->p_ppid = 0; + if (*p->p_prev = p->p_nxt) /* off zombproc */ + p->p_nxt->p_prev = p->p_prev; + p->p_nxt = freeproc; /* onto freeproc */ + freeproc = p; if (q = p->p_ysptr) q->p_osptr = p->p_osptr; if (q = p->p_osptr) @@ -224,8 +226,9 @@ loop: p->p_osptr = 0; p->p_cptr = 0; p->p_sig = 0; - p->p_siga0 = 0; - p->p_siga1 = 0; + p->p_sigcatch = 0; + p->p_sigignore = 0; + p->p_sigmask = 0; p->p_pgrp = 0; p->p_flag = 0; p->p_wchan = 0; @@ -240,14 +243,13 @@ loop: return (0); } } - if (f == 0) { + if (f == 0) return (ECHILD); - } if (options&WNOHANG) { u.u_r.r_val1 = 0; return (0); } - if ((u.u_procp->p_flag&SNUSIG) && setjmp(&u.u_qsave)) { + if ((u.u_procp->p_flag&SOUSIG) == 0 && setjmp(&u.u_qsave)) { u.u_eosys = RESTARTSYS; return (0); }