From ee2b1092ab35be717c728ea641d18baa7f817536 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Thu, 23 Dec 2010 13:38:37 +0000 Subject: 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 --- base/plugins.h | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) (limited to 'base/plugins.h') 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 { +class PluginManager { +protected: typedef Common::Array 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; - 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 -- cgit v1.2.3