forked from qt-creator/qt-creator
LSP: correctly shutdown client that is currently being restarted
Change-Id: I9fb0ccd9aa181515efc9368b0b369dfc39dffcd1 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -177,7 +177,8 @@ void LanguageClientManager::startClient(LanguageClientSettings setting)
|
|||||||
|
|
||||||
void LanguageClientManager::startClient(BaseClient *client)
|
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](){
|
connect(client, &BaseClient::finished, managerInstance, [client](){
|
||||||
managerInstance->clientFinished(client);
|
managerInstance->clientFinished(client);
|
||||||
});
|
});
|
||||||
@@ -206,6 +207,14 @@ void LanguageClientManager::reportFinished(const MessageId &id, BaseClient *byCl
|
|||||||
managerInstance->m_exclusiveRequests.remove(id);
|
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()
|
QVector<BaseClient *> LanguageClientManager::reachableClients()
|
||||||
{
|
{
|
||||||
return Utils::filtered(m_clients, &BaseClient::reachable);
|
return Utils::filtered(m_clients, &BaseClient::reachable);
|
||||||
@@ -227,16 +236,15 @@ void LanguageClientManager::clientFinished(BaseClient *client)
|
|||||||
constexpr int restartTimeoutS = 5;
|
constexpr int restartTimeoutS = 5;
|
||||||
const bool unexpectedFinish = client->state() != BaseClient::Shutdown
|
const bool unexpectedFinish = client->state() != BaseClient::Shutdown
|
||||||
&& client->state() != BaseClient::ShutdownRequested;
|
&& client->state() != BaseClient::ShutdownRequested;
|
||||||
managerInstance->removeMarks(client->id());
|
|
||||||
managerInstance->m_clients.removeAll(client);
|
|
||||||
if (unexpectedFinish) {
|
if (unexpectedFinish) {
|
||||||
|
managerInstance->removeMarks(client->id());
|
||||||
client->disconnect(managerInstance);
|
client->disconnect(managerInstance);
|
||||||
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS),
|
client->log(tr("Unexpectedly finished. Restarting in %1 seconds.").arg(restartTimeoutS),
|
||||||
Core::MessageManager::Flash);
|
Core::MessageManager::Flash);
|
||||||
client->reset();
|
client->reset();
|
||||||
QTimer::singleShot(restartTimeoutS * 1000, this, [client](){ startClient(client); });
|
QTimer::singleShot(restartTimeoutS * 1000, this, [client](){ startClient(client); });
|
||||||
} else {
|
} else {
|
||||||
delete client;
|
deleteClient(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ public:
|
|||||||
static void addExclusiveRequest(const LanguageServerProtocol::MessageId &id, BaseClient *client);
|
static void addExclusiveRequest(const LanguageServerProtocol::MessageId &id, BaseClient *client);
|
||||||
static void reportFinished(const LanguageServerProtocol::MessageId &id, BaseClient *byClient);
|
static void reportFinished(const LanguageServerProtocol::MessageId &id, BaseClient *byClient);
|
||||||
|
|
||||||
|
static void deleteClient(BaseClient *client);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LanguageClientManager();
|
LanguageClientManager();
|
||||||
LanguageClientManager(const LanguageClientManager &other) = delete;
|
LanguageClientManager(const LanguageClientManager &other) = delete;
|
||||||
|
|||||||
@@ -351,7 +351,8 @@ void LanguageClientSettingsModel::applyChanges()
|
|||||||
QList<LanguageClientSettings> toStart = m_settings;
|
QList<LanguageClientSettings> toStart = m_settings;
|
||||||
// check currently registered interfaces
|
// check currently registered interfaces
|
||||||
for (auto interface : 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);
|
return interface->matches(setting);
|
||||||
});
|
});
|
||||||
if (setting.isValid() && setting.m_enabled) {
|
if (setting.isValid() && setting.m_enabled) {
|
||||||
@@ -362,8 +363,12 @@ void LanguageClientSettingsModel::applyChanges()
|
|||||||
toShutdown << interface;
|
toShutdown << interface;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto interface : toShutdown)
|
for (auto interface : toShutdown) {
|
||||||
interface->shutdown();
|
if (interface->reachable())
|
||||||
|
interface->shutdown();
|
||||||
|
else
|
||||||
|
LanguageClientManager::deleteClient(interface);
|
||||||
|
}
|
||||||
for (auto setting : toStart) {
|
for (auto setting : toStart) {
|
||||||
if (setting.isValid() && setting.m_enabled)
|
if (setting.isValid() && setting.m_enabled)
|
||||||
LanguageClientManager::startClient(setting);
|
LanguageClientManager::startClient(setting);
|
||||||
|
|||||||
Reference in New Issue
Block a user