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