forked from qt-creator/qt-creator
Copilot: shutdown plugin asynchronously
Wait for the client to finish. This fixes a crash when running the plugin unit tests of the copilot plugin. Change-Id: Id0805cb628a79316cd904350bb159ff1369a03b9 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -21,6 +21,7 @@ public:
|
||||
void initialize() override;
|
||||
void extensionsInitialized() override;
|
||||
void restartClient();
|
||||
ShutdownFlag aboutToShutdown() override;
|
||||
|
||||
private:
|
||||
QPointer<CopilotClient> m_client;
|
||||
|
||||
@@ -237,7 +237,13 @@ void LanguageClientManager::deleteClient(Client *client)
|
||||
managerInstance->m_clients.removeAll(client);
|
||||
for (QList<Client *> &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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user