diff options
author | David Schulz <david.schulz@qt.io> | 2018-09-13 13:39:01 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2018-09-19 10:44:58 +0000 |
commit | ba5f93003ed859947147b7f76d276425d76ab83c (patch) | |
tree | ccc9f4963a2a951aa76fa916ce7012cd820fda65 | |
parent | a376469eb62a59db33b7a7f3eddde2e22db8ddf7 (diff) | |
download | qt-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.cpp | 16 | ||||
-rw-r--r-- | src/plugins/languageclient/languageclientmanager.h | 2 | ||||
-rw-r--r-- | src/plugins/languageclient/languageclientsettings.cpp | 11 |
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); |