From 287590eea2249f9008644355c4c1f3b3fe974c20 Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Thu, 24 Sep 2015 08:16:26 +0200 Subject: [PATCH] Fix concurrency issue in snap indexing --- qgis-test-travis.ctest | 4 ++-- src/core/qgssnappingutils.cpp | 6 ++++++ src/core/qgssnappingutils.h | 3 +++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/qgis-test-travis.ctest b/qgis-test-travis.ctest index 80d9ea0d20b..e12629430ec 100644 --- a/qgis-test-travis.ctest +++ b/qgis-test-travis.ctest @@ -69,14 +69,14 @@ ENDIF(NOT ${BUILDRES} EQUAL 0 OR NOT ${NUMERR} EQUAL 0) IF(NOT ${NUMWARN} EQUAL 0) ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) MESSAGE("${Yellow}Test results submitted to${ColorReset}") - MESSAGE("${BoldYellow}${SHORTURL}{ColorReset}" ) + MESSAGE("${BoldYellow}${SHORTURL}${ColorReset}" ) MESSAGE( FATAL_ERROR "${Red}Build warnings found, aborting test.${ColorReset}" ) ENDIF(NOT ${NUMWARN} EQUAL 0) ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" PARALLEL_LEVEL 2 RETURN_VALUE TESTRES) IF(NOT ${TESTRES} EQUAL 0) ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) MESSAGE("${Yellow}Test results submitted to${ColorReset}") - MESSAGE("${BoldYellow}${SHORTURL}{ColorReset}" ) + MESSAGE("${BoldYellow}${SHORTURL}${ColorReset}" ) MESSAGE( FATAL_ERROR "Tests failed" ) ENDIF(NOT ${TESTRES} EQUAL 0) diff --git a/src/core/qgssnappingutils.cpp b/src/core/qgssnappingutils.cpp index 1165d134db0..5ae3ff02b49 100644 --- a/src/core/qgssnappingutils.cpp +++ b/src/core/qgssnappingutils.cpp @@ -30,6 +30,7 @@ QgsSnappingUtils::QgsSnappingUtils( QObject* parent ) , mDefaultTolerance( 10 ) , mDefaultUnit( QgsTolerance::Pixels ) , mSnapOnIntersection( false ) + , mIsIndexing( false ) { connect( QgsMapLayerRegistry::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), this, SLOT( onLayersWillBeRemoved( QStringList ) ) ); } @@ -306,6 +307,10 @@ QgsPointLocator::Match QgsSnappingUtils::snapToMap( const QgsPoint& pointMap, Qg void QgsSnappingUtils::prepareIndex( const QList& layers ) { + if ( mIsIndexing ) + return; + mIsIndexing = true; + // check if we need to build any index QList layersToIndex; Q_FOREACH ( QgsVectorLayer* vl, layers ) @@ -329,6 +334,7 @@ void QgsSnappingUtils::prepareIndex( const QList& layers ) prepareIndexProgress( ++i ); } QgsDebugMsg( QString( "Prepare index total: %1 ms" ).arg( t.elapsed() ) ); + mIsIndexing = false; } diff --git a/src/core/qgssnappingutils.h b/src/core/qgssnappingutils.h index f7bdea3b680..7e1ed52ac2f 100644 --- a/src/core/qgssnappingutils.h +++ b/src/core/qgssnappingutils.h @@ -172,6 +172,9 @@ class CORE_EXPORT QgsSnappingUtils : public QObject LocatorsMap mTemporaryLocators; //! list of layer IDs that are too large to be indexed (hybrid strategy will use temporary locators for those) QSet mHybridNonindexableLayers; + + //! internal flag that an indexing process is going on. Prevents starting two processes in parallel. + bool mIsIndexing; };