From 0574bf4153991246a39e68b71f96c500d2426970 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 21 Feb 2019 04:51:39 +0800 Subject: [PATCH] [Kernel] code cleanup for signal handling. Disable interrupt to check thread->stat in _signal_entry to ensure the signal is not lost. At the same time, remove the disable interrupt return code from rt_thread_handle_sig function. --- src/signal.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/signal.c b/src/signal.c index 2bda02bb4..1f7f3e50b 100644 --- a/src/signal.c +++ b/src/signal.c @@ -48,22 +48,31 @@ static void _signal_default_handler(int signo) static void _signal_entry(void *parameter) { + register rt_base_t level; rt_thread_t tid = rt_thread_self(); dbg_enter; - /* handle signal */ - rt_thread_handle_sig(RT_FALSE); + while (1) + { + level = rt_hw_interrupt_disable(); + if (tid->stat & RT_THREAD_STAT_SIGNAL) + { + rt_hw_interrupt_enable(level); + /* handle signal */ + rt_thread_handle_sig(RT_FALSE); + } + else break; + } /* never come back... */ - rt_hw_interrupt_disable(); - /* return to thread */ tid->sp = tid->sig_ret; tid->sig_ret = RT_NULL; LOG_D("switch back to: 0x%08x", tid->sp); tid->stat &= ~RT_THREAD_STAT_SIGNAL; + /* return to thread */ rt_hw_context_switch_to((rt_uint32_t) & (tid->sp)); } @@ -324,6 +333,7 @@ void rt_thread_handle_sig(rt_bool_t clean_state) struct siginfo_node *si_node; level = rt_hw_interrupt_disable(); + if (tid->sig_pending & tid->sig_mask) { /* if thread is not waiting for signal */ @@ -364,10 +374,6 @@ void rt_thread_handle_sig(rt_bool_t clean_state) { tid->stat &= ~RT_THREAD_STAT_SIGNAL; } - else - { - return; - } } } rt_hw_interrupt_enable(level); -- GitLab