mirror of
https://github.com/optim-enterprises-bv/nDPId.git
synced 2025-10-31 18:27:47 +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.");
|
logger(1, "%s", "nDPIsrvd epoll wait failed.");
|
||||||
THREAD_ERROR_GOTO(arg);
|
THREAD_ERROR_GOTO(arg);
|
||||||
}
|
}
|
||||||
|
else if (errno == EINTR)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nready; i++)
|
for (int i = 0; i < nready; i++)
|
||||||
{
|
{
|
||||||
@@ -374,7 +378,8 @@ static void * nDPIsrvd_mainloop_thread(void * const arg)
|
|||||||
if (remote == mock_json_desc)
|
if (remote == mock_json_desc)
|
||||||
{
|
{
|
||||||
remote_desc_name = "Mock JSON";
|
remote_desc_name = "Mock JSON";
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
if (mock_test_desc->fd >= 0)
|
if (mock_test_desc->fd >= 0)
|
||||||
drain_write_buffers_blocking(mock_test_desc);
|
drain_write_buffers_blocking(mock_test_desc);
|
||||||
if (mock_buff_desc->fd >= 0)
|
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.");
|
logger(1, "%s", "Distributor epoll wait failed.");
|
||||||
THREAD_ERROR_GOTO(trv);
|
THREAD_ERROR_GOTO(trv);
|
||||||
}
|
}
|
||||||
|
else if (nready < 0 && errno == EINTR)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nready; i++)
|
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)
|
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);
|
struct nDPIsrvd_write_buffer * const write_buffer = get_write_buffer(remote);
|
||||||
|
|
||||||
if (write_buffer == NULL)
|
if (write_buffer == NULL)
|
||||||
@@ -314,7 +315,7 @@ static int drain_main_buffer(struct remote_desc * const remote)
|
|||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
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)
|
if (errno == EAGAIN)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -358,8 +359,9 @@ static int drain_write_buffers(struct remote_desc * const remote)
|
|||||||
while (utarray_len(additional_write_buffers) > 0)
|
while (utarray_len(additional_write_buffers) > 0)
|
||||||
{
|
{
|
||||||
struct nDPIsrvd_write_buffer * buf = (struct nDPIsrvd_write_buffer *)utarray_front(additional_write_buffers);
|
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)
|
switch (written)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
@@ -732,6 +734,7 @@ static void free_remotes(int epollfd)
|
|||||||
|
|
||||||
static int add_event(int epollfd, int events, int fd, void * ptr)
|
static int add_event(int epollfd, int events, int fd, void * ptr)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
struct epoll_event event = {};
|
struct epoll_event event = {};
|
||||||
|
|
||||||
if (ptr != NULL)
|
if (ptr != NULL)
|
||||||
@@ -744,7 +747,8 @@ static int add_event(int epollfd, int events, int fd, void * ptr)
|
|||||||
}
|
}
|
||||||
event.events = events;
|
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)
|
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)
|
static int mod_event(int epollfd, int events, int fd, void * ptr)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
struct epoll_event event = {};
|
struct epoll_event event = {};
|
||||||
|
|
||||||
event.data.ptr = ptr;
|
event.data.ptr = ptr;
|
||||||
event.events = events;
|
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)
|
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)
|
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)
|
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,
|
struct sockaddr * const sockaddr,
|
||||||
socklen_t * const addrlen)
|
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)
|
if (client_fd < 0)
|
||||||
{
|
{
|
||||||
logger(1, "Accept failed: %s", strerror(errno));
|
logger(1, "Accept failed: %s", strerror(errno));
|
||||||
@@ -1227,9 +1238,11 @@ static int handle_incoming_data(int epollfd, struct remote_desc * const current)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
errno = 0;
|
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.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)
|
if (bytes_read < 0 || errno != 0)
|
||||||
{
|
{
|
||||||
logger_nDPIsrvd(current, "Could not read remote", ": %s", strerror(errno));
|
logger_nDPIsrvd(current, "Could not read remote", ": %s", strerror(errno));
|
||||||
|
|||||||
Reference in New Issue
Block a user