summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_exec.c2
-rw-r--r--sys/kern/kern_exit.c2
-rw-r--r--sys/kern/kern_fork.c2
-rw-r--r--sys/kern/kern_proc.c1
-rw-r--r--sys/sys/proc.h2
5 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 02f9f2e4cce5..c89c9a66a6eb 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -609,7 +609,7 @@ interpret:
p->p_flag |= P_EXEC;
if (p->p_pptr && (p->p_flag & P_PPWAIT)) {
p->p_flag &= ~P_PPWAIT;
- wakeup(p->p_pptr);
+ cv_broadcast(&p->p_pwait);
}
/*
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 3b45233f8f06..4b4a417262ed 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -543,6 +543,7 @@ exit1(struct thread *td, int rv)
* proc lock.
*/
wakeup(p->p_pptr);
+ cv_broadcast(&p->p_pwait);
sched_exit(p->p_pptr, td);
PROC_SLOCK(p);
p->p_state = PRS_ZOMBIE;
@@ -774,6 +775,7 @@ loop:
PROC_UNLOCK(p);
tdsignal(t, NULL, SIGCHLD, p->p_ksi);
wakeup(t);
+ cv_broadcast(&p->p_pwait);
PROC_UNLOCK(t);
sx_xunlock(&proctree_lock);
return (0);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 96dd9c8fbd3c..e7e98b17b15b 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -754,7 +754,7 @@ again:
*/
PROC_LOCK(p2);
while (p2->p_flag & P_PPWAIT)
- msleep(p1, &p2->p_mtx, PWAIT, "ppwait", 0);
+ cv_wait(&p2->p_pwait, &p2->p_mtx);
PROC_UNLOCK(p2);
/*
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 4e5ceea4714d..0b6b6d5216a6 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -231,6 +231,7 @@ proc_init(void *mem, int size, int flags)
bzero(&p->p_mtx, sizeof(struct mtx));
mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
mtx_init(&p->p_slock, "process slock", NULL, MTX_SPIN | MTX_RECURSE);
+ cv_init(&p->p_pwait, "ppwait");
TAILQ_INIT(&p->p_threads); /* all threads in proc */
EVENTHANDLER_INVOKE(process_init, p);
p->p_stats = pstats_alloc();
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index fd490b03b338..c592aaf20d27 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -40,6 +40,7 @@
#include <sys/callout.h> /* For struct callout. */
#include <sys/event.h> /* For struct klist. */
+#include <sys/condvar.h>
#ifndef _KERNEL
#include <sys/filedesc.h>
#endif
@@ -540,6 +541,7 @@ struct proc {
STAILQ_HEAD(, ktr_request) p_ktr; /* (o) KTR event queue. */
LIST_HEAD(, mqueue_notifier) p_mqnotifier; /* (c) mqueue notifiers.*/
struct kdtrace_proc *p_dtrace; /* (*) DTrace-specific data. */
+ struct cv p_pwait; /* (*) wait cv for exit/exec */
};
#define p_session p_pgrp->pg_session