1d915a14eSPedro F. Giffuni /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3d915a14eSPedro F. Giffuni * 4d201fe46SDaniel Eischen * Copyright (c) 2001 Daniel Eischen <deischen@FreeBSD.org>. 5d201fe46SDaniel Eischen * All rights reserved. 6d201fe46SDaniel Eischen * 7d201fe46SDaniel Eischen * Redistribution and use in source and binary forms, with or without 8d201fe46SDaniel Eischen * modification, are permitted provided that the following conditions 9d201fe46SDaniel Eischen * are met: 10d201fe46SDaniel Eischen * 1. Redistributions of source code must retain the above copyright 11d201fe46SDaniel Eischen * notice, this list of conditions and the following disclaimer. 12d201fe46SDaniel Eischen * 2. Redistributions in binary form must reproduce the above copyright 13d201fe46SDaniel Eischen * notice, this list of conditions and the following disclaimer in the 14d201fe46SDaniel Eischen * documentation and/or other materials provided with the distribution. 15d201fe46SDaniel Eischen * 16d201fe46SDaniel Eischen * THIS SOFTWARE IS PROVIDED BY DANIEL EISCHEN AND CONTRIBUTORS ``AS IS'' 17d201fe46SDaniel Eischen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18d201fe46SDaniel Eischen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19d201fe46SDaniel Eischen * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20d201fe46SDaniel Eischen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21d201fe46SDaniel Eischen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22d201fe46SDaniel Eischen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23d201fe46SDaniel Eischen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24d201fe46SDaniel Eischen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25d201fe46SDaniel Eischen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26d201fe46SDaniel Eischen * SUCH DAMAGE. 27d201fe46SDaniel Eischen */ 28d201fe46SDaniel Eischen 298360efbdSAlfred Perlstein #include <signal.h> 30d201fe46SDaniel Eischen #include <pthread.h> 31f4cd2a5bSDaniel Eischen #include <stdlib.h> 3248cb9786SDavid Chisnall #include <errno.h> 33d201fe46SDaniel Eischen 34fb22a377SDaniel Eischen #include "libc_private.h" 35ceb33671SDoug Rabson 36d201fe46SDaniel Eischen /* 37d201fe46SDaniel Eischen * Weak symbols: All libc internal usage of these functions should 38d201fe46SDaniel Eischen * use the weak symbol versions (_pthread_XXX). If libpthread is 39d201fe46SDaniel Eischen * linked, it will override these functions with (non-weak) routines. 40d201fe46SDaniel Eischen * The _pthread_XXX functions are provided solely for internal libc 41d201fe46SDaniel Eischen * usage to avoid unwanted cancellation points and to differentiate 42d201fe46SDaniel Eischen * between application locks and libc locks (threads holding the 43d201fe46SDaniel Eischen * latter can't be allowed to exit/terminate). 44d201fe46SDaniel Eischen */ 45ceb33671SDoug Rabson 468360efbdSAlfred Perlstein /* Define a null pthread structure just to satisfy _pthread_self. */ 4729ac6bd2SDaniel Eischen struct pthread { 4829ac6bd2SDaniel Eischen }; 4929ac6bd2SDaniel Eischen 5029ac6bd2SDaniel Eischen static struct pthread main_thread; 5129ac6bd2SDaniel Eischen 52fb22a377SDaniel Eischen static int stub_main(void); 53*3cc3d71eSKyle Evans static void stub_void(void); 54fb22a377SDaniel Eischen static void *stub_null(void); 55fb22a377SDaniel Eischen static struct pthread *stub_self(void); 56fb22a377SDaniel Eischen static int stub_zero(void); 5748cb9786SDavid Chisnall static int stub_fail(void); 58f4cd2a5bSDaniel Eischen static int stub_true(void); 59f4cd2a5bSDaniel Eischen static void stub_exit(void); 60412ef5daSKonstantin Belousov static int stub_esrch(void); 610dc52b72SMinsoo Choo static int stub_getname_np(pthread_t, char *, size_t); 62fb22a377SDaniel Eischen 63fb22a377SDaniel Eischen #define PJT_DUAL_ENTRY(entry) \ 64fb22a377SDaniel Eischen (pthread_func_t)entry, (pthread_func_t)entry 65fb22a377SDaniel Eischen 66fcfc20c8SDaniel Eischen pthread_func_entry_t __thr_jtable[PJT_MAX] = { 67f2148ee0SKonstantin Belousov [PJT_ATFORK] = {PJT_DUAL_ENTRY(stub_zero)}, 68f2148ee0SKonstantin Belousov [PJT_ATTR_DESTROY] = {PJT_DUAL_ENTRY(stub_zero)}, 69f2148ee0SKonstantin Belousov [PJT_ATTR_GETDETACHSTATE] = {PJT_DUAL_ENTRY(stub_zero)}, 70f2148ee0SKonstantin Belousov [PJT_ATTR_GETGUARDSIZE] = {PJT_DUAL_ENTRY(stub_zero)}, 71f2148ee0SKonstantin Belousov [PJT_ATTR_GETINHERITSCHED] = {PJT_DUAL_ENTRY(stub_zero)}, 72f2148ee0SKonstantin Belousov [PJT_ATTR_GETSCHEDPARAM] = {PJT_DUAL_ENTRY(stub_zero)}, 73f2148ee0SKonstantin Belousov [PJT_ATTR_GETSCHEDPOLICY] = {PJT_DUAL_ENTRY(stub_zero)}, 74f2148ee0SKonstantin Belousov [PJT_ATTR_GETSCOPE] = {PJT_DUAL_ENTRY(stub_zero)}, 75f2148ee0SKonstantin Belousov [PJT_ATTR_GETSTACKADDR] = {PJT_DUAL_ENTRY(stub_zero)}, 76f2148ee0SKonstantin Belousov [PJT_ATTR_GETSTACKSIZE] = {PJT_DUAL_ENTRY(stub_zero)}, 77f2148ee0SKonstantin Belousov [PJT_ATTR_INIT] = {PJT_DUAL_ENTRY(stub_zero)}, 78f2148ee0SKonstantin Belousov [PJT_ATTR_SETDETACHSTATE] = {PJT_DUAL_ENTRY(stub_zero)}, 79f2148ee0SKonstantin Belousov [PJT_ATTR_SETGUARDSIZE] = {PJT_DUAL_ENTRY(stub_zero)}, 80f2148ee0SKonstantin Belousov [PJT_ATTR_SETINHERITSCHED] = {PJT_DUAL_ENTRY(stub_zero)}, 81f2148ee0SKonstantin Belousov [PJT_ATTR_SETSCHEDPARAM] = {PJT_DUAL_ENTRY(stub_zero)}, 82f2148ee0SKonstantin Belousov [PJT_ATTR_SETSCHEDPOLICY] = {PJT_DUAL_ENTRY(stub_zero)}, 83f2148ee0SKonstantin Belousov [PJT_ATTR_SETSCOPE] = {PJT_DUAL_ENTRY(stub_zero)}, 84f2148ee0SKonstantin Belousov [PJT_ATTR_SETSTACKADDR] = {PJT_DUAL_ENTRY(stub_zero)}, 85f2148ee0SKonstantin Belousov [PJT_ATTR_SETSTACKSIZE] = {PJT_DUAL_ENTRY(stub_zero)}, 86f2148ee0SKonstantin Belousov [PJT_CANCEL] = {PJT_DUAL_ENTRY(stub_zero)}, 87f2148ee0SKonstantin Belousov [PJT_CLEANUP_POP] = {PJT_DUAL_ENTRY(stub_zero)}, 88f2148ee0SKonstantin Belousov [PJT_CLEANUP_PUSH] = {PJT_DUAL_ENTRY(stub_zero)}, 89f2148ee0SKonstantin Belousov [PJT_COND_BROADCAST] = {PJT_DUAL_ENTRY(stub_zero)}, 90f2148ee0SKonstantin Belousov [PJT_COND_DESTROY] = {PJT_DUAL_ENTRY(stub_zero)}, 91f2148ee0SKonstantin Belousov [PJT_COND_INIT] = {PJT_DUAL_ENTRY(stub_zero)}, 92f2148ee0SKonstantin Belousov [PJT_COND_SIGNAL] = {PJT_DUAL_ENTRY(stub_zero)}, 93f2148ee0SKonstantin Belousov [PJT_COND_TIMEDWAIT] = {PJT_DUAL_ENTRY(stub_zero)}, 94f2148ee0SKonstantin Belousov [PJT_COND_WAIT] = {PJT_DUAL_ENTRY(stub_zero)}, 95f2148ee0SKonstantin Belousov [PJT_DETACH] = {PJT_DUAL_ENTRY(stub_zero)}, 96f2148ee0SKonstantin Belousov [PJT_EQUAL] = {PJT_DUAL_ENTRY(stub_true)}, 97f2148ee0SKonstantin Belousov [PJT_EXIT] = {PJT_DUAL_ENTRY(stub_exit)}, 98f2148ee0SKonstantin Belousov [PJT_GETSPECIFIC] = {PJT_DUAL_ENTRY(stub_null)}, 99f2148ee0SKonstantin Belousov [PJT_JOIN] = {PJT_DUAL_ENTRY(stub_zero)}, 100f2148ee0SKonstantin Belousov [PJT_KEY_CREATE] = {PJT_DUAL_ENTRY(stub_fail)}, 101f2148ee0SKonstantin Belousov [PJT_KEY_DELETE] = {PJT_DUAL_ENTRY(stub_zero)}, 102f2148ee0SKonstantin Belousov [PJT_KILL] = {PJT_DUAL_ENTRY(stub_zero)}, 103f2148ee0SKonstantin Belousov [PJT_MAIN_NP] = {PJT_DUAL_ENTRY(stub_main)}, 104f2148ee0SKonstantin Belousov [PJT_MUTEXATTR_DESTROY] = {PJT_DUAL_ENTRY(stub_zero)}, 105f2148ee0SKonstantin Belousov [PJT_MUTEXATTR_INIT] = {PJT_DUAL_ENTRY(stub_zero)}, 106f2148ee0SKonstantin Belousov [PJT_MUTEXATTR_SETTYPE] = {PJT_DUAL_ENTRY(stub_zero)}, 107f2148ee0SKonstantin Belousov [PJT_MUTEX_DESTROY] = {PJT_DUAL_ENTRY(stub_zero)}, 108f2148ee0SKonstantin Belousov [PJT_MUTEX_INIT] = {PJT_DUAL_ENTRY(stub_zero)}, 109f2148ee0SKonstantin Belousov [PJT_MUTEX_LOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 110f2148ee0SKonstantin Belousov [PJT_MUTEX_TRYLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 111f2148ee0SKonstantin Belousov [PJT_MUTEX_UNLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 112f2148ee0SKonstantin Belousov [PJT_ONCE] = {PJT_DUAL_ENTRY(stub_fail)}, 113f2148ee0SKonstantin Belousov [PJT_RWLOCK_DESTROY] = {PJT_DUAL_ENTRY(stub_zero)}, 114f2148ee0SKonstantin Belousov [PJT_RWLOCK_INIT] = {PJT_DUAL_ENTRY(stub_zero)}, 115f2148ee0SKonstantin Belousov [PJT_RWLOCK_RDLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 116f2148ee0SKonstantin Belousov [PJT_RWLOCK_TRYRDLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 117f2148ee0SKonstantin Belousov [PJT_RWLOCK_TRYWRLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 118f2148ee0SKonstantin Belousov [PJT_RWLOCK_UNLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 119f2148ee0SKonstantin Belousov [PJT_RWLOCK_WRLOCK] = {PJT_DUAL_ENTRY(stub_zero)}, 120f2148ee0SKonstantin Belousov [PJT_SELF] = {PJT_DUAL_ENTRY(stub_self)}, 121f2148ee0SKonstantin Belousov [PJT_SETCANCELSTATE] = {PJT_DUAL_ENTRY(stub_zero)}, 122f2148ee0SKonstantin Belousov [PJT_SETCANCELTYPE] = {PJT_DUAL_ENTRY(stub_zero)}, 123f2148ee0SKonstantin Belousov [PJT_SETSPECIFIC] = {PJT_DUAL_ENTRY(stub_zero)}, 124f2148ee0SKonstantin Belousov [PJT_SIGMASK] = {PJT_DUAL_ENTRY(stub_zero)}, 125f2148ee0SKonstantin Belousov [PJT_TESTCANCEL] = {PJT_DUAL_ENTRY(stub_zero)}, 126f2148ee0SKonstantin Belousov [PJT_CLEANUP_POP_IMP] = {PJT_DUAL_ENTRY(stub_zero)}, 127f2148ee0SKonstantin Belousov [PJT_CLEANUP_PUSH_IMP] = {PJT_DUAL_ENTRY(stub_zero)}, 128f2148ee0SKonstantin Belousov [PJT_CANCEL_ENTER] = {PJT_DUAL_ENTRY(stub_zero)}, 129f2148ee0SKonstantin Belousov [PJT_CANCEL_LEAVE] = {PJT_DUAL_ENTRY(stub_zero)}, 130f2148ee0SKonstantin Belousov [PJT_MUTEX_CONSISTENT] = {PJT_DUAL_ENTRY(stub_zero)}, 131f2148ee0SKonstantin Belousov [PJT_MUTEXATTR_GETROBUST] = {PJT_DUAL_ENTRY(stub_zero)}, 132f2148ee0SKonstantin Belousov [PJT_MUTEXATTR_SETROBUST] = {PJT_DUAL_ENTRY(stub_zero)}, 133f2148ee0SKonstantin Belousov [PJT_GETTHREADID_NP] = {PJT_DUAL_ENTRY(stub_zero)}, 134412ef5daSKonstantin Belousov [PJT_ATTR_GET_NP] = {PJT_DUAL_ENTRY(stub_esrch)}, 1350dc52b72SMinsoo Choo [PJT_GETNAME_NP] = {PJT_DUAL_ENTRY(stub_getname_np)}, 136*3cc3d71eSKyle Evans [PJT_SUSPEND_ALL_NP] = {PJT_DUAL_ENTRY(stub_void)}, 137*3cc3d71eSKyle Evans [PJT_RESUME_ALL_NP] = {PJT_DUAL_ENTRY(stub_void)}, 138fb22a377SDaniel Eischen }; 139fb22a377SDaniel Eischen 140fb22a377SDaniel Eischen /* 141fb22a377SDaniel Eischen * Weak aliases for exported (pthread_*) and internal (_pthread_*) routines. 142fb22a377SDaniel Eischen */ 143fb22a377SDaniel Eischen #define WEAK_REF(sym, alias) __weak_reference(sym, alias) 144fb22a377SDaniel Eischen 145fb22a377SDaniel Eischen #define FUNC_TYPE(name) __CONCAT(name, _func_t) 146fb22a377SDaniel Eischen #define FUNC_INT(name) __CONCAT(name, _int) 147fb22a377SDaniel Eischen #define FUNC_EXP(name) __CONCAT(name, _exp) 148fb22a377SDaniel Eischen 149fb22a377SDaniel Eischen #define STUB_FUNC(name, idx, ret) \ 150132cc075SAlexander Kabaev static ret FUNC_EXP(name)(void) __used; \ 151132cc075SAlexander Kabaev static ret FUNC_INT(name)(void) __used; \ 152fb22a377SDaniel Eischen WEAK_REF(FUNC_EXP(name), name); \ 153fb22a377SDaniel Eischen WEAK_REF(FUNC_INT(name), __CONCAT(_, name)); \ 154fb22a377SDaniel Eischen typedef ret (*FUNC_TYPE(name))(void); \ 155fb22a377SDaniel Eischen static ret FUNC_EXP(name)(void) \ 156fb22a377SDaniel Eischen { \ 157fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 158fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][0]; \ 159fb22a377SDaniel Eischen return (func()); \ 160fb22a377SDaniel Eischen } \ 161fb22a377SDaniel Eischen static ret FUNC_INT(name)(void) \ 162fb22a377SDaniel Eischen { \ 163fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 164fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][1]; \ 165fb22a377SDaniel Eischen return (func()); \ 1668360efbdSAlfred Perlstein } 1678360efbdSAlfred Perlstein 168fb22a377SDaniel Eischen #define STUB_FUNC1(name, idx, ret, p0_type) \ 169132cc075SAlexander Kabaev static ret FUNC_EXP(name)(p0_type) __used; \ 170132cc075SAlexander Kabaev static ret FUNC_INT(name)(p0_type) __used; \ 171fb22a377SDaniel Eischen WEAK_REF(FUNC_EXP(name), name); \ 172fb22a377SDaniel Eischen WEAK_REF(FUNC_INT(name), __CONCAT(_, name)); \ 173fb22a377SDaniel Eischen typedef ret (*FUNC_TYPE(name))(p0_type); \ 174fb22a377SDaniel Eischen static ret FUNC_EXP(name)(p0_type p0) \ 175fb22a377SDaniel Eischen { \ 176fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 177fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][0]; \ 178fb22a377SDaniel Eischen return (func(p0)); \ 179fb22a377SDaniel Eischen } \ 180fb22a377SDaniel Eischen static ret FUNC_INT(name)(p0_type p0) \ 181fb22a377SDaniel Eischen { \ 182fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 183fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][1]; \ 184fb22a377SDaniel Eischen return (func(p0)); \ 1858360efbdSAlfred Perlstein } 1868360efbdSAlfred Perlstein 187fb22a377SDaniel Eischen #define STUB_FUNC2(name, idx, ret, p0_type, p1_type) \ 188132cc075SAlexander Kabaev static ret FUNC_EXP(name)(p0_type, p1_type) __used; \ 189132cc075SAlexander Kabaev static ret FUNC_INT(name)(p0_type, p1_type) __used; \ 190fb22a377SDaniel Eischen WEAK_REF(FUNC_EXP(name), name); \ 191fb22a377SDaniel Eischen WEAK_REF(FUNC_INT(name), __CONCAT(_, name)); \ 192fb22a377SDaniel Eischen typedef ret (*FUNC_TYPE(name))(p0_type, p1_type); \ 193fb22a377SDaniel Eischen static ret FUNC_EXP(name)(p0_type p0, p1_type p1) \ 194fb22a377SDaniel Eischen { \ 195fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 196fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][0]; \ 197fb22a377SDaniel Eischen return (func(p0, p1)); \ 198fb22a377SDaniel Eischen } \ 199fb22a377SDaniel Eischen static ret FUNC_INT(name)(p0_type p0, p1_type p1) \ 200fb22a377SDaniel Eischen { \ 201fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 202fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][1]; \ 203fb22a377SDaniel Eischen return (func(p0, p1)); \ 204ceb33671SDoug Rabson } 205ceb33671SDoug Rabson 206fb22a377SDaniel Eischen #define STUB_FUNC3(name, idx, ret, p0_type, p1_type, p2_type) \ 207132cc075SAlexander Kabaev static ret FUNC_EXP(name)(p0_type, p1_type, p2_type) __used; \ 208132cc075SAlexander Kabaev static ret FUNC_INT(name)(p0_type, p1_type, p2_type) __used; \ 209fb22a377SDaniel Eischen WEAK_REF(FUNC_EXP(name), name); \ 210fb22a377SDaniel Eischen WEAK_REF(FUNC_INT(name), __CONCAT(_, name)); \ 211fb22a377SDaniel Eischen typedef ret (*FUNC_TYPE(name))(p0_type, p1_type, p2_type); \ 212fb22a377SDaniel Eischen static ret FUNC_EXP(name)(p0_type p0, p1_type p1, p2_type p2) \ 213fb22a377SDaniel Eischen { \ 214fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 215fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][0]; \ 216fb22a377SDaniel Eischen return (func(p0, p1, p2)); \ 217fb22a377SDaniel Eischen } \ 218fb22a377SDaniel Eischen static ret FUNC_INT(name)(p0_type p0, p1_type p1, p2_type p2) \ 219fb22a377SDaniel Eischen { \ 220fb22a377SDaniel Eischen FUNC_TYPE(name) func; \ 221fb22a377SDaniel Eischen func = (FUNC_TYPE(name))__thr_jtable[idx][1]; \ 222fb22a377SDaniel Eischen return (func(p0, p1, p2)); \ 2238360efbdSAlfred Perlstein } 224d201fe46SDaniel Eischen 225fb22a377SDaniel Eischen STUB_FUNC1(pthread_cond_broadcast, PJT_COND_BROADCAST, int, void *) 226fb22a377SDaniel Eischen STUB_FUNC1(pthread_cond_destroy, PJT_COND_DESTROY, int, void *) 227fb22a377SDaniel Eischen STUB_FUNC2(pthread_cond_init, PJT_COND_INIT, int, void *, void *) 228fb22a377SDaniel Eischen STUB_FUNC1(pthread_cond_signal, PJT_COND_SIGNAL, int, void *) 229f4fb3299SDaniel Eischen STUB_FUNC2(pthread_cond_wait, PJT_COND_WAIT, int, void *, void *) 230fb22a377SDaniel Eischen STUB_FUNC1(pthread_getspecific, PJT_GETSPECIFIC, void *, pthread_key_t) 231fb22a377SDaniel Eischen STUB_FUNC2(pthread_key_create, PJT_KEY_CREATE, int, void *, void *) 232fb22a377SDaniel Eischen STUB_FUNC1(pthread_key_delete, PJT_KEY_DELETE, int, pthread_key_t) 233fb22a377SDaniel Eischen STUB_FUNC(pthread_main_np, PJT_MAIN_NP, int) 234fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutex_destroy, PJT_MUTEX_DESTROY, int, void *) 235fb22a377SDaniel Eischen STUB_FUNC2(pthread_mutex_init, PJT_MUTEX_INIT, int, void *, void *) 236fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutex_lock, PJT_MUTEX_LOCK, int, void *) 237fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutex_trylock, PJT_MUTEX_TRYLOCK, int, void *) 238fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutex_unlock, PJT_MUTEX_UNLOCK, int, void *) 2392a339d9eSKonstantin Belousov STUB_FUNC1(pthread_mutex_consistent, PJT_MUTEX_CONSISTENT, int, void *) 240fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutexattr_destroy, PJT_MUTEXATTR_DESTROY, int, void *) 241fb22a377SDaniel Eischen STUB_FUNC1(pthread_mutexattr_init, PJT_MUTEXATTR_INIT, int, void *) 242ad1e5416SJoe Marcus Clarke STUB_FUNC2(pthread_mutexattr_settype, PJT_MUTEXATTR_SETTYPE, int, void *, int) 2432a339d9eSKonstantin Belousov STUB_FUNC2(pthread_mutexattr_getrobust, PJT_MUTEXATTR_GETROBUST, int, void *, 2442a339d9eSKonstantin Belousov int *) 2452a339d9eSKonstantin Belousov STUB_FUNC2(pthread_mutexattr_setrobust, PJT_MUTEXATTR_SETROBUST, int, void *, 2462a339d9eSKonstantin Belousov int) 247fb22a377SDaniel Eischen STUB_FUNC2(pthread_once, PJT_ONCE, int, void *, void *) 248fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_destroy, PJT_RWLOCK_DESTROY, int, void *) 249fb22a377SDaniel Eischen STUB_FUNC2(pthread_rwlock_init, PJT_RWLOCK_INIT, int, void *, void *) 250fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_rdlock, PJT_RWLOCK_RDLOCK, int, void *) 251fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_tryrdlock, PJT_RWLOCK_TRYRDLOCK, int, void *) 252fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_trywrlock, PJT_RWLOCK_TRYWRLOCK, int, void *) 253fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_unlock, PJT_RWLOCK_UNLOCK, int, void *) 254fb22a377SDaniel Eischen STUB_FUNC1(pthread_rwlock_wrlock, PJT_RWLOCK_WRLOCK, int, void *) 255fb22a377SDaniel Eischen STUB_FUNC(pthread_self, PJT_SELF, pthread_t) 2562d8c3eebSKonstantin Belousov STUB_FUNC(pthread_getthreadid_np, PJT_GETTHREADID_NP, int) 257fb22a377SDaniel Eischen STUB_FUNC2(pthread_setspecific, PJT_SETSPECIFIC, int, pthread_key_t, void *) 258fb22a377SDaniel Eischen STUB_FUNC3(pthread_sigmask, PJT_SIGMASK, int, int, void *, void *) 259f4cd2a5bSDaniel Eischen STUB_FUNC3(pthread_atfork, PJT_ATFORK, int, void *, void *, void*) 260f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_attr_destroy, PJT_ATTR_DESTROY, int, void *); 261f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getdetachstate, PJT_ATTR_GETDETACHSTATE, int, void *, void *) 262f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getguardsize, PJT_ATTR_GETGUARDSIZE, int, void *, void *) 263f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getstackaddr, PJT_ATTR_GETSTACKADDR, int, void *, void *) 264f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getstacksize, PJT_ATTR_GETSTACKSIZE, int, void *, void *) 265f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getinheritsched, PJT_ATTR_GETINHERITSCHED, int, void *, void *) 266f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getschedparam, PJT_ATTR_GETSCHEDPARAM, int, void *, void *) 267f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getschedpolicy, PJT_ATTR_GETSCHEDPOLICY, int, void *, void *) 268f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_getscope, PJT_ATTR_GETSCOPE, int, void *, void *) 269f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_attr_init, PJT_ATTR_INIT, int, void *) 270f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setdetachstate, PJT_ATTR_SETDETACHSTATE, int, void *, int) 271f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setguardsize, PJT_ATTR_SETGUARDSIZE, int, void *, size_t) 272f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setstackaddr, PJT_ATTR_SETSTACKADDR, int, void *, void *) 273f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setstacksize, PJT_ATTR_SETSTACKSIZE, int, void *, size_t) 274f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setinheritsched, PJT_ATTR_SETINHERITSCHED, int, void *, int) 275f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setschedparam, PJT_ATTR_SETSCHEDPARAM, int, void *, void *) 276f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setschedpolicy, PJT_ATTR_SETSCHEDPOLICY, int, void *, int) 277f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_attr_setscope, PJT_ATTR_SETSCOPE, int, void *, int) 278f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_cancel, PJT_CANCEL, int, void *) 279f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_cleanup_pop, PJT_CLEANUP_POP, int, int) 280f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_cleanup_push, PJT_CLEANUP_PUSH, void, void *, void *) 281f4cd2a5bSDaniel Eischen STUB_FUNC3(pthread_cond_timedwait, PJT_COND_TIMEDWAIT, int, void *, void *, void *) 282f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_detach, PJT_DETACH, int, void *) 283f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_equal, PJT_EQUAL, int, void *, void *) 284f4cd2a5bSDaniel Eischen STUB_FUNC1(pthread_exit, PJT_EXIT, void, void *) 285f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_join, PJT_JOIN, int, void *, void *) 286f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_kill, PJT_KILL, int, void *, int) 287f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_setcancelstate, PJT_SETCANCELSTATE, int, int, void *) 288f4cd2a5bSDaniel Eischen STUB_FUNC2(pthread_setcanceltype, PJT_SETCANCELTYPE, int, int, void *) 289f4cd2a5bSDaniel Eischen STUB_FUNC(pthread_testcancel, PJT_TESTCANCEL, void) 290c89a3f00SKonstantin Belousov STUB_FUNC1(__pthread_cleanup_pop_imp, PJT_CLEANUP_POP_IMP, void, int) 291c89a3f00SKonstantin Belousov STUB_FUNC3(__pthread_cleanup_push_imp, PJT_CLEANUP_PUSH_IMP, void, void *, 2921a1b8b1cSKonstantin Belousov void *, void *) 293c89a3f00SKonstantin Belousov STUB_FUNC1(_pthread_cancel_enter, PJT_CANCEL_ENTER, void, int) 294c89a3f00SKonstantin Belousov STUB_FUNC1(_pthread_cancel_leave, PJT_CANCEL_LEAVE, void, int) 295412ef5daSKonstantin Belousov STUB_FUNC2(pthread_attr_get_np, PJT_ATTR_GET_NP, int, pthread_t, pthread_attr_t *) 2960dc52b72SMinsoo Choo STUB_FUNC3(pthread_getname_np, PJT_GETNAME_NP, int, pthread_t, char *, size_t) 29783aafcdcSKyle Evans STUB_FUNC(pthread_suspend_all_np, PJT_SUSPEND_ALL_NP, void); 29883aafcdcSKyle Evans STUB_FUNC(pthread_resume_all_np, PJT_RESUME_ALL_NP, void); 299fb22a377SDaniel Eischen 300ceb33671SDoug Rabson static int 301fb22a377SDaniel Eischen stub_zero(void) 3024f68734dSAlfred Perlstein { 3034f68734dSAlfred Perlstein return (0); 3044f68734dSAlfred Perlstein } 3054f68734dSAlfred Perlstein 306*3cc3d71eSKyle Evans static void 307*3cc3d71eSKyle Evans stub_void(void) 308*3cc3d71eSKyle Evans { 309*3cc3d71eSKyle Evans 310*3cc3d71eSKyle Evans } 311*3cc3d71eSKyle Evans 312ceb33671SDoug Rabson static void * 313fb22a377SDaniel Eischen stub_null(void) 314d201fe46SDaniel Eischen { 315d201fe46SDaniel Eischen return (NULL); 316d201fe46SDaniel Eischen } 317d201fe46SDaniel Eischen 318fb22a377SDaniel Eischen static struct pthread * 319fb22a377SDaniel Eischen stub_self(void) 32029ac6bd2SDaniel Eischen { 32129ac6bd2SDaniel Eischen return (&main_thread); 32229ac6bd2SDaniel Eischen } 32329ac6bd2SDaniel Eischen 324ceb33671SDoug Rabson static int 32548cb9786SDavid Chisnall stub_fail(void) 32648cb9786SDavid Chisnall { 3275bf69a4bSDavid Chisnall return (ENOSYS); 32848cb9786SDavid Chisnall } 32948cb9786SDavid Chisnall 33048cb9786SDavid Chisnall static int 331fb22a377SDaniel Eischen stub_main(void) 332d201fe46SDaniel Eischen { 333fb22a377SDaniel Eischen return (-1); 334ceb33671SDoug Rabson } 335f4cd2a5bSDaniel Eischen 336f4cd2a5bSDaniel Eischen static int 337f4cd2a5bSDaniel Eischen stub_true(void) 338f4cd2a5bSDaniel Eischen { 339f4cd2a5bSDaniel Eischen return (1); 340f4cd2a5bSDaniel Eischen } 341f4cd2a5bSDaniel Eischen 342f4cd2a5bSDaniel Eischen static void 343f4cd2a5bSDaniel Eischen stub_exit(void) 344f4cd2a5bSDaniel Eischen { 345f4cd2a5bSDaniel Eischen exit(0); 346f4cd2a5bSDaniel Eischen } 347412ef5daSKonstantin Belousov 348412ef5daSKonstantin Belousov static int 349412ef5daSKonstantin Belousov stub_esrch(void) 350412ef5daSKonstantin Belousov { 351412ef5daSKonstantin Belousov return (ESRCH); 352412ef5daSKonstantin Belousov } 3530dc52b72SMinsoo Choo 3540dc52b72SMinsoo Choo static int 3550dc52b72SMinsoo Choo stub_getname_np(pthread_t thread, char *buf, size_t len) 3560dc52b72SMinsoo Choo { 3570dc52b72SMinsoo Choo if (thread != &main_thread) 3580dc52b72SMinsoo Choo return (ESRCH); 3590dc52b72SMinsoo Choo if (len >= 1) 3600dc52b72SMinsoo Choo buf[0] = '\0'; 3610dc52b72SMinsoo Choo return (0); 3620dc52b72SMinsoo Choo } 363