Pārlūkot izejas kodu

[fix] the risk for function exit() when open pthread support. (#6229)

* [fix] the risk for function exit() when open pthread support.
* [update] modify annotation from "user data" to "pthread_data".
xiangxistu 2 gadi atpakaļ
vecāks
revīzija
e61d05ca1a

+ 5 - 2
components/libc/compilers/common/cstdlib.c

@@ -21,8 +21,11 @@ void __rt_libc_exit(int status)
     if (self != RT_NULL)
     {
 #ifdef RT_USING_PTHREADS
-        extern void pthread_exit(void *value);
-        pthread_exit((void *)status);
+        if(self->pthread_data != RT_NULL)
+        {
+            extern void pthread_exit(void *value);
+            pthread_exit((void *)status);
+        }
 #else
         LOG_E("thread:%s exit:%d!", self->name, status);
         rt_thread_control(self, RT_THREAD_CTRL_CLOSE, RT_NULL);

+ 17 - 17
components/libc/posix/pthreads/pthread.c

@@ -135,8 +135,8 @@ void _pthread_data_destroy(_pthread_data_t *ptd)
         /* clean magic */
         ptd->magic = 0x0;
 
-        /* clear the "ptd->tid->user_data" */
-        ptd->tid->user_data = RT_NULL;
+        /* clear the "ptd->tid->pthread_data" */
+        ptd->tid->pthread_data = RT_NULL;
 
         /* free ptd */
         rt_free(ptd);
@@ -281,7 +281,7 @@ int pthread_create(pthread_t            *pid,
 
     /* set pthread cleanup function and ptd data */
     ptd->tid->cleanup = _pthread_cleanup;
-    ptd->tid->user_data = (rt_ubase_t)ptd;
+    ptd->tid->pthread_data = (void *)ptd;
 
     /* start thread */
     if (rt_thread_startup(ptd->tid) == RT_EOK)
@@ -394,8 +394,8 @@ pthread_t pthread_self (void)
     tid = rt_thread_self();
     if (tid == NULL) return PTHREAD_NUM_MAX;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     return _pthread_data_get_pth(ptd);
@@ -477,8 +477,8 @@ void pthread_exit(void *value)
         return;
     }
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
 
     rt_enter_critical();
     /* disable cancel */
@@ -595,8 +595,8 @@ void pthread_cleanup_pop(int execute)
 
     if (rt_thread_self() == NULL) return;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     if (execute)
@@ -624,8 +624,8 @@ void pthread_cleanup_push(void (*routine)(void *), void *arg)
 
     if (rt_thread_self() == NULL) return;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     cleanup = (_pthread_cleanup_t *)rt_malloc(sizeof(_pthread_cleanup_t));
@@ -676,8 +676,8 @@ int pthread_setcancelstate(int state, int *oldstate)
 
     if (rt_thread_self() == NULL) return EINVAL;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     if ((state == PTHREAD_CANCEL_ENABLE) || (state == PTHREAD_CANCEL_DISABLE))
@@ -699,8 +699,8 @@ int pthread_setcanceltype(int type, int *oldtype)
 
     if (rt_thread_self() == NULL) return EINVAL;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     if ((type != PTHREAD_CANCEL_DEFERRED) && (type != PTHREAD_CANCEL_ASYNCHRONOUS))
@@ -721,8 +721,8 @@ void pthread_testcancel(void)
 
     if (rt_thread_self() == NULL) return;
 
-    /* get pthread data from user data of thread */
-    ptd = (_pthread_data_t *)rt_thread_self()->user_data;
+    /* get pthread data from pthread_data of thread */
+    ptd = (_pthread_data_t *)rt_thread_self()->pthread_data;
     RT_ASSERT(ptd != RT_NULL);
 
     if (ptd->cancelstate == PTHREAD_CANCEL_ENABLE)

+ 5 - 1
include/rtdef.h

@@ -690,9 +690,13 @@ struct rt_thread
     rt_ubase_t  remaining_tick;                         /**< remaining tick */
 
 #ifdef RT_USING_CPU_USAGE
-    rt_uint64_t  duration_tick;                          /**< cpu usage tick */
+    rt_uint64_t  duration_tick;                         /**< cpu usage tick */
 #endif /* RT_USING_CPU_USAGE */
 
+#ifdef RT_USING_PTHREADS
+    void  *pthread_data;                                /**< the handle of pthread data, adapt 32/64bit */
+#endif /* RT_USING_PTHREADS */
+
     struct rt_timer thread_timer;                       /**< built-in thread timer */
 
     void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit */

+ 4 - 0
src/thread.c

@@ -252,6 +252,10 @@ static rt_err_t _thread_init(struct rt_thread *thread,
     thread->duration_tick = 0;
 #endif /* RT_USING_CPU_USAGE */
 
+#ifdef RT_USING_PTHREADS
+    thread->pthread_data = RT_NULL;
+#endif /* RT_USING_PTHREADS */
+
 #ifdef RT_USING_MODULE
     thread->module_id = 0;
 #endif /* RT_USING_MODULE */