summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2016-04-05 21:50:04 +0000
committerAlan Conway <aconway@apache.org>2016-04-05 21:50:04 +0000
commiteb1e7851a50c6a7901c73eb42d639516c0e3ba43 (patch)
tree509c001a09e2b9fecaba5597fa41869f5fe7a4b1 /qpid/cpp/src/qpid/messaging/ProtocolRegistry.cpp
parentc9f1b7641fa089eca017a543991485be5de35775 (diff)
downloadqpid-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.cpp25
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