mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
Merge pull request #8693 from m-kuhn/raii_qgscoordinatetransform
RAII for QgsCoordinateTransform locking
This commit is contained in:
commit
d6f434550e
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user