Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions components/libc/compilers/common/cstdlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
34 changes: 17 additions & 17 deletions components/libc/posix/pthreads/pthread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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))
Expand All @@ -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))
Expand All @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion include/rtdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
4 changes: 4 additions & 0 deletions src/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down