From 459024f306ec9c47207b174ef6c4f8e7724ef965 Mon Sep 17 00:00:00 2001 From: Shell Date: Sat, 9 Sep 2023 09:37:38 +0800 Subject: [PATCH] [smart/signal] fixups of signal (#7998) Signed-off-by: Shell --- components/lwp/lwp_signal.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/components/lwp/lwp_signal.c b/components/lwp/lwp_signal.c index 43a36ee2e8..69270638e1 100644 --- a/components/lwp/lwp_signal.c +++ b/components/lwp/lwp_signal.c @@ -229,11 +229,10 @@ rt_inline int sigqueue_peek(lwp_sigqueue_t sigqueue, lwp_sigset_t *mask) rt_inline int sigqueue_examine(lwp_sigqueue_t sigqueue, lwp_sigset_t *pending) { - lwp_sigset_t not_mask; int is_empty = sigqueue_isempty(sigqueue); if (!is_empty) { - _sigorsets(pending, &sigqueue->sigset_pending, ¬_mask); + _sigorsets(pending, &sigqueue->sigset_pending, &sigqueue->sigset_pending); } return is_empty; } @@ -924,21 +923,24 @@ static int _dequeue_signal(rt_thread_t thread, lwp_sigset_t *mask, siginfo_t *us lwp_siginfo_t si; struct rt_lwp *lwp; lwp_sigset_t *pending; + lwp_sigqueue_t sigqueue; - pending = &_SIGQ(thread)->sigset_pending; + sigqueue = _SIGQ(thread); + pending = &sigqueue->sigset_pending; signo = _next_signal(pending, mask); if (!signo) { lwp = thread->lwp; RT_ASSERT(lwp); - pending = &_SIGQ(lwp)->sigset_pending; + sigqueue = _SIGQ(lwp); + pending = &sigqueue->sigset_pending; signo = _next_signal(pending, mask); } if (!signo) return signo; - si = sigqueue_dequeue(_SIGQ(thread), signo); + si = sigqueue_dequeue(sigqueue, signo); RT_ASSERT(!!si); siginfo_k2u(si, usi); @@ -1035,13 +1037,19 @@ rt_err_t lwp_thread_signal_timedwait(rt_thread_t thread, lwp_sigset_t *sigset, void lwp_thread_signal_pending(rt_thread_t thread, lwp_sigset_t *pending) { + rt_base_t level; struct rt_lwp *lwp; lwp = thread->lwp; if (lwp) { memset(pending, 0, sizeof(*pending)); + + level = rt_hw_interrupt_disable(); sigqueue_examine(_SIGQ(thread), pending); sigqueue_examine(_SIGQ(lwp), pending); + rt_hw_interrupt_enable(level); + + _sigandsets(pending, pending, &thread->signal.sigset_mask); } }