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