1 #include <minix/mthread.h>
5 static struct __mthread_attr
*va_front
, *va_rear
;
6 static void mthread_attr_add(mthread_attr_t
*a
);
7 static void mthread_attr_remove(mthread_attr_t
*a
);
8 static int mthread_attr_valid(mthread_attr_t
*a
);
10 /*===========================================================================*
11 * mthread_init_valid_attributes *
12 *===========================================================================*/
13 void mthread_init_valid_attributes(void)
15 /* Initialize list of valid attributs */
16 va_front
= va_rear
= NULL
;
20 /*===========================================================================*
22 *===========================================================================*/
23 static void mthread_attr_add(a
)
26 /* Add attribute to list of valid, initialized attributes */
28 if (va_front
== NULL
) { /* Empty list */
32 va_rear
->ma_next
= *a
;
33 (*a
)->ma_prev
= va_rear
;
41 /*===========================================================================*
42 * mthread_attr_destroy *
43 *===========================================================================*/
44 int mthread_attr_destroy(attr
)
47 /* Invalidate attribute and deallocate resources. */
52 if (!mthread_attr_valid(attr
))
55 /* Valide attribute; invalidate it */
56 mthread_attr_remove(attr
);
64 /*===========================================================================*
66 *===========================================================================*/
67 int mthread_attr_init(attr
)
68 mthread_attr_t
*attr
; /* Attribute */
70 /* Initialize the attribute to a known state. */
71 struct __mthread_attr
*a
;
75 else if (mthread_attr_valid(attr
))
78 if ((a
= malloc(sizeof(struct __mthread_attr
))) == NULL
)
81 a
->ma_detachstate
= MTHREAD_CREATE_JOINABLE
;
82 a
->ma_stackaddr
= NULL
;
83 a
->ma_stacksize
= (size_t) 0;
85 *attr
= (mthread_attr_t
) a
;
86 mthread_attr_add(attr
); /* Validate attribute: attribute now in use */
91 /*===========================================================================*
92 * mthread_attr_getdetachstate *
93 *===========================================================================*/
94 int mthread_attr_getdetachstate(attr
, detachstate
)
98 /* Get detachstate of a thread attribute */
99 struct __mthread_attr
*a
;
104 a
= (struct __mthread_attr
*) *attr
;
105 if (!mthread_attr_valid(attr
))
108 *detachstate
= a
->ma_detachstate
;
114 /*===========================================================================*
115 * mthread_attr_setdetachstate *
116 *===========================================================================*/
117 int mthread_attr_setdetachstate(attr
, detachstate
)
118 mthread_attr_t
*attr
;
121 /* Set detachstate of a thread attribute */
122 struct __mthread_attr
*a
;
127 a
= (struct __mthread_attr
*) *attr
;
128 if (!mthread_attr_valid(attr
))
130 else if(detachstate
!= MTHREAD_CREATE_JOINABLE
&&
131 detachstate
!= MTHREAD_CREATE_DETACHED
)
134 a
->ma_detachstate
= detachstate
;
140 /*===========================================================================*
141 * mthread_attr_getstack *
142 *===========================================================================*/
143 int mthread_attr_getstack(attr
, stackaddr
, stacksize
)
144 mthread_attr_t
*attr
;
148 /* Get stack attribute */
149 struct __mthread_attr
*a
;
154 a
= (struct __mthread_attr
*) *attr
;
155 if (!mthread_attr_valid(attr
))
158 *stackaddr
= a
->ma_stackaddr
;
159 *stacksize
= a
->ma_stacksize
;
165 /*===========================================================================*
166 * mthread_attr_getstacksize *
167 *===========================================================================*/
168 int mthread_attr_getstacksize(attr
, stacksize
)
169 mthread_attr_t
*attr
;
172 /* Get stack size attribute */
173 struct __mthread_attr
*a
;
178 a
= (struct __mthread_attr
*) *attr
;
179 if (!mthread_attr_valid(attr
))
182 *stacksize
= a
->ma_stacksize
;
188 /*===========================================================================*
189 * mthread_attr_setstack *
190 *===========================================================================*/
191 int mthread_attr_setstack(attr
, stackaddr
, stacksize
)
192 mthread_attr_t
*attr
;
196 /* Set stack attribute */
197 struct __mthread_attr
*a
;
202 a
= (struct __mthread_attr
*) *attr
;
203 if (!mthread_attr_valid(attr
) || stacksize
< MTHREAD_STACK_MIN
)
206 /* We don't care about address alignment (POSIX standard). The ucontext
207 * system calls will make sure that the provided stack will be aligned (at
208 * the cost of some memory if needed).
211 a
->ma_stackaddr
= stackaddr
;
212 a
->ma_stacksize
= stacksize
;
218 /*===========================================================================*
219 * mthread_attr_setstacksize *
220 *===========================================================================*/
221 int mthread_attr_setstacksize(attr
, stacksize
)
222 mthread_attr_t
*attr
;
225 /* Set stack size attribute */
226 struct __mthread_attr
*a
;
231 a
= (struct __mthread_attr
*) *attr
;
232 if (!mthread_attr_valid(attr
) || stacksize
< MTHREAD_STACK_MIN
)
235 a
->ma_stacksize
= stacksize
;
241 /*===========================================================================*
242 * mthread_attr_remove *
243 *===========================================================================*/
244 static void mthread_attr_remove(a
)
247 /* Remove attribute from list of valid, initialized attributes */
249 if ((*a
)->ma_prev
== NULL
)
250 va_front
= (*a
)->ma_next
;
252 (*a
)->ma_prev
->ma_next
= (*a
)->ma_next
;
254 if ((*a
)->ma_next
== NULL
)
255 va_rear
= (*a
)->ma_prev
;
257 (*a
)->ma_next
->ma_prev
= (*a
)->ma_prev
;
261 /*===========================================================================*
262 * mthread_attr_valid *
263 *===========================================================================*/
264 static int mthread_attr_valid(a
)
267 /* Check to see if attribute is on the list of valid attributes */
268 struct __mthread_attr
*loopitem
;
272 while (loopitem
!= NULL
) {
276 loopitem
= loopitem
->ma_next
;
283 /*===========================================================================*
284 * mthread_attr_verify *
285 *===========================================================================*/
287 int mthread_attr_verify(void)
289 /* Return true when no attributes are in use */
290 struct __mthread_attr
*loopitem
;
294 while (loopitem
!= NULL
) {
295 loopitem
= loopitem
->ma_next
;
303 /* pthread compatibility layer. */
304 __weak_alias(pthread_attr_destroy
, mthread_attr_destroy
)
305 __weak_alias(pthread_attr_getdetachstate
, mthread_attr_getdetachstate
)
306 __weak_alias(pthread_attr_getstack
, mthread_attr_getstack
)
307 __weak_alias(pthread_attr_getstacksize
, mthread_attr_getstacksize
)
308 __weak_alias(pthread_attr_init
, mthread_attr_init
)
309 __weak_alias(pthread_attr_setdetachstate
, mthread_attr_setdetachstate
)
310 __weak_alias(pthread_attr_setstack
, mthread_attr_setstack
)
311 __weak_alias(pthread_attr_setstacksize
, mthread_attr_setstacksize
)