On 01.05.2015 19:11, Philip Martin wrote:
> Philip Martin <philip.mar...@wandisco.com> writes:
>
>> Philip Martin <philip.mar...@wandisco.com> writes:
>>
>>> Index: ../src-1.9/subversion/libsvn_ra/ra_loader.c
>>> ===================================================================
>>> --- ../src-1.9/subversion/libsvn_ra/ra_loader.c     (revision 1677108)
>>> +++ ../src-1.9/subversion/libsvn_ra/ra_loader.c     (working copy)
>>> @@ -355,7 +355,7 @@ svn_error_t *svn_ra_open4(svn_ra_session_t **sessi
>>>              /* Library not found. */
>>>              continue;
>>>  
>>> -          SVN_ERR(initfunc(svn_ra_version(), &vtable, scratch_pool));
>>> +          SVN_ERR(initfunc(svn_ra_version(), &vtable, sesspool));
>>>  
>>>            SVN_ERR(check_ra_version(vtable->get_version(), scheme));
>>>
>>> allows the initialize to work again.
>> For ra_local the initfunc is svn_ra_local__init and it contains a
>> comment:
>>
>> #ifndef SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL
>>   /* This assumes that POOL was the pool used to load the dso. */
>>   SVN_ERR(svn_fs_initialize(pool));
>> #endif
>>
>> Passing scratch_pool breaks the assumption in the comment since
>> scratch_pool was not used to load the DSO.
> Perhaps something like this:
>
> Index: subversion/include/private/svn_subr_private.h
> ===================================================================
> --- subversion/include/private/svn_subr_private.h     (revision 1677165)
> +++ subversion/include/private/svn_subr_private.h     (working copy)
> @@ -681,6 +681,10 @@ svn_boolean_t
>  svn_bit_array__get(svn_bit_array__t *array,
>                     apr_size_t idx);
>  
> +/* Return the global pool used the DSO loader, this pool may be NULL. */
> +apr_pool_t *
> +svn_dso__pool(void);
> +
>  /** @} */
>  
>  #ifdef __cplusplus
> Index: subversion/libsvn_ra_local/ra_plugin.c
> ===================================================================
> --- subversion/libsvn_ra_local/ra_plugin.c    (revision 1677165)
> +++ subversion/libsvn_ra_local/ra_plugin.c    (working copy)
> @@ -1869,7 +1869,7 @@ svn_ra_local__init(const svn_version_t *loader_ver
>  
>  #ifndef SVN_LIBSVN_CLIENT_LINKS_RA_LOCAL
>    /* This assumes that POOL was the pool used to load the dso. */
> -  SVN_ERR(svn_fs_initialize(pool));
> +  SVN_ERR(svn_fs_initialize(svn_dso__pool()));
>  #endif
>  
>    *vtable = &ra_local_vtable;
> Index: subversion/libsvn_subr/dso.c
> ===================================================================
> --- subversion/libsvn_subr/dso.c      (revision 1677165)
> +++ subversion/libsvn_subr/dso.c      (working copy)
> @@ -122,4 +122,11 @@ svn_dso_load(apr_dso_handle_t **dso, const char *f
>  
>    return SVN_NO_ERROR;
>  }
> +
> +apr_pool_t *
> +svn_dso__pool(void)
> +{
> +  return dso_pool;
> +}
> +
>  #endif /* APR_HAS_DSO */ 


This looks like a much better solution, yes. Strictly speaking, we'll
"leak" the shared FSFS structs into the DSO pool, but would have to use
a really unreasonable number of repositories from a single process
before this becomes a problem.

+1

-- Brane

Reply via email to