aboutsummaryrefslogtreecommitdiff
path: root/base/plugins.h
diff options
context:
space:
mode:
authorYotam Barnoy2010-12-23 13:38:37 +0000
committerYotam Barnoy2010-12-23 13:38:37 +0000
commitee2b1092ab35be717c728ea641d18baa7f817536 (patch)
treeb74d04f75701e2d28bdae48f05d5d97854902062 /base/plugins.h
parent401a8c355d1b8af353db0df6dab6117cb725f756 (diff)
downloadscummvm-rg350-ee2b1092ab35be717c728ea641d18baa7f817536.tar.gz
scummvm-rg350-ee2b1092ab35be717c728ea641d18baa7f817536.tar.bz2
scummvm-rg350-ee2b1092ab35be717c728ea641d18baa7f817536.zip
PLUGINS: switched plugin manager to inheritance rather than #defines
The reason for this was that I found issues where the wrong functions were called in EngineManager for single plugin operation. Rather than inserting more messy #defines, I preferred to change the PluginManager to use virtual functions, which also makes EngineManager simpler. svn-id: r55024
Diffstat (limited to 'base/plugins.h')
-rw-r--r--base/plugins.h49
1 files changed, 36 insertions, 13 deletions
diff --git a/base/plugins.h b/base/plugins.h
index fc8adbf0d4..f78db5cd88 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -298,35 +298,58 @@ protected:
* Singleton class which manages all plugins, including loading them,
* managing all Plugin class instances, and unloading them.
*/
-class PluginManager : public Common::Singleton<PluginManager> {
+class PluginManager {
+protected:
typedef Common::Array<PluginProvider *> ProviderList;
-private:
+
PluginList _pluginsInMem[PLUGIN_TYPE_MAX];
ProviderList _providers;
- PluginList _allEnginePlugins;
- PluginList::iterator _currentPlugin;
-
bool tryLoadPlugin(Plugin *plugin);
void addToPluginsInMemList(Plugin *plugin);
- friend class Common::Singleton<SingletonBaseType>;
- PluginManager();
+ static PluginManager *_instance;
+ PluginManager();
public:
- ~PluginManager();
+ virtual ~PluginManager();
+
+ static void createInstance(bool cached);
+ static void destroy() { delete _instance; }
+ static PluginManager &instance();
void addPluginProvider(PluginProvider *pp);
- void loadNonEnginePluginsAndEnumerate();
- void loadFirstPlugin();
- bool loadNextPlugin();
+ virtual void init() {}
+ virtual void loadFirstPlugin() {}
+ virtual bool loadNextPlugin() { return false; }
- void loadPlugins();
- void unloadPlugins();
+ virtual void loadAllPlugins();
+ void unloadAllPlugins();
+
void unloadPluginsExcept(PluginType type, const Plugin *plugin, bool deletePlugin = true);
const PluginList &getPlugins(PluginType t) { return _pluginsInMem[t]; }
};
+/**
+ * Uncached version of plugin manager
+ * Keeps only one dynamic plugin in memory at a time
+ **/
+class PluginManagerUncached : public PluginManager {
+protected:
+ friend class PluginManager;
+ PluginList _allEnginePlugins;
+ PluginList::iterator _currentPlugin;
+
+ PluginManagerUncached() {}
+
+public:
+ virtual void init();
+ virtual void loadFirstPlugin();
+ virtual bool loadNextPlugin();
+
+ virtual void loadAllPlugins() {} // we don't allow this
+};
+
#endif