From 5ebd4c833ea3e0d8aa38101e25d3e64b9dc853a3 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 13 Mar 2024 16:59:19 +0100 Subject: [PATCH] QtSupport: Restrict QtVersionManagerImpl lifetime to plugin lifetime This occasionally triggered crashes on static destruction when hard-killing Qt Creator. Giving QtVersionManagerImpl the plugin as QObject parent effectively re-instates the lifetime behavior from before we moved to delayed initialization. We keep the delayed initialization, at the (acceptable) prize of a somewhat quirky setup. Change-Id: I1b4be284a1b573325ed5cc441778eeb48b94c24b Reviewed-by: Eike Ziller Reviewed-by: --- src/plugins/qtsupport/qtsupportplugin.cpp | 2 ++ src/plugins/qtsupport/qtversionmanager.cpp | 15 ++++++++++++--- src/plugins/qtsupport/qtversionmanager.h | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index db0f8888af4..c8a7b7cf1f3 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -83,6 +83,8 @@ void QtSupportPlugin::initialize() addTestCreator(createQtProjectImporterTest); #endif + setupQtVersionManager(this); + setupDesktopQtVersion(); setupEmbeddedLinuxQtVersion(); setupGettingStartedWelcomePage(); diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 063a1309846..746f4f8c5e6 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -89,7 +89,8 @@ static PersistentSettingsWriter *m_writer = nullptr; class QtVersionManagerImpl : public QObject { public: - QtVersionManagerImpl() + QtVersionManagerImpl(QObject *parent) + : QObject(parent) { qRegisterMetaType(); @@ -135,10 +136,18 @@ public: QTimer m_fileWatcherTimer; }; +static QObject *s_guard = nullptr; + +void Internal::setupQtVersionManager(QObject *guard) +{ + s_guard = guard; +} + QtVersionManagerImpl &qtVersionManagerImpl() { - static QtVersionManagerImpl theQtVersionManager; - return theQtVersionManager; + QTC_CHECK(s_guard); + static auto theQtVersionManager = new QtVersionManagerImpl(s_guard); + return *theQtVersionManager; } void QtVersionManagerImpl::triggerQtVersionRestore() diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index 9fa2cfb5b16..9eb17a4d8cc 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -70,4 +70,6 @@ private: static int getUniqueId(); }; +namespace Internal { void setupQtVersionManager(QObject *guard); } + } // namespace QtSupport