Merge pull request #8693 from m-kuhn/raii_qgscoordinatetransform

RAII for QgsCoordinateTransform locking
This commit is contained in:
Matthias Kuhn 2018-12-18 13:32:42 +01:00 committed by GitHub
commit d6f434550e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -18,6 +18,7 @@
#include "qgscoordinatetransform_p.h"
#include "qgslogger.h"
#include "qgsapplication.h"
#include "qgsreadwritelocker.h"
extern "C"
{
@ -225,7 +226,7 @@ void QgsCoordinateTransformPrivate::calculateTransforms( const QgsCoordinateTran
QPair<projPJ, projPJ> QgsCoordinateTransformPrivate::threadLocalProjData()
{
mProjLock.lockForRead();
QgsReadWriteLocker locker( mProjLock, QgsReadWriteLocker::Read );
#ifdef USE_THREAD_LOCAL
QMap < uintptr_t, QPair< projPJ, projPJ > >::const_iterator it = mProjProjections.constFind( reinterpret_cast< uintptr_t>( mProjContext.get() ) );
@ -246,13 +247,11 @@ QPair<projPJ, projPJ> QgsCoordinateTransformPrivate::threadLocalProjData()
if ( it != mProjProjections.constEnd() )
{
QPair<projPJ, projPJ> res = it.value();
mProjLock.unlock();
return res;
}
// proj projections don't exist yet, so we need to create
mProjLock.unlock();
mProjLock.lockForWrite();
locker.changeMode( QgsReadWriteLocker::Write );
#ifdef USE_THREAD_LOCAL
QPair<projPJ, projPJ> res = qMakePair( pj_init_plus_ctx( mProjContext.get(), mSourceProjString.toUtf8() ),
@ -263,7 +262,6 @@ QPair<projPJ, projPJ> QgsCoordinateTransformPrivate::threadLocalProjData()
pj_init_plus_ctx( pContext, mDestProjString.toUtf8() ) );
mProjProjections.insert( reinterpret_cast< uintptr_t>( pContext ), res );
#endif
mProjLock.unlock();
return res;
}
@ -332,7 +330,7 @@ void QgsCoordinateTransformPrivate::setFinder()
void QgsCoordinateTransformPrivate::freeProj()
{
mProjLock.lockForWrite();
QgsReadWriteLocker locker( mProjLock, QgsReadWriteLocker::Write );
QMap < uintptr_t, QPair< projPJ, projPJ > >::const_iterator it = mProjProjections.constBegin();
for ( ; it != mProjProjections.constEnd(); ++it )
{
@ -340,7 +338,6 @@ void QgsCoordinateTransformPrivate::freeProj()
pj_free( it.value().second );
}
mProjProjections.clear();
mProjLock.unlock();
}
///@endcond