提交 6fca4a77 编写于 作者: B Bernard Xiong

[Kernel] Fix the signal issue when the context switch is triggered but not immediately handled.

上级 e8a864c7
...@@ -379,7 +379,12 @@ void rt_schedule(void) ...@@ -379,7 +379,12 @@ void rt_schedule(void)
} }
} }
/* enable interrupt */
rt_hw_interrupt_enable(level);
#ifdef RT_USING_SIGNALS #ifdef RT_USING_SIGNALS
/* check stat of thread for signal */
level = rt_hw_interrupt_disable();
if (current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING) if (current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING)
{ {
extern void rt_thread_handle_sig(rt_bool_t clean_state); extern void rt_thread_handle_sig(rt_bool_t clean_state);
...@@ -395,9 +400,6 @@ void rt_schedule(void) ...@@ -395,9 +400,6 @@ void rt_schedule(void)
{ {
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
} }
#else
/* enable interrupt */
rt_hw_interrupt_enable(level);
#endif #endif
__exit: __exit:
...@@ -477,7 +479,13 @@ void rt_schedule(void) ...@@ -477,7 +479,13 @@ void rt_schedule(void)
rt_hw_context_switch((rt_ubase_t)&from_thread->sp, rt_hw_context_switch((rt_ubase_t)&from_thread->sp,
(rt_ubase_t)&to_thread->sp); (rt_ubase_t)&to_thread->sp);
/* enable interrupt */
rt_hw_interrupt_enable(level);
#ifdef RT_USING_SIGNALS #ifdef RT_USING_SIGNALS
/* check stat of thread for signal */
level = rt_hw_interrupt_disable();
if (rt_current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING) if (rt_current_thread->stat & RT_THREAD_STAT_SIGNAL_PENDING)
{ {
extern void rt_thread_handle_sig(rt_bool_t clean_state); extern void rt_thread_handle_sig(rt_bool_t clean_state);
...@@ -493,9 +501,6 @@ void rt_schedule(void) ...@@ -493,9 +501,6 @@ void rt_schedule(void)
{ {
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
} }
#else
/* enable interrupt */
rt_hw_interrupt_enable(level);
#endif #endif
goto __exit; goto __exit;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册