servers: moved send_queued code into separate function from a lambda

This commit is contained in:
loonycyborg 2022-05-26 20:04:29 +03:00
parent bf2fdc6e4e
commit 330c13b2da
No known key found for this signature in database
GPG key ID: 6E8233FAB8F26D61
2 changed files with 21 additions and 14 deletions

View file

@ -534,24 +534,29 @@ template<class SocketPtr> std::unique_ptr<simple_wml::document> server_base::cor
template std::unique_ptr<simple_wml::document> server_base::coro_receive_doc<socket_ptr>(socket_ptr socket, boost::asio::yield_context yield);
template std::unique_ptr<simple_wml::document> server_base::coro_receive_doc<tls_socket_ptr>(tls_socket_ptr socket, boost::asio::yield_context yield);
template<class SocketPtr> void server_base::send_doc_queued(SocketPtr socket, std::unique_ptr<simple_wml::document>& doc_ptr, boost::asio::yield_context yield)
{
static std::map<SocketPtr, std::queue<std::unique_ptr<simple_wml::document>>> queues;
queues[socket].push(std::move(doc_ptr));
if(queues[socket].size() > 1) {
return;
}
while(queues[socket].size() > 0) {
boost::system::error_code error;
coro_send_doc(socket, *(queues[socket].front()), yield[error]);
check_error(error, socket);
queues[socket].pop();
}
queues.erase(socket);
}
template<class SocketPtr> void server_base::async_send_doc_queued(SocketPtr socket, simple_wml::document& doc)
{
boost::asio::spawn(
io_service_, [this, doc_ptr = doc.clone(), socket](boost::asio::yield_context yield) mutable {
static std::map<SocketPtr, std::queue<std::unique_ptr<simple_wml::document>>> queues;
queues[socket].push(std::move(doc_ptr));
if(queues[socket].size() > 1) {
return;
}
while(queues[socket].size() > 0) {
boost::system::error_code error;
coro_send_doc(socket, *(queues[socket].front()), yield[error]);
check_error(error, socket);
queues[socket].pop();
}
queues.erase(socket);
send_doc_queued(socket, doc_ptr, yield);
}
);
}

View file

@ -78,6 +78,8 @@ struct server_shutdown : public game::error
*/
class server_base
{
template<class SocketPtr> void send_doc_queued(SocketPtr socket, std::unique_ptr<simple_wml::document>& doc_ptr, boost::asio::yield_context yield);
public:
server_base(unsigned short port, bool keep_alive);
virtual ~server_base() {}