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@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/geos-devel

_______________________________________________
geos-devel mailing list
geos-devel@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/geos-devel

Reply via email to