From 4bc4518df026247efb536d00372d7e0c40c77fd1 Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Tue, 16 Apr 2013 11:26:13 -0500 Subject: [PATCH] Fixes send buffer going out of scope, references #209 --- websocketpp/connection.hpp | 4 ++++ websocketpp/impl/connection_impl.hpp | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/websocketpp/connection.hpp b/websocketpp/connection.hpp index c4113af371..fbf70f1f36 100644 --- a/websocketpp/connection.hpp +++ b/websocketpp/connection.hpp @@ -1038,6 +1038,10 @@ private: */ std::vector m_send_buffer; + /// a pointer to hold on to the current message being written to keep it + /// from going out of scope before the write is complete. + message_ptr m_current_msg; + /// True if there is currently an outstanding transport write /** * Lock m_write_lock diff --git a/websocketpp/impl/connection_impl.hpp b/websocketpp/impl/connection_impl.hpp index cae1f9c38a..34cb0271bf 100644 --- a/websocketpp/impl/connection_impl.hpp +++ b/websocketpp/impl/connection_impl.hpp @@ -1319,7 +1319,6 @@ template void connection::write_frame() { m_alog.write(log::alevel::devel,"connection write_frame"); - message_ptr msg; { scoped_lock_type lock(m_write_lock); @@ -1333,9 +1332,9 @@ void connection::write_frame() { // Get the next message in the queue. This will return an empty // message if the queue was empty. - msg = write_pop(); + m_current_msg = write_pop(); - if (!msg) { + if (!m_current_msg) { return; } @@ -1345,8 +1344,8 @@ void connection::write_frame() { m_write_flag = true; } - const std::string& header = msg->get_header(); - const std::string& payload = msg->get_payload(); + const std::string& header = m_current_msg->get_header(); + const std::string& payload = m_current_msg->get_payload(); m_send_buffer.push_back(transport::buffer(header.c_str(),header.size())); m_send_buffer.push_back(transport::buffer(payload.c_str(),payload.size())); @@ -1368,7 +1367,7 @@ void connection::write_frame() { lib::bind( &type::handle_write_frame, type::shared_from_this(), - msg->get_terminal(), + m_current_msg->get_terminal(), lib::placeholders::_1 ) ); @@ -1379,6 +1378,7 @@ void connection::handle_write_frame(bool terminate, const lib::error_code& ec) { m_send_buffer.clear(); + m_current_msg.reset(); if (ec) { m_elog.write(log::elevel::fatal,"error in handle_write_frame: "+ec.message());