From b5e03b8fe2ce7bfe3ef782591bf19a6e452ef32d Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 26 Feb 2024 10:28:28 +0100 Subject: QtSupport: Reduce ExtraCompiler life time to plugin life time again Amends 6467797af2. The created extra compilers were parented to their factories, who gained a life time extension from 'end of plugin live' to static destruction when the factories were made static. However, this that time the likewise static QObjectCache in GeneratedCodeModelSupport::update might be destroyed already, leading to a potential crash in m_cache.remove(dead). This change here re-establishes the original timing by using the plugin itself as parent for the extra compilers. Change-Id: Id868b7b87f00440c67af551b71359c47a5c29cba Reviewed-by: Christian Kandeler Reviewed-by: --- src/plugins/qtsupport/qscxmlcgenerator.cpp | 11 +++++++---- src/plugins/qtsupport/qscxmlcgenerator.h | 4 +++- src/plugins/qtsupport/qtsupportplugin.cpp | 4 ++-- src/plugins/qtsupport/uicgenerator.cpp | 11 +++++++---- src/plugins/qtsupport/uicgenerator.h | 4 +++- 5 files changed, 22 insertions(+), 12 deletions(-) (limited to 'src/plugins/qtsupport') diff --git a/src/plugins/qtsupport/qscxmlcgenerator.cpp b/src/plugins/qtsupport/qscxmlcgenerator.cpp index 8aa1c0198f..3bfd201a04 100644 --- a/src/plugins/qtsupport/qscxmlcgenerator.cpp +++ b/src/plugins/qtsupport/qscxmlcgenerator.cpp @@ -129,8 +129,9 @@ FileNameToContentsHash QScxmlcGenerator::handleProcessFinished(Process *process) class QScxmlcGeneratorFactory final : public ExtraCompilerFactory { public: - QScxmlcGeneratorFactory() = default; + explicit QScxmlcGeneratorFactory(QObject *guard) : m_guard(guard) {} +private: FileType sourceType() const final { return FileType::StateChart; } QString sourceTag() const final { return QStringLiteral("scxml"); } @@ -139,13 +140,15 @@ public: const FilePath &source, const FilePaths &targets) final { - return new QScxmlcGenerator(project, source, targets, this); + return new QScxmlcGenerator(project, source, targets, m_guard); } + + QObject *m_guard; }; -void setupQScxmlcGenerator() +void setupQScxmlcGenerator(QObject *guard) { - static QScxmlcGeneratorFactory theQScxmlcGeneratorFactory; + static QScxmlcGeneratorFactory theQScxmlcGeneratorFactory(guard); } } // QtSupport::Internal diff --git a/src/plugins/qtsupport/qscxmlcgenerator.h b/src/plugins/qtsupport/qscxmlcgenerator.h index 811f485689..c7c8cf8265 100644 --- a/src/plugins/qtsupport/qscxmlcgenerator.h +++ b/src/plugins/qtsupport/qscxmlcgenerator.h @@ -3,8 +3,10 @@ #pragma once +#include + namespace QtSupport::Internal { -void setupQScxmlcGenerator(); +void setupQScxmlcGenerator(QObject *guard); } // QtSupport::Internal diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index 6a34e466d1..db0f8888af 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -88,8 +88,8 @@ void QtSupportPlugin::initialize() setupGettingStartedWelcomePage(); setupQtSettingsPage(); setupQtOutputFormatter(); - setupUicGenerator(); - setupQScxmlcGenerator(); + setupUicGenerator(this); + setupQScxmlcGenerator(this); setupExternalDesigner(this); setupExternalLinguist(); diff --git a/src/plugins/qtsupport/uicgenerator.cpp b/src/plugins/qtsupport/uicgenerator.cpp index dee12b9f9c..74b8355af9 100644 --- a/src/plugins/qtsupport/uicgenerator.cpp +++ b/src/plugins/qtsupport/uicgenerator.cpp @@ -72,8 +72,9 @@ FileNameToContentsHash UicGenerator::handleProcessFinished(Process *process) class UicGeneratorFactory final : public ExtraCompilerFactory { public: - UicGeneratorFactory() = default; + explicit UicGeneratorFactory(QObject *guard) : m_guard(guard) {} +private: FileType sourceType() const final { return FileType::Form; } QString sourceTag() const final { return QLatin1String("ui"); } @@ -82,13 +83,15 @@ public: const FilePath &source, const FilePaths &targets) final { - return new UicGenerator(project, source, targets, this); + return new UicGenerator(project, source, targets, m_guard); } + + QObject *m_guard; }; -void setupUicGenerator() +void setupUicGenerator(QObject *guard) { - static UicGeneratorFactory theUicGeneratorFactory; + static UicGeneratorFactory theUicGeneratorFactory(guard); } } // QtSupport::Internal diff --git a/src/plugins/qtsupport/uicgenerator.h b/src/plugins/qtsupport/uicgenerator.h index f8fdeb5ca0..3f3d4c20b5 100644 --- a/src/plugins/qtsupport/uicgenerator.h +++ b/src/plugins/qtsupport/uicgenerator.h @@ -3,8 +3,10 @@ #pragma once +#include + namespace QtSupport::Internal { -void setupUicGenerator(); +void setupUicGenerator(QObject *guard); } // QtSupport::Internal -- cgit v1.2.3