From 9f32e9bf43a6438c55f35d3c5ed1c378d0c715c4 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 16 May 2019 15:08:50 -0400 Subject: [PATCH] epoll/poll compat: expose interruptible API MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Some use of the epoll/poll wrapper require interruption by signals to make the poll call return -1, errno EINTR. Expose a new lttng_poll_wait_interruptible API for this purpose. Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/common/compat/compat-epoll.c | 11 +++++++---- src/common/compat/compat-poll.c | 10 ++++++---- src/common/compat/poll.h | 14 ++++++++++---- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/common/compat/compat-epoll.c b/src/common/compat/compat-epoll.c index 6a781c7ae..794041726 100644 --- a/src/common/compat/compat-epoll.c +++ b/src/common/compat/compat-epoll.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -241,7 +242,8 @@ error: /* * Wait on epoll set. This is a blocking call of timeout value. */ -int compat_epoll_wait(struct lttng_poll_event *events, int timeout) +int compat_epoll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible) { int ret; uint32_t new_size; @@ -273,10 +275,11 @@ int compat_epoll_wait(struct lttng_poll_event *events, int timeout) do { ret = epoll_wait(events->epfd, events->events, events->nb_fd, timeout); - } while (ret == -1 && errno == EINTR); + } while (!interruptible && ret == -1 && errno == EINTR); if (ret < 0) { - /* At this point, every error is fatal */ - PERROR("epoll_wait"); + if (errno != EINTR) { + PERROR("epoll_wait"); + } goto error; } diff --git a/src/common/compat/compat-poll.c b/src/common/compat/compat-poll.c index 254ce271e..4ea23c173 100644 --- a/src/common/compat/compat-poll.c +++ b/src/common/compat/compat-poll.c @@ -291,7 +291,8 @@ error: /* * Wait on poll() with timeout. Blocking call. */ -int compat_poll_wait(struct lttng_poll_event *events, int timeout) +int compat_poll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible) { int ret, active_fd_count; int idle_pfd_index = 0; @@ -320,10 +321,11 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout) do { ret = poll(events->wait.events, events->wait.nb_fd, timeout); - } while (ret == -1 && errno == EINTR); + } while (!interruptible && ret == -1 && errno == EINTR); if (ret < 0) { - /* At this point, every error is fatal */ - PERROR("poll wait"); + if (errno != EINTR) { + PERROR("poll wait"); + } goto error; } diff --git a/src/common/compat/poll.h b/src/common/compat/poll.h index 4b2fc5036..0b3cb3243 100644 --- a/src/common/compat/poll.h +++ b/src/common/compat/poll.h @@ -150,9 +150,12 @@ static inline int compat_glibc_epoll_create(int size, int flags) * Wait on epoll set with the number of fd registered to the lttng_poll_event * data structure (events). */ -extern int compat_epoll_wait(struct lttng_poll_event *events, int timeout); +extern int compat_epoll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible); #define lttng_poll_wait(events, timeout) \ - compat_epoll_wait(events, timeout) + compat_epoll_wait(events, timeout, false) +#define lttng_poll_wait_interruptible(events, timeout) \ + compat_epoll_wait(events, timeout, true) /* * Add a fd to the epoll set and resize the epoll_event structure if needed. @@ -334,9 +337,12 @@ extern int compat_poll_create(struct lttng_poll_event *events, int size); * Wait on poll(2) event with nb_fd registered to the lttng_poll_event data * structure. */ -extern int compat_poll_wait(struct lttng_poll_event *events, int timeout); +extern int compat_poll_wait(struct lttng_poll_event *events, int timeout, + bool interruptible); #define lttng_poll_wait(events, timeout) \ - compat_poll_wait(events, timeout) + compat_poll_wait(events, timeout, false) +#define lttng_poll_wait_interruptible(events, timeout) \ + compat_poll_wait(events, timeout, true) /* * Add the fd to the pollfd structure. Resize if needed. -- 2.34.1