Correctly handle EINTR while doing I/O..

Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
This commit is contained in:
Toni Uhlig
2023-07-18 13:51:00 +02:00
parent 344934b7d9
commit c57ace2fd3
2 changed files with 31 additions and 9 deletions

View File

@@ -360,6 +360,10 @@ static void * nDPIsrvd_mainloop_thread(void * const arg)
logger(1, "%s", "nDPIsrvd epoll wait failed.");
THREAD_ERROR_GOTO(arg);
}
else if (errno == EINTR)
{
continue;
}
for (int i = 0; i < nready; i++)
{
@@ -374,7 +378,8 @@ static void * nDPIsrvd_mainloop_thread(void * const arg)
if (remote == mock_json_desc)
{
remote_desc_name = "Mock JSON";
do {
do
{
if (mock_test_desc->fd >= 0)
drain_write_buffers_blocking(mock_test_desc);
if (mock_buff_desc->fd >= 0)
@@ -906,6 +911,10 @@ static void * distributor_client_mainloop_thread(void * const arg)
logger(1, "%s", "Distributor epoll wait failed.");
THREAD_ERROR_GOTO(trv);
}
else if (nready < 0 && errno == EINTR)
{
continue;
}
for (int i = 0; i < nready; i++)
{

View File

@@ -301,6 +301,7 @@ static void logger_nDPIsrvd(struct remote_desc const * const remote,
static int drain_main_buffer(struct remote_desc * const remote)
{
ssize_t bytes_written;
struct nDPIsrvd_write_buffer * const write_buffer = get_write_buffer(remote);
if (write_buffer == NULL)
@@ -314,7 +315,7 @@ static int drain_main_buffer(struct remote_desc * const remote)
}
errno = 0;
ssize_t bytes_written = write(remote->fd, write_buffer->buf.ptr.raw, write_buffer->buf.used);
while ((bytes_written = write(remote->fd, write_buffer->buf.ptr.raw, write_buffer->buf.used)) < 0 && errno == EINTR) { errno = 0; }
if (errno == EAGAIN)
{
return 0;
@@ -358,8 +359,9 @@ static int drain_write_buffers(struct remote_desc * const remote)
while (utarray_len(additional_write_buffers) > 0)
{
struct nDPIsrvd_write_buffer * buf = (struct nDPIsrvd_write_buffer *)utarray_front(additional_write_buffers);
ssize_t written = write(remote->fd, buf->buf.ptr.raw + buf->written, buf->buf.used - buf->written);
ssize_t written;
while ((written = write(remote->fd, buf->buf.ptr.raw + buf->written, buf->buf.used - buf->written)) < 0 && errno == EINTR) {}
switch (written)
{
case -1:
@@ -732,6 +734,7 @@ static void free_remotes(int epollfd)
static int add_event(int epollfd, int events, int fd, void * ptr)
{
int retval;
struct epoll_event event = {};
if (ptr != NULL)
@@ -744,7 +747,8 @@ static int add_event(int epollfd, int events, int fd, void * ptr)
}
event.events = events;
return epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event);
while ((retval = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event)) != 0 && errno == EINTR) {}
return retval;
}
static int add_in_event_fd(int epollfd, int fd)
@@ -759,12 +763,14 @@ static int add_in_event(int epollfd, struct remote_desc * const remote)
static int mod_event(int epollfd, int events, int fd, void * ptr)
{
int retval;
struct epoll_event event = {};
event.data.ptr = ptr;
event.events = events;
return epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &event);
while ((retval = epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &event)) != 0 && errno == EINTR) {}
return retval;
}
static int add_out_event(int epollfd, struct remote_desc * const remote)
@@ -779,7 +785,10 @@ static int del_out_event(int epollfd, struct remote_desc * const remote)
static int del_event(int epollfd, int fd)
{
return epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL);
int retval;
while ((retval = epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL)) != 0 && errno == EINTR) {}
return retval;
}
static void disconnect_client(int epollfd, struct remote_desc * const remote)
@@ -931,7 +940,9 @@ static struct remote_desc * accept_remote(int server_fd,
struct sockaddr * const sockaddr,
socklen_t * const addrlen)
{
int client_fd = accept(server_fd, sockaddr, addrlen);
int client_fd;
while ((client_fd = accept(server_fd, sockaddr, addrlen)) < 0 && errno == EINTR) {}
if (client_fd < 0)
{
logger(1, "Accept failed: %s", strerror(errno));
@@ -1227,9 +1238,11 @@ static int handle_incoming_data(int epollfd, struct remote_desc * const current)
else
{
errno = 0;
ssize_t bytes_read = read(current->fd,
ssize_t bytes_read;
while ((bytes_read = read(current->fd,
json_read_buffer->buf.ptr.raw + json_read_buffer->buf.used,
json_read_buffer->buf.max - json_read_buffer->buf.used);
json_read_buffer->buf.max - json_read_buffer->buf.used)) < 0 && errno == EINTR) {}
if (bytes_read < 0 || errno != 0)
{
logger_nDPIsrvd(current, "Could not read remote", ": %s", strerror(errno));