diff options
| author | Yuqiang Wang <[email protected]> | 2023-12-07 22:32:53 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-12-07 22:32:53 +0800 |
| commit | 8997db911f77190de63230f21682b78fc0ce3292 (patch) | |
| tree | aafcc7fc3a430c5dfe33ed32a6c4138fa80e484f | |
| parent | 073761fdbef686a09fdcd8157695b5f3bcfe9587 (diff) | |
[kernel] release mutex when thread delete (#8345)
| -rw-r--r-- | src/thread.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/thread.c b/src/thread.c index 55ee917337..bda2be0fa6 100644 --- a/src/thread.c +++ b/src/thread.c @@ -144,6 +144,22 @@ static void _thread_timeout(void *parameter) rt_schedule(); } +/* release the mutex held by a thread when thread is reclaimed */ +#ifdef RT_USING_MUTEX +static void _free_owned_mutex(rt_thread_t thread) +{ + rt_list_t *node; + rt_list_t *tmp_list; + struct rt_mutex *mutex; + + rt_list_for_each_safe(node, tmp_list, &(thread->taken_object_list)) + { + mutex = rt_list_entry(node, struct rt_mutex, taken_list); + rt_mutex_release(mutex); + } +} +#endif + static rt_err_t _thread_init(struct rt_thread *thread, const char *name, void (*entry)(void *parameter), @@ -444,6 +460,7 @@ rt_err_t rt_thread_detach(rt_thread_t thread) thread->stat = RT_THREAD_CLOSE; #ifdef RT_USING_MUTEX + _free_owned_mutex(thread); if ((thread->pending_object) && (rt_object_get_type(thread->pending_object) == RT_Object_Class_Mutex)) { @@ -518,18 +535,6 @@ rt_thread_t rt_thread_create(const char *name, } RTM_EXPORT(rt_thread_create); -void _free_owned_mutex(rt_thread_t thread) -{ - rt_list_t *node; - rt_list_t *tmp_list; - struct rt_mutex *mutex; - - rt_list_for_each_safe(node, tmp_list, &(thread->taken_object_list)) - { - mutex = rt_list_entry(node, struct rt_mutex, taken_list); - rt_mutex_release(mutex); - } -} /** * @brief This function will delete a thread. The thread object will be removed from * thread queue and deleted from system object management in the idle thread. |
