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.
This commit is contained in:
parent
6fa56b143a
commit
05ab656b57
3 changed files with 24 additions and 16 deletions
|
@ -28,8 +28,11 @@
|
|||
// mapnik
|
||||
#include <mapnik/box2d.hpp>
|
||||
|
||||
// proj4
|
||||
#include <proj_api.h>
|
||||
|
||||
// boost
|
||||
#ifdef MAPNIK_THREADSAFE
|
||||
#if defined(MAPNIK_THREADSAFE) && PJ_VERSION < 480
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue