1818#include < cstddef>
1919#include < memory>
2020#include < stdexcept>
21+ #include < system_error>
2122#include < thread>
2223#include < utility>
2324
@@ -145,8 +146,7 @@ namespace vix::websocket
145146 endpoint.host = coreConfig_.getString (" websocket.host" , " 0.0.0.0" );
146147 endpoint.port = port;
147148
148- auto listen_task = listener_->async_listen (endpoint);
149- std::move (listen_task).start (ioContext_->get_scheduler ());
149+ listener_->listen (endpoint);
150150
151151 boundPort_.store (static_cast <int >(port), std::memory_order_relaxed);
152152 }
@@ -165,8 +165,8 @@ namespace vix::websocket
165165 init_logger_from_env_once ();
166166 vix::utils::console_wait_banner ();
167167
168- start_accept ();
169168 start_io_threads ();
169+ start_accept ();
170170 }
171171
172172 void LowLevelServer::start_accept ()
@@ -176,51 +176,76 @@ namespace vix::websocket
176176 return ;
177177 }
178178
179+ if (!listener_ || !listener_->is_open ())
180+ {
181+ throw std::runtime_error (" websocket listener is not open" );
182+ }
183+
179184 if (!logged_listen_.exchange (true , std::memory_order_acq_rel))
180185 {
181186 logger ().log (Logger::Level::Info,
182187 " [ws] listening on {}:{}" ,
183188 coreConfig_.getString (" websocket.host" , " 0.0.0.0" ),
184189 boundPort_.load (std::memory_order_relaxed));
185- }
186190
187- spawn_detached (*ioContext_, accept_loop ());
191+ spawn_detached (*ioContext_, accept_loop ());
192+ }
188193 }
189194
190195 vix::async::core::task<void > LowLevelServer::accept_loop ()
191196 {
192197 while (!stopRequested_.load (std::memory_order_acquire))
193198 {
199+ if (!listener_ || !listener_->is_open ())
200+ {
201+ break ;
202+ }
203+
194204 try
195205 {
196206 auto stream = co_await listener_->async_accept ();
197207
198208 if (!stream)
199209 {
210+ if (stopRequested_.load (std::memory_order_acquire) ||
211+ !listener_ || !listener_->is_open ())
212+ {
213+ break ;
214+ }
215+
200216 continue ;
201217 }
202218
203219 if (stopRequested_.load (std::memory_order_acquire))
204220 {
205221 close_stream (std::move (stream));
206- co_return ;
222+ break ;
207223 }
208224
209225 spawn_detached (*ioContext_, handle_client (std::move (stream)));
210226 }
211227 catch (const std::exception &e)
212228 {
213- if (!stopRequested_.load (std::memory_order_acquire))
229+ if (stopRequested_.load (std::memory_order_acquire) ||
230+ !listener_ || !listener_->is_open ())
214231 {
215- logger ().log (Logger::Level::Debug,
216- " [ws] accept error ({})" ,
217- e.what ());
232+ break ;
218233 }
219234
220- if (stopRequested_.load (std::memory_order_acquire))
235+ const auto *se = dynamic_cast <const std::system_error *>(&e);
236+ if (se)
221237 {
222- break ;
238+ const auto code = se->code ();
239+ if (code == std::errc::operation_canceled ||
240+ code == std::errc::bad_file_descriptor)
241+ {
242+ break ;
243+ }
223244 }
245+
246+ logger ().log (Logger::Level::Debug,
247+ " [ws] accept error ({})" ,
248+ e.what ());
224249 }
225250 }
226251
0 commit comments