171579Sdeischen/*
271579Sdeischen * Copyright (c) 2001 Daniel Eischen <deischen@FreeBSD.org>.
371579Sdeischen * All rights reserved.
471579Sdeischen *
571579Sdeischen * Redistribution and use in source and binary forms, with or without
671579Sdeischen * modification, are permitted provided that the following conditions
771579Sdeischen * are met:
871579Sdeischen * 1. Redistributions of source code must retain the above copyright
971579Sdeischen *    notice, this list of conditions and the following disclaimer.
1071579Sdeischen * 2. Redistributions in binary form must reproduce the above copyright
1171579Sdeischen *    notice, this list of conditions and the following disclaimer in the
1271579Sdeischen *    documentation and/or other materials provided with the distribution.
1371579Sdeischen *
1471579Sdeischen * THIS SOFTWARE IS PROVIDED BY DANIEL EISCHEN AND CONTRIBUTORS ``AS IS''
1571579Sdeischen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1671579Sdeischen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1771579Sdeischen * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1871579Sdeischen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1971579Sdeischen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2071579Sdeischen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2171579Sdeischen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2271579Sdeischen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2371579Sdeischen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2471579Sdeischen * SUCH DAMAGE.
2571579Sdeischen */
2671579Sdeischen
2790039Sobrien#include <sys/cdefs.h>
2890039Sobrien__FBSDID("$FreeBSD$");
2990039Sobrien
3074462Salfred#include <signal.h>
3171579Sdeischen#include <pthread.h>
32156319Sdeischen#include <stdlib.h>
33235785Stheraven#include <errno.h>
3471579Sdeischen
35106866Sdeischen#include "libc_private.h"
36106288Sdfr
3771579Sdeischen/*
3871579Sdeischen * Weak symbols: All libc internal usage of these functions should
3971579Sdeischen * use the weak symbol versions (_pthread_XXX).  If libpthread is
4071579Sdeischen * linked, it will override these functions with (non-weak) routines.
4171579Sdeischen * The _pthread_XXX functions are provided solely for internal libc
4271579Sdeischen * usage to avoid unwanted cancellation points and to differentiate
4371579Sdeischen * between application locks and libc locks (threads holding the
4471579Sdeischen * latter can't be allowed to exit/terminate).
4571579Sdeischen */
4671579Sdeischen
4774462Salfred/* Define a null pthread structure just to satisfy _pthread_self. */
4872373Sdeischenstruct pthread {
4972373Sdeischen};
5071579Sdeischen
5172373Sdeischenstatic struct pthread	main_thread;
5272373Sdeischen
53106866Sdeischenstatic int		stub_main(void);
54106866Sdeischenstatic void 		*stub_null(void);
55106866Sdeischenstatic struct pthread	*stub_self(void);
56106866Sdeischenstatic int		stub_zero(void);
57235785Stheravenstatic int		stub_fail(void);
58156319Sdeischenstatic int		stub_true(void);
59156319Sdeischenstatic void		stub_exit(void);
6072373Sdeischen
61106866Sdeischen#define	PJT_DUAL_ENTRY(entry)	\
62106866Sdeischen	(pthread_func_t)entry, (pthread_func_t)entry
6374462Salfred
64106880Sdeischenpthread_func_entry_t __thr_jtable[PJT_MAX] = {
65156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATFORK */
66156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_DESTROY */
67156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETDETACHSTATE */
68156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETGUARDSIZE */
69156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETINHERITSCHED */
70156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETSCHEDPARAM */
71156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETSCHEDPOLICY */
72156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETSCOPE */
73156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETSTACKADDR */
74156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_GETSTACKSIZE */
75156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_INIT */
76156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETDETACHSTATE */
77156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETGUARDSIZE */
78156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETINHERITSCHED */
79156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETSCHEDPARAM */
80156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETSCHEDPOLICY */
81156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETSCOPE */
82156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETSTACKADDR */
83156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_ATTR_SETSTACKSIZE */
84156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CANCEL */
85156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_POP */
86156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_PUSH */
87156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_BROADCAST */
88156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_DESTROY */
89156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_INIT */
90156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_SIGNAL */
91156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_TIMEDWAIT */
92156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_COND_WAIT */
93156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_DETACH */
94156319Sdeischen	{PJT_DUAL_ENTRY(stub_true)},    /* PJT_EQUAL */
95156319Sdeischen	{PJT_DUAL_ENTRY(stub_exit)},    /* PJT_EXIT */
96156319Sdeischen	{PJT_DUAL_ENTRY(stub_null)},    /* PJT_GETSPECIFIC */
97156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_JOIN */
98235785Stheraven	{PJT_DUAL_ENTRY(stub_fail)},    /* PJT_KEY_CREATE */
99156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_KEY_DELETE */
100156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_KILL */
101156319Sdeischen	{PJT_DUAL_ENTRY(stub_main)},    /* PJT_MAIN_NP */
102156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEXATTR_DESTROY */
103156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEXATTR_INIT */
104156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEXATTR_SETTYPE */
105156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEX_DESTROY */
106156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEX_INIT */
107156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEX_LOCK */
108156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEX_TRYLOCK */
109156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_MUTEX_UNLOCK */
110235785Stheraven	{PJT_DUAL_ENTRY(stub_fail)},    /* PJT_ONCE */
111156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_DESTROY */
112156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_INIT */
113156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_RDLOCK */
114156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_TRYRDLOCK */
115156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_TRYWRLOCK */
116156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_UNLOCK */
117156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_RWLOCK_WRLOCK */
118156319Sdeischen	{PJT_DUAL_ENTRY(stub_self)},    /* PJT_SELF */
119156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SETCANCELSTATE */
120156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SETCANCELTYPE */
121156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SETSPECIFIC */
122156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SIGMASK */
123156319Sdeischen	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_TESTCANCEL */
124201546Sdavidxu	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_POP_IMP */
125201546Sdavidxu	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_PUSH_IMP */
126213153Sdavidxu	{PJT_DUAL_ENTRY(stub_zero)},	/* PJT_CANCEL_ENTER */
127213153Sdavidxu	{PJT_DUAL_ENTRY(stub_zero)},	/* PJT_CANCEL_LEAVE */
128106866Sdeischen};
129106288Sdfr
130106866Sdeischen/*
131106866Sdeischen * Weak aliases for exported (pthread_*) and internal (_pthread_*) routines.
132106866Sdeischen */
133106866Sdeischen#define	WEAK_REF(sym, alias)	__weak_reference(sym, alias)
13474462Salfred
135106866Sdeischen#define	FUNC_TYPE(name)		__CONCAT(name, _func_t)
136106866Sdeischen#define	FUNC_INT(name)		__CONCAT(name, _int)
137106866Sdeischen#define	FUNC_EXP(name)		__CONCAT(name, _exp)
138103576Salfred
139106866Sdeischen#define	STUB_FUNC(name, idx, ret)				\
140152333Sdeischen	static ret FUNC_EXP(name)(void) __used;			\
141152333Sdeischen	static ret FUNC_INT(name)(void) __used;			\
142106866Sdeischen	WEAK_REF(FUNC_EXP(name), name);				\
143106866Sdeischen	WEAK_REF(FUNC_INT(name), __CONCAT(_, name));		\
144106866Sdeischen	typedef ret (*FUNC_TYPE(name))(void);			\
145106866Sdeischen	static ret FUNC_EXP(name)(void)				\
146106866Sdeischen	{							\
147106866Sdeischen		FUNC_TYPE(name) func;				\
148106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][0];	\
149106866Sdeischen		return (func());				\
150106866Sdeischen	}							\
151106866Sdeischen	static ret FUNC_INT(name)(void)				\
152106866Sdeischen	{							\
153106866Sdeischen		FUNC_TYPE(name) func;				\
154106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][1];	\
155106866Sdeischen		return (func());				\
156106866Sdeischen	}
15771579Sdeischen
158106866Sdeischen#define	STUB_FUNC1(name, idx, ret, p0_type)			\
159132849Skan	static ret FUNC_EXP(name)(p0_type) __used;		\
160132849Skan	static ret FUNC_INT(name)(p0_type) __used;		\
161106866Sdeischen	WEAK_REF(FUNC_EXP(name), name);				\
162106866Sdeischen	WEAK_REF(FUNC_INT(name), __CONCAT(_, name));		\
163106866Sdeischen	typedef ret (*FUNC_TYPE(name))(p0_type);		\
164106866Sdeischen	static ret FUNC_EXP(name)(p0_type p0)			\
165106866Sdeischen	{							\
166106866Sdeischen		FUNC_TYPE(name) func;				\
167106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][0];	\
168106866Sdeischen		return (func(p0));				\
169106866Sdeischen	}							\
170106866Sdeischen	static ret FUNC_INT(name)(p0_type p0)			\
171106866Sdeischen	{							\
172106866Sdeischen		FUNC_TYPE(name) func;				\
173106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][1];	\
174106866Sdeischen		return (func(p0));				\
175106866Sdeischen	}
17671579Sdeischen
177106866Sdeischen#define	STUB_FUNC2(name, idx, ret, p0_type, p1_type)		\
178132849Skan	static ret FUNC_EXP(name)(p0_type, p1_type) __used;	\
179132849Skan	static ret FUNC_INT(name)(p0_type, p1_type) __used;	\
180106866Sdeischen	WEAK_REF(FUNC_EXP(name), name);				\
181106866Sdeischen	WEAK_REF(FUNC_INT(name), __CONCAT(_, name));		\
182106866Sdeischen	typedef ret (*FUNC_TYPE(name))(p0_type, p1_type);	\
183106866Sdeischen	static ret FUNC_EXP(name)(p0_type p0, p1_type p1)	\
184106866Sdeischen	{							\
185106866Sdeischen		FUNC_TYPE(name) func;				\
186106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][0];	\
187106866Sdeischen		return (func(p0, p1));				\
188106866Sdeischen	}							\
189106866Sdeischen	static ret FUNC_INT(name)(p0_type p0, p1_type p1)	\
190106866Sdeischen	{							\
191106866Sdeischen		FUNC_TYPE(name) func;				\
192106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][1];	\
193106866Sdeischen		return (func(p0, p1));				\
194106866Sdeischen	}
19571579Sdeischen
196106866Sdeischen#define	STUB_FUNC3(name, idx, ret, p0_type, p1_type, p2_type)	\
197132849Skan	static ret FUNC_EXP(name)(p0_type, p1_type, p2_type) __used; \
198132849Skan	static ret FUNC_INT(name)(p0_type, p1_type, p2_type) __used; \
199106866Sdeischen	WEAK_REF(FUNC_EXP(name), name);				\
200106866Sdeischen	WEAK_REF(FUNC_INT(name), __CONCAT(_, name));		\
201106866Sdeischen	typedef ret (*FUNC_TYPE(name))(p0_type, p1_type, p2_type); \
202106866Sdeischen	static ret FUNC_EXP(name)(p0_type p0, p1_type p1, p2_type p2) \
203106866Sdeischen	{							\
204106866Sdeischen		FUNC_TYPE(name) func;				\
205106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][0];	\
206106866Sdeischen		return (func(p0, p1, p2));			\
207106866Sdeischen	}							\
208106866Sdeischen	static ret FUNC_INT(name)(p0_type p0, p1_type p1, p2_type p2) \
209106866Sdeischen	{							\
210106866Sdeischen		FUNC_TYPE(name) func;				\
211106866Sdeischen		func = (FUNC_TYPE(name))__thr_jtable[idx][1];	\
212106866Sdeischen		return (func(p0, p1, p2));			\
213106866Sdeischen	}
21474462Salfred
215106866SdeischenSTUB_FUNC1(pthread_cond_broadcast, PJT_COND_BROADCAST, int, void *)
216106866SdeischenSTUB_FUNC1(pthread_cond_destroy, PJT_COND_DESTROY, int, void *)
217106866SdeischenSTUB_FUNC2(pthread_cond_init,	PJT_COND_INIT, int, void *, void *)
218106866SdeischenSTUB_FUNC1(pthread_cond_signal,	PJT_COND_SIGNAL, int, void *)
219152333SdeischenSTUB_FUNC2(pthread_cond_wait,	PJT_COND_WAIT, int, void *, void *)
220106866SdeischenSTUB_FUNC1(pthread_getspecific,	PJT_GETSPECIFIC, void *, pthread_key_t)
221106866SdeischenSTUB_FUNC2(pthread_key_create,	PJT_KEY_CREATE, int, void *, void *)
222106866SdeischenSTUB_FUNC1(pthread_key_delete,	PJT_KEY_DELETE, int, pthread_key_t)
223106866SdeischenSTUB_FUNC(pthread_main_np,	PJT_MAIN_NP, int)
224106866SdeischenSTUB_FUNC1(pthread_mutex_destroy, PJT_MUTEX_DESTROY, int, void *)
225106866SdeischenSTUB_FUNC2(pthread_mutex_init,	PJT_MUTEX_INIT, int, void *, void *)
226106866SdeischenSTUB_FUNC1(pthread_mutex_lock,	PJT_MUTEX_LOCK, int, void *)
227106866SdeischenSTUB_FUNC1(pthread_mutex_trylock, PJT_MUTEX_TRYLOCK, int, void *)
228106866SdeischenSTUB_FUNC1(pthread_mutex_unlock, PJT_MUTEX_UNLOCK, int, void *)
229106866SdeischenSTUB_FUNC1(pthread_mutexattr_destroy, PJT_MUTEXATTR_DESTROY, int, void *)
230106866SdeischenSTUB_FUNC1(pthread_mutexattr_init, PJT_MUTEXATTR_INIT, int, void *)
231197681SmarcusSTUB_FUNC2(pthread_mutexattr_settype, PJT_MUTEXATTR_SETTYPE, int, void *, int)
232106866SdeischenSTUB_FUNC2(pthread_once, 	PJT_ONCE, int, void *, void *)
233106866SdeischenSTUB_FUNC1(pthread_rwlock_destroy, PJT_RWLOCK_DESTROY, int, void *)
234106866SdeischenSTUB_FUNC2(pthread_rwlock_init,	PJT_RWLOCK_INIT, int, void *, void *)
235106866SdeischenSTUB_FUNC1(pthread_rwlock_rdlock, PJT_RWLOCK_RDLOCK, int, void *)
236106866SdeischenSTUB_FUNC1(pthread_rwlock_tryrdlock, PJT_RWLOCK_TRYRDLOCK, int, void *)
237106866SdeischenSTUB_FUNC1(pthread_rwlock_trywrlock, PJT_RWLOCK_TRYWRLOCK, int, void *)
238106866SdeischenSTUB_FUNC1(pthread_rwlock_unlock, PJT_RWLOCK_UNLOCK, int, void *)
239106866SdeischenSTUB_FUNC1(pthread_rwlock_wrlock, PJT_RWLOCK_WRLOCK, int, void *)
240106866SdeischenSTUB_FUNC(pthread_self,		PJT_SELF, pthread_t)
241106866SdeischenSTUB_FUNC2(pthread_setspecific, PJT_SETSPECIFIC, int, pthread_key_t, void *)
242106866SdeischenSTUB_FUNC3(pthread_sigmask, PJT_SIGMASK, int, int, void *, void *)
243156319SdeischenSTUB_FUNC3(pthread_atfork, PJT_ATFORK, int, void *, void *, void*)
244156319SdeischenSTUB_FUNC1(pthread_attr_destroy, PJT_ATTR_DESTROY, int, void *);
245156319SdeischenSTUB_FUNC2(pthread_attr_getdetachstate, PJT_ATTR_GETDETACHSTATE, int, void *, void *)
246156319SdeischenSTUB_FUNC2(pthread_attr_getguardsize, PJT_ATTR_GETGUARDSIZE, int, void *, void *)
247156319SdeischenSTUB_FUNC2(pthread_attr_getstackaddr, PJT_ATTR_GETSTACKADDR, int, void *, void *)
248156319SdeischenSTUB_FUNC2(pthread_attr_getstacksize, PJT_ATTR_GETSTACKSIZE, int, void *, void *)
249156319SdeischenSTUB_FUNC2(pthread_attr_getinheritsched, PJT_ATTR_GETINHERITSCHED, int, void *, void *)
250156319SdeischenSTUB_FUNC2(pthread_attr_getschedparam, PJT_ATTR_GETSCHEDPARAM, int, void *, void *)
251156319SdeischenSTUB_FUNC2(pthread_attr_getschedpolicy, PJT_ATTR_GETSCHEDPOLICY, int, void *, void *)
252156319SdeischenSTUB_FUNC2(pthread_attr_getscope, PJT_ATTR_GETSCOPE, int, void *, void *)
253156319SdeischenSTUB_FUNC1(pthread_attr_init, PJT_ATTR_INIT, int, void *)
254156319SdeischenSTUB_FUNC2(pthread_attr_setdetachstate, PJT_ATTR_SETDETACHSTATE, int, void *, int)
255156319SdeischenSTUB_FUNC2(pthread_attr_setguardsize, PJT_ATTR_SETGUARDSIZE, int, void *, size_t)
256156319SdeischenSTUB_FUNC2(pthread_attr_setstackaddr, PJT_ATTR_SETSTACKADDR, int, void *, void *)
257156319SdeischenSTUB_FUNC2(pthread_attr_setstacksize, PJT_ATTR_SETSTACKSIZE, int, void *, size_t)
258156319SdeischenSTUB_FUNC2(pthread_attr_setinheritsched, PJT_ATTR_SETINHERITSCHED, int, void *, int)
259156319SdeischenSTUB_FUNC2(pthread_attr_setschedparam, PJT_ATTR_SETSCHEDPARAM, int, void *, void *)
260156319SdeischenSTUB_FUNC2(pthread_attr_setschedpolicy, PJT_ATTR_SETSCHEDPOLICY, int, void *, int)
261156319SdeischenSTUB_FUNC2(pthread_attr_setscope, PJT_ATTR_SETSCOPE, int, void *, int)
262156319SdeischenSTUB_FUNC1(pthread_cancel, PJT_CANCEL, int, void *)
263156319SdeischenSTUB_FUNC1(pthread_cleanup_pop, PJT_CLEANUP_POP, int, int)
264156319SdeischenSTUB_FUNC2(pthread_cleanup_push, PJT_CLEANUP_PUSH, void, void *, void *)
265156319SdeischenSTUB_FUNC3(pthread_cond_timedwait, PJT_COND_TIMEDWAIT, int, void *, void *, void *)
266156319SdeischenSTUB_FUNC1(pthread_detach, PJT_DETACH, int, void *)
267156319SdeischenSTUB_FUNC2(pthread_equal, PJT_EQUAL, int, void *, void *)
268156319SdeischenSTUB_FUNC1(pthread_exit, PJT_EXIT, void, void *)
269156319SdeischenSTUB_FUNC2(pthread_join, PJT_JOIN, int, void *, void *)
270156319SdeischenSTUB_FUNC2(pthread_kill, PJT_KILL, int, void *, int)
271156319SdeischenSTUB_FUNC2(pthread_setcancelstate, PJT_SETCANCELSTATE, int, int, void *)
272156319SdeischenSTUB_FUNC2(pthread_setcanceltype, PJT_SETCANCELTYPE, int, int, void *)
273156319SdeischenSTUB_FUNC(pthread_testcancel, PJT_TESTCANCEL, void)
274201546SdavidxuSTUB_FUNC1(__pthread_cleanup_pop_imp, PJT_CLEANUP_POP_IMP, int, int)
275201546SdavidxuSTUB_FUNC2(__pthread_cleanup_push_imp, PJT_CLEANUP_PUSH_IMP, void, void*, void *);
276213153SdavidxuSTUB_FUNC1(_pthread_cancel_enter, PJT_CANCEL_ENTER, int, int)
277213153SdavidxuSTUB_FUNC1(_pthread_cancel_leave, PJT_CANCEL_LEAVE, int, int)
27871579Sdeischen
279106288Sdfrstatic int
280106866Sdeischenstub_zero(void)
28171579Sdeischen{
28271579Sdeischen	return (0);
28371579Sdeischen}
28471579Sdeischen
285106866Sdeischenstatic void *
286106866Sdeischenstub_null(void)
28771579Sdeischen{
288106866Sdeischen	return (NULL);
28971579Sdeischen}
29071579Sdeischen
291106866Sdeischenstatic struct pthread *
292106866Sdeischenstub_self(void)
29371579Sdeischen{
29472373Sdeischen	return (&main_thread);
29572373Sdeischen}
29672373Sdeischen
297106288Sdfrstatic int
298235785Stheravenstub_fail(void)
299235785Stheraven{
300235785Stheraven	return (ENOSYS);
301235785Stheraven}
302235785Stheraven
303235785Stheravenstatic int
304106866Sdeischenstub_main(void)
30571579Sdeischen{
306106866Sdeischen	return (-1);
30771579Sdeischen}
308156319Sdeischen
309156319Sdeischenstatic int
310156319Sdeischenstub_true(void)
311156319Sdeischen{
312156319Sdeischen	return (1);
313156319Sdeischen}
314156319Sdeischen
315156319Sdeischenstatic void
316156319Sdeischenstub_exit(void)
317156319Sdeischen{
318156319Sdeischen	exit(0);
319156319Sdeischen}
320