Changeset: e998ea5f8dfe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e998ea5f8dfe
Modified Files:
geom/lib/libgeom.c
geom/lib/libgeom.h
geom/monetdb5/geod.c
geom/monetdb5/geom.c
geom/monetdb5/geomBulk.c
geom/monetdb5/geom_atoms.c
Branch: geos-reentrant
Log Message:
use (only) the _r api of libgeos. For now we have a new global
pointer geoshandle, next step is using one initGEOS_r per thread (and a
finishGEOS_r per thread exit)
diffs (truncated from 3855 to 300 lines):
diff --git a/geom/lib/libgeom.c b/geom/lib/libgeom.c
--- a/geom/lib/libgeom.c
+++ b/geom/lib/libgeom.c
@@ -20,6 +20,8 @@
#include "monetdb_config.h"
#include "libgeom.h"
+GEOSContextHandle_t geoshandle;
+
static void __attribute__((__format__(__printf__, 1, 2)))
geomerror(_In_z_ _Printf_format_string_ const char *fmt, ...)
{
@@ -35,8 +37,8 @@ geomerror(_In_z_ _Printf_format_string_
void
libgeom_init(void)
{
- initGEOS((GEOSMessageHandler) geomerror, (GEOSMessageHandler)
geomerror);
- // TODO: deprecated call REMOVE
+ geoshandle = initGEOS_r((GEOSMessageHandler) geomerror,
(GEOSMessageHandler) geomerror);
+ // TODO: deprecated call REMOVE
GEOS_setWKBByteOrder(1); /* NDR (little endian) */
printf("# MonetDB/GIS module loaded\n");
fflush(stdout); /* make merovingian see this *now* */
@@ -45,7 +47,7 @@ libgeom_init(void)
void
libgeom_exit(void)
{
- finishGEOS();
+ finishGEOS_r(geoshandle);
}
bool
@@ -67,7 +69,7 @@ wkb2geos(const wkb *geomWKB)
geosGeometry = GEOSGeomFromWKB_buf((unsigned char *) geomWKB->data,
geomWKB->len);
if (geosGeometry != NULL)
- GEOSSetSRID(geosGeometry, geomWKB->srid);
+ GEOSSetSRID_r(geoshandle, geosGeometry, geomWKB->srid);
return geosGeometry;
}
diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -30,11 +30,13 @@
#define libgeom_export extern
#endif
+#define GEOS_USE_ONLY_R_API 1
#include <geos_c.h>
#ifdef HAVE_PROJ
#include <proj.h>
#endif
+extern GEOSContextHandle_t geoshandle;
/* geos does not support 3d envelope */
typedef struct mbr {
float xmin;
diff --git a/geom/monetdb5/geod.c b/geom/monetdb5/geod.c
--- a/geom/monetdb5/geod.c
+++ b/geom/monetdb5/geod.c
@@ -166,8 +166,8 @@ static GeoPoint
geoPointFromGeom(GEOSGeom geom)
{
GeoPoint geo;
- GEOSGeomGetX(geom, &(geo.lon));
- GEOSGeomGetY(geom, &(geo.lat));
+ GEOSGeomGetX_r(geoshandle, geom, &(geo.lon));
+ GEOSGeomGetY_r(geoshandle, geom, &(geo.lat));
return geo;
}
@@ -176,12 +176,12 @@ geoPointFromGeom(GEOSGeom geom)
static GeoLines
geoLinesFromGeom(GEOSGeom geom)
{
- const GEOSCoordSequence *gcs = GEOSGeom_getCoordSeq(geom);
+ const GEOSCoordSequence *gcs = GEOSGeom_getCoordSeq_r(geoshandle, geom);
GeoLines geo;
- geo.pointCount = GEOSGeomGetNumPoints(geom);
+ geo.pointCount = GEOSGeomGetNumPoints_r(geoshandle, geom);
geo.points = GDKmalloc(sizeof(GeoPoint) * geo.pointCount);
for (int i = 0; i < geo.pointCount; i++)
- GEOSCoordSeq_getXY(gcs, i, &geo.points[i].lon,
&geo.points[i].lat);
+ GEOSCoordSeq_getXY_r(geoshandle, gcs, i, &geo.points[i].lon,
&geo.points[i].lat);
geo.bbox = NULL;
return geo;
}
@@ -195,8 +195,8 @@ geoPolygonFromGeom(GEOSGeom geom)
{
GeoPolygon geo;
//Get exterior ring GeoLines
- geo.exteriorRing =
geoLinesFromGeom((GEOSGeom)GEOSGetExteriorRing(geom));
- geo.interiorRingsCount = GEOSGetNumInteriorRings(geom);
+ geo.exteriorRing =
geoLinesFromGeom((GEOSGeom)GEOSGetExteriorRing_r(geoshandle, geom));
+ geo.interiorRingsCount = GEOSGetNumInteriorRings_r(geoshandle, geom);
//If there are interior rings, allocate space to their GeoLines
representation
if (geo.interiorRingsCount > 0)
//TODO Malloc fail exception?
@@ -205,7 +205,7 @@ geoPolygonFromGeom(GEOSGeom geom)
geo.interiorRings = NULL;
//Get interior rings GeoLines
for (int i = 0; i < geo.interiorRingsCount; i++)
- geo.interiorRings[i] =
geoLinesFromGeom((GEOSGeom)GEOSGetInteriorRingN(geom, i));
+ geo.interiorRings[i] =
geoLinesFromGeom((GEOSGeom)GEOSGetInteriorRingN_r(geoshandle, geom, i));
// If the geometry doesn't have BoundingBoxe, calculate it
geo.bbox = boundingBoxLines(geo.exteriorRing);
return geo;
@@ -267,9 +267,9 @@ wkbGetCompatibleGeometries(wkb * const *
(*gb) = wkb2geos(*b);
if ((*ga) == NULL || (*gb) == NULL)
err = createException(MAL, "geom.wkbGetComplatibleGeometries",
SQLSTATE(38000) "Geos operation wkb2geos failed");
- else if (GEOSGetSRID((*ga)) != GEOSGetSRID(*gb)) {
- GEOSGeom_destroy(*ga);
- GEOSGeom_destroy(*gb);
+ else if (GEOSGetSRID_r(geoshandle, (*ga)) != GEOSGetSRID_r(geoshandle,
*gb)) {
+ GEOSGeom_destroy_r(geoshandle, *ga);
+ GEOSGeom_destroy_r(geoshandle, *gb);
err = createException(MAL, "geom.wkbGetComplatibleGeometries",
SQLSTATE(38000) "Geometries of different SRID");
}
return err;
@@ -316,10 +316,10 @@ cartesianLineFromGeoPoints(GeoPoint p1,
CartPoint3D p1_cart, p2_cart;
p1_cart = geo2cartFromDegrees(p1);
p2_cart = geo2cartFromDegrees(p2);
- GEOSCoordSequence *lineSeq = GEOSCoordSeq_create(2, 3);
- GEOSCoordSeq_setXYZ(lineSeq, 0, p1_cart.x, p1_cart.y, p1_cart.z);
- GEOSCoordSeq_setXYZ(lineSeq, 1, p2_cart.x, p2_cart.y, p2_cart.z);
- return GEOSGeom_createLineString(lineSeq);
+ GEOSCoordSequence *lineSeq = GEOSCoordSeq_create_r(geoshandle, 2, 3);
+ GEOSCoordSeq_setXYZ_r(geoshandle, lineSeq, 0, p1_cart.x, p1_cart.y,
p1_cart.z);
+ GEOSCoordSeq_setXYZ_r(geoshandle, lineSeq, 1, p2_cart.x, p2_cart.y,
p2_cart.z);
+ return GEOSGeom_createLineString_r(geoshandle, lineSeq);
}
/**
@@ -588,16 +588,16 @@ pointWithinPolygon(GeoPolygon polygon, G
polygonRing = polygon.exteriorRing;
for (int i = 0; i < polygonRing.pointCount-1; i++) {
segmentPolygon =
cartesianLineFromGeoPoints(polygonRing.points[i], polygonRing.points[i+1]);
- intersectionPoints = GEOSIntersection(segmentPolygon,
outInLine);
+ intersectionPoints = GEOSIntersection_r(geoshandle,
segmentPolygon, outInLine);
//If there is an intersection, a point will be returned (line
when there is none)
- if (GEOSGeomTypeId(intersectionPoints) == GEOS_POINT)
+ if (GEOSGeomTypeId_r(geoshandle, intersectionPoints) ==
GEOS_POINT)
intersectionNum++;
if (intersectionPoints != NULL)
- GEOSGeom_destroy(intersectionPoints);
+ GEOSGeom_destroy_r(geoshandle, intersectionPoints);
if (segmentPolygon != NULL)
- GEOSGeom_destroy(segmentPolygon);
+ GEOSGeom_destroy_r(geoshandle, segmentPolygon);
}
//Count the number of intersections between the polygon interior rings
and the constructed line
@@ -605,21 +605,21 @@ pointWithinPolygon(GeoPolygon polygon, G
polygonRing = polygon.interiorRings[j];
for (int i = 0; i < polygonRing.pointCount-1; i++) {
segmentPolygon =
cartesianLineFromGeoPoints(polygonRing.points[i], polygonRing.points[i+1]);
- intersectionPoints = GEOSIntersection(segmentPolygon,
outInLine);
+ intersectionPoints = GEOSIntersection_r(geoshandle,
segmentPolygon, outInLine);
//If there is an intersection, a point will be returned
(line when there is none)
- if (GEOSGeomTypeId(intersectionPoints) == GEOS_POINT)
+ if (GEOSGeomTypeId_r(geoshandle, intersectionPoints) ==
GEOS_POINT)
intersectionNum++;
if (intersectionPoints != NULL)
- GEOSGeom_destroy(intersectionPoints);
+ GEOSGeom_destroy_r(geoshandle,
intersectionPoints);
if (segmentPolygon != NULL)
- GEOSGeom_destroy(segmentPolygon);
+ GEOSGeom_destroy_r(geoshandle, segmentPolygon);
}
}
if (outInLine != NULL)
- GEOSGeom_destroy(outInLine);
+ GEOSGeom_destroy_r(geoshandle, outInLine);
//If even, the point is not within the polygon. If odd, it is within
return intersectionNum % 2 == 1;
@@ -688,8 +688,8 @@ geoDistanceSingle(GEOSGeom aGeom, GEOSGe
{
int dimA, dimB;
double distance = INT_MAX;
- dimA = GEOSGeom_getDimensions(aGeom);
- dimB = GEOSGeom_getDimensions(bGeom);
+ dimA = GEOSGeom_getDimensions_r(geoshandle, aGeom);
+ dimB = GEOSGeom_getDimensions_r(geoshandle, bGeom);
if (dimA == 0 && dimB == 0) {
/* Point and Point */
GeoPoint a = geoPointFromGeom(aGeom);
@@ -757,13 +757,13 @@ geoDistanceSingle(GEOSGeom aGeom, GEOSGe
static double
geoDistanceInternal(GEOSGeom a, GEOSGeom b, double distance_min_limit)
{
- int numGeomsA = GEOSGetNumGeometries(a), numGeomsB =
GEOSGetNumGeometries(b);
+ int numGeomsA = GEOSGetNumGeometries_r(geoshandle, a), numGeomsB =
GEOSGetNumGeometries_r(geoshandle, b);
double distance, min_distance = INT_MAX;
GEOSGeometry *geo1, *geo2;
for (int i = 0; i < numGeomsA; i++) {
- geo1 = (GEOSGeometry *)GEOSGetGeometryN((const GEOSGeometry
*)a, i);
+ geo1 = (GEOSGeometry *)GEOSGetGeometryN_r(geoshandle, (const
GEOSGeometry *)a, i);
for (int j = 0; j < numGeomsB; j++) {
- geo2 = (GEOSGeometry *)GEOSGetGeometryN((const
GEOSGeometry *)b, j);
+ geo2 = (GEOSGeometry *)GEOSGetGeometryN_r(geoshandle,
(const GEOSGeometry *)b, j);
distance = geoDistanceSingle(geo1, geo2,
distance_min_limit);
//Shortcut, if the geometries are already at their
minimum distance (0 in the case of normal Distance)
if (distance <= distance_min_limit)
@@ -789,8 +789,8 @@ wkbDistanceGeographic(dbl *out, wkb * co
if (ga && gb) {
(*out) = geoDistanceInternal(ga, gb, 0);
}
- GEOSGeom_destroy(ga);
- GEOSGeom_destroy(gb);
+ GEOSGeom_destroy_r(geoshandle, ga);
+ GEOSGeom_destroy_r(geoshandle, gb);
return err;
}
@@ -810,8 +810,8 @@ wkbDWithinGeographic(bit *out, wkb * con
distance = geoDistanceInternal(ga, gb, *d);
(*out) = (distance <= (*d));
}
- GEOSGeom_destroy(ga);
- GEOSGeom_destroy(gb);
+ GEOSGeom_destroy_r(geoshandle, ga);
+ GEOSGeom_destroy_r(geoshandle, gb);
return err;
}
@@ -831,8 +831,8 @@ wkbIntersectsGeographic(bit *out, wkb *
distance = geoDistanceInternal(ga, gb, 0);
(*out) = (distance == 0);
}
- GEOSGeom_destroy(ga);
- GEOSGeom_destroy(gb);
+ GEOSGeom_destroy_r(geoshandle, ga);
+ GEOSGeom_destroy_r(geoshandle, gb);
return err;
}
@@ -858,7 +858,7 @@ geoPointEquals(GeoPoint pointA, GeoPoint
static bool
geoCoversSingle(GEOSGeom a, GEOSGeom b)
{
- int dimA = GEOSGeom_getDimensions(a), dimB = GEOSGeom_getDimensions(b);
+ int dimA = GEOSGeom_getDimensions_r(geoshandle, a), dimB =
GEOSGeom_getDimensions_r(geoshandle, b);
if (dimA < dimB)
//If the dimension of A is smaller than B, then it must not
cover it
return false;
@@ -906,12 +906,12 @@ geoCoversSingle(GEOSGeom a, GEOSGeom b)
static bool
geoCoversInternal(GEOSGeom a, GEOSGeom b)
{
- int numGeomsA = GEOSGetNumGeometries(a), numGeomsB =
GEOSGetNumGeometries(b);
+ int numGeomsA = GEOSGetNumGeometries_r(geoshandle, a), numGeomsB =
GEOSGetNumGeometries_r(geoshandle, b);
GEOSGeometry *geo1, *geo2;
for (int i = 0; i < numGeomsA; i++) {
- geo1 = (GEOSGeometry *)GEOSGetGeometryN((const GEOSGeometry
*)a, i);
+ geo1 = (GEOSGeometry *)GEOSGetGeometryN_r(geoshandle, (const
GEOSGeometry *)a, i);
for (int j = 0; j < numGeomsB; j++) {
- geo2 = (GEOSGeometry *)GEOSGetGeometryN((const
GEOSGeometry *)b, j);
+ geo2 = (GEOSGeometry *)GEOSGetGeometryN_r(geoshandle,
(const GEOSGeometry *)b, j);
if (geoCoversSingle(geo1, geo2) == 0)
return 0;
}
@@ -933,8 +933,8 @@ wkbCoversGeographic(bit *out, wkb * cons
if (ga && gb)
(*out) = geoCoversInternal(ga, gb);
- GEOSGeom_destroy(ga);
- GEOSGeom_destroy(gb);
+ GEOSGeom_destroy_r(geoshandle, ga);
+ GEOSGeom_destroy_r(geoshandle, gb);
return err;
}
@@ -989,9 +989,9 @@ filterSelectGeomGeomDoubleToBit(bat* out
const wkb *col_wkb = BUNtvar(b_iter, c_oid - b->hseqbase);
if ((col_geom = wkb2geos(col_wkb)) == NULL)
continue;
- if (GEOSGetSRID(col_geom) != GEOSGetSRID(const_geom)) {
- GEOSGeom_destroy(col_geom);
- GEOSGeom_destroy(const_geom);
+ if (GEOSGetSRID_r(geoshandle, col_geom) !=
GEOSGetSRID_r(geoshandle, const_geom)) {
+ GEOSGeom_destroy_r(geoshandle, col_geom);
+ GEOSGeom_destroy_r(geoshandle, const_geom);
bat_iterator_end(&b_iter);
BBPunfix(b->batCacheid);
if (s)
@@ -1004,9 +1004,9 @@ filterSelectGeomGeomDoubleToBit(bat* out
if (cond != anti) {
if (BUNappend(out, &c_oid, false) != GDK_SUCCEED) {
if (col_geom)
- GEOSGeom_destroy(col_geom);
+ GEOSGeom_destroy_r(geoshandle,
col_geom);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]