summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_proc.c')
-rw-r--r--sys/kern/kern_proc.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 814a29e..83ba993 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -73,6 +73,7 @@ u_long pgrphash;
struct proclist allproc;
struct proclist zombproc;
struct lock allproc_lock;
+struct lock proctree_lock;
vm_zone_t proc_zone;
vm_zone_t ithread_zone;
@@ -84,6 +85,7 @@ procinit()
{
lockinit(&allproc_lock, PZERO, "allproc", 0, 0);
+ lockinit(&proctree_lock, PZERO, "proctree", 0, 0);
LIST_INIT(&allproc);
LIST_INIT(&zombproc);
pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash);
@@ -106,11 +108,16 @@ int
inferior(p)
register struct proc *p;
{
+ int rval = 1;
+ PROCTREE_LOCK(PT_SHARED);
for (; p != curproc; p = p->p_pptr)
- if (p->p_pid == 0)
- return (0);
- return (1);
+ if (p->p_pid == 0) {
+ rval = 0;
+ break;
+ }
+ PROCTREE_LOCK(PT_RELEASE);
+ return (rval);
}
/*
@@ -281,6 +288,7 @@ fixjobc(p, pgrp, entering)
* Check p's parent to see whether p qualifies its own process
* group; if so, adjust count for p's process group.
*/
+ PROCTREE_LOCK(PT_SHARED);
if ((hispgrp = p->p_pptr->p_pgrp) != pgrp &&
hispgrp->pg_session == mysession) {
if (entering)
@@ -303,6 +311,7 @@ fixjobc(p, pgrp, entering)
else if (--hispgrp->pg_jobc == 0)
orphanpg(hispgrp);
}
+ PROCTREE_LOCK(PT_RELEASE);
}
/*
@@ -414,8 +423,10 @@ fill_kinfo_proc(p, kp)
kp->ki_rtprio = p->p_rtprio;
kp->ki_runtime = p->p_runtime;
kp->ki_pid = p->p_pid;
+ PROCTREE_LOCK(PT_SHARED);
if (p->p_pptr)
kp->ki_ppid = p->p_pptr->p_pid;
+ PROCTREE_LOCK(PT_RELEASE);
sp = NULL;
if (p->p_pgrp) {
kp->ki_pgid = p->p_pgrp->pg_id;
OpenPOWER on IntegriCloud