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_ |
---|
37 | #include <sys/_types.h> |
---|
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 | */ |
---|
45 | #ifdef __rtems__ |
---|
46 | #define __isthreaded 1 |
---|
47 | #else /* __rtems__ */ |
---|
48 | extern int __isthreaded; |
---|
49 | #endif /* __rtems__ */ |
---|
50 | |
---|
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 | |
---|
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 | |
---|
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 | |
---|
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, |
---|
168 | PJT_CLEANUP_POP_IMP, |
---|
169 | PJT_CLEANUP_PUSH_IMP, |
---|
170 | PJT_CANCEL_ENTER, |
---|
171 | PJT_CANCEL_LEAVE, |
---|
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); |
---|
233 | #include <sys/_types.h> |
---|
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 | |
---|
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 | |
---|
259 | /* execve() with PATH processing to implement posix_spawnp() */ |
---|
260 | int _execvpe(const char *, char * const *, char * const *); |
---|
261 | |
---|
262 | int _elf_aux_info(int aux, void *buf, int buflen); |
---|
263 | struct dl_phdr_info; |
---|
264 | int __elf_phdr_match_addr(struct dl_phdr_info *, void *); |
---|
265 | void __init_elf_aux_vector(void); |
---|
266 | |
---|
267 | void _pthread_cancel_enter(int); |
---|
268 | void _pthread_cancel_leave(int); |
---|
269 | |
---|
270 | #endif /* _LIBC_PRIVATE_H_ */ |
---|