epoll/poll compat: expose interruptible API
[lttng-tools.git] / src / common / compat / poll.h
index f892c832333eb10bdfcc4cf64d66918c17d3ab02..0b3cb324341a225ab6ab33c588a170e6d9cc23c4 100644 (file)
@@ -73,7 +73,7 @@ enum {
        LPOLLNVAL = EPOLLHUP,
        LPOLLRDHUP = EPOLLRDHUP,
        /* Close on exec feature of epoll */
-#if __GLIBC_PREREQ(2, 9)
+#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
        LTTNG_CLOEXEC = EPOLL_CLOEXEC,
 #else
        /*
@@ -119,15 +119,13 @@ static inline int __lttng_epoll_get_prev_fd(struct lttng_poll_event *events,
 #define LTTNG_POLL_GET_PREV_FD(e, i, nb_fd) \
        __lttng_epoll_get_prev_fd(LTTNG_REF(e), i, nb_fd)
 
-/*
- * Create the epoll set. No memory allocation is done here.
- */
+/* Create the epoll set. */
 extern int compat_epoll_create(struct lttng_poll_event *events,
                int size, int flags);
 #define lttng_poll_create(events, size, flags) \
        compat_epoll_create(events, size, flags)
 
-#if __GLIBC_PREREQ(2, 9)
+#if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC)
 static inline int compat_glibc_epoll_create(int size __attribute__((unused)),
                int flags)
 {
@@ -152,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.
@@ -171,10 +172,18 @@ extern int compat_epoll_del(struct lttng_poll_event *events, int fd);
 #define lttng_poll_del(events, fd) \
        compat_epoll_del(events, fd)
 
+/*
+ * Modify an fd's events in the epoll set.
+ */
+extern int compat_epoll_mod(struct lttng_poll_event *events,
+               int fd, uint32_t req_events);
+#define lttng_poll_mod(events, fd, req_events) \
+       compat_epoll_mod(events, fd, req_events)
+
 /*
  * Set up the poll set limits variable poll_max_size
  */
-extern void compat_epoll_set_max_size(void);
+extern int compat_epoll_set_max_size(void);
 #define lttng_poll_set_max_size() \
        compat_epoll_set_max_size()
 
@@ -217,7 +226,7 @@ static inline void lttng_poll_clean(struct lttng_poll_event *events)
        if (events->epfd >= 0) {
                ret = close(events->epfd);
                if (ret) {
-                       perror("close");
+                       PERROR("close");
                }
        }
 
@@ -254,7 +263,7 @@ enum {
 #if __linux__
        LPOLLMSG = POLLMSG,
        LPOLLRDHUP = POLLRDHUP,
-#elif (defined(__FreeBSD__) || defined(__CYGWIN__))
+#elif (defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__sun__) || defined(__APPLE__))
        LPOLLMSG = 0,
        LPOLLRDHUP = 0,
 #else
@@ -285,8 +294,7 @@ struct compat_poll_event {
         * execution before a poll wait is done.
         */
        struct compat_poll_event_array current;
-       /* Indicate if wait.events needs to be realloc. */
-       int need_realloc:1;
+
        /* Indicate if wait.events need to be updated from current. */
        int need_update:1;
 };
@@ -308,10 +316,12 @@ static inline int __lttng_poll_get_prev_fd(struct lttng_poll_event *events,
 /*
  * For the following calls, consider 'e' to be a lttng_poll_event pointer and i
  * being the index of the events array.
+ * LTTNG_POLL_GETNB is always used after lttng_poll_wait, thus we can use the
+ * current list for test compatibility purposes.
  */
 #define LTTNG_POLL_GETFD(e, i) LTTNG_REF(e)->wait.events[i].fd
 #define LTTNG_POLL_GETEV(e, i) LTTNG_REF(e)->wait.events[i].revents
-#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->wait.nb_fd
+#define LTTNG_POLL_GETNB(e) LTTNG_REF(e)->current.nb_fd
 #define LTTNG_POLL_GETSZ(e) LTTNG_REF(e)->wait.events_size
 #define LTTNG_POLL_GET_PREV_FD(e, i, nb_fd) \
        __lttng_poll_get_prev_fd(LTTNG_REF(e), i, nb_fd)
@@ -327,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.
@@ -348,10 +361,18 @@ extern int compat_poll_del(struct lttng_poll_event *events, int fd);
 #define lttng_poll_del(events, fd) \
        compat_poll_del(events, fd)
 
+/*
+ * Modify an fd's events in the poll set.
+ */
+extern int compat_poll_mod(struct lttng_poll_event *events,
+               int fd, uint32_t req_events);
+#define lttng_poll_mod(events, fd, req_events) \
+       compat_poll_mod(events, fd, req_events)
+
 /*
  * Set up the poll set limits variable poll_max_size
  */
-extern void compat_poll_set_max_size(void);
+extern int compat_poll_set_max_size(void);
 #define lttng_poll_set_max_size() \
        compat_poll_set_max_size()
 
This page took 0.025577 seconds and 4 git commands to generate.