1 /*	$NetBSD: ldap_int_thread.h,v 1.3 2021/08/14 16:14:55 christos Exp $	*/
2 
3 /* ldap_int_thread.h - ldap internal thread wrappers header file */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 1998-2021 The OpenLDAP Foundation.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted only as authorized by the OpenLDAP
12  * Public License.
13  *
14  * A copy of this license is available in file LICENSE in the
15  * top-level directory of the distribution or, alternatively, at
16  * <http://www.OpenLDAP.org/license.html>.
17  */
18 
19 
20 LDAP_BEGIN_DECL
21 
22 /* Can be done twice.  See libldap/ldap_thr_debug.h. */
23 LDAP_F(int) ldap_int_thread_initialize LDAP_P(( void ));
24 LDAP_F(int) ldap_int_thread_destroy    LDAP_P(( void ));
25 
26 LDAP_END_DECL
27 
28 #ifndef _LDAP_INT_THREAD_H
29 #define _LDAP_INT_THREAD_H
30 
31 #if defined( HAVE_PTHREADS )
32 /**********************************
33  *                                *
34  * definitions for POSIX Threads  *
35  *                                *
36  **********************************/
37 
38 #include <pthread.h>
39 #ifdef HAVE_SCHED_H
40 #include <sched.h>
41 #endif
42 
43 LDAP_BEGIN_DECL
44 
45 typedef pthread_t		ldap_int_thread_t;
46 typedef pthread_mutex_t		ldap_int_thread_mutex_t;
47 typedef pthread_cond_t		ldap_int_thread_cond_t;
48 typedef pthread_key_t		ldap_int_thread_key_t;
49 
50 #define ldap_int_thread_equal(a, b)	pthread_equal((a), (b))
51 
52 #if defined( _POSIX_REENTRANT_FUNCTIONS ) || \
53 	defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \
54 	defined( _POSIX_THREADSAFE_FUNCTIONS )
55 #define HAVE_REENTRANT_FUNCTIONS 1
56 #endif
57 
58 #if defined( HAVE_PTHREAD_GETCONCURRENCY ) || \
59 	defined( HAVE_THR_GETCONCURRENCY )
60 #define LDAP_THREAD_HAVE_GETCONCURRENCY 1
61 #endif
62 
63 #if defined( HAVE_PTHREAD_SETCONCURRENCY ) || \
64 	defined( HAVE_THR_SETCONCURRENCY )
65 #define LDAP_THREAD_HAVE_SETCONCURRENCY 1
66 #endif
67 
68 #if defined( HAVE_PTHREAD_RWLOCK_DESTROY )
69 #define LDAP_THREAD_HAVE_RDWR 1
70 typedef pthread_rwlock_t ldap_int_thread_rdwr_t;
71 #endif
72 
73 #ifndef LDAP_INT_MUTEX_NULL
74 #define LDAP_INT_MUTEX_NULL	PTHREAD_MUTEX_INITIALIZER
75 #define LDAP_INT_MUTEX_FIRSTCREATE(m)	((void) 0)
76 #endif
77 
78 LDAP_END_DECL
79 
80 #elif defined( HAVE_GNU_PTH )
81 /***********************************
82  *                                 *
83  * thread definitions for GNU Pth  *
84  *                                 *
85  ***********************************/
86 
87 #define PTH_SYSCALL_SOFT 1
88 #include <pth.h>
89 
90 LDAP_BEGIN_DECL
91 
92 typedef pth_t		ldap_int_thread_t;
93 typedef pth_mutex_t	ldap_int_thread_mutex_t;
94 typedef pth_cond_t	ldap_int_thread_cond_t;
95 typedef pth_key_t	ldap_int_thread_key_t;
96 
97 #if 0
98 #define LDAP_THREAD_HAVE_RDWR 1
99 typedef pth_rwlock_t ldap_int_thread_rdwr_t;
100 #endif
101 
102 #ifndef LDAP_INT_MUTEX_NULL
103 #define LDAP_INT_MUTEX_NULL	PTH_MUTEX_INIT
104 #define LDAP_INT_MUTEX_FIRSTCREATE(m)	((void) 0)
105 #endif
106 
107 LDAP_END_DECL
108 
109 #elif defined( HAVE_THR )
110 /********************************************
111  *                                          *
112  * thread definitions for Solaris LWP (THR) *
113  *                                          *
114  ********************************************/
115 
116 #include <thread.h>
117 #include <synch.h>
118 
119 LDAP_BEGIN_DECL
120 
121 typedef thread_t		ldap_int_thread_t;
122 typedef mutex_t			ldap_int_thread_mutex_t;
123 typedef cond_t			ldap_int_thread_cond_t;
124 typedef thread_key_t	ldap_int_thread_key_t;
125 
126 #define HAVE_REENTRANT_FUNCTIONS 1
127 
128 #ifdef HAVE_THR_GETCONCURRENCY
129 #define LDAP_THREAD_HAVE_GETCONCURRENCY 1
130 #endif
131 #ifdef HAVE_THR_SETCONCURRENCY
132 #define LDAP_THREAD_HAVE_SETCONCURRENCY 1
133 #endif
134 
135 #ifndef LDAP_INT_MUTEX_NULL
136 #define LDAP_INT_MUTEX_NULL	DEFAULTMUTEX
137 #define LDAP_INT_MUTEX_FIRSTCREATE(m)	((void) 0)
138 #endif
139 
140 #elif defined(HAVE_NT_THREADS)
141 /*************************************
142  *                                   *
143  * thread definitions for NT threads *
144  *                                   *
145  *************************************/
146 
147 #include <process.h>
148 #include <windows.h>
149 
150 LDAP_BEGIN_DECL
151 
152 typedef unsigned long	ldap_int_thread_t;
153 typedef HANDLE	ldap_int_thread_mutex_t;
154 typedef HANDLE	ldap_int_thread_cond_t;
155 typedef DWORD	ldap_int_thread_key_t;
156 
157 LDAP_F( int )
158 ldap_int_mutex_firstcreate LDAP_P(( ldap_int_thread_mutex_t *mutex ));
159 
160 #ifndef LDAP_INT_MUTEX_NULL
161 #define LDAP_INT_MUTEX_NULL		((HANDLE)0)
162 #define LDAP_INT_MUTEX_FIRSTCREATE(m) \
163 		ldap_int_mutex_firstcreate(&(m))
164 #endif
165 
166 LDAP_END_DECL
167 
168 #else
169 /***********************************
170  *                                 *
171  * thread definitions for no       *
172  * underlying library support      *
173  *                                 *
174  ***********************************/
175 
176 #ifndef NO_THREADS
177 #define NO_THREADS 1
178 #endif
179 
180 LDAP_BEGIN_DECL
181 
182 typedef int			ldap_int_thread_t;
183 typedef int			ldap_int_thread_mutex_t;
184 typedef int			ldap_int_thread_cond_t;
185 typedef int			ldap_int_thread_key_t;
186 
187 #define LDAP_THREAD_HAVE_TPOOL 1
188 typedef int			ldap_int_thread_pool_t;
189 
190 #ifndef LDAP_INT_MUTEX_NULL
191 #define LDAP_INT_MUTEX_NULL				0
192 #define LDAP_INT_MUTEX_FIRSTCREATE(m)	((void) 0)
193 #endif
194 
195 LDAP_END_DECL
196 
197 #endif /* no threads support */
198 
199 
200 LDAP_BEGIN_DECL
201 
202 #ifndef ldap_int_thread_equal
203 #define ldap_int_thread_equal(a, b)	((a) == (b))
204 #endif
205 
206 #ifndef LDAP_THREAD_HAVE_RDWR
207 typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t;
208 #endif
209 
210 LDAP_F(int) ldap_int_thread_pool_startup ( void );
211 LDAP_F(int) ldap_int_thread_pool_shutdown ( void );
212 
213 #ifndef LDAP_THREAD_HAVE_TPOOL
214 typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t;
215 #endif
216 LDAP_END_DECL
217 
218 
219 #if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U)
220 #define LDAP_THREAD_DEBUG_WRAP 1
221 #endif
222 
223 #ifdef LDAP_THREAD_DEBUG_WRAP
224 /**************************************
225  *                                    *
226  * definitions for type-wrapped debug *
227  *                                    *
228  **************************************/
229 
230 LDAP_BEGIN_DECL
231 
232 #ifndef LDAP_UINTPTR_T	/* May be configured in CPPFLAGS */
233 #define LDAP_UINTPTR_T	unsigned long
234 #endif
235 
236 typedef enum {
237 	ldap_debug_magic =	-(int) (((unsigned)-1)/19)
238 } ldap_debug_magic_t;
239 
240 typedef enum {
241 	/* Could fill in "locked" etc here later */
242 	ldap_debug_state_inited = (int) (((unsigned)-1)/11),
243 	ldap_debug_state_destroyed
244 } ldap_debug_state_t;
245 
246 typedef struct {
247 	/* Enclosed in magic numbers in the hope of catching overwrites */
248 	ldap_debug_magic_t	magic;	/* bit pattern to recognize usages  */
249 	LDAP_UINTPTR_T		self;	/* ~(LDAP_UINTPTR_T)&(this struct) */
250 	union ldap_debug_mem_u {	/* Dummy memory reference */
251 		unsigned char	*ptr;
252 		LDAP_UINTPTR_T	num;
253 	} mem;
254 	ldap_debug_state_t	state;	/* doubles as another magic number */
255 } ldap_debug_usage_info_t;
256 
257 typedef struct {
258 	ldap_int_thread_mutex_t	wrapped;
259 	ldap_debug_usage_info_t	usage;
260 	ldap_int_thread_t	owner;
261 } ldap_debug_thread_mutex_t;
262 
263 #define	LDAP_DEBUG_MUTEX_NULL	{LDAP_INT_MUTEX_NULL, {0,0,{0},0} /*,owner*/}
264 #define	LDAP_DEBUG_MUTEX_FIRSTCREATE(m) \
265 	((void) ((m).usage.state || ldap_pvt_thread_mutex_init(&(m))))
266 
267 typedef struct {
268 	ldap_int_thread_cond_t	wrapped;
269 	ldap_debug_usage_info_t	usage;
270 } ldap_debug_thread_cond_t;
271 
272 typedef struct {
273 	ldap_int_thread_rdwr_t	wrapped;
274 	ldap_debug_usage_info_t	usage;
275 } ldap_debug_thread_rdwr_t;
276 
277 #ifndef NDEBUG
278 #define	LDAP_INT_THREAD_ASSERT_MUTEX_OWNER(mutex) \
279 	ldap_debug_thread_assert_mutex_owner( \
280 		__FILE__, __LINE__, "owns(" #mutex ")", mutex )
281 LDAP_F(void) ldap_debug_thread_assert_mutex_owner LDAP_P((
282 	LDAP_CONST char *file,
283 	int line,
284 	LDAP_CONST char *msg,
285 	ldap_debug_thread_mutex_t *mutex ));
286 #endif /* NDEBUG */
287 
288 LDAP_END_DECL
289 
290 #endif /* LDAP_THREAD_DEBUG_WRAP */
291 
292 #endif /* _LDAP_INT_THREAD_H */
293