summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_trap.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2003-03-11 02:59:50 +0000
committerdavidxu <davidxu@FreeBSD.org>2003-03-11 02:59:50 +0000
commitb47a4be33ec42eb423369b77f6da7b572b07edb4 (patch)
treec28b73dc40a4a07a188972e792db22e3ade7eda9 /sys/kern/subr_trap.c
parent178970c2cc97ea4ea53737b4eace117920af55f9 (diff)
downloadFreeBSD-src-b47a4be33ec42eb423369b77f6da7b572b07edb4.zip
FreeBSD-src-b47a4be33ec42eb423369b77f6da7b572b07edb4.tar.gz
Fix signal delivering bug for threaded process.
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r--sys/kern/subr_trap.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index 9eb4aed..fe5f1e4 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -253,8 +253,14 @@ ast(struct trapframe *framep)
sigs++;
}
PROC_UNLOCK(p);
- if (p->p_flag & P_THREADED && sigs)
- thread_signal_upcall(td);
+ if (p->p_flag & P_THREADED && sigs) {
+ struct kse_upcall *ku = td->td_upcall;
+ if ((void *)TRAPF_PC(framep) != ku->ku_func) {
+ mtx_lock_spin(&sched_lock);
+ ku->ku_flags |= KUF_DOUPCALL;
+ mtx_unlock_spin(&sched_lock);
+ }
+ }
}
userret(td, framep, sticks);
OpenPOWER on IntegriCloud