2121#define RT_SIG_INFO_MAX 32
2222#endif
2323
24- #define DBG_SECTION_NAME "SIGN"
25- #define DBG_LEVEL DBG_INFO
24+ #define DBG_TAG "SIGN"
25+ #define DBG_LVL DBG_WARNING
2626#include <rtdbg.h>
2727
2828#define sig_mask (sig_no ) (1u << sig_no)
@@ -36,7 +36,7 @@ struct siginfo_node
3636
3737static struct rt_mempool * _rt_siginfo_pool ;
3838static void _signal_deliver (rt_thread_t tid );
39- void rt_thread_handle_sig (void );
39+ void rt_thread_handle_sig (rt_bool_t clean_state );
4040
4141static void _signal_default_handler (int signo )
4242{
@@ -46,36 +46,19 @@ static void _signal_default_handler(int signo)
4646
4747static void _signal_entry (void * parameter )
4848{
49- register rt_base_t level ;
5049 rt_thread_t tid = rt_thread_self ();
5150
52- while (1 )
53- {
54- level = rt_hw_interrupt_disable ();
55- if (tid -> stat & RT_THREAD_STAT_SIGNAL )
56- {
57- rt_hw_interrupt_enable (level );
58-
59- /* handle signal */
60- rt_thread_handle_sig ();
61- }
62- else
63- {
64- /*
65- * Note: interrupt is disabled and no reentrant issue.
66- *
67- * no signal status in tid->stat.
68- */
69- break ;
70- }
71- }
51+ /* handle signal */
52+ rt_thread_handle_sig (RT_FALSE );
7253
73- /* never come back... */
54+ /* return to thread */
7455 tid -> sp = tid -> sig_ret ;
7556 tid -> sig_ret = RT_NULL ;
7657
77- LOG_D ("switch back to: 0x%08x" , tid -> sp );
78- rt_hw_context_switch_to ((rt_uint32_t ) & (tid -> sp ));
58+ LOG_D ("switch back to: 0x%08x\n" , tid -> sp );
59+ tid -> stat &= ~RT_THREAD_STAT_SIGNAL ;
60+
61+ rt_hw_context_switch_to ((rt_ubase_t )& (tid -> sp ));
7962}
8063
8164/*
@@ -106,7 +89,7 @@ static void _signal_deliver(rt_thread_t tid)
10689 /* resume thread to handle signal */
10790 rt_thread_resume (tid );
10891 /* add signal state */
109- tid -> stat |= RT_THREAD_STAT_SIGNAL ;
92+ tid -> stat |= ( RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING ) ;
11093
11194 rt_hw_interrupt_enable (level );
11295
@@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid)
123106 rt_hw_interrupt_enable (level );
124107
125108 /* do signal action in self thread context */
126- rt_thread_handle_sig ();
109+ if (rt_interrupt_get_nest () == 0 )
110+ {
111+ rt_thread_handle_sig (RT_TRUE );
112+ }
127113 }
128114 else if (!((tid -> stat & RT_THREAD_STAT_SIGNAL_MASK ) & RT_THREAD_STAT_SIGNAL ))
129115 {
130116 /* add signal state */
131- tid -> stat |= RT_THREAD_STAT_SIGNAL ;
117+ tid -> stat |= ( RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING ) ;
132118
133119 /* point to the signal handle entry */
120+ tid -> stat &= ~RT_THREAD_STAT_SIGNAL_PENDING ;
134121 tid -> sig_ret = tid -> sp ;
135122 tid -> sp = rt_hw_stack_init ((void * )_signal_entry , RT_NULL ,
136123 (void * )((char * )tid -> sig_ret - 32 ), RT_NULL );
@@ -327,15 +314,14 @@ int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout)
327314 return ret ;
328315}
329316
330- void rt_thread_handle_sig (void )
317+ void rt_thread_handle_sig (rt_bool_t clean_state )
331318{
332319 rt_base_t level ;
333320
334321 rt_thread_t tid = rt_thread_self ();
335322 struct siginfo_node * si_node ;
336323
337324 level = rt_hw_interrupt_disable ();
338-
339325 if (tid -> sig_pending & tid -> sig_mask )
340326 {
341327 /* if thread is not waiting for signal */
@@ -371,8 +357,15 @@ void rt_thread_handle_sig(void)
371357 tid -> error = error ;
372358 }
373359
374- /* clean state */
375- tid -> stat &= ~RT_THREAD_STAT_SIGNAL ;
360+ /* whether clean signal status */
361+ if (clean_state == RT_TRUE )
362+ {
363+ tid -> stat &= ~RT_THREAD_STAT_SIGNAL ;
364+ }
365+ else
366+ {
367+ return ;
368+ }
376369 }
377370 }
378371 rt_hw_interrupt_enable (level );
0 commit comments