1 /* ldap_thr_debug.h - preprocessor magic for LDAP_THREAD_DEBUG */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 2005-2021 The OpenLDAP Foundation.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted only as authorized by the OpenLDAP
10  * Public License.
11  *
12  * A copy of this license is available in the file LICENSE in the
13  * top-level directory of the distribution or, alternatively, at
14  * <http://www.OpenLDAP.org/license.html>.
15  */
16 
17 #ifdef LDAP_THREAD_DEBUG
18 
19 /*
20  * libldap .c files should include this file after ldap_pvt_thread.h,
21  * with the appropriate LDAP_THREAD*_IMPLEMENTATION macro(s) defined.
22  */
23 
24 #ifndef _LDAP_PVT_THREAD_H
25 #error "ldap_pvt_thread.h" must be included before "ldap_thr_debug.h"
26 #endif
27 
28 /*
29  * Support for thr_debug.c:
30  *
31  * thr_debug.c defines ldap_pvt_thread_* as wrappers around the real
32  * ldap_pvt_thread_* implementation, which this file renames to
33  * ldap_int_thread_*.
34  *
35  * Implementation:
36  *
37  * This file re#defines selected ldap_pvt_thread_* names to
38  * ldap_int_thread_*, which will be used from wrappers in thr_debug.c.
39  * Two ldap_int_*() calls are redirected to call ldap_debug_*(): These
40  * are wrappers around the originals, whose definitions are not renamed.
41  * This file then #includes ldap_pvt_thread.h to declare the renamed
42  * functions/types.  If #included from thr_debug.c it finally #undefines
43  * the macros again.
44  *
45  * include/ldap_pvt_thread.h declares the typedefs ldap_pvt_thread*_t as
46  * either wrapper types ldap_debug_thread*_t or their usual definitions
47  * ldap_int_thread*_t, depending on the LDAP_THREAD_DEBUG_WRAP option.
48  * When defining the underlying implementation, this file then redirects
49  * the type names back to the original ldap_int_thread*_t types.
50  * include/ldap_<int,pvt>_thread.h also do some thr_debug magic.
51  *
52  * So,
53  * libldap/<not thr_debug.c> thus define ldap_int_thread_*() instead
54  * of ldap_pvt_thread_*().
55  * thr_debug.c defines the ldap_pvt_*() and ldap_debug_*() functions.
56  * In thread.c, ldap_pvt_thread_<initialize/destroy>() will call
57  * ldap_debug_thread_*() instead of ldap_int_thread_*().
58  * In tpool.c, ldap_int_thread_pool_shutdown() has explicit thr_debug.c
59  * support which treats ldap_pvt_thread_pool_destroy() the same way.
60  */
61 
62 #ifndef LDAP_THREAD_IMPLEMENTATION		/* for first part of threads.c */
63 #define	ldap_int_thread_initialize		ldap_debug_thread_initialize
64 #define	ldap_int_thread_destroy			ldap_debug_thread_destroy
65 #else /* LDAP_THREAD_IMPLEMENTATION 	-- for thr_*.c and end of threads.c */
66 #undef	ldap_int_thread_initialize
67 #undef	ldap_int_thread_destroy
68 #ifdef LDAP_THREAD_DEBUG_WRAP			/* see ldap_pvt_thread.h */
69 #define	ldap_pvt_thread_mutex_t			ldap_int_thread_mutex_t
70 #define	ldap_pvt_thread_cond_t			ldap_int_thread_cond_t
71 #endif
72 #define	ldap_pvt_thread_sleep			ldap_int_thread_sleep
73 #define	ldap_pvt_thread_get_concurrency	ldap_int_thread_get_concurrency
74 #define	ldap_pvt_thread_set_concurrency	ldap_int_thread_set_concurrency
75 #define	ldap_pvt_thread_create			ldap_int_thread_create
76 #define	ldap_pvt_thread_exit			ldap_int_thread_exit
77 #define	ldap_pvt_thread_join			ldap_int_thread_join
78 #define	ldap_pvt_thread_kill			ldap_int_thread_kill
79 #define	ldap_pvt_thread_yield			ldap_int_thread_yield
80 #define	ldap_pvt_thread_cond_init		ldap_int_thread_cond_init
81 #define	ldap_pvt_thread_cond_destroy	ldap_int_thread_cond_destroy
82 #define	ldap_pvt_thread_cond_signal		ldap_int_thread_cond_signal
83 #define	ldap_pvt_thread_cond_broadcast	ldap_int_thread_cond_broadcast
84 #define	ldap_pvt_thread_cond_wait		ldap_int_thread_cond_wait
85 #define	ldap_pvt_thread_mutex_init		ldap_int_thread_mutex_init
86 #define	ldap_pvt_thread_mutex_recursive_init		ldap_int_thread_mutex_recursive_init
87 #define	ldap_pvt_thread_mutex_destroy	ldap_int_thread_mutex_destroy
88 #define	ldap_pvt_thread_mutex_lock		ldap_int_thread_mutex_lock
89 #define	ldap_pvt_thread_mutex_trylock	ldap_int_thread_mutex_trylock
90 #define	ldap_pvt_thread_mutex_unlock	ldap_int_thread_mutex_unlock
91 #define	ldap_pvt_thread_self			ldap_int_thread_self
92 #endif /* LDAP_THREAD_IMPLEMENTATION */
93 
94 #ifdef LDAP_THREAD_RDWR_IMPLEMENTATION	/* rdwr.c, thr_debug.c */
95 #ifdef LDAP_THREAD_DEBUG_WRAP			/* see ldap_pvt_thread.h */
96 #define	ldap_pvt_thread_rdwr_t			ldap_int_thread_rdwr_t
97 #endif
98 #define	ldap_pvt_thread_rdwr_init		ldap_int_thread_rdwr_init
99 #define	ldap_pvt_thread_rdwr_destroy	ldap_int_thread_rdwr_destroy
100 #define	ldap_pvt_thread_rdwr_rlock		ldap_int_thread_rdwr_rlock
101 #define	ldap_pvt_thread_rdwr_rtrylock	ldap_int_thread_rdwr_rtrylock
102 #define	ldap_pvt_thread_rdwr_runlock	ldap_int_thread_rdwr_runlock
103 #define	ldap_pvt_thread_rdwr_wlock		ldap_int_thread_rdwr_wlock
104 #define	ldap_pvt_thread_rdwr_wtrylock	ldap_int_thread_rdwr_wtrylock
105 #define	ldap_pvt_thread_rdwr_wunlock	ldap_int_thread_rdwr_wunlock
106 #define	ldap_pvt_thread_rdwr_readers	ldap_int_thread_rdwr_readers
107 #define	ldap_pvt_thread_rdwr_writers	ldap_int_thread_rdwr_writers
108 #define	ldap_pvt_thread_rdwr_active		ldap_int_thread_rdwr_active
109 #endif /* LDAP_THREAD_RDWR_IMPLEMENTATION */
110 
111 #ifdef LDAP_THREAD_POOL_IMPLEMENTATION	/* tpool.c, thr_debug.c */
112 #ifdef LDAP_THREAD_DEBUG_WRAP			/* see ldap_pvt_thread.h */
113 #define	ldap_pvt_thread_pool_t			ldap_int_thread_pool_t
114 #endif
115 #define	ldap_pvt_thread_pool_init		ldap_int_thread_pool_init
116 #define	ldap_pvt_thread_pool_submit		ldap_int_thread_pool_submit
117 #define	ldap_pvt_thread_pool_maxthreads	ldap_int_thread_pool_maxthreads
118 #define	ldap_pvt_thread_pool_backload	ldap_int_thread_pool_backload
119 #define	ldap_pvt_thread_pool_pause		ldap_int_thread_pool_pause
120 #define	ldap_pvt_thread_pool_resume		ldap_int_thread_pool_resume
121 #define	ldap_pvt_thread_pool_destroy	ldap_int_thread_pool_destroy
122 #define	ldap_pvt_thread_pool_close	ldap_int_thread_pool_close
123 #define	ldap_pvt_thread_pool_free	ldap_int_thread_pool_free
124 #define	ldap_pvt_thread_pool_getkey		ldap_int_thread_pool_getkey
125 #define	ldap_pvt_thread_pool_setkey	ldap_int_thread_pool_setkey
126 #define	ldap_pvt_thread_pool_purgekey	ldap_int_thread_pool_purgekey
127 #define	ldap_pvt_thread_pool_context	ldap_int_thread_pool_context
128 #define	ldap_pvt_thread_pool_context_reset ldap_int_thread_pool_context_reset
129 #endif /* LDAP_THREAD_POOL_IMPLEMENTATION */
130 
131 #undef _LDAP_PVT_THREAD_H
132 #include "ldap_pvt_thread.h"
133 
134 #ifdef LDAP_THREAD_POOL_IMPLEMENTATION	/* tpool.c */
135 /*
136  * tpool.c:ldap_int_thread_pool_shutdown() needs this.  Could not
137  * use it for ldap_pvt_thread.h above because of its use of LDAP_P().
138  */
139 #undef	ldap_pvt_thread_pool_destroy
140 #define	ldap_pvt_thread_pool_destroy(p,r) ldap_int_thread_pool_destroy(p,r)
141 #endif
142 
143 #ifdef LDAP_THREAD_DEBUG_IMPLEMENTATION	/* thr_debug.c */
144 #undef	ldap_pvt_thread_mutex_t
145 #undef	ldap_pvt_thread_cond_t
146 #undef	ldap_pvt_thread_sleep
147 #undef	ldap_pvt_thread_get_concurrency
148 #undef	ldap_pvt_thread_set_concurrency
149 #undef	ldap_pvt_thread_create
150 #undef	ldap_pvt_thread_exit
151 #undef	ldap_pvt_thread_join
152 #undef	ldap_pvt_thread_kill
153 #undef	ldap_pvt_thread_yield
154 #undef	ldap_pvt_thread_cond_init
155 #undef	ldap_pvt_thread_cond_destroy
156 #undef	ldap_pvt_thread_cond_signal
157 #undef	ldap_pvt_thread_cond_broadcast
158 #undef	ldap_pvt_thread_cond_wait
159 #undef	ldap_pvt_thread_mutex_init
160 #undef	ldap_pvt_thread_mutex_recursive_init
161 #undef	ldap_pvt_thread_mutex_destroy
162 #undef	ldap_pvt_thread_mutex_lock
163 #undef	ldap_pvt_thread_mutex_trylock
164 #undef	ldap_pvt_thread_mutex_unlock
165 #undef	ldap_pvt_thread_self
166 /* LDAP_THREAD_RDWR_IMPLEMENTATION: */
167 #undef	ldap_pvt_thread_rdwr_t
168 #undef	ldap_pvt_thread_rdwr_init
169 #undef	ldap_pvt_thread_rdwr_destroy
170 #undef	ldap_pvt_thread_rdwr_rlock
171 #undef	ldap_pvt_thread_rdwr_rtrylock
172 #undef	ldap_pvt_thread_rdwr_runlock
173 #undef	ldap_pvt_thread_rdwr_wlock
174 #undef	ldap_pvt_thread_rdwr_wtrylock
175 #undef	ldap_pvt_thread_rdwr_wunlock
176 #undef	ldap_pvt_thread_rdwr_readers
177 #undef	ldap_pvt_thread_rdwr_writers
178 #undef	ldap_pvt_thread_rdwr_active
179 /* LDAP_THREAD_POOL_IMPLEMENTATION: */
180 #undef	ldap_pvt_thread_pool_t
181 #undef	ldap_pvt_thread_pool_init
182 #undef	ldap_pvt_thread_pool_submit
183 #undef	ldap_pvt_thread_pool_maxthreads
184 #undef	ldap_pvt_thread_pool_backload
185 #undef	ldap_pvt_thread_pool_pause
186 #undef	ldap_pvt_thread_pool_resume
187 #undef	ldap_pvt_thread_pool_destroy
188 #undef	ldap_pvt_thread_pool_close
189 #undef	ldap_pvt_thread_pool_free
190 #undef	ldap_pvt_thread_pool_getkey
191 #undef	ldap_pvt_thread_pool_setkey
192 #undef	ldap_pvt_thread_pool_purgekey
193 #undef	ldap_pvt_thread_pool_context
194 #undef	ldap_pvt_thread_pool_context_reset
195 #endif /* LDAP_THREAD_DEBUG_IMPLEMENTATION */
196 
197 #endif /* LDAP_THREAD_DEBUG */
198