From 9e115470654bf67fbb4720ab3bfb3768b9331e55 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 26 Jun 2008 21:39:28 +0000 Subject: Plugin framework change: single PluginFactory creates per-target Plugin instances. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@672032 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/Plugin.cpp | 55 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 19 deletions(-) (limited to 'cpp/src/qpid/Plugin.cpp') 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 +#include +#include 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::const_iterator Iter; + for (Iter i = Factory::getList().begin(); i != Factory::getList().end(); ++i) { + boost::shared_ptr 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 >::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& >(getList()).push_back(this); +} + +static sys::PODMutex PluginFactoryGetListLock; -const Plugin::Plugins& Plugin::getPlugins() { return thePlugins(); } +const std::vector& Plugin::Factory::getList() { + sys::PODMutex::ScopedLock l(PluginFactoryGetListLock); + static std::vector 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::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 -- cgit v1.2.1