summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exit.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-08-26 12:37:16 +0000
committerkib <kib@FreeBSD.org>2008-08-26 12:37:16 +0000
commit05dac85e4b0f1f608662dcda515b72680edf8348 (patch)
treee56e2d6943e7f9becd5ad8952f710e7110d719e6 /sys/kern/kern_exit.c
parent2d990eae0580f74b2aee49da3c6434c6224e084c (diff)
downloadFreeBSD-src-05dac85e4b0f1f608662dcda515b72680edf8348.zip
FreeBSD-src-05dac85e4b0f1f608662dcda515b72680edf8348.tar.gz
Implement WNOWAIT flag for wait4(2). It specifies that process whose status
is returned shall be kept in the waitable state. Add WSTOPPED as an alias for WUNTRACED. Submitted by: Jukka Ukkonen <jau at iki fi> PR: standards/116221 MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_exit.c')
-rw-r--r--sys/kern/kern_exit.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index f0866ed..b536d99 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -690,7 +690,7 @@ kern_wait(struct thread *td, pid_t pid, int *status, int options,
pid = -q->p_pgid;
PROC_UNLOCK(q);
}
- if (options &~ (WUNTRACED|WNOHANG|WCONTINUED|WLINUXCLONE))
+ if (options &~ (WUNTRACED|WNOHANG|WCONTINUED|WNOWAIT|WLINUXCLONE))
return (EINVAL);
loop:
if (q->p_flag & P_STATCHILD) {
@@ -741,11 +741,23 @@ loop:
sigqueue_take(p->p_ksi);
PROC_UNLOCK(q);
+ PROC_UNLOCK(p);
+
+ if (options & WNOWAIT) {
+
+ /*
+ * Only poll, returning the status.
+ * Caller does not wish to release the proc
+ * struct just yet.
+ */
+ sx_xunlock(&proctree_lock);
+ return (0);
+ }
+
/*
* If we got the child via a ptrace 'attach',
* we need to give it back to the old parent.
*/
- PROC_UNLOCK(p);
if (p->p_oppid && (t = pfind(p->p_oppid)) != NULL) {
PROC_LOCK(p);
p->p_oppid = 0;
OpenPOWER on IntegriCloud