mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
Added native thread-specific data support
This commit is contained in:
parent
a9d35da834
commit
20c4e016fa
9 changed files with 177 additions and 3 deletions
|
|
@ -44,6 +44,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef pthread_t ldap_int_thread_t;
|
typedef pthread_t ldap_int_thread_t;
|
||||||
typedef pthread_mutex_t ldap_int_thread_mutex_t;
|
typedef pthread_mutex_t ldap_int_thread_mutex_t;
|
||||||
typedef pthread_cond_t ldap_int_thread_cond_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))
|
#define ldap_int_thread_equal(a, b) pthread_equal((a), (b))
|
||||||
|
|
||||||
|
|
@ -88,6 +89,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef cthread_t ldap_int_thread_t;
|
typedef cthread_t ldap_int_thread_t;
|
||||||
typedef struct mutex ldap_int_thread_mutex_t;
|
typedef struct mutex ldap_int_thread_mutex_t;
|
||||||
typedef struct condition ldap_int_thread_cond_t;
|
typedef struct condition ldap_int_thread_cond_t;
|
||||||
|
typedef cthread_key_t ldap_int_thread_key_t;
|
||||||
|
|
||||||
LDAP_END_DECL
|
LDAP_END_DECL
|
||||||
|
|
||||||
|
|
@ -106,6 +108,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef pth_t ldap_int_thread_t;
|
typedef pth_t ldap_int_thread_t;
|
||||||
typedef pth_mutex_t ldap_int_thread_mutex_t;
|
typedef pth_mutex_t ldap_int_thread_mutex_t;
|
||||||
typedef pth_cond_t ldap_int_thread_cond_t;
|
typedef pth_cond_t ldap_int_thread_cond_t;
|
||||||
|
typedef pth_key_t ldap_int_thread_key_t;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#define LDAP_THREAD_HAVE_RDWR 1
|
#define LDAP_THREAD_HAVE_RDWR 1
|
||||||
|
|
@ -129,6 +132,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef thread_t ldap_int_thread_t;
|
typedef thread_t ldap_int_thread_t;
|
||||||
typedef mutex_t ldap_int_thread_mutex_t;
|
typedef mutex_t ldap_int_thread_mutex_t;
|
||||||
typedef cond_t ldap_int_thread_cond_t;
|
typedef cond_t ldap_int_thread_cond_t;
|
||||||
|
typedef thread_key_t ldap_int_thread_key_t;
|
||||||
|
|
||||||
#define HAVE_REENTRANT_FUNCTIONS 1
|
#define HAVE_REENTRANT_FUNCTIONS 1
|
||||||
|
|
||||||
|
|
@ -181,6 +185,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef unsigned long ldap_int_thread_t;
|
typedef unsigned long ldap_int_thread_t;
|
||||||
typedef HANDLE ldap_int_thread_mutex_t;
|
typedef HANDLE ldap_int_thread_mutex_t;
|
||||||
typedef HANDLE ldap_int_thread_cond_t;
|
typedef HANDLE ldap_int_thread_cond_t;
|
||||||
|
typedef DWORD ldap_int_thread_key_t;
|
||||||
|
|
||||||
LDAP_END_DECL
|
LDAP_END_DECL
|
||||||
|
|
||||||
|
|
@ -201,6 +206,7 @@ LDAP_BEGIN_DECL
|
||||||
typedef int ldap_int_thread_t;
|
typedef int ldap_int_thread_t;
|
||||||
typedef int ldap_int_thread_mutex_t;
|
typedef int ldap_int_thread_mutex_t;
|
||||||
typedef int ldap_int_thread_cond_t;
|
typedef int ldap_int_thread_cond_t;
|
||||||
|
typedef int ldap_int_thread_key_t;
|
||||||
|
|
||||||
#define LDAP_THREAD_HAVE_TPOOL 1
|
#define LDAP_THREAD_HAVE_TPOOL 1
|
||||||
typedef int ldap_int_thread_pool_t;
|
typedef int ldap_int_thread_pool_t;
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ typedef ldap_int_thread_cond_t ldap_pvt_thread_cond_t;
|
||||||
typedef ldap_int_thread_rdwr_t ldap_pvt_thread_rdwr_t;
|
typedef ldap_int_thread_rdwr_t ldap_pvt_thread_rdwr_t;
|
||||||
#endif
|
#endif
|
||||||
typedef ldap_int_thread_rmutex_t ldap_pvt_thread_rmutex_t;
|
typedef ldap_int_thread_rmutex_t ldap_pvt_thread_rmutex_t;
|
||||||
|
typedef ldap_int_thread_key_t ldap_pvt_thread_key_t;
|
||||||
#endif /* !LDAP_PVT_THREAD_H_DONE */
|
#endif /* !LDAP_PVT_THREAD_H_DONE */
|
||||||
|
|
||||||
#define ldap_pvt_thread_equal ldap_int_thread_equal
|
#define ldap_pvt_thread_equal ldap_int_thread_equal
|
||||||
|
|
@ -169,6 +170,18 @@ ldap_pvt_thread_rdwr_wtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
|
||||||
LDAP_F( int )
|
LDAP_F( int )
|
||||||
ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
|
ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
|
||||||
|
|
||||||
|
LDAP_F( int )
|
||||||
|
ldap_pvt_thread_key_create LDAP_P((ldap_pvt_thread_key_t *keyp));
|
||||||
|
|
||||||
|
LDAP_F( int )
|
||||||
|
ldap_pvt_thread_key_destroy LDAP_P((ldap_pvt_thread_key_t key));
|
||||||
|
|
||||||
|
LDAP_F( int )
|
||||||
|
ldap_pvt_thread_key_setdata LDAP_P((ldap_pvt_thread_key_t key, void *data));
|
||||||
|
|
||||||
|
LDAP_F( int )
|
||||||
|
ldap_pvt_thread_key_getdata LDAP_P((ldap_pvt_thread_key_t key, void **data));
|
||||||
|
|
||||||
#ifdef LDAP_DEBUG
|
#ifdef LDAP_DEBUG
|
||||||
LDAP_F( int )
|
LDAP_F( int )
|
||||||
ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
|
ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp));
|
||||||
|
|
|
||||||
|
|
@ -153,4 +153,28 @@ ldap_pvt_thread_self( void )
|
||||||
return cthread_self();
|
return cthread_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
|
||||||
|
{
|
||||||
|
return cthread_keycreate( key );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return cthread_setspecific( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
return cthread_getspecific( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HAVE_MACH_CTHREADS */
|
#endif /* HAVE_MACH_CTHREADS */
|
||||||
|
|
|
||||||
|
|
@ -198,4 +198,37 @@ ldap_pvt_thread_self( void )
|
||||||
return GetCurrentThreadId();
|
return GetCurrentThreadId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *keyp )
|
||||||
|
{
|
||||||
|
DWORD key = TlsAlloc();
|
||||||
|
if ( key != TLS_OUT_OF_INDEXES ) {
|
||||||
|
*keyp = key;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
/* TlsFree returns 0 on failure */
|
||||||
|
return( TlsFree( key ) == 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return ( TlsSetValue( key, data ) == 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
void *ptr = TlsGetValue( key );
|
||||||
|
*data = ptr;
|
||||||
|
return( ptr ? GetLastError() : 0 );
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -312,6 +312,31 @@ ldap_pvt_thread_t ldap_pvt_thread_self( void )
|
||||||
return pthread_self();
|
return pthread_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
|
||||||
|
{
|
||||||
|
return pthread_key_create( key, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
return pthread_key_delete( key );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return pthread_setspecific( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
*data = pthread_getspecific( key );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef LDAP_THREAD_HAVE_RDWR
|
#ifdef LDAP_THREAD_HAVE_RDWR
|
||||||
#ifdef HAVE_PTHREAD_RWLOCK_DESTROY
|
#ifdef HAVE_PTHREAD_RWLOCK_DESTROY
|
||||||
int
|
int
|
||||||
|
|
|
||||||
|
|
@ -159,6 +159,31 @@ ldap_pvt_thread_self( void )
|
||||||
return pth_self();
|
return pth_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
|
||||||
|
{
|
||||||
|
return pth_key_create( key, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
return pth_key_delete( key );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return pth_key_setdata( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
*data = pth_key_getdata( key );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef LDAP_THREAD_HAVE_RDWR
|
#ifdef LDAP_THREAD_HAVE_RDWR
|
||||||
int
|
int
|
||||||
ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
|
ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,30 @@ ldap_pvt_thread_self( void )
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
ldap_pvt_thread_t
|
ldap_pvt_thread_t
|
||||||
ldap_pvt_thread_pool_tid( void *vctx )
|
ldap_pvt_thread_pool_tid( void *vctx )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -159,4 +159,28 @@ ldap_pvt_thread_self( void )
|
||||||
return thr_self();
|
return thr_self();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
|
||||||
|
{
|
||||||
|
return thr_keycreate( key, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
|
||||||
|
{
|
||||||
|
return thr_setspecific( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
|
||||||
|
{
|
||||||
|
return thr_getspecific( key, data );
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HAVE_THR */
|
#endif /* HAVE_THR */
|
||||||
|
|
|
||||||
|
|
@ -38,11 +38,11 @@ typedef enum ldap_int_thread_pool_state_e {
|
||||||
} ldap_int_thread_pool_state_t;
|
} ldap_int_thread_pool_state_t;
|
||||||
|
|
||||||
/* Thread-specific key with data and optional free function */
|
/* Thread-specific key with data and optional free function */
|
||||||
typedef struct ldap_int_thread_key_s {
|
typedef struct ldap_int_tpool_key_s {
|
||||||
void *ltk_key;
|
void *ltk_key;
|
||||||
void *ltk_data;
|
void *ltk_data;
|
||||||
ldap_pvt_thread_pool_keyfree_t *ltk_free;
|
ldap_pvt_thread_pool_keyfree_t *ltk_free;
|
||||||
} ldap_int_thread_key_t;
|
} ldap_int_tpool_key_t;
|
||||||
|
|
||||||
/* Max number of thread-specific keys we store per thread.
|
/* Max number of thread-specific keys we store per thread.
|
||||||
* We don't expect to use many...
|
* We don't expect to use many...
|
||||||
|
|
@ -55,7 +55,7 @@ typedef struct ldap_int_thread_key_s {
|
||||||
/* Context: thread ID and thread-specific key/data pairs */
|
/* Context: thread ID and thread-specific key/data pairs */
|
||||||
typedef struct ldap_int_thread_userctx_s {
|
typedef struct ldap_int_thread_userctx_s {
|
||||||
ldap_pvt_thread_t ltu_id;
|
ldap_pvt_thread_t ltu_id;
|
||||||
ldap_int_thread_key_t ltu_key[MAXKEYS];
|
ldap_int_tpool_key_t ltu_key[MAXKEYS];
|
||||||
} ldap_int_thread_userctx_t;
|
} ldap_int_thread_userctx_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue