summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2018-09-13 13:39:01 +0200
committerDavid Schulz <david.schulz@qt.io>2018-09-19 10:44:58 +0000
commitba5f93003ed859947147b7f76d276425d76ab83c (patch)
treeccc9f4963a2a951aa76fa916ce7012cd820fda65
parenta376469eb62a59db33b7a7f3eddde2e22db8ddf7 (diff)
downloadqt-creator-ba5f93003ed859947147b7f76d276425d76ab83c.tar.gz
LSP: correctly shutdown client that is currently being restarted
Change-Id: I9fb0ccd9aa181515efc9368b0b369dfc39dffcd1 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/languageclient/languageclientmanager.cpp16
-rw-r--r--src/plugins/languageclient/languageclientmanager.h2
-rw-r--r--src/plugins/languageclient/languageclientsettings.cpp11
3 files changed, 22 insertions, 7 deletions
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp
index ec618b6d6b..c8f7b97f55 100644
--- a/src/plugins/languageclient/languageclientmanager.cpp
+++ b/src/plugins/languageclient/languageclientmanager.cpp
@@ -177,7 +177,8 @@ void LanguageClientManager::startClient(LanguageClientSettings setting)
void LanguageClientManager::startClient(BaseClient *client)
{
- managerInstance->m_clients.append(client);
+ if (!managerInstance->m_clients.contains(client))
+ managerInstance->m_clients.append(client);
connect(client, &BaseClient::finished, managerInstance, [client](){
managerInstance->clientFinished(client);
});
@@ -206,6 +207,14 @@ void LanguageClientManager::reportFinished(const MessageId &id, BaseClient *byCl
managerInstance->m_exclusiveRequests.remove(id);
}
+void LanguageClientManager::deleteClient(BaseClient *client)
+{
+ QTC_ASSERT(client, return);
+ managerInstance->removeMarks(client->id());
+ managerInstance->m_clients.removeAll(client);
+ delete client;
+}
+
QVector<BaseClient *> LanguageClientManager::reachableClients()
{
return Utils::filtered(m_clients, &BaseClient::reachable);
@@ -227,16 +236,15 @@ void LanguageClientManager::clientFinished(BaseClient *client)
constexpr int restartTimeoutS = 5;
const bool unexpectedFinish = client->state() != BaseClient::Shutdown
&& client->state() != BaseClient::ShutdownRequested;
- managerInstance->removeMarks(client->id());
- managerInstance->m_clients.removeAll(client);
if (unexpectedFinish) {
+ managerInstance->removeMarks(client->id());
client->disconnect(managerInstance);
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS),
Core::MessageManager::Flash);
client->reset();
QTimer::singleShot(restartTimeoutS * 1000, this, [client](){ startClient(client); });
} else {
- delete client;
+ deleteClient(client);
}
}
diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h
index 3ccf56c765..a00c86858e 100644
--- a/src/plugins/languageclient/languageclientmanager.h
+++ b/src/plugins/languageclient/languageclientmanager.h
@@ -68,6 +68,8 @@ public:
static void addExclusiveRequest(const LanguageServerProtocol::MessageId &id, BaseClient *client);
static void reportFinished(const LanguageServerProtocol::MessageId &id, BaseClient *byClient);
+ static void deleteClient(BaseClient *client);
+
private:
LanguageClientManager();
LanguageClientManager(const LanguageClientManager &other) = delete;
diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp
index e43d064f01..c059dafed0 100644
--- a/src/plugins/languageclient/languageclientsettings.cpp
+++ b/src/plugins/languageclient/languageclientsettings.cpp
@@ -351,7 +351,8 @@ void LanguageClientSettingsModel::applyChanges()
QList<LanguageClientSettings> toStart = m_settings;
// check currently registered interfaces
for (auto interface : interfaces) {
- auto setting = Utils::findOr(m_settings, LanguageClientSettings(), [interface](const LanguageClientSettings &setting){
+ auto setting = Utils::findOr(m_settings, LanguageClientSettings(),
+ [interface](const LanguageClientSettings &setting){
return interface->matches(setting);
});
if (setting.isValid() && setting.m_enabled) {
@@ -362,8 +363,12 @@ void LanguageClientSettingsModel::applyChanges()
toShutdown << interface;
}
}
- for (auto interface : toShutdown)
- interface->shutdown();
+ for (auto interface : toShutdown) {
+ if (interface->reachable())
+ interface->shutdown();
+ else
+ LanguageClientManager::deleteClient(interface);
+ }
for (auto setting : toStart) {
if (setting.isValid() && setting.m_enabled)
LanguageClientManager::startClient(setting);