xref: /nrf52832-nimble/rt-thread/components/libc/pthreads/pthread_attr.c (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 #include <rtthread.h>
12*10465441SEvalZero #include "pthread.h"
13*10465441SEvalZero #include "sched.h"
14*10465441SEvalZero #include <string.h>
15*10465441SEvalZero 
16*10465441SEvalZero #define DEFAULT_STACK_SIZE  2048
17*10465441SEvalZero #define DEFAULT_PRIORITY    (RT_THREAD_PRIORITY_MAX/2 + RT_THREAD_PRIORITY_MAX/4)
18*10465441SEvalZero 
19*10465441SEvalZero const pthread_attr_t pthread_default_attr =
20*10465441SEvalZero {
21*10465441SEvalZero     0,                          /* stack base */
22*10465441SEvalZero     DEFAULT_STACK_SIZE,         /* stack size */
23*10465441SEvalZero     DEFAULT_PRIORITY,           /* priority */
24*10465441SEvalZero     PTHREAD_CREATE_JOINABLE,    /* detach state */
25*10465441SEvalZero     SCHED_FIFO,                 /* scheduler policy */
26*10465441SEvalZero     PTHREAD_INHERIT_SCHED       /* Inherit parent prio/policy */
27*10465441SEvalZero };
28*10465441SEvalZero 
pthread_attr_init(pthread_attr_t * attr)29*10465441SEvalZero int pthread_attr_init(pthread_attr_t *attr)
30*10465441SEvalZero {
31*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
32*10465441SEvalZero 
33*10465441SEvalZero     *attr = pthread_default_attr;
34*10465441SEvalZero 
35*10465441SEvalZero     return 0;
36*10465441SEvalZero }
37*10465441SEvalZero RTM_EXPORT(pthread_attr_init);
38*10465441SEvalZero 
pthread_attr_destroy(pthread_attr_t * attr)39*10465441SEvalZero int pthread_attr_destroy(pthread_attr_t *attr)
40*10465441SEvalZero {
41*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
42*10465441SEvalZero 
43*10465441SEvalZero     memset(attr, 0, sizeof(pthread_attr_t));
44*10465441SEvalZero 
45*10465441SEvalZero     return 0;
46*10465441SEvalZero }
47*10465441SEvalZero RTM_EXPORT(pthread_attr_destroy);
48*10465441SEvalZero 
pthread_attr_setdetachstate(pthread_attr_t * attr,int state)49*10465441SEvalZero int pthread_attr_setdetachstate(pthread_attr_t *attr, int state)
50*10465441SEvalZero {
51*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
52*10465441SEvalZero 
53*10465441SEvalZero     if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED)
54*10465441SEvalZero         return EINVAL;
55*10465441SEvalZero 
56*10465441SEvalZero     attr->detachstate = state;
57*10465441SEvalZero 
58*10465441SEvalZero     return 0;
59*10465441SEvalZero }
60*10465441SEvalZero RTM_EXPORT(pthread_attr_setdetachstate);
61*10465441SEvalZero 
pthread_attr_getdetachstate(pthread_attr_t const * attr,int * state)62*10465441SEvalZero int pthread_attr_getdetachstate(pthread_attr_t const *attr, int *state)
63*10465441SEvalZero {
64*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
65*10465441SEvalZero 
66*10465441SEvalZero     *state = (int)attr->detachstate;
67*10465441SEvalZero 
68*10465441SEvalZero     return 0;
69*10465441SEvalZero }
70*10465441SEvalZero RTM_EXPORT(pthread_attr_getdetachstate);
71*10465441SEvalZero 
pthread_attr_setschedpolicy(pthread_attr_t * attr,int policy)72*10465441SEvalZero int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
73*10465441SEvalZero {
74*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
75*10465441SEvalZero 
76*10465441SEvalZero     attr->policy = policy;
77*10465441SEvalZero 
78*10465441SEvalZero     return 0;
79*10465441SEvalZero }
80*10465441SEvalZero RTM_EXPORT(pthread_attr_setschedpolicy);
81*10465441SEvalZero 
pthread_attr_getschedpolicy(pthread_attr_t const * attr,int * policy)82*10465441SEvalZero int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy)
83*10465441SEvalZero {
84*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
85*10465441SEvalZero 
86*10465441SEvalZero     *policy = (int)attr->policy;
87*10465441SEvalZero 
88*10465441SEvalZero     return 0;
89*10465441SEvalZero }
90*10465441SEvalZero RTM_EXPORT(pthread_attr_getschedpolicy);
91*10465441SEvalZero 
pthread_attr_setschedparam(pthread_attr_t * attr,struct sched_param const * param)92*10465441SEvalZero int pthread_attr_setschedparam(pthread_attr_t           *attr,
93*10465441SEvalZero                                struct sched_param const *param)
94*10465441SEvalZero {
95*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
96*10465441SEvalZero     RT_ASSERT(param != RT_NULL);
97*10465441SEvalZero 
98*10465441SEvalZero     attr->priority = param->sched_priority;
99*10465441SEvalZero 
100*10465441SEvalZero     return 0;
101*10465441SEvalZero }
102*10465441SEvalZero RTM_EXPORT(pthread_attr_setschedparam);
103*10465441SEvalZero 
pthread_attr_getschedparam(pthread_attr_t const * attr,struct sched_param * param)104*10465441SEvalZero int pthread_attr_getschedparam(pthread_attr_t const *attr,
105*10465441SEvalZero                                struct sched_param   *param)
106*10465441SEvalZero {
107*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
108*10465441SEvalZero     RT_ASSERT(param != RT_NULL);
109*10465441SEvalZero 
110*10465441SEvalZero     param->sched_priority = attr->priority;
111*10465441SEvalZero 
112*10465441SEvalZero     return 0;
113*10465441SEvalZero }
114*10465441SEvalZero RTM_EXPORT(pthread_attr_getschedparam);
115*10465441SEvalZero 
pthread_attr_setstacksize(pthread_attr_t * attr,size_t stack_size)116*10465441SEvalZero int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size)
117*10465441SEvalZero {
118*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
119*10465441SEvalZero 
120*10465441SEvalZero     attr->stack_size = stack_size;
121*10465441SEvalZero 
122*10465441SEvalZero     return 0;
123*10465441SEvalZero }
124*10465441SEvalZero RTM_EXPORT(pthread_attr_setstacksize);
125*10465441SEvalZero 
pthread_attr_getstacksize(pthread_attr_t const * attr,size_t * stack_size)126*10465441SEvalZero int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size)
127*10465441SEvalZero {
128*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
129*10465441SEvalZero 
130*10465441SEvalZero     *stack_size = attr->stack_size;
131*10465441SEvalZero 
132*10465441SEvalZero     return 0;
133*10465441SEvalZero }
134*10465441SEvalZero RTM_EXPORT(pthread_attr_getstacksize);
135*10465441SEvalZero 
pthread_attr_setstackaddr(pthread_attr_t * attr,void * stack_addr)136*10465441SEvalZero int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr)
137*10465441SEvalZero {
138*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
139*10465441SEvalZero 
140*10465441SEvalZero     return EOPNOTSUPP;
141*10465441SEvalZero }
142*10465441SEvalZero RTM_EXPORT(pthread_attr_setstackaddr);
143*10465441SEvalZero 
pthread_attr_getstackaddr(pthread_attr_t const * attr,void ** stack_addr)144*10465441SEvalZero int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr)
145*10465441SEvalZero {
146*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
147*10465441SEvalZero 
148*10465441SEvalZero     return EOPNOTSUPP;
149*10465441SEvalZero }
150*10465441SEvalZero RTM_EXPORT(pthread_attr_getstackaddr);
151*10465441SEvalZero 
pthread_attr_setstack(pthread_attr_t * attr,void * stack_base,size_t stack_size)152*10465441SEvalZero int pthread_attr_setstack(pthread_attr_t *attr,
153*10465441SEvalZero                           void           *stack_base,
154*10465441SEvalZero                           size_t          stack_size)
155*10465441SEvalZero {
156*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
157*10465441SEvalZero 
158*10465441SEvalZero     attr->stack_base = stack_base;
159*10465441SEvalZero     attr->stack_size = RT_ALIGN_DOWN(stack_size, RT_ALIGN_SIZE);
160*10465441SEvalZero 
161*10465441SEvalZero     return 0;
162*10465441SEvalZero }
163*10465441SEvalZero RTM_EXPORT(pthread_attr_setstack);
164*10465441SEvalZero 
pthread_attr_getstack(pthread_attr_t const * attr,void ** stack_base,size_t * stack_size)165*10465441SEvalZero int pthread_attr_getstack(pthread_attr_t const *attr,
166*10465441SEvalZero                           void                **stack_base,
167*10465441SEvalZero                           size_t               *stack_size)
168*10465441SEvalZero {
169*10465441SEvalZero     RT_ASSERT(attr != RT_NULL);
170*10465441SEvalZero 
171*10465441SEvalZero     *stack_base = attr->stack_base;
172*10465441SEvalZero     *stack_size = attr->stack_size;
173*10465441SEvalZero 
174*10465441SEvalZero     return 0;
175*10465441SEvalZero }
176*10465441SEvalZero RTM_EXPORT(pthread_attr_getstack);
177*10465441SEvalZero 
pthread_attr_setguardsize(pthread_attr_t * attr,size_t guard_size)178*10465441SEvalZero int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard_size)
179*10465441SEvalZero {
180*10465441SEvalZero     return EOPNOTSUPP;
181*10465441SEvalZero }
182*10465441SEvalZero 
pthread_attr_getguardsize(pthread_attr_t const * attr,size_t * guard_size)183*10465441SEvalZero int pthread_attr_getguardsize(pthread_attr_t const *attr, size_t *guard_size)
184*10465441SEvalZero {
185*10465441SEvalZero     return EOPNOTSUPP;
186*10465441SEvalZero }
187*10465441SEvalZero RTM_EXPORT(pthread_attr_getguardsize);
188*10465441SEvalZero 
pthread_attr_setscope(pthread_attr_t * attr,int scope)189*10465441SEvalZero int pthread_attr_setscope(pthread_attr_t *attr, int scope)
190*10465441SEvalZero {
191*10465441SEvalZero     if (scope == PTHREAD_SCOPE_SYSTEM)
192*10465441SEvalZero         return 0;
193*10465441SEvalZero     if (scope == PTHREAD_SCOPE_PROCESS)
194*10465441SEvalZero         return EOPNOTSUPP;
195*10465441SEvalZero 
196*10465441SEvalZero     return EINVAL;
197*10465441SEvalZero }
198*10465441SEvalZero RTM_EXPORT(pthread_attr_setscope);
199*10465441SEvalZero 
pthread_attr_getscope(pthread_attr_t const * attr)200*10465441SEvalZero int pthread_attr_getscope(pthread_attr_t const *attr)
201*10465441SEvalZero {
202*10465441SEvalZero     return PTHREAD_SCOPE_SYSTEM;
203*10465441SEvalZero }
204*10465441SEvalZero RTM_EXPORT(pthread_attr_getscope);
205