1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero * 2010-10-26 Bernard the first version 9*10465441SEvalZero */ 10*10465441SEvalZero 11*10465441SEvalZero #ifndef __PTHREAD_INTERNAL_H__ 12*10465441SEvalZero #define __PTHREAD_INTERNAL_H__ 13*10465441SEvalZero 14*10465441SEvalZero #include <rtthread.h> 15*10465441SEvalZero #include <pthread.h> 16*10465441SEvalZero 17*10465441SEvalZero struct _pthread_cleanup 18*10465441SEvalZero { 19*10465441SEvalZero void (*cleanup_func)(void *parameter); 20*10465441SEvalZero void *parameter; 21*10465441SEvalZero 22*10465441SEvalZero struct _pthread_cleanup *next; 23*10465441SEvalZero }; 24*10465441SEvalZero typedef struct _pthread_cleanup _pthread_cleanup_t; 25*10465441SEvalZero 26*10465441SEvalZero struct _pthread_key_data 27*10465441SEvalZero { 28*10465441SEvalZero int is_used; 29*10465441SEvalZero void (*destructor)(void *parameter); 30*10465441SEvalZero }; 31*10465441SEvalZero typedef struct _pthread_key_data _pthread_key_data_t; 32*10465441SEvalZero 33*10465441SEvalZero #define PTHREAD_MAGIC 0x70746873 34*10465441SEvalZero struct _pthread_data 35*10465441SEvalZero { 36*10465441SEvalZero rt_uint32_t magic; 37*10465441SEvalZero pthread_attr_t attr; 38*10465441SEvalZero rt_thread_t tid; 39*10465441SEvalZero 40*10465441SEvalZero void* (*thread_entry)(void *parameter); 41*10465441SEvalZero void *thread_parameter; 42*10465441SEvalZero 43*10465441SEvalZero /* return value */ 44*10465441SEvalZero void *return_value; 45*10465441SEvalZero 46*10465441SEvalZero /* semaphore for joinable thread */ 47*10465441SEvalZero rt_sem_t joinable_sem; 48*10465441SEvalZero 49*10465441SEvalZero /* cancel state and type */ 50*10465441SEvalZero rt_uint8_t cancelstate; 51*10465441SEvalZero volatile rt_uint8_t canceltype; 52*10465441SEvalZero volatile rt_uint8_t canceled; 53*10465441SEvalZero 54*10465441SEvalZero _pthread_cleanup_t *cleanup; 55*10465441SEvalZero void** tls; /* thread-local storage area */ 56*10465441SEvalZero }; 57*10465441SEvalZero typedef struct _pthread_data _pthread_data_t; 58*10465441SEvalZero _pthread_get_data(pthread_t thread)59*10465441SEvalZerort_inline _pthread_data_t *_pthread_get_data(pthread_t thread) 60*10465441SEvalZero { 61*10465441SEvalZero _pthread_data_t *ptd; 62*10465441SEvalZero RT_ASSERT(thread != RT_NULL); 63*10465441SEvalZero 64*10465441SEvalZero ptd = (_pthread_data_t *)thread->user_data; 65*10465441SEvalZero RT_ASSERT(ptd != RT_NULL); 66*10465441SEvalZero RT_ASSERT(ptd->magic == PTHREAD_MAGIC); 67*10465441SEvalZero 68*10465441SEvalZero return ptd; 69*10465441SEvalZero } 70*10465441SEvalZero 71*10465441SEvalZero int clock_time_to_tick(const struct timespec *time); 72*10465441SEvalZero 73*10465441SEvalZero void posix_mq_system_init(void); 74*10465441SEvalZero void posix_sem_system_init(void); 75*10465441SEvalZero void pthread_key_system_init(void); 76*10465441SEvalZero 77*10465441SEvalZero #endif 78