summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2021-06-01 16:00:54 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-06-08 07:12:30 +0000
commitbcd3feeaa70e4e2b1eb8751614f0b436873309c6 (patch)
treeb44bdce9303dab6bb7ff565d944d7d2476aae935
parentb730aa640554d3eb245a335bdb1b08bb8c4a2bef (diff)
downloadqt-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.cpp7
-rw-r--r--src/plugins/vcsbase/vcscommand.h3
-rw-r--r--src/plugins/vcsbase/vcsplugin.cpp9
-rw-r--r--src/plugins/vcsbase/vcsplugin.h3
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;