[geos-devel] An Immodest Proposal
Chris Hodgson
chodgson at refractions.net
Tue Sep 30 12:55:28 EDT 2008
Very nice Paul.
Those two std allocs are a bit scary... I had a feeling we might have
some of those, and they seem worse than I had initially thought. The
problem is that either they are attempted to be freed, using the
provided free function - and who knows what error that could bring - or
they are not, and we're leaking. If they are only created once at load
of the DLL and never actually freed, but simply go away when the DLL is
unloaded, then I guess we're ok. But it seems likely to me that the C++
runtime would be trying to free them using your own provided free
function... can we do a test where we provide pfree and see what it does
with that? ie. if you try to pfree() a regularly malloc()'d segment of
memory, does it actually free it without raising any errors?
It would be really nice to know what those things that are getting
created earlier are, too...
but I guess it all just comes down to, does it work in postgres and not
leak?
Chris
Paul Ramsey wrote:
> It turns out it is a quite small modification, and works pretty well:
>
> http://trac.osgeo.org/geos/attachment/ticket/208/memdiff.patch
>
> My patch adds the ability to override, and also has some printfs to
> show what is happening. When the overridden allocator is called
> without the runtime callback set, it prints "std alloc" and when it's
> called with the callback set, it prints "geos alloc".
>
> Here's a little program that exercises it:
>
> #include <stdio.h>
> #include "/usr/local/include/geos_c.h"
> #include <stdlib.h>
>
> int main() {
> printf("main\n");
>
> GEOSCoordSequence* cs;
> GEOSGeometry* g;
> int r;
>
> printf("initgeos\n");
> initGEOSMemory(malloc, free);
> printf("coordseqcreate\n");
> cs = GEOSCoordSeq_create(1, 2);
> printf("coordseqsetx\n");
> r = GEOSCoordSeq_setX(cs, 0, 1.0);
> printf("coordseqsety\n");
> r = GEOSCoordSeq_setY(cs, 0, 1.0);
> printf("createpoint\n");
> g = GEOSGeom_createPoint(cs);
>
> return 0;
>
> }
>
>
> And here is the output:
>
> Heron:tmp pramsey$ ./a.out
> std alloc!
> std alloc!
> main
> initgeos
> coordseqcreate
> geos alloc!
> geos alloc!
> geos alloc!
> coordseqsetx
> coordseqsety
> createpoint
> geos alloc!
>
> So, something in C++ is doing a couple allocations before we can slip
> in and get our other function in place. But we can get all the big
> stuff caught no problem.
>
> P.
> _______________________________________________
> geos-devel mailing list
> geos-devel at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/geos-devel
>
More information about the geos-devel
mailing list