diff options
| author | xqyjlj <[email protected]> | 2023-11-13 22:46:48 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-11-13 22:46:48 +0800 |
| commit | 3aa19af30120341a4344d69f8bd500682db2b8c5 (patch) | |
| tree | b2d3aa0fb2cf180f9d3ed6053fa4f6222d08de69 /src | |
| parent | 9acebb07dcea9127182ee9a4737249ff14c1ce89 (diff) | |
🐞 fix(src/idle.c): fix thread exit (#8239)
Diffstat (limited to 'src')
| -rw-r--r-- | src/idle.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/idle.c b/src/idle.c index 524b45d3b3..1c36814e1e 100644 --- a/src/idle.c +++ b/src/idle.c @@ -17,6 +17,7 @@ * combine the code of primary and secondary cpu * 2021-11-15 THEWON Remove duplicate work between idle and _thread_exit * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable + * 2023-11-07 xqyjlj fix thread exit */ #include <rthw.h> @@ -43,7 +44,7 @@ #define _CPUS_NR RT_CPUS_NR static rt_list_t _rt_thread_defunct = RT_LIST_OBJECT_INIT(_rt_thread_defunct); -static struct rt_mutex _defunct_mutex; +static struct rt_spinlock _spinlock = RT_SPINLOCK_INIT; static rt_atomic_t _idle_inited = 0; static struct rt_thread idle_thread[_CPUS_NR]; rt_align(RT_ALIGN_SIZE) @@ -130,13 +131,14 @@ rt_err_t rt_thread_idle_delhook(void (*hook)(void)) */ void rt_thread_defunct_enqueue(rt_thread_t thread) { + rt_base_t level; if (rt_atomic_load(&_idle_inited) == 0) { return; } - rt_mutex_take(&_defunct_mutex, RT_WAITING_FOREVER); + level = rt_spin_lock_irqsave(&_spinlock); rt_list_insert_after(&_rt_thread_defunct, &thread->tlist); - rt_mutex_release(&_defunct_mutex); + rt_spin_unlock_irqrestore(&_spinlock, level); #ifdef RT_USING_SMP rt_sem_release(&system_sem); #endif @@ -152,7 +154,7 @@ rt_thread_t rt_thread_defunct_dequeue(void) rt_list_t *l = &_rt_thread_defunct; #ifdef RT_USING_SMP - rt_mutex_take(&_defunct_mutex, RT_WAITING_FOREVER); + level = rt_spin_lock_irqsave(&_spinlock); if (l->next != l) { thread = rt_list_entry(l->next, @@ -160,8 +162,7 @@ rt_thread_t rt_thread_defunct_dequeue(void) tlist); rt_list_remove(&(thread->tlist)); } - rt_mutex_release(&_defunct_mutex); - RT_UNUSED(level); + rt_spin_unlock_irqrestore(&_spinlock, level); #else if (l->next != l) { @@ -364,7 +365,7 @@ void rt_thread_idle_init(void) /* startup */ rt_thread_startup(&rt_system_thread); #endif - rt_mutex_init(&_defunct_mutex, "defunct_mutex", RT_IPC_FLAG_FIFO); + rt_spin_lock_init(&_spinlock); rt_atomic_store(&(_idle_inited), 1); } |
