LDAP_END_DECL
+LDAP_BEGIN_DECL
+typedef struct ldap_int_thread_rmutex_s * ldap_int_thread_rmutex_t;
+LDAP_END_DECL
#ifndef _LDAP_INT_THREAD_H
#define _LDAP_INT_THREAD_H
LDAP_BEGIN_DECL
+#define LDAP_THREAD_HAVE_NATIVE_RECURSIVE_MUTEX
typedef pthread_t ldap_int_thread_t;
+typedef pthread_mutex_t ldap_int_thread_mutex_recursive_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;
LDAP_BEGIN_DECL
typedef cthread_t ldap_int_thread_t;
+typedef ldap_int_thread_rmutex_t ldap_int_thread_mutex_recursive_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_BEGIN_DECL
+#define LDAP_THREAD_HAVE_NATIVE_RECURSIVE_MUTEX
typedef pth_t ldap_int_thread_t;
+typedef pth_mutex_t ldap_int_thread_mutex_recursive_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;
LDAP_BEGIN_DECL
+#define LDAP_THREAD_HAVE_NATIVE_RECURSIVE_MUTEX
typedef thread_t ldap_int_thread_t;
+typedef mutex_t ldap_int_thread_mutex_recursive_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;
LDAP_BEGIN_DECL
+#define LDAP_THREAD_HAVE_NATIVE_RECURSIVE_MUTEX
typedef unsigned long ldap_int_thread_t;
+typedef HANDLE ldap_int_thread_mutex_recursive_t;
typedef HANDLE ldap_int_thread_mutex_t;
typedef HANDLE ldap_int_thread_cond_t;
typedef DWORD ldap_int_thread_key_t;
LDAP_BEGIN_DECL
+#define LDAP_THREAD_HAVE_NATIVE_RECURSIVE_MUTEX
typedef int ldap_int_thread_t;
+typedef int ldap_int_thread_mutex_recursive_t;
typedef int ldap_int_thread_mutex_t;
typedef int ldap_int_thread_cond_t;
typedef int ldap_int_thread_key_t;
#ifndef LDAP_THREAD_HAVE_TPOOL
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
#define LDAP_PVT_MUTEX_FIRSTCREATE LDAP_INT_MUTEX_FIRSTCREATE
#define LDAP_PVT_MUTEX_NULL LDAP_INT_MUTEX_NULL
#endif
+typedef ldap_int_thread_mutex_recursive_t ldap_pvt_thread_mutex_recursive_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 */
LDAP_F( int )
ldap_pvt_thread_mutex_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
+LDAP_F( int )
+ldap_pvt_thread_mutex_recursive_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
+
LDAP_F( int )
ldap_pvt_thread_mutex_destroy LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
+LDAP_F( int )
+ldap_pvt_thread_mutex_recursive_destroy LDAP_P(( ldap_pvt_thread_mutex_recursive_t *mutex ));
+
LDAP_F( int )
ldap_pvt_thread_mutex_lock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
LDAP_F( int )
ldap_pvt_thread_mutex_unlock LDAP_P(( ldap_pvt_thread_mutex_t *mutex ));
+LDAP_F( int )
+ldap_pvt_thread_mutex_recursive_lock LDAP_P(( ldap_pvt_thread_mutex_recursive_t *mutex ));
+
+LDAP_F( int )
+ldap_pvt_thread_mutex_recursive_trylock LDAP_P(( ldap_pvt_thread_mutex_recursive_t *mutex ));
+
+LDAP_F( int )
+ldap_pvt_thread_mutex_recursive_unlock LDAP_P(( ldap_pvt_thread_mutex_recursive_t *mutex ));
+
LDAP_F( int )
ldap_pvt_thread_rmutex_init LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex ));
return mutex_try_lock( mutex );
}
+int ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_recursive_t *mutex )
+{
+ return ldap_pvt_thread_rmutex_init( mutex );
+}
+
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+{
+ return ldap_pvt_thread_rmutex_destroy( mutex );
+}
+
+int
+ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+{
+ return ldap_pvt_thread_rmutex_lock( mutex, ldap_pvt_thread_self() );
+}
+
+int
+ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+{
+ return ldap_pvt_thread_rmutex_unlock( mutex, ldap_pvt_thread_self() );
+}
+
+int
+ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mp )
+{
+ return ldap_pvt_thread_rmutex_trylock( mp, ldap_pvt_thread_self() );
+}
+
ldap_pvt_thread_t
ldap_pvt_thread_self( void )
{
? -1 : 0;
}
+int ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_init")));
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_destroy")));
+int ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_lock")));
+int ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_trylock")));
+int ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_unlock")));
+
ldap_pvt_thread_t
ldap_pvt_thread_self( void )
{
# define LDAP_INT_THREAD_MUTEXATTR_DEFAULT &mutex_attr
#endif
+static pthread_mutexattr_t mutex_attr_recursive;
+
#if HAVE_PTHREADS < 7
#define ERRVAL(val) ((val) < 0 ? errno : 0)
#else
pthread_mutexattr_init( &mutex_attr );
pthread_mutexattr_settype( &mutex_attr, LDAP_INT_THREAD_MUTEXATTR );
#endif
+ if (pthread_mutexattr_init(&mutex_attr_recursive))
+ return -1;
+ if (pthread_mutexattr_settype(&mutex_attr_recursive, PTHREAD_MUTEX_RECURSIVE))
+ return -1;
return 0;
}
#ifdef LDAP_INT_THREAD_MUTEXATTR
pthread_mutexattr_destroy( &mutex_attr );
#endif
+ pthread_mutexattr_destroy( &mutex_attr_recursive );
return 0;
}
return ERRVAL( pthread_mutex_unlock( mutex ) );
}
+int
+ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_t *mutex )
+{
+ return ERRVAL( pthread_mutex_init( mutex, &mutex_attr_recursive ) );
+}
+
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_destroy")));
+int ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_lock")));
+int ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_trylock")));
+int ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_unlock")));
+
ldap_pvt_thread_t ldap_pvt_thread_self( void )
{
return pthread_self();
return( pth_mutex_init( mutex ) ? 0 : errno );
}
+int
+ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_t *mutex )
+{
+ /* All pth mutexes are recursive */
+ return ldap_pvt_thread_mutex_init( mutex );
+}
+
int
ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
{
return( pth_mutex_acquire( mutex, 1, NULL ) ? 0 : errno );
}
+int ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_init")));
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_destroy")));
+int ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_lock")));
+int ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_trylock")));
+int ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_unlock")));
+
ldap_pvt_thread_t
ldap_pvt_thread_self( void )
{
return 0;
}
+int
+ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_t *mutex )
+{
+ return 0;
+}
+
int
ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
{
return 0;
}
+int ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_init")));
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_destroy")));
+int ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_lock")));
+int ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_trylock")));
+int ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_unlock")));
+
/*
* NO_THREADS requires a separate tpool implementation since
* generic ldap_pvt_thread_pool_wrapper loops forever.
return( mutex_trylock( mp ) );
}
+int
+ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_recursive_t *mutex )
+{
+ return( mutex_init( mutex, USYNC_THREAD | LOCK_RECURSIVE, NULL ) );
+}
+
+int ldap_pvt_thread_mutex_recursive_destroy( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_destroy")));
+int ldap_pvt_thread_mutex_recursive_lock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_lock")));
+int ldap_pvt_thread_mutex_recursive_trylock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_trylock")));
+int ldap_pvt_thread_mutex_recursive_unlock( ldap_pvt_thread_mutex_recursive_t *mutex )
+ LDAP_GCCATTR((alias("ldap_pvt_thread_mutex_unlock")));
+
ldap_pvt_thread_t
ldap_pvt_thread_self( void )
{