On Thu, Jan 17, 2019 at 12:10 PM Stefan Sperling <[email protected]> wrote:
>
> On Thu, Jan 17, 2019 at 12:04:37PM +0100, Yann Ylavic wrote:
> > On Tue, Jan 15, 2019 at 11:48 AM Stefan Sperling <[email protected]> wrote:
> > >
> > > On Tue, Jan 15, 2019 at 11:19:24AM +0100, Stefan Eissing wrote:
> > > > Would OpenBSD be happy with a setting (COMPILE FLAG) that forces
> > > > the immediate free() by allocators and otherwise skipping the DEBUG
> > > > flags?
> > >
> > > Yes, I think that would be great. I don't care about the pool debugging
> > > aspects as much as the benefits we get from direct use of our nalloc/free.
> >
> > How about "MaxMemFree 1" in OpenBSD's httpd then instead of compile
> > time APR_POOL_DEBUG?
>
> Thanks for the suggestion!
>
> Unfortunately, this would not help other applications using APR,
> such as Subversion clients. I'd rather not deploy application-level
> workarounds for behaviour of a library used by these applications.
OK, so an APR only option like this?
Index: srclib/apr/include/apr_allocator.h
===================================================================
--- srclib/apr/include/apr_allocator.h (revision 1800753)
+++ srclib/apr/include/apr_allocator.h (working copy)
@@ -65,6 +65,9 @@ struct apr_memnode_t {
/** Symbolic constants */
#define APR_ALLOCATOR_MAX_FREE_UNLIMITED 0
+#ifndef APR_ALLOCATOR_MAX_FREE_DEFAULT
+#define APR_ALLOCATOR_MAX_FREE_DEFAULT APR_ALLOCATOR_MAX_FREE_UNLIMITED
+#endif
/**
* Create a new allocator
Index: srclib/apr/memory/unix/apr_pools.c
===================================================================
--- srclib/apr/memory/unix/apr_pools.c (revision 1800753)
+++ srclib/apr/memory/unix/apr_pools.c (working copy)
@@ -127,8 +127,8 @@ struct apr_allocator_t {
apr_size_t max_index;
/** Total size (in BOUNDARY_SIZE multiples) of unused memory before
* blocks are given back. @see apr_allocator_max_free_set().
- * @note Initialized to APR_ALLOCATOR_MAX_FREE_UNLIMITED,
- * which means to never give back blocks.
+ * @note Initialized to APR_ALLOCATOR_MAX_FREE_DEFAULT,
+ * which by default means to never give back blocks.
*/
apr_size_t max_free_index;
/**
@@ -170,7 +170,7 @@ APR_DECLARE(apr_status_t) apr_allocator_create(apr
return APR_ENOMEM;
memset(new_allocator, 0, SIZEOF_ALLOCATOR_T);
- new_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_UNLIMITED;
+ new_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_DEFAULT;
*allocator = new_allocator;
@@ -1180,7 +1180,7 @@ APR_DECLARE(apr_status_t) apr_pool_create_unmanage
return APR_ENOMEM;
}
memset(pool_allocator, 0, SIZEOF_ALLOCATOR_T);
- pool_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_UNLIMITED;
+ pool_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_DEFAULT;
}
if ((node = allocator_alloc(pool_allocator,
MIN_ALLOC - APR_MEMNODE_T_SIZE)) == NULL) {
--
For "-D APR_ALLOCATOR_MAX_FREE_DEFAULT=.." to be usable at build time.
That one can possibly be upstreamed too.