Преглед на файлове

[ptherad] Fix pthread_exit issue

When pthread invokes pthread_exit, it just detach self.
Bernard Xiong преди 6 години
родител
ревизия
f9f7e6c520
променени са 2 файла, в които са добавени 6 реда и са изтрити 13 реда
  1. 0 6
      components/libc/pthreads/pthread.c
  2. 6 7
      src/thread.c

+ 0 - 6
components/libc/pthreads/pthread.c

@@ -346,12 +346,6 @@ void pthread_exit(void *value)
         ptd->tls = RT_NULL;
     }
 
-    if (ptd->attr.detachstate == PTHREAD_CREATE_JOINABLE)
-    {
-        /* release the joinable pthread */
-        rt_sem_release(ptd->joinable_sem);
-    }
-
     /* detach thread */
     rt_thread_detach(ptd->tid);
     /* reschedule thread */

+ 6 - 7
src/thread.c

@@ -347,17 +347,17 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
     /* change stat */
     thread->stat = RT_THREAD_CLOSE;
 
-    /* detach object */
-    rt_object_detach((rt_object_t)thread);
-
-    if (thread->cleanup != RT_NULL)
+    if ((rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) &&
+        thread->cleanup == RT_NULL)
+    {
+        rt_object_detach((rt_object_t)thread);
+    }
+    else
     {
         /* disable interrupt */
         lock = rt_hw_interrupt_disable();
-
         /* insert to defunct thread list */
         rt_list_insert_after(&rt_thread_defunct, &(thread->tlist));
-
         /* enable interrupt */
         rt_hw_interrupt_enable(lock);
     }
@@ -366,7 +366,6 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
 }
 RTM_EXPORT(rt_thread_detach);
 
-
 #ifdef RT_USING_HEAP
 /**
  * This function will create a thread object and allocate thread object memory