summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorYuqiang Wang <[email protected]>2023-12-07 22:32:53 +0800
committerGitHub <[email protected]>2023-12-07 22:32:53 +0800
commit8997db911f77190de63230f21682b78fc0ce3292 (patch)
treeaafcc7fc3a430c5dfe33ed32a6c4138fa80e484f /src/thread.c
parent073761fdbef686a09fdcd8157695b5f3bcfe9587 (diff)
[kernel] release mutex when thread delete (#8345)
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c29
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.