forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user