diff --git a/src/plugins/copilot/copilotplugin.cpp b/src/plugins/copilot/copilotplugin.cpp index 61753b29c30..d895e088c56 100644 --- a/src/plugins/copilot/copilotplugin.cpp +++ b/src/plugins/copilot/copilotplugin.cpp @@ -60,5 +60,13 @@ void CopilotPlugin::restartClient() CopilotSettings::instance().distPath()); } +ExtensionSystem::IPlugin::ShutdownFlag CopilotPlugin::aboutToShutdown() +{ + if (!m_client) + return SynchronousShutdown; + connect(m_client, &QObject::destroyed, this, &IPlugin::asynchronousShutdownFinished); + return AsynchronousShutdown; +} + } // namespace Internal } // namespace Copilot diff --git a/src/plugins/copilot/copilotplugin.h b/src/plugins/copilot/copilotplugin.h index 09a6caecb20..8c1a176a732 100644 --- a/src/plugins/copilot/copilotplugin.h +++ b/src/plugins/copilot/copilotplugin.h @@ -21,6 +21,7 @@ public: void initialize() override; void extensionsInitialized() override; void restartClient(); + ShutdownFlag aboutToShutdown() override; private: QPointer m_client; diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 4c8fa425303..482f4e8e39e 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -237,7 +237,13 @@ void LanguageClientManager::deleteClient(Client *client) managerInstance->m_clients.removeAll(client); for (QList &clients : managerInstance->m_clientsForSetting) clients.removeAll(client); - client->deleteLater(); + + // a deleteLater is not sufficient here as it pastes the delete later event at the end + // of the main event loop and when the plugins are shutdown we spawn an additional eventloop + // that will not handle the delete later event. Use invokeMethod with Qt::QueuedConnection + // instead. + QMetaObject::invokeMethod(client, [client] {delete client;}, Qt::QueuedConnection); + if (!PluginManager::isShuttingDown()) emit instance()->clientRemoved(client); }