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