]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/util-int.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / libraries / libldap / util-int.c
index 3826d15e3294a1c9a0da48c739dc18a853089ead..df5ec0bfe23bdf0e07416ca2cb75c9badd14e9fd 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2010 The OpenLDAP Foundation.
+ * Copyright 1998-2014 The OpenLDAP Foundation.
  * Portions Copyright 1998 A. Hartgers.
  * All rights reserved.
  *
@@ -58,6 +58,8 @@ extern int h_errno;
 #else
 # include <ldap_pvt_thread.h>
   ldap_pvt_thread_mutex_t ldap_int_resolv_mutex;
+  ldap_pvt_thread_mutex_t ldap_int_hostname_mutex;
+  static ldap_pvt_thread_mutex_t ldap_int_gettime_mutex;
 
 # if (defined( HAVE_CTIME_R ) || defined( HAVE_REENTRANT_FUNCTIONS)) \
         && defined( CTIME_R_NARGS )
@@ -122,7 +124,7 @@ ldap_pvt_gmtime_lock( void )
 # ifndef LDAP_R_COMPILE
        return 0;
 # else /* LDAP_R_COMPILE */
-       return LDAP_MUTEX_LOCK( &ldap_int_gmtime_mutex );
+       return ldap_pvt_thread_mutex_lock( &ldap_int_gmtime_mutex );
 # endif /* LDAP_R_COMPILE */
 }
 
@@ -132,7 +134,7 @@ ldap_pvt_gmtime_unlock( void )
 # ifndef LDAP_R_COMPILE
        return 0;
 # else /* LDAP_R_COMPILE */
-       return LDAP_MUTEX_UNLOCK( &ldap_int_gmtime_mutex );
+       return ldap_pvt_thread_mutex_unlock( &ldap_int_gmtime_mutex );
 # endif /* LDAP_R_COMPILE */
 }
 #endif /* !USE_GMTIME_R || !USE_LOCALTIME_R */
@@ -178,7 +180,6 @@ ldap_pvt_localtime( const time_t *timep, struct tm *result )
 #endif /* !USE_LOCALTIME_R */
 
 /* return a broken out time, with microseconds
- * Must be mutex-protected.
  */
 #ifdef _WIN32
 /* Windows SYSTEMTIME only has 10 millisecond resolution, so we
@@ -201,12 +202,14 @@ ldap_pvt_gettime( struct lutil_tm *tm )
        /* It shouldn't ever go backwards, but multiple CPUs might
         * be able to hit in the same tick.
         */
+       LDAP_MUTEX_LOCK( &ldap_int_gettime_mutex );
        if ( count.QuadPart <= prevCount.QuadPart ) {
                subs++;
        } else {
                subs = 0;
                prevCount = count;
        }
+       LDAP_MUTEX_UNLOCK( &ldap_int_gettime_mutex );
 
        /* We assume Windows has at least a vague idea of
         * when a second begins. So we align our microsecond count
@@ -270,13 +273,15 @@ ldap_pvt_gettime( struct lutil_tm *ltm )
        gettimeofday( &tv, NULL );
        t = tv.tv_sec;
 
+       LDAP_MUTEX_LOCK( &ldap_int_gettime_mutex );
        if ( tv.tv_sec < prevTv.tv_sec
-               || ( tv.tv_sec == prevTv.tv_sec && tv.tv_usec == prevTv.tv_usec )) {
+               || ( tv.tv_sec == prevTv.tv_sec && tv.tv_usec <= prevTv.tv_usec )) {
                subs++;
        } else {
                subs = 0;
                prevTv = tv;
        }
+       LDAP_MUTEX_UNLOCK( &ldap_int_gettime_mutex );
 
        ltm->tm_usub = subs;
 
@@ -603,9 +608,10 @@ void ldap_int_utils_init( void )
 #endif
        ldap_pvt_thread_mutex_init( &ldap_int_resolv_mutex );
 
-#ifdef HAVE_CYRUS_SASL
-       ldap_pvt_thread_mutex_init( &ldap_int_sasl_mutex );
-#endif
+       ldap_pvt_thread_mutex_init( &ldap_int_hostname_mutex );
+
+       ldap_pvt_thread_mutex_init( &ldap_int_gettime_mutex );
+
 #ifdef HAVE_GSSAPI
        ldap_pvt_thread_mutex_init( &ldap_int_gssapi_mutex );
 #endif
@@ -773,7 +779,9 @@ char *ldap_pvt_gai_strerror (int code) {
                { EAI_NONAME, N_("Name or service not known") },
                { EAI_SERVICE, N_("Servname not supported for ai_socktype") },
                { EAI_SOCKTYPE, N_("ai_socktype not supported") },
+#ifdef EAI_SYSTEM
                { EAI_SYSTEM, N_("System error") },
+#endif
                { 0, NULL }
        };