Author: cctrieloff
Date: Thu Jul 5 12:01:00 2007
New Revision: 553611
URL: http://svn.apache.org/viewvc?view=rev&rev=553611
Log:
- replaced Mutexes with 2 RWlocks, about 2% less time in wait-state with change.
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.h
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.cpp
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.cpp?view=diff&rev=553611&r1=553610&r2=553611
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.cpp Thu Jul 5
12:01:00 2007
@@ -69,14 +69,14 @@
}
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::startDispatching(){
- Mutex::ScopedLock locker(lock);
+ RWlock::ScopedRlock locker(messageLock);
if(queueing && !dispatching){
dispatching = true;
return true;
@@ -117,7 +117,7 @@
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::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::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 @@
}
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 @@
}
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 @@
}
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::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(),
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.h
URL:
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.h?view=diff&rev=553611&r1=553610&r2=553611
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/BrokerQueue.h Thu Jul 5
12:01:00 2007
@@ -68,7 +68,8 @@
bool queueing;
bool dispatching;
int next;
- mutable qpid::sys::Mutex lock;
+ mutable qpid::sys::RWlock consumerLock;
+ mutable qpid::sys::RWlock messageLock;
Consumer* exclusive;
mutable uint64_t persistenceId;
framing::FieldTable settings;