1/*	$NetBSD$	*/
2
3/* ldap_pvt_thread.h - ldap threads header file */
4/* OpenLDAP: pkg/ldap/include/ldap_pvt_thread.h,v 1.51.2.14 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#ifndef _LDAP_PVT_THREAD_H
20#define _LDAP_PVT_THREAD_H /* libldap_r/ldap_thr_debug.h #undefines this */
21
22#include "ldap_cdefs.h"
23#include "ldap_int_thread.h"
24
25LDAP_BEGIN_DECL
26
27#ifndef LDAP_PVT_THREAD_H_DONE
28typedef ldap_int_thread_t			ldap_pvt_thread_t;
29#ifdef LDAP_THREAD_DEBUG_WRAP
30typedef ldap_debug_thread_mutex_t	ldap_pvt_thread_mutex_t;
31typedef ldap_debug_thread_cond_t	ldap_pvt_thread_cond_t;
32typedef ldap_debug_thread_rdwr_t	ldap_pvt_thread_rdwr_t;
33#else
34typedef ldap_int_thread_mutex_t		ldap_pvt_thread_mutex_t;
35typedef ldap_int_thread_cond_t		ldap_pvt_thread_cond_t;
36typedef ldap_int_thread_rdwr_t		ldap_pvt_thread_rdwr_t;
37#endif
38typedef ldap_int_thread_rmutex_t	ldap_pvt_thread_rmutex_t;
39typedef ldap_int_thread_key_t	ldap_pvt_thread_key_t;
40#endif /* !LDAP_PVT_THREAD_H_DONE */
41
42#define ldap_pvt_thread_equal		ldap_int_thread_equal
43
44LDAP_F( int )
45ldap_pvt_thread_initialize LDAP_P(( void ));
46
47LDAP_F( int )
48ldap_pvt_thread_destroy LDAP_P(( void ));
49
50LDAP_F( unsigned int )
51ldap_pvt_thread_sleep LDAP_P(( unsigned int s ));
52
53LDAP_F( int )
54ldap_pvt_thread_get_concurrency LDAP_P(( void ));
55
56LDAP_F( int )
57ldap_pvt_thread_set_concurrency LDAP_P(( int ));
58
59#define LDAP_PVT_THREAD_CREATE_JOINABLE 0
60#define LDAP_PVT_THREAD_CREATE_DETACHED 1
61
62#ifndef LDAP_PVT_THREAD_H_DONE
63#define	LDAP_PVT_THREAD_SET_STACK_SIZE
64/* The size may be explicitly #defined to zero to disable it. */
65#if defined( LDAP_PVT_THREAD_STACK_SIZE ) && LDAP_PVT_THREAD_STACK_SIZE == 0
66#	undef LDAP_PVT_THREAD_SET_STACK_SIZE
67#elif !defined( LDAP_PVT_THREAD_STACK_SIZE )
68	/* LARGE stack. Will be twice as large on 64 bit machine. */
69#	define LDAP_PVT_THREAD_STACK_SIZE ( 1 * 1024 * 1024 * sizeof(void *) )
70#endif
71#endif /* !LDAP_PVT_THREAD_H_DONE */
72
73LDAP_F( int )
74ldap_pvt_thread_create LDAP_P((
75	ldap_pvt_thread_t * thread,
76	int	detach,
77	void *(*start_routine)( void * ),
78	void *arg));
79
80LDAP_F( void )
81ldap_pvt_thread_exit LDAP_P(( void *retval ));
82
83LDAP_F( int )
84ldap_pvt_thread_join LDAP_P(( ldap_pvt_thread_t thread, void **status ));
85
86LDAP_F( int )
87ldap_pvt_thread_kill LDAP_P(( ldap_pvt_thread_t thread, int signo ));
88
89LDAP_F( int )
90ldap_pvt_thread_yield LDAP_P(( void ));
91
92LDAP_F( int )
93ldap_pvt_thread_cond_init LDAP_P(( ldap_pvt_thread_cond_t *cond ));
94
95LDAP_F( int )
96ldap_pvt_thread_cond_destroy LDAP_P(( ldap_pvt_thread_cond_t *cond ));
97
98LDAP_F( int )
99ldap_pvt_thread_cond_signal LDAP_P(( ldap_pvt_thread_cond_t *cond ));
100
101LDAP_F( int )
102ldap_pvt_thread_cond_broadcast LDAP_P(( ldap_pvt_thread_cond_t *cond ));
103
104LDAP_F( int )
105ldap_pvt_thread_cond_wait LDAP_P((
106	ldap_pvt_thread_cond_t *cond,
107	ldap_pvt_thread_mutex_t *mutex ));
108
109LDAP_F( int )
110ldap_pvt_thread_mutex_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
111
112LDAP_F( int )
113ldap_pvt_thread_mutex_destroy LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
114
115LDAP_F( int )
116ldap_pvt_thread_mutex_lock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
117
118LDAP_F( int )
119ldap_pvt_thread_mutex_trylock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
120
121LDAP_F( int )
122ldap_pvt_thread_mutex_unlock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
123
124LDAP_F( int )
125ldap_pvt_thread_rmutex_init LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex ));
126
127LDAP_F( int )
128ldap_pvt_thread_rmutex_destroy LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex ));
129
130LDAP_F( int )
131ldap_pvt_thread_rmutex_lock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex,
132	ldap_pvt_thread_t owner));
133
134LDAP_F( int )
135ldap_pvt_thread_rmutex_trylock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex,
136	ldap_pvt_thread_t owner));
137
138LDAP_F( int )
139ldap_pvt_thread_rmutex_unlock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex,
140	ldap_pvt_thread_t owner));
141
142LDAP_F( ldap_pvt_thread_t )
143ldap_pvt_thread_self LDAP_P(( void ));
144
145#ifdef	LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
146#define	LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
147#else
148#define	LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER(mutex) ((void) 0)
149#endif
150
151LDAP_F( int )
152ldap_pvt_thread_rdwr_init LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
153
154LDAP_F( int )
155ldap_pvt_thread_rdwr_destroy LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
156
157LDAP_F( int )
158ldap_pvt_thread_rdwr_rlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
159
160LDAP_F( int )
161ldap_pvt_thread_rdwr_rtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
162
163LDAP_F( int )
164ldap_pvt_thread_rdwr_runlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
165
166LDAP_F( int )
167ldap_pvt_thread_rdwr_wlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
168
169LDAP_F( int )
170ldap_pvt_thread_rdwr_wtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
171
172LDAP_F( int )
173ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
174
175LDAP_F( int )
176ldap_pvt_thread_key_create LDAP_P((ldap_pvt_thread_key_t *keyp));
177
178LDAP_F( int )
179ldap_pvt_thread_key_destroy LDAP_P((ldap_pvt_thread_key_t key));
180
181LDAP_F( int )
182ldap_pvt_thread_key_setdata LDAP_P((ldap_pvt_thread_key_t key, void *data));
183
184LDAP_F( int )
185ldap_pvt_thread_key_getdata LDAP_P((ldap_pvt_thread_key_t key, void **data));
186
187#ifdef LDAP_DEBUG
188LDAP_F( int )
189ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
190
191LDAP_F( int )
192ldap_pvt_thread_rdwr_writers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
193
194LDAP_F( int )
195ldap_pvt_thread_rdwr_active LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
196#endif /* LDAP_DEBUG */
197
198#define LDAP_PVT_THREAD_EINVAL EINVAL
199#define LDAP_PVT_THREAD_EBUSY EINVAL
200
201#ifndef LDAP_PVT_THREAD_H_DONE
202typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t;
203
204typedef void * (ldap_pvt_thread_start_t) LDAP_P((void *ctx, void *arg));
205typedef void (ldap_pvt_thread_pool_keyfree_t) LDAP_P((void *key, void *data));
206#endif /* !LDAP_PVT_THREAD_H_DONE */
207
208LDAP_F( int )
209ldap_pvt_thread_pool_init LDAP_P((
210	ldap_pvt_thread_pool_t *pool_out,
211	int max_threads,
212	int max_pending ));
213
214LDAP_F( int )
215ldap_pvt_thread_pool_submit LDAP_P((
216	ldap_pvt_thread_pool_t *pool,
217	ldap_pvt_thread_start_t *start,
218	void *arg ));
219
220LDAP_F( int )
221ldap_pvt_thread_pool_retract LDAP_P((
222	ldap_pvt_thread_pool_t *pool,
223	ldap_pvt_thread_start_t *start,
224	void *arg ));
225
226LDAP_F( int )
227ldap_pvt_thread_pool_maxthreads LDAP_P((
228	ldap_pvt_thread_pool_t *pool,
229	int max_threads ));
230
231#ifndef LDAP_PVT_THREAD_H_DONE
232typedef enum {
233	LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN = -1,
234	LDAP_PVT_THREAD_POOL_PARAM_MAX,
235	LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING,
236	LDAP_PVT_THREAD_POOL_PARAM_OPEN,
237	LDAP_PVT_THREAD_POOL_PARAM_STARTING,
238	LDAP_PVT_THREAD_POOL_PARAM_ACTIVE,
239	LDAP_PVT_THREAD_POOL_PARAM_PAUSING,
240	LDAP_PVT_THREAD_POOL_PARAM_PENDING,
241	LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD,
242	LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX,
243	LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX,
244	LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX,
245	LDAP_PVT_THREAD_POOL_PARAM_STATE
246} ldap_pvt_thread_pool_param_t;
247#endif /* !LDAP_PVT_THREAD_H_DONE */
248
249LDAP_F( int )
250ldap_pvt_thread_pool_query LDAP_P((
251	ldap_pvt_thread_pool_t *pool,
252	ldap_pvt_thread_pool_param_t param, void *value ));
253
254LDAP_F( int )
255ldap_pvt_thread_pool_pausing LDAP_P((
256	ldap_pvt_thread_pool_t *pool ));
257
258LDAP_F( int )
259ldap_pvt_thread_pool_backload LDAP_P((
260	ldap_pvt_thread_pool_t *pool ));
261
262LDAP_F( int )
263ldap_pvt_thread_pool_pausecheck LDAP_P((
264	ldap_pvt_thread_pool_t *pool ));
265
266LDAP_F( int )
267ldap_pvt_thread_pool_pause LDAP_P((
268	ldap_pvt_thread_pool_t *pool ));
269
270LDAP_F( int )
271ldap_pvt_thread_pool_resume LDAP_P((
272	ldap_pvt_thread_pool_t *pool ));
273
274LDAP_F( int )
275ldap_pvt_thread_pool_destroy LDAP_P((
276	ldap_pvt_thread_pool_t *pool,
277	int run_pending ));
278
279LDAP_F( int )
280ldap_pvt_thread_pool_getkey LDAP_P((
281	void *ctx,
282	void *key,
283	void **data,
284	ldap_pvt_thread_pool_keyfree_t **kfree ));
285
286LDAP_F( int )
287ldap_pvt_thread_pool_setkey LDAP_P((
288	void *ctx,
289	void *key,
290	void *data,
291	ldap_pvt_thread_pool_keyfree_t *kfree,
292	void **olddatap,
293	ldap_pvt_thread_pool_keyfree_t **oldkfreep ));
294
295LDAP_F( void )
296ldap_pvt_thread_pool_purgekey LDAP_P(( void *key ));
297
298LDAP_F( void *)
299ldap_pvt_thread_pool_context LDAP_P(( void ));
300
301LDAP_F( void )
302ldap_pvt_thread_pool_context_reset LDAP_P(( void *key ));
303
304LDAP_F( ldap_pvt_thread_t )
305ldap_pvt_thread_pool_tid LDAP_P(( void *ctx ));
306
307LDAP_END_DECL
308
309#define LDAP_PVT_THREAD_H_DONE
310#endif /* _LDAP_PVT_THREAD_H */
311