From b721e8fd26960cd6bdbfc73573b939df4cfdefed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 16 Mar 2004 02:23:32 +0000 Subject: [PATCH] Gained knowledge from NewOS change 1930 and fixed the sig_block_mask change as already suggested in my earlier comment. Added some comments. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6993 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/signal.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/kernel/core/signal.c b/src/kernel/core/signal.c index 6261eb0251..28fe506ea6 100644 --- a/src/kernel/core/signal.c +++ b/src/kernel/core/signal.c @@ -87,6 +87,10 @@ handle_signals(struct thread *thread, int state) } } + // ToDo: it's not safe to call arch_setup_signal_frame with + // interrupts disabled since it writes to the user stack + // and may page fault. + // User defined signal handler dprintf("### Setting up custom signal handler frame...\n"); arch_setup_signal_frame(thread, handler, sig, thread->sig_block_mask); @@ -94,8 +98,7 @@ handle_signals(struct thread *thread, int state) if (handler->sa_flags & SA_ONESHOT) handler->sa_handler = SIG_DFL; if (!(handler->sa_flags & SA_NOMASK)) - thread->sig_block_mask |= (handler->sa_mask | (1L << sig)) & BLOCKABLE_SIGS; - // ToDo: is that really (1L << sig) and not (1L << (sig-1)) ??? + thread->sig_block_mask |= (handler->sa_mask | (1L << (sig - 1))) & BLOCKABLE_SIGS; return global_resched; } else @@ -190,6 +193,8 @@ send_signal_etc(pid_t threadID, uint signal, uint32 flags) int send_signal(pid_t threadID, uint signal) { + // The BeBook states that this function wouldn't be exported + // for drivers, but, of course, it's wrong. return send_signal_etc(threadID, signal, 0); }