@@ -192,7 +192,7 @@ QSqlDatabase *DatabaseRef::operator->() const
192192const QString DefaultsPrivate::DatabaseName (QStringLiteral(" __QtDataSync_database_%1_0x%2" ));
193193QMutex DefaultsPrivate::setupDefaultsMutex;
194194QHash<QString, QSharedPointer<DefaultsPrivate>> DefaultsPrivate::setupDefaults;
195- QThreadStorage<QHash<QString, quint64>> DefaultsPrivate::dbRefHash;
195+ thread_local DefaultsPrivate::DatabaseHolder DefaultsPrivate::dbRefHash;
196196
197197void DefaultsPrivate::createDefaults (const QString &setupName, bool isPassive, const QDir &storageDir, const QUrl &roAddress, const QHash<Defaults::PropertyKey, QVariant> &properties, QJsonSerializer *serializer, ConflictResolver *resolver)
198198{
@@ -287,7 +287,7 @@ QSqlDatabase DefaultsPrivate::acquireDatabase()
287287{
288288 auto name = DefaultsPrivate::DatabaseName
289289 .arg (setupName, QString::number (reinterpret_cast <quint64>(QThread::currentThread ()), 16 ));
290- if ((dbRefHash. localData () [setupName])++ == 0 ) {
290+ if ((dbRefHash[setupName])++ == 0 ) {
291291 logDebug () << " Acquiring database for thread" << QThread::currentThread ();
292292 auto database = QSqlDatabase::addDatabase (QStringLiteral (" QSQLITE" ), name);
293293 database.setDatabaseName (storageDir.absoluteFilePath (QStringLiteral (" store.db" )));
@@ -331,12 +331,9 @@ QSqlDatabase DefaultsPrivate::acquireDatabase()
331331
332332void DefaultsPrivate::releaseDatabase ()
333333{
334- if (--(dbRefHash. localData () [setupName]) == 0 ) {
334+ if (--(dbRefHash[setupName]) == 0 ) {
335335 logDebug () << " Releasing database for thread" << QThread::currentThread ();
336- auto name = DefaultsPrivate::DatabaseName
337- .arg (setupName, QString::number (reinterpret_cast <quint64>(QThread::currentThread ()), 16 ));
338- QSqlDatabase::database (name).close ();
339- QSqlDatabase::removeDatabase (name);
336+ releaseDatabaseImpl (setupName);
340337 }
341338}
342339
@@ -385,6 +382,29 @@ void DefaultsPrivate::makePassive()
385382 }
386383}
387384
385+ void DefaultsPrivate::releaseDatabaseImpl (const QString &name)
386+ {
387+ auto dbName = DefaultsPrivate::DatabaseName
388+ .arg (name, QString::number (reinterpret_cast <quint64>(QThread::currentThread ()), 16 ));
389+ QSqlDatabase::database (dbName).close ();
390+ QSqlDatabase::removeDatabase (dbName);
391+ }
392+
393+
394+
395+ DefaultsPrivate::DatabaseHolder::~DatabaseHolder ()
396+ {
397+ for (auto it = constBegin (); it != constEnd (); it++) {
398+ if (*it <= 0 )
399+ continue ;
400+ qCCritical (qdssetup) << " Setup" << it.key ()
401+ << " still has" << *it
402+ << " open database references in thread" << QThread::currentThread ()
403+ << " on destruction of that thread! Database will be force-closed" ;
404+ releaseDatabaseImpl (it.key ());
405+ }
406+ }
407+
388408// ------------- PRIVATE IMPLEMENTATION DatabaseRef -------------
389409
390410DatabaseRefPrivate::DatabaseRefPrivate (QSharedPointer<DefaultsPrivate> defaultsPrivate, QObject *object) :
0 commit comments