2 * Copyright (c) 2001 Daniel Eischen <deischen@FreeBSD.org>.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY DANIEL EISCHEN AND CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/lib/libc/gen/_pthread_stubs.c,v 1.5 2001/06/11 23:18:22 iedowse Exp $
29 #include <sys/cdefs.h>
34 * Weak symbols: All libc internal usage of these functions should
35 * use the weak symbol versions (_pthread_XXX). If libpthread is
36 * linked, it will override these functions with (non-weak) routines.
37 * The _pthread_XXX functions are provided solely for internal libc
38 * usage to avoid unwanted cancellation points and to differentiate
39 * between application locks and libc locks (threads holding the
40 * latter can't be allowed to exit/terminate).
44 __weak_reference_asm(f, _ ## n);
46 __weak_reference_asm(f, _ ## n); \
47 __weak_reference_asm(f, n)
49 /* XXX this needs something more clever, should not some of these return errors? */
50 WR(__atfork
, pthread_atfork
);
51 WR(stub_zero
, pthread_attr_destroy
);
52 WR(stub_zero
, pthread_attr_get_np
);
53 WR(stub_zero
, pthread_attr_getdetachstate
);
54 WR(stub_zero
, pthread_attr_getguardsize
);
55 WR(stub_zero
, pthread_attr_getinheritsched
);
56 WR(stub_zero
, pthread_attr_getschedparam
);
57 WR(stub_zero
, pthread_attr_getschedpolicy
);
58 WR(stub_zero
, pthread_attr_getscope
);
59 WR(stub_zero
, pthread_attr_getstack
);
60 WR(stub_zero
, pthread_attr_getstackaddr
);
61 WR(stub_zero
, pthread_attr_getstacksize
);
62 WR(stub_zero
, pthread_attr_init
);
63 WR(stub_zero
, pthread_attr_setcreatesuspend_np
);
64 WR(stub_zero
, pthread_attr_setdetachstate
);
65 WR(stub_zero
, pthread_attr_setguardsize
);
66 WR(stub_zero
, pthread_attr_setinheritsched
);
67 WR(stub_zero
, pthread_attr_setschedparam
);
68 WR(stub_zero
, pthread_attr_setschedpolicy
);
69 WR(stub_zero
, pthread_attr_setscope
);
70 WR(stub_zero
, pthread_attr_setstack
);
71 WR(stub_zero
, pthread_attr_setstackaddr
);
72 WR(stub_zero
, pthread_attr_setstacksize
);
73 WR(stub_zero
, pthread_barrier_destroy
);
74 WR(stub_zero
, pthread_barrier_init
);
75 WR(stub_zero
, pthread_barrier_wait
);
76 WR(stub_zero
, pthread_barrierattr_destroy
);
77 WR(stub_zero
, pthread_barrierattr_getpshared
);
78 WR(stub_zero
, pthread_barrierattr_init
);
79 WR(stub_zero
, pthread_barrierattr_setpshared
);
80 WRlc(stub_zero
, pthread_cancel
);
81 WR(stub_zero
, pthread_cleanup_pop
);
82 WR(stub_zero
, pthread_cleanup_push
);
83 WR(stub_zero
, pthread_cond_broadcast
);
84 WR(stub_zero
, pthread_cond_destroy
);
85 WR(stub_zero
, pthread_cond_init
);
86 WR(stub_zero
, pthread_cond_signal
);
87 WR(stub_zero
, pthread_cond_timedwait
);
88 WR(stub_zero
, pthread_cond_wait
);
89 WR(stub_zero
, pthread_condattr_destroy
);
90 WR(stub_zero
, pthread_condattr_getclock
);
91 WR(stub_zero
, pthread_condattr_getpshared
);
92 WR(stub_zero
, pthread_condattr_init
);
93 WR(stub_zero
, pthread_condattr_setclock
);
94 WR(stub_zero
, pthread_condattr_setpshared
);
95 WR(stub_zero
, pthread_detach
);
96 WR(stub_true
, pthread_equal
);
97 WR(stub_exit
, pthread_exit
);
98 WR(stub_zero
, pthread_getaffinity_np
);
99 WR(stub_zero
, pthread_getconcurrency
);
100 WR(stub_zero
, pthread_getprio
);
101 WR(stub_zero
, pthread_getschedparam
);
102 WR(stub_null
, pthread_getspecific
);
103 WR(stub_empty
, pthread_init_early
);
104 WR(stub_zero
, pthread_join
);
105 WR(stub_zero
, pthread_key_create
);
106 WR(stub_zero
, pthread_key_delete
);
107 WR(stub_zero
, pthread_kill
);
108 WR(stub_main
, pthread_main_np
);
109 WR(stub_zero
, pthread_multi_np
);
110 WR(stub_zero
, pthread_mutex_destroy
);
111 WR(stub_zero
, pthread_mutex_getprioceiling
);
112 WR(stub_zero
, pthread_mutex_init
);
113 WR(stub_zero
, pthread_mutex_lock
);
114 WR(stub_zero
, pthread_mutex_setprioceiling
);
115 WR(stub_zero
, pthread_mutex_timedlock
);
116 WR(stub_zero
, pthread_mutex_trylock
);
117 WR(stub_zero
, pthread_mutex_unlock
);
118 WR(stub_zero
, pthread_mutexattr_destroy
);
119 WR(stub_zero
, pthread_mutexattr_getkind_np
);
120 WR(stub_zero
, pthread_mutexattr_getprioceiling
);
121 WR(stub_zero
, pthread_mutexattr_getprotocol
);
122 WR(stub_zero
, pthread_mutexattr_getpshared
);
123 WR(stub_zero
, pthread_mutexattr_gettype
);
124 WR(stub_zero
, pthread_mutexattr_init
);
125 WR(stub_zero
, pthread_mutexattr_setkind_np
);
126 WR(stub_zero
, pthread_mutexattr_setprioceiling
);
127 WR(stub_zero
, pthread_mutexattr_setprotocol
);
128 WR(stub_zero
, pthread_mutexattr_setpshared
);
129 WR(stub_zero
, pthread_mutexattr_settype
);
130 WR(stub_once
, pthread_once
);
131 WR(stub_zero
, pthread_resume_all_np
);
132 WR(stub_zero
, pthread_resume_np
);
133 WR(stub_zero
, pthread_rwlock_destroy
);
134 WR(stub_zero
, pthread_rwlock_init
);
135 WR(stub_zero
, pthread_rwlock_rdlock
);
136 WR(stub_zero
, pthread_rwlock_timedrdlock
);
137 WR(stub_zero
, pthread_rwlock_timedwrlock
);
138 WR(stub_zero
, pthread_rwlock_tryrdlock
);
139 WR(stub_zero
, pthread_rwlock_trywrlock
);
140 WR(stub_zero
, pthread_rwlock_unlock
);
141 WR(stub_zero
, pthread_rwlock_wrlock
);
142 WR(stub_zero
, pthread_rwlockattr_destroy
);
143 WR(stub_zero
, pthread_rwlockattr_getpshared
);
144 WR(stub_zero
, pthread_rwlockattr_init
);
145 WR(stub_zero
, pthread_rwlockattr_setpshared
);
146 WR(stub_self
, pthread_self
);
147 WR(stub_zero
, pthread_set_name_np
);
148 WR(stub_zero
, pthread_setaffinity_np
);
149 WR(stub_zero
, pthread_setcancelstate
);
150 WR(stub_zero
, pthread_setcanceltype
);
151 WR(stub_zero
, pthread_setconcurrency
);
152 WR(stub_zero
, pthread_setprio
);
153 WR(stub_zero
, pthread_setschedparam
);
154 WR(stub_zero
, pthread_setspecific
);
155 WR(stub_zero
, pthread_sigmask
);
156 WR(stub_zero
, pthread_single_np
);
157 WR(stub_zero
, pthread_spin_destroy
);
158 WR(stub_zero
, pthread_spin_init
);
159 WR(stub_zero
, pthread_spin_lock
);
160 WR(stub_zero
, pthread_spin_trylock
);
161 WR(stub_zero
, pthread_spin_unlock
);
162 WR(stub_zero
, pthread_suspend_all_np
);
163 WR(stub_zero
, pthread_suspend_np
);
164 WR(stub_zero
, pthread_switch_add_np
);
165 WR(stub_zero
, pthread_switch_delete_np
);
166 WR(stub_zero
, pthread_testcancel
);
167 WR(stub_zero
, pthread_timedjoin_np
);
168 WR(stub_zero
, pthread_yield
);
169 WR(stub_zero
, sched_yield
);
170 WR(stub_zero
, sem_close
);
171 WR(stub_zero
, sem_destroy
);
172 WR(stub_zero
, sem_getvalue
);
173 WR(stub_zero
, sem_init
);
174 WR(stub_zero
, sem_open
);
175 WR(stub_zero
, sem_post
);
176 WR(stub_zero
, sem_trywait
);
177 WR(stub_zero
, sem_timedwait
);
178 WR(stub_zero
, sem_unlink
);
179 WR(stub_zero
, sem_wait
);
189 stub_once(pthread_once_t
*o
, void (*r
)(void))
191 if (o
->state
!= PTHREAD_DONE_INIT
) {
193 o
->state
= PTHREAD_DONE_INIT
;
208 static struct {} main_thread
;
210 return (&main_thread
);
237 * If libpthread is loaded, make sure it is initialised before
238 * other libraries call pthread functions
240 void _pthread_init(void) __constructor(101);
241 void _pthread_init_early(void);
245 _pthread_init_early();
248 extern void (*cb_prepare
)(void);
249 extern void (*cb_parent
)(void);
250 extern void (*cb_child
)(void);
251 extern int __isthreaded
;
254 __atfork(void (*prepare
)(void), void (*parent
)(void),
259 cb_prepare
= prepare
;