[1b13f69] | 1 | /* |
---|
| 2 | * Copyright (c) 1998 John Birrell <jb@cimlogic.com.au>. |
---|
| 3 | * All rights reserved. |
---|
| 4 | * |
---|
| 5 | * Redistribution and use in source and binary forms, with or without |
---|
| 6 | * modification, are permitted provided that the following conditions |
---|
| 7 | * are met: |
---|
| 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. |
---|
| 13 | * 3. Neither the name of the author nor the names of any co-contributors |
---|
| 14 | * may be used to endorse or promote products derived from this software |
---|
| 15 | * without specific prior written permission. |
---|
| 16 | * |
---|
| 17 | * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND |
---|
| 18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
---|
| 19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
---|
| 20 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
---|
| 21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
| 22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
| 23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
| 24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
| 25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
| 26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
| 27 | * SUCH DAMAGE. |
---|
| 28 | * |
---|
| 29 | * $FreeBSD$ |
---|
| 30 | * |
---|
| 31 | * Private definitions for libc, libc_r and libpthread. |
---|
| 32 | * |
---|
| 33 | */ |
---|
| 34 | |
---|
| 35 | #ifndef _LIBC_PRIVATE_H_ |
---|
| 36 | #define _LIBC_PRIVATE_H_ |
---|
[b6f6deb] | 37 | #include <sys/_types.h> |
---|
[1b13f69] | 38 | #include <sys/_pthreadtypes.h> |
---|
| 39 | |
---|
| 40 | /* |
---|
| 41 | * This global flag is non-zero when a process has created one |
---|
| 42 | * or more threads. It is used to avoid calling locking functions |
---|
| 43 | * when they are not required. |
---|
| 44 | */ |
---|
[e6fe77e] | 45 | #ifdef __rtems__ |
---|
| 46 | #define __isthreaded 1 |
---|
[e599318] | 47 | #else /* __rtems__ */ |
---|
[1b13f69] | 48 | extern int __isthreaded; |
---|
[e599318] | 49 | #endif /* __rtems__ */ |
---|
[1b13f69] | 50 | |
---|
[66659ff] | 51 | /* |
---|
| 52 | * Elf_Auxinfo *__elf_aux_vector, the pointer to the ELF aux vector |
---|
| 53 | * provided by kernel. Either set for us by rtld, or found at runtime |
---|
| 54 | * on stack for static binaries. |
---|
| 55 | * |
---|
| 56 | * Type is void to avoid polluting whole libc with ELF types. |
---|
| 57 | */ |
---|
| 58 | extern void *__elf_aux_vector; |
---|
| 59 | |
---|
[1b13f69] | 60 | /* |
---|
| 61 | * libc should use libc_dlopen internally, which respects a global |
---|
| 62 | * flag where loading of new shared objects can be restricted. |
---|
| 63 | */ |
---|
| 64 | void *libc_dlopen(const char *, int); |
---|
| 65 | |
---|
| 66 | /* |
---|
| 67 | * For dynamic linker. |
---|
| 68 | */ |
---|
| 69 | void _rtld_error(const char *fmt, ...); |
---|
| 70 | |
---|
| 71 | /* |
---|
| 72 | * File lock contention is difficult to diagnose without knowing |
---|
| 73 | * where locks were set. Allow a debug library to be built which |
---|
| 74 | * records the source file and line number of each lock call. |
---|
| 75 | */ |
---|
| 76 | #ifdef _FLOCK_DEBUG |
---|
| 77 | #define _FLOCKFILE(x) _flockfile_debug(x, __FILE__, __LINE__) |
---|
| 78 | #else |
---|
| 79 | #define _FLOCKFILE(x) _flockfile(x) |
---|
| 80 | #endif |
---|
| 81 | |
---|
| 82 | /* |
---|
| 83 | * Macros for locking and unlocking FILEs. These test if the |
---|
| 84 | * process is threaded to avoid locking when not required. |
---|
| 85 | */ |
---|
| 86 | #define FLOCKFILE(fp) if (__isthreaded) _FLOCKFILE(fp) |
---|
| 87 | #define FUNLOCKFILE(fp) if (__isthreaded) _funlockfile(fp) |
---|
| 88 | |
---|
[af5333e] | 89 | struct _spinlock; |
---|
| 90 | extern struct _spinlock __stdio_thread_lock; |
---|
| 91 | #define STDIO_THREAD_LOCK() \ |
---|
| 92 | do { \ |
---|
| 93 | if (__isthreaded) \ |
---|
| 94 | _SPINLOCK(&__stdio_thread_lock); \ |
---|
| 95 | } while (0) |
---|
| 96 | #define STDIO_THREAD_UNLOCK() \ |
---|
| 97 | do { \ |
---|
| 98 | if (__isthreaded) \ |
---|
| 99 | _SPINUNLOCK(&__stdio_thread_lock); \ |
---|
| 100 | } while (0) |
---|
| 101 | |
---|
[1b13f69] | 102 | /* |
---|
| 103 | * Indexes into the pthread jump table. |
---|
| 104 | * |
---|
| 105 | * Warning! If you change this type, you must also change the threads |
---|
| 106 | * libraries that reference it (libc_r, libpthread). |
---|
| 107 | */ |
---|
| 108 | typedef enum { |
---|
| 109 | PJT_ATFORK, |
---|
| 110 | PJT_ATTR_DESTROY, |
---|
| 111 | PJT_ATTR_GETDETACHSTATE, |
---|
| 112 | PJT_ATTR_GETGUARDSIZE, |
---|
| 113 | PJT_ATTR_GETINHERITSCHED, |
---|
| 114 | PJT_ATTR_GETSCHEDPARAM, |
---|
| 115 | PJT_ATTR_GETSCHEDPOLICY, |
---|
| 116 | PJT_ATTR_GETSCOPE, |
---|
| 117 | PJT_ATTR_GETSTACKADDR, |
---|
| 118 | PJT_ATTR_GETSTACKSIZE, |
---|
| 119 | PJT_ATTR_INIT, |
---|
| 120 | PJT_ATTR_SETDETACHSTATE, |
---|
| 121 | PJT_ATTR_SETGUARDSIZE, |
---|
| 122 | PJT_ATTR_SETINHERITSCHED, |
---|
| 123 | PJT_ATTR_SETSCHEDPARAM, |
---|
| 124 | PJT_ATTR_SETSCHEDPOLICY, |
---|
| 125 | PJT_ATTR_SETSCOPE, |
---|
| 126 | PJT_ATTR_SETSTACKADDR, |
---|
| 127 | PJT_ATTR_SETSTACKSIZE, |
---|
| 128 | PJT_CANCEL, |
---|
| 129 | PJT_CLEANUP_POP, |
---|
| 130 | PJT_CLEANUP_PUSH, |
---|
| 131 | PJT_COND_BROADCAST, |
---|
| 132 | PJT_COND_DESTROY, |
---|
| 133 | PJT_COND_INIT, |
---|
| 134 | PJT_COND_SIGNAL, |
---|
| 135 | PJT_COND_TIMEDWAIT, |
---|
| 136 | PJT_COND_WAIT, |
---|
| 137 | PJT_DETACH, |
---|
| 138 | PJT_EQUAL, |
---|
| 139 | PJT_EXIT, |
---|
| 140 | PJT_GETSPECIFIC, |
---|
| 141 | PJT_JOIN, |
---|
| 142 | PJT_KEY_CREATE, |
---|
| 143 | PJT_KEY_DELETE, |
---|
| 144 | PJT_KILL, |
---|
| 145 | PJT_MAIN_NP, |
---|
| 146 | PJT_MUTEXATTR_DESTROY, |
---|
| 147 | PJT_MUTEXATTR_INIT, |
---|
| 148 | PJT_MUTEXATTR_SETTYPE, |
---|
| 149 | PJT_MUTEX_DESTROY, |
---|
| 150 | PJT_MUTEX_INIT, |
---|
| 151 | PJT_MUTEX_LOCK, |
---|
| 152 | PJT_MUTEX_TRYLOCK, |
---|
| 153 | PJT_MUTEX_UNLOCK, |
---|
| 154 | PJT_ONCE, |
---|
| 155 | PJT_RWLOCK_DESTROY, |
---|
| 156 | PJT_RWLOCK_INIT, |
---|
| 157 | PJT_RWLOCK_RDLOCK, |
---|
| 158 | PJT_RWLOCK_TRYRDLOCK, |
---|
| 159 | PJT_RWLOCK_TRYWRLOCK, |
---|
| 160 | PJT_RWLOCK_UNLOCK, |
---|
| 161 | PJT_RWLOCK_WRLOCK, |
---|
| 162 | PJT_SELF, |
---|
| 163 | PJT_SETCANCELSTATE, |
---|
| 164 | PJT_SETCANCELTYPE, |
---|
| 165 | PJT_SETSPECIFIC, |
---|
| 166 | PJT_SIGMASK, |
---|
| 167 | PJT_TESTCANCEL, |
---|
[66659ff] | 168 | PJT_CLEANUP_POP_IMP, |
---|
| 169 | PJT_CLEANUP_PUSH_IMP, |
---|
| 170 | PJT_CANCEL_ENTER, |
---|
| 171 | PJT_CANCEL_LEAVE, |
---|
[1b13f69] | 172 | PJT_MAX |
---|
| 173 | } pjt_index_t; |
---|
| 174 | |
---|
| 175 | typedef int (*pthread_func_t)(void); |
---|
| 176 | typedef pthread_func_t pthread_func_entry_t[2]; |
---|
| 177 | |
---|
| 178 | extern pthread_func_entry_t __thr_jtable[]; |
---|
| 179 | |
---|
| 180 | /* |
---|
| 181 | * yplib internal interfaces |
---|
| 182 | */ |
---|
| 183 | #ifdef YP |
---|
| 184 | int _yp_check(char **); |
---|
| 185 | #endif |
---|
| 186 | |
---|
| 187 | /* |
---|
| 188 | * Initialise TLS for static programs |
---|
| 189 | */ |
---|
| 190 | void _init_tls(void); |
---|
| 191 | |
---|
| 192 | /* |
---|
| 193 | * Provides pthread_once()-like functionality for both single-threaded |
---|
| 194 | * and multi-threaded applications. |
---|
| 195 | */ |
---|
| 196 | int _once(pthread_once_t *, void (*)(void)); |
---|
| 197 | |
---|
| 198 | /* |
---|
| 199 | * Set the TLS thread pointer |
---|
| 200 | */ |
---|
| 201 | void _set_tp(void *tp); |
---|
| 202 | |
---|
| 203 | /* |
---|
| 204 | * This is a pointer in the C run-time startup code. It is used |
---|
| 205 | * by getprogname() and setprogname(). |
---|
| 206 | */ |
---|
| 207 | extern const char *__progname; |
---|
| 208 | |
---|
| 209 | /* |
---|
| 210 | * This function is used by the threading libraries to notify malloc that a |
---|
| 211 | * thread is exiting. |
---|
| 212 | */ |
---|
| 213 | void _malloc_thread_cleanup(void); |
---|
| 214 | |
---|
| 215 | /* |
---|
| 216 | * These functions are used by the threading libraries in order to protect |
---|
| 217 | * malloc across fork(). |
---|
| 218 | */ |
---|
| 219 | void _malloc_prefork(void); |
---|
| 220 | void _malloc_postfork(void); |
---|
| 221 | |
---|
| 222 | /* |
---|
| 223 | * Function to clean up streams, called from abort() and exit(). |
---|
| 224 | */ |
---|
| 225 | extern void (*__cleanup)(void); |
---|
| 226 | |
---|
| 227 | /* |
---|
| 228 | * Get kern.osreldate to detect ABI revisions. Explicitly |
---|
| 229 | * ignores value of $OSVERSION and caches result. Prototypes |
---|
| 230 | * for the wrapped "new" pad-less syscalls are here for now. |
---|
| 231 | */ |
---|
| 232 | extern int __getosreldate(void); |
---|
[b6f6deb] | 233 | #include <sys/_types.h> |
---|
[1b13f69] | 234 | /* Without pad */ |
---|
| 235 | extern __off_t __sys_lseek(int, __off_t, int); |
---|
| 236 | extern int __sys_ftruncate(int, __off_t); |
---|
| 237 | extern int __sys_truncate(const char *, __off_t); |
---|
| 238 | extern __ssize_t __sys_pread(int, void *, __size_t, __off_t); |
---|
| 239 | extern __ssize_t __sys_pwrite(int, const void *, __size_t, __off_t); |
---|
| 240 | extern void * __sys_mmap(void *, __size_t, int, int, int, __off_t); |
---|
| 241 | |
---|
| 242 | /* With pad */ |
---|
| 243 | extern __off_t __sys_freebsd6_lseek(int, int, __off_t, int); |
---|
| 244 | extern int __sys_freebsd6_ftruncate(int, int, __off_t); |
---|
| 245 | extern int __sys_freebsd6_truncate(const char *, int, __off_t); |
---|
| 246 | extern __ssize_t __sys_freebsd6_pread(int, void *, __size_t, int, __off_t); |
---|
| 247 | extern __ssize_t __sys_freebsd6_pwrite(int, const void *, __size_t, int, __off_t); |
---|
| 248 | extern void * __sys_freebsd6_mmap(void *, __size_t, int, int, int, int, __off_t); |
---|
| 249 | |
---|
| 250 | /* Without back-compat translation */ |
---|
| 251 | extern int __sys_fcntl(int, int, ...); |
---|
| 252 | |
---|
[66659ff] | 253 | struct timespec; |
---|
| 254 | struct timeval; |
---|
| 255 | struct timezone; |
---|
| 256 | int __sys_gettimeofday(struct timeval *, struct timezone *); |
---|
| 257 | int __sys_clock_gettime(__clockid_t, struct timespec *ts); |
---|
| 258 | |
---|
[1b13f69] | 259 | /* execve() with PATH processing to implement posix_spawnp() */ |
---|
| 260 | int _execvpe(const char *, char * const *, char * const *); |
---|
| 261 | |
---|
[66659ff] | 262 | int _elf_aux_info(int aux, void *buf, int buflen); |
---|
[af5333e] | 263 | struct dl_phdr_info; |
---|
| 264 | int __elf_phdr_match_addr(struct dl_phdr_info *, void *); |
---|
[66659ff] | 265 | void __init_elf_aux_vector(void); |
---|
| 266 | |
---|
| 267 | void _pthread_cancel_enter(int); |
---|
| 268 | void _pthread_cancel_leave(int); |
---|
[af5333e] | 269 | |
---|
[1b13f69] | 270 | #endif /* _LIBC_PRIVATE_H_ */ |
---|