From d517389e521f2f2cff4f2a04631a5c952719ce73 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 4 Apr 2019 10:06:28 +0800 Subject: [PATCH 1/2] [Kernel] Fix the critical issue under smp --- src/scheduler.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/scheduler.c b/src/scheduler.c index 37b262d83b..0028c98314 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -792,6 +792,12 @@ void rt_enter_critical(void) level = rt_hw_local_irq_disable(); 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 * enough and does not check here @@ -842,6 +848,11 @@ void rt_exit_critical(void) level = rt_hw_local_irq_disable(); current_thread = rt_cpu_self()->current_thread; + if (!current_thread) + { + rt_hw_local_irq_enable(level); + return ; + } current_thread->scheduler_lock_nest --; From 0366eb13acd55b5ba676e250366df440776b71d6 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 4 Apr 2019 10:58:24 +0800 Subject: [PATCH 2/2] [Kernel] Fix the critical issue when scheduler not start --- src/scheduler.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/scheduler.c b/src/scheduler.c index 0028c98314..be29d9a7e0 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -884,14 +884,17 @@ void rt_exit_critical(void) level = rt_hw_interrupt_disable(); rt_scheduler_lock_nest --; - if (rt_scheduler_lock_nest <= 0) { rt_scheduler_lock_nest = 0; /* enable interrupt */ rt_hw_interrupt_enable(level); - rt_schedule(); + if (rt_current_thread) + { + /* if scheduler is started, do a schedule */ + rt_schedule(); + } } else {