diff --git a/src/providers/spatialite/qgsspatialiteconnpool.cpp b/src/providers/spatialite/qgsspatialiteconnpool.cpp index c84f35113ca..a6c3c1b9d7d 100644 --- a/src/providers/spatialite/qgsspatialiteconnpool.cpp +++ b/src/providers/spatialite/qgsspatialiteconnpool.cpp @@ -13,11 +13,30 @@ * * ***************************************************************************/ +#include +#include + #include "qgsspatialiteconnpool.h" -QgsSpatiaLiteConnPool QgsSpatiaLiteConnPool::sInstance; +QgsSpatiaLiteConnPool *QgsSpatiaLiteConnPool::sInstance = nullptr; QgsSpatiaLiteConnPool *QgsSpatiaLiteConnPool::instance() { - return &sInstance; + if ( ! sInstance ) + { + static QMutex sMutex; + QMutexLocker locker( &sMutex ); + if ( ! sInstance ) + { + sInstance = new QgsSpatiaLiteConnPool(); + } + } + return sInstance; +} + +// static public +void QgsSpatiaLiteConnPool::cleanupInstance() +{ + delete sInstance; + sInstance = nullptr; } diff --git a/src/providers/spatialite/qgsspatialiteconnpool.h b/src/providers/spatialite/qgsspatialiteconnpool.h index 85678327bc6..be3dc6d3e9d 100644 --- a/src/providers/spatialite/qgsspatialiteconnpool.h +++ b/src/providers/spatialite/qgsspatialiteconnpool.h @@ -68,9 +68,19 @@ class QgsSpatiaLiteConnPoolGroup : public QObject, public QgsConnectionPoolGroup //! SpatiaLite connection pool - singleton class QgsSpatiaLiteConnPool : public QgsConnectionPool { - static QgsSpatiaLiteConnPool sInstance; + static QgsSpatiaLiteConnPool *sInstance; public: static QgsSpatiaLiteConnPool *instance(); + + // Singleton cleanup + // + // Make sure nobody is using the instance before calling + // this function. + // + // WARNING: concurrent call from multiple threads may result + // in double-free of the instance. + // + static void cleanupInstance(); }; diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index e893e3be5f5..bc52acee7a7 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -5900,6 +5900,7 @@ QGISEXTERN QString getStyleById( const QString &uri, QString styleId, QString &e QGISEXTERN void cleanupProvider() { + QgsSpatiaLiteConnPool::cleanupInstance(); QgsSqliteHandle::closeAll(); }