xref: /netbsd-src/external/bsd/openldap/dist/include/ldap_int_thread.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
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