未验证 提交 3d05ec69 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #2541 from BernardXiong/fix_critical_smp

[Kernel] Fix the critical issue under smp
...@@ -792,6 +792,12 @@ void rt_enter_critical(void) ...@@ -792,6 +792,12 @@ void rt_enter_critical(void)
level = rt_hw_local_irq_disable(); level = rt_hw_local_irq_disable();
current_thread = rt_cpu_self()->current_thread; current_thread = rt_cpu_self()->current_thread;
if (!current_thread)
{
rt_hw_local_irq_enable(level);
return ;
}
/* /*
* the maximal number of nest is RT_UINT16_MAX, which is big * the maximal number of nest is RT_UINT16_MAX, which is big
* enough and does not check here * enough and does not check here
...@@ -842,6 +848,11 @@ void rt_exit_critical(void) ...@@ -842,6 +848,11 @@ void rt_exit_critical(void)
level = rt_hw_local_irq_disable(); level = rt_hw_local_irq_disable();
current_thread = rt_cpu_self()->current_thread; current_thread = rt_cpu_self()->current_thread;
if (!current_thread)
{
rt_hw_local_irq_enable(level);
return ;
}
current_thread->scheduler_lock_nest --; current_thread->scheduler_lock_nest --;
...@@ -873,14 +884,17 @@ void rt_exit_critical(void) ...@@ -873,14 +884,17 @@ void rt_exit_critical(void)
level = rt_hw_interrupt_disable(); level = rt_hw_interrupt_disable();
rt_scheduler_lock_nest --; rt_scheduler_lock_nest --;
if (rt_scheduler_lock_nest <= 0) if (rt_scheduler_lock_nest <= 0)
{ {
rt_scheduler_lock_nest = 0; rt_scheduler_lock_nest = 0;
/* enable interrupt */ /* enable interrupt */
rt_hw_interrupt_enable(level); rt_hw_interrupt_enable(level);
rt_schedule(); if (rt_current_thread)
{
/* if scheduler is started, do a schedule */
rt_schedule();
}
} }
else else
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册