summaryrefslogtreecommitdiff
path: root/src/scheduler_mp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scheduler_mp.c')
-rw-r--r--src/scheduler_mp.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/scheduler_mp.c b/src/scheduler_mp.c
index 06193c388e..fdd148b1ca 100644
--- a/src/scheduler_mp.c
+++ b/src/scheduler_mp.c
@@ -31,6 +31,7 @@
* 2023-03-27 rose_man Split into scheduler upc and scheduler_mp.c
* 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable
* 2023-12-10 xqyjlj use rt_hw_spinlock
+ * 2024-01-05 Shell Fixup of data racing in rt_critical_level
*/
#include <rtthread.h>
@@ -848,8 +849,17 @@ RTM_EXPORT(rt_exit_critical);
*/
rt_uint16_t rt_critical_level(void)
{
- struct rt_thread *current_thread = rt_cpu_self()->current_thread;
- return rt_atomic_load(&(current_thread->critical_lock_nest));
+ rt_base_t level;
+ rt_uint16_t critical_lvl;
+ struct rt_thread *current_thread;
+
+ level = rt_hw_local_irq_disable();
+
+ current_thread = rt_cpu_self()->current_thread;
+ critical_lvl = rt_atomic_load(&(current_thread->critical_lock_nest));
+
+ rt_hw_local_irq_enable(level);
+ return critical_lvl;
}
RTM_EXPORT(rt_critical_level);