diff options
author | David Xu <davidxu@FreeBSD.org> | 2005-09-27 12:17:38 +0000 |
---|---|---|
committer | David Xu <davidxu@FreeBSD.org> | 2005-09-27 12:17:38 +0000 |
commit | bf4ac3bbb40ad7b38b27d1e252c2015c1e01e37e (patch) | |
tree | fb3ab64ea112e98b6eb30bc7811814f982092683 | |
parent | 5eb953e90cbbdd7d2c9e5a3a906283bfc9c30ba6 (diff) |
Notes
-rw-r--r-- | sys/kern/kern_kse.c | 7 | ||||
-rw-r--r-- | sys/kern/sys_process.c | 6 |
2 files changed, 7 insertions, 6 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c index 118ec54def0c..d06b905f347f 100644 --- a/sys/kern/kern_kse.c +++ b/sys/kern/kern_kse.c @@ -1443,7 +1443,7 @@ thread_continued(struct proc *p) struct thread *td; PROC_LOCK_ASSERT(p, MA_OWNED); - mtx_assert(&sched_lock, MA_OWNED); + KASSERT(P_SHOULDSTOP(p), ("process not stopped")); if (!(p->p_flag & P_SA)) return; @@ -1457,11 +1457,10 @@ thread_continued(struct proc *p) if (!(td->td_pflags & TDP_SA)) continue; FOREACH_UPCALL_IN_GROUP(kg, ku) { + mtx_lock_spin(&sched_lock); ku->ku_flags |= KUF_DOUPCALL; + mtx_unlock_spin(&sched_lock); wakeup(&kg->kg_completed); - if (TD_IS_SUSPENDED(ku->ku_owner)) { - thread_unsuspend_one(ku->ku_owner); - } } } } diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 11b66da43091..f1157ca5ff26 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -788,7 +788,6 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) /* deliver or queue signal */ if (P_SHOULDSTOP(p)) { p->p_xstat = data; - p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG); mtx_lock_spin(&sched_lock); if (saved_pid <= PID_MAX) { p->p_xthread->td_flags &= ~TDF_XSIG; @@ -808,8 +807,11 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) * you should use PT_SUSPEND to suspend it before * continuing process. */ - thread_unsuspend(p); + mtx_unlock_spin(&sched_lock); thread_continued(p); + p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG); + mtx_lock_spin(&sched_lock); + thread_unsuspend(p); mtx_unlock_spin(&sched_lock); } else if (data) { psignal(p, data); |