diff options
author | Alan Conway <aconway@apache.org> | 2016-04-05 21:50:04 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2016-04-05 21:50:04 +0000 |
commit | eb1e7851a50c6a7901c73eb42d639516c0e3ba43 (patch) | |
tree | 509c001a09e2b9fecaba5597fa41869f5fe7a4b1 /qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp | |
parent | c9f1b7641fa089eca017a543991485be5de35775 (diff) | |
download | qpid-python-eb1e7851a50c6a7901c73eb42d639516c0e3ba43.tar.gz |
QPID-7149: Fixed messaging client shutdown.
Fix previous commit that did not respect the plugin boundaries for
messaging::shutdown.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1737887 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp')
-rw-r--r-- | qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp b/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp index dbb0d6dfc2..ba55149048 100644 --- a/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp +++ b/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp @@ -20,9 +20,11 @@ */ #include "ProtocolRegistry.h" #include "qpid/messaging/exceptions.h" +#include "qpid/client/ConnectionImpl.h" #include "qpid/client/amqp0_10/ConnectionImpl.h" #include "qpid/client/LoadPlugins.h" #include "qpid/log/Statement.h" +#include "qpid/sys/Mutex.h" #include "qpid/Options.h" #include "qpid/StringUtils.h" #include "config.h" @@ -59,6 +61,7 @@ std::string join(const std::vector<std::string>& in, const std::string& base=EMP } typedef std::map<std::string, ProtocolRegistry::Factory*> Factories; +typedef std::vector<ProtocolRegistry::Shutdown*> Shutdowns; ConnectionImpl* create_0_10(const std::string& url, const qpid::types::Variant::Map& options) { @@ -71,6 +74,7 @@ class Registry Registry() { factories["amqp0-10"] = &create_0_10; + shutdowns.push_back(&qpid::client::shutdown); CommonOptions common("", "", QPIDC_CONF_FILE); ProtocolOptions options; try { @@ -96,9 +100,10 @@ class Registry return i->second; } } - void add(const std::string& name, ProtocolRegistry::Factory* factory) + void add(const std::string& name, ProtocolRegistry::Factory* factory, ProtocolRegistry::Shutdown* shutdown) { factories[name] = factory; + shutdowns.push_back(shutdown); } std::string getNames() const { @@ -128,8 +133,17 @@ class Registry } } } + void shutdown() { + sys::Mutex::ScopedLock l(shutdownLock); + while (!shutdowns.empty()) { + shutdowns.back()(); + shutdowns.pop_back(); + } + } private: Factories factories; + Shutdowns shutdowns; + sys::Mutex shutdownLock; std::vector<std::string> versions; }; @@ -192,9 +206,14 @@ ConnectionImpl* ProtocolRegistry::next(ConnectionImpl* last) throw MessagingException("No suitable protocol version supported by peer"); } -void ProtocolRegistry::add(const std::string& name, Factory* factory) +void ProtocolRegistry::add(const std::string& name, Factory* factory, Shutdown* shutdown) { - theRegistry().add(name, factory); + theRegistry().add(name, factory, shutdown); } +void ProtocolRegistry::shutdown() { + theRegistry().shutdown(); +} + + }} // namespace qpid::messaging |