diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1999-01-10 02:20:21 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1999-01-10 02:20:21 +0000 |
commit | a4ea7ab3f6f192b870945f28eb20a444fc365a89 (patch) | |
tree | 3dbc5c9b8ee35e7f1ad89177da324f03df01fb16 /sys | |
parent | 40a4ee3d14430dc3d7820866cc688e3fb4f1e05e (diff) |
Make RFNOWAIT work in rfork(2)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_exit.c | 10 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 12 | ||||
-rw-r--r-- | sys/sys/proc.h | 46 |
3 files changed, 32 insertions, 36 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index ad9d12bfab8..d925d666908 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exit.c,v 1.12 1997/11/06 05:58:16 csapuntz Exp $ */ +/* $OpenBSD: kern_exit.c,v 1.13 1999/01/10 02:20:20 niklas Exp $ */ /* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */ /* @@ -244,11 +244,11 @@ exit1(p, rv) p->p_pctcpu = 0; /* - * Notify parent that we're gone. If parent has the P_NOCLDWAIT - * flag set, notify process 1 instead (and hope it will handle - * this situation). + * Notify parent that we're gone. If we have P_NOWAIT or parent has + * the P_NOCLDWAIT flag set, notify process 1 instead (and hope it + * will handle this situation). */ - if (p->p_pptr->p_flag & P_NOCLDWAIT) { + if ((p->p_flag & P_NOZOMBIE) || (p->p_pptr->p_flag & P_NOCLDWAIT)) { struct proc *pp = p->p_pptr; proc_reparent(p, initproc); /* diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index c0b75327368..086b76a755a 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.11 1997/08/01 22:54:49 deraadt Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.12 1999/01/10 02:20:20 niklas Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -64,12 +64,6 @@ int nprocs = 1; /* process 0 */ int randompid; /* when set to 1, pid's go random */ pid_t lastpid; -#define ISFORK 0 -#define ISVFORK 1 -#define ISRFORK 2 - -int fork1 __P((struct proc *, int, int, register_t *)); - /*ARGSUSED*/ int sys_fork(p, v, retval) @@ -126,8 +120,6 @@ fork1(p1, forktype, rforkflags, retval) return (EINVAL); if (rforkflags & RFFDG) dupfd = 1; - if (rforkflags & RFNOWAIT) - return (EINVAL); /* XXX unimplimented */ if (rforkflags & RFCFDG) cleanfd = 1; } @@ -268,7 +260,7 @@ again: LIST_INSERT_AFTER(p1, p2, p_pglist); p2->p_pptr = p1; if (rforkflags & RFNOWAIT) { - /* XXX should we do anything? */ + p2->p_flag |= P_NOZOMBIE; } else { LIST_INSERT_HEAD(&p1->p_children, p2, p_sibling); } diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0f2a4fa9f08..d8f714fdb05 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.21 1999/01/05 00:43:20 deraadt Exp $ */ +/* $OpenBSD: proc.h,v 1.22 1999/01/10 02:20:19 niklas Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -211,31 +211,32 @@ struct proc { #define SZOMB 5 /* Awaiting collection by parent. */ /* These flags are kept in p_flag. */ -#define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ -#define P_CONTROLT 0x00002 /* Has a controlling terminal. */ -#define P_INMEM 0x00004 /* Loaded into memory. */ -#define P_NOCLDSTOP 0x00008 /* No SIGCHLD when children stop. */ -#define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ -#define P_PROFIL 0x00020 /* Has started profiling. */ -#define P_SELECT 0x00040 /* Selecting; wakeup/waiting danger. */ -#define P_SINTR 0x00080 /* Sleep is interruptible. */ -#define P_SUGID 0x00100 /* Had set id privileges since last exec. */ -#define P_SYSTEM 0x00200 /* System proc: no sigs, stats or swapping. */ -#define P_TIMEOUT 0x00400 /* Timing out during sleep. */ -#define P_TRACED 0x00800 /* Debugged process being traced. */ -#define P_WAITED 0x01000 /* Debugging process has waited for child. */ -#define P_WEXIT 0x02000 /* Working on exiting. */ -#define P_EXEC 0x04000 /* Process called exec. */ +#define P_ADVLOCK 0x000001 /* Proc may hold a POSIX adv. lock. */ +#define P_CONTROLT 0x000002 /* Has a controlling terminal. */ +#define P_INMEM 0x000004 /* Loaded into memory. */ +#define P_NOCLDSTOP 0x000008 /* No SIGCHLD when children stop. */ +#define P_PPWAIT 0x000010 /* Parent waits for child exec/exit. */ +#define P_PROFIL 0x000020 /* Has started profiling. */ +#define P_SELECT 0x000040 /* Selecting; wakeup/waiting danger. */ +#define P_SINTR 0x000080 /* Sleep is interruptible. */ +#define P_SUGID 0x000100 /* Had set id privs since last exec. */ +#define P_SYSTEM 0x000200 /* No sigs, stats or swapping. */ +#define P_TIMEOUT 0x000400 /* Timing out during sleep. */ +#define P_TRACED 0x000800 /* Debugged process being traced. */ +#define P_WAITED 0x001000 /* Debugging proc has waited for child. */ +#define P_WEXIT 0x002000 /* Working on exiting. */ +#define P_EXEC 0x004000 /* Process called exec. */ /* Should be moved to machine-dependent areas. */ -#define P_OWEUPC 0x08000 /* Owe process an addupc() call at next ast. */ +#define P_OWEUPC 0x008000 /* Owe proc an addupc() at next ast. */ /* XXX Not sure what to do with these, yet. */ -#define P_FSTRACE 0x10000 /* tracing via file system (elsewhere?) */ -#define P_SSTEP 0x20000 /* process needs single-step fixup ??? */ -#define P_SUGIDEXEC 0x40000 /* last execve() was a setuid/setgid execve() */ +#define P_FSTRACE 0x010000 /* tracing via fs (elsewhere?) */ +#define P_SSTEP 0x020000 /* proc needs single-step fixup ??? */ +#define P_SUGIDEXEC 0x040000 /* last execve() was set[ug]id */ -#define P_NOCLDWAIT 0x80000 /* No zombies if child dies (assign to pid 1) */ +#define P_NOCLDWAIT 0x080000 /* Let pid 1 wait for my children */ +#define P_NOZOMBIE 0x100000 /* Pid 1 waits for me instead of dad */ /* * MOVE TO ucred.h? @@ -321,6 +322,9 @@ void unsleep __P((struct proc *)); void wakeup __P((void *chan)); void exit1 __P((struct proc *, int)); int fork1 __P((struct proc *, int, int, register_t *)); +#define ISFORK 0 +#define ISVFORK 1 +#define ISRFORK 2 void kmeminit __P((void)); void rqinit __P((void)); int groupmember __P((gid_t, struct ucred *)); |