X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fldap_int_thread.h;h=46c79ae8de6d59b29b63961d5dd23c22070dd80f;hb=5714f8565ff4228270ed2c97f78f5b31ce085b6e;hp=5da7f13c176816f119170d49c443f68869cb6726;hpb=f192014c1a738f51bcc1b0fd91909ad234eea91f;p=openldap diff --git a/include/ldap_int_thread.h b/include/ldap_int_thread.h index 5da7f13c17..46c79ae8de 100644 --- a/include/ldap_int_thread.h +++ b/include/ldap_int_thread.h @@ -1,20 +1,32 @@ +/* ldap_int_thread.h - ldap internal thread wrappers header file */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, Redwood City, California, USA +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * - * Redistribution and use in source and binary forms are permitted only - * as authorized by the OpenLDAP Public License. A copy of this - * license is available at http://www.OpenLDAP.org/license.html or - * in file LICENSE in the top-level directory of the distribution. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* ldap_int_thread.h - ldap internal thread wrappers header file */ + + +LDAP_BEGIN_DECL + +/* Can be done twice in libldap_r. See libldap_r/ldap_thr_debug.h. */ +LDAP_F(int) ldap_int_thread_initialize LDAP_P(( void )); +LDAP_F(int) ldap_int_thread_destroy LDAP_P(( void )); + +LDAP_END_DECL + #ifndef _LDAP_INT_THREAD_H #define _LDAP_INT_THREAD_H -#include "ldap_cdefs.h" - #if defined( HAVE_PTHREADS ) /********************************** * * @@ -33,6 +45,8 @@ typedef pthread_t ldap_int_thread_t; typedef pthread_mutex_t ldap_int_thread_mutex_t; typedef pthread_cond_t ldap_int_thread_cond_t; +#define ldap_int_thread_equal(a, b) pthread_equal((a), (b)) + #if defined( _POSIX_REENTRANT_FUNCTIONS ) || \ defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \ defined( _POSIX_THREADSAFE_FUNCTIONS ) @@ -41,17 +55,17 @@ typedef pthread_cond_t ldap_int_thread_cond_t; #if defined( HAVE_PTHREAD_GETCONCURRENCY ) || \ defined( HAVE_THR_GETCONCURRENCY ) -#define HAVE_GETCONCURRENCY 1 +#define LDAP_THREAD_HAVE_GETCONCURRENCY 1 #endif #if defined( HAVE_PTHREAD_SETCONCURRENCY ) || \ defined( HAVE_THR_SETCONCURRENCY ) -#define HAVE_SETCONCURRENCY 1 +#define LDAP_THREAD_HAVE_SETCONCURRENCY 1 #endif -#if defined( HAVE_PTHREAD_RWLOCK_DESTROY ) +#if 0 && defined( HAVE_PTHREAD_RWLOCK_DESTROY ) #define LDAP_THREAD_HAVE_RDWR 1 -typedef pthread_rwlock_t ldap_pvt_thread_rdwr_t; +typedef pthread_rwlock_t ldap_int_thread_rdwr_t; #endif LDAP_END_DECL @@ -63,7 +77,11 @@ LDAP_END_DECL * * **********************************/ -#include +#if defined( HAVE_MACH_CTHREADS_H ) +# include +#elif defined( HAVE_CTHREAD_H +# include +#endif LDAP_BEGIN_DECL @@ -89,8 +107,12 @@ typedef pth_t ldap_int_thread_t; typedef pth_mutex_t ldap_int_thread_mutex_t; typedef pth_cond_t ldap_int_thread_cond_t; -LDAP_END_DECL +#if 0 +#define LDAP_THREAD_HAVE_RDWR 1 +typedef pth_rwlock_t ldap_int_thread_rdwr_t; +#endif +LDAP_END_DECL #elif defined( HAVE_THR ) /******************************************** @@ -111,10 +133,10 @@ typedef cond_t ldap_int_thread_cond_t; #define HAVE_REENTRANT_FUNCTIONS 1 #ifdef HAVE_THR_GETCONCURRENCY -#define HAVE_GETCONCURRENCY 1 +#define LDAP_THREAD_HAVE_GETCONCURRENCY 1 #endif #ifdef HAVE_THR_SETCONCURRENCY -#define HAVE_SETCONCURRENCY 1 +#define LDAP_THREAD_HAVE_SETCONCURRENCY 1 #endif LDAP_END_DECL @@ -128,6 +150,7 @@ LDAP_END_DECL #include #include +#define LDAP_THREAD_HAVE_SLEEP 1 LDAP_BEGIN_DECL @@ -144,12 +167,17 @@ typedef struct ldap_int_thread_lwp_cv ldap_int_thread_cond_t; LDAP_END_DECL #elif defined(HAVE_NT_THREADS) - -LDAP_BEGIN_DECL +/************************************* + * * + * thread definitions for NT threads * + * * + *************************************/ #include #include +LDAP_BEGIN_DECL + typedef unsigned long ldap_int_thread_t; typedef HANDLE ldap_int_thread_mutex_t; typedef HANDLE ldap_int_thread_cond_t; @@ -157,7 +185,6 @@ typedef HANDLE ldap_int_thread_cond_t; LDAP_END_DECL #else - /*********************************** * * * thread definitions for no * @@ -165,96 +192,112 @@ LDAP_END_DECL * * ***********************************/ -LDAP_BEGIN_DECL - #ifndef NO_THREADS #define NO_THREADS 1 #endif +LDAP_BEGIN_DECL + typedef int ldap_int_thread_t; typedef int ldap_int_thread_mutex_t; typedef int ldap_int_thread_cond_t; +#define LDAP_THREAD_HAVE_TPOOL 1 +typedef int ldap_int_thread_pool_t; + LDAP_END_DECL #endif /* no threads support */ -LDAP_BEGIN_DECL - -LIBLDAP_F( int ) -ldap_int_thread_initialize LDAP_P(( void )); -LIBLDAP_F( int ) -ldap_int_thread_destroy LDAP_P(( void )); - -LIBLDAP_F( unsigned int ) -ldap_int_thread_sleep LDAP_P(( unsigned int s )); +LDAP_BEGIN_DECL -#ifdef HAVE_GETCONCURRENCY -LIBLDAP_F( int ) -ldap_int_thread_get_concurrency LDAP_P(( void )); +#ifndef ldap_int_thread_equal +#define ldap_int_thread_equal(a, b) ((a) == (b)) #endif -#ifdef HAVE_SETCONCURRENCY -# ifndef LDAP_THREAD_CONCURRENCY - /* three concurrent threads should be enough */ -# define LDAP_THREAD_CONCURRENCY 3 -# endif -LIBLDAP_F( int ) -ldap_int_thread_set_concurrency LDAP_P(( int )); +#ifndef LDAP_THREAD_HAVE_RDWR +typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t; #endif -LIBLDAP_F( int ) -ldap_int_thread_create LDAP_P(( - ldap_int_thread_t * thread, - int detach, - void *(*start_routine)( void * ), - void *arg)); - -LIBLDAP_F( void ) -ldap_int_thread_exit LDAP_P(( void *retval )); +LDAP_F(int) ldap_int_thread_pool_startup ( void ); +LDAP_F(int) ldap_int_thread_pool_shutdown ( void ); -LIBLDAP_F( int ) -ldap_int_thread_join LDAP_P(( ldap_int_thread_t thread, void **status )); - -LIBLDAP_F( int ) -ldap_int_thread_kill LDAP_P(( ldap_int_thread_t thread, int signo )); - -LIBLDAP_F( int ) -ldap_int_thread_yield LDAP_P(( void )); - -LIBLDAP_F( int ) -ldap_int_thread_cond_init LDAP_P(( ldap_int_thread_cond_t *cond )); - -LIBLDAP_F( int ) -ldap_int_thread_cond_destroy LDAP_P(( ldap_int_thread_cond_t *cond )); - -LIBLDAP_F( int ) -ldap_int_thread_cond_signal LDAP_P(( ldap_int_thread_cond_t *cond )); +#ifndef LDAP_THREAD_HAVE_TPOOL +typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t; +#endif -LIBLDAP_F( int ) -ldap_int_thread_cond_broadcast LDAP_P(( ldap_int_thread_cond_t *cond )); +typedef struct ldap_int_thread_rmutex_s * ldap_int_thread_rmutex_t; +LDAP_END_DECL -LIBLDAP_F( int ) -ldap_int_thread_cond_wait LDAP_P(( - ldap_int_thread_cond_t *cond, - ldap_int_thread_mutex_t *mutex )); -LIBLDAP_F( int ) -ldap_int_thread_mutex_init LDAP_P(( ldap_int_thread_mutex_t *mutex )); +#if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U) +#define LDAP_THREAD_DEBUG_WRAP 1 +#endif -LIBLDAP_F( int ) -ldap_int_thread_mutex_destroy LDAP_P(( ldap_int_thread_mutex_t *mutex )); +#ifdef LDAP_THREAD_DEBUG_WRAP +/************************************** + * * + * definitions for type-wrapped debug * + * * + **************************************/ -LIBLDAP_F( int ) -ldap_int_thread_mutex_lock LDAP_P(( ldap_int_thread_mutex_t *mutex )); +LDAP_BEGIN_DECL -LIBLDAP_F( int ) -ldap_int_thread_mutex_trylock LDAP_P(( ldap_int_thread_mutex_t *mutex )); +#ifndef LDAP_UINTPTR_T /* May be configured in CPPFLAGS */ +#define LDAP_UINTPTR_T unsigned long +#endif -LIBLDAP_F( int ) -ldap_int_thread_mutex_unlock LDAP_P(( ldap_int_thread_mutex_t *mutex )); +typedef enum { + ldap_debug_magic = -(int) (((unsigned)-1)/19) +} ldap_debug_magic_t; + +typedef enum { + /* Could fill in "locked" etc here later */ + ldap_debug_state_inited = (int) (((unsigned)-1)/11), + ldap_debug_state_destroyed +} ldap_debug_state_t; + +typedef struct { + /* Enclosed in magic numbers in the hope of catching overwrites */ + ldap_debug_magic_t magic; /* bit pattern to recognize usages */ + LDAP_UINTPTR_T self; /* ~(LDAP_UINTPTR_T)&(this struct) */ + union ldap_debug_mem_u { /* Dummy memory reference */ + unsigned char *ptr; + LDAP_UINTPTR_T num; + } mem; + ldap_debug_state_t state; /* doubles as another magic number */ +} ldap_debug_usage_info_t; + +typedef struct { + ldap_int_thread_mutex_t wrapped; + ldap_debug_usage_info_t usage; + ldap_int_thread_t owner; +} ldap_debug_thread_mutex_t; + +typedef struct { + ldap_int_thread_cond_t wrapped; + ldap_debug_usage_info_t usage; +} ldap_debug_thread_cond_t; + +typedef struct { + ldap_int_thread_rdwr_t wrapped; + ldap_debug_usage_info_t usage; +} ldap_debug_thread_rdwr_t; + +#ifndef NDEBUG +#define LDAP_INT_THREAD_ASSERT_MUTEX_OWNER(mutex) \ + ldap_debug_thread_assert_mutex_owner( \ + __FILE__, __LINE__, "owns(" #mutex ")", mutex ) +LDAP_F(void) ldap_debug_thread_assert_mutex_owner LDAP_P(( + LDAP_CONST char *file, + int line, + LDAP_CONST char *msg, + ldap_debug_thread_mutex_t *mutex )); +#endif /* NDEBUG */ LDAP_END_DECL +#endif /* LDAP_THREAD_DEBUG_WRAP */ + #endif /* _LDAP_INT_THREAD_H */