From e5528288b5c44a54aaa8f0f89e5d86104e533a5e Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Sat, 28 Mar 2020 22:08:11 +0000 Subject: [PATCH] Lifetime management of value cache singletons Hook in to the `destroyed` signal of the `qApp` to destroy the caches. This ensures any associated workers are quit before application terminates and kills all the threads. --- src/blackmisc/datacache.cpp | 6 ++++-- src/blackmisc/settingscache.cpp | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/blackmisc/datacache.cpp b/src/blackmisc/datacache.cpp index 336f219fe..22112836e 100644 --- a/src/blackmisc/datacache.cpp +++ b/src/blackmisc/datacache.cpp @@ -101,8 +101,10 @@ namespace BlackMisc CDataCache *CDataCache::instance() { - static CDataCache cache; - return &cache; + static std::unique_ptr cache(new CDataCache); + static auto dummy = (connect(qApp, &QObject::destroyed, cache.get(), [] { cache.reset(); }), nullptr); + Q_UNUSED(dummy) // declared as static to get thread-safe initialization + return cache.get(); } const QString &CDataCache::persistentStore() diff --git a/src/blackmisc/settingscache.cpp b/src/blackmisc/settingscache.cpp index adf4ebd2d..a06970c41 100644 --- a/src/blackmisc/settingscache.cpp +++ b/src/blackmisc/settingscache.cpp @@ -19,8 +19,10 @@ namespace BlackMisc CSettingsCache *CSettingsCache::instance() { - static CSettingsCache cache; - return &cache; + static std::unique_ptr cache(new CSettingsCache); + static auto dummy = (connect(qApp, &QObject::destroyed, cache.get(), [] { cache.reset(); }), nullptr); + Q_UNUSED(dummy) // declared as static to get thread-safe initialization + return cache.get(); } const QString &CSettingsCache::persistentStore()