mirror of
https://github.com/optim-enterprises-bv/nDPId.git
synced 2025-10-29 09:22:23 +00:00
Correctly handle EINTR while doing I/O..
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
This commit is contained in:
11
nDPId-test.c
11
nDPId-test.c
@@ -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++)
|
||||
{
|
||||
|
||||
29
nDPIsrvd.c
29
nDPIsrvd.c
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user