Hi!

On Sun, 2014-06-01 at 09:13:08 +0200, Johannes Schauer wrote:
> whether the reason is the same I can't say but parseversion is still leaking
> memory somehow:

It is still the same, it boils down to the way dpkg works and what
it has historically needed. So the database parsing code uses a
non-freeing memory allocator, think of it as an arena allocator.

> #define LIBDPKG_VOLATILE_API 1
> #include <dpkg/dpkg.h>
> #include <dpkg/version.h>
> 
> int main()
> {
>     struct dpkg_version ver;
>     int i;
>     for (i = 0; i < 100000000; ++i) {
>         parseversion(&ver, "1.0.0", NULL);
>     }
>     return 0;
> }
> 
> $ gcc leak.c -ldpkg && /usr/bin/time -v ./a.out 2>&1 | grep Maximum
>       Maximum resident set size (kbytes): 1569096
> 
> Just as the original submitter I wanted to use parseversion to parse *LOTS* of
> versions. My plans where thwarted when I discovered the memory leak.

I've got some code around to add support for custom allocators, but it
needs a major overhaul of the code. Meanwhile, as a workaround, you
could release the arena every N iterations, with something like:

,---
#define LIBDPKG_VOLATILE_API 1
#include <dpkg/dpkg.h>
#include <dpkg/version.h>

int main()
{
    struct dpkg_version ver;
    int i;
    for (i = 0; i < 100000000; ++i) {
        parseversion(&ver, "1.0.0", NULL);
        if (i % 1000)
            nffreeall();
    }
    return 0;
}
`---

But, take into account this will free all the dpkg database memory.

Thanks,
Guillem


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to