diff options
| author | Alan Conway <aconway@apache.org> | 2012-06-12 21:20:17 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2012-06-12 21:20:17 +0000 |
| commit | 68ec17cbe42066fae4f4ebdec810a922794d2701 (patch) | |
| tree | 02d1bdae609d429376f7f47cc781114893c78f08 /cpp/src/qpid/broker/ExchangeRegistry.cpp | |
| parent | ed0d321d0ad56b9ea3d370d8b6b34fce2c8ef892 (diff) | |
| download | qpid-python-68ec17cbe42066fae4f4ebdec810a922794d2701.tar.gz | |
QPID-3603: Move calls to ConfigurationObserver outside of locks.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1349541 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/ExchangeRegistry.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/ExchangeRegistry.cpp | 80 |
1 files changed, 43 insertions, 37 deletions
diff --git a/cpp/src/qpid/broker/ExchangeRegistry.cpp b/cpp/src/qpid/broker/ExchangeRegistry.cpp index dde59d41c1..b31c7bd7b8 100644 --- a/cpp/src/qpid/broker/ExchangeRegistry.cpp +++ b/cpp/src/qpid/broker/ExchangeRegistry.cpp @@ -43,39 +43,42 @@ pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare(const string& name, c pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare(const string& name, const string& type, bool durable, const FieldTable& args){ - RWlock::ScopedWlock locker(lock); - ExchangeMap::iterator i = exchanges.find(name); - if (i == exchanges.end()) { - Exchange::shared_ptr exchange; - - if (type == TopicExchange::typeName){ - exchange = Exchange::shared_ptr(new TopicExchange(name, durable, args, parent, broker)); - }else if(type == DirectExchange::typeName){ - exchange = Exchange::shared_ptr(new DirectExchange(name, durable, args, parent, broker)); - }else if(type == FanOutExchange::typeName){ - exchange = Exchange::shared_ptr(new FanOutExchange(name, durable, args, parent, broker)); - }else if (type == HeadersExchange::typeName) { - exchange = Exchange::shared_ptr(new HeadersExchange(name, durable, args, parent, broker)); - }else if (type == ManagementDirectExchange::typeName) { - exchange = Exchange::shared_ptr(new ManagementDirectExchange(name, durable, args, parent, broker)); - }else if (type == ManagementTopicExchange::typeName) { - exchange = Exchange::shared_ptr(new ManagementTopicExchange(name, durable, args, parent, broker)); - }else if (type == Link::exchangeTypeName) { - exchange = Link::linkExchangeFactory(name); - }else{ - FunctionMap::iterator i = factory.find(type); - if (i == factory.end()) { - throw UnknownExchangeTypeException(); - } else { - exchange = i->second(name, durable, args, parent, broker); + Exchange::shared_ptr exchange; + std::pair<Exchange::shared_ptr, bool> result; + { + RWlock::ScopedWlock locker(lock); + ExchangeMap::iterator i = exchanges.find(name); + if (i == exchanges.end()) { + if (type == TopicExchange::typeName){ + exchange = Exchange::shared_ptr(new TopicExchange(name, durable, args, parent, broker)); + }else if(type == DirectExchange::typeName){ + exchange = Exchange::shared_ptr(new DirectExchange(name, durable, args, parent, broker)); + }else if(type == FanOutExchange::typeName){ + exchange = Exchange::shared_ptr(new FanOutExchange(name, durable, args, parent, broker)); + }else if (type == HeadersExchange::typeName) { + exchange = Exchange::shared_ptr(new HeadersExchange(name, durable, args, parent, broker)); + }else if (type == ManagementDirectExchange::typeName) { + exchange = Exchange::shared_ptr(new ManagementDirectExchange(name, durable, args, parent, broker)); + }else if (type == ManagementTopicExchange::typeName) { + exchange = Exchange::shared_ptr(new ManagementTopicExchange(name, durable, args, parent, broker)); + }else if (type == Link::exchangeTypeName) { + exchange = Link::linkExchangeFactory(name); + }else{ + FunctionMap::iterator i = factory.find(type); + if (i == factory.end()) { + throw UnknownExchangeTypeException(); + } else { + exchange = i->second(name, durable, args, parent, broker); + } } + exchanges[name] = exchange; + result = std::pair<Exchange::shared_ptr, bool>(exchange, true); + } else { + result = std::pair<Exchange::shared_ptr, bool>(i->second, false); } - if (broker) broker->getConfigurationObservers().exchangeCreate(exchange); - exchanges[name] = exchange; - return std::pair<Exchange::shared_ptr, bool>(exchange, true); - } else { - return std::pair<Exchange::shared_ptr, bool>(i->second, false); } + if (broker && exchange) broker->getConfigurationObservers().exchangeCreate(exchange); + return result; } void ExchangeRegistry::destroy(const string& name){ @@ -84,14 +87,17 @@ void ExchangeRegistry::destroy(const string& name){ (name == "amq.direct" || name == "amq.fanout" || name == "amq.topic" || name == "amq.match")) || name == "qpid.management") throw framing::NotAllowedException(QPID_MSG("Cannot delete default exchange: '" << name << "'")); - RWlock::ScopedWlock locker(lock); - ExchangeMap::iterator i = exchanges.find(name); - if (i != exchanges.end()) { - Exchange::shared_ptr ex = i->second; - i->second->destroy(); - exchanges.erase(i); - if (broker) broker->getConfigurationObservers().exchangeDestroy(ex); + Exchange::shared_ptr exchange; + { + RWlock::ScopedWlock locker(lock); + ExchangeMap::iterator i = exchanges.find(name); + if (i != exchanges.end()) { + exchange = i->second; + i->second->destroy(); + exchanges.erase(i); + } } + if (broker && exchange) broker->getConfigurationObservers().exchangeDestroy(exchange); } Exchange::shared_ptr ExchangeRegistry::find(const string& name){ |
