thread-stub.c revision 1.20.8.2 1 1.20.8.2 martin /* $NetBSD: thread-stub.c,v 1.20.8.2 2008/04/28 20:23:02 martin Exp $ */
2 1.20.8.2 martin
3 1.20.8.2 martin /*-
4 1.20.8.2 martin * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 1.20.8.2 martin * All rights reserved.
6 1.20.8.2 martin *
7 1.20.8.2 martin * This code is derived from software contributed to The NetBSD Foundation
8 1.20.8.2 martin * by Jason R. Thorpe.
9 1.20.8.2 martin *
10 1.20.8.2 martin * Redistribution and use in source and binary forms, with or without
11 1.20.8.2 martin * modification, are permitted provided that the following conditions
12 1.20.8.2 martin * are met:
13 1.20.8.2 martin * 1. Redistributions of source code must retain the above copyright
14 1.20.8.2 martin * notice, this list of conditions and the following disclaimer.
15 1.20.8.2 martin * 2. Redistributions in binary form must reproduce the above copyright
16 1.20.8.2 martin * notice, this list of conditions and the following disclaimer in the
17 1.20.8.2 martin * documentation and/or other materials provided with the distribution.
18 1.20.8.2 martin *
19 1.20.8.2 martin * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.20.8.2 martin * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.20.8.2 martin * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.20.8.2 martin * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.20.8.2 martin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.20.8.2 martin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.20.8.2 martin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.20.8.2 martin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.20.8.2 martin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.20.8.2 martin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.20.8.2 martin * POSSIBILITY OF SUCH DAMAGE.
30 1.20.8.2 martin */
31 1.20.8.2 martin
32 1.20.8.2 martin #include <sys/cdefs.h>
33 1.20.8.2 martin #if defined(LIBC_SCCS) && !defined(lint)
34 1.20.8.2 martin __RCSID("$NetBSD: thread-stub.c,v 1.20.8.2 2008/04/28 20:23:02 martin Exp $");
35 1.20.8.2 martin #endif /* LIBC_SCCS and not lint */
36 1.20.8.2 martin
37 1.20.8.2 martin /*
38 1.20.8.2 martin * Stubs for thread operations, for use when threads are not used by
39 1.20.8.2 martin * the application. See "reentrant.h" for details.
40 1.20.8.2 martin */
41 1.20.8.2 martin
42 1.20.8.2 martin #ifdef _REENTRANT
43 1.20.8.2 martin
44 1.20.8.2 martin #define __LIBC_THREAD_STUBS
45 1.20.8.2 martin
46 1.20.8.2 martin #include "namespace.h"
47 1.20.8.2 martin #include "reentrant.h"
48 1.20.8.2 martin
49 1.20.8.2 martin #include <errno.h>
50 1.20.8.2 martin #include <signal.h>
51 1.20.8.2 martin #include <stdlib.h>
52 1.20.8.2 martin #include <unistd.h>
53 1.20.8.2 martin
54 1.20.8.2 martin extern int __isthreaded;
55 1.20.8.2 martin
56 1.20.8.2 martin #define DIE() (void)kill(getpid(), SIGABRT)
57 1.20.8.2 martin
58 1.20.8.2 martin #define CHECK_NOT_THREADED_ALWAYS() \
59 1.20.8.2 martin do { \
60 1.20.8.2 martin if (__isthreaded) \
61 1.20.8.2 martin DIE(); \
62 1.20.8.2 martin } while (/*CONSTCOND*/0)
63 1.20.8.2 martin
64 1.20.8.2 martin #if 1
65 1.20.8.2 martin #define CHECK_NOT_THREADED() CHECK_NOT_THREADED_ALWAYS()
66 1.20.8.2 martin #else
67 1.20.8.2 martin #define CHECK_NOT_THREADED() /* nothing */
68 1.20.8.2 martin #endif
69 1.20.8.2 martin
70 1.20.8.2 martin /* libpthread init */
71 1.20.8.2 martin
72 1.20.8.2 martin void __libc_thr_init(void);
73 1.20.8.2 martin void __libc_thr_init_stub(void);
74 1.20.8.2 martin
75 1.20.8.2 martin __weak_alias(__libc_thr_init,__libc_thr_init_stub)
76 1.20.8.2 martin
77 1.20.8.2 martin void
78 1.20.8.2 martin __libc_thr_init_stub(void)
79 1.20.8.2 martin {
80 1.20.8.2 martin
81 1.20.8.2 martin /* nothing, may be overridden by libpthread */
82 1.20.8.2 martin }
83 1.20.8.2 martin
84 1.20.8.2 martin /* mutexes */
85 1.20.8.2 martin
86 1.20.8.2 martin int __libc_mutex_init_stub(mutex_t *, const mutexattr_t *);
87 1.20.8.2 martin int __libc_mutex_catchall_stub(mutex_t *);
88 1.20.8.2 martin
89 1.20.8.2 martin __weak_alias(__libc_mutex_init,__libc_mutex_init_stub)
90 1.20.8.2 martin __weak_alias(__libc_mutex_lock,__libc_mutex_catchall_stub)
91 1.20.8.2 martin __weak_alias(__libc_mutex_trylock,__libc_mutex_catchall_stub)
92 1.20.8.2 martin __weak_alias(__libc_mutex_unlock,__libc_mutex_catchall_stub)
93 1.20.8.2 martin __weak_alias(__libc_mutex_destroy,__libc_mutex_catchall_stub)
94 1.20.8.2 martin
95 1.20.8.2 martin int __libc_mutexattr_catchall_stub(mutexattr_t *);
96 1.20.8.2 martin int __libc_mutexattr_settype_stub(mutexattr_t *, int);
97 1.20.8.2 martin
98 1.20.8.2 martin __weak_alias(__libc_mutexattr_init,__libc_mutexattr_catchall_stub)
99 1.20.8.2 martin __weak_alias(__libc_mutexattr_destroy,__libc_mutexattr_catchall_stub)
100 1.20.8.2 martin __weak_alias(__libc_mutexattr_settype,__libc_mutexattr_settype_stub)
101 1.20.8.2 martin
102 1.20.8.2 martin int
103 1.20.8.2 martin __libc_mutex_init_stub(mutex_t *m, const mutexattr_t *a)
104 1.20.8.2 martin {
105 1.20.8.2 martin /* LINTED deliberate lack of effect */
106 1.20.8.2 martin (void)m;
107 1.20.8.2 martin /* LINTED deliberate lack of effect */
108 1.20.8.2 martin (void)a;
109 1.20.8.2 martin
110 1.20.8.2 martin CHECK_NOT_THREADED();
111 1.20.8.2 martin
112 1.20.8.2 martin return (0);
113 1.20.8.2 martin }
114 1.20.8.2 martin
115 1.20.8.2 martin int
116 1.20.8.2 martin __libc_mutex_catchall_stub(mutex_t *m)
117 1.20.8.2 martin {
118 1.20.8.2 martin /* LINTED deliberate lack of effect */
119 1.20.8.2 martin (void)m;
120 1.20.8.2 martin
121 1.20.8.2 martin CHECK_NOT_THREADED();
122 1.20.8.2 martin
123 1.20.8.2 martin return (0);
124 1.20.8.2 martin }
125 1.20.8.2 martin
126 1.20.8.2 martin int
127 1.20.8.2 martin __libc_mutexattr_settype_stub(mutexattr_t *ma, int type)
128 1.20.8.2 martin {
129 1.20.8.2 martin /* LINTED deliberate lack of effect */
130 1.20.8.2 martin (void)ma;
131 1.20.8.2 martin /* LINTED deliberate lack of effect */
132 1.20.8.2 martin (void)type;
133 1.20.8.2 martin
134 1.20.8.2 martin return (0);
135 1.20.8.2 martin }
136 1.20.8.2 martin
137 1.20.8.2 martin int
138 1.20.8.2 martin __libc_mutexattr_catchall_stub(mutexattr_t *ma)
139 1.20.8.2 martin {
140 1.20.8.2 martin /* LINTED deliberate lack of effect */
141 1.20.8.2 martin (void)ma;
142 1.20.8.2 martin
143 1.20.8.2 martin CHECK_NOT_THREADED();
144 1.20.8.2 martin
145 1.20.8.2 martin return (0);
146 1.20.8.2 martin }
147 1.20.8.2 martin
148 1.20.8.2 martin /* condition variables */
149 1.20.8.2 martin
150 1.20.8.2 martin int __libc_cond_init_stub(cond_t *, const condattr_t *);
151 1.20.8.2 martin int __libc_cond_wait_stub(cond_t *, mutex_t *);
152 1.20.8.2 martin int __libc_cond_timedwait_stub(cond_t *, mutex_t *,
153 1.20.8.2 martin const struct timespec *);
154 1.20.8.2 martin int __libc_cond_catchall_stub(cond_t *);
155 1.20.8.2 martin
156 1.20.8.2 martin __weak_alias(__libc_cond_init,__libc_cond_init_stub)
157 1.20.8.2 martin __weak_alias(__libc_cond_signal,__libc_cond_catchall_stub)
158 1.20.8.2 martin __weak_alias(__libc_cond_broadcast,__libc_cond_catchall_stub)
159 1.20.8.2 martin __weak_alias(__libc_cond_wait,__libc_cond_wait_stub)
160 1.20.8.2 martin __weak_alias(__libc_cond_timedwait,__libc_cond_timedwait_stub)
161 1.20.8.2 martin __weak_alias(__libc_cond_destroy,__libc_cond_catchall_stub)
162 1.20.8.2 martin
163 1.20.8.2 martin int
164 1.20.8.2 martin __libc_cond_init_stub(cond_t *c, const condattr_t *a)
165 1.20.8.2 martin {
166 1.20.8.2 martin /* LINTED deliberate lack of effect */
167 1.20.8.2 martin (void)c;
168 1.20.8.2 martin /* LINTED deliberate lack of effect */
169 1.20.8.2 martin (void)a;
170 1.20.8.2 martin
171 1.20.8.2 martin CHECK_NOT_THREADED();
172 1.20.8.2 martin
173 1.20.8.2 martin return (0);
174 1.20.8.2 martin }
175 1.20.8.2 martin
176 1.20.8.2 martin int
177 1.20.8.2 martin __libc_cond_wait_stub(cond_t *c, mutex_t *m)
178 1.20.8.2 martin {
179 1.20.8.2 martin /* LINTED deliberate lack of effect */
180 1.20.8.2 martin (void)c;
181 1.20.8.2 martin /* LINTED deliberate lack of effect */
182 1.20.8.2 martin (void)m;
183 1.20.8.2 martin
184 1.20.8.2 martin CHECK_NOT_THREADED();
185 1.20.8.2 martin
186 1.20.8.2 martin return (0);
187 1.20.8.2 martin }
188 1.20.8.2 martin
189 1.20.8.2 martin int
190 1.20.8.2 martin __libc_cond_timedwait_stub(cond_t *c, mutex_t *m, const struct timespec *t)
191 1.20.8.2 martin {
192 1.20.8.2 martin /* LINTED deliberate lack of effect */
193 1.20.8.2 martin (void)c;
194 1.20.8.2 martin /* LINTED deliberate lack of effect */
195 1.20.8.2 martin (void)m;
196 1.20.8.2 martin /* LINTED deliberate lack of effect */
197 1.20.8.2 martin (void)t;
198 1.20.8.2 martin
199 1.20.8.2 martin CHECK_NOT_THREADED();
200 1.20.8.2 martin
201 1.20.8.2 martin return (0);
202 1.20.8.2 martin }
203 1.20.8.2 martin
204 1.20.8.2 martin int
205 1.20.8.2 martin __libc_cond_catchall_stub(cond_t *c)
206 1.20.8.2 martin {
207 1.20.8.2 martin /* LINTED deliberate lack of effect */
208 1.20.8.2 martin (void)c;
209 1.20.8.2 martin
210 1.20.8.2 martin CHECK_NOT_THREADED();
211 1.20.8.2 martin
212 1.20.8.2 martin return (0);
213 1.20.8.2 martin }
214 1.20.8.2 martin
215 1.20.8.2 martin
216 1.20.8.2 martin /* read-write locks */
217 1.20.8.2 martin
218 1.20.8.2 martin int __libc_rwlock_init_stub(rwlock_t *, rwlockattr_t *);
219 1.20.8.2 martin int __libc_rwlock_catchall_stub(rwlock_t *);
220 1.20.8.2 martin
221 1.20.8.2 martin __weak_alias(__libc_rwlock_init,__libc_rwlock_init_stub)
222 1.20.8.2 martin __weak_alias(__libc_rwlock_rdlock,__libc_rwlock_catchall_stub)
223 1.20.8.2 martin __weak_alias(__libc_rwlock_wrlock,__libc_rwlock_catchall_stub)
224 1.20.8.2 martin __weak_alias(__libc_rwlock_tryrdlock,__libc_rwlock_catchall_stub)
225 1.20.8.2 martin __weak_alias(__libc_rwlock_trywrlock,__libc_rwlock_catchall_stub)
226 1.20.8.2 martin __weak_alias(__libc_rwlock_unlock,__libc_rwlock_catchall_stub)
227 1.20.8.2 martin __weak_alias(__libc_rwlock_destroy,__libc_rwlock_catchall_stub)
228 1.20.8.2 martin
229 1.20.8.2 martin int
230 1.20.8.2 martin __libc_rwlock_init_stub(rwlock_t *l, rwlockattr_t *a)
231 1.20.8.2 martin {
232 1.20.8.2 martin /* LINTED deliberate lack of effect */
233 1.20.8.2 martin (void)l;
234 1.20.8.2 martin /* LINTED deliberate lack of effect */
235 1.20.8.2 martin (void)a;
236 1.20.8.2 martin
237 1.20.8.2 martin CHECK_NOT_THREADED();
238 1.20.8.2 martin
239 1.20.8.2 martin return (0);
240 1.20.8.2 martin }
241 1.20.8.2 martin
242 1.20.8.2 martin int
243 1.20.8.2 martin __libc_rwlock_catchall_stub(rwlock_t *l)
244 1.20.8.2 martin {
245 1.20.8.2 martin /* LINTED deliberate lack of effect */
246 1.20.8.2 martin (void)l;
247 1.20.8.2 martin
248 1.20.8.2 martin CHECK_NOT_THREADED();
249 1.20.8.2 martin
250 1.20.8.2 martin return (0);
251 1.20.8.2 martin }
252 1.20.8.2 martin
253 1.20.8.2 martin
254 1.20.8.2 martin /*
255 1.20.8.2 martin * thread-specific data; we need to actually provide a simple TSD
256 1.20.8.2 martin * implementation, since some thread-safe libraries want to use it.
257 1.20.8.2 martin */
258 1.20.8.2 martin
259 1.20.8.2 martin #define TSD_KEYS_MAX 64
260 1.20.8.2 martin
261 1.20.8.2 martin static struct {
262 1.20.8.2 martin void *tsd_val;
263 1.20.8.2 martin void (*tsd_dtor)(void *);
264 1.20.8.2 martin int tsd_inuse;
265 1.20.8.2 martin } __libc_tsd[TSD_KEYS_MAX];
266 1.20.8.2 martin static int __libc_tsd_nextkey;
267 1.20.8.2 martin
268 1.20.8.2 martin int __libc_thr_keycreate_stub(thread_key_t *, void (*)(void *));
269 1.20.8.2 martin int __libc_thr_setspecific_stub(thread_key_t, const void *);
270 1.20.8.2 martin void *__libc_thr_getspecific_stub(thread_key_t);
271 1.20.8.2 martin int __libc_thr_keydelete_stub(thread_key_t);
272 1.20.8.2 martin
273 1.20.8.2 martin __weak_alias(__libc_thr_keycreate,__libc_thr_keycreate_stub)
274 1.20.8.2 martin __weak_alias(__libc_thr_setspecific,__libc_thr_setspecific_stub)
275 1.20.8.2 martin __weak_alias(__libc_thr_getspecific,__libc_thr_getspecific_stub)
276 1.20.8.2 martin __weak_alias(__libc_thr_keydelete,__libc_thr_keydelete_stub)
277 1.20.8.2 martin
278 1.20.8.2 martin int
279 1.20.8.2 martin __libc_thr_keycreate_stub(thread_key_t *k, void (*d)(void *))
280 1.20.8.2 martin {
281 1.20.8.2 martin int i;
282 1.20.8.2 martin
283 1.20.8.2 martin for (i = __libc_tsd_nextkey; i < TSD_KEYS_MAX; i++) {
284 1.20.8.2 martin if (__libc_tsd[i].tsd_inuse == 0)
285 1.20.8.2 martin goto out;
286 1.20.8.2 martin }
287 1.20.8.2 martin
288 1.20.8.2 martin for (i = 0; i < __libc_tsd_nextkey; i++) {
289 1.20.8.2 martin if (__libc_tsd[i].tsd_inuse == 0)
290 1.20.8.2 martin goto out;
291 1.20.8.2 martin }
292 1.20.8.2 martin
293 1.20.8.2 martin return (EAGAIN);
294 1.20.8.2 martin
295 1.20.8.2 martin out:
296 1.20.8.2 martin /*
297 1.20.8.2 martin * XXX We don't actually do anything with the destructor. We
298 1.20.8.2 martin * XXX probably should.
299 1.20.8.2 martin */
300 1.20.8.2 martin __libc_tsd[i].tsd_inuse = 1;
301 1.20.8.2 martin __libc_tsd_nextkey = (i + i) % TSD_KEYS_MAX;
302 1.20.8.2 martin __libc_tsd[i].tsd_dtor = d;
303 1.20.8.2 martin *k = i;
304 1.20.8.2 martin
305 1.20.8.2 martin return (0);
306 1.20.8.2 martin }
307 1.20.8.2 martin
308 1.20.8.2 martin int
309 1.20.8.2 martin __libc_thr_setspecific_stub(thread_key_t k, const void *v)
310 1.20.8.2 martin {
311 1.20.8.2 martin
312 1.20.8.2 martin __libc_tsd[k].tsd_val = __UNCONST(v);
313 1.20.8.2 martin
314 1.20.8.2 martin return (0);
315 1.20.8.2 martin }
316 1.20.8.2 martin
317 1.20.8.2 martin void *
318 1.20.8.2 martin __libc_thr_getspecific_stub(thread_key_t k)
319 1.20.8.2 martin {
320 1.20.8.2 martin
321 1.20.8.2 martin return (__libc_tsd[k].tsd_val);
322 1.20.8.2 martin }
323 1.20.8.2 martin
324 1.20.8.2 martin int
325 1.20.8.2 martin __libc_thr_keydelete_stub(thread_key_t k)
326 1.20.8.2 martin {
327 1.20.8.2 martin
328 1.20.8.2 martin /*
329 1.20.8.2 martin * XXX Do not recycle key; see big comment in libpthread.
330 1.20.8.2 martin */
331 1.20.8.2 martin
332 1.20.8.2 martin __libc_tsd[k].tsd_dtor = NULL;
333 1.20.8.2 martin
334 1.20.8.2 martin return (0);
335 1.20.8.2 martin }
336 1.20.8.2 martin
337 1.20.8.2 martin
338 1.20.8.2 martin /* misc. */
339 1.20.8.2 martin
340 1.20.8.2 martin int __libc_thr_once_stub(once_t *, void (*)(void));
341 1.20.8.2 martin int __libc_thr_sigsetmask_stub(int, const sigset_t *, sigset_t *);
342 1.20.8.2 martin thr_t __libc_thr_self_stub(void);
343 1.20.8.2 martin int __libc_thr_yield_stub(void);
344 1.20.8.2 martin int __libc_thr_create_stub(thr_t *, const thrattr_t *,
345 1.20.8.2 martin void *(*)(void *), void *);
346 1.20.8.2 martin void __libc_thr_exit_stub(void *);
347 1.20.8.2 martin int *__libc_thr_errno_stub(void);
348 1.20.8.2 martin int __libc_thr_setcancelstate_stub(int, int *);
349 1.20.8.2 martin int __libc_thr_equal_stub(pthread_t, pthread_t);
350 1.20.8.2 martin unsigned int __libc_thr_curcpu_stub(void);
351 1.20.8.2 martin
352 1.20.8.2 martin __weak_alias(__libc_thr_once,__libc_thr_once_stub)
353 1.20.8.2 martin __weak_alias(__libc_thr_sigsetmask,__libc_thr_sigsetmask_stub)
354 1.20.8.2 martin __weak_alias(__libc_thr_self,__libc_thr_self_stub)
355 1.20.8.2 martin __weak_alias(__libc_thr_yield,__libc_thr_yield_stub)
356 1.20.8.2 martin __weak_alias(__libc_thr_create,__libc_thr_create_stub)
357 1.20.8.2 martin __weak_alias(__libc_thr_exit,__libc_thr_exit_stub)
358 1.20.8.2 martin __weak_alias(__libc_thr_errno,__libc_thr_errno_stub)
359 1.20.8.2 martin __weak_alias(__libc_thr_setcancelstate,__libc_thr_setcancelstate_stub)
360 1.20.8.2 martin __weak_alias(__libc_thr_equal,__libc_thr_equal_stub)
361 1.20.8.2 martin __weak_alias(__libc_thr_curcpu,__libc_thr_curcpu_stub)
362 1.20.8.2 martin
363 1.20.8.2 martin
364 1.20.8.2 martin int
365 1.20.8.2 martin __libc_thr_once_stub(once_t *o, void (*r)(void))
366 1.20.8.2 martin {
367 1.20.8.2 martin
368 1.20.8.2 martin /* XXX Knowledge of libpthread types. */
369 1.20.8.2 martin
370 1.20.8.2 martin if (o->pto_done == 0) {
371 1.20.8.2 martin (*r)();
372 1.20.8.2 martin o->pto_done = 1;
373 1.20.8.2 martin }
374 1.20.8.2 martin
375 1.20.8.2 martin return (0);
376 1.20.8.2 martin }
377 1.20.8.2 martin
378 1.20.8.2 martin int
379 1.20.8.2 martin __libc_thr_sigsetmask_stub(int h, const sigset_t *s, sigset_t *o)
380 1.20.8.2 martin {
381 1.20.8.2 martin
382 1.20.8.2 martin CHECK_NOT_THREADED();
383 1.20.8.2 martin
384 1.20.8.2 martin return sigprocmask(h, s, o);
385 1.20.8.2 martin }
386 1.20.8.2 martin
387 1.20.8.2 martin thr_t
388 1.20.8.2 martin __libc_thr_self_stub(void)
389 1.20.8.2 martin {
390 1.20.8.2 martin
391 1.20.8.2 martin return ((thr_t) -1);
392 1.20.8.2 martin }
393 1.20.8.2 martin
394 1.20.8.2 martin int
395 1.20.8.2 martin __libc_thr_yield_stub(void)
396 1.20.8.2 martin {
397 1.20.8.2 martin
398 1.20.8.2 martin /* Nothing to do. */
399 1.20.8.2 martin return (0);
400 1.20.8.2 martin }
401 1.20.8.2 martin
402 1.20.8.2 martin int
403 1.20.8.2 martin __libc_thr_create_stub(thr_t *tp, const thrattr_t *ta,
404 1.20.8.2 martin void *(*f)(void *), void *a)
405 1.20.8.2 martin {
406 1.20.8.2 martin /* LINTED deliberate lack of effect */
407 1.20.8.2 martin (void)tp;
408 1.20.8.2 martin /* LINTED deliberate lack of effect */
409 1.20.8.2 martin (void)ta;
410 1.20.8.2 martin /* LINTED deliberate lack of effect */
411 1.20.8.2 martin (void)f;
412 1.20.8.2 martin /* LINTED deliberate lack of effect */
413 1.20.8.2 martin (void)a;
414 1.20.8.2 martin
415 1.20.8.2 martin DIE();
416 1.20.8.2 martin
417 1.20.8.2 martin return (EOPNOTSUPP);
418 1.20.8.2 martin }
419 1.20.8.2 martin
420 1.20.8.2 martin void
421 1.20.8.2 martin __libc_thr_exit_stub(void *v)
422 1.20.8.2 martin {
423 1.20.8.2 martin /* LINTED deliberate lack of effect */
424 1.20.8.2 martin (void)v;
425 1.20.8.2 martin exit(0);
426 1.20.8.2 martin }
427 1.20.8.2 martin
428 1.20.8.2 martin int
429 1.20.8.2 martin __libc_thr_setcancelstate_stub(int new, int *old)
430 1.20.8.2 martin {
431 1.20.8.2 martin /* LINTED deliberate lack of effect */
432 1.20.8.2 martin (void)new;
433 1.20.8.2 martin
434 1.20.8.2 martin /* LINTED deliberate lack of effect */
435 1.20.8.2 martin (void)old;
436 1.20.8.2 martin
437 1.20.8.2 martin CHECK_NOT_THREADED();
438 1.20.8.2 martin
439 1.20.8.2 martin return (0);
440 1.20.8.2 martin }
441 1.20.8.2 martin
442 1.20.8.2 martin int
443 1.20.8.2 martin __libc_thr_equal_stub(pthread_t t1, pthread_t t2)
444 1.20.8.2 martin {
445 1.20.8.2 martin
446 1.20.8.2 martin /* assert that t1=t2=pthread_self() */
447 1.20.8.2 martin return (t1 == t2);
448 1.20.8.2 martin }
449 1.20.8.2 martin
450 1.20.8.2 martin int *
451 1.20.8.2 martin __libc_thr_errno_stub(void)
452 1.20.8.2 martin {
453 1.20.8.2 martin
454 1.20.8.2 martin DIE();
455 1.20.8.2 martin
456 1.20.8.2 martin return (NULL);
457 1.20.8.2 martin }
458 1.20.8.2 martin
459 1.20.8.2 martin unsigned int
460 1.20.8.2 martin __libc_thr_curcpu_stub(void)
461 1.20.8.2 martin {
462 1.20.8.2 martin
463 1.20.8.2 martin return (0);
464 1.20.8.2 martin }
465 1.20.8.2 martin
466 1.20.8.2 martin #endif /* _REENTRANT */
467