From b9113c56eb3707087d2e69f73d48b7b71afd914e Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 2 Dec 2014 10:43:14 -0800 Subject: [PATCH] QSqlDatabase::addDatabase not thread safe with plugin Although the method is marked as thread safe in the docs, if you use a database plugin it ends up not being thread safe. --- libs/opmapcontrol/src/core/pureimagecache.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libs/opmapcontrol/src/core/pureimagecache.cpp b/libs/opmapcontrol/src/core/pureimagecache.cpp index b20b283bd..9cdd0cdd0 100644 --- a/libs/opmapcontrol/src/core/pureimagecache.cpp +++ b/libs/opmapcontrol/src/core/pureimagecache.cpp @@ -29,6 +29,8 @@ #include //#define DEBUG_PUREIMAGECACHE namespace core { + static QMutex addDatabaseMutex; // QSqlDatabase::addDatabase is not thread safe when loadingn plugins + qlonglong PureImageCache::ConnCounter=0; PureImageCache::PureImageCache() @@ -90,7 +92,9 @@ namespace core { return false; } } + addDatabaseMutex.lock(); QSqlDatabase db(QSqlDatabase::addDatabase("QSQLITE",QLatin1String("CreateConn"))); + addDatabaseMutex.unlock(); db.setDatabaseName(file); if (!db.open()) { @@ -179,7 +183,9 @@ namespace core { qlonglong id=++ConnCounter; Mcounter.unlock(); { + addDatabaseMutex.lock(); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); + addDatabaseMutex.unlock(); QString db=gtilecache+"Data.qmdb"; cn.setDatabaseName(db); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); @@ -225,7 +231,9 @@ namespace core { QString db=dir+"Data.qmdb"; { + addDatabaseMutex.lock(); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); + addDatabaseMutex.unlock(); cn.setDatabaseName(db); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); @@ -260,7 +268,9 @@ namespace core { Mcounter.lock(); qlonglong id=++ConnCounter; Mcounter.unlock(); + addDatabaseMutex.lock(); QSqlDatabase cn(QSqlDatabase::addDatabase("QSQLITE",QString::number(id))); + addDatabaseMutex.unlock(); cn.setDatabaseName(db); cn.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); if(cn.open()) @@ -298,12 +308,16 @@ namespace core { ret=CreateEmptyDB(destFile); } if(!ret) return false; + addDatabaseMutex.lock(); QSqlDatabase ca(QSqlDatabase::addDatabase("QSQLITE","ca")); + addDatabaseMutex.unlock(); ca.setDatabaseName(sourceFile); if(ca.open()) { + addDatabaseMutex.lock(); QSqlDatabase cb(QSqlDatabase::addDatabase("QSQLITE","cb")); + addDatabaseMutex.unlock(); cb.setDatabaseName(destFile); if(cb.open()) { -- 2.22.0