@@ -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
6869private:
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