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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index d431cc3315b..b8bfac34f4d 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_proc.c,v 1.6 1999/04/28 09:28:14 art Exp $ */
+/* $OpenBSD: kern_proc.c,v 1.7 2000/06/05 11:02:50 art Exp $ */
/* $NetBSD: kern_proc.c,v 1.14 1996/02/09 18:59:41 christos Exp $ */
/*
@@ -75,6 +75,16 @@ u_long pgrphash;
struct proclist allproc;
struct proclist zombproc;
+/*
+ * Locking of this proclist is special; it's accessed in a
+ * critical section of process exit, and thus locking it can't
+ * modify interrupt state. We use a simple spin lock for this
+ * proclist. Processes on this proclist are also on zombproc;
+ * we use the p_hash member to linkup to deadproc.
+ */
+struct simplelock deadproc_slock;
+struct proclist deadproc; /* dead, but not yet undead */
+
static void orphanpg __P((struct pgrp *));
#ifdef DEBUG
void pgrpdump __P((void));
@@ -89,6 +99,10 @@ procinit()
LIST_INIT(&allproc);
LIST_INIT(&zombproc);
+
+ LIST_INIT(&deadproc);
+ simple_lock_init(&deadproc_slock);
+
pidhashtbl = hashinit(maxproc / 4, M_PROC, M_WAITOK, &pidhash);
pgrphashtbl = hashinit(maxproc / 4, M_PROC, M_WAITOK, &pgrphash);
uihashtbl = hashinit(maxproc / 16, M_PROC, M_WAITOK, &uihash);
@@ -325,7 +339,7 @@ fixjobc(p, pgrp, entering)
for (p = p->p_children.lh_first; p != 0; p = p->p_sibling.le_next)
if ((hispgrp = p->p_pgrp) != pgrp &&
hispgrp->pg_session == mysession &&
- p->p_stat != SZOMB) {
+ P_ZOMBIE(p) == 0) {
if (entering)
hispgrp->pg_jobc++;
else if (--hispgrp->pg_jobc == 0)