Skip to content

Commit

Permalink
Add EINTR and EAGAIN judge for accept (#1438)
Browse files Browse the repository at this point in the history
* Add EINTR and EAGAIN judge for accept

* Add EINTR signal tests

* Cancel win32 and win64 compile on signal unittest

Co-authored-by: yukun.yu <[email protected]>
  • Loading branch information
fishpenguin and yukun.yu authored Dec 21, 2022
1 parent 93e53c9 commit 227d2c2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
2 changes: 2 additions & 0 deletions httplib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_);
Expand Down
39 changes: 39 additions & 0 deletions test/test.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <httplib.h>
#include <signal.h>

#include <gtest/gtest.h>

Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 227d2c2

Please sign in to comment.