Re: dumb apr_pool question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 11, 2018 at 3:05 PM, Eric Covener <covener@xxxxxxxxx> wrote:
> On Thu, Jan 11, 2018 at 3:55 AM, Simon Walter <simon@xxxxxxxxxx> wrote:
>>
>> I suppose that the pool is keeping track of all it's allocations and if
>> something is still referenced, it will not free it.
>
> No the only tracking is done by whoever manages the lifecycle of the
> pool itself -- no magic.
>
> apr_pool_destroy will call free() or munmap or any underlying
> allocation on the way out, returning it to the OS.

Actually the memory is returned to the (apr_)allocator, which itself
may cache for further reuse.
One can use apr_allocator_max_free_set() to limit the number of pages
cached (no limit by default), e.g. something like the following code
based on Simon's (not even compile tested...):

int main(int ArgCount, char * Arg[])
{
    char * String;
    apr_pool_t * Pool = NULL;
    apr_allocator_t * Alloc = NULL;
    apr_initialize();

    /* New allocator (not the default/unlimited one) */
    apr_allocator_create(&Alloc);
    /* Cache one page only (may be 4K pages, not system's),
     * zero is unlimited, so the cache is always 1 page min... */
    apr_allocator_max_free_set(Alloc, 1/*page*/);
    /* Use this allocator for the pool */
    apr_pool_create_ex(&Pool, NULL, NULL, Alloc);
    /* Destroy Alloc when destroying Pool */
    apr_allocator_owner_set(Alloc, Pool);


    /* Won't crash (possibly), don't do that for real... */
    String = apr_pstrdup(Pool, "small alloc");
    apr_pool_clear(Pool);
    printf("String: %s\n", String);

    /* Should crash */
    (void)apr_palloc(Pool, 4100);
    (void)apr_palloc(Pool, 4100);
    (void)apr_palloc(Pool, 4100);
    String = apr_pstrdup(Pool, "small alloc");
    apr_pool_clear(Pool);
    printf("String: %s\n", String);

    /* Should also crash */
    String = apr_pstrdup(Pool, "small alloc");
    apr_pool_destroy(Pool); /* + Alloc */
    printf("String: %s\n", String);

    apr_terminate();
    return 0;
}

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@xxxxxxxxxxxxxxxx
For additional commands, e-mail: users-help@xxxxxxxxxxxxxxxx




[Index of Archives]     [Open SSH Users]     [Linux ACPI]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Squid]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux