From 05e102fbac7ff1cc2714c415bca623d3676a306a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 22 Feb 2022 07:42:54 +0100 Subject: [PATCH] LanguageClient: forcefully delete client after timeout If the client does not react within 20 seconds on the shutdown or exit message delete the client. Task-number: QTCREATORBUG-27064 Change-Id: I9680242e471989ea820c4e28d28c500c27a20bb7 Reviewed-by: Reviewed-by: Christian Kandeler --- src/plugins/languageclient/client.cpp | 8 ++++++++ src/plugins/languageclient/client.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 3d23d0cfb48..2b7594539cc 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -112,6 +112,11 @@ Client::Client(BaseClientInterface *clientInterface) m_tokenSupport.setTokenTypesMap(SemanticTokens::defaultTokenTypesMap()); m_tokenSupport.setTokenModifiersMap(SemanticTokens::defaultTokenModifiersMap()); + + m_shutdownTimer.setInterval(20 /*seconds*/ * 1000); + connect(&m_shutdownTimer, &QTimer::timeout, this, [this] { + LanguageClientManager::deleteClient(this); + }); } QString Client::name() const @@ -325,6 +330,7 @@ void Client::shutdown() }); sendContent(shutdown); m_state = ShutdownRequested; + m_shutdownTimer.start(); } Client::State Client::state() const @@ -1551,6 +1557,7 @@ void Client::initializeCallback(const InitializeRequest::Response &initResponse) void Client::shutDownCallback(const ShutdownRequest::Response &shutdownResponse) { + m_shutdownTimer.stop(); QTC_ASSERT(m_state == ShutdownRequested, return); QTC_ASSERT(m_clientInterface, return); optional errorValue = shutdownResponse.error(); @@ -1563,6 +1570,7 @@ void Client::shutDownCallback(const ShutdownRequest::Response &shutdownResponse) sendMessage(ExitNotification().toBaseMessage()); qCDebug(LOGLSPCLIENT) << "language server " << m_displayName << " shutdown"; m_state = Shutdown; + m_shutdownTimer.start(); } bool Client::sendWorkspceFolderChanges() const diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index c999dd84ef6..d95d5693609 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -305,6 +305,7 @@ private: LogTarget m_logTarget = LogTarget::Ui; bool m_locatorsEnabled = true; bool m_autoRequestCodeActions = true; + QTimer m_shutdownTimer; }; } // namespace LanguageClient