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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to