xref: /netbsd-src/external/bsd/openldap/dist/include/ldap_int_thread.h (revision 5bbd2a12505d72a8177929a37b5cee489d0a1cfd)
1 /*	$NetBSD: ldap_int_thread.h,v 1.1.1.3 2010/12/12 15:21:23 adam Exp $	*/
2 
3 /* ldap_int_thread.h - ldap internal thread wrappers header file */
4 /* OpenLDAP: pkg/ldap/include/ldap_int_thread.h,v 1.20.2.8 2010/04/13 20:22:48 kurt Exp */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 1998-2010 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 in libldap_r.  See libldap_r/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 
29 #ifndef _LDAP_INT_THREAD_H
30 #define _LDAP_INT_THREAD_H
31 
32 #if defined( HAVE_PTHREADS )
33 /**********************************
34  *                                *
35  * definitions for POSIX Threads  *
36  *                                *
37  **********************************/
38 
39 #include <pthread.h>
40 #ifdef HAVE_SCHED_H
41 #include <sched.h>
42 #endif
43 
44 LDAP_BEGIN_DECL
45 
46 typedef pthread_t		ldap_int_thread_t;
47 typedef pthread_mutex_t		ldap_int_thread_mutex_t;
48 typedef pthread_cond_t		ldap_int_thread_cond_t;
49 typedef pthread_key_t		ldap_int_thread_key_t;
50 
51 #define ldap_int_thread_equal(a, b)	pthread_equal((a), (b))
52 
53 #if defined( _POSIX_REENTRANT_FUNCTIONS ) || \
54 	defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \
55 	defined( _POSIX_THREADSAFE_FUNCTIONS )
56 #define HAVE_REENTRANT_FUNCTIONS 1
57 #endif
58 
59 #if defined( HAVE_PTHREAD_GETCONCURRENCY ) || \
60 	defined( HAVE_THR_GETCONCURRENCY )
61 #define LDAP_THREAD_HAVE_GETCONCURRENCY 1
62 #endif
63 
64 #if defined( HAVE_PTHREAD_SETCONCURRENCY ) || \
65 	defined( HAVE_THR_SETCONCURRENCY )
66 #define LDAP_THREAD_HAVE_SETCONCURRENCY 1
67 #endif
68 
69 #if defined( HAVE_PTHREAD_RWLOCK_DESTROY )
70 #define LDAP_THREAD_HAVE_RDWR 1
71 typedef pthread_rwlock_t ldap_int_thread_rdwr_t;
72 #endif
73 
74 LDAP_END_DECL
75 
76 #elif defined ( HAVE_MACH_CTHREADS )
77 /**********************************
78  *                                *
79  * definitions for Mach CThreads  *
80  *                                *
81  **********************************/
82 
83 #if defined( HAVE_MACH_CTHREADS_H )
84 #	include <mach/cthreads.h>
85 #elif defined( HAVE_CTHREADS_H )
86 #	include <cthreads.h>
87 #endif
88 
89 LDAP_BEGIN_DECL
90 
91 typedef cthread_t		ldap_int_thread_t;
92 typedef struct mutex		ldap_int_thread_mutex_t;
93 typedef struct condition	ldap_int_thread_cond_t;
94 typedef cthread_key_t		ldap_int_thread_key_t;
95 
96 LDAP_END_DECL
97 
98 #elif defined( HAVE_GNU_PTH )
99 /***********************************
100  *                                 *
101  * thread definitions for GNU Pth  *
102  *                                 *
103  ***********************************/
104 
105 #define PTH_SYSCALL_SOFT 1
106 #include <pth.h>
107 
108 LDAP_BEGIN_DECL
109 
110 typedef pth_t		ldap_int_thread_t;
111 typedef pth_mutex_t	ldap_int_thread_mutex_t;
112 typedef pth_cond_t	ldap_int_thread_cond_t;
113 typedef pth_key_t	ldap_int_thread_key_t;
114 
115 #if 0
116 #define LDAP_THREAD_HAVE_RDWR 1
117 typedef pth_rwlock_t ldap_int_thread_rdwr_t;
118 #endif
119 
120 LDAP_END_DECL
121 
122 #elif defined( HAVE_THR )
123 /********************************************
124  *                                          *
125  * thread definitions for Solaris LWP (THR) *
126  *                                          *
127  ********************************************/
128 
129 #include <thread.h>
130 #include <synch.h>
131 
132 LDAP_BEGIN_DECL
133 
134 typedef thread_t		ldap_int_thread_t;
135 typedef mutex_t			ldap_int_thread_mutex_t;
136 typedef cond_t			ldap_int_thread_cond_t;
137 typedef thread_key_t	ldap_int_thread_key_t;
138 
139 #define HAVE_REENTRANT_FUNCTIONS 1
140 
141 #ifdef HAVE_THR_GETCONCURRENCY
142 #define LDAP_THREAD_HAVE_GETCONCURRENCY 1
143 #endif
144 #ifdef HAVE_THR_SETCONCURRENCY
145 #define LDAP_THREAD_HAVE_SETCONCURRENCY 1
146 #endif
147 
148 LDAP_END_DECL
149 
150 #elif defined( HAVE_LWP )
151 /*************************************
152  *                                   *
153  * thread definitions for SunOS LWP  *
154  *                                   *
155  *************************************/
156 
157 #include <lwp/lwp.h>
158 #include <lwp/stackdep.h>
159 #define LDAP_THREAD_HAVE_SLEEP 1
160 
161 LDAP_BEGIN_DECL
162 
163 typedef thread_t		ldap_int_thread_t;
164 typedef mon_t			ldap_int_thread_mutex_t;
165 struct ldap_int_thread_lwp_cv {
166 	int		lcv_created;
167 	cv_t		lcv_cv;
168 };
169 typedef struct ldap_int_thread_lwp_cv ldap_int_thread_cond_t;
170 
171 #define HAVE_REENTRANT_FUNCTIONS 1
172 
173 LDAP_END_DECL
174 
175 #elif defined(HAVE_NT_THREADS)
176 /*************************************
177  *                                   *
178  * thread definitions for NT threads *
179  *                                   *
180  *************************************/
181 
182 #include <process.h>
183 #include <windows.h>
184 
185 LDAP_BEGIN_DECL
186 
187 typedef unsigned long	ldap_int_thread_t;
188 typedef HANDLE	ldap_int_thread_mutex_t;
189 typedef HANDLE	ldap_int_thread_cond_t;
190 typedef DWORD	ldap_int_thread_key_t;
191 
192 LDAP_END_DECL
193 
194 #else
195 /***********************************
196  *                                 *
197  * thread definitions for no       *
198  * underlying library support      *
199  *                                 *
200  ***********************************/
201 
202 #ifndef NO_THREADS
203 #define NO_THREADS 1
204 #endif
205 
206 LDAP_BEGIN_DECL
207 
208 typedef int			ldap_int_thread_t;
209 typedef int			ldap_int_thread_mutex_t;
210 typedef int			ldap_int_thread_cond_t;
211 typedef int			ldap_int_thread_key_t;
212 
213 #define LDAP_THREAD_HAVE_TPOOL 1
214 typedef int			ldap_int_thread_pool_t;
215 
216 LDAP_END_DECL
217 
218 #endif /* no threads support */
219 
220 
221 LDAP_BEGIN_DECL
222 
223 #ifndef ldap_int_thread_equal
224 #define ldap_int_thread_equal(a, b)	((a) == (b))
225 #endif
226 
227 #ifndef LDAP_THREAD_HAVE_RDWR
228 typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t;
229 #endif
230 
231 LDAP_F(int) ldap_int_thread_pool_startup ( void );
232 LDAP_F(int) ldap_int_thread_pool_shutdown ( void );
233 
234 #ifndef LDAP_THREAD_HAVE_TPOOL
235 typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t;
236 #endif
237 
238 typedef struct ldap_int_thread_rmutex_s * ldap_int_thread_rmutex_t;
239 LDAP_END_DECL
240 
241 
242 #if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U)
243 #define LDAP_THREAD_DEBUG_WRAP 1
244 #endif
245 
246 #ifdef LDAP_THREAD_DEBUG_WRAP
247 /**************************************
248  *                                    *
249  * definitions for type-wrapped debug *
250  *                                    *
251  **************************************/
252 
253 LDAP_BEGIN_DECL
254 
255 #ifndef LDAP_UINTPTR_T	/* May be configured in CPPFLAGS */
256 #define LDAP_UINTPTR_T	unsigned long
257 #endif
258 
259 typedef enum {
260 	ldap_debug_magic =	-(int) (((unsigned)-1)/19)
261 } ldap_debug_magic_t;
262 
263 typedef enum {
264 	/* Could fill in "locked" etc here later */
265 	ldap_debug_state_inited = (int) (((unsigned)-1)/11),
266 	ldap_debug_state_destroyed
267 } ldap_debug_state_t;
268 
269 typedef struct {
270 	/* Enclosed in magic numbers in the hope of catching overwrites */
271 	ldap_debug_magic_t	magic;	/* bit pattern to recognize usages  */
272 	LDAP_UINTPTR_T		self;	/* ~(LDAP_UINTPTR_T)&(this struct) */
273 	union ldap_debug_mem_u {	/* Dummy memory reference */
274 		unsigned char	*ptr;
275 		LDAP_UINTPTR_T	num;
276 	} mem;
277 	ldap_debug_state_t	state;	/* doubles as another magic number */
278 } ldap_debug_usage_info_t;
279 
280 typedef struct {
281 	ldap_int_thread_mutex_t	wrapped;
282 	ldap_debug_usage_info_t	usage;
283 	ldap_int_thread_t	owner;
284 } ldap_debug_thread_mutex_t;
285 
286 typedef struct {
287 	ldap_int_thread_cond_t	wrapped;
288 	ldap_debug_usage_info_t	usage;
289 } ldap_debug_thread_cond_t;
290 
291 typedef struct {
292 	ldap_int_thread_rdwr_t	wrapped;
293 	ldap_debug_usage_info_t	usage;
294 } ldap_debug_thread_rdwr_t;
295 
296 #ifndef NDEBUG
297 #define	LDAP_INT_THREAD_ASSERT_MUTEX_OWNER(mutex) \
298 	ldap_debug_thread_assert_mutex_owner( \
299 		__FILE__, __LINE__, "owns(" #mutex ")", mutex )
300 LDAP_F(void) ldap_debug_thread_assert_mutex_owner LDAP_P((
301 	LDAP_CONST char *file,
302 	int line,
303 	LDAP_CONST char *msg,
304 	ldap_debug_thread_mutex_t *mutex ));
305 #endif /* NDEBUG */
306 
307 LDAP_END_DECL
308 
309 #endif /* LDAP_THREAD_DEBUG_WRAP */
310 
311 #endif /* _LDAP_INT_THREAD_H */
312