diff options
author | cvs2svn <admin@example.com> | 2025-04-14 17:32:06 +0000 |
---|---|---|
committer | cvs2svn <admin@example.com> | 2025-04-14 17:32:06 +0000 |
commit | eb8dd9dca1228af0cd132f515509051ecfabf6f6 (patch) | |
tree | edb6da6af7e865d488dc1a29309f1e1ec226e603 /src/lib/libc/include | |
parent | 247f0352e0ed72a4f476db9dc91f4d982bc83eb2 (diff) | |
download | openbsd-tb_20250414.tar.gz openbsd-tb_20250414.tar.bz2 openbsd-tb_20250414.zip |
This commit was manufactured by cvs2git to create tag 'tb_20250414'.tb_20250414
Diffstat (limited to 'src/lib/libc/include')
-rw-r--r-- | src/lib/libc/include/DETAILS | 133 | ||||
-rw-r--r-- | src/lib/libc/include/README | 110 | ||||
-rw-r--r-- | src/lib/libc/include/atfork.h | 45 | ||||
-rw-r--r-- | src/lib/libc/include/cancel.h | 78 | ||||
-rw-r--r-- | src/lib/libc/include/ctype_private.h | 9 | ||||
-rw-r--r-- | src/lib/libc/include/localedef.h | 106 | ||||
-rw-r--r-- | src/lib/libc/include/mpool.h | 122 | ||||
-rw-r--r-- | src/lib/libc/include/namespace.h | 98 | ||||
-rw-r--r-- | src/lib/libc/include/thread_private.h | 427 |
9 files changed, 0 insertions, 1128 deletions
diff --git a/src/lib/libc/include/DETAILS b/src/lib/libc/include/DETAILS deleted file mode 100644 index 6382cc1c0d..0000000000 --- a/src/lib/libc/include/DETAILS +++ /dev/null | |||
@@ -1,133 +0,0 @@ | |||
1 | The goal: calls from inside libc to other libc functions should | ||
2 | * not be overridable (except for the malloc family), and | ||
3 | * not have pointless inefficiencies. | ||
4 | |||
5 | To achieve this, we arrange that all these internal call be via | ||
6 | identifiers that are of hidden visibility and--to avoid confusion | ||
7 | and work correctly in static executables--are in the reserved | ||
8 | namespace. | ||
9 | |||
10 | This document describes the details of the naming scheme and how | ||
11 | it is implemented. | ||
12 | |||
13 | I've chosen a prefix of underbar-libc-underbar ("_libc_") for this. | ||
14 | These are not declared directly; instead, the gcc "asm labels" | ||
15 | extension is used to rename the function. | ||
16 | |||
17 | We need many of the symbols to be weak in *static* builds, but they | ||
18 | can be strong in the dynamic library, as there's a natural precedence | ||
19 | from the search order there. When the descriptions below say a | ||
20 | name is "weak", that is only necessary for the static library and | ||
21 | not for the shared library. Note: use defined(PIC) to recognize | ||
22 | when compiling the shared objects: some archs define __PIC__ *all* | ||
23 | the time. | ||
24 | |||
25 | --------- | ||
26 | |||
27 | For syscalls which are not cancellation points, such as getpid(), | ||
28 | the identifiers are just: | ||
29 | _libc_getpid hidden alias, for use internal to libc only | ||
30 | _thread_sys_getpid global name, for use outside libc only | ||
31 | getpid weak alias, for use outside libc only | ||
32 | |||
33 | For syscalls which are cancellation points, such as wait4(), there | ||
34 | are identifiers that do not provide cancellation: | ||
35 | _libc_wait4 hidden alias, for use internal to libc only | ||
36 | _thread_sys_wait4 global name, for use outside libc only | ||
37 | ...and identifiers that do provide cancellation: | ||
38 | wait4 weak alias, for general use | ||
39 | _libc_wait4_cancel hidden name, for use internal to libc only | ||
40 | Inside libc, the bare name ("wait4") binds to the version *with* | ||
41 | cancellation. If it's necessary to use the syscall without doing | ||
42 | cancellation it can be obtained by calling HIDDEN(x) instead of | ||
43 | just x. | ||
44 | |||
45 | Some other calls need to be wrapped for reasons other than cancellation, | ||
46 | such as to provide functionality beyond the underlying syscall (e.g., | ||
47 | ptrace). For these, there are identifiers for the raw call, without | ||
48 | the wrapping: | ||
49 | _libc_ptrace hidden alias, for use internal to libc only | ||
50 | _thread_sys_ptrace global name, for use outside libc only | ||
51 | ...and identifiers that do provide the libc wrapping: | ||
52 | ptrace weak alias, for general use | ||
53 | _libc_ptrace_wrap hidden name, for use internal to libc only | ||
54 | Inside libc, the bare name ("ptrace") binds to the wrapper; if | ||
55 | the raw version is necessary it can be obtained by calling HIDDEN(x) | ||
56 | instead of just x. | ||
57 | |||
58 | For syscalls implemented in ASM, the aliases of the raw syscall stub | ||
59 | are provided by the ASM macros. Of the macros used by sys/Makefile.inc: | ||
60 | RSYSCALL(), PSEUDO(), and PSEUDO_NOERROR() generate all three names | ||
61 | (ala getpid() above), while RSYSCALL_HIDDEN() generates just the | ||
62 | _thread_sys_x and _libc_x names. | ||
63 | |||
64 | |||
65 | |||
66 | By using gcc's "asm label" extension, we can usually avoid having | ||
67 | to type those prefixes in the .h and .c files. However, for those | ||
68 | cases where a non-default binding is necessary we can use these macros | ||
69 | to get the desired identifier: | ||
70 | |||
71 | CANCEL(x) | ||
72 | This expands to the internal, hidden name of a cancellation | ||
73 | wrapper: _libc_x_cancel. ex: CANCEL(fsync)(fd) | ||
74 | |||
75 | WRAP(x) | ||
76 | This expands to the internal, hidden name of a non-cancellation | ||
77 | wrapper: _libc_x_wrap. ex: WRAP(sigprocmask)(set) | ||
78 | |||
79 | |||
80 | In order to actually set up the desired asm labels, we use these in | ||
81 | the internal .h files: | ||
82 | PROTO_NORMAL(x) Symbols used both internally and externally | ||
83 | This makes gcc convert use of x to use _libc_x instead | ||
84 | ex: PROTO_NORMAL(getpid) | ||
85 | |||
86 | PROTO_STD_DEPRECATED(x) Standard C symbols that we don't want to use | ||
87 | This just marks the symbol as deprecated, with no renaming. | ||
88 | ex: PROTO_STD_DEPRECATED(strcpy) | ||
89 | |||
90 | PROTO_DEPRECATED(x) Symbols not in ISO C that we don't want to use | ||
91 | This marks the symbol as both weak and deprecated, with no renaming | ||
92 | ex: PROTO_DEPRECATED(creat) | ||
93 | |||
94 | PROTO_CANCEL(x) Functions that have cancellation wrappers | ||
95 | Like PROTO_NORMAL(x), but also declares _libc_x_cancel | ||
96 | ex: PROTO_CANCEL(wait4) | ||
97 | |||
98 | PROTO_WRAP(x) Functions that have wrappers for other reasons | ||
99 | Like PROTO_NORMAL(x), but also declares _libc_x_wrap. Internal | ||
100 | calls that want the wrapper's processing should invoke WRAP(x)(...) | ||
101 | ex: PROTO_WRAP(sigaction) | ||
102 | |||
103 | |||
104 | Finally, to create the expected aliases, we use these in the .c files | ||
105 | where the definitions are: | ||
106 | DEF_STRONG(x) Symbols reserved to or specified by ISO C | ||
107 | This defines x as a strong alias for _libc_x; this must only | ||
108 | be used for symbols that are reserved by the C standard | ||
109 | (or reserved in the external identifier namespace). | ||
110 | Matches with PROTO_NORMAL() | ||
111 | ex: DEF_STRONG(fopen) | ||
112 | |||
113 | DEF_WEAK(x) Symbols used internally and not in ISO C | ||
114 | This defines x as a weak alias for _libc_x | ||
115 | Matches with PROTO_NORMAL() | ||
116 | ex: DEF_WEAK(lseek) | ||
117 | |||
118 | DEF_CANCEL(x) Symbols that have a cancellation wrapper | ||
119 | This defines x as a weak alias for _libc_x_cancel. | ||
120 | Matches with PROTO_CANCEL() | ||
121 | ex: DEF_CANCEL(read) | ||
122 | |||
123 | DEF_WRAP(x) | ||
124 | This defines x as a weak alias for _libc_x_wrap. | ||
125 | Matches with PROTO_WRAP() | ||
126 | ex: DEF_WRAP(ptrace) | ||
127 | |||
128 | MAKE_CLONE(dst, src) Symbols that are exact clones of other symbols | ||
129 | This declares _libc_dst as being the same type as dst, and makes | ||
130 | _libc_dst a strong, hidden alias for _libc_src. You still need to | ||
131 | DEF_STRONG(dst) or DEF_WEAK(dst) to alias dst itself | ||
132 | ex: MAKE_CLONE(SHA224Pad, SHA256Pad) | ||
133 | |||
diff --git a/src/lib/libc/include/README b/src/lib/libc/include/README deleted file mode 100644 index 89acee491e..0000000000 --- a/src/lib/libc/include/README +++ /dev/null | |||
@@ -1,110 +0,0 @@ | |||
1 | So you want to add an interface to libc... | ||
2 | |||
3 | CASE I: internal symbols | ||
4 | |||
5 | A) used in a single file | ||
6 | Duh: use whatever name you want and make it static | ||
7 | |||
8 | B) used in multiple files | ||
9 | Give it a name in the implementation namespace (leading underbar) | ||
10 | and declare it in a __{BEGIN,END}_HIDDEN_DECLS block in a .h | ||
11 | file inside libc. If it's used in just a single subdir of | ||
12 | libc *and* that subdir has an appropriate .h file in it, then | ||
13 | declare it there. | ||
14 | Example: stdio/local.h. | ||
15 | Otherwise, declare it in one of the hidden/* files. | ||
16 | Example: _mktemp() in hidden/stdio.h | ||
17 | |||
18 | CASE II: external symbols | ||
19 | |||
20 | First of all, add your symbol to Symbols.list. MD symbols go in | ||
21 | arch/*/Symbols.list (shock, I know) | ||
22 | |||
23 | Declare your function in the appropriate header. It almost certainly | ||
24 | should be in a public header installed under /usr/include/. Exceptions | ||
25 | are symbols that are just shared between libc and libpthread/csu/ld.so | ||
26 | which are only declared in libc/include/* or just in each .c file. | ||
27 | |||
28 | A) objects (variables) | ||
29 | That's it, you're done. | ||
30 | |||
31 | |||
32 | B) plain C functions (not syscalls) | ||
33 | 1) functions that are *not* called from inside libc | ||
34 | |||
35 | If this function is specified in the ISO C standard or its | ||
36 | name begins with an underbar, then in the hidden/* version | ||
37 | of the header where you declared the function, add this line: | ||
38 | PROTO_STD_DEPRECATED(your_function_name); | ||
39 | |||
40 | Otherwise, this is *not* a function specified in the ISO C | ||
41 | standard and its name begins with a letter. In the hidden/* | ||
42 | version of the header where you declared the function, add | ||
43 | this line: | ||
44 | PROTO_DEPRECATED(your_function_name); | ||
45 | |||
46 | Note: the "DEPRECATED" suffix is about a detail of | ||
47 | how the macros work and has nothing to do with whether the | ||
48 | function itself is a Good Thing vs deprecated. | ||
49 | |||
50 | 2) functions that are called from inside libc | ||
51 | |||
52 | In the hidden/* version of the header where you declared | ||
53 | the function, add this line: | ||
54 | PROTO_NORMAL(your_function_name); | ||
55 | |||
56 | Then, in the .c file(s) where the function is defined: | ||
57 | - if the function is specified in the ISO C standard or | ||
58 | its name begins with an underbar, add | ||
59 | DEF_STRONG(your_function_name); | ||
60 | |||
61 | - otherwise, add: | ||
62 | DEF_WEAK(your_function_name); | ||
63 | |||
64 | |||
65 | C) syscalls that don't require any wrapping | ||
66 | |||
67 | In the hidden/* version of the header where you declared the | ||
68 | function, add this line: | ||
69 | PROTO_NORMAL(your_function_name); | ||
70 | |||
71 | Generate the stub by adding it to the ASM variable in | ||
72 | libc/sys/Makefile.inc | ||
73 | |||
74 | |||
75 | D) syscalls that require cancellation or similar wrappers that don't | ||
76 | change the function signature | ||
77 | |||
78 | Generate the stub by adding it to the HIDDEN (*not* ASM!) | ||
79 | variable in libc/sys/Makefile.inc | ||
80 | |||
81 | In the hidden/* version of the header where you declared the | ||
82 | function, add this line: | ||
83 | PROTO_WRAP(your_function_name); | ||
84 | |||
85 | The wrapper function should be defined in | ||
86 | libc/sys/w_your_function_name.c | ||
87 | which should define WRAP(your_function_name) and follow it | ||
88 | with DEF_WRAP(your_function_name). Look at libc/sys/w_sigaction.c | ||
89 | for an example. | ||
90 | |||
91 | By default, libc code that calls your_function_name() will get | ||
92 | the real syscall and *not* the wrapper. libc calls that need | ||
93 | to go through the wrapper should invoke WRAP(your_function_name) | ||
94 | |||
95 | |||
96 | E) syscalls that require libc wrappers for other reasons | ||
97 | First of all, make sure this really is the Right Thing. Talk | ||
98 | with kettenis, deraadt, millert, and guenther. | ||
99 | |||
100 | If the actual syscall doesn't have the same calling convention | ||
101 | as the C interface, then maybe it shouldn't be exported at all | ||
102 | and you should just have an ASM stub, like SYS___tfork --> | ||
103 | __tfork_thread() or SYS_break --> brk() and sbrk(). If it | ||
104 | _could_ be called from C, then give the syscall a name different | ||
105 | from the C API. Syscalls that fail this for historical reasons | ||
106 | (e.g., exit == _exit(2)) are generated with PSEUDO/PSEUDO_NOERR | ||
107 | in libc/sys/Makefile.inc, so the ASM stub has a leading underbar. | ||
108 | Go read gen/getlogin.c rev 1.13 for an example of how to do | ||
109 | this, but don't pick this option, really. | ||
110 | |||
diff --git a/src/lib/libc/include/atfork.h b/src/lib/libc/include/atfork.h deleted file mode 100644 index f09de4892a..0000000000 --- a/src/lib/libc/include/atfork.h +++ /dev/null | |||
@@ -1,45 +0,0 @@ | |||
1 | /* $OpenBSD: atfork.h,v 1.2 2015/08/27 04:37:09 guenther Exp $ */ | ||
2 | |||
3 | /* | ||
4 | * Copyright (c) 2008 Kurt Miller <kurt@openbsd.org> | ||
5 | * Copyright (c) 2008 Philip Guenther <guenther@openbsd.org> | ||
6 | * Copyright (c) 2003 Daniel Eischen <deischen@freebsd.org> | ||
7 | * All rights reserved. | ||
8 | * | ||
9 | * Redistribution and use in source and binary forms, with or without | ||
10 | * modification, are permitted provided that the following conditions | ||
11 | * are met: | ||
12 | * 1. Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * 2. Neither the name of the author nor the names of any co-contributors | ||
15 | * may be used to endorse or promote products derived from this software | ||
16 | * without specific prior written permission. | ||
17 | * | ||
18 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||
19 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
20 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
21 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||
22 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
23 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
24 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
25 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
26 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
27 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
28 | * SUCH DAMAGE. | ||
29 | * | ||
30 | * $FreeBSD: /repoman/r/ncvs/src/lib/libc_r/uthread/uthread_atfork.c,v 1.1 2004/12/10 03:36:45 grog Exp $ | ||
31 | */ | ||
32 | |||
33 | #include <sys/queue.h> | ||
34 | |||
35 | struct atfork_fn { | ||
36 | TAILQ_ENTRY(atfork_fn) fn_next; | ||
37 | void (*fn_prepare)(void); | ||
38 | void (*fn_parent)(void); | ||
39 | void (*fn_child)(void); | ||
40 | void *fn_dso; | ||
41 | }; | ||
42 | |||
43 | __BEGIN_HIDDEN_DECLS | ||
44 | extern TAILQ_HEAD(atfork_listhead, atfork_fn) _atfork_list; | ||
45 | __END_HIDDEN_DECLS | ||
diff --git a/src/lib/libc/include/cancel.h b/src/lib/libc/include/cancel.h deleted file mode 100644 index c452bf3d4c..0000000000 --- a/src/lib/libc/include/cancel.h +++ /dev/null | |||
@@ -1,78 +0,0 @@ | |||
1 | /* $OpenBSD: cancel.h,v 1.5 2017/09/05 02:40:54 guenther Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #ifndef _CANCEL_H_ | ||
19 | #define _CANCEL_H_ | ||
20 | |||
21 | #include <tib.h> | ||
22 | #include "thread_private.h" | ||
23 | |||
24 | /* process a cancel request at a cancel point */ | ||
25 | __dead void _thread_canceled(void); | ||
26 | |||
27 | #ifdef __LIBC__ | ||
28 | PROTO_NORMAL(_thread_canceled); | ||
29 | #endif | ||
30 | |||
31 | #if defined(__LIBC__) && !defined(TCB_HAVE_MD_GET) | ||
32 | /* | ||
33 | * Override TIB_GET macro to use the caching callback | ||
34 | */ | ||
35 | #undef TIB_GET | ||
36 | #define TIB_GET() TCB_TO_TIB(_thread_cb.tc_tcb()) | ||
37 | #endif | ||
38 | |||
39 | #define PREP_CANCEL_POINT(tib) \ | ||
40 | int _cantcancel = (tib)->tib_cantcancel | ||
41 | |||
42 | #define ENTER_CANCEL_POINT_INNER(tib, can_cancel, delay) \ | ||
43 | if (_cantcancel == 0) { \ | ||
44 | (tib)->tib_cancel_point = (delay) ? \ | ||
45 | CANCEL_POINT_DELAYED : CANCEL_POINT; \ | ||
46 | if (can_cancel) { \ | ||
47 | __asm volatile("":::"memory"); \ | ||
48 | if (__predict_false((tib)->tib_canceled)) \ | ||
49 | _thread_canceled(); \ | ||
50 | } \ | ||
51 | } | ||
52 | |||
53 | #define LEAVE_CANCEL_POINT_INNER(tib, can_cancel) \ | ||
54 | if (_cantcancel == 0) { \ | ||
55 | (tib)->tib_cancel_point = 0; \ | ||
56 | if (can_cancel) { \ | ||
57 | __asm volatile("":::"memory"); \ | ||
58 | if (__predict_false((tib)->tib_canceled)) \ | ||
59 | _thread_canceled(); \ | ||
60 | } \ | ||
61 | } | ||
62 | |||
63 | /* | ||
64 | * Enter or leave a cancelation point, optionally processing pending | ||
65 | * cancelation requests. Note that ENTER_CANCEL_POINT opens a block | ||
66 | * and LEAVE_CANCEL_POINT must close that same block. | ||
67 | */ | ||
68 | #define ENTER_CANCEL_POINT(can_cancel) \ | ||
69 | { \ | ||
70 | struct tib *_tib = TIB_GET(); \ | ||
71 | PREP_CANCEL_POINT(_tib); \ | ||
72 | ENTER_CANCEL_POINT_INNER(_tib, can_cancel, 0) | ||
73 | |||
74 | #define LEAVE_CANCEL_POINT(can_cancel) \ | ||
75 | LEAVE_CANCEL_POINT_INNER(_tib, can_cancel); \ | ||
76 | } | ||
77 | |||
78 | #endif /* _CANCEL_H_ */ | ||
diff --git a/src/lib/libc/include/ctype_private.h b/src/lib/libc/include/ctype_private.h deleted file mode 100644 index cbe1b20475..0000000000 --- a/src/lib/libc/include/ctype_private.h +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | /* $OpenBSD: ctype_private.h,v 1.2 2015/08/27 04:37:09 guenther Exp $ */ | ||
2 | /* Written by Marc Espie, public domain */ | ||
3 | #define CTYPE_NUM_CHARS 256 | ||
4 | |||
5 | __BEGIN_HIDDEN_DECLS | ||
6 | extern const char _C_ctype_[]; | ||
7 | extern const short _C_toupper_[]; | ||
8 | extern const short _C_tolower_[]; | ||
9 | __END_HIDDEN_DECLS | ||
diff --git a/src/lib/libc/include/localedef.h b/src/lib/libc/include/localedef.h deleted file mode 100644 index 12dd47fffa..0000000000 --- a/src/lib/libc/include/localedef.h +++ /dev/null | |||
@@ -1,106 +0,0 @@ | |||
1 | /* $OpenBSD: localedef.h,v 1.1 2016/05/23 00:05:15 guenther Exp $ */ | ||
2 | /* $NetBSD: localedef.h,v 1.4 1996/04/09 20:55:31 cgd Exp $ */ | ||
3 | |||
4 | /* | ||
5 | * Copyright (c) 1994 Winning Strategies, Inc. | ||
6 | * All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * 1. Redistributions of source code must retain the above copyright | ||
12 | * notice, this list of conditions and the following disclaimer. | ||
13 | * 2. Redistributions in binary form must reproduce the above copyright | ||
14 | * notice, this list of conditions and the following disclaimer in the | ||
15 | * documentation and/or other materials provided with the distribution. | ||
16 | * 3. All advertising materials mentioning features or use of this software | ||
17 | * must display the following acknowledgement: | ||
18 | * This product includes software developed by Winning Strategies, Inc. | ||
19 | * 4. The name of the author may not be used to endorse or promote products | ||
20 | * derived from this software without specific prior written permission. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
24 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
25 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
26 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
27 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
31 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
32 | */ | ||
33 | |||
34 | #ifndef _LOCALEDEF_H_ | ||
35 | #define _LOCALEDEF_H_ | ||
36 | |||
37 | #include <sys/types.h> | ||
38 | |||
39 | typedef struct | ||
40 | { | ||
41 | char *yesexpr; | ||
42 | char *noexpr; | ||
43 | char *yesstr; | ||
44 | char *nostr; | ||
45 | } _MessagesLocale; | ||
46 | |||
47 | |||
48 | typedef struct | ||
49 | { | ||
50 | char *int_curr_symbol; | ||
51 | char *currency_symbol; | ||
52 | char *mon_decimal_point; | ||
53 | char *mon_thousands_sep; | ||
54 | char *mon_grouping; | ||
55 | char *positive_sign; | ||
56 | char *negative_sign; | ||
57 | char int_frac_digits; | ||
58 | char frac_digits; | ||
59 | char p_cs_precedes; | ||
60 | char p_sep_by_space; | ||
61 | char n_cs_precedes; | ||
62 | char n_sep_by_space; | ||
63 | char p_sign_posn; | ||
64 | char n_sign_posn; | ||
65 | char int_p_cs_precedes; | ||
66 | char int_p_sep_by_space; | ||
67 | char int_n_cs_precedes; | ||
68 | char int_n_sep_by_space; | ||
69 | char int_p_sign_posn; | ||
70 | char int_n_sign_posn; | ||
71 | } _MonetaryLocale; | ||
72 | |||
73 | |||
74 | typedef struct | ||
75 | { | ||
76 | const char *decimal_point; | ||
77 | const char *thousands_sep; | ||
78 | const char *grouping; | ||
79 | } _NumericLocale; | ||
80 | |||
81 | |||
82 | typedef struct { | ||
83 | const char *abday[7]; | ||
84 | const char *day[7]; | ||
85 | const char *abmon[12]; | ||
86 | const char *mon[12]; | ||
87 | const char *am_pm[2]; | ||
88 | const char *d_t_fmt; | ||
89 | const char *d_fmt; | ||
90 | const char *t_fmt; | ||
91 | const char *t_fmt_ampm; | ||
92 | } _TimeLocale; | ||
93 | |||
94 | |||
95 | __BEGIN_HIDDEN_DECLS | ||
96 | extern const _MessagesLocale *_CurrentMessagesLocale; | ||
97 | extern const _MessagesLocale _DefaultMessagesLocale; | ||
98 | extern const _MonetaryLocale *_CurrentMonetaryLocale; | ||
99 | extern const _MonetaryLocale _DefaultMonetaryLocale; | ||
100 | extern const _NumericLocale *_CurrentNumericLocale; | ||
101 | extern const _NumericLocale _DefaultNumericLocale; | ||
102 | extern const _TimeLocale *_CurrentTimeLocale; | ||
103 | extern const _TimeLocale _DefaultTimeLocale; | ||
104 | __END_HIDDEN_DECLS | ||
105 | |||
106 | #endif /* !_LOCALEDEF_H_ */ | ||
diff --git a/src/lib/libc/include/mpool.h b/src/lib/libc/include/mpool.h deleted file mode 100644 index 005b006d17..0000000000 --- a/src/lib/libc/include/mpool.h +++ /dev/null | |||
@@ -1,122 +0,0 @@ | |||
1 | /* $OpenBSD: mpool.h,v 1.1 2015/09/09 15:35:24 guenther Exp $ */ | ||
2 | /* $NetBSD: mpool.h,v 1.7 1996/05/03 21:13:41 cgd Exp $ */ | ||
3 | |||
4 | /*- | ||
5 | * Copyright (c) 1991, 1993, 1994 | ||
6 | * The Regents of the University of California. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * 1. Redistributions of source code must retain the above copyright | ||
12 | * notice, this list of conditions and the following disclaimer. | ||
13 | * 2. Redistributions in binary form must reproduce the above copyright | ||
14 | * notice, this list of conditions and the following disclaimer in the | ||
15 | * documentation and/or other materials provided with the distribution. | ||
16 | * 3. Neither the name of the University nor the names of its contributors | ||
17 | * may be used to endorse or promote products derived from this software | ||
18 | * without specific prior written permission. | ||
19 | * | ||
20 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||
21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
22 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
23 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||
24 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
25 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
26 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
28 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
29 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
30 | * SUCH DAMAGE. | ||
31 | * | ||
32 | * @(#)mpool.h 8.4 (Berkeley) 11/2/95 | ||
33 | */ | ||
34 | |||
35 | #ifndef _MPOOL_H_ | ||
36 | #define _MPOOL_H_ | ||
37 | |||
38 | #include <sys/queue.h> | ||
39 | |||
40 | /* | ||
41 | * The memory pool scheme is a simple one. Each in-memory page is referenced | ||
42 | * by a bucket which is threaded in up to two of three ways. All active pages | ||
43 | * are threaded on a hash chain (hashed by page number) and an lru chain. | ||
44 | * Inactive pages are threaded on a free chain. Each reference to a memory | ||
45 | * pool is handed an opaque MPOOL cookie which stores all of this information. | ||
46 | */ | ||
47 | #define HASHSIZE 128 | ||
48 | #define HASHKEY(pgno) ((pgno - 1 + HASHSIZE) % HASHSIZE) | ||
49 | |||
50 | /* The BKT structures are the elements of the queues. */ | ||
51 | typedef struct _bkt { | ||
52 | TAILQ_ENTRY(_bkt) hq; /* hash queue */ | ||
53 | TAILQ_ENTRY(_bkt) q; /* lru queue */ | ||
54 | void *page; /* page */ | ||
55 | pgno_t pgno; /* page number */ | ||
56 | |||
57 | #define MPOOL_DIRTY 0x01 /* page needs to be written */ | ||
58 | #define MPOOL_PINNED 0x02 /* page is pinned into memory */ | ||
59 | #define MPOOL_INUSE 0x04 /* page address is valid */ | ||
60 | u_int8_t flags; /* flags */ | ||
61 | } BKT; | ||
62 | |||
63 | typedef struct MPOOL { | ||
64 | TAILQ_HEAD(_lqh, _bkt) lqh; /* lru queue head */ | ||
65 | /* hash queue array */ | ||
66 | TAILQ_HEAD(_hqh, _bkt) hqh[HASHSIZE]; | ||
67 | pgno_t curcache; /* current number of cached pages */ | ||
68 | pgno_t maxcache; /* max number of cached pages */ | ||
69 | pgno_t npages; /* number of pages in the file */ | ||
70 | unsigned long pagesize; /* file page size */ | ||
71 | int fd; /* file descriptor */ | ||
72 | /* page in conversion routine */ | ||
73 | void (*pgin)(void *, pgno_t, void *); | ||
74 | /* page out conversion routine */ | ||
75 | void (*pgout)(void *, pgno_t, void *); | ||
76 | void *pgcookie; /* cookie for page in/out routines */ | ||
77 | #ifdef STATISTICS | ||
78 | unsigned long cachehit; | ||
79 | unsigned long cachemiss; | ||
80 | unsigned long pagealloc; | ||
81 | unsigned long pageflush; | ||
82 | unsigned long pageget; | ||
83 | unsigned long pagenew; | ||
84 | unsigned long pageput; | ||
85 | unsigned long pageread; | ||
86 | unsigned long pagewrite; | ||
87 | #endif | ||
88 | } MPOOL; | ||
89 | |||
90 | #define MPOOL_IGNOREPIN 0x01 /* Ignore if the page is pinned. */ | ||
91 | #define MPOOL_PAGE_REQUEST 0x01 /* Allocate a new page with a | ||
92 | specific page number. */ | ||
93 | #define MPOOL_PAGE_NEXT 0x02 /* Allocate a new page with the next | ||
94 | page number. */ | ||
95 | |||
96 | __BEGIN_HIDDEN_DECLS | ||
97 | MPOOL *mpool_open(void *, int, pgno_t, pgno_t); | ||
98 | void mpool_filter(MPOOL *, void (*)(void *, pgno_t, void *), | ||
99 | void (*)(void *, pgno_t, void *), void *); | ||
100 | void *mpool_new(MPOOL *, pgno_t *, unsigned int); | ||
101 | void *mpool_get(MPOOL *, pgno_t, unsigned int); | ||
102 | int mpool_delete(MPOOL *, void *); | ||
103 | int mpool_put(MPOOL *, void *, unsigned int); | ||
104 | int mpool_sync(MPOOL *); | ||
105 | int mpool_close(MPOOL *); | ||
106 | |||
107 | PROTO_NORMAL(mpool_open); | ||
108 | PROTO_NORMAL(mpool_filter); | ||
109 | PROTO_NORMAL(mpool_new); | ||
110 | PROTO_NORMAL(mpool_get); | ||
111 | PROTO_NORMAL(mpool_delete); | ||
112 | PROTO_NORMAL(mpool_put); | ||
113 | PROTO_NORMAL(mpool_sync); | ||
114 | PROTO_NORMAL(mpool_close); | ||
115 | |||
116 | #ifdef STATISTICS | ||
117 | void mpool_stat(MPOOL *); | ||
118 | PROTO_NORMAL(mpool_stat); | ||
119 | #endif | ||
120 | __END_HIDDEN_DECLS | ||
121 | |||
122 | #endif | ||
diff --git a/src/lib/libc/include/namespace.h b/src/lib/libc/include/namespace.h deleted file mode 100644 index 8503de47be..0000000000 --- a/src/lib/libc/include/namespace.h +++ /dev/null | |||
@@ -1,98 +0,0 @@ | |||
1 | /* $OpenBSD: namespace.h,v 1.16 2023/10/29 14:26:13 millert Exp $ */ | ||
2 | |||
3 | #ifndef _LIBC_NAMESPACE_H_ | ||
4 | #define _LIBC_NAMESPACE_H_ | ||
5 | |||
6 | /* | ||
7 | * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org> | ||
8 | * | ||
9 | * Permission to use, copy, modify, and distribute this software for any | ||
10 | * purpose with or without fee is hereby granted, provided that the above | ||
11 | * copyright notice and this permission notice appear in all copies. | ||
12 | * | ||
13 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
14 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
15 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
16 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
17 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
18 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
19 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
20 | */ | ||
21 | |||
22 | /* | ||
23 | * ISO C11 or higher is required to build libc. | ||
24 | * This must come _before_ sys/cdefs.h is included. | ||
25 | */ | ||
26 | #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112 | ||
27 | #define _ISOC11_SOURCE 1 | ||
28 | #endif | ||
29 | |||
30 | /* | ||
31 | * For explanations of how to use these, see README | ||
32 | * For explanations of why we use them and how they work, see DETAILS | ||
33 | */ | ||
34 | |||
35 | #include <sys/cdefs.h> /* for __dso_hidden and __{weak,strong}_alias */ | ||
36 | |||
37 | #define __dso_protected __attribute__((__visibility__("protected"))) | ||
38 | |||
39 | #define HIDDEN(x) _libc_##x | ||
40 | #define CANCEL(x) _libc_##x##_cancel | ||
41 | #define WRAP(x) _libc_##x##_wrap | ||
42 | #define HIDDEN_STRING(x) "_libc_" __STRING(x) | ||
43 | #define CANCEL_STRING(x) "_libc_" __STRING(x) "_cancel" | ||
44 | #define WRAP_STRING(x) "_libc_" __STRING(x) "_wrap" | ||
45 | |||
46 | #define PROTO_NORMAL(x) __dso_hidden typeof(x) x asm(HIDDEN_STRING(x)) | ||
47 | #define PROTO_STD_DEPRECATED(x) typeof(x) x __attribute__((deprecated)) | ||
48 | #define PROTO_DEPRECATED(x) typeof(x) x __attribute__((deprecated, weak)) | ||
49 | #define PROTO_CANCEL(x) __dso_hidden typeof(x) HIDDEN(x), \ | ||
50 | x asm(CANCEL_STRING(x)) | ||
51 | #define PROTO_WRAP(x) PROTO_NORMAL(x), WRAP(x) | ||
52 | #define PROTO_PROTECTED(x) __dso_protected typeof(x) x | ||
53 | |||
54 | #define DEF_STRONG(x) __strong_alias(x, HIDDEN(x)) | ||
55 | #define DEF_WEAK(x) __weak_alias(x, HIDDEN(x)) | ||
56 | #define DEF_CANCEL(x) __weak_alias(x, CANCEL(x)) | ||
57 | #define DEF_WRAP(x) __weak_alias(x, WRAP(x)) | ||
58 | #define DEF_SYS(x) __strong_alias(_thread_sys_##x, HIDDEN(x)) | ||
59 | |||
60 | #if !defined(__clang__) && __GNUC__ != 3 | ||
61 | /* our gcc 4.2 handles redirecting builtins via PROTO_NORMAL()'s asm() label */ | ||
62 | #define DEF_BUILTIN(x) DEF_STRONG(x) | ||
63 | #define BUILTIN | ||
64 | #else | ||
65 | /* | ||
66 | * clang and gcc can't redirect builtins via asm() labels, so mark | ||
67 | * them protected instead. | ||
68 | */ | ||
69 | #define DEF_BUILTIN(x) __asm("") | ||
70 | #define BUILTIN __dso_protected | ||
71 | #endif | ||
72 | |||
73 | #define MAKE_CLONE(dst, src) __dso_hidden typeof(dst) HIDDEN(dst) \ | ||
74 | __attribute__((alias (HIDDEN_STRING(src)))) | ||
75 | |||
76 | #define __relro __attribute__((section(".data.rel.ro"))) | ||
77 | |||
78 | |||
79 | /* | ||
80 | * gcc and clang will generate calls to the functions below. | ||
81 | * Declare and redirect them here so we always go | ||
82 | * directly to our hidden aliases. | ||
83 | */ | ||
84 | #include <sys/_types.h> | ||
85 | BUILTIN void *memmove(void *, const void *, __size_t); | ||
86 | BUILTIN void *memcpy(void *__restrict, const void *__restrict, __size_t); | ||
87 | BUILTIN void *memset(void *, int, __size_t); | ||
88 | BUILTIN void __stack_smash_handler(const char [], int __unused); | ||
89 | #if !defined(__clang__) && __GNUC__ != 3 | ||
90 | PROTO_NORMAL(memmove); | ||
91 | PROTO_NORMAL(memcpy); | ||
92 | PROTO_NORMAL(memset); | ||
93 | PROTO_NORMAL(__stack_smash_handler); | ||
94 | #endif | ||
95 | #undef BUILTIN | ||
96 | |||
97 | #endif /* _LIBC_NAMESPACE_H_ */ | ||
98 | |||
diff --git a/src/lib/libc/include/thread_private.h b/src/lib/libc/include/thread_private.h deleted file mode 100644 index 1ec1071161..0000000000 --- a/src/lib/libc/include/thread_private.h +++ /dev/null | |||
@@ -1,427 +0,0 @@ | |||
1 | /* $OpenBSD: thread_private.h,v 1.37 2024/08/18 02:25:51 guenther Exp $ */ | ||
2 | |||
3 | /* PUBLIC DOMAIN: No Rights Reserved. Marco S Hyman <marc@snafu.org> */ | ||
4 | |||
5 | #ifndef _THREAD_PRIVATE_H_ | ||
6 | #define _THREAD_PRIVATE_H_ | ||
7 | |||
8 | extern int __isthreaded; | ||
9 | |||
10 | #define _MALLOC_MUTEXES 32 | ||
11 | void _malloc_init(int); | ||
12 | #ifdef __LIBC__ | ||
13 | PROTO_NORMAL(_malloc_init); | ||
14 | #endif /* __LIBC__ */ | ||
15 | |||
16 | /* | ||
17 | * The callbacks needed by libc to handle the threaded case. | ||
18 | * NOTE: Bump the version when you change the struct contents! | ||
19 | * | ||
20 | * tc_canceled: | ||
21 | * If not NULL, what to do when canceled (otherwise _exit(0)) | ||
22 | * | ||
23 | * tc_flockfile, tc_ftrylockfile, and tc_funlockfile: | ||
24 | * If not NULL, these implement the flockfile() family. | ||
25 | * XXX In theory, you should be able to lock a FILE before | ||
26 | * XXX loading libpthread and have that be a real lock on it, | ||
27 | * XXX but that doesn't work without the libc base version | ||
28 | * XXX tracking the recursion count. | ||
29 | * | ||
30 | * tc_malloc_lock and tc_malloc_unlock: | ||
31 | * tc_atexit_lock and tc_atexit_unlock: | ||
32 | * tc_atfork_lock and tc_atfork_unlock: | ||
33 | * tc_arc4_lock and tc_arc4_unlock: | ||
34 | * The locks used by the malloc, atexit, atfork, and arc4 subsystems. | ||
35 | * These have to be ordered specially in the fork/vfork wrappers | ||
36 | * and may be implemented differently than the general mutexes | ||
37 | * in the callbacks below. | ||
38 | * | ||
39 | * tc_mutex_lock and tc_mutex_unlock: | ||
40 | * Lock and unlock the given mutex. If the given mutex is NULL | ||
41 | * a mutex is allocated and initialized automatically. | ||
42 | * | ||
43 | * tc_mutex_destroy: | ||
44 | * Destroy/deallocate the given mutex. | ||
45 | * | ||
46 | * tc_tag_lock and tc_tag_unlock: | ||
47 | * Lock and unlock the mutex associated with the given tag. | ||
48 | * If the given tag is NULL a tag is allocated and initialized | ||
49 | * automatically. | ||
50 | * | ||
51 | * tc_tag_storage: | ||
52 | * Returns a pointer to per-thread instance of data associated | ||
53 | * with the given tag. If the given tag is NULL a tag is | ||
54 | * allocated and initialized automatically. | ||
55 | * | ||
56 | * tc_fork, tc_vfork: | ||
57 | * If not NULL, they are called instead of the syscall stub, so that | ||
58 | * the thread library can do necessary locking and reinitialization. | ||
59 | * | ||
60 | * tc_thread_release: | ||
61 | * Handles the release of a thread's TIB and struct pthread and the | ||
62 | * notification of other threads...when there are other threads. | ||
63 | * | ||
64 | * tc_thread_key_zero: | ||
65 | * For each thread, zero out the key data associated with the given key. | ||
66 | |||
67 | * If <machine/tcb.h> doesn't define TCB_GET(), then locating the TCB in a | ||
68 | * threaded process requires a syscall (__get_tcb(2)) which is too much | ||
69 | * overhead for single-threaded processes. For those archs, there are two | ||
70 | * additional callbacks, though they are placed first in the struct for | ||
71 | * convenience in ASM: | ||
72 | * | ||
73 | * tc_errnoptr: | ||
74 | * Returns the address of the thread's errno. | ||
75 | * | ||
76 | * tc_tcb: | ||
77 | * Returns the address of the thread's TCB. | ||
78 | */ | ||
79 | |||
80 | struct __sFILE; | ||
81 | struct pthread; | ||
82 | struct thread_callbacks { | ||
83 | int *(*tc_errnoptr)(void); /* MUST BE FIRST */ | ||
84 | void *(*tc_tcb)(void); | ||
85 | __dead void (*tc_canceled)(void); | ||
86 | void (*tc_flockfile)(struct __sFILE *); | ||
87 | int (*tc_ftrylockfile)(struct __sFILE *); | ||
88 | void (*tc_funlockfile)(struct __sFILE *); | ||
89 | void (*tc_malloc_lock)(int); | ||
90 | void (*tc_malloc_unlock)(int); | ||
91 | void (*tc_atexit_lock)(void); | ||
92 | void (*tc_atexit_unlock)(void); | ||
93 | void (*tc_atfork_lock)(void); | ||
94 | void (*tc_atfork_unlock)(void); | ||
95 | void (*tc_arc4_lock)(void); | ||
96 | void (*tc_arc4_unlock)(void); | ||
97 | void (*tc_mutex_lock)(void **); | ||
98 | void (*tc_mutex_unlock)(void **); | ||
99 | void (*tc_mutex_destroy)(void **); | ||
100 | void (*tc_tag_lock)(void **); | ||
101 | void (*tc_tag_unlock)(void **); | ||
102 | void *(*tc_tag_storage)(void **, void *, size_t, void (*)(void *), | ||
103 | void *); | ||
104 | __pid_t (*tc_fork)(void); | ||
105 | __pid_t (*tc_vfork)(void); | ||
106 | void (*tc_thread_release)(struct pthread *); | ||
107 | void (*tc_thread_key_zero)(int); | ||
108 | }; | ||
109 | |||
110 | __BEGIN_PUBLIC_DECLS | ||
111 | /* | ||
112 | * Set the callbacks used by libc | ||
113 | */ | ||
114 | void _thread_set_callbacks(const struct thread_callbacks *_cb, size_t _len); | ||
115 | __END_PUBLIC_DECLS | ||
116 | |||
117 | #ifdef __LIBC__ | ||
118 | __BEGIN_HIDDEN_DECLS | ||
119 | /* the current set */ | ||
120 | extern struct thread_callbacks _thread_cb; | ||
121 | __END_HIDDEN_DECLS | ||
122 | #endif /* __LIBC__ */ | ||
123 | |||
124 | /* | ||
125 | * helper macro to make unique names in the thread namespace | ||
126 | */ | ||
127 | #define __THREAD_NAME(name) __CONCAT(_thread_tagname_,name) | ||
128 | |||
129 | /* | ||
130 | * Macros used in libc to access thread mutex, keys, and per thread storage. | ||
131 | * _THREAD_PRIVATE_KEY and _THREAD_PRIVATE_MUTEX are different macros for | ||
132 | * historical reasons. They do the same thing, define a static variable | ||
133 | * keyed by 'name' that identifies a mutex and a key to identify per thread | ||
134 | * data. | ||
135 | */ | ||
136 | #define _THREAD_PRIVATE_KEY(name) \ | ||
137 | static void *__THREAD_NAME(name) | ||
138 | #define _THREAD_PRIVATE_MUTEX(name) \ | ||
139 | static void *__THREAD_NAME(name) | ||
140 | |||
141 | |||
142 | #ifndef __LIBC__ /* building some sort of reach around */ | ||
143 | |||
144 | #define _THREAD_PRIVATE_MUTEX_LOCK(name) do {} while (0) | ||
145 | #define _THREAD_PRIVATE_MUTEX_UNLOCK(name) do {} while (0) | ||
146 | #define _THREAD_PRIVATE(keyname, storage, error) &(storage) | ||
147 | #define _THREAD_PRIVATE_DT(keyname, storage, dt, error) &(storage) | ||
148 | #define _MUTEX_LOCK(mutex) do {} while (0) | ||
149 | #define _MUTEX_UNLOCK(mutex) do {} while (0) | ||
150 | #define _MUTEX_DESTROY(mutex) do {} while (0) | ||
151 | #define _MALLOC_LOCK(n) do {} while (0) | ||
152 | #define _MALLOC_UNLOCK(n) do {} while (0) | ||
153 | #define _ATEXIT_LOCK() do {} while (0) | ||
154 | #define _ATEXIT_UNLOCK() do {} while (0) | ||
155 | #define _ATFORK_LOCK() do {} while (0) | ||
156 | #define _ATFORK_UNLOCK() do {} while (0) | ||
157 | #define _ARC4_LOCK() do {} while (0) | ||
158 | #define _ARC4_UNLOCK() do {} while (0) | ||
159 | |||
160 | #else /* building libc */ | ||
161 | #define _THREAD_PRIVATE_MUTEX_LOCK(name) \ | ||
162 | do { \ | ||
163 | if (_thread_cb.tc_tag_lock != NULL) \ | ||
164 | _thread_cb.tc_tag_lock(&(__THREAD_NAME(name))); \ | ||
165 | } while (0) | ||
166 | #define _THREAD_PRIVATE_MUTEX_UNLOCK(name) \ | ||
167 | do { \ | ||
168 | if (_thread_cb.tc_tag_unlock != NULL) \ | ||
169 | _thread_cb.tc_tag_unlock(&(__THREAD_NAME(name))); \ | ||
170 | } while (0) | ||
171 | #define _THREAD_PRIVATE(keyname, storage, error) \ | ||
172 | (_thread_cb.tc_tag_storage == NULL ? &(storage) : \ | ||
173 | _thread_cb.tc_tag_storage(&(__THREAD_NAME(keyname)), \ | ||
174 | &(storage), sizeof(storage), NULL, (error))) | ||
175 | |||
176 | #define _THREAD_PRIVATE_DT(keyname, storage, dt, error) \ | ||
177 | (_thread_cb.tc_tag_storage == NULL ? &(storage) : \ | ||
178 | _thread_cb.tc_tag_storage(&(__THREAD_NAME(keyname)), \ | ||
179 | &(storage), sizeof(storage), (dt), (error))) | ||
180 | |||
181 | /* | ||
182 | * Macros used in libc to access mutexes. | ||
183 | */ | ||
184 | #define _MUTEX_LOCK(mutex) \ | ||
185 | do { \ | ||
186 | if (__isthreaded) \ | ||
187 | _thread_cb.tc_mutex_lock(mutex); \ | ||
188 | } while (0) | ||
189 | #define _MUTEX_UNLOCK(mutex) \ | ||
190 | do { \ | ||
191 | if (__isthreaded) \ | ||
192 | _thread_cb.tc_mutex_unlock(mutex); \ | ||
193 | } while (0) | ||
194 | #define _MUTEX_DESTROY(mutex) \ | ||
195 | do { \ | ||
196 | if (__isthreaded) \ | ||
197 | _thread_cb.tc_mutex_destroy(mutex); \ | ||
198 | } while (0) | ||
199 | |||
200 | /* | ||
201 | * malloc lock/unlock prototypes and definitions | ||
202 | */ | ||
203 | #define _MALLOC_LOCK(n) \ | ||
204 | do { \ | ||
205 | if (__isthreaded) \ | ||
206 | _thread_cb.tc_malloc_lock(n); \ | ||
207 | } while (0) | ||
208 | #define _MALLOC_UNLOCK(n) \ | ||
209 | do { \ | ||
210 | if (__isthreaded) \ | ||
211 | _thread_cb.tc_malloc_unlock(n); \ | ||
212 | } while (0) | ||
213 | |||
214 | #define _ATEXIT_LOCK() \ | ||
215 | do { \ | ||
216 | if (__isthreaded) \ | ||
217 | _thread_cb.tc_atexit_lock(); \ | ||
218 | } while (0) | ||
219 | #define _ATEXIT_UNLOCK() \ | ||
220 | do { \ | ||
221 | if (__isthreaded) \ | ||
222 | _thread_cb.tc_atexit_unlock(); \ | ||
223 | } while (0) | ||
224 | |||
225 | #define _ATFORK_LOCK() \ | ||
226 | do { \ | ||
227 | if (__isthreaded) \ | ||
228 | _thread_cb.tc_atfork_lock(); \ | ||
229 | } while (0) | ||
230 | #define _ATFORK_UNLOCK() \ | ||
231 | do { \ | ||
232 | if (__isthreaded) \ | ||
233 | _thread_cb.tc_atfork_unlock(); \ | ||
234 | } while (0) | ||
235 | |||
236 | #define _ARC4_LOCK() \ | ||
237 | do { \ | ||
238 | if (__isthreaded) \ | ||
239 | _thread_cb.tc_arc4_lock(); \ | ||
240 | } while (0) | ||
241 | #define _ARC4_UNLOCK() \ | ||
242 | do { \ | ||
243 | if (__isthreaded) \ | ||
244 | _thread_cb.tc_arc4_unlock(); \ | ||
245 | } while (0) | ||
246 | #endif /* __LIBC__ */ | ||
247 | |||
248 | |||
249 | /* | ||
250 | * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org> | ||
251 | * All Rights Reserved. | ||
252 | * | ||
253 | * Permission to use, copy, modify, and distribute this software for any | ||
254 | * purpose with or without fee is hereby granted, provided that the above | ||
255 | * copyright notice and this permission notice appear in all copies. | ||
256 | * | ||
257 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
258 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
259 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
260 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
261 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
262 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
263 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
264 | */ | ||
265 | /* | ||
266 | * Private data structures that back up the typedefs in pthread.h. | ||
267 | * Since only the thread library cares about their size or arrangement, | ||
268 | * it should be possible to switch libraries without relinking. | ||
269 | * | ||
270 | * Do not reorder _atomic_lock_t and sem_t variables in the structs. | ||
271 | * This is due to alignment requirements of certain arches like hppa. | ||
272 | * The current requirement is 16 bytes. | ||
273 | * | ||
274 | * THE MACHINE DEPENDENT CERROR CODE HAS HARD CODED OFFSETS INTO PTHREAD_T! | ||
275 | */ | ||
276 | |||
277 | #include <sys/queue.h> | ||
278 | #include <pthread.h> | ||
279 | #include <semaphore.h> | ||
280 | #include <machine/spinlock.h> | ||
281 | |||
282 | #define _SPINLOCK_UNLOCKED _ATOMIC_LOCK_UNLOCKED | ||
283 | |||
284 | struct __sem { | ||
285 | _atomic_lock_t lock; | ||
286 | volatile int waitcount; | ||
287 | volatile int value; | ||
288 | int shared; | ||
289 | }; | ||
290 | |||
291 | TAILQ_HEAD(pthread_queue, pthread); | ||
292 | |||
293 | #ifdef FUTEX | ||
294 | |||
295 | struct pthread_mutex { | ||
296 | volatile unsigned int lock; | ||
297 | int type; | ||
298 | pthread_t owner; | ||
299 | int count; | ||
300 | int prioceiling; | ||
301 | }; | ||
302 | |||
303 | struct pthread_cond { | ||
304 | volatile unsigned int seq; | ||
305 | clockid_t clock; | ||
306 | struct pthread_mutex *mutex; | ||
307 | }; | ||
308 | |||
309 | struct pthread_rwlock { | ||
310 | volatile unsigned int value; | ||
311 | }; | ||
312 | |||
313 | #else | ||
314 | |||
315 | struct pthread_mutex { | ||
316 | _atomic_lock_t lock; | ||
317 | struct pthread_queue lockers; | ||
318 | int type; | ||
319 | pthread_t owner; | ||
320 | int count; | ||
321 | int prioceiling; | ||
322 | }; | ||
323 | |||
324 | struct pthread_cond { | ||
325 | _atomic_lock_t lock; | ||
326 | struct pthread_queue waiters; | ||
327 | struct pthread_mutex *mutex; | ||
328 | clockid_t clock; | ||
329 | }; | ||
330 | |||
331 | struct pthread_rwlock { | ||
332 | _atomic_lock_t lock; | ||
333 | pthread_t owner; | ||
334 | struct pthread_queue writers; | ||
335 | int readers; | ||
336 | }; | ||
337 | #endif /* FUTEX */ | ||
338 | |||
339 | struct pthread_mutex_attr { | ||
340 | int ma_type; | ||
341 | int ma_protocol; | ||
342 | int ma_prioceiling; | ||
343 | }; | ||
344 | |||
345 | struct pthread_cond_attr { | ||
346 | clockid_t ca_clock; | ||
347 | }; | ||
348 | |||
349 | struct pthread_attr { | ||
350 | void *stack_addr; | ||
351 | size_t stack_size; | ||
352 | size_t guard_size; | ||
353 | int detach_state; | ||
354 | int contention_scope; | ||
355 | int sched_policy; | ||
356 | struct sched_param sched_param; | ||
357 | int sched_inherit; | ||
358 | }; | ||
359 | |||
360 | struct rthread_storage { | ||
361 | int keyid; | ||
362 | struct rthread_storage *next; | ||
363 | void *data; | ||
364 | }; | ||
365 | |||
366 | struct rthread_cleanup_fn { | ||
367 | void (*fn)(void *); | ||
368 | void *arg; | ||
369 | struct rthread_cleanup_fn *next; | ||
370 | }; | ||
371 | |||
372 | struct tib; | ||
373 | struct stack; | ||
374 | struct pthread { | ||
375 | struct __sem donesem; | ||
376 | unsigned int flags; | ||
377 | _atomic_lock_t flags_lock; | ||
378 | struct tib *tib; | ||
379 | void *retval; | ||
380 | void *(*fn)(void *); | ||
381 | void *arg; | ||
382 | char name[32]; | ||
383 | struct stack *stack; | ||
384 | LIST_ENTRY(pthread) threads; | ||
385 | TAILQ_ENTRY(pthread) waiting; | ||
386 | pthread_cond_t blocking_cond; | ||
387 | struct pthread_attr attr; | ||
388 | struct rthread_storage *local_storage; | ||
389 | struct rthread_cleanup_fn *cleanup_fns; | ||
390 | |||
391 | /* cancel received in a delayed cancel block? */ | ||
392 | int delayed_cancel; | ||
393 | }; | ||
394 | /* flags in pthread->flags */ | ||
395 | #define THREAD_DONE 0x001 | ||
396 | #define THREAD_DETACHED 0x002 | ||
397 | |||
398 | /* flags in tib->tib_thread_flags */ | ||
399 | #define TIB_THREAD_ASYNC_CANCEL 0x001 | ||
400 | #define TIB_THREAD_INITIAL_STACK 0x002 /* has stack from exec */ | ||
401 | |||
402 | #define ENTER_DELAYED_CANCEL_POINT(tib, self) \ | ||
403 | (self)->delayed_cancel = 0; \ | ||
404 | ENTER_CANCEL_POINT_INNER(tib, 1, 1) | ||
405 | |||
406 | /* | ||
407 | * Internal functions exported from libc's thread bits for use by libpthread | ||
408 | */ | ||
409 | void _spinlock(volatile _atomic_lock_t *); | ||
410 | int _spinlocktry(volatile _atomic_lock_t *); | ||
411 | void _spinunlock(volatile _atomic_lock_t *); | ||
412 | |||
413 | void _rthread_debug(int, const char *, ...) | ||
414 | __attribute__((__format__ (printf, 2, 3))); | ||
415 | pid_t _thread_dofork(pid_t (*_sys_fork)(void)); | ||
416 | void _thread_finalize(void); | ||
417 | |||
418 | /* | ||
419 | * Threading syscalls not declared in system headers | ||
420 | */ | ||
421 | __dead void __threxit(pid_t *); | ||
422 | int __thrsleep(const volatile void *, clockid_t, | ||
423 | const struct timespec *, volatile void *, const int *); | ||
424 | int __thrwakeup(const volatile void *, int n); | ||
425 | int __thrsigdivert(sigset_t, siginfo_t *, const struct timespec *); | ||
426 | |||
427 | #endif /* _THREAD_PRIVATE_H_ */ | ||