1*549b59edSchristos /* $NetBSD: ldap_int_thread.h,v 1.3 2021/08/14 16:14:55 christos Exp $ */ 24e6df137Slukem 32de962bdSlukem /* ldap_int_thread.h - ldap internal thread wrappers 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 202de962bdSlukem LDAP_BEGIN_DECL 212de962bdSlukem 22*549b59edSchristos /* Can be done twice. See libldap/ldap_thr_debug.h. */ 232de962bdSlukem LDAP_F(int) ldap_int_thread_initialize LDAP_P(( void )); 242de962bdSlukem LDAP_F(int) ldap_int_thread_destroy LDAP_P(( void )); 252de962bdSlukem 262de962bdSlukem LDAP_END_DECL 272de962bdSlukem 282de962bdSlukem #ifndef _LDAP_INT_THREAD_H 292de962bdSlukem #define _LDAP_INT_THREAD_H 302de962bdSlukem 312de962bdSlukem #if defined( HAVE_PTHREADS ) 322de962bdSlukem /********************************** 332de962bdSlukem * * 342de962bdSlukem * definitions for POSIX Threads * 352de962bdSlukem * * 362de962bdSlukem **********************************/ 372de962bdSlukem 382de962bdSlukem #include <pthread.h> 392de962bdSlukem #ifdef HAVE_SCHED_H 402de962bdSlukem #include <sched.h> 412de962bdSlukem #endif 422de962bdSlukem 432de962bdSlukem LDAP_BEGIN_DECL 442de962bdSlukem 452de962bdSlukem typedef pthread_t ldap_int_thread_t; 462de962bdSlukem typedef pthread_mutex_t ldap_int_thread_mutex_t; 472de962bdSlukem typedef pthread_cond_t ldap_int_thread_cond_t; 482de962bdSlukem typedef pthread_key_t ldap_int_thread_key_t; 492de962bdSlukem 502de962bdSlukem #define ldap_int_thread_equal(a, b) pthread_equal((a), (b)) 512de962bdSlukem 522de962bdSlukem #if defined( _POSIX_REENTRANT_FUNCTIONS ) || \ 532de962bdSlukem defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \ 542de962bdSlukem defined( _POSIX_THREADSAFE_FUNCTIONS ) 552de962bdSlukem #define HAVE_REENTRANT_FUNCTIONS 1 562de962bdSlukem #endif 572de962bdSlukem 582de962bdSlukem #if defined( HAVE_PTHREAD_GETCONCURRENCY ) || \ 592de962bdSlukem defined( HAVE_THR_GETCONCURRENCY ) 602de962bdSlukem #define LDAP_THREAD_HAVE_GETCONCURRENCY 1 612de962bdSlukem #endif 622de962bdSlukem 632de962bdSlukem #if defined( HAVE_PTHREAD_SETCONCURRENCY ) || \ 642de962bdSlukem defined( HAVE_THR_SETCONCURRENCY ) 652de962bdSlukem #define LDAP_THREAD_HAVE_SETCONCURRENCY 1 662de962bdSlukem #endif 672de962bdSlukem 682de962bdSlukem #if defined( HAVE_PTHREAD_RWLOCK_DESTROY ) 692de962bdSlukem #define LDAP_THREAD_HAVE_RDWR 1 702de962bdSlukem typedef pthread_rwlock_t ldap_int_thread_rdwr_t; 712de962bdSlukem #endif 722de962bdSlukem 73d11b170bStron #ifndef LDAP_INT_MUTEX_NULL 74d11b170bStron #define LDAP_INT_MUTEX_NULL PTHREAD_MUTEX_INITIALIZER 75d11b170bStron #define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) 76d11b170bStron #endif 77d11b170bStron 782de962bdSlukem LDAP_END_DECL 792de962bdSlukem 802de962bdSlukem #elif defined( HAVE_GNU_PTH ) 812de962bdSlukem /*********************************** 822de962bdSlukem * * 832de962bdSlukem * thread definitions for GNU Pth * 842de962bdSlukem * * 852de962bdSlukem ***********************************/ 862de962bdSlukem 872de962bdSlukem #define PTH_SYSCALL_SOFT 1 882de962bdSlukem #include <pth.h> 892de962bdSlukem 902de962bdSlukem LDAP_BEGIN_DECL 912de962bdSlukem 922de962bdSlukem typedef pth_t ldap_int_thread_t; 932de962bdSlukem typedef pth_mutex_t ldap_int_thread_mutex_t; 942de962bdSlukem typedef pth_cond_t ldap_int_thread_cond_t; 952de962bdSlukem typedef pth_key_t ldap_int_thread_key_t; 962de962bdSlukem 972de962bdSlukem #if 0 982de962bdSlukem #define LDAP_THREAD_HAVE_RDWR 1 992de962bdSlukem typedef pth_rwlock_t ldap_int_thread_rdwr_t; 1002de962bdSlukem #endif 1012de962bdSlukem 102d11b170bStron #ifndef LDAP_INT_MUTEX_NULL 103d11b170bStron #define LDAP_INT_MUTEX_NULL PTH_MUTEX_INIT 104d11b170bStron #define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) 105d11b170bStron #endif 106d11b170bStron 1072de962bdSlukem LDAP_END_DECL 1082de962bdSlukem 1092de962bdSlukem #elif defined( HAVE_THR ) 1102de962bdSlukem /******************************************** 1112de962bdSlukem * * 1122de962bdSlukem * thread definitions for Solaris LWP (THR) * 1132de962bdSlukem * * 1142de962bdSlukem ********************************************/ 1152de962bdSlukem 1162de962bdSlukem #include <thread.h> 1172de962bdSlukem #include <synch.h> 1182de962bdSlukem 1192de962bdSlukem LDAP_BEGIN_DECL 1202de962bdSlukem 1212de962bdSlukem typedef thread_t ldap_int_thread_t; 1222de962bdSlukem typedef mutex_t ldap_int_thread_mutex_t; 1232de962bdSlukem typedef cond_t ldap_int_thread_cond_t; 1242de962bdSlukem typedef thread_key_t ldap_int_thread_key_t; 1252de962bdSlukem 1262de962bdSlukem #define HAVE_REENTRANT_FUNCTIONS 1 1272de962bdSlukem 1282de962bdSlukem #ifdef HAVE_THR_GETCONCURRENCY 1292de962bdSlukem #define LDAP_THREAD_HAVE_GETCONCURRENCY 1 1302de962bdSlukem #endif 1312de962bdSlukem #ifdef HAVE_THR_SETCONCURRENCY 1322de962bdSlukem #define LDAP_THREAD_HAVE_SETCONCURRENCY 1 1332de962bdSlukem #endif 1342de962bdSlukem 135d11b170bStron #ifndef LDAP_INT_MUTEX_NULL 136d11b170bStron #define LDAP_INT_MUTEX_NULL DEFAULTMUTEX 137d11b170bStron #define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) 138d11b170bStron #endif 1392de962bdSlukem 1402de962bdSlukem #elif defined(HAVE_NT_THREADS) 1412de962bdSlukem /************************************* 1422de962bdSlukem * * 1432de962bdSlukem * thread definitions for NT threads * 1442de962bdSlukem * * 1452de962bdSlukem *************************************/ 1462de962bdSlukem 1472de962bdSlukem #include <process.h> 1482de962bdSlukem #include <windows.h> 1492de962bdSlukem 1502de962bdSlukem LDAP_BEGIN_DECL 1512de962bdSlukem 1522de962bdSlukem typedef unsigned long ldap_int_thread_t; 1532de962bdSlukem typedef HANDLE ldap_int_thread_mutex_t; 1542de962bdSlukem typedef HANDLE ldap_int_thread_cond_t; 1552de962bdSlukem typedef DWORD ldap_int_thread_key_t; 1562de962bdSlukem 157255afcfeSchristos LDAP_F( int ) 158255afcfeSchristos ldap_int_mutex_firstcreate LDAP_P(( ldap_int_thread_mutex_t *mutex )); 159255afcfeSchristos 160d11b170bStron #ifndef LDAP_INT_MUTEX_NULL 161d11b170bStron #define LDAP_INT_MUTEX_NULL ((HANDLE)0) 162d11b170bStron #define LDAP_INT_MUTEX_FIRSTCREATE(m) \ 163255afcfeSchristos ldap_int_mutex_firstcreate(&(m)) 164d11b170bStron #endif 165d11b170bStron 1662de962bdSlukem LDAP_END_DECL 1672de962bdSlukem 1682de962bdSlukem #else 1692de962bdSlukem /*********************************** 1702de962bdSlukem * * 1712de962bdSlukem * thread definitions for no * 1722de962bdSlukem * underlying library support * 1732de962bdSlukem * * 1742de962bdSlukem ***********************************/ 1752de962bdSlukem 1762de962bdSlukem #ifndef NO_THREADS 1772de962bdSlukem #define NO_THREADS 1 1782de962bdSlukem #endif 1792de962bdSlukem 1802de962bdSlukem LDAP_BEGIN_DECL 1812de962bdSlukem 1822de962bdSlukem typedef int ldap_int_thread_t; 1832de962bdSlukem typedef int ldap_int_thread_mutex_t; 1842de962bdSlukem typedef int ldap_int_thread_cond_t; 1852de962bdSlukem typedef int ldap_int_thread_key_t; 1862de962bdSlukem 1872de962bdSlukem #define LDAP_THREAD_HAVE_TPOOL 1 1882de962bdSlukem typedef int ldap_int_thread_pool_t; 1892de962bdSlukem 190d11b170bStron #ifndef LDAP_INT_MUTEX_NULL 191d11b170bStron #define LDAP_INT_MUTEX_NULL 0 192d11b170bStron #define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) 193d11b170bStron #endif 194d11b170bStron 1952de962bdSlukem LDAP_END_DECL 1962de962bdSlukem 1972de962bdSlukem #endif /* no threads support */ 1982de962bdSlukem 1992de962bdSlukem 2002de962bdSlukem LDAP_BEGIN_DECL 2012de962bdSlukem 2022de962bdSlukem #ifndef ldap_int_thread_equal 2032de962bdSlukem #define ldap_int_thread_equal(a, b) ((a) == (b)) 2042de962bdSlukem #endif 2052de962bdSlukem 2062de962bdSlukem #ifndef LDAP_THREAD_HAVE_RDWR 2072de962bdSlukem typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t; 2082de962bdSlukem #endif 2092de962bdSlukem 2102de962bdSlukem LDAP_F(int) ldap_int_thread_pool_startup ( void ); 2112de962bdSlukem LDAP_F(int) ldap_int_thread_pool_shutdown ( void ); 2122de962bdSlukem 2132de962bdSlukem #ifndef LDAP_THREAD_HAVE_TPOOL 2142de962bdSlukem typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t; 2152de962bdSlukem #endif 2162de962bdSlukem LDAP_END_DECL 2172de962bdSlukem 2182de962bdSlukem 2192de962bdSlukem #if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U) 2202de962bdSlukem #define LDAP_THREAD_DEBUG_WRAP 1 2212de962bdSlukem #endif 2222de962bdSlukem 2232de962bdSlukem #ifdef LDAP_THREAD_DEBUG_WRAP 2242de962bdSlukem /************************************** 2252de962bdSlukem * * 2262de962bdSlukem * definitions for type-wrapped debug * 2272de962bdSlukem * * 2282de962bdSlukem **************************************/ 2292de962bdSlukem 2302de962bdSlukem LDAP_BEGIN_DECL 2312de962bdSlukem 2322de962bdSlukem #ifndef LDAP_UINTPTR_T /* May be configured in CPPFLAGS */ 2332de962bdSlukem #define LDAP_UINTPTR_T unsigned long 2342de962bdSlukem #endif 2352de962bdSlukem 2362de962bdSlukem typedef enum { 2372de962bdSlukem ldap_debug_magic = -(int) (((unsigned)-1)/19) 2382de962bdSlukem } ldap_debug_magic_t; 2392de962bdSlukem 2402de962bdSlukem typedef enum { 2412de962bdSlukem /* Could fill in "locked" etc here later */ 2422de962bdSlukem ldap_debug_state_inited = (int) (((unsigned)-1)/11), 2432de962bdSlukem ldap_debug_state_destroyed 2442de962bdSlukem } ldap_debug_state_t; 2452de962bdSlukem 2462de962bdSlukem typedef struct { 2472de962bdSlukem /* Enclosed in magic numbers in the hope of catching overwrites */ 2482de962bdSlukem ldap_debug_magic_t magic; /* bit pattern to recognize usages */ 2492de962bdSlukem LDAP_UINTPTR_T self; /* ~(LDAP_UINTPTR_T)&(this struct) */ 2502de962bdSlukem union ldap_debug_mem_u { /* Dummy memory reference */ 2512de962bdSlukem unsigned char *ptr; 2522de962bdSlukem LDAP_UINTPTR_T num; 2532de962bdSlukem } mem; 2542de962bdSlukem ldap_debug_state_t state; /* doubles as another magic number */ 2552de962bdSlukem } ldap_debug_usage_info_t; 2562de962bdSlukem 2572de962bdSlukem typedef struct { 2582de962bdSlukem ldap_int_thread_mutex_t wrapped; 2592de962bdSlukem ldap_debug_usage_info_t usage; 2602de962bdSlukem ldap_int_thread_t owner; 2612de962bdSlukem } ldap_debug_thread_mutex_t; 2622de962bdSlukem 263d11b170bStron #define LDAP_DEBUG_MUTEX_NULL {LDAP_INT_MUTEX_NULL, {0,0,{0},0} /*,owner*/} 264d11b170bStron #define LDAP_DEBUG_MUTEX_FIRSTCREATE(m) \ 265d11b170bStron ((void) ((m).usage.state || ldap_pvt_thread_mutex_init(&(m)))) 266d11b170bStron 2672de962bdSlukem typedef struct { 2682de962bdSlukem ldap_int_thread_cond_t wrapped; 2692de962bdSlukem ldap_debug_usage_info_t usage; 2702de962bdSlukem } ldap_debug_thread_cond_t; 2712de962bdSlukem 2722de962bdSlukem typedef struct { 2732de962bdSlukem ldap_int_thread_rdwr_t wrapped; 2742de962bdSlukem ldap_debug_usage_info_t usage; 2752de962bdSlukem } ldap_debug_thread_rdwr_t; 2762de962bdSlukem 2772de962bdSlukem #ifndef NDEBUG 2782de962bdSlukem #define LDAP_INT_THREAD_ASSERT_MUTEX_OWNER(mutex) \ 2792de962bdSlukem ldap_debug_thread_assert_mutex_owner( \ 2802de962bdSlukem __FILE__, __LINE__, "owns(" #mutex ")", mutex ) 2812de962bdSlukem LDAP_F(void) ldap_debug_thread_assert_mutex_owner LDAP_P(( 2822de962bdSlukem LDAP_CONST char *file, 2832de962bdSlukem int line, 2842de962bdSlukem LDAP_CONST char *msg, 2852de962bdSlukem ldap_debug_thread_mutex_t *mutex )); 2862de962bdSlukem #endif /* NDEBUG */ 2872de962bdSlukem 2882de962bdSlukem LDAP_END_DECL 2892de962bdSlukem 2902de962bdSlukem #endif /* LDAP_THREAD_DEBUG_WRAP */ 2912de962bdSlukem 2922de962bdSlukem #endif /* _LDAP_INT_THREAD_H */ 293