mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-23 16:01:42 +00:00
- Proc locking.
- Catch up to proc flag changes.
This commit is contained in:
parent
7871c121ff
commit
40447cd4aa
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=71563
@ -1047,7 +1047,7 @@ psignal(p, sig)
|
||||
register struct proc *p;
|
||||
register int sig;
|
||||
{
|
||||
register int s, prop;
|
||||
register int prop;
|
||||
register sig_t action;
|
||||
|
||||
if (sig > _SIG_MAXSIG || sig <= 0) {
|
||||
@ -1055,6 +1055,7 @@ psignal(p, sig)
|
||||
panic("psignal signal number");
|
||||
}
|
||||
|
||||
PROC_LOCK(p);
|
||||
KNOTE(&p->p_klist, NOTE_SIGNAL | sig);
|
||||
|
||||
prop = sigprop(sig);
|
||||
@ -1074,8 +1075,10 @@ psignal(p, sig)
|
||||
* and if it is set to SIG_IGN,
|
||||
* action will be SIG_DFL here.)
|
||||
*/
|
||||
if (SIGISMEMBER(p->p_sigignore, sig) || (p->p_flag & P_WEXIT))
|
||||
if (SIGISMEMBER(p->p_sigignore, sig) || (p->p_flag & P_WEXIT)) {
|
||||
PROC_UNLOCK(p);
|
||||
return;
|
||||
}
|
||||
if (SIGISMEMBER(p->p_sigmask, sig))
|
||||
action = SIG_HOLD;
|
||||
else if (SIGISMEMBER(p->p_sigcatch, sig))
|
||||
@ -1084,9 +1087,11 @@ psignal(p, sig)
|
||||
action = SIG_DFL;
|
||||
}
|
||||
|
||||
mtx_enter(&sched_lock, MTX_SPIN);
|
||||
if (p->p_nice > NZERO && action == SIG_DFL && (prop & SA_KILL) &&
|
||||
(p->p_flag & P_TRACED) == 0)
|
||||
p->p_nice = NZERO;
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
|
||||
if (prop & SA_CONT)
|
||||
SIG_STOPSIGMASK(p->p_siglist);
|
||||
@ -1099,8 +1104,10 @@ psignal(p, sig)
|
||||
* and don't clear any pending SIGCONT.
|
||||
*/
|
||||
if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 &&
|
||||
action == SIG_DFL)
|
||||
action == SIG_DFL) {
|
||||
PROC_UNLOCK(p);
|
||||
return;
|
||||
}
|
||||
SIG_CONTSIGMASK(p->p_siglist);
|
||||
}
|
||||
SIGADDSET(p->p_siglist, sig);
|
||||
@ -1112,9 +1119,9 @@ psignal(p, sig)
|
||||
mtx_enter(&sched_lock, MTX_SPIN);
|
||||
if (action == SIG_HOLD && (!(prop & SA_CONT) || p->p_stat != SSTOP)) {
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
PROC_UNLOCK(p);
|
||||
return;
|
||||
}
|
||||
s = splhigh();
|
||||
switch (p->p_stat) {
|
||||
|
||||
case SSLEEP:
|
||||
@ -1124,7 +1131,7 @@ psignal(p, sig)
|
||||
* be noticed when the process returns through
|
||||
* trap() or syscall().
|
||||
*/
|
||||
if ((p->p_flag & P_SINTR) == 0) {
|
||||
if ((p->p_sflag & PS_SINTR) == 0) {
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
goto out;
|
||||
}
|
||||
@ -1162,26 +1169,26 @@ psignal(p, sig)
|
||||
goto out;
|
||||
SIGDELSET(p->p_siglist, sig);
|
||||
p->p_xstat = sig;
|
||||
PROC_UNLOCK(p);
|
||||
PROCTREE_LOCK(PT_SHARED);
|
||||
if ((p->p_pptr->p_procsig->ps_flag & PS_NOCLDSTOP) == 0)
|
||||
psignal(p->p_pptr, SIGCHLD);
|
||||
stop(p);
|
||||
PROCTREE_LOCK(PT_RELEASE);
|
||||
PROC_LOCK(p);
|
||||
goto out;
|
||||
} else
|
||||
goto runfast;
|
||||
/* NOTREACHED */
|
||||
|
||||
case SSTOP:
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
/*
|
||||
* If traced process is already stopped,
|
||||
* then no further action is necessary.
|
||||
*/
|
||||
if (p->p_flag & P_TRACED) {
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
if (p->p_flag & P_TRACED)
|
||||
goto out;
|
||||
}
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
|
||||
/*
|
||||
* Kill signal always sets processes running.
|
||||
@ -1205,7 +1212,7 @@ psignal(p, sig)
|
||||
if (action == SIG_CATCH)
|
||||
goto runfast;
|
||||
mtx_enter(&sched_lock, MTX_SPIN);
|
||||
if (p->p_wchan == 0)
|
||||
if (p->p_wchan == NULL)
|
||||
goto run;
|
||||
p->p_stat = SSLEEP;
|
||||
mtx_exit(&sched_lock, MTX_SPIN);
|
||||
@ -1228,8 +1235,8 @@ psignal(p, sig)
|
||||
* the process runnable, leave it stopped.
|
||||
*/
|
||||
mtx_enter(&sched_lock, MTX_SPIN);
|
||||
if (p->p_wchan && p->p_flag & P_SINTR) {
|
||||
if (p->p_flag & P_CVWAITQ)
|
||||
if (p->p_wchan && p->p_sflag & PS_SINTR) {
|
||||
if (p->p_sflag & PS_CVWAITQ)
|
||||
cv_waitq_remove(p);
|
||||
else
|
||||
unsleep(p);
|
||||
@ -1274,7 +1281,7 @@ psignal(p, sig)
|
||||
out:
|
||||
/* If we jump here, sched_lock should not be owned. */
|
||||
mtx_assert(&sched_lock, MA_NOTOWNED);
|
||||
splx(s);
|
||||
PROC_UNLOCK(p);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user