From 8f06523c1abb56ab42ef1cd86a8e85fcc74ceb33 Mon Sep 17 00:00:00 2001
From: Tommaso Colombo <Tommaso.Colombo@cern.ch>
Date: Thu, 13 Feb 2014 19:23:40 +0000
Subject: [PATCH] Session: set state variables *before* calling state change
 completion methods

---
 src/Session.cxx | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/Session.cxx b/src/Session.cxx
index 542852a..a1fc19c 100644
--- a/src/Session.cxx
+++ b/src/Session.cxx
@@ -47,8 +47,8 @@ void Session::asyncOpen(const std::string& localName,
           m_socket.async_connect(remoteEndpoint, m_strand.wrap(
               [this, self] (const boost::system::error_code& error) {
                 if (error) {
-                  onOpenError(error);
                   abortOpen();
+                  onOpenError(error);
                 }
                 else {
                   startOpen(self);
@@ -72,21 +72,21 @@ void Session::startOpen(const std::shared_ptr<Session>& self)
   boost::asio::async_write(m_socket, boost::make_iterator_range(m_sendBuffers), m_strand.wrap(
       [this, self] (const boost::system::error_code& error, std::size_t) {
         if (error) {
-          onOpenError(error);
           abortOpen();
+          onOpenError(error);
           return;
         }
         // 3. Receive the HELLO message header
         boost::asio::async_read(m_socket, boost::asio::buffer(m_recvHeader.data()), m_strand.wrap(
             [this, self] (const boost::system::error_code& error, std::size_t) {
               if (error) {
-                onOpenError(error);
                 abortOpen();
+                onOpenError(error);
                 return;
               }
               if (m_recvHeader.typeId() != HELLO_MESSAGE_ID) {
-                onOpenError(Error::UNEXPECTED_MESSAGE_TYPE);
                 abortOpen();
+                onOpenError(Error::UNEXPECTED_MESSAGE_TYPE);
                 return;
               }
               // 4. Receive the HELLO message body
@@ -94,8 +94,8 @@ void Session::startOpen(const std::shared_ptr<Session>& self)
               boost::asio::async_read(m_socket, boost::asio::buffer(*storage), m_strand.wrap(
                   [this, self, storage] (const boost::system::error_code& error, std::size_t) {
                     if (error) {
-                      onOpenError(error);
                       abortOpen();
+                      onOpenError(error);
                       return;
                     }
                     m_remoteName.insert(m_remoteName.begin(), storage->begin(), storage->end());
@@ -108,11 +108,14 @@ void Session::startOpen(const std::shared_ptr<Session>& self)
 
 void Session::abortOpen()
 {
+  m_localName.clear();
+  m_remoteName.clear();
+  m_state = State::CLOSED;
+
   // abortOpen() is called if there was an error in one of the I/O operations in asyncOpen() or
   // startOpen(). We have to distinguish two cases:
   //  1) The error occurred because asyncClose() closed m_socket
   //  2) There was a "real" I/O error
-
   if (m_state == State::CLOSE_PENDING) {
     // case 1)
     onClose();
@@ -122,9 +125,6 @@ void Session::abortOpen()
     boost::system::error_code ignoredError;
     m_socket.close(ignoredError);
   }
-  m_localName.clear();
-  m_remoteName.clear();
-  m_state = State::CLOSED;
 }
 
 
@@ -156,10 +156,10 @@ void Session::asyncClose()
 void Session::checkClose()
 {
   if (m_state == State::CLOSE_PENDING && m_recvNPending == 0 && m_sendQueue.empty()) {
-    onClose();
     m_localName.clear();
     m_remoteName.clear();
     m_state = State::CLOSED;
+    onClose();
   }
 }
 
-- 
GitLab