From 7239d03ee7afca7e46e3103bdc1224c94ac3143e Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Thu, 11 Dec 2008 11:26:42 +0100 Subject: [PATCH] Fixes: - Make plugin load order a bit more deterministic Details: - It will still change if the dependencies change, there's no way to avoid that though. --- src/app/main.cpp | 2 +- src/libs/extensionsystem/optionsparser.cpp | 2 +- src/libs/extensionsystem/pluginmanager.cpp | 15 +++++++++++---- src/libs/extensionsystem/pluginmanager.h | 2 +- src/libs/extensionsystem/pluginmanager_p.h | 2 +- src/libs/extensionsystem/pluginspec.cpp | 4 ++-- src/libs/extensionsystem/pluginspec_p.h | 2 +- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index ad61ab0c750..eedc9e13653 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help"; static const char *VERSION_OPTION = "-version"; static const char *CLIENT_OPTION = "-client"; -typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet; +typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet; // Helpers for displaying messages. Note that there is no console on Windows. #ifdef Q_WS_WIN diff --git a/src/libs/extensionsystem/optionsparser.cpp b/src/libs/extensionsystem/optionsparser.cpp index 8884cb378ce..09dbaa59b72 100644 --- a/src/libs/extensionsystem/optionsparser.cpp +++ b/src/libs/extensionsystem/optionsparser.cpp @@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption() "The plugin '%1' does not exist.").arg(m_currentArg); m_hasError = true; } else { - m_pmPrivate->pluginSpecs.remove(spec); + m_pmPrivate->pluginSpecs.removeAll(spec); delete spec; m_isDependencyRefreshNeeded = true; } diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 3f7ba386e4e..90e6e4bb004 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -48,7 +48,7 @@ #include <QTest> #endif -typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet; +typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet; enum { debugLeaks = 0 }; @@ -162,6 +162,11 @@ enum { debugLeaks = 0 }; using namespace ExtensionSystem; using namespace ExtensionSystem::Internal; +static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two) +{ + return one->name() < two->name(); +} + PluginManager *PluginManager::m_instance = 0; /*! @@ -306,7 +311,7 @@ QStringList PluginManager::arguments() const } /*! - \fn QSet<PluginSpec *> PluginManager::plugins() const + \fn QList<PluginSpec *> PluginManager::plugins() const List of all plugin specifications that have been found in the plugin search paths. This list is valid directly after the setPluginPaths() call. The plugin specifications contain the information from the plugins' xml description files @@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const \sa setPluginPaths() */ -QSet<PluginSpec *> PluginManager::plugins() const +QList<PluginSpec *> PluginManager::plugins() const { return d->pluginSpecs; } @@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths() foreach (const QString &specFile, specFiles) { PluginSpec *spec = new PluginSpec; spec->d->read(specFile); - pluginSpecs.insert(spec); + pluginSpecs.append(spec); } resolveDependencies(); + // ensure deterministic plugin load order by sorting + qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName); emit q->pluginsChanged(); } diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index e46451901e9..e621fbea17f 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -101,7 +101,7 @@ public: void loadPlugins(); QStringList pluginPaths() const; void setPluginPaths(const QStringList &paths); - QSet<PluginSpec *> plugins() const; + QList<PluginSpec *> plugins() const; void setFileExtension(const QString &extension); QString fileExtension() const; diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 74cb84c8678..b286fdf2b1d 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -66,7 +66,7 @@ public: void loadPlugin(PluginSpec *spec, PluginSpec::State destState); void resolveDependencies(); - QSet<PluginSpec *> pluginSpecs; + QList<PluginSpec *> pluginSpecs; QList<PluginSpec *> testSpecs; QStringList pluginPaths; QString extension; diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index 170cd72ba0b..a8694e29677 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -693,10 +693,10 @@ int PluginSpecPrivate::versionCompare(const QString &version1, const QString &ve } /*! - \fn bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs) + \fn bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs) \internal */ -bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs) +bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs) { if (hasError) return false; diff --git a/src/libs/extensionsystem/pluginspec_p.h b/src/libs/extensionsystem/pluginspec_p.h index 922fe36d05d..b4fefc59b32 100644 --- a/src/libs/extensionsystem/pluginspec_p.h +++ b/src/libs/extensionsystem/pluginspec_p.h @@ -56,7 +56,7 @@ public: bool read(const QString &fileName); bool provides(const QString &pluginName, const QString &version) const; - bool resolveDependencies(const QSet<PluginSpec *> &specs); + bool resolveDependencies(const QList<PluginSpec *> &specs); bool loadLibrary(); bool initializePlugin(); bool initializeExtensions(); -- GitLab