summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskychen123 <[email protected]>2023-09-21 18:23:53 +0800
committerguo <[email protected]>2023-12-06 14:10:33 +0800
commit4ffc3a4a453a23923230be99c97402ab296a4c9a (patch)
treef984984cd86928c31ab6ae727583d726d144577f
parentea50473dc4c6ac9cfb2392c93d742980b6a8e8bf (diff)
release mutex when thread delete
-rw-r--r--src/thread.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/thread.c b/src/thread.c
index cd14a15d21..55ee917337 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -518,6 +518,18 @@ 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.
@@ -553,6 +565,7 @@ rt_err_t rt_thread_delete(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))
{