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:
Tom Hughes 2010-09-24 15:26:50 +00:00
parent 6fa56b143a
commit 05ab656b57
3 changed files with 24 additions and 16 deletions

View file

@ -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
};

View file

@ -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

View file

@ -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;
}