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;


Reply via email to