forked from qt-creator/qt-creator
Clang: Avoid blocking UI if references are requested and clangbackend crashes
The two cases in which the UI might be blocked are: * Invocation of the editor context menu * Rename Symbol Under Cursor Cancel the future if the backend is restarted and on the other side, check whether the future is cancelled. Change-Id: If2315da1f66f15eab1531fcd8da1dff851a9a4e6 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io> Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -99,7 +99,7 @@ IpcReceiver::IpcReceiver()
|
||||
|
||||
IpcReceiver::~IpcReceiver()
|
||||
{
|
||||
deleteAndClearWaitingAssistProcessors();
|
||||
reset();
|
||||
}
|
||||
|
||||
void IpcReceiver::setAliveHandler(const IpcReceiver::AliveHandler &handler)
|
||||
@@ -116,12 +116,6 @@ void IpcReceiver::addExpectedCodeCompletedMessage(
|
||||
m_assistProcessorsTable.insert(ticket, processor);
|
||||
}
|
||||
|
||||
void IpcReceiver::deleteAndClearWaitingAssistProcessors()
|
||||
{
|
||||
qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end());
|
||||
m_assistProcessorsTable.clear();
|
||||
}
|
||||
|
||||
void IpcReceiver::deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget)
|
||||
{
|
||||
QMutableHashIterator<quint64, ClangCompletionAssistProcessor *> it(m_assistProcessorsTable);
|
||||
@@ -155,6 +149,18 @@ bool IpcReceiver::isExpectingCodeCompletedMessage() const
|
||||
return !m_assistProcessorsTable.isEmpty();
|
||||
}
|
||||
|
||||
void IpcReceiver::reset()
|
||||
{
|
||||
// Clean up waiting assist processors
|
||||
qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end());
|
||||
m_assistProcessorsTable.clear();
|
||||
|
||||
// Clean up futures for references
|
||||
for (ReferencesEntry &entry : m_referencesTable)
|
||||
entry.futureInterface.cancel();
|
||||
m_referencesTable.clear();
|
||||
}
|
||||
|
||||
void IpcReceiver::alive()
|
||||
{
|
||||
if (printAliveMessage())
|
||||
@@ -719,7 +725,7 @@ void IpcCommunicator::onConnectedToBackend()
|
||||
if (m_connectedCount > 1)
|
||||
logRestartedDueToUnexpectedFinish();
|
||||
|
||||
m_ipcReceiver.deleteAndClearWaitingAssistProcessors();
|
||||
m_ipcReceiver.reset();
|
||||
m_ipcSender.reset(new IpcSender(m_connection));
|
||||
|
||||
initializeBackendWithCurrentData();
|
||||
|
||||
@@ -73,14 +73,14 @@ public:
|
||||
void setAliveHandler(const AliveHandler &handler);
|
||||
|
||||
void addExpectedCodeCompletedMessage(quint64 ticket, ClangCompletionAssistProcessor *processor);
|
||||
void deleteAndClearWaitingAssistProcessors();
|
||||
void deleteProcessorsOfEditorWidget(TextEditor::TextEditorWidget *textEditorWidget);
|
||||
|
||||
QFuture<CppTools::CursorInfo> addExpectedReferencesMessage(quint64 ticket,
|
||||
QTextDocument *textDocument);
|
||||
|
||||
bool isExpectingCodeCompletedMessage() const;
|
||||
|
||||
void reset();
|
||||
|
||||
private:
|
||||
void alive() override;
|
||||
void echo(const ClangBackEnd::EchoMessage &message) override;
|
||||
|
||||
Reference in New Issue
Block a user