xref: /nrf52832-nimble/rt-thread/components/libc/pthreads/pthread_internal.h (revision 104654410c56c573564690304ae786df310c91fc)
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*10465441SEvalZero rt_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