Fix: lttng_poll_mod calls compat_(e)poll_add
[lttng-tools.git] / src / common / compat / compat-poll.c
index 32bcce8e4643fdf2c3d858da9273147537a39a06..b45b39dc6bdbd45daf69944316b1d663f1744867 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
 #define _LGPL_SOURCE
 #include <assert.h>
 #include <stdlib.h>
 #include <sys/resource.h>
 #include <sys/time.h>
+#include <stdbool.h>
 
 #include <common/defaults.h>
 #include <common/error.h>
@@ -112,8 +112,9 @@ int compat_poll_create(struct lttng_poll_event *events, int size)
        }
 
        if (!poll_max_size) {
-               ERR("poll_max_size not initialized yet");
-               goto error;
+               if (lttng_poll_set_max_size()) {
+                       goto error;
+               }
        }
 
        /* Don't bust the limit here */
@@ -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 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.
  */
@@ -269,7 +306,9 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout)
                }
        }
 
-       ret = poll(events->wait.events, events->wait.nb_fd, timeout);
+       do {
+               ret = poll(events->wait.events, events->wait.nb_fd, timeout);
+       } while (ret == -1 && errno == EINTR);
        if (ret < 0) {
                /* At this point, every error is fatal */
                PERROR("poll wait");
This page took 0.023867 seconds and 4 git commands to generate.