summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_proc.c
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2000-11-22 07:42:04 +0000
committerjake <jake@FreeBSD.org>2000-11-22 07:42:04 +0000
commit0c0be4e82677a2d8fb49b7a70676bf359e7360b0 (patch)
treea0c32260edfde6d861e66b11172147608684043e /sys/kern/kern_proc.c
parent1b544875743d53491a096b0c757bf30ce73bb83b (diff)
downloadFreeBSD-src-0c0be4e82677a2d8fb49b7a70676bf359e7360b0.zip
FreeBSD-src-0c0be4e82677a2d8fb49b7a70676bf359e7360b0.tar.gz
Protect the following with a lockmgr lock:
allproc zombproc pidhashtbl proc.p_list proc.p_hash nextpid Reviewed by: jhb Obtained from: BSD/OS and netbsd
Diffstat (limited to 'sys/kern/kern_proc.c')
-rw-r--r--sys/kern/kern_proc.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 4800747..ac30ba6 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -72,6 +72,7 @@ struct pgrphashhead *pgrphashtbl;
u_long pgrphash;
struct proclist allproc;
struct proclist zombproc;
+struct lock allproc_lock;
vm_zone_t proc_zone;
vm_zone_t ithread_zone;
@@ -82,6 +83,7 @@ void
procinit()
{
+ lockinit(&allproc_lock, PZERO, "allproc", 0, 0);
LIST_INIT(&allproc);
LIST_INIT(&zombproc);
pidhashtbl = hashinit(maxproc / 4, M_PROC, &pidhash);
@@ -113,10 +115,12 @@ pfind(pid)
{
register struct proc *p;
+ lockmgr(&allproc_lock, LK_SHARED, NULL, CURPROC);
LIST_FOREACH(p, PIDHASH(pid), p_hash)
if (p->p_pid == pid)
- return (p);
- return (NULL);
+ break;
+ lockmgr(&allproc_lock, LK_RELEASE, NULL, CURPROC);
+ return (p);
}
/*
@@ -470,6 +474,7 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
if (error)
return (error);
}
+ lockmgr(&allproc_lock, LK_SHARED, NULL, CURPROC);
for (doingzomb=0 ; doingzomb < 2 ; doingzomb++) {
if (!doingzomb)
p = LIST_FIRST(&allproc);
@@ -525,10 +530,14 @@ sysctl_kern_proc(SYSCTL_HANDLER_ARGS)
continue;
error = sysctl_out_proc(p, req, doingzomb);
- if (error)
+ if (error) {
+ lockmgr(&allproc_lock, LK_RELEASE, NULL,
+ CURPROC);
return (error);
+ }
}
}
+ lockmgr(&allproc_lock, LK_RELEASE, NULL, CURPROC);
return (0);
}
OpenPOWER on IntegriCloud