@@ -2406,12 +2406,14 @@ inline bool keep_alive(socket_t sock, time_t keep_alive_timeout_sec) {
2406
2406
2407
2407
template <typename T>
2408
2408
inline bool
2409
- process_server_socket_core (socket_t sock, size_t keep_alive_max_count,
2409
+ process_server_socket_core (const std::atomic<socket_t > &svr_sock, socket_t sock,
2410
+ size_t keep_alive_max_count,
2410
2411
time_t keep_alive_timeout_sec, T callback) {
2411
2412
assert (keep_alive_max_count > 0 );
2412
2413
auto ret = false ;
2413
2414
auto count = keep_alive_max_count;
2414
- while (count > 0 && keep_alive (sock, keep_alive_timeout_sec)) {
2415
+ while (svr_sock != INVALID_SOCKET && count > 0 &&
2416
+ keep_alive (sock, keep_alive_timeout_sec)) {
2415
2417
auto close_connection = count == 1 ;
2416
2418
auto connection_closed = false ;
2417
2419
ret = callback (close_connection, connection_closed);
@@ -2423,12 +2425,13 @@ process_server_socket_core(socket_t sock, size_t keep_alive_max_count,
2423
2425
2424
2426
template <typename T>
2425
2427
inline bool
2426
- process_server_socket (socket_t sock, size_t keep_alive_max_count,
2428
+ process_server_socket (const std::atomic<socket_t > &svr_sock, socket_t sock,
2429
+ size_t keep_alive_max_count,
2427
2430
time_t keep_alive_timeout_sec, time_t read_timeout_sec,
2428
2431
time_t read_timeout_usec, time_t write_timeout_sec,
2429
2432
time_t write_timeout_usec, T callback) {
2430
2433
return process_server_socket_core (
2431
- sock, keep_alive_max_count, keep_alive_timeout_sec,
2434
+ svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec,
2432
2435
[&](bool close_connection, bool &connection_closed) {
2433
2436
SocketStream strm (sock, read_timeout_sec, read_timeout_usec,
2434
2437
write_timeout_sec, write_timeout_usec);
@@ -5540,8 +5543,9 @@ inline bool Server::is_valid() const { return true; }
5540
5543
5541
5544
inline bool Server::process_and_close_socket (socket_t sock) {
5542
5545
auto ret = detail::process_server_socket (
5543
- sock, keep_alive_max_count_, keep_alive_timeout_sec_, read_timeout_sec_,
5544
- read_timeout_usec_, write_timeout_sec_, write_timeout_usec_,
5546
+ svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
5547
+ read_timeout_sec_, read_timeout_usec_, write_timeout_sec_,
5548
+ write_timeout_usec_,
5545
5549
[this ](Stream &strm, bool close_connection, bool &connection_closed) {
5546
5550
return process_request (strm, close_connection, connection_closed,
5547
5551
nullptr );
@@ -6904,14 +6908,13 @@ bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl,
6904
6908
}
6905
6909
6906
6910
template <typename T>
6907
- inline bool
6908
- process_server_socket_ssl (SSL *ssl, socket_t sock, size_t keep_alive_max_count,
6909
- time_t keep_alive_timeout_sec,
6910
- time_t read_timeout_sec, time_t read_timeout_usec,
6911
- time_t write_timeout_sec, time_t write_timeout_usec,
6912
- T callback) {
6911
+ inline bool process_server_socket_ssl (
6912
+ const std::atomic<socket_t > &svr_sock, SSL *ssl, socket_t sock,
6913
+ size_t keep_alive_max_count, time_t keep_alive_timeout_sec,
6914
+ time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec,
6915
+ time_t write_timeout_usec, T callback) {
6913
6916
return process_server_socket_core (
6914
- sock, keep_alive_max_count, keep_alive_timeout_sec,
6917
+ svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec,
6915
6918
[&](bool close_connection, bool &connection_closed) {
6916
6919
SSLSocketStream strm (sock, ssl, read_timeout_sec, read_timeout_usec,
6917
6920
write_timeout_sec, write_timeout_usec);
@@ -7170,7 +7173,7 @@ inline bool SSLServer::process_and_close_socket(socket_t sock) {
7170
7173
bool ret = false ;
7171
7174
if (ssl) {
7172
7175
ret = detail::process_server_socket_ssl (
7173
- ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
7176
+ svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
7174
7177
read_timeout_sec_, read_timeout_usec_, write_timeout_sec_,
7175
7178
write_timeout_usec_,
7176
7179
[this , ssl](Stream &strm, bool close_connection,
0 commit comments