Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/marian-nmt/Simple-WebSocket-Server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreidheim <eidheim@gmail.com>2016-01-07 03:02:14 +0300
committereidheim <eidheim@gmail.com>2016-01-07 03:02:14 +0300
commit6eef68052980e9dff7227cb0ee1edb01daaa4db4 (patch)
treef749c1f816fb4ab7750050dc8397e309279803bb
parentc5d11030a397d03eb6d07a6380b6b4e83bb4a215 (diff)
Improved fix to #26, connection object is now kept alive for sure till send_from_queue is finished.v1.2.4
-rw-r--r--server_ws.hpp28
1 files 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> connection, std::shared_ptr<SendStream> header_stream, std::shared_ptr<SendStream> message_stream,
+ SendData(std::shared_ptr<SendStream> header_stream, std::shared_ptr<SendStream> message_stream,
const std::function<void(const boost::system::error_code)> &callback) :
- connection(connection), header_stream(header_stream), message_stream(message_stream), callback(callback) {}
- std::shared_ptr<Connection> connection; //Added to keep the connection object alive
+ header_stream(header_stream), message_stream(message_stream), callback(callback) {}
std::shared_ptr<SendStream> header_stream;
std::shared_ptr<SendStream> message_stream;
std::function<void(const boost::system::error_code)> callback;
@@ -70,13 +69,13 @@ namespace SimpleWeb {
std::list<SendData> send_queue;
- void send_from_queue() {
- strand.post([this]() {
+ void send_from_queue(std::shared_ptr<Connection> 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<unsigned char>(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);
});
}