From 227d2c20509f85a394133e2be6d0b0fc1fda54b2 Mon Sep 17 00:00:00 2001 From: yukun Date: Wed, 21 Dec 2022 08:34:51 +0800 Subject: [PATCH] Add EINTR and EAGAIN judge for accept (#1438) * Add EINTR and EAGAIN judge for accept * Add EINTR signal tests * Cancel win32 and win64 compile on signal unittest Co-authored-by: yukun.yu --- httplib.h | 2 ++ test/test.cc | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/httplib.h b/httplib.h index 67fa1dd..751aa92 100644 --- a/httplib.h +++ b/httplib.h @@ -5507,6 +5507,8 @@ inline bool Server::listen_internal() { // Try to accept new connections after a short sleep. std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; + } else if (errno == EINTR || errno == EAGAIN) { + continue; } if (svr_sock_ != INVALID_SOCKET) { detail::close_socket(svr_sock_); diff --git a/test/test.cc b/test/test.cc index 23a6956..88937ce 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1,4 +1,5 @@ #include +#include #include @@ -943,6 +944,44 @@ TEST(UrlWithSpace, Redirect_Online) { #endif +#if !defined(_WIN32) && !defined(_WIN64) +TEST(ReceiveSignals, Signal) { + auto setupSignalHandlers = []() { + struct sigaction act; + + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + act.sa_sigaction = [](int sig, siginfo_t *, void *) { + switch (sig) { + case SIGINT: + default: break; + } + }; + ::sigaction(SIGINT, &act, nullptr); + }; + + Server svr; + int port = 0; + auto thread = std::thread([&]() { + setupSignalHandlers(); + port = svr.bind_to_any_port("localhost"); + svr.listen_after_bind(); + }); + + while (!svr.is_running()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + ASSERT_TRUE(svr.is_running()); + pthread_kill(thread.native_handle(), SIGINT); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + ASSERT_TRUE(svr.is_running()); + svr.stop(); + thread.join(); + ASSERT_FALSE(svr.is_running()); +} +#endif + TEST(RedirectToDifferentPort, Redirect) { Server svr1; svr1.Get("/1", [&](const Request & /*req*/, Response &res) {