Bug#47214: parseversion still leaking memory

2014-06-01 Thread Johannes Schauer
Hi,

whether the reason is the same I can't say but parseversion is still leaking
memory somehow:

#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  1; ++i) {
parseversion(ver, 1.0.0, NULL);
}
return 0;
}

$ gcc leak.c -ldpkg  /usr/bin/time -v ./a.out 21 | 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.

cheers, josch


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



Bug#47214: parseversion still leaking memory

2014-06-01 Thread Guillem Jover
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  1; ++i) {
 parseversion(ver, 1.0.0, NULL);
 }
 return 0;
 }
 
 $ gcc leak.c -ldpkg  /usr/bin/time -v ./a.out 21 | 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  1; ++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-dpkg-bugs-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org