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