You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2009/08/13 09:47:43 UTC

svn commit: r803802 - in /qpid/trunk/qpid/cpp/src/qpid/client: ConnectionHandler.cpp StateManager.cpp StateManager.h

Author: gsim
Date: Thu Aug 13 07:47:43 2009
New Revision: 803802

URL: http://svn.apache.org/viewvc?rev=803802&view=rev
Log:
QPID-2048: Handle connection fail while attempting to close.


Modified:
    qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/StateManager.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/StateManager.h

Modified: qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp?rev=803802&r1=803801&r2=803802&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/ConnectionHandler.cpp Thu Aug 13 07:47:43 2009
@@ -147,11 +147,15 @@
         fail("Connection closed before it was established");
         break;
       case OPEN:
-        setState(CLOSING);
-        proxy.close(200, OK);
-        waitFor(FINISHED);
+        if (setState(CLOSING, OPEN)) {
+            proxy.close(200, OK);
+            waitFor(FINISHED);//FINISHED = CLOSED or FAILED
+        }
+        //else, state was changed from open after we checked, can only
+        //change to failed or closed, so nothing to do
         break;
-        // Nothing to do for CLOSING, CLOSED, FAILED or NOT_STARTED
+
+        // Nothing to do if already CLOSING, CLOSED, FAILED or if NOT_STARTED
     }
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/client/StateManager.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/StateManager.cpp?rev=803802&r1=803801&r2=803802&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/StateManager.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/StateManager.cpp Thu Aug 13 07:47:43 2009
@@ -60,6 +60,18 @@
     stateLock.notifyAll();
 }
 
+bool StateManager::setState(int s, int expected)
+{
+    Monitor::ScopedLock l(stateLock);
+    if (state == expected) {
+        state = s;
+        stateLock.notifyAll();
+        return true;
+    } else {
+        return false;
+    }
+}
+
 int StateManager::getState() const
 {
     Monitor::ScopedLock l(stateLock);

Modified: qpid/trunk/qpid/cpp/src/qpid/client/StateManager.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/StateManager.h?rev=803802&r1=803801&r2=803802&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/StateManager.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/StateManager.h Thu Aug 13 07:47:43 2009
@@ -36,6 +36,7 @@
 public:
     StateManager(int initial);
     void setState(int state);
+    bool setState(int state, int expected);
     int getState() const ;
     void waitForStateChange(int current);
     void waitFor(std::set<int> states);



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