diff options
-rw-r--r-- | sys/kern/kern_fork.c | 4 | ||||
-rw-r--r-- | sys/kern/tty.c | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 8782007..ec959d5 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -538,6 +538,8 @@ again: FILEDESC_UNLOCK(p1->p_fd); } else fd = fdshare(p1); + PGRPSESS_XLOCK(); + PGRP_LOCK(p1->p_pgrp); PROC_LOCK(p2); p2->p_fd = fd; @@ -570,6 +572,8 @@ again: LIST_INSERT_AFTER(p1, p2, p_pglist); PROC_UNLOCK(p1); PROC_UNLOCK(p2); + PGRP_UNLOCK(p1->p_pgrp); + PGRPSESS_XUNLOCK(); /* * Attach the new process to its parent. diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 1214513..3b7739d 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -2419,13 +2419,13 @@ ttyinfo(tp) PGRP_UNLOCK(tp->t_pgrp); ttyprintf(tp, "empty foreground process group\n"); } else { - PGRP_UNLOCK(tp->t_pgrp); mtx_lock_spin(&sched_lock); /* Pick interesting process. */ for (pick = NULL; p != 0; p = LIST_NEXT(p, p_pglist)) if (proc_compare(pick, p)) pick = p; + PGRP_UNLOCK(tp->t_pgrp); td = FIRST_THREAD_IN_PROC(pick); stmp = pick->p_stat == SRUN ? "running" : /* XXXKSE */ |