LanguageClient: Fix possible crash

If a restart for a client has been staged for restart the
shutdown of QC may coincide with the start of the client which
leads to a crash on exit. Correctly track clients that never
successfully started to clean them up on manager destruction.

Change-Id: I639a76318d1665653fbcd37841fcaf407f3d3a83
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2021-08-25 13:55:45 +02:00
parent cd3f82f247
commit 752b967952
3 changed files with 16 additions and 8 deletions

View File

@@ -1076,6 +1076,7 @@ void Client::setSnippetsGroup(const QString &group)
void Client::start()
{
LanguageClientManager::addClient(this);
if (m_clientInterface->start())
LanguageClientManager::clientStarted(this);
else

View File

@@ -102,17 +102,15 @@ void LanguageClientManager::init()
managerInstance = new LanguageClientManager(LanguageClientPlugin::instance());
}
void LanguageClientManager::clientStarted(Client *client)
void LanguageClient::LanguageClientManager::addClient(Client *client)
{
QTC_ASSERT(managerInstance, return);
QTC_ASSERT(client, return);
if (managerInstance->m_shuttingDown) {
clientFinished(client);
return;
}
if (!managerInstance->m_clients.contains(client))
managerInstance->m_clients << client;
if (managerInstance->m_clients.contains(client))
return;
managerInstance->m_clients << client;
connect(client, &Client::finished, managerInstance, [client]() { clientFinished(client); });
connect(client,
&Client::initialized,
@@ -127,8 +125,16 @@ void LanguageClientManager::clientStarted(Client *client)
[client](const DynamicCapabilities &capabilities) {
managerInstance->m_inspector.updateCapabilities(client->name(), capabilities);
});
}
client->initialize();
void LanguageClientManager::clientStarted(Client *client)
{
QTC_ASSERT(managerInstance, return);
QTC_ASSERT(client, return);
if (managerInstance->m_shuttingDown)
clientFinished(client);
else
client->initialize();
}
void LanguageClientManager::clientFinished(Client *client)

View File

@@ -62,6 +62,7 @@ public:
static void clientFinished(Client *client);
static Client *startClient(BaseSettings *setting, ProjectExplorer::Project *project = nullptr);
static QVector<Client *> clients();
static void addClient(Client *client);
static void addExclusiveRequest(const LanguageServerProtocol::MessageId &id, Client *client);
static void reportFinished(const LanguageServerProtocol::MessageId &id, Client *byClient);