You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2009/02/04 21:47:14 UTC

svn commit: r740872 - in /qpid/trunk/qpid/cpp/src/qpid/cluster: Connection.cpp OutputInterceptor.cpp OutputInterceptor.h

Author: aconway
Date: Wed Feb  4 20:47:14 2009
New Revision: 740872

URL: http://svn.apache.org/viewvc?rev=740872&view=rev
Log:
Fix assertion due to doOutput control being sent after local connection closed.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp
    qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.cpp
    qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.h

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp?rev=740872&r1=740871&r2=740872&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp Wed Feb  4 20:47:14 2009
@@ -112,7 +112,7 @@
                 cluster.addShadowConnection(this);
             AMQFrame ok((ConnectionCloseOkBody()));
             connection.getOutput().send(ok);
-            output.setOutputHandler(discardHandler);
+            output.closeOutput(discardHandler);
             catchUp = false;
         }
         else
@@ -165,7 +165,7 @@
             // This was a local replicated connection. Multicast a deliver
             // closed and process any outstanding frames from the cluster
             // until self-delivery of deliver-close.
-            output.setOutputHandler(discardHandler);
+            output.closeOutput(discardHandler);
             cluster.getMulticast().mcastControl(ClusterConnectionDeliverCloseBody(), self);
         }
     }

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.cpp?rev=740872&r1=740871&r2=740872&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.cpp Wed Feb  4 20:47:14 2009
@@ -34,7 +34,8 @@
 
 OutputInterceptor::OutputInterceptor(
     cluster::Connection& p, sys::ConnectionOutputHandler& h)
-    : parent(p), next(&h), sent(), writeEstimate(p.getCluster().getWriteEstimate()),
+    : parent(p), closing(false), next(&h), sent(),
+      writeEstimate(p.getCluster().getWriteEstimate()),
       moreOutput(), doingOutput()
 {}
 
@@ -54,7 +55,7 @@
         sys::Mutex::ScopedLock l(lock);
         next->activateOutput();
     }
-    else {
+    else if (!closing) {        // Don't send do ouput after output stopped.
         QPID_LOG(trace,  parent << " activateOutput - sending doOutput");
         moreOutput = true;
         sendDoOutput();
@@ -117,8 +118,9 @@
     QPID_LOG(trace, parent << "Send doOutput request for " << request);
 }
 
-void OutputInterceptor::setOutputHandler(sys::ConnectionOutputHandler& h) {
+void OutputInterceptor::closeOutput(sys::ConnectionOutputHandler& h) {
     sys::Mutex::ScopedLock l(lock);
+    closing = true;
     next = &h;
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.h?rev=740872&r1=740871&r2=740872&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/cluster/OutputInterceptor.h Wed Feb  4 20:47:14 2009
@@ -53,7 +53,7 @@
     // Intercept doOutput requests on Connection.
     bool doOutput();
 
-    void setOutputHandler(sys::ConnectionOutputHandler& h);
+    void closeOutput(sys::ConnectionOutputHandler& h);
 
     cluster::Connection& parent;
     
@@ -63,6 +63,7 @@
     void sendDoOutput();
 
     mutable sys::Mutex lock;
+    bool closing;
     sys::ConnectionOutputHandler* next;
     size_t sent;
     size_t lastDoOutput;



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org