diff options
Diffstat (limited to 'src/scheduler_mp.c')
| -rw-r--r-- | src/scheduler_mp.c | 14 |
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); |
