summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/BrokerQueue.cpp
diff options
context:
space:
mode:
authorCarl C. Trieloff <cctrieloff@apache.org>2007-07-05 19:01:00 +0000
committerCarl C. Trieloff <cctrieloff@apache.org>2007-07-05 19:01:00 +0000
commit36f5a0ce28b899a958715de7cc9767bc14769182 (patch)
tree30f1c06504e5fc364bf02ca883f0c5311328e312 /cpp/src/qpid/broker/BrokerQueue.cpp
parentf5cb61793d78601f87cd5054cc83ad35eed2dda7 (diff)
downloadqpid-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.cpp24
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(),