diff --git a/include/ldap_int_thread.h b/include/ldap_int_thread.h index f021415934..07fbd67e7b 100644 --- a/include/ldap_int_thread.h +++ b/include/ldap_int_thread.h @@ -152,10 +152,13 @@ typedef HANDLE ldap_int_thread_mutex_t; typedef HANDLE ldap_int_thread_cond_t; typedef DWORD ldap_int_thread_key_t; +LDAP_F( int ) +ldap_pvt_thread_mutex_init_first LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + #ifndef LDAP_INT_MUTEX_NULL #define LDAP_INT_MUTEX_NULL ((HANDLE)0) #define LDAP_INT_MUTEX_FIRSTCREATE(m) \ - ((void) ((m) || ldap_pvt_thread_mutex_init(&(m)))) + ldap_pvt_thread_mutex_init_first(&(m)) #endif LDAP_END_DECL diff --git a/libraries/libldap_r/thr_nt.c b/libraries/libldap_r/thr_nt.c index 6ff8efcab9..0c1b36d95c 100644 --- a/libraries/libldap_r/thr_nt.c +++ b/libraries/libldap_r/thr_nt.c @@ -161,6 +161,17 @@ ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex ) return ( 0 ); } +int +ldap_pvt_thread_mutex_init_first( ldap_pvt_thread_mutex_t *mutex ) +{ + if ( *mutex == NULL ) { + HANDLE p = CreateMutex( NULL, 0, NULL ); + if ( InterlockedCompareExchangePointer((PVOID*)mutex, (PVOID)p, NULL) != NULL) + CloseHandle( p ); + } + return ( 0 ); +} + int ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_t *mutex ) {