diff options
author | Carl C. Trieloff <cctrieloff@apache.org> | 2007-07-05 19:01:00 +0000 |
---|---|---|
committer | Carl C. Trieloff <cctrieloff@apache.org> | 2007-07-05 19:01:00 +0000 |
commit | 36f5a0ce28b899a958715de7cc9767bc14769182 (patch) | |
tree | 30f1c06504e5fc364bf02ca883f0c5311328e312 /cpp/src/qpid/broker/BrokerQueue.cpp | |
parent | f5cb61793d78601f87cd5054cc83ad35eed2dda7 (diff) | |
download | qpid-python-36f5a0ce28b899a958715de7cc9767bc14769182.tar.gz |
- replaced Mutexes with 2 RWlocks, about 2% less time in wait-state with change.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@553611 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/BrokerQueue.cpp')
-rw-r--r-- | cpp/src/qpid/broker/BrokerQueue.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/cpp/src/qpid/broker/BrokerQueue.cpp b/cpp/src/qpid/broker/BrokerQueue.cpp index 8ec2064680..0e5e0f2bb1 100644 --- a/cpp/src/qpid/broker/BrokerQueue.cpp +++ b/cpp/src/qpid/broker/BrokerQueue.cpp @@ -69,14 +69,14 @@ void Queue::recover(Message::shared_ptr& msg){ } void Queue::process(Message::shared_ptr& msg){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); if(queueing || !dispatch(msg)){ push(msg); } } void Queue::requeue(Message::shared_ptr& msg){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); if(queueing || !dispatch(msg)){ queueing = true; messages.push_front(msg); @@ -105,7 +105,7 @@ bool Queue::dispatch(Message::shared_ptr& msg){ } bool Queue::startDispatching(){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedRlock locker(messageLock); if(queueing && !dispatching){ dispatching = true; return true; @@ -117,7 +117,7 @@ bool Queue::startDispatching(){ void Queue::dispatch(){ bool proceed = startDispatching(); while(proceed){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); if(!messages.empty() && dispatch(messages.front())){ pop(); }else{ @@ -129,7 +129,7 @@ void Queue::dispatch(){ } void Queue::consume(Consumer* c, bool requestExclusive){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(consumerLock); if(exclusive) throw ChannelException( 403, format("Queue '%s' has an exclusive consumer." @@ -145,7 +145,7 @@ void Queue::consume(Consumer* c, bool requestExclusive){ } void Queue::cancel(Consumer* c){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(consumerLock); Consumers::iterator i = std::find(consumers.begin(), consumers.end(), c); if (i != consumers.end()) consumers.erase(i); @@ -153,7 +153,7 @@ void Queue::cancel(Consumer* c){ } Message::shared_ptr Queue::dequeue(){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); Message::shared_ptr msg; if(!messages.empty()){ msg = messages.front(); @@ -163,7 +163,7 @@ Message::shared_ptr Queue::dequeue(){ } uint32_t Queue::purge(){ - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); int count = messages.size(); while(!messages.empty()) pop(); return count; @@ -186,17 +186,17 @@ void Queue::push(Message::shared_ptr& msg){ } uint32_t Queue::getMessageCount() const{ - Mutex::ScopedLock locker(lock); + RWlock::ScopedRlock locker(messageLock); return messages.size(); } uint32_t Queue::getConsumerCount() const{ - Mutex::ScopedLock locker(lock); + RWlock::ScopedRlock locker(consumerLock); return consumers.size(); } bool Queue::canAutoDelete() const{ - Mutex::ScopedLock locker(lock); + RWlock::ScopedRlock locker(consumerLock); return autodelete && consumers.size() == 0; } @@ -241,7 +241,7 @@ void Queue::configure(const FieldTable& _settings) void Queue::destroy() { if (alternateExchange.get()) { - Mutex::ScopedLock locker(lock); + RWlock::ScopedWlock locker(messageLock); while(!messages.empty()){ DeliverableMessage msg(messages.front()); alternateExchange->route(msg, msg.getMessage().getRoutingKey(), |