Fix EINTR handling

This commit is contained in:
2025-08-23 17:28:34 -04:00
parent 5b4a28a8ca
commit a820efa2e6
6 changed files with 131 additions and 24 deletions

View File

@@ -59,18 +59,27 @@ Server::Server(const weaseldb::Config &config, ConnectionHandler &handler,
Server::~Server() {
if (shutdown_pipe_[0] != -1) {
close(shutdown_pipe_[0]);
int e;
do {
e = close(shutdown_pipe_[0]);
} while (e == -1 && errno == EINTR);
shutdown_pipe_[0] = -1;
}
if (shutdown_pipe_[1] != -1) {
close(shutdown_pipe_[1]);
int e;
do {
e = close(shutdown_pipe_[1]);
} while (e == -1 && errno == EINTR);
shutdown_pipe_[1] = -1;
}
// Close all epoll instances
for (int epollfd : epoll_fds_) {
if (epollfd != -1) {
close(epollfd);
int e;
do {
e = close(epollfd);
} while (e == -1 && errno == EINTR);
}
}
epoll_fds_.clear();
@@ -78,7 +87,10 @@ Server::~Server() {
// Close all listen sockets (Server always owns them)
for (int fd : listen_fds_) {
if (fd != -1) {
close(fd);
int e;
do {
e = close(fd);
} while (e == -1 && errno == EINTR);
}
}
@@ -214,8 +226,13 @@ int Server::createLocalConnection() {
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, server_fd, &event) == -1) {
perror("epoll_ctl ADD local connection");
connection_registry_.remove(server_fd);
close(server_fd);
close(client_fd);
int e;
do {
e = close(server_fd);
} while (e == -1 && errno == EINTR);
do {
e = close(client_fd);
} while (e == -1 && errno == EINTR);
return -1;
}
@@ -367,7 +384,10 @@ void Server::start_io_threads(std::vector<std::thread> &threads) {
if (config_.server.max_connections > 0 &&
active_connections_.load(std::memory_order_relaxed) >=
config_.server.max_connections) {
close(fd);
int e;
do {
e = close(fd);
} while (e == -1 && errno == EINTR);
continue;
}