Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Commit 6eef680

Browse files
committed
Improved fix to #26, connection object is now kept alive for sure till send_from_queue is finished.
1 parent c5d1103 commit 6eef680

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

server_ws.hpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@ namespace SimpleWeb {
5454

5555
class SendData {
5656
public:
57-
SendData(std::shared_ptr<Connection> connection, std::shared_ptr<SendStream> header_stream, std::shared_ptr<SendStream> message_stream,
57+
SendData(std::shared_ptr<SendStream> header_stream, std::shared_ptr<SendStream> message_stream,
5858
const std::function<void(const boost::system::error_code)> &callback) :
59-
connection(connection), header_stream(header_stream), message_stream(message_stream), callback(callback) {}
60-
std::shared_ptr<Connection> connection; //Added to keep the connection object alive
59+
header_stream(header_stream), message_stream(message_stream), callback(callback) {}
6160
std::shared_ptr<SendStream> header_stream;
6261
std::shared_ptr<SendStream> message_stream;
6362
std::function<void(const boost::system::error_code)> callback;
@@ -70,34 +69,31 @@ namespace SimpleWeb {
7069

7170
std::list<SendData> send_queue;
7271

73-
void send_from_queue() {
74-
strand.post([this]() {
72+
void send_from_queue(std::shared_ptr<Connection> connection) {
73+
strand.post([this, connection]() {
7574
boost::asio::async_write(*socket, send_queue.begin()->header_stream->streambuf,
76-
strand.wrap([this](const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
75+
strand.wrap([this, connection](const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
7776
if(!ec) {
7877
boost::asio::async_write(*socket, send_queue.begin()->message_stream->streambuf,
79-
strand.wrap([this]
78+
strand.wrap([this, connection]
8079
(const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
8180
auto send_queued=send_queue.begin();
8281
if(send_queued->callback)
8382
send_queued->callback(ec);
8483
if(!ec) {
8584
send_queue.erase(send_queued);
8685
if(send_queue.size()>0)
87-
send_from_queue();
88-
}
89-
else {
90-
for(auto it=send_queue.begin();it!=send_queue.end();)
91-
it=send_queue.erase(it);
86+
send_from_queue(connection);
9287
}
88+
else
89+
send_queue.clear();
9390
}));
9491
}
9592
else {
9693
auto send_queued=send_queue.begin();
9794
if(send_queued->callback)
9895
send_queued->callback(ec);
99-
for(auto it=send_queue.begin();it!=send_queue.end();)
100-
it=send_queue.erase(it);
96+
send_queue.clear();
10197
}
10298
}));
10399
});
@@ -258,9 +254,9 @@ namespace SimpleWeb {
258254
header_stream->put(static_cast<unsigned char>(length));
259255

260256
connection->strand.post([this, connection, header_stream, message_stream, callback]() {
261-
connection->send_queue.emplace_back(connection, header_stream, message_stream, callback);
257+
connection->send_queue.emplace_back(header_stream, message_stream, callback);
262258
if(connection->send_queue.size()==1)
263-
connection->send_from_queue();
259+
connection->send_from_queue(connection);
264260
});
265261
}
266262

0 commit comments

Comments
 (0)