21
21
#define RT_SIG_INFO_MAX 32
22
22
#endif
23
23
24
- #define DBG_SECTION_NAME "SIGN"
25
- #define DBG_LEVEL DBG_INFO
24
+ #define DBG_TAG "SIGN"
25
+ #define DBG_LVL DBG_WARNING
26
26
#include <rtdbg.h>
27
27
28
28
#define sig_mask (sig_no ) (1u << sig_no)
@@ -36,7 +36,7 @@ struct siginfo_node
36
36
37
37
static struct rt_mempool * _rt_siginfo_pool ;
38
38
static 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 );
40
40
41
41
static void _signal_default_handler (int signo )
42
42
{
@@ -46,36 +46,19 @@ static void _signal_default_handler(int signo)
46
46
47
47
static void _signal_entry (void * parameter )
48
48
{
49
- register rt_base_t level ;
50
49
rt_thread_t tid = rt_thread_self ();
51
50
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 );
72
53
73
- /* never come back... */
54
+ /* return to thread */
74
55
tid -> sp = tid -> sig_ret ;
75
56
tid -> sig_ret = RT_NULL ;
76
57
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 ));
79
62
}
80
63
81
64
/*
@@ -106,7 +89,7 @@ static void _signal_deliver(rt_thread_t tid)
106
89
/* resume thread to handle signal */
107
90
rt_thread_resume (tid );
108
91
/* add signal state */
109
- tid -> stat |= RT_THREAD_STAT_SIGNAL ;
92
+ tid -> stat |= ( RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING ) ;
110
93
111
94
rt_hw_interrupt_enable (level );
112
95
@@ -123,14 +106,18 @@ static void _signal_deliver(rt_thread_t tid)
123
106
rt_hw_interrupt_enable (level );
124
107
125
108
/* 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
+ }
127
113
}
128
114
else if (!((tid -> stat & RT_THREAD_STAT_SIGNAL_MASK ) & RT_THREAD_STAT_SIGNAL ))
129
115
{
130
116
/* add signal state */
131
- tid -> stat |= RT_THREAD_STAT_SIGNAL ;
117
+ tid -> stat |= ( RT_THREAD_STAT_SIGNAL | RT_THREAD_STAT_SIGNAL_PENDING ) ;
132
118
133
119
/* point to the signal handle entry */
120
+ tid -> stat &= ~RT_THREAD_STAT_SIGNAL_PENDING ;
134
121
tid -> sig_ret = tid -> sp ;
135
122
tid -> sp = rt_hw_stack_init ((void * )_signal_entry , RT_NULL ,
136
123
(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)
327
314
return ret ;
328
315
}
329
316
330
- void rt_thread_handle_sig (void )
317
+ void rt_thread_handle_sig (rt_bool_t clean_state )
331
318
{
332
319
rt_base_t level ;
333
320
334
321
rt_thread_t tid = rt_thread_self ();
335
322
struct siginfo_node * si_node ;
336
323
337
324
level = rt_hw_interrupt_disable ();
338
-
339
325
if (tid -> sig_pending & tid -> sig_mask )
340
326
{
341
327
/* if thread is not waiting for signal */
@@ -371,8 +357,15 @@ void rt_thread_handle_sig(void)
371
357
tid -> error = error ;
372
358
}
373
359
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
+ }
376
369
}
377
370
}
378
371
rt_hw_interrupt_enable (level );
0 commit comments