From bcd3feeaa70e4e2b1eb8751614f0b436873309c6 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 1 Jun 2021 16:00:54 +0200 Subject: Fix a possible crash on shutdown while executing VcsCommand Add a global synchronizer to the VcsPlugin. Fixes: QTCREATORBUG-25744 Change-Id: I97578f4a5b5275071aa0253a22fc9ab2f90d9b75 Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/vcscommand.cpp | 7 +++++++ src/plugins/vcsbase/vcscommand.h | 3 +++ src/plugins/vcsbase/vcsplugin.cpp | 9 +++++++++ src/plugins/vcsbase/vcsplugin.h | 3 +++ 4 files changed, 22 insertions(+) diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 515ee12e08..1f94fcdca8 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -26,6 +26,7 @@ #include "vcscommand.h" #include "vcsbaseplugin.h" #include "vcsoutputwindow.h" +#include "vcsplugin.h" #include #include @@ -78,6 +79,12 @@ void VcsCommand::runCommand(SynchronousProcess &proc, emitRepositoryChanged(workingDirectory); } +void VcsCommand::addTask(QFuture &future) +{ + Core::ShellCommand::addTask(future); + Internal::VcsPlugin::addFuture(future); +} + void VcsCommand::emitRepositoryChanged(const QString &workingDirectory) { if (m_preventRepositoryChanged || !(flags() & VcsCommand::ExpectRepoChanges)) diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index 5852331110..f99132d255 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -51,6 +51,9 @@ public: const Utils::CommandLine &command, const QString &workDirectory = {}) override; +protected: + void addTask(QFuture &future) override; + private: void emitRepositoryChanged(const QString &workingDirectory); diff --git a/src/plugins/vcsbase/vcsplugin.cpp b/src/plugins/vcsbase/vcsplugin.cpp index 4ac28c46c2..731048bb18 100644 --- a/src/plugins/vcsbase/vcsplugin.cpp +++ b/src/plugins/vcsbase/vcsplugin.cpp @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -60,6 +61,7 @@ class VcsPluginPrivate public: CommonOptionsPage m_settingsPage; QStandardItemModel *m_nickNameModel = nullptr; + Utils::FutureSynchronizer m_synchronizer; }; static VcsPlugin *m_instance = nullptr; @@ -71,6 +73,7 @@ VcsPlugin::VcsPlugin() VcsPlugin::~VcsPlugin() { + d->m_synchronizer.waitForFinished(); VcsOutputWindow::destroy(); m_instance = nullptr; delete d; @@ -82,6 +85,7 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage) Q_UNUSED(errorMessage) d = new VcsPluginPrivate; + d->m_synchronizer.setCancelOnWait(true); EditorManager::addCloseEditorListener([this](IEditor *editor) -> bool { bool result = true; @@ -140,6 +144,11 @@ VcsPlugin *VcsPlugin::instance() return m_instance; } +void VcsPlugin::addFuture(const QFuture &future) +{ + m_instance->d->m_synchronizer.addFuture(future); +} + CommonVcsSettings &VcsPlugin::settings() const { return d->m_settingsPage.settings(); diff --git a/src/plugins/vcsbase/vcsplugin.h b/src/plugins/vcsbase/vcsplugin.h index f236a39048..5f43060d04 100644 --- a/src/plugins/vcsbase/vcsplugin.h +++ b/src/plugins/vcsbase/vcsplugin.h @@ -27,6 +27,8 @@ #include +#include + QT_BEGIN_NAMESPACE class QStandardItemModel; QT_END_NAMESPACE @@ -51,6 +53,7 @@ public: bool initialize(const QStringList &arguments, QString *errorMessage) override; static VcsPlugin *instance(); + static void addFuture(const QFuture &future); CommonVcsSettings &settings() const; -- cgit v1.2.1