X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fldap_int_thread.h;h=759c951e22272946d806cff073acf35f4981f01d;hb=8fef28c0592e1c833ac1e3877493539a65cfc8de;hp=87e09fd5b6e5879ffa5f4262a672f25471ae4d19;hpb=feda953cc45e0a19e13866749e980bba89f9cea1;p=openldap diff --git a/include/ldap_int_thread.h b/include/ldap_int_thread.h index 87e09fd5b6..759c951e22 100644 --- a/include/ldap_int_thread.h +++ b/include/ldap_int_thread.h @@ -1,15 +1,28 @@ +/* ldap_int_thread.h - ldap internal thread wrappers header file */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2001 The OpenLDAP Foundation, Redwood City, California, USA +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2010 The OpenLDAP Foundation. * All rights reserved. * * 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 at - * http://www.OpenLDAP.org/license.html or in file LICENSE in the - * top-level directory of the distribution. + * 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 @@ -31,6 +44,9 @@ LDAP_BEGIN_DECL 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; +typedef pthread_key_t ldap_int_thread_key_t; + +#define ldap_int_thread_equal(a, b) pthread_equal((a), (b)) #if defined( _POSIX_REENTRANT_FUNCTIONS ) || \ defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \ @@ -48,9 +64,9 @@ typedef pthread_cond_t ldap_int_thread_cond_t; #define LDAP_THREAD_HAVE_SETCONCURRENCY 1 #endif -#if 0 && defined( HAVE_PTHREAD_RWLOCK_DESTROY ) +#if 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 @@ -64,7 +80,7 @@ LDAP_END_DECL #if defined( HAVE_MACH_CTHREADS_H ) # include -#elif defined( HAVE_CTHREAD_H +#elif defined( HAVE_CTHREADS_H ) # include #endif @@ -73,6 +89,7 @@ LDAP_BEGIN_DECL typedef cthread_t ldap_int_thread_t; typedef struct mutex ldap_int_thread_mutex_t; typedef struct condition ldap_int_thread_cond_t; +typedef cthread_key_t ldap_int_thread_key_t; LDAP_END_DECL @@ -91,10 +108,11 @@ LDAP_BEGIN_DECL 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; +typedef pth_key_t ldap_int_thread_key_t; #if 0 #define LDAP_THREAD_HAVE_RDWR 1 -typedef pth_rwlock_t ldap_pvt_thread_rdwr_t; +typedef pth_rwlock_t ldap_int_thread_rdwr_t; #endif LDAP_END_DECL @@ -114,6 +132,7 @@ LDAP_BEGIN_DECL typedef thread_t ldap_int_thread_t; typedef mutex_t ldap_int_thread_mutex_t; typedef cond_t ldap_int_thread_cond_t; +typedef thread_key_t ldap_int_thread_key_t; #define HAVE_REENTRANT_FUNCTIONS 1 @@ -152,6 +171,11 @@ typedef struct ldap_int_thread_lwp_cv ldap_int_thread_cond_t; LDAP_END_DECL #elif defined(HAVE_NT_THREADS) +/************************************* + * * + * thread definitions for NT threads * + * * + *************************************/ #include #include @@ -161,11 +185,11 @@ LDAP_BEGIN_DECL typedef unsigned long ldap_int_thread_t; typedef HANDLE ldap_int_thread_mutex_t; typedef HANDLE ldap_int_thread_cond_t; +typedef DWORD ldap_int_thread_key_t; LDAP_END_DECL #else - /*********************************** * * * thread definitions for no * @@ -182,6 +206,7 @@ LDAP_BEGIN_DECL typedef int ldap_int_thread_t; typedef int ldap_int_thread_mutex_t; typedef int ldap_int_thread_cond_t; +typedef int ldap_int_thread_key_t; #define LDAP_THREAD_HAVE_TPOOL 1 typedef int ldap_int_thread_pool_t; @@ -190,10 +215,17 @@ LDAP_END_DECL #endif /* no threads support */ + LDAP_BEGIN_DECL -LDAP_F(int) ldap_int_thread_initialize LDAP_P(( void )); -LDAP_F(int) ldap_int_thread_destroy LDAP_P(( void )); +#ifndef ldap_int_thread_equal +#define ldap_int_thread_equal(a, b) ((a) == (b)) +#endif + +#ifndef LDAP_THREAD_HAVE_RDWR +typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t; +#endif + LDAP_F(int) ldap_int_thread_pool_startup ( void ); LDAP_F(int) ldap_int_thread_pool_shutdown ( void ); @@ -201,6 +233,77 @@ LDAP_F(int) ldap_int_thread_pool_shutdown ( void ); typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t; #endif +typedef struct ldap_int_thread_rmutex_s * ldap_int_thread_rmutex_t; LDAP_END_DECL + +#if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U) +#define LDAP_THREAD_DEBUG_WRAP 1 +#endif + +#ifdef LDAP_THREAD_DEBUG_WRAP +/************************************** + * * + * definitions for type-wrapped debug * + * * + **************************************/ + +LDAP_BEGIN_DECL + +#ifndef LDAP_UINTPTR_T /* May be configured in CPPFLAGS */ +#define LDAP_UINTPTR_T unsigned long +#endif + +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 */