diff options
author | jake <jake@FreeBSD.org> | 2000-11-22 07:42:04 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2000-11-22 07:42:04 +0000 |
commit | 0c0be4e82677a2d8fb49b7a70676bf359e7360b0 (patch) | |
tree | a0c32260edfde6d861e66b11172147608684043e /sys/kern/kern_proc.c | |
parent | 1b544875743d53491a096b0c757bf30ce73bb83b (diff) | |
download | FreeBSD-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.c | 15 |
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); } |