xref: /minix3/lib/libc/thread-stub/thread-stub.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: thread-stub.c,v 1.27 2013/05/28 17:29:41 christos Exp $	*/
22fe8fb19SBen Gras 
32fe8fb19SBen Gras /*-
42fe8fb19SBen Gras  * Copyright (c) 2003, 2009 The NetBSD Foundation, Inc.
52fe8fb19SBen Gras  * All rights reserved.
62fe8fb19SBen Gras  *
72fe8fb19SBen Gras  * This code is derived from software contributed to The NetBSD Foundation
82fe8fb19SBen Gras  * by Jason R. Thorpe.
92fe8fb19SBen Gras  *
102fe8fb19SBen Gras  * Redistribution and use in source and binary forms, with or without
112fe8fb19SBen Gras  * modification, are permitted provided that the following conditions
122fe8fb19SBen Gras  * are met:
132fe8fb19SBen Gras  * 1. Redistributions of source code must retain the above copyright
142fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer.
152fe8fb19SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
162fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer in the
172fe8fb19SBen Gras  *    documentation and/or other materials provided with the distribution.
182fe8fb19SBen Gras  *
192fe8fb19SBen Gras  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
202fe8fb19SBen Gras  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
212fe8fb19SBen Gras  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
222fe8fb19SBen Gras  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
232fe8fb19SBen Gras  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
242fe8fb19SBen Gras  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
252fe8fb19SBen Gras  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
262fe8fb19SBen Gras  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
272fe8fb19SBen Gras  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
282fe8fb19SBen Gras  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
292fe8fb19SBen Gras  * POSSIBILITY OF SUCH DAMAGE.
302fe8fb19SBen Gras  */
312fe8fb19SBen Gras 
322fe8fb19SBen Gras #include <sys/cdefs.h>
332fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
34*84d9c625SLionel Sambuc __RCSID("$NetBSD: thread-stub.c,v 1.27 2013/05/28 17:29:41 christos Exp $");
352fe8fb19SBen Gras #endif /* LIBC_SCCS and not lint */
362fe8fb19SBen Gras 
372fe8fb19SBen Gras /*
382fe8fb19SBen Gras  * Stubs for thread operations, for use when threads are not used by
392fe8fb19SBen Gras  * the application.  See "reentrant.h" for details.
402fe8fb19SBen Gras  */
412fe8fb19SBen Gras 
422fe8fb19SBen Gras #ifdef _REENTRANT
432fe8fb19SBen Gras 
442fe8fb19SBen Gras #define	__LIBC_THREAD_STUBS
452fe8fb19SBen Gras 
46*84d9c625SLionel Sambuc #define pthread_join	__libc_pthread_join
47*84d9c625SLionel Sambuc #define pthread_detach	__libc_pthread_detach
482fe8fb19SBen Gras #include "namespace.h"
492fe8fb19SBen Gras #include "reentrant.h"
502fe8fb19SBen Gras 
512fe8fb19SBen Gras #include <errno.h>
522fe8fb19SBen Gras #include <signal.h>
532fe8fb19SBen Gras #include <stdlib.h>
542fe8fb19SBen Gras #include <unistd.h>
552fe8fb19SBen Gras 
562fe8fb19SBen Gras extern int __isthreaded;
572fe8fb19SBen Gras 
582fe8fb19SBen Gras #define	DIE()	(void)raise(SIGABRT)
592fe8fb19SBen Gras 
602fe8fb19SBen Gras #define	CHECK_NOT_THREADED_ALWAYS()	\
612fe8fb19SBen Gras do {					\
622fe8fb19SBen Gras 	if (__isthreaded)		\
632fe8fb19SBen Gras 		DIE();			\
642fe8fb19SBen Gras } while (/*CONSTCOND*/0)
652fe8fb19SBen Gras 
662fe8fb19SBen Gras #if 1
672fe8fb19SBen Gras #define	CHECK_NOT_THREADED()	CHECK_NOT_THREADED_ALWAYS()
682fe8fb19SBen Gras #else
692fe8fb19SBen Gras #define	CHECK_NOT_THREADED()	/* nothing */
702fe8fb19SBen Gras #endif
712fe8fb19SBen Gras 
__weak_alias(pthread_join,__libc_pthread_join)72*84d9c625SLionel Sambuc __weak_alias(pthread_join, __libc_pthread_join)
73*84d9c625SLionel Sambuc __weak_alias(pthread_detach, __libc_pthread_detach)
742fe8fb19SBen Gras 
75*84d9c625SLionel Sambuc int
76*84d9c625SLionel Sambuc pthread_join(pthread_t thread, void **valptr)
772fe8fb19SBen Gras {
782fe8fb19SBen Gras 
79*84d9c625SLionel Sambuc 	if (thread == pthread_self())
80*84d9c625SLionel Sambuc 		return EDEADLK;
81*84d9c625SLionel Sambuc 	return ESRCH;
82*84d9c625SLionel Sambuc }
83*84d9c625SLionel Sambuc 
84*84d9c625SLionel Sambuc int
pthread_detach(pthread_t thread)85*84d9c625SLionel Sambuc pthread_detach(pthread_t thread)
86*84d9c625SLionel Sambuc {
87*84d9c625SLionel Sambuc 
88*84d9c625SLionel Sambuc 	if (thread == pthread_self())
89*84d9c625SLionel Sambuc 		return 0;
90*84d9c625SLionel Sambuc 	return ESRCH;
912fe8fb19SBen Gras }
922fe8fb19SBen Gras 
932fe8fb19SBen Gras /* mutexes */
942fe8fb19SBen Gras 
952fe8fb19SBen Gras int __libc_mutex_catchall_stub(mutex_t *);
962fe8fb19SBen Gras 
972fe8fb19SBen Gras __weak_alias(__libc_mutex_init,__libc_mutex_init_stub)
982fe8fb19SBen Gras __weak_alias(__libc_mutex_lock,__libc_mutex_catchall_stub)
992fe8fb19SBen Gras __weak_alias(__libc_mutex_trylock,__libc_mutex_catchall_stub)
1002fe8fb19SBen Gras __weak_alias(__libc_mutex_unlock,__libc_mutex_catchall_stub)
1012fe8fb19SBen Gras __weak_alias(__libc_mutex_destroy,__libc_mutex_catchall_stub)
1022fe8fb19SBen Gras 
103*84d9c625SLionel Sambuc __strong_alias(__libc_mutex_lock_stub,__libc_mutex_catchall_stub)
104*84d9c625SLionel Sambuc __strong_alias(__libc_mutex_trylock_stub,__libc_mutex_catchall_stub)
105*84d9c625SLionel Sambuc __strong_alias(__libc_mutex_unlock_stub,__libc_mutex_catchall_stub)
106*84d9c625SLionel Sambuc __strong_alias(__libc_mutex_destroy_stub,__libc_mutex_catchall_stub)
107*84d9c625SLionel Sambuc 
1082fe8fb19SBen Gras int __libc_mutexattr_catchall_stub(mutexattr_t *);
1092fe8fb19SBen Gras 
__weak_alias(__libc_mutexattr_init,__libc_mutexattr_catchall_stub)1102fe8fb19SBen Gras __weak_alias(__libc_mutexattr_init,__libc_mutexattr_catchall_stub)
1112fe8fb19SBen Gras __weak_alias(__libc_mutexattr_destroy,__libc_mutexattr_catchall_stub)
1122fe8fb19SBen Gras __weak_alias(__libc_mutexattr_settype,__libc_mutexattr_settype_stub)
1132fe8fb19SBen Gras 
114*84d9c625SLionel Sambuc __strong_alias(__libc_mutexattr_init_stub,__libc_mutexattr_catchall_stub)
115*84d9c625SLionel Sambuc __strong_alias(__libc_mutexattr_destroy_stub,__libc_mutexattr_catchall_stub)
116*84d9c625SLionel Sambuc 
1172fe8fb19SBen Gras int
1182fe8fb19SBen Gras __libc_mutex_init_stub(mutex_t *m, const mutexattr_t *a)
1192fe8fb19SBen Gras {
1202fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1212fe8fb19SBen Gras 	(void)m;
1222fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1232fe8fb19SBen Gras 	(void)a;
1242fe8fb19SBen Gras 
1252fe8fb19SBen Gras 	CHECK_NOT_THREADED();
1262fe8fb19SBen Gras 
1272fe8fb19SBen Gras 	return (0);
1282fe8fb19SBen Gras }
1292fe8fb19SBen Gras 
1302fe8fb19SBen Gras int
__libc_mutex_catchall_stub(mutex_t * m)1312fe8fb19SBen Gras __libc_mutex_catchall_stub(mutex_t *m)
1322fe8fb19SBen Gras {
1332fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1342fe8fb19SBen Gras 	(void)m;
1352fe8fb19SBen Gras 
1362fe8fb19SBen Gras 	CHECK_NOT_THREADED();
1372fe8fb19SBen Gras 
1382fe8fb19SBen Gras 	return (0);
1392fe8fb19SBen Gras }
1402fe8fb19SBen Gras 
1412fe8fb19SBen Gras int
__libc_mutexattr_settype_stub(mutexattr_t * ma,int type)1422fe8fb19SBen Gras __libc_mutexattr_settype_stub(mutexattr_t *ma, int type)
1432fe8fb19SBen Gras {
1442fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1452fe8fb19SBen Gras 	(void)ma;
1462fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1472fe8fb19SBen Gras 	(void)type;
1482fe8fb19SBen Gras 
1492fe8fb19SBen Gras 	return (0);
1502fe8fb19SBen Gras }
1512fe8fb19SBen Gras 
1522fe8fb19SBen Gras int
__libc_mutexattr_catchall_stub(mutexattr_t * ma)1532fe8fb19SBen Gras __libc_mutexattr_catchall_stub(mutexattr_t *ma)
1542fe8fb19SBen Gras {
1552fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1562fe8fb19SBen Gras 	(void)ma;
1572fe8fb19SBen Gras 
1582fe8fb19SBen Gras 	CHECK_NOT_THREADED();
1592fe8fb19SBen Gras 
1602fe8fb19SBen Gras 	return (0);
1612fe8fb19SBen Gras }
1622fe8fb19SBen Gras 
1632fe8fb19SBen Gras /* condition variables */
1642fe8fb19SBen Gras 
1652fe8fb19SBen Gras int __libc_cond_catchall_stub(cond_t *);
1662fe8fb19SBen Gras 
__weak_alias(__libc_cond_init,__libc_cond_init_stub)1672fe8fb19SBen Gras __weak_alias(__libc_cond_init,__libc_cond_init_stub)
1682fe8fb19SBen Gras __weak_alias(__libc_cond_signal,__libc_cond_catchall_stub)
1692fe8fb19SBen Gras __weak_alias(__libc_cond_broadcast,__libc_cond_catchall_stub)
170*84d9c625SLionel Sambuc __weak_alias(__libc_cond_wait,__libc_cond_catchall_stub)
1712fe8fb19SBen Gras __weak_alias(__libc_cond_timedwait,__libc_cond_timedwait_stub)
1722fe8fb19SBen Gras __weak_alias(__libc_cond_destroy,__libc_cond_catchall_stub)
1732fe8fb19SBen Gras 
174*84d9c625SLionel Sambuc __strong_alias(__libc_cond_signal_stub,__libc_cond_catchall_stub)
175*84d9c625SLionel Sambuc __strong_alias(__libc_cond_broadcast_stub,__libc_cond_catchall_stub)
176*84d9c625SLionel Sambuc __strong_alias(__libc_cond_destroy_stub,__libc_cond_catchall_stub)
177*84d9c625SLionel Sambuc 
1782fe8fb19SBen Gras int
1792fe8fb19SBen Gras __libc_cond_init_stub(cond_t *c, const condattr_t *a)
1802fe8fb19SBen Gras {
1812fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1822fe8fb19SBen Gras 	(void)c;
1832fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1842fe8fb19SBen Gras 	(void)a;
1852fe8fb19SBen Gras 
1862fe8fb19SBen Gras 	CHECK_NOT_THREADED();
1872fe8fb19SBen Gras 
1882fe8fb19SBen Gras 	return (0);
1892fe8fb19SBen Gras }
1902fe8fb19SBen Gras 
1912fe8fb19SBen Gras int
__libc_cond_wait_stub(cond_t * c,mutex_t * m)1922fe8fb19SBen Gras __libc_cond_wait_stub(cond_t *c, mutex_t *m)
1932fe8fb19SBen Gras {
1942fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1952fe8fb19SBen Gras 	(void)c;
1962fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
1972fe8fb19SBen Gras 	(void)m;
1982fe8fb19SBen Gras 
1992fe8fb19SBen Gras 	CHECK_NOT_THREADED();
2002fe8fb19SBen Gras 
2012fe8fb19SBen Gras 	return (0);
2022fe8fb19SBen Gras }
2032fe8fb19SBen Gras 
2042fe8fb19SBen Gras int
__libc_cond_timedwait_stub(cond_t * c,mutex_t * m,const struct timespec * t)2052fe8fb19SBen Gras __libc_cond_timedwait_stub(cond_t *c, mutex_t *m, const struct timespec *t)
2062fe8fb19SBen Gras {
2072fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2082fe8fb19SBen Gras 	(void)c;
2092fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2102fe8fb19SBen Gras 	(void)m;
2112fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2122fe8fb19SBen Gras 	(void)t;
2132fe8fb19SBen Gras 
2142fe8fb19SBen Gras 	CHECK_NOT_THREADED();
2152fe8fb19SBen Gras 
2162fe8fb19SBen Gras 	return (0);
2172fe8fb19SBen Gras }
2182fe8fb19SBen Gras 
2192fe8fb19SBen Gras int
__libc_cond_catchall_stub(cond_t * c)2202fe8fb19SBen Gras __libc_cond_catchall_stub(cond_t *c)
2212fe8fb19SBen Gras {
2222fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2232fe8fb19SBen Gras 	(void)c;
2242fe8fb19SBen Gras 
2252fe8fb19SBen Gras 	CHECK_NOT_THREADED();
2262fe8fb19SBen Gras 
2272fe8fb19SBen Gras 	return (0);
2282fe8fb19SBen Gras }
2292fe8fb19SBen Gras 
2302fe8fb19SBen Gras 
2312fe8fb19SBen Gras /* read-write locks */
2322fe8fb19SBen Gras 
2332fe8fb19SBen Gras int __libc_rwlock_catchall_stub(rwlock_t *);
2342fe8fb19SBen Gras 
__weak_alias(__libc_rwlock_init,__libc_rwlock_init_stub)2352fe8fb19SBen Gras __weak_alias(__libc_rwlock_init,__libc_rwlock_init_stub)
2362fe8fb19SBen Gras __weak_alias(__libc_rwlock_rdlock,__libc_rwlock_catchall_stub)
2372fe8fb19SBen Gras __weak_alias(__libc_rwlock_wrlock,__libc_rwlock_catchall_stub)
2382fe8fb19SBen Gras __weak_alias(__libc_rwlock_tryrdlock,__libc_rwlock_catchall_stub)
2392fe8fb19SBen Gras __weak_alias(__libc_rwlock_trywrlock,__libc_rwlock_catchall_stub)
2402fe8fb19SBen Gras __weak_alias(__libc_rwlock_unlock,__libc_rwlock_catchall_stub)
2412fe8fb19SBen Gras __weak_alias(__libc_rwlock_destroy,__libc_rwlock_catchall_stub)
2422fe8fb19SBen Gras 
243*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_rdlock_stub,__libc_rwlock_catchall_stub)
244*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_wrlock_stub,__libc_rwlock_catchall_stub)
245*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_tryrdlock_stub,__libc_rwlock_catchall_stub)
246*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_trywrlock_stub,__libc_rwlock_catchall_stub)
247*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_unlock_stub,__libc_rwlock_catchall_stub)
248*84d9c625SLionel Sambuc __strong_alias(__libc_rwlock_destroy_stub,__libc_rwlock_catchall_stub)
249*84d9c625SLionel Sambuc 
250*84d9c625SLionel Sambuc 
2512fe8fb19SBen Gras int
252*84d9c625SLionel Sambuc __libc_rwlock_init_stub(rwlock_t *l, const rwlockattr_t *a)
2532fe8fb19SBen Gras {
2542fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2552fe8fb19SBen Gras 	(void)l;
2562fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2572fe8fb19SBen Gras 	(void)a;
2582fe8fb19SBen Gras 
2592fe8fb19SBen Gras 	CHECK_NOT_THREADED();
2602fe8fb19SBen Gras 
2612fe8fb19SBen Gras 	return (0);
2622fe8fb19SBen Gras }
2632fe8fb19SBen Gras 
2642fe8fb19SBen Gras int
__libc_rwlock_catchall_stub(rwlock_t * l)2652fe8fb19SBen Gras __libc_rwlock_catchall_stub(rwlock_t *l)
2662fe8fb19SBen Gras {
2672fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
2682fe8fb19SBen Gras 	(void)l;
2692fe8fb19SBen Gras 
2702fe8fb19SBen Gras 	CHECK_NOT_THREADED();
2712fe8fb19SBen Gras 
2722fe8fb19SBen Gras 	return (0);
2732fe8fb19SBen Gras }
2742fe8fb19SBen Gras 
2752fe8fb19SBen Gras 
2762fe8fb19SBen Gras /*
2772fe8fb19SBen Gras  * thread-specific data; we need to actually provide a simple TSD
2782fe8fb19SBen Gras  * implementation, since some thread-safe libraries want to use it.
2792fe8fb19SBen Gras  */
2802fe8fb19SBen Gras 
2812fe8fb19SBen Gras #define	TSD_KEYS_MAX	64
2822fe8fb19SBen Gras 
2832fe8fb19SBen Gras static struct {
2842fe8fb19SBen Gras 	void *tsd_val;
2852fe8fb19SBen Gras 	void (*tsd_dtor)(void *);
2862fe8fb19SBen Gras 	int tsd_inuse;
2872fe8fb19SBen Gras } __libc_tsd[TSD_KEYS_MAX];
2882fe8fb19SBen Gras static int __libc_tsd_nextkey;
2892fe8fb19SBen Gras 
__weak_alias(__libc_thr_keycreate,__libc_thr_keycreate_stub)2902fe8fb19SBen Gras __weak_alias(__libc_thr_keycreate,__libc_thr_keycreate_stub)
2912fe8fb19SBen Gras __weak_alias(__libc_thr_setspecific,__libc_thr_setspecific_stub)
2922fe8fb19SBen Gras __weak_alias(__libc_thr_getspecific,__libc_thr_getspecific_stub)
2932fe8fb19SBen Gras __weak_alias(__libc_thr_keydelete,__libc_thr_keydelete_stub)
2942fe8fb19SBen Gras 
2952fe8fb19SBen Gras int
2962fe8fb19SBen Gras __libc_thr_keycreate_stub(thread_key_t *k, void (*d)(void *))
2972fe8fb19SBen Gras {
2982fe8fb19SBen Gras 	int i;
2992fe8fb19SBen Gras 
3002fe8fb19SBen Gras 	for (i = __libc_tsd_nextkey; i < TSD_KEYS_MAX; i++) {
3012fe8fb19SBen Gras 		if (__libc_tsd[i].tsd_inuse == 0)
3022fe8fb19SBen Gras 			goto out;
3032fe8fb19SBen Gras 	}
3042fe8fb19SBen Gras 
3052fe8fb19SBen Gras 	for (i = 0; i < __libc_tsd_nextkey; i++) {
3062fe8fb19SBen Gras 		if (__libc_tsd[i].tsd_inuse == 0)
3072fe8fb19SBen Gras 			goto out;
3082fe8fb19SBen Gras 	}
3092fe8fb19SBen Gras 
3102fe8fb19SBen Gras 	return (EAGAIN);
3112fe8fb19SBen Gras 
3122fe8fb19SBen Gras  out:
3132fe8fb19SBen Gras 	/*
3142fe8fb19SBen Gras 	 * XXX We don't actually do anything with the destructor.  We
3152fe8fb19SBen Gras 	 * XXX probably should.
3162fe8fb19SBen Gras 	 */
3172fe8fb19SBen Gras 	__libc_tsd[i].tsd_inuse = 1;
3182fe8fb19SBen Gras 	__libc_tsd_nextkey = (i + i) % TSD_KEYS_MAX;
3192fe8fb19SBen Gras 	__libc_tsd[i].tsd_dtor = d;
3202fe8fb19SBen Gras 	*k = i;
3212fe8fb19SBen Gras 
3222fe8fb19SBen Gras 	return (0);
3232fe8fb19SBen Gras }
3242fe8fb19SBen Gras 
3252fe8fb19SBen Gras int
__libc_thr_setspecific_stub(thread_key_t k,const void * v)3262fe8fb19SBen Gras __libc_thr_setspecific_stub(thread_key_t k, const void *v)
3272fe8fb19SBen Gras {
3282fe8fb19SBen Gras 
3292fe8fb19SBen Gras 	__libc_tsd[k].tsd_val = __UNCONST(v);
3302fe8fb19SBen Gras 
3312fe8fb19SBen Gras 	return (0);
3322fe8fb19SBen Gras }
3332fe8fb19SBen Gras 
3342fe8fb19SBen Gras void *
__libc_thr_getspecific_stub(thread_key_t k)3352fe8fb19SBen Gras __libc_thr_getspecific_stub(thread_key_t k)
3362fe8fb19SBen Gras {
3372fe8fb19SBen Gras 
3382fe8fb19SBen Gras 	return (__libc_tsd[k].tsd_val);
3392fe8fb19SBen Gras }
3402fe8fb19SBen Gras 
3412fe8fb19SBen Gras int
__libc_thr_keydelete_stub(thread_key_t k)3422fe8fb19SBen Gras __libc_thr_keydelete_stub(thread_key_t k)
3432fe8fb19SBen Gras {
3442fe8fb19SBen Gras 
3452fe8fb19SBen Gras 	/*
3462fe8fb19SBen Gras 	 * XXX Do not recycle key; see big comment in libpthread.
3472fe8fb19SBen Gras 	 */
3482fe8fb19SBen Gras 
3492fe8fb19SBen Gras 	__libc_tsd[k].tsd_dtor = NULL;
3502fe8fb19SBen Gras 
3512fe8fb19SBen Gras 	return (0);
3522fe8fb19SBen Gras }
3532fe8fb19SBen Gras 
3542fe8fb19SBen Gras 
3552fe8fb19SBen Gras /* misc. */
3562fe8fb19SBen Gras 
__weak_alias(__libc_thr_once,__libc_thr_once_stub)3572fe8fb19SBen Gras __weak_alias(__libc_thr_once,__libc_thr_once_stub)
3582fe8fb19SBen Gras __weak_alias(__libc_thr_sigsetmask,__libc_thr_sigsetmask_stub)
3592fe8fb19SBen Gras __weak_alias(__libc_thr_self,__libc_thr_self_stub)
3602fe8fb19SBen Gras __weak_alias(__libc_thr_yield,__libc_thr_yield_stub)
3612fe8fb19SBen Gras __weak_alias(__libc_thr_create,__libc_thr_create_stub)
3622fe8fb19SBen Gras __weak_alias(__libc_thr_exit,__libc_thr_exit_stub)
3632fe8fb19SBen Gras __weak_alias(__libc_thr_setcancelstate,__libc_thr_setcancelstate_stub)
3642fe8fb19SBen Gras __weak_alias(__libc_thr_equal,__libc_thr_equal_stub)
3652fe8fb19SBen Gras __weak_alias(__libc_thr_curcpu,__libc_thr_curcpu_stub)
3662fe8fb19SBen Gras 
3672fe8fb19SBen Gras 
3682fe8fb19SBen Gras int
3692fe8fb19SBen Gras __libc_thr_once_stub(once_t *o, void (*r)(void))
3702fe8fb19SBen Gras {
3712fe8fb19SBen Gras 
3722fe8fb19SBen Gras 	/* XXX Knowledge of libpthread types. */
3732fe8fb19SBen Gras 
3742fe8fb19SBen Gras 	if (o->pto_done == 0) {
3752fe8fb19SBen Gras 		(*r)();
3762fe8fb19SBen Gras 		o->pto_done = 1;
3772fe8fb19SBen Gras 	}
3782fe8fb19SBen Gras 
3792fe8fb19SBen Gras 	return (0);
3802fe8fb19SBen Gras }
3812fe8fb19SBen Gras 
3822fe8fb19SBen Gras int
__libc_thr_sigsetmask_stub(int h,const sigset_t * s,sigset_t * o)3832fe8fb19SBen Gras __libc_thr_sigsetmask_stub(int h, const sigset_t *s, sigset_t *o)
3842fe8fb19SBen Gras {
3852fe8fb19SBen Gras 
3862fe8fb19SBen Gras 	CHECK_NOT_THREADED();
3872fe8fb19SBen Gras 
3882fe8fb19SBen Gras 	return sigprocmask(h, s, o);
3892fe8fb19SBen Gras }
3902fe8fb19SBen Gras 
3912fe8fb19SBen Gras thr_t
__libc_thr_self_stub(void)3922fe8fb19SBen Gras __libc_thr_self_stub(void)
3932fe8fb19SBen Gras {
3942fe8fb19SBen Gras 
3952fe8fb19SBen Gras 	return ((thr_t) -1);
3962fe8fb19SBen Gras }
3972fe8fb19SBen Gras 
3982fe8fb19SBen Gras int
__libc_thr_yield_stub(void)3992fe8fb19SBen Gras __libc_thr_yield_stub(void)
4002fe8fb19SBen Gras {
4012fe8fb19SBen Gras 
4022fe8fb19SBen Gras 	/* Nothing to do. */
4032fe8fb19SBen Gras 	return (0);
4042fe8fb19SBen Gras }
4052fe8fb19SBen Gras 
4062fe8fb19SBen Gras int
__libc_thr_create_stub(thr_t * tp,const thrattr_t * ta,void * (* f)(void *),void * a)4072fe8fb19SBen Gras __libc_thr_create_stub(thr_t *tp, const thrattr_t *ta,
4082fe8fb19SBen Gras     void *(*f)(void *), void *a)
4092fe8fb19SBen Gras {
4102fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4112fe8fb19SBen Gras 	(void)tp;
4122fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4132fe8fb19SBen Gras 	(void)ta;
4142fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4152fe8fb19SBen Gras 	(void)f;
4162fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4172fe8fb19SBen Gras 	(void)a;
4182fe8fb19SBen Gras 
4192fe8fb19SBen Gras 	DIE();
4202fe8fb19SBen Gras 
4212fe8fb19SBen Gras 	return (EOPNOTSUPP);
4222fe8fb19SBen Gras }
4232fe8fb19SBen Gras 
424*84d9c625SLionel Sambuc __dead void
__libc_thr_exit_stub(void * v)4252fe8fb19SBen Gras __libc_thr_exit_stub(void *v)
4262fe8fb19SBen Gras {
4272fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4282fe8fb19SBen Gras 	(void)v;
4292fe8fb19SBen Gras 	exit(0);
4302fe8fb19SBen Gras }
4312fe8fb19SBen Gras 
4322fe8fb19SBen Gras int
__libc_thr_setcancelstate_stub(int new,int * old)4332fe8fb19SBen Gras __libc_thr_setcancelstate_stub(int new, int *old)
4342fe8fb19SBen Gras {
4352fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4362fe8fb19SBen Gras 	(void)new;
4372fe8fb19SBen Gras 
4382fe8fb19SBen Gras 	/* LINTED deliberate lack of effect */
4392fe8fb19SBen Gras 	(void)old;
4402fe8fb19SBen Gras 
4412fe8fb19SBen Gras 	CHECK_NOT_THREADED();
4422fe8fb19SBen Gras 
4432fe8fb19SBen Gras 	return (0);
4442fe8fb19SBen Gras }
4452fe8fb19SBen Gras 
4462fe8fb19SBen Gras int
__libc_thr_equal_stub(pthread_t t1,pthread_t t2)4472fe8fb19SBen Gras __libc_thr_equal_stub(pthread_t t1, pthread_t t2)
4482fe8fb19SBen Gras {
4492fe8fb19SBen Gras 
4502fe8fb19SBen Gras 	/* assert that t1=t2=pthread_self() */
4512fe8fb19SBen Gras 	return (t1 == t2);
4522fe8fb19SBen Gras }
4532fe8fb19SBen Gras 
4542fe8fb19SBen Gras unsigned int
__libc_thr_curcpu_stub(void)4552fe8fb19SBen Gras __libc_thr_curcpu_stub(void)
4562fe8fb19SBen Gras {
4572fe8fb19SBen Gras 
4582fe8fb19SBen Gras 	return (0);
4592fe8fb19SBen Gras }
4602fe8fb19SBen Gras 
4612fe8fb19SBen Gras #endif /* _REENTRANT */
462