summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/Plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/Plugin.cpp')
-rw-r--r--cpp/src/qpid/Plugin.cpp55
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