Home | History | Annotate | Line # | Download | only in include
      1 /*	$NetBSD: ldap_pvt_thread.h,v 1.4 2025/09/05 21:16:19 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-2024 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 
     25 LDAP_BEGIN_DECL
     26 
     27 #ifndef LDAP_PVT_THREAD_H_DONE
     28 typedef ldap_int_thread_t			ldap_pvt_thread_t;
     29 #ifdef LDAP_THREAD_DEBUG_WRAP
     30 typedef ldap_debug_thread_mutex_t	ldap_pvt_thread_mutex_t;
     31 typedef ldap_debug_thread_cond_t	ldap_pvt_thread_cond_t;
     32 typedef 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
     36 typedef ldap_int_thread_mutex_t		ldap_pvt_thread_mutex_t;
     37 typedef ldap_int_thread_cond_t		ldap_pvt_thread_cond_t;
     38 typedef 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
     42 typedef 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 
     47 LDAP_F( int )
     48 ldap_pvt_thread_initialize LDAP_P(( void ));
     49 
     50 LDAP_F( int )
     51 ldap_pvt_thread_destroy LDAP_P(( void ));
     52 
     53 LDAP_F( unsigned int )
     54 ldap_pvt_thread_sleep LDAP_P(( unsigned int s ));
     55 
     56 LDAP_F( int )
     57 ldap_pvt_thread_get_concurrency LDAP_P(( void ));
     58 
     59 LDAP_F( int )
     60 ldap_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 
     76 LDAP_F( int )
     77 ldap_pvt_thread_create LDAP_P((
     78 	ldap_pvt_thread_t * thread,
     79 	int	detach,
     80 	void *(*start_routine)( void * ),
     81 	void *arg));
     82 
     83 LDAP_F( void )
     84 ldap_pvt_thread_exit LDAP_P(( void *retval ));
     85 
     86 LDAP_F( int )
     87 ldap_pvt_thread_join LDAP_P(( ldap_pvt_thread_t thread, void **status ));
     88 
     89 LDAP_F( int )
     90 ldap_pvt_thread_kill LDAP_P(( ldap_pvt_thread_t thread, int signo ));
     91 
     92 LDAP_F( int )
     93 ldap_pvt_thread_yield LDAP_P(( void ));
     94 
     95 LDAP_F( int )
     96 ldap_pvt_thread_cond_init LDAP_P(( ldap_pvt_thread_cond_t *cond ));
     97 
     98 LDAP_F( int )
     99 ldap_pvt_thread_cond_destroy LDAP_P(( ldap_pvt_thread_cond_t *cond ));
    100 
    101 LDAP_F( int )
    102 ldap_pvt_thread_cond_signal LDAP_P(( ldap_pvt_thread_cond_t *cond ));
    103 
    104 LDAP_F( int )
    105 ldap_pvt_thread_cond_broadcast LDAP_P(( ldap_pvt_thread_cond_t *cond ));
    106 
    107 LDAP_F( int )
    108 ldap_pvt_thread_cond_wait LDAP_P((
    109 	ldap_pvt_thread_cond_t *cond,
    110 	ldap_pvt_thread_mutex_t *mutex ));
    111 
    112 LDAP_F( int )
    113 ldap_pvt_thread_mutex_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    114 
    115 LDAP_F( int )
    116 ldap_pvt_thread_mutex_recursive_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    117 
    118 LDAP_F( int )
    119 ldap_pvt_thread_mutex_destroy LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    120 
    121 LDAP_F( int )
    122 ldap_pvt_thread_mutex_lock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    123 
    124 LDAP_F( int )
    125 ldap_pvt_thread_mutex_trylock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    126 
    127 LDAP_F( int )
    128 ldap_pvt_thread_mutex_unlock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
    129 
    130 LDAP_F( ldap_pvt_thread_t )
    131 ldap_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 
    139 LDAP_F( int )
    140 ldap_pvt_thread_rdwr_init LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    141 
    142 LDAP_F( int )
    143 ldap_pvt_thread_rdwr_destroy LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    144 
    145 LDAP_F( int )
    146 ldap_pvt_thread_rdwr_rlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    147 
    148 LDAP_F( int )
    149 ldap_pvt_thread_rdwr_rtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    150 
    151 LDAP_F( int )
    152 ldap_pvt_thread_rdwr_runlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    153 
    154 LDAP_F( int )
    155 ldap_pvt_thread_rdwr_wlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    156 
    157 LDAP_F( int )
    158 ldap_pvt_thread_rdwr_wtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    159 
    160 LDAP_F( int )
    161 ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    162 
    163 LDAP_F( int )
    164 ldap_pvt_thread_key_create LDAP_P((ldap_pvt_thread_key_t *keyp));
    165 
    166 LDAP_F( int )
    167 ldap_pvt_thread_key_destroy LDAP_P((ldap_pvt_thread_key_t key));
    168 
    169 LDAP_F( int )
    170 ldap_pvt_thread_key_setdata LDAP_P((ldap_pvt_thread_key_t key, void *data));
    171 
    172 LDAP_F( int )
    173 ldap_pvt_thread_key_getdata LDAP_P((ldap_pvt_thread_key_t key, void **data));
    174 
    175 #ifdef LDAP_DEBUG
    176 LDAP_F( int )
    177 ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    178 
    179 LDAP_F( int )
    180 ldap_pvt_thread_rdwr_writers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
    181 
    182 LDAP_F( int )
    183 ldap_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
    190 typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t;
    191 
    192 typedef void * (ldap_pvt_thread_start_t) LDAP_P((void *ctx, void *arg));
    193 typedef int (ldap_pvt_thread_walk_t) LDAP_P((ldap_pvt_thread_start_t *start, void *start_arg, void *arg));
    194 typedef void (ldap_pvt_thread_pool_keyfree_t) LDAP_P((void *key, void *data));
    195 #endif /* !LDAP_PVT_THREAD_H_DONE */
    196 
    197 LDAP_F( int )
    198 ldap_pvt_thread_pool_init LDAP_P((
    199 	ldap_pvt_thread_pool_t *pool_out,
    200 	int max_threads,
    201 	int max_pending ));
    202 
    203 LDAP_F( int )
    204 ldap_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 
    210 LDAP_F( int )
    211 ldap_pvt_thread_pool_submit LDAP_P((
    212 	ldap_pvt_thread_pool_t *pool,
    213 	ldap_pvt_thread_start_t *start,
    214 	void *arg ));
    215 
    216 LDAP_F( int )
    217 ldap_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 
    223 LDAP_F( int )
    224 ldap_pvt_thread_pool_retract LDAP_P((
    225 	void *cookie ));
    226 
    227 LDAP_F( int )
    228 ldap_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 
    234 LDAP_F( int )
    235 ldap_pvt_thread_pool_maxthreads LDAP_P((
    236 	ldap_pvt_thread_pool_t *pool,
    237 	int max_threads ));
    238 
    239 LDAP_F( int )
    240 ldap_pvt_thread_pool_queues LDAP_P((
    241 	ldap_pvt_thread_pool_t *pool,
    242 	int numqs ));
    243 
    244 #ifndef LDAP_PVT_THREAD_H_DONE
    245 typedef 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_PAUSED
    260 } ldap_pvt_thread_pool_param_t;
    261 #endif /* !LDAP_PVT_THREAD_H_DONE */
    262 
    263 LDAP_F( int )
    264 ldap_pvt_thread_pool_query LDAP_P((
    265 	ldap_pvt_thread_pool_t *pool,
    266 	ldap_pvt_thread_pool_param_t param, void *value ));
    267 
    268 LDAP_F( int )
    269 ldap_pvt_thread_pool_pausing LDAP_P((
    270 	ldap_pvt_thread_pool_t *pool ));
    271 
    272 LDAP_F( int )
    273 ldap_pvt_thread_pool_backload LDAP_P((
    274 	ldap_pvt_thread_pool_t *pool ));
    275 
    276 LDAP_F( void )
    277 ldap_pvt_thread_pool_idle LDAP_P((
    278 	ldap_pvt_thread_pool_t *pool ));
    279 
    280 LDAP_F( void )
    281 ldap_pvt_thread_pool_unidle LDAP_P((
    282 	ldap_pvt_thread_pool_t *pool ));
    283 
    284 LDAP_F( int )
    285 ldap_pvt_thread_pool_pausequery LDAP_P((
    286 	ldap_pvt_thread_pool_t *pool ));
    287 
    288 LDAP_F( int )
    289 ldap_pvt_thread_pool_pausewait LDAP_P((
    290 	ldap_pvt_thread_pool_t *pool ));
    291 
    292 LDAP_F( int )
    293 ldap_pvt_thread_pool_pausecheck_native LDAP_P((
    294 	ldap_pvt_thread_pool_t *pool ));
    295 
    296 LDAP_F( int )
    297 ldap_pvt_thread_pool_pause LDAP_P((
    298 	ldap_pvt_thread_pool_t *pool ));
    299 
    300 LDAP_F( int )
    301 ldap_pvt_thread_pool_resume LDAP_P((
    302 	ldap_pvt_thread_pool_t *pool ));
    303 
    304 LDAP_F( int )
    305 ldap_pvt_thread_pool_destroy LDAP_P((
    306 	ldap_pvt_thread_pool_t *pool,
    307 	int run_pending ));
    308 
    309 LDAP_F( int )
    310 ldap_pvt_thread_pool_close LDAP_P((
    311 	ldap_pvt_thread_pool_t *pool,
    312 	int run_pending ));
    313 
    314 LDAP_F( int )
    315 ldap_pvt_thread_pool_free LDAP_P((
    316 	ldap_pvt_thread_pool_t *pool ));
    317 
    318 LDAP_F( int )
    319 ldap_pvt_thread_pool_getkey LDAP_P((
    320 	void *ctx,
    321 	void *key,
    322 	void **data,
    323 	ldap_pvt_thread_pool_keyfree_t **kfree ));
    324 
    325 LDAP_F( int )
    326 ldap_pvt_thread_pool_setkey LDAP_P((
    327 	void *ctx,
    328 	void *key,
    329 	void *data,
    330 	ldap_pvt_thread_pool_keyfree_t *kfree,
    331 	void **olddatap,
    332 	ldap_pvt_thread_pool_keyfree_t **oldkfreep ));
    333 
    334 LDAP_F( void )
    335 ldap_pvt_thread_pool_purgekey LDAP_P(( void *key ));
    336 
    337 LDAP_F( void *)
    338 ldap_pvt_thread_pool_context LDAP_P(( void ));
    339 
    340 LDAP_F( void )
    341 ldap_pvt_thread_pool_context_reset LDAP_P(( void *key ));
    342 
    343 LDAP_F( ldap_pvt_thread_t )
    344 ldap_pvt_thread_pool_tid LDAP_P(( void *ctx ));
    345 
    346 LDAP_END_DECL
    347 
    348 #define LDAP_PVT_THREAD_H_DONE
    349 #endif /* _LDAP_PVT_THREAD_H */
    350