]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/init.c
Merge remote branch 'origin/mdb.master'
[openldap] / libraries / libldap / init.c
index 16d8e9a3830c7ad4008681ff4095e4e1741b0ae9..0057978a05d79ad9147a686997b2b44e72614c72 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-2011 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,7 +36,7 @@
 #include "lutil.h"
 
 struct ldapoptions ldap_int_global_options =
-       { LDAP_UNINITIALIZED, LDAP_DEBUG_NONE };  
+       { LDAP_UNINITIALIZED, LDAP_DEBUG_NONE LDAP_LDO_MUTEX_NULLARG };  
 
 #define ATTR_NONE      0
 #define ATTR_BOOL      1
@@ -510,6 +510,15 @@ ldap_int_destroy_global_options(void)
  */
 void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl )
 {
+#ifdef LDAP_R_COMPILE
+       LDAP_PVT_MUTEX_FIRSTCREATE(gopts->ldo_mutex);
+#endif
+       LDAP_MUTEX_LOCK( &gopts->ldo_mutex );
+       if (gopts->ldo_valid == LDAP_INITIALIZED) {
+               /* someone else got here first */
+               LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
+               return;
+       }
        if (dbglvl)
            gopts->ldo_debug = *dbglvl;
        else
@@ -573,6 +582,7 @@ void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl
        gopts->ldo_keepalive_idle = 0;
 
        gopts->ldo_valid = LDAP_INITIALIZED;
+       LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
        return;
 }
 
@@ -616,7 +626,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
            return; 
        }
 }      /* The WinSock DLL is acceptable. Proceed. */
-#elif HAVE_WINSOCK
+#elif defined(HAVE_WINSOCK)
 {      WSADATA wsaData;
        if ( WSAStartup( 0x0101, &wsaData ) != 0 ) {
            return;