Author: aconway
Date: Mon May 11 13:11:42 2009
New Revision: 773552

URL: http://svn.apache.org/viewvc?rev=773552&view=rev
Log:
Fix leak of Decoder map entries.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp
    qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.cpp
    qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.h

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp?rev=773552&r1=773551&r2=773552&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp Mon May 11 13:11:42 2009
@@ -172,6 +172,7 @@
 // Called by Connection::deliverClose() in deliverFrameQueue thread.
 void Cluster::erase(const ConnectionId& id) {
     connections.erase(id);
+    decoder.erase(id);
 }
 
 std::vector<string> Cluster::getIds() const {

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.cpp?rev=773552&r1=773551&r2=773552&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.cpp Mon May 11 13:11:42 2009
@@ -29,6 +29,7 @@
 namespace cluster {
 
 void Decoder::decode(const EventHeader& eh, const char* data) {
+    sys::Mutex::ScopedLock l(lock);
     assert(eh.getType() == DATA); // Only handle connection data events.
     const char* cp = static_cast<const char*>(data);
     framing::Buffer buf(const_cast<char*>(cp), eh.getSize());
@@ -36,26 +37,24 @@
     if (decoder.decode(buf)) {  // Decoded a frame
         framing::AMQFrame frame(decoder.getFrame());
         while (decoder.decode(buf)) {
-            process(EventFrame(eh, frame));
+            callback(EventFrame(eh, frame));
             frame = decoder.getFrame();
         }
         // Set read-credit on the last frame ending in this event.
         // Credit will be given when this frame is processed.
-        process(EventFrame(eh, frame, 1)); 
+        callback(EventFrame(eh, frame, 1)); 
     }
     else {
         // We must give 1 unit read credit per event.
         // This event does not complete any frames so 
         // send an empty frame with the read credit.
-        process(EventFrame(eh, framing::AMQFrame(), 1));
+        callback(EventFrame(eh, framing::AMQFrame(), 1));
     }    
 }
 
-void Decoder::process(const EventFrame& ef) {
-    //need to check that this is not the empty frame mentioned above
-    if (ef.frame.getBody() && ef.frame.getMethod() && 
ef.frame.getMethod()->isA<framing::ClusterConnectionDeliverCloseBody>())
-        map.erase(ef.connectionId);
-    callback(ef);
+void Decoder::erase(const ConnectionId& c) {
+    sys::Mutex::ScopedLock l(lock);
+    map.erase(c);
 }
 
 }} // namespace qpid::cluster

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.h?rev=773552&r1=773551&r2=773552&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/Decoder.h Mon May 11 13:11:42 2009
@@ -24,6 +24,7 @@
 
 #include "types.h"
 #include "qpid/framing/FrameDecoder.h"
+#include "qpid/sys/Mutex.h"
 #include <boost/function.hpp>
 #include <map>
 
@@ -48,6 +49,7 @@
 
   private:
     typedef std::map<ConnectionId, framing::FrameDecoder> Map;
+    sys::Mutex lock;
     Map map;
     void process(const EventFrame&);
     FrameHandler callback;



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to