From c4e75b7e2049f268669fe5d55f5c299412523e1a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 4 Apr 2022 17:27:49 +0200 Subject: [PATCH] LanguageClientManager: Don't delete the client directly LanguageClientManager::deleteClient() may be called directly from Client::finished() handler, from BaseClientInterface::finished() handler, from StdIOClientInterface::onProcessFinished() handler or from QtcProcess::finished() handler. Don't delete directly any of this objects - delete later instead. Since now we have delayed the deletion of clients, we can't send directly the shutdownFinished() signal, as we have not really finished the shutdown yet. Since all the calls to clients' deleteLater() were scheduled before emitting shutdownFinished(), we send the signal using queued connection, which should guarantee that all clients' destructor were already executed before calling asynchronousShutdownFinished(). Task-number: QTCREATORBUG-27316 Change-Id: I4f2c8a756ca86c36cc6324af14b99a9fd4513cd3 Reviewed-by: Christian Stenger --- src/plugins/languageclient/languageclientmanager.cpp | 7 ++----- src/plugins/languageclient/languageclientplugin.cpp | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 08d8a8583d0..48bb3901fe1 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -236,12 +236,9 @@ void LanguageClientManager::deleteClient(Client *client) managerInstance->m_clients.removeAll(client); for (QList &clients : managerInstance->m_clientsForSetting) clients.removeAll(client); - if (managerInstance->m_shuttingDown) { - delete client; - } else { - client->deleteLater(); + client->deleteLater(); + if (!managerInstance->m_shuttingDown) emit instance()->clientRemoved(client); - } } void LanguageClientManager::shutdown() diff --git a/src/plugins/languageclient/languageclientplugin.cpp b/src/plugins/languageclient/languageclientplugin.cpp index c8b4d134a0e..9271540b1c1 100644 --- a/src/plugins/languageclient/languageclientplugin.cpp +++ b/src/plugins/languageclient/languageclientplugin.cpp @@ -87,7 +87,7 @@ ExtensionSystem::IPlugin::ShutdownFlag LanguageClientPlugin::aboutToShutdown() QTC_ASSERT(LanguageClientManager::instance(), return ExtensionSystem::IPlugin::SynchronousShutdown); connect(LanguageClientManager::instance(), &LanguageClientManager::shutdownFinished, - this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished); + this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished, Qt::QueuedConnection); return ExtensionSystem::IPlugin::AsynchronousShutdown; }