Browse Source

[kernel] release mutex when thread delete (#8345)

Yuqiang Wang 1 year ago
parent
commit
8997db911f
1 changed files with 17 additions and 12 deletions
  1. 17 12
      src/thread.c

+ 17 - 12
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.