Skip to content

Commit 742b596

Browse files
committed
refactor(RecordingWebsocketServer): replace accept loop with async accept for improved concurrency
1 parent 74d34ca commit 742b596

1 file changed

Lines changed: 19 additions & 18 deletions

File tree

tests/test_websocket_reconnect.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,18 @@ class RecordingWebsocketServer {
3131
RecordingWebsocketServer()
3232
: acceptor_(ioc_, tcp::endpoint(boost::asio::ip::make_address("127.0.0.1"), 0))
3333
, port_(acceptor_.local_endpoint().port())
34-
, accept_thread_([this] { accept_loop(); })
35-
{}
34+
{
35+
start_accept();
36+
io_thread_ = std::thread([this] { ioc_.run(); });
37+
}
3638

3739
~RecordingWebsocketServer() {
3840
stop_.store(true, std::memory_order_release);
3941

40-
boost::system::error_code ec;
41-
acceptor_.close(ec);
42+
ioc_.stop();
4243

43-
if (accept_thread_.joinable())
44-
accept_thread_.join();
44+
if (io_thread_.joinable())
45+
io_thread_.join();
4546

4647
for (auto& session : sessions_) {
4748
if (session.joinable())
@@ -66,17 +67,17 @@ class RecordingWebsocketServer {
6667
}
6768

6869
private:
69-
void accept_loop() {
70-
while (!stop_.load(std::memory_order_acquire)) {
71-
boost::system::error_code ec;
72-
tcp::socket socket(ioc_);
73-
acceptor_.accept(socket, ec);
74-
if (ec)
75-
break;
76-
sessions_.emplace_back([this, socket = std::move(socket)]() mutable {
77-
session_loop(std::move(socket));
78-
});
79-
}
70+
void start_accept() {
71+
acceptor_.async_accept([this](boost::system::error_code ec, tcp::socket socket) {
72+
if (!ec && !stop_.load(std::memory_order_acquire)) {
73+
sessions_.emplace_back([this, socket = std::move(socket)]() mutable {
74+
session_loop(std::move(socket));
75+
});
76+
}
77+
78+
if (!stop_.load(std::memory_order_acquire) && acceptor_.is_open())
79+
start_accept();
80+
});
8081
}
8182

8283
void session_loop(tcp::socket socket) {
@@ -104,7 +105,7 @@ class RecordingWebsocketServer {
104105
tcp::acceptor acceptor_;
105106
unsigned short port_;
106107
std::atomic_bool stop_{false};
107-
std::thread accept_thread_;
108+
std::thread io_thread_;
108109
std::vector<std::thread> sessions_;
109110

110111
mutable std::mutex messages_mutex_;

0 commit comments

Comments
 (0)