summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Greenman <dg@FreeBSD.org>1996-06-04 02:46:09 +0000
committerDavid Greenman <dg@FreeBSD.org>1996-06-04 02:46:09 +0000
commit78983fc28fdd375dbde72ca614abbd4cd54e81ec (patch)
tree8d6054a4033487aa9930466be6ca859d9b664bb4
parent1b7cb109d3888be4b0aa77aea9b683de24f59719 (diff)
Notes
-rw-r--r--sys/kern/kern_proc.c17
-rw-r--r--sys/kern/kern_sysctl.c39
-rw-r--r--sys/sys/proc.h3
3 files changed, 52 insertions, 7 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 3fa8cf2da8d26..4175417bfb5e6 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)kern_proc.c 8.4 (Berkeley) 1/4/94
- * $Id: kern_proc.c,v 1.9 1994/10/10 01:00:45 phk Exp $
+ * $Id: kern_proc.c,v 1.10 1995/05/30 08:05:37 rgrimes Exp $
*/
#include <sys/param.h>
@@ -154,6 +154,21 @@ pfind(pid)
}
/*
+ * Locate a zombie process by number
+ */
+struct proc *
+zpfind(pid)
+ pid_t pid;
+{
+ struct proc *p;
+
+ for (p = zombproc; p != NULL; p = p->p_next)
+ if (p->p_pid == pid)
+ return (p);
+ return (NULL);
+}
+
+/*
* Locate a process group by number
*/
struct pgrp *
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index d1109e22d8b42..3bc26236edb5d 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94
- * $Id: kern_sysctl.c,v 1.25.4.4 1996/05/30 01:24:41 davidg Exp $
+ * $Id: kern_sysctl.c,v 1.25.4.5 1996/05/31 08:04:10 peter Exp $
*/
/*
@@ -648,17 +648,24 @@ sysctl_doproc(name, namelen, where, sizep)
size_t *sizep;
{
register struct proc *p;
- register struct kinfo_proc *dp = (struct kinfo_proc *)where;
- register int needed = 0;
- int buflen = where != NULL ? *sizep : 0;
+ register struct kinfo_proc *dp;
+ register int needed;
+ int buflen;
int doingzomb;
struct eproc eproc;
int error = 0;
if (namelen != 2 && !(namelen == 1 && name[0] == KERN_PROC_ALL))
return (EINVAL);
- p = (struct proc *)allproc;
+restart:
doingzomb = 0;
+ p = (struct proc *)allproc;
+ if (where != NULL)
+ buflen = *sizep;
+ else
+ buflen = 0;
+ dp = (struct kinfo_proc *)where;
+ needed = 0;
again:
for (; p != NULL; p = p->p_next) {
/*
@@ -703,15 +710,37 @@ again:
break;
}
if (buflen >= sizeof(struct kinfo_proc)) {
+ pid_t pid = p->p_pid;
+
fill_eproc(p, &eproc);
error = copyout((caddr_t)p, &dp->kp_proc,
sizeof(struct proc));
if (error)
return (error);
+ /*
+ * Since copyout can block, our cached struct proc * may
+ * no longer be valid. For allproc, restart from the
+ * beginning if the process no longer exists. For
+ * zombproc, just stop if it's gone.
+ */
+ if (!doingzomb) {
+ if (pid && (pfind(pid) != p))
+ goto restart;
+ } else {
+ if (zpfind(pid) != p)
+ break;
+ }
error = copyout((caddr_t)&eproc, &dp->kp_eproc,
sizeof(eproc));
if (error)
return (error);
+ if (!doingzomb) {
+ if (pid && (pfind(pid) != p))
+ goto restart;
+ } else {
+ if (zpfind(pid) != p)
+ break;
+ }
dp++;
buflen -= sizeof(struct kinfo_proc);
}
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 9097d0b3c0034..ca485cc5c4562 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)proc.h 8.8 (Berkeley) 1/21/94
- * $Id: proc.h,v 1.16 1995/02/21 00:37:31 davidg Exp $
+ * $Id: proc.h,v 1.17 1995/03/16 18:16:22 bde Exp $
*/
#ifndef _SYS_PROC_H_
@@ -262,6 +262,7 @@ struct prochd {
int chgproccnt __P((uid_t, int));
struct proc *pfind __P((pid_t)); /* Find process by id. */
+struct proc *zpfind __P((pid_t)); /* Find zombie process by id. */
struct pgrp *pgfind __P((pid_t)); /* Find process group by id. */
void mi_switch __P((void));
void resetpriority __P((struct proc *));