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