diff options
Diffstat (limited to 'cpp/src/qpid/Plugin.cpp')
-rw-r--r-- | cpp/src/qpid/Plugin.cpp | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/cpp/src/qpid/Plugin.cpp b/cpp/src/qpid/Plugin.cpp index 733d134334..84dc5a0107 100644 --- a/cpp/src/qpid/Plugin.cpp +++ b/cpp/src/qpid/Plugin.cpp @@ -19,36 +19,53 @@ */ #include "Plugin.h" -#include "qpid/Options.h" +#include <qpid/shared_ptr.h> +#include <qpid/Options.h> +#include <qpid/sys/Mutex.h> namespace qpid { -namespace { -Plugin::Plugins& thePlugins() { - // This is a single threaded singleton implementation so - // it is important to be sure that the first use of this - // singleton is when the program is still single threaded - static Plugin::Plugins plugins; - return plugins; -} +Plugin::Target::~Target() {} + +void Plugin::Target::createPlugins() { + typedef std::vector<Plugin::Factory*>::const_iterator Iter; + for (Iter i = Factory::getList().begin(); i != Factory::getList().end(); ++i) { + boost::shared_ptr<Plugin> plugin = (**i).create(*this); + if (plugin) + plugins.push_back(plugin); + } } -Plugin::Plugin() { - // Register myself. - thePlugins().push_back(this); +void Plugin::Target::initializePlugins() { + typedef std::vector<boost::shared_ptr<Plugin> >::iterator Iter; + for (Iter i = plugins.begin(); i != plugins.end(); ++i) + (**i).initialize(*this); } -Plugin::~Plugin() {} +void Plugin::Target::releasePlugins() { plugins.clear(); } + +Plugin::Factory::~Factory() {} -Options* Plugin::getOptions() { return 0; } +Plugin::Factory::Factory() { + const_cast<std::vector<Plugin::Factory*>& >(getList()).push_back(this); +} + +static sys::PODMutex PluginFactoryGetListLock; -const Plugin::Plugins& Plugin::getPlugins() { return thePlugins(); } +const std::vector<Plugin::Factory*>& Plugin::Factory::getList() { + sys::PODMutex::ScopedLock l(PluginFactoryGetListLock); + static std::vector<Plugin::Factory*> list; + return list; +} -void Plugin::addOptions(Options& opts) { - for (Plugins::const_iterator i = getPlugins().begin(); i != getPlugins().end(); ++i) { - if ((*i)->getOptions()) - opts.add(*(*i)->getOptions()); +void Plugin::Factory::addOptions(Options& opts) { + typedef std::vector<Plugin::Factory*>::const_iterator Iter; + for (Iter i = Factory::getList().begin(); i != Factory::getList().end(); ++i) { + if ((**i).getOptions()) + opts.add(*(**i).getOptions()); } } +Plugin::~Plugin() {} + } // namespace qpid |