From 43488f789f805d9cc377a9b6cdc1cabb2e2484d1 Mon Sep 17 00:00:00 2001 From: Tony Puccinelli Date: Sat, 14 Aug 2010 08:04:40 +0000 Subject: Ensured getPlugins is not called multiple times on Static Plugin Provider with 'ONE_PLUGIN_AT_A_TIME' defined svn-id: r52080 --- base/main.cpp | 7 ++++++- base/plugins.cpp | 31 +++++++++++++------------------ base/plugins.h | 16 ++++++++++++++-- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index 17acf58266..b925391a96 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -346,7 +346,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { #if defined(ONE_PLUGIN_AT_A_TIME) && defined(DYNAMIC_MODULES) // Only load non-engine plugins and first engine plugin initially in this case. - PluginManager::instance().loadFirstPlugin(); //This should be the only call to loadFirstPlugin external to the PluginManager class. + PluginManager::instance().loadFirstPlugin(); #else // Load the plugins. PluginManager::instance().loadPlugins(); @@ -433,7 +433,12 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { ConfMan.setActiveDomain(""); // PluginManager::instance().unloadPlugins(); + +#if defined(ONE_PLUGIN_AT_A_TIME) && defined(DYNAMIC_MODULES) + PluginManager::instance().loadFirstPlugin(); +#else PluginManager::instance().loadPlugins(); +#endif } else { // A dialog would be nicer, but we don't have any // screen to draw on yet. diff --git a/base/plugins.cpp b/base/plugins.cpp index dfb1d85141..a7e0036bac 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -284,7 +284,7 @@ DECLARE_SINGLETON(PluginManager) PluginManager::PluginManager() { // Always add the static plugin provider. addPluginProvider(new StaticPluginProvider()); - nonEnginePlugs = -1; + _skipStaticPlugs = false; } PluginManager::~PluginManager() { @@ -304,30 +304,25 @@ void PluginManager::addPluginProvider(PluginProvider *pp) { } void PluginManager::loadFirstPlugin() { //TODO: rename? It's not quite clear that this loads all non-engine plugins and first engine plugin. + unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL); _allPlugs.clear(); for (ProviderList::iterator pp = _providers.begin(); pp != _providers.end(); ++pp) { - PluginList pl((*pp)->getPlugins()); - for (PluginList::iterator p = pl.begin(); p != pl.end(); ++p) { - _allPlugs.push_back(*p); + if ((_skipStaticPlugs && (*pp)->isFilePluginProvider()) || !_skipStaticPlugs) { + PluginList pl((*pp)->getPlugins()); + for (PluginList::iterator p = pl.begin(); p != pl.end(); ++p) { + _allPlugs.push_back(*p); + } } } - _currentPlugin = _allPlugs.begin(); + _nonEnginePlugs = 0; + _skipStaticPlugs = true; //Only need to load static plugins once. - bool updateNonEnginePlugs; - if (nonEnginePlugs == -1) { //TODO: All of this assumes engine plugins will always be last in "plugs". Is this the case? - nonEnginePlugs = 0; - updateNonEnginePlugs = true; - } else { - for (int i=0; igetType() == PLUGIN_TYPE_ENGINE) { break; } - if (updateNonEnginePlugs) nonEnginePlugs++; + _nonEnginePlugs++; ++_currentPlugin; if (_currentPlugin == _allPlugs.end()) { break; //break if there were no engine plugins to load. @@ -347,7 +342,7 @@ void PluginManager::loadFirstPlugin() { //TODO: rename? It's not quite clear tha } bool PluginManager::loadNextPlugin() { - if (nonEnginePlugs == _allPlugs.size()) return false; //There are no Engine Plugins in this case. + if (_nonEnginePlugs == _allPlugs.size()) return false; //There are no Engine Plugins in this case. //To ensure only one engine plugin is loaded at a time, we unload all engine plugins before trying to load a new one. unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL); ++_currentPlugin; diff --git a/base/plugins.h b/base/plugins.h index 1c7b84e338..717e18a4a7 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -212,6 +212,11 @@ public: * @return a list of Plugin instances */ virtual PluginList getPlugins() = 0; + + /** + * @return whether or not object is a FilePluginProvider. + */ + virtual bool isFilePluginProvider() { return false; } }; #ifdef DYNAMIC_MODULES @@ -234,6 +239,11 @@ public: */ virtual PluginList getPlugins(); + /** + * @return whether or not object is a FilePluginProvider. + */ + bool isFilePluginProvider() { return true; } + protected: /** * Create a Plugin instance from a loadable code module with the specified name. @@ -279,8 +289,10 @@ private: PluginList _allPlugs; PluginList::iterator _currentPlugin; - int nonEnginePlugs; - + bool _skipStaticPlugs; + + int _nonEnginePlugs; + bool tryLoadPlugin(Plugin *plugin); friend class Common::Singleton; -- cgit v1.2.3