From 6eef68052980e9dff7227cb0ee1edb01daaa4db4 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 7 Jan 2016 01:02:14 +0100 Subject: Improved fix to #26, connection object is now kept alive for sure till send_from_queue is finished. --- server_ws.hpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/server_ws.hpp b/server_ws.hpp index 003f29f..bdfa026 100644 --- a/server_ws.hpp +++ b/server_ws.hpp @@ -54,10 +54,9 @@ namespace SimpleWeb { class SendData { public: - SendData(std::shared_ptr connection, std::shared_ptr header_stream, std::shared_ptr message_stream, + SendData(std::shared_ptr header_stream, std::shared_ptr message_stream, const std::function &callback) : - connection(connection), header_stream(header_stream), message_stream(message_stream), callback(callback) {} - std::shared_ptr connection; //Added to keep the connection object alive + header_stream(header_stream), message_stream(message_stream), callback(callback) {} std::shared_ptr header_stream; std::shared_ptr message_stream; std::function callback; @@ -70,13 +69,13 @@ namespace SimpleWeb { std::list send_queue; - void send_from_queue() { - strand.post([this]() { + void send_from_queue(std::shared_ptr connection) { + strand.post([this, connection]() { boost::asio::async_write(*socket, send_queue.begin()->header_stream->streambuf, - strand.wrap([this](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + strand.wrap([this, connection](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { if(!ec) { boost::asio::async_write(*socket, send_queue.begin()->message_stream->streambuf, - strand.wrap([this] + strand.wrap([this, connection] (const boost::system::error_code& ec, size_t /*bytes_transferred*/) { auto send_queued=send_queue.begin(); if(send_queued->callback) @@ -84,20 +83,17 @@ namespace SimpleWeb { if(!ec) { send_queue.erase(send_queued); if(send_queue.size()>0) - send_from_queue(); - } - else { - for(auto it=send_queue.begin();it!=send_queue.end();) - it=send_queue.erase(it); + send_from_queue(connection); } + else + send_queue.clear(); })); } else { auto send_queued=send_queue.begin(); if(send_queued->callback) send_queued->callback(ec); - for(auto it=send_queue.begin();it!=send_queue.end();) - it=send_queue.erase(it); + send_queue.clear(); } })); }); @@ -258,9 +254,9 @@ namespace SimpleWeb { header_stream->put(static_cast(length)); connection->strand.post([this, connection, header_stream, message_stream, callback]() { - connection->send_queue.emplace_back(connection, header_stream, message_stream, callback); + connection->send_queue.emplace_back(header_stream, message_stream, callback); if(connection->send_queue.size()==1) - connection->send_from_queue(); + connection->send_from_queue(connection); }); } -- cgit v1.2.3