Implement poll mask modification support in poll wrappers
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 5 May 2017 02:58:25 +0000 (22:58 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 5 May 2017 04:15:01 +0000 (00:15 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/compat/compat-epoll.c
src/common/compat/compat-poll.c
src/common/compat/poll.h

index 9c2688d33e09c3c774b914b366226424504324e7..dbaf6823364eb5e4444ba536ac0291300a527a0a 100644 (file)
@@ -197,6 +197,47 @@ error:
        return -1;
 }
 
+/*
+ * Set an fd's events.
+ */
+int compat_epoll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events)
+{
+       int ret;
+       struct epoll_event ev;
+
+       if (events == NULL || fd < 0 || events->nb_fd == 0) {
+               goto error;
+       }
+
+       /*
+        * Zero struct epoll_event to ensure all representations of its
+        * union are zeroed.
+        */
+       memset(&ev, 0, sizeof(ev));
+       ev.events = req_events;
+       ev.data.fd = fd;
+
+       ret = epoll_ctl(events->epfd, EPOLL_CTL_MOD, fd, &ev);
+       if (ret < 0) {
+               switch (errno) {
+               case ENOENT:
+               case EPERM:
+                       /* Print PERROR and goto end not failing. Show must go on. */
+                       PERROR("epoll_ctl MOD");
+                       goto end;
+               default:
+                       PERROR("epoll_ctl MOD fatal");
+                       goto error;
+               }
+       }
+
+end:
+       return 0;
+
+error:
+       return -1;
+}
+
 /*
  * Wait on epoll set. This is a blocking call of timeout value.
  */
index 7d4d0e1334ef1dc2abba28f9e694d2ce8052d1ea..2b459e42f9fed14d565d371963e233c50c59e168 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <sys/resource.h>
 #include <sys/time.h>
+#include <stdbool.h>
 
 #include <common/defaults.h>
 #include <common/error.h>
@@ -196,6 +197,42 @@ error:
        return -1;
 }
 
+/*
+ * Modify an fd's events..
+ */
+int compat_poll_mod(struct lttng_poll_event *events, int fd,
+               uint32_t req_events)
+{
+       int ret, i;
+       bool fd_found = false;
+       struct compat_poll_event_array *current;
+
+       if (events == NULL || events->current.events == NULL || fd < 0) {
+               ERR("Bad compat poll mod arguments");
+               goto error;
+       }
+
+       current = &events->current;
+
+       for (i = 0; i < current->nb_fd; i++) {
+               if (current->events[i].fd == fd) {
+                       fd_found = true;
+                       current->events[i].events = req_events;
+                       events->need_update = 1;
+                       break;
+               }
+       }
+
+       if (!fd_found) {
+               goto error;
+       }
+
+       return 0;
+
+error:
+       return -1;
+}
+
 /*
  * Remove a fd from the pollfd structure.
  */
index 77c46a1d08d60ac8bca806628f368fc46fc915c2..d4bd87f589213fbace764f2f2d3d152551d5ab5a 100644 (file)
@@ -171,6 +171,14 @@ 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_add(events, fd, req_events)
+
 /*
  * Set up the poll set limits variable poll_max_size
  */
@@ -347,6 +355,14 @@ 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 epoll 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_add(events, fd, req_events)
+
 /*
  * Set up the poll set limits variable poll_max_size
  */
This page took 0.03547 seconds and 4 git commands to generate.