From ced5910bc8da3a18e037b382ca43c61a88adc10c Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 2 Jul 2021 08:43:46 +1000 Subject: [PATCH] Fix race --- .../providers/qgsprovidersublayertask.sip.in | 7 +++++-- src/core/providers/qgsprovidersublayertask.cpp | 8 +++++++- src/core/providers/qgsprovidersublayertask.h | 8 +++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in b/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in index 47e713f7935..cfaafb4db6f 100644 --- a/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in +++ b/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in @@ -48,11 +48,14 @@ specified ``uri``. Returns the sublayer details as calculated by the task. %End - virtual bool run(); - virtual void cancel(); + protected: + + virtual bool run(); + + }; /************************************************************************ diff --git a/src/core/providers/qgsprovidersublayertask.cpp b/src/core/providers/qgsprovidersublayertask.cpp index 2f5410dab75..e15c0721ed8 100644 --- a/src/core/providers/qgsprovidersublayertask.cpp +++ b/src/core/providers/qgsprovidersublayertask.cpp @@ -19,6 +19,7 @@ #include "qgsfeedback.h" #include "qgsproviderregistry.h" #include "qgsprovidersublayerdetails.h" +#include "qgsreadwritelocker.h" QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri ) : QgsTask( tr( "Retrieving layers" ), QgsTask::CanCancel | QgsTask::CancelWithoutPrompt ) @@ -28,6 +29,7 @@ QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri ) QList QgsProviderSublayerTask::results() const { + QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Read ); return mResults; } @@ -37,7 +39,11 @@ bool QgsProviderSublayerTask::run() { mFeedback = std::make_unique< QgsFeedback >(); - mResults = QgsProviderRegistry::instance()->querySublayers( mUri, Qgis::SublayerQueryFlag::ResolveGeometryType | Qgis::SublayerQueryFlag::CountFeatures, mFeedback.get() ); + const QList res = QgsProviderRegistry::instance()->querySublayers( mUri, Qgis::SublayerQueryFlag::ResolveGeometryType | Qgis::SublayerQueryFlag::CountFeatures, mFeedback.get() ); + + QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Write ); + mResults = res; + return true; } diff --git a/src/core/providers/qgsprovidersublayertask.h b/src/core/providers/qgsprovidersublayertask.h index 6eef48dbc11..4fa3082eb69 100644 --- a/src/core/providers/qgsprovidersublayertask.h +++ b/src/core/providers/qgsprovidersublayertask.h @@ -19,6 +19,7 @@ #define QGSPROVIDERSUBLAYERTASKTASK_H #include "qgstaskmanager.h" +#include #include class QgsFeedback; @@ -61,9 +62,12 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask */ QList results() const; - bool run() override; void cancel() override; + protected: + + bool run() override; + private: QString mUri; @@ -72,6 +76,8 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask QList mResults; + mutable QReadWriteLock mLock; + }; #endif // QGSPROVIDERSUBLAYERTASKTASK_H