On Thu, Jan 17, 2019 at 12:10 PM Stefan Sperling <s...@stsp.name> 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 <s...@stsp.name> 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.

Reply via email to