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>
This commit is contained in:
Jarek Kobus
2021-06-01 16:00:54 +02:00
parent b730aa6405
commit bcd3feeaa7
4 changed files with 22 additions and 0 deletions

View File

@@ -26,6 +26,7 @@
#include "vcscommand.h" #include "vcscommand.h"
#include "vcsbaseplugin.h" #include "vcsbaseplugin.h"
#include "vcsoutputwindow.h" #include "vcsoutputwindow.h"
#include "vcsplugin.h"
#include <coreplugin/documentmanager.h> #include <coreplugin/documentmanager.h>
#include <coreplugin/vcsmanager.h> #include <coreplugin/vcsmanager.h>
@@ -78,6 +79,12 @@ void VcsCommand::runCommand(SynchronousProcess &proc,
emitRepositoryChanged(workingDirectory); emitRepositoryChanged(workingDirectory);
} }
void VcsCommand::addTask(QFuture<void> &future)
{
Core::ShellCommand::addTask(future);
Internal::VcsPlugin::addFuture(future);
}
void VcsCommand::emitRepositoryChanged(const QString &workingDirectory) void VcsCommand::emitRepositoryChanged(const QString &workingDirectory)
{ {
if (m_preventRepositoryChanged || !(flags() & VcsCommand::ExpectRepoChanges)) if (m_preventRepositoryChanged || !(flags() & VcsCommand::ExpectRepoChanges))

View File

@@ -51,6 +51,9 @@ public:
const Utils::CommandLine &command, const Utils::CommandLine &command,
const QString &workDirectory = {}) override; const QString &workDirectory = {}) override;
protected:
void addTask(QFuture<void> &future) override;
private: private:
void emitRepositoryChanged(const QString &workingDirectory); void emitRepositoryChanged(const QString &workingDirectory);

View File

@@ -45,6 +45,7 @@
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projecttree.h> #include <projectexplorer/projecttree.h>
#include <utils/futuresynchronizer.h>
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <QDebug> #include <QDebug>
@@ -60,6 +61,7 @@ class VcsPluginPrivate
public: public:
CommonOptionsPage m_settingsPage; CommonOptionsPage m_settingsPage;
QStandardItemModel *m_nickNameModel = nullptr; QStandardItemModel *m_nickNameModel = nullptr;
Utils::FutureSynchronizer m_synchronizer;
}; };
static VcsPlugin *m_instance = nullptr; static VcsPlugin *m_instance = nullptr;
@@ -71,6 +73,7 @@ VcsPlugin::VcsPlugin()
VcsPlugin::~VcsPlugin() VcsPlugin::~VcsPlugin()
{ {
d->m_synchronizer.waitForFinished();
VcsOutputWindow::destroy(); VcsOutputWindow::destroy();
m_instance = nullptr; m_instance = nullptr;
delete d; delete d;
@@ -82,6 +85,7 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage)
Q_UNUSED(errorMessage) Q_UNUSED(errorMessage)
d = new VcsPluginPrivate; d = new VcsPluginPrivate;
d->m_synchronizer.setCancelOnWait(true);
EditorManager::addCloseEditorListener([this](IEditor *editor) -> bool { EditorManager::addCloseEditorListener([this](IEditor *editor) -> bool {
bool result = true; bool result = true;
@@ -140,6 +144,11 @@ VcsPlugin *VcsPlugin::instance()
return m_instance; return m_instance;
} }
void VcsPlugin::addFuture(const QFuture<void> &future)
{
m_instance->d->m_synchronizer.addFuture(future);
}
CommonVcsSettings &VcsPlugin::settings() const CommonVcsSettings &VcsPlugin::settings() const
{ {
return d->m_settingsPage.settings(); return d->m_settingsPage.settings();

View File

@@ -27,6 +27,8 @@
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QFuture>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QStandardItemModel; class QStandardItemModel;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -51,6 +53,7 @@ public:
bool initialize(const QStringList &arguments, QString *errorMessage) override; bool initialize(const QStringList &arguments, QString *errorMessage) override;
static VcsPlugin *instance(); static VcsPlugin *instance();
static void addFuture(const QFuture<void> &future);
CommonVcsSettings &settings() const; CommonVcsSettings &settings() const;