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/QueueRegistry.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/QueueRegistry.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/QueueRegistry.cpp | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/cpp/src/qpid/broker/QueueRegistry.cpp b/cpp/src/qpid/broker/QueueRegistry.cpp index 6647774168..2916d7bb93 100644 --- a/cpp/src/qpid/broker/QueueRegistry.cpp +++ b/cpp/src/qpid/broker/QueueRegistry.cpp @@ -47,31 +47,36 @@ QueueRegistry::declare(const string& declareName, bool durable, definition from persistente record*/) { - RWlock::ScopedWlock locker(lock); - string name = declareName.empty() ? generateName() : declareName; - assert(!name.empty()); - QueueMap::iterator i = queues.find(name); + Queue::shared_ptr queue; + std::pair<Queue::shared_ptr, bool> result; + { + RWlock::ScopedWlock locker(lock); + string name = declareName.empty() ? generateName() : declareName; + assert(!name.empty()); + QueueMap::iterator i = queues.find(name); - if (i == queues.end()) { - Queue::shared_ptr queue(new Queue(name, autoDelete, durable ? store : 0, owner, parent, broker)); - if (alternate) { - queue->setAlternateExchange(alternate);//need to do this *before* create - alternate->incAlternateUsers(); - } - if (!recovering) { - //apply settings & create persistent record if required - queue->create(arguments); + if (i == queues.end()) { + queue.reset(new Queue(name, autoDelete, durable ? store : 0, owner, parent, broker)); + if (alternate) { + queue->setAlternateExchange(alternate);//need to do this *before* create + alternate->incAlternateUsers(); + } + if (!recovering) { + //apply settings & create persistent record if required + queue->create(arguments); + } else { + //i.e. recovering a queue for which we already have a persistent record + queue->configure(arguments); + } + queues[name] = queue; + if (lastNode) queue->setLastNodeFailure(); + result = std::pair<Queue::shared_ptr, bool>(queue, true); } else { - //i.e. recovering a queue for which we already have a persistent record - queue->configure(arguments); + result = std::pair<Queue::shared_ptr, bool>(i->second, false); } - if (broker) broker->getConfigurationObservers().queueCreate(queue); - queues[name] = queue; - if (lastNode) queue->setLastNodeFailure(); - return std::pair<Queue::shared_ptr, bool>(queue, true); - } else { - return std::pair<Queue::shared_ptr, bool>(i->second, false); } + if (broker && queue) broker->getConfigurationObservers().queueCreate(queue); + return result; } void QueueRegistry::destroyLH (const string& name) { |
