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:
Nikolai Kosjar
2016-10-07 12:11:01 +02:00
parent 88bcd6a304
commit 9730513698
4 changed files with 24 additions and 3 deletions

View File

@@ -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_));

View File

@@ -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;

View File

@@ -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);
} }

View File

@@ -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 &currentEditorFilePath, void updateTranslationUnitVisiblity(const Utf8String &currentEditorFilePath,
const Utf8StringVector &visibleEditorsFilePaths); const Utf8StringVector &visibleEditorsFilePaths);