diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 7114813bd71..22ce4786046 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -322,11 +322,9 @@ void PluginManager::loadPlugins() d->loadPlugins(); } -void PluginManager::loadPlugin(PluginSpec *spec) +void PluginManager::loadPluginsAtRuntime(const QSet &plugins) { - d->loadPlugin(spec, PluginSpec::Loaded); - d->loadPlugin(spec, PluginSpec::Initialized); - d->loadPlugin(spec, PluginSpec::Running); + d->loadPluginsAtRuntime(plugins); } /*! @@ -1389,6 +1387,32 @@ void PluginManagerPrivate::loadPlugins() delayedInitializeTimer.start(); } +void PluginManagerPrivate::loadPluginsAtRuntime(const QSet &plugins) +{ + QTC_CHECK(allOf(plugins, [](PluginSpec *spec) { return spec->isSoftLoadable(); })); + // load the plugins ordered by dependency + const QList queue = filtered(loadQueue(), [&plugins](PluginSpec *spec) { + return plugins.contains(spec); + }); + std::queue localDelayedInitializeQueue; + for (PluginSpec *spec : queue) + loadPlugin(spec, PluginSpec::Loaded); + for (PluginSpec *spec : queue) + loadPlugin(spec, PluginSpec::Initialized); + Utils::reverseForeach(queue, + [this](PluginSpec *spec) { loadPlugin(spec, PluginSpec::Running); }); + Utils::reverseForeach(queue, [](PluginSpec *spec) { + if (spec->state() == PluginSpec::Running) { + const bool delay = spec->d->delayedInitialize(); + if (delay) + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + } else { + // Plugin initialization failed, so cleanup after it + spec->d->kill(); + } + }); +} + /*! \internal */ diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 97bb7f26473..a38f3c3fe7b 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -68,7 +68,7 @@ public: // Plugin operations static QVector loadQueue(); static void loadPlugins(); - static void loadPlugin(PluginSpec *); + static void loadPluginsAtRuntime(const QSet &plugins); static QStringList pluginPaths(); static void setPluginPaths(const QStringList &paths); static QString pluginIID(); diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 3de21388bbb..c92eb5be2e4 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -51,6 +51,7 @@ public: // Plugin operations void checkForProblematicPlugins(); void loadPlugins(); + void loadPluginsAtRuntime(const QSet &plugins); void shutdown(); void setPluginPaths(const QStringList &paths); const QVector loadQueue(); diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp index 8aa87d4e829..cedf5438a61 100644 --- a/src/plugins/coreplugin/plugindialog.cpp +++ b/src/plugins/coreplugin/plugindialog.cpp @@ -88,10 +88,9 @@ void PluginDialog::closeDialog() { PluginManager::writeSettings(); - for (PluginSpec *plugin : m_softLoad) { - PluginManager::loadPlugin(plugin); + PluginManager::loadPluginsAtRuntime(m_softLoad); + for (PluginSpec *plugin : std::as_const(m_softLoad)) CorePlugin::loadMimeFromPlugin(plugin); - } if (m_isRestartRequired) { RestartDialog restartDialog(ICore::dialogParent(),