1 /* ldap_pvt_thread.h - ldap threads header file */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 1998-2022 The OpenLDAP Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
17 #ifndef _LDAP_PVT_THREAD_H
18 #define _LDAP_PVT_THREAD_H /* libldap/ldap_thr_debug.h #undefines this */
20 #include "ldap_cdefs.h"
21 #include "ldap_int_thread.h"
25 #ifndef LDAP_PVT_THREAD_H_DONE
26 typedef ldap_int_thread_t ldap_pvt_thread_t
;
27 #ifdef LDAP_THREAD_DEBUG_WRAP
28 typedef ldap_debug_thread_mutex_t ldap_pvt_thread_mutex_t
;
29 typedef ldap_debug_thread_cond_t ldap_pvt_thread_cond_t
;
30 typedef ldap_debug_thread_rdwr_t ldap_pvt_thread_rdwr_t
;
31 #define LDAP_PVT_MUTEX_FIRSTCREATE LDAP_DEBUG_MUTEX_FIRSTCREATE
32 #define LDAP_PVT_MUTEX_NULL LDAP_DEBUG_MUTEX_NULL
34 typedef ldap_int_thread_mutex_t ldap_pvt_thread_mutex_t
;
35 typedef ldap_int_thread_cond_t ldap_pvt_thread_cond_t
;
36 typedef ldap_int_thread_rdwr_t ldap_pvt_thread_rdwr_t
;
37 #define LDAP_PVT_MUTEX_FIRSTCREATE LDAP_INT_MUTEX_FIRSTCREATE
38 #define LDAP_PVT_MUTEX_NULL LDAP_INT_MUTEX_NULL
40 typedef ldap_int_thread_key_t ldap_pvt_thread_key_t
;
41 #endif /* !LDAP_PVT_THREAD_H_DONE */
43 #define ldap_pvt_thread_equal ldap_int_thread_equal
46 ldap_pvt_thread_initialize
LDAP_P(( void ));
49 ldap_pvt_thread_destroy
LDAP_P(( void ));
51 LDAP_F( unsigned int )
52 ldap_pvt_thread_sleep
LDAP_P(( unsigned int s
));
55 ldap_pvt_thread_get_concurrency
LDAP_P(( void ));
58 ldap_pvt_thread_set_concurrency
LDAP_P(( int ));
60 #define LDAP_PVT_THREAD_CREATE_JOINABLE 0
61 #define LDAP_PVT_THREAD_CREATE_DETACHED 1
63 #ifndef LDAP_PVT_THREAD_H_DONE
64 #define LDAP_PVT_THREAD_SET_STACK_SIZE
65 /* The size may be explicitly #defined to zero to disable it. */
66 #if defined( LDAP_PVT_THREAD_STACK_SIZE ) && LDAP_PVT_THREAD_STACK_SIZE == 0
67 # undef LDAP_PVT_THREAD_SET_STACK_SIZE
68 #elif !defined( LDAP_PVT_THREAD_STACK_SIZE )
69 /* LARGE stack. Will be twice as large on 64 bit machine. */
70 # define LDAP_PVT_THREAD_STACK_SIZE ( 1 * 1024 * 1024 * sizeof(void *) )
72 #endif /* !LDAP_PVT_THREAD_H_DONE */
75 ldap_pvt_thread_create
LDAP_P((
76 ldap_pvt_thread_t
* thread
,
78 void *(*start_routine
)( void * ),
82 ldap_pvt_thread_exit
LDAP_P(( void *retval
));
85 ldap_pvt_thread_join
LDAP_P(( ldap_pvt_thread_t thread
, void **status
));
88 ldap_pvt_thread_kill
LDAP_P(( ldap_pvt_thread_t thread
, int signo
));
91 ldap_pvt_thread_yield
LDAP_P(( void ));
94 ldap_pvt_thread_cond_init
LDAP_P(( ldap_pvt_thread_cond_t
*cond
));
97 ldap_pvt_thread_cond_destroy
LDAP_P(( ldap_pvt_thread_cond_t
*cond
));
100 ldap_pvt_thread_cond_signal
LDAP_P(( ldap_pvt_thread_cond_t
*cond
));
103 ldap_pvt_thread_cond_broadcast
LDAP_P(( ldap_pvt_thread_cond_t
*cond
));
106 ldap_pvt_thread_cond_wait
LDAP_P((
107 ldap_pvt_thread_cond_t
*cond
,
108 ldap_pvt_thread_mutex_t
*mutex
));
111 ldap_pvt_thread_mutex_init
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
114 ldap_pvt_thread_mutex_recursive_init
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
117 ldap_pvt_thread_mutex_destroy
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
120 ldap_pvt_thread_mutex_lock
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
123 ldap_pvt_thread_mutex_trylock
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
126 ldap_pvt_thread_mutex_unlock
LDAP_P(( ldap_pvt_thread_mutex_t
*mutex
));
128 LDAP_F( ldap_pvt_thread_t
)
129 ldap_pvt_thread_self
LDAP_P(( void ));
131 #ifdef LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
132 #define LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER LDAP_INT_THREAD_ASSERT_MUTEX_OWNER
134 #define LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER(mutex) ((void) 0)
138 ldap_pvt_thread_rdwr_init
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
141 ldap_pvt_thread_rdwr_destroy
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
144 ldap_pvt_thread_rdwr_rlock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
147 ldap_pvt_thread_rdwr_rtrylock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
150 ldap_pvt_thread_rdwr_runlock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
153 ldap_pvt_thread_rdwr_wlock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
156 ldap_pvt_thread_rdwr_wtrylock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
159 ldap_pvt_thread_rdwr_wunlock
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
162 ldap_pvt_thread_key_create
LDAP_P((ldap_pvt_thread_key_t
*keyp
));
165 ldap_pvt_thread_key_destroy
LDAP_P((ldap_pvt_thread_key_t key
));
168 ldap_pvt_thread_key_setdata
LDAP_P((ldap_pvt_thread_key_t key
, void *data
));
171 ldap_pvt_thread_key_getdata
LDAP_P((ldap_pvt_thread_key_t key
, void **data
));
175 ldap_pvt_thread_rdwr_readers
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
178 ldap_pvt_thread_rdwr_writers
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
181 ldap_pvt_thread_rdwr_active
LDAP_P((ldap_pvt_thread_rdwr_t
*rdwrp
));
182 #endif /* LDAP_DEBUG */
184 #define LDAP_PVT_THREAD_EINVAL EINVAL
185 #define LDAP_PVT_THREAD_EBUSY EINVAL
187 #ifndef LDAP_PVT_THREAD_H_DONE
188 typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t
;
190 typedef void * (ldap_pvt_thread_start_t
) LDAP_P((void *ctx
, void *arg
));
191 typedef int (ldap_pvt_thread_walk_t
) LDAP_P((ldap_pvt_thread_start_t
*start
, void *start_arg
, void *arg
));
192 typedef void (ldap_pvt_thread_pool_keyfree_t
) LDAP_P((void *key
, void *data
));
193 #endif /* !LDAP_PVT_THREAD_H_DONE */
196 ldap_pvt_thread_pool_init
LDAP_P((
197 ldap_pvt_thread_pool_t
*pool_out
,
202 ldap_pvt_thread_pool_init_q
LDAP_P((
203 ldap_pvt_thread_pool_t
*pool_out
,
209 ldap_pvt_thread_pool_submit
LDAP_P((
210 ldap_pvt_thread_pool_t
*pool
,
211 ldap_pvt_thread_start_t
*start
,
215 ldap_pvt_thread_pool_submit2
LDAP_P((
216 ldap_pvt_thread_pool_t
*pool
,
217 ldap_pvt_thread_start_t
*start
,
222 ldap_pvt_thread_pool_retract
LDAP_P((
226 ldap_pvt_thread_pool_walk
LDAP_P((
227 ldap_pvt_thread_pool_t
*pool
,
228 ldap_pvt_thread_start_t
*start
,
229 ldap_pvt_thread_walk_t
*cb
,
233 ldap_pvt_thread_pool_maxthreads
LDAP_P((
234 ldap_pvt_thread_pool_t
*pool
,
238 ldap_pvt_thread_pool_queues
LDAP_P((
239 ldap_pvt_thread_pool_t
*pool
,
242 #ifndef LDAP_PVT_THREAD_H_DONE
244 LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN
= -1,
245 LDAP_PVT_THREAD_POOL_PARAM_MAX
,
246 LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING
,
247 LDAP_PVT_THREAD_POOL_PARAM_OPEN
,
248 LDAP_PVT_THREAD_POOL_PARAM_STARTING
,
249 LDAP_PVT_THREAD_POOL_PARAM_ACTIVE
,
250 LDAP_PVT_THREAD_POOL_PARAM_PAUSING
,
251 LDAP_PVT_THREAD_POOL_PARAM_PENDING
,
252 LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD
,
253 LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX
,
254 LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX
,
255 LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX
,
256 LDAP_PVT_THREAD_POOL_PARAM_STATE
,
257 LDAP_PVT_THREAD_POOL_PARAM_PAUSED
258 } ldap_pvt_thread_pool_param_t
;
259 #endif /* !LDAP_PVT_THREAD_H_DONE */
262 ldap_pvt_thread_pool_query
LDAP_P((
263 ldap_pvt_thread_pool_t
*pool
,
264 ldap_pvt_thread_pool_param_t param
, void *value
));
267 ldap_pvt_thread_pool_pausing
LDAP_P((
268 ldap_pvt_thread_pool_t
*pool
));
271 ldap_pvt_thread_pool_backload
LDAP_P((
272 ldap_pvt_thread_pool_t
*pool
));
275 ldap_pvt_thread_pool_idle
LDAP_P((
276 ldap_pvt_thread_pool_t
*pool
));
279 ldap_pvt_thread_pool_unidle
LDAP_P((
280 ldap_pvt_thread_pool_t
*pool
));
283 ldap_pvt_thread_pool_pausecheck
LDAP_P((
284 ldap_pvt_thread_pool_t
*pool
));
287 ldap_pvt_thread_pool_pausecheck_native
LDAP_P((
288 ldap_pvt_thread_pool_t
*pool
));
291 ldap_pvt_thread_pool_pause
LDAP_P((
292 ldap_pvt_thread_pool_t
*pool
));
295 ldap_pvt_thread_pool_resume
LDAP_P((
296 ldap_pvt_thread_pool_t
*pool
));
299 ldap_pvt_thread_pool_destroy
LDAP_P((
300 ldap_pvt_thread_pool_t
*pool
,
304 ldap_pvt_thread_pool_close
LDAP_P((
305 ldap_pvt_thread_pool_t
*pool
,
309 ldap_pvt_thread_pool_free
LDAP_P((
310 ldap_pvt_thread_pool_t
*pool
));
313 ldap_pvt_thread_pool_getkey
LDAP_P((
317 ldap_pvt_thread_pool_keyfree_t
**kfree
));
320 ldap_pvt_thread_pool_setkey
LDAP_P((
324 ldap_pvt_thread_pool_keyfree_t
*kfree
,
326 ldap_pvt_thread_pool_keyfree_t
**oldkfreep
));
329 ldap_pvt_thread_pool_purgekey
LDAP_P(( void *key
));
332 ldap_pvt_thread_pool_context
LDAP_P(( void ));
335 ldap_pvt_thread_pool_context_reset
LDAP_P(( void *key
));
337 LDAP_F( ldap_pvt_thread_t
)
338 ldap_pvt_thread_pool_tid
LDAP_P(( void *ctx
));
342 #define LDAP_PVT_THREAD_H_DONE
343 #endif /* _LDAP_PVT_THREAD_H */