From d870bab95c04786dc0ee5d8d44d5fad484b89a48 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 27 Jun 2017 09:21:46 +0200 Subject: [PATCH] CppEditor: Cancel runner in ~CppUseSelectionsUpdater ...otherwise an already destructed QTextDocument might be accessed in the ClangCodeModel::Internal::IpcReceiver::references. Task-number: QTCREATORBUG-18459 Change-Id: I1868b2fd3a64341794f83eea6c4eeb7c2c1af812 Reviewed-by: Orgad Shaneh Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangbackendipcintegration.cpp | 4 ++-- src/plugins/clangcodemodel/clangbackendipcintegration.h | 3 ++- src/plugins/cppeditor/cppuseselectionsupdater.cpp | 6 ++++++ src/plugins/cppeditor/cppuseselectionsupdater.h | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp index 8dd45907de3..5ff5b1aa7e5 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp @@ -248,9 +248,9 @@ void IpcReceiver::references(const ReferencesMessage &message) QTC_CHECK(futureInterface != QFutureInterface()); if (futureInterface.isCanceled()) - return; // A new request was issued making this one outdated. + return; // Editor document closed or a new request was issued making this result outdated. - QTC_CHECK(entry.textDocument); + QTC_ASSERT(entry.textDocument, return); futureInterface.reportResult(toCursorInfo(*entry.textDocument, message)); futureInterface.reportFinished(); } diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.h b/src/plugins/clangcodemodel/clangbackendipcintegration.h index e3842b2a26d..57a07e8097d 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.h +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.h @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -102,7 +103,7 @@ private: : futureInterface(futureInterface) , textDocument(textDocument) {} QFutureInterface futureInterface; - QTextDocument *textDocument = nullptr; + QPointer textDocument; }; QHash m_referencesTable; }; diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.cpp b/src/plugins/cppeditor/cppuseselectionsupdater.cpp index 217a58fa1d2..47a036c7b94 100644 --- a/src/plugins/cppeditor/cppuseselectionsupdater.cpp +++ b/src/plugins/cppeditor/cppuseselectionsupdater.cpp @@ -49,6 +49,12 @@ CppUseSelectionsUpdater::CppUseSelectionsUpdater(TextEditor::TextEditorWidget *e connect(&m_timer, &QTimer::timeout, this, [this]() { update(); }); } +CppUseSelectionsUpdater::~CppUseSelectionsUpdater() +{ + if (m_runnerWatcher) + m_runnerWatcher->cancel(); +} + void CppUseSelectionsUpdater::scheduleUpdate() { m_timer.start(); diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.h b/src/plugins/cppeditor/cppuseselectionsupdater.h index b2474362850..478a816f980 100644 --- a/src/plugins/cppeditor/cppuseselectionsupdater.h +++ b/src/plugins/cppeditor/cppuseselectionsupdater.h @@ -44,6 +44,7 @@ class CppUseSelectionsUpdater : public QObject public: explicit CppUseSelectionsUpdater(TextEditor::TextEditorWidget *editorWidget); + ~CppUseSelectionsUpdater(); void scheduleUpdate(); void abortSchedule();