forked from qt-creator/qt-creator
Clang: Stop sending data to backend on disconnect
This addresses
SOFT ASSERT made fatal: "m_connection.isConnected()" in file
src/plugins/clangcodemodel/clangbackendipcintegration.cpp, line 230
I could not reproduce the issue locally, so I'm leaving the soft asserts
untouched for now.
Change-Id: If1d55ba7bc7e2d1ac20ad992c6d0d43ceb0f5d73
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -51,6 +51,7 @@ ConnectionClient::ConnectionClient()
|
|||||||
|
|
||||||
connectLocalSocketError();
|
connectLocalSocketError();
|
||||||
connectLocalSocketConnected();
|
connectLocalSocketConnected();
|
||||||
|
connectLocalSocketDisconnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionClient::startProcessAndConnectToServerAsynchronously()
|
void ConnectionClient::startProcessAndConnectToServerAsynchronously()
|
||||||
@@ -230,6 +231,14 @@ void ConnectionClient::connectLocalSocketConnected()
|
|||||||
&ConnectionClient::resetProcessIsStarting);
|
&ConnectionClient::resetProcessIsStarting);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConnectionClient::connectLocalSocketDisconnected()
|
||||||
|
{
|
||||||
|
connect(&localSocket,
|
||||||
|
&QLocalSocket::disconnected,
|
||||||
|
this,
|
||||||
|
&ConnectionClient::disconnectedFromLocalSocket);
|
||||||
|
}
|
||||||
|
|
||||||
void ConnectionClient::finishProcess()
|
void ConnectionClient::finishProcess()
|
||||||
{
|
{
|
||||||
finishProcess(std::move(process_));
|
finishProcess(std::move(process_));
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ public:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void connectedToLocalSocket();
|
void connectedToLocalSocket();
|
||||||
|
void disconnectedFromLocalSocket();
|
||||||
void processFinished();
|
void processFinished();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -102,6 +103,7 @@ private:
|
|||||||
void printStandardError();
|
void printStandardError();
|
||||||
|
|
||||||
void connectLocalSocketConnected();
|
void connectLocalSocketConnected();
|
||||||
|
void connectLocalSocketDisconnected();
|
||||||
void connectProcessFinished(QProcess *process) const;
|
void connectProcessFinished(QProcess *process) const;
|
||||||
void connectProcessStarted(QProcess *process) const;
|
void connectProcessStarted(QProcess *process) const;
|
||||||
void disconnectProcessFinished(QProcess *process) const;
|
void disconnectProcessFinished(QProcess *process) const;
|
||||||
|
|||||||
@@ -313,11 +313,16 @@ IpcCommunicator::IpcCommunicator()
|
|||||||
connect(Core::EditorManager::instance(), &Core::EditorManager::editorAboutToClose,
|
connect(Core::EditorManager::instance(), &Core::EditorManager::editorAboutToClose,
|
||||||
this, &IpcCommunicator::onEditorAboutToClose);
|
this, &IpcCommunicator::onEditorAboutToClose);
|
||||||
connect(Core::ICore::instance(), &Core::ICore::coreAboutToClose,
|
connect(Core::ICore::instance(), &Core::ICore::coreAboutToClose,
|
||||||
this, &IpcCommunicator::onCoreAboutToClose);
|
this, &IpcCommunicator::setupDummySender);
|
||||||
|
|
||||||
initializeBackend();
|
initializeBackend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IpcCommunicator::~IpcCommunicator()
|
||||||
|
{
|
||||||
|
disconnect(&m_connection, 0, this, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void IpcCommunicator::initializeBackend()
|
void IpcCommunicator::initializeBackend()
|
||||||
{
|
{
|
||||||
const QString clangBackEndProcessPath = backendProcessPath();
|
const QString clangBackEndProcessPath = backendProcessPath();
|
||||||
@@ -329,6 +334,8 @@ void IpcCommunicator::initializeBackend()
|
|||||||
|
|
||||||
connect(&m_connection, &ConnectionClient::connectedToLocalSocket,
|
connect(&m_connection, &ConnectionClient::connectedToLocalSocket,
|
||||||
this, &IpcCommunicator::onConnectedToBackend);
|
this, &IpcCommunicator::onConnectedToBackend);
|
||||||
|
connect(&m_connection, &ConnectionClient::disconnectedFromLocalSocket,
|
||||||
|
this, &IpcCommunicator::setupDummySender);
|
||||||
|
|
||||||
m_connection.startProcessAndConnectToServerAsynchronously();
|
m_connection.startProcessAndConnectToServerAsynchronously();
|
||||||
}
|
}
|
||||||
@@ -633,7 +640,7 @@ void IpcCommunicator::onEditorAboutToClose(Core::IEditor *editor)
|
|||||||
m_ipcReceiver.deleteProcessorsOfEditorWidget(textEditor->editorWidget());
|
m_ipcReceiver.deleteProcessorsOfEditorWidget(textEditor->editorWidget());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IpcCommunicator::onCoreAboutToClose()
|
void IpcCommunicator::setupDummySender()
|
||||||
{
|
{
|
||||||
m_ipcSender.reset(new DummyIpcSender);
|
m_ipcSender.reset(new DummyIpcSender);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
IpcCommunicator();
|
IpcCommunicator();
|
||||||
|
~IpcCommunicator();
|
||||||
|
|
||||||
void registerTranslationUnitsForEditor(const FileContainers &fileContainers);
|
void registerTranslationUnitsForEditor(const FileContainers &fileContainers);
|
||||||
void updateTranslationUnitsForEditor(const FileContainers &fileContainers);
|
void updateTranslationUnitsForEditor(const FileContainers &fileContainers);
|
||||||
@@ -164,9 +165,11 @@ private:
|
|||||||
void registerVisibleCppEditorDocumentAndMarkInvisibleDirty();
|
void registerVisibleCppEditorDocumentAndMarkInvisibleDirty();
|
||||||
void registerCurrentCodeModelUiHeaders();
|
void registerCurrentCodeModelUiHeaders();
|
||||||
|
|
||||||
|
void setupDummySender();
|
||||||
|
|
||||||
void onConnectedToBackend();
|
void onConnectedToBackend();
|
||||||
|
void onDisconnectedFromBackend();
|
||||||
void onEditorAboutToClose(Core::IEditor *editor);
|
void onEditorAboutToClose(Core::IEditor *editor);
|
||||||
void onCoreAboutToClose();
|
|
||||||
|
|
||||||
void updateTranslationUnitVisiblity(const Utf8String ¤tEditorFilePath,
|
void updateTranslationUnitVisiblity(const Utf8String ¤tEditorFilePath,
|
||||||
const Utf8StringVector &visibleEditorsFilePaths);
|
const Utf8StringVector &visibleEditorsFilePaths);
|
||||||
|
|||||||
Reference in New Issue
Block a user