diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-06-01 16:00:54 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-06-08 07:12:30 +0000 |
commit | bcd3feeaa70e4e2b1eb8751614f0b436873309c6 (patch) | |
tree | b44bdce9303dab6bb7ff565d944d7d2476aae935 | |
parent | b730aa640554d3eb245a335bdb1b08bb8c4a2bef (diff) | |
download | qt-creator-bcd3feeaa70e4e2b1eb8751614f0b436873309c6.tar.gz |
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 <orgads@gmail.com>
-rw-r--r-- | src/plugins/vcsbase/vcscommand.cpp | 7 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcscommand.h | 3 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsplugin.cpp | 9 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsplugin.h | 3 |
4 files changed, 22 insertions, 0 deletions
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 <coreplugin/documentmanager.h> #include <coreplugin/vcsmanager.h> @@ -78,6 +79,12 @@ void VcsCommand::runCommand(SynchronousProcess &proc, emitRepositoryChanged(workingDirectory); } +void VcsCommand::addTask(QFuture<void> &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<void> &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 <projectexplorer/project.h> #include <projectexplorer/projecttree.h> +#include <utils/futuresynchronizer.h> #include <utils/macroexpander.h> #include <QDebug> @@ -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<void> &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 <extensionsystem/iplugin.h> +#include <QFuture> + 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<void> &future); CommonVcsSettings &settings() const; |