xref: /netbsd-src/external/bsd/openldap/dist/include/ldap_pvt_thread.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1*549b59edSchristos /*	$NetBSD: ldap_pvt_thread.h,v 1.3 2021/08/14 16:14:55 christos Exp $	*/
24e6df137Slukem 
32de962bdSlukem /* ldap_pvt_thread.h - ldap threads header file */
4d11b170bStron /* $OpenLDAP$ */
52de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
62de962bdSlukem  *
7*549b59edSchristos  * Copyright 1998-2021 The OpenLDAP Foundation.
82de962bdSlukem  * All rights reserved.
92de962bdSlukem  *
102de962bdSlukem  * Redistribution and use in source and binary forms, with or without
112de962bdSlukem  * modification, are permitted only as authorized by the OpenLDAP
122de962bdSlukem  * Public License.
132de962bdSlukem  *
142de962bdSlukem  * A copy of this license is available in file LICENSE in the
152de962bdSlukem  * top-level directory of the distribution or, alternatively, at
162de962bdSlukem  * <http://www.OpenLDAP.org/license.html>.
172de962bdSlukem  */
182de962bdSlukem 
192de962bdSlukem #ifndef _LDAP_PVT_THREAD_H
20*549b59edSchristos #define _LDAP_PVT_THREAD_H /* libldap/ldap_thr_debug.h #undefines this */
212de962bdSlukem 
222de962bdSlukem #include "ldap_cdefs.h"
232de962bdSlukem #include "ldap_int_thread.h"
242de962bdSlukem 
252de962bdSlukem LDAP_BEGIN_DECL
262de962bdSlukem 
272de962bdSlukem #ifndef LDAP_PVT_THREAD_H_DONE
282de962bdSlukem typedef ldap_int_thread_t			ldap_pvt_thread_t;
292de962bdSlukem #ifdef LDAP_THREAD_DEBUG_WRAP
302de962bdSlukem typedef ldap_debug_thread_mutex_t	ldap_pvt_thread_mutex_t;
312de962bdSlukem typedef ldap_debug_thread_cond_t	ldap_pvt_thread_cond_t;
322de962bdSlukem typedef ldap_debug_thread_rdwr_t	ldap_pvt_thread_rdwr_t;
33d11b170bStron #define LDAP_PVT_MUTEX_FIRSTCREATE	LDAP_DEBUG_MUTEX_FIRSTCREATE
34d11b170bStron #define LDAP_PVT_MUTEX_NULL			LDAP_DEBUG_MUTEX_NULL
352de962bdSlukem #else
362de962bdSlukem typedef ldap_int_thread_mutex_t		ldap_pvt_thread_mutex_t;
372de962bdSlukem typedef ldap_int_thread_cond_t		ldap_pvt_thread_cond_t;
382de962bdSlukem typedef ldap_int_thread_rdwr_t		ldap_pvt_thread_rdwr_t;
39d11b170bStron #define LDAP_PVT_MUTEX_FIRSTCREATE	LDAP_INT_MUTEX_FIRSTCREATE
40d11b170bStron #define LDAP_PVT_MUTEX_NULL			LDAP_INT_MUTEX_NULL
412de962bdSlukem #endif
422de962bdSlukem typedef ldap_int_thread_key_t	ldap_pvt_thread_key_t;
432de962bdSlukem #endif /* !LDAP_PVT_THREAD_H_DONE */
442de962bdSlukem 
452de962bdSlukem #define ldap_pvt_thread_equal		ldap_int_thread_equal
462de962bdSlukem 
472de962bdSlukem LDAP_F( int )
482de962bdSlukem ldap_pvt_thread_initialize LDAP_P(( void ));
492de962bdSlukem 
502de962bdSlukem LDAP_F( int )
512de962bdSlukem ldap_pvt_thread_destroy LDAP_P(( void ));
522de962bdSlukem 
532de962bdSlukem LDAP_F( unsigned int )
542de962bdSlukem ldap_pvt_thread_sleep LDAP_P(( unsigned int s ));
552de962bdSlukem 
562de962bdSlukem LDAP_F( int )
572de962bdSlukem ldap_pvt_thread_get_concurrency LDAP_P(( void ));
582de962bdSlukem 
592de962bdSlukem LDAP_F( int )
602de962bdSlukem ldap_pvt_thread_set_concurrency LDAP_P(( int ));
612de962bdSlukem 
622de962bdSlukem #define LDAP_PVT_THREAD_CREATE_JOINABLE 0
632de962bdSlukem #define LDAP_PVT_THREAD_CREATE_DETACHED 1
642de962bdSlukem 
652de962bdSlukem #ifndef LDAP_PVT_THREAD_H_DONE
662de962bdSlukem #define	LDAP_PVT_THREAD_SET_STACK_SIZE
674e6df137Slukem /* The size may be explicitly #defined to zero to disable it. */
684e6df137Slukem #if defined( LDAP_PVT_THREAD_STACK_SIZE ) && LDAP_PVT_THREAD_STACK_SIZE == 0
694e6df137Slukem #	undef LDAP_PVT_THREAD_SET_STACK_SIZE
704e6df137Slukem #elif !defined( LDAP_PVT_THREAD_STACK_SIZE )
712de962bdSlukem 	/* LARGE stack. Will be twice as large on 64 bit machine. */
722de962bdSlukem #	define LDAP_PVT_THREAD_STACK_SIZE ( 1 * 1024 * 1024 * sizeof(void *) )
732de962bdSlukem #endif
742de962bdSlukem #endif /* !LDAP_PVT_THREAD_H_DONE */
752de962bdSlukem 
762de962bdSlukem LDAP_F( int )
772de962bdSlukem ldap_pvt_thread_create LDAP_P((
782de962bdSlukem 	ldap_pvt_thread_t * thread,
792de962bdSlukem 	int	detach,
802de962bdSlukem 	void *(*start_routine)( void * ),
812de962bdSlukem 	void *arg));
822de962bdSlukem 
832de962bdSlukem LDAP_F( void )
842de962bdSlukem ldap_pvt_thread_exit LDAP_P(( void *retval ));
852de962bdSlukem 
862de962bdSlukem LDAP_F( int )
872de962bdSlukem ldap_pvt_thread_join LDAP_P(( ldap_pvt_thread_t thread, void **status ));
882de962bdSlukem 
892de962bdSlukem LDAP_F( int )
902de962bdSlukem ldap_pvt_thread_kill LDAP_P(( ldap_pvt_thread_t thread, int signo ));
912de962bdSlukem 
922de962bdSlukem LDAP_F( int )
932de962bdSlukem ldap_pvt_thread_yield LDAP_P(( void ));
942de962bdSlukem 
952de962bdSlukem LDAP_F( int )
962de962bdSlukem ldap_pvt_thread_cond_init LDAP_P(( ldap_pvt_thread_cond_t *cond ));
972de962bdSlukem 
982de962bdSlukem LDAP_F( int )
992de962bdSlukem ldap_pvt_thread_cond_destroy LDAP_P(( ldap_pvt_thread_cond_t *cond ));
1002de962bdSlukem 
1012de962bdSlukem LDAP_F( int )
1022de962bdSlukem ldap_pvt_thread_cond_signal LDAP_P(( ldap_pvt_thread_cond_t *cond ));
1032de962bdSlukem 
1042de962bdSlukem LDAP_F( int )
1052de962bdSlukem ldap_pvt_thread_cond_broadcast LDAP_P(( ldap_pvt_thread_cond_t *cond ));
1062de962bdSlukem 
1072de962bdSlukem LDAP_F( int )
1082de962bdSlukem ldap_pvt_thread_cond_wait LDAP_P((
1092de962bdSlukem 	ldap_pvt_thread_cond_t *cond,
1102de962bdSlukem 	ldap_pvt_thread_mutex_t *mutex ));
1112de962bdSlukem 
1122de962bdSlukem LDAP_F( int )
1132de962bdSlukem ldap_pvt_thread_mutex_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
1142de962bdSlukem 
1152de962bdSlukem LDAP_F( int )
116*549b59edSchristos ldap_pvt_thread_mutex_recursive_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
117*549b59edSchristos 
118*549b59edSchristos LDAP_F( int )
1192de962bdSlukem ldap_pvt_thread_mutex_destroy LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
1202de962bdSlukem 
1212de962bdSlukem LDAP_F( int )
1222de962bdSlukem ldap_pvt_thread_mutex_lock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
1232de962bdSlukem 
1242de962bdSlukem LDAP_F( int )
1252de962bdSlukem ldap_pvt_thread_mutex_trylock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
1262de962bdSlukem 
1272de962bdSlukem LDAP_F( int )
1282de962bdSlukem ldap_pvt_thread_mutex_unlock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
1292de962bdSlukem 
1302de962bdSlukem LDAP_F( ldap_pvt_thread_t )
1312de962bdSlukem ldap_pvt_thread_self LDAP_P(( void ));
1322de962bdSlukem 
1332de962bdSlukem #ifdef	LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
1342de962bdSlukem #define	LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
1352de962bdSlukem #else
1362de962bdSlukem #define	LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER(mutex) ((void) 0)
1372de962bdSlukem #endif
1382de962bdSlukem 
1392de962bdSlukem LDAP_F( int )
1402de962bdSlukem ldap_pvt_thread_rdwr_init LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1412de962bdSlukem 
1422de962bdSlukem LDAP_F( int )
1432de962bdSlukem ldap_pvt_thread_rdwr_destroy LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1442de962bdSlukem 
1452de962bdSlukem LDAP_F( int )
1462de962bdSlukem ldap_pvt_thread_rdwr_rlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1472de962bdSlukem 
1482de962bdSlukem LDAP_F( int )
1492de962bdSlukem ldap_pvt_thread_rdwr_rtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1502de962bdSlukem 
1512de962bdSlukem LDAP_F( int )
1522de962bdSlukem ldap_pvt_thread_rdwr_runlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1532de962bdSlukem 
1542de962bdSlukem LDAP_F( int )
1552de962bdSlukem ldap_pvt_thread_rdwr_wlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1562de962bdSlukem 
1572de962bdSlukem LDAP_F( int )
1582de962bdSlukem ldap_pvt_thread_rdwr_wtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1592de962bdSlukem 
1602de962bdSlukem LDAP_F( int )
1612de962bdSlukem ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1622de962bdSlukem 
1632de962bdSlukem LDAP_F( int )
1642de962bdSlukem ldap_pvt_thread_key_create LDAP_P((ldap_pvt_thread_key_t *keyp));
1652de962bdSlukem 
1662de962bdSlukem LDAP_F( int )
1672de962bdSlukem ldap_pvt_thread_key_destroy LDAP_P((ldap_pvt_thread_key_t key));
1682de962bdSlukem 
1692de962bdSlukem LDAP_F( int )
1702de962bdSlukem ldap_pvt_thread_key_setdata LDAP_P((ldap_pvt_thread_key_t key, void *data));
1712de962bdSlukem 
1722de962bdSlukem LDAP_F( int )
1732de962bdSlukem ldap_pvt_thread_key_getdata LDAP_P((ldap_pvt_thread_key_t key, void **data));
1742de962bdSlukem 
1752de962bdSlukem #ifdef LDAP_DEBUG
1762de962bdSlukem LDAP_F( int )
1772de962bdSlukem ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1782de962bdSlukem 
1792de962bdSlukem LDAP_F( int )
1802de962bdSlukem ldap_pvt_thread_rdwr_writers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1812de962bdSlukem 
1822de962bdSlukem LDAP_F( int )
1832de962bdSlukem ldap_pvt_thread_rdwr_active LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
1842de962bdSlukem #endif /* LDAP_DEBUG */
1852de962bdSlukem 
1862de962bdSlukem #define LDAP_PVT_THREAD_EINVAL EINVAL
1872de962bdSlukem #define LDAP_PVT_THREAD_EBUSY EINVAL
1882de962bdSlukem 
1892de962bdSlukem #ifndef LDAP_PVT_THREAD_H_DONE
1902de962bdSlukem typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t;
1912de962bdSlukem 
1922de962bdSlukem typedef void * (ldap_pvt_thread_start_t) LDAP_P((void *ctx, void *arg));
193*549b59edSchristos typedef int (ldap_pvt_thread_walk_t) LDAP_P((ldap_pvt_thread_start_t *start, void *start_arg, void *arg));
1942de962bdSlukem typedef void (ldap_pvt_thread_pool_keyfree_t) LDAP_P((void *key, void *data));
1952de962bdSlukem #endif /* !LDAP_PVT_THREAD_H_DONE */
1962de962bdSlukem 
1972de962bdSlukem LDAP_F( int )
1982de962bdSlukem ldap_pvt_thread_pool_init LDAP_P((
1992de962bdSlukem 	ldap_pvt_thread_pool_t *pool_out,
2002de962bdSlukem 	int max_threads,
2012de962bdSlukem 	int max_pending ));
2022de962bdSlukem 
2032de962bdSlukem LDAP_F( int )
204*549b59edSchristos ldap_pvt_thread_pool_init_q LDAP_P((
205*549b59edSchristos 	ldap_pvt_thread_pool_t *pool_out,
206*549b59edSchristos 	int max_threads,
207*549b59edSchristos 	int max_pending,
208*549b59edSchristos 	int num_qs ));
209*549b59edSchristos 
210*549b59edSchristos LDAP_F( int )
2112de962bdSlukem ldap_pvt_thread_pool_submit LDAP_P((
2122de962bdSlukem 	ldap_pvt_thread_pool_t *pool,
2132de962bdSlukem 	ldap_pvt_thread_start_t *start,
2142de962bdSlukem 	void *arg ));
2152de962bdSlukem 
2162de962bdSlukem LDAP_F( int )
217*549b59edSchristos ldap_pvt_thread_pool_submit2 LDAP_P((
2184e6df137Slukem 	ldap_pvt_thread_pool_t *pool,
2194e6df137Slukem 	ldap_pvt_thread_start_t *start,
220*549b59edSchristos 	void *arg,
221*549b59edSchristos 	void **cookie ));
222*549b59edSchristos 
223*549b59edSchristos LDAP_F( int )
224*549b59edSchristos ldap_pvt_thread_pool_retract LDAP_P((
225*549b59edSchristos 	void *cookie ));
226*549b59edSchristos 
227*549b59edSchristos LDAP_F( int )
228*549b59edSchristos ldap_pvt_thread_pool_walk LDAP_P((
229*549b59edSchristos 	ldap_pvt_thread_pool_t *pool,
230*549b59edSchristos 	ldap_pvt_thread_start_t *start,
231*549b59edSchristos 	ldap_pvt_thread_walk_t *cb,
2324e6df137Slukem 	void *arg ));
2334e6df137Slukem 
2344e6df137Slukem LDAP_F( int )
2352de962bdSlukem ldap_pvt_thread_pool_maxthreads LDAP_P((
2362de962bdSlukem 	ldap_pvt_thread_pool_t *pool,
2372de962bdSlukem 	int max_threads ));
2382de962bdSlukem 
239*549b59edSchristos LDAP_F( int )
240*549b59edSchristos ldap_pvt_thread_pool_queues LDAP_P((
241*549b59edSchristos 	ldap_pvt_thread_pool_t *pool,
242*549b59edSchristos 	int numqs ));
243*549b59edSchristos 
2442de962bdSlukem #ifndef LDAP_PVT_THREAD_H_DONE
2452de962bdSlukem typedef enum {
2462de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN = -1,
2472de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_MAX,
2482de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING,
2492de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_OPEN,
2502de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_STARTING,
2512de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_ACTIVE,
2522de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_PAUSING,
2532de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_PENDING,
2542de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD,
2552de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX,
2562de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX,
2572de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX,
2582de962bdSlukem 	LDAP_PVT_THREAD_POOL_PARAM_STATE
2592de962bdSlukem } ldap_pvt_thread_pool_param_t;
2602de962bdSlukem #endif /* !LDAP_PVT_THREAD_H_DONE */
2612de962bdSlukem 
2622de962bdSlukem LDAP_F( int )
2632de962bdSlukem ldap_pvt_thread_pool_query LDAP_P((
2642de962bdSlukem 	ldap_pvt_thread_pool_t *pool,
2652de962bdSlukem 	ldap_pvt_thread_pool_param_t param, void *value ));
2662de962bdSlukem 
2672de962bdSlukem LDAP_F( int )
2682de962bdSlukem ldap_pvt_thread_pool_pausing LDAP_P((
2692de962bdSlukem 	ldap_pvt_thread_pool_t *pool ));
2702de962bdSlukem 
2712de962bdSlukem LDAP_F( int )
2722de962bdSlukem ldap_pvt_thread_pool_backload LDAP_P((
2732de962bdSlukem 	ldap_pvt_thread_pool_t *pool ));
2742de962bdSlukem 
275d11b170bStron LDAP_F( void )
276d11b170bStron ldap_pvt_thread_pool_idle LDAP_P((
277d11b170bStron 	ldap_pvt_thread_pool_t *pool ));
278d11b170bStron 
279d11b170bStron LDAP_F( void )
280d11b170bStron ldap_pvt_thread_pool_unidle LDAP_P((
281d11b170bStron 	ldap_pvt_thread_pool_t *pool ));
282d11b170bStron 
2832de962bdSlukem LDAP_F( int )
2842de962bdSlukem ldap_pvt_thread_pool_pausecheck LDAP_P((
2852de962bdSlukem 	ldap_pvt_thread_pool_t *pool ));
2862de962bdSlukem 
2872de962bdSlukem LDAP_F( int )
288*549b59edSchristos ldap_pvt_thread_pool_pausecheck_native LDAP_P((
289*549b59edSchristos 	ldap_pvt_thread_pool_t *pool ));
290*549b59edSchristos 
291*549b59edSchristos LDAP_F( int )
2922de962bdSlukem ldap_pvt_thread_pool_pause LDAP_P((
2932de962bdSlukem 	ldap_pvt_thread_pool_t *pool ));
2942de962bdSlukem 
2952de962bdSlukem LDAP_F( int )
2962de962bdSlukem ldap_pvt_thread_pool_resume LDAP_P((
2972de962bdSlukem 	ldap_pvt_thread_pool_t *pool ));
2982de962bdSlukem 
2992de962bdSlukem LDAP_F( int )
3002de962bdSlukem ldap_pvt_thread_pool_destroy LDAP_P((
3012de962bdSlukem 	ldap_pvt_thread_pool_t *pool,
3022de962bdSlukem 	int run_pending ));
3032de962bdSlukem 
3042de962bdSlukem LDAP_F( int )
305*549b59edSchristos ldap_pvt_thread_pool_close LDAP_P((
306*549b59edSchristos 	ldap_pvt_thread_pool_t *pool,
307*549b59edSchristos 	int run_pending ));
308*549b59edSchristos 
309*549b59edSchristos LDAP_F( int )
310*549b59edSchristos ldap_pvt_thread_pool_free LDAP_P((
311*549b59edSchristos 	ldap_pvt_thread_pool_t *pool ));
312*549b59edSchristos 
313*549b59edSchristos LDAP_F( int )
3142de962bdSlukem ldap_pvt_thread_pool_getkey LDAP_P((
3152de962bdSlukem 	void *ctx,
3162de962bdSlukem 	void *key,
3172de962bdSlukem 	void **data,
3182de962bdSlukem 	ldap_pvt_thread_pool_keyfree_t **kfree ));
3192de962bdSlukem 
3202de962bdSlukem LDAP_F( int )
3212de962bdSlukem ldap_pvt_thread_pool_setkey LDAP_P((
3222de962bdSlukem 	void *ctx,
3232de962bdSlukem 	void *key,
3242de962bdSlukem 	void *data,
3252de962bdSlukem 	ldap_pvt_thread_pool_keyfree_t *kfree,
3262de962bdSlukem 	void **olddatap,
3272de962bdSlukem 	ldap_pvt_thread_pool_keyfree_t **oldkfreep ));
3282de962bdSlukem 
3292de962bdSlukem LDAP_F( void )
3302de962bdSlukem ldap_pvt_thread_pool_purgekey LDAP_P(( void *key ));
3312de962bdSlukem 
3322de962bdSlukem LDAP_F( void *)
3332de962bdSlukem ldap_pvt_thread_pool_context LDAP_P(( void ));
3342de962bdSlukem 
3352de962bdSlukem LDAP_F( void )
3362de962bdSlukem ldap_pvt_thread_pool_context_reset LDAP_P(( void *key ));
3372de962bdSlukem 
3382de962bdSlukem LDAP_F( ldap_pvt_thread_t )
3392de962bdSlukem ldap_pvt_thread_pool_tid LDAP_P(( void *ctx ));
3402de962bdSlukem 
3412de962bdSlukem LDAP_END_DECL
3422de962bdSlukem 
3432de962bdSlukem #define LDAP_PVT_THREAD_H_DONE
3442de962bdSlukem #endif /* _LDAP_PVT_THREAD_H */
345