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