From 7018f85e2d53820c31cf3c633f7020f6630580b9 Mon Sep 17 00:00:00 2001 From: PROJ-BOT <59655370+PROJ-BOT@users.noreply.github.com> Date: Sun, 5 Apr 2020 12:52:29 +0200 Subject: [Backport 7.0] hgridshift/vgridshift: defer grid opening when grid has already been opened (#2132) --- src/transformations/vgridshift.cpp | 53 +++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 6 deletions(-) (limited to 'src/transformations/vgridshift.cpp') diff --git a/src/transformations/vgridshift.cpp b/src/transformations/vgridshift.cpp index 121b795a..6ee8a6b0 100644 --- a/src/transformations/vgridshift.cpp +++ b/src/transformations/vgridshift.cpp @@ -12,6 +12,27 @@ PROJ_HEAD(vgridshift, "Vertical grid shift"); using namespace NS_PROJ; + +#ifdef __MINGW32__ +// mingw32-win32 doesn't implement std::mutex +namespace { +class MyMutex { + public: + // cppcheck-suppress functionStatic + void lock() { pj_acquire_lock(); } + // cppcheck-suppress functionStatic + void unlock() { pj_release_lock(); } +}; +} +#else +#include +#define MyMutex std::mutex +#endif + +static MyMutex gMutex{}; +static std::set gKnownGrids{}; + + namespace { // anonymous namespace struct vgridshiftData { double t_final = 0; @@ -192,13 +213,27 @@ PJ *TRANSFORMATION(vgridshift,0) { Q->defer_grid_opening = true; } else { - /* Build gridlist. P->vgridlist_geoid can be empty if +grids only ask for optional grids. */ - Q->grids = pj_vgrid_init(P, "grids"); + const char *gridnames = pj_param(P->ctx, P->params, "sgrids").s; + gMutex.lock(); + const bool isKnownGrid = gKnownGrids.find(gridnames) != gKnownGrids.end(); + gMutex.unlock(); - /* Was gridlist compiled properly? */ - if ( proj_errno(P) ) { - proj_log_error(P, "vgridshift: could not find required grid(s)."); - return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + if( isKnownGrid ) { + Q->defer_grid_opening = true; + } + else { + /* Build gridlist. P->vgridlist_geoid can be empty if +grids only ask for optional grids. */ + Q->grids = pj_vgrid_init(P, "grids"); + + /* Was gridlist compiled properly? */ + if ( proj_errno(P) ) { + proj_log_error(P, "vgridshift: could not find required grid(s)."); + return destructor(P, PJD_ERR_FAILED_TO_LOAD_GRID); + } + + gMutex.lock(); + gKnownGrids.insert(gridnames); + gMutex.unlock(); } } @@ -214,3 +249,9 @@ PJ *TRANSFORMATION(vgridshift,0) { return P; } + +void pj_clear_vgridshift_knowngrids_cache() { + gMutex.lock(); + gKnownGrids.clear(); + gMutex.unlock(); +} -- cgit v1.2.3