From 05ab656b578164c30f685df9796b701d17eedc47 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 24 Sep 2010 15:26:50 +0000 Subject: [PATCH] The upcoming 4.8.0 release of PROJ.4 is supposed to be threadsafe, so lets believe them and not use any locks if we are building against version 4.8.0 or later. Instead we use the new proj_ctx_alloc routine to create a context and pass that when initialising the projection structure. --- include/mapnik/projection.hpp | 11 ++++++++--- src/proj_transform.cpp | 4 ++-- src/projection.cpp | 25 ++++++++++++++----------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/include/mapnik/projection.hpp b/include/mapnik/projection.hpp index 2c044d3b1..1fb103f1f 100644 --- a/include/mapnik/projection.hpp +++ b/include/mapnik/projection.hpp @@ -28,8 +28,11 @@ // mapnik #include +// proj4 +#include + // boost -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 #include #endif @@ -72,9 +75,11 @@ private: private: std::string params_; - void * proj_; + projPJ proj_; bool is_geographic_; -#ifdef MAPNIK_THREADSAFE +#if PJ_VERSION >= 480 + projCtx proj_ctx_; +#elif defined(MAPNIK_THREADSAFE) static boost::mutex mutex_; #endif }; diff --git a/src/proj_transform.cpp b/src/proj_transform.cpp index 4da7c1649..0783cf821 100644 --- a/src/proj_transform.cpp +++ b/src/proj_transform.cpp @@ -56,7 +56,7 @@ bool proj_transform::forward (double & x, double & y , double & z) const y *= DEG_TO_RAD; } -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(projection::mutex_); #endif @@ -86,7 +86,7 @@ bool proj_transform::backward (double & x, double & y , double & z) const y *= DEG_TO_RAD; } -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(projection::mutex_); #endif diff --git a/src/projection.cpp b/src/projection.cpp index 51500d43d..8a1e77deb 100644 --- a/src/projection.cpp +++ b/src/projection.cpp @@ -30,7 +30,7 @@ namespace mapnik { -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 boost::mutex projection::mutex_; #endif @@ -80,7 +80,7 @@ std::string const& projection::params() const void projection::forward(double & x, double &y ) const { -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(mutex_); #endif projUV p; @@ -98,7 +98,7 @@ void projection::forward(double & x, double &y ) const void projection::inverse(double & x,double & y) const { -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(mutex_); #endif if (is_geographic_) @@ -116,23 +116,26 @@ void projection::inverse(double & x,double & y) const projection::~projection() { -#ifdef MAPNIK_THREADSAFE +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(mutex_); #endif if (proj_) pj_free(proj_); +#if PJ_VERSION >= 480 + if (proj_ctx_) pj_ctx_free(proj_ctx_); +#endif } void projection::init() { -// Based on http://trac.osgeo.org/proj/wiki/ThreadSafety -// you could think pj_init was threadsafe in version 4.7.0 -// but its certainly not, and must only be in >= 4.7 with -// usage of projCtx per thread -//#if PJ_VERSION < 470 && MAPNIK_THREADSAFE -// mutex::scoped_lock lock(mutex_); -//#endif +#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480 mutex::scoped_lock lock(mutex_); +#endif +#if PJ_VERSION >= 480 + proj_ctx_=pj_ctx_alloc(); + proj_=pj_init_plus_ctx(proj_ctx_, params_.c_str()); +#else proj_=pj_init_plus(params_.c_str()); +#endif if (!proj_) throw proj_init_error(params_); is_geographic_ = pj_is_latlong(proj_) ? true : false; }