Index: subversion/libsvn_ra_neon/session.c =================================================================== --- subversion/libsvn_ra_neon/session.c (revision 32490) +++ subversion/libsvn_ra_neon/session.c (working copy) @@ -39,6 +39,7 @@ #include "svn_time.h" #include "svn_xml.h" #include "svn_private_config.h" +#include "private/svn_atomic.h" #ifdef SVN_NEON_0_28 #include @@ -48,6 +49,8 @@ #define DEFAULT_HTTP_TIMEOUT 3600 +static volatile svn_atomic_t neon_initialized; + /* a cleanup routine attached to the pool that contains the RA session baton. */ @@ -962,6 +965,25 @@ } static svn_error_t * +initialize_neon(apr_pool_t* pool) +{ + /* pool = NULL */ + if (ne_sock_init() != 0) + return svn_error_create(SVN_ERR_RA_DAV_SOCK_INIT, NULL, + _("Network socket initialization failed")); + + return SVN_NO_ERROR; +} + +/* Initializes neon when not initialized before */ +static svn_error_t * +ensure_neon_initialized(void) +{ + SVN_ERR(svn_atomic__init_once(&neon_initialized, initialize_neon, NULL)); + return SVN_NO_ERROR; +} + +static svn_error_t * svn_ra_neon__open(svn_ra_session_t *session, const char *repos_URL, const svn_ra_callbacks2_t *callbacks, @@ -1000,10 +1022,8 @@ apr_pool_cleanup_register(pool, uri, cleanup_uri, apr_pool_cleanup_null); - /* Can we initialize network? */ - if (ne_sock_init() != 0) - return svn_error_create(SVN_ERR_RA_DAV_SOCK_INIT, NULL, - _("Network socket initialization failed")); + /* Initialize neon if required */ + SVN_ERR(ensure_neon_initialized()); /* we want to know if the repository is actually somewhere else */ /* ### not yet: http_redirect_register(sess, ... ); */