.gitignore: ignore generated filter parser sources
[lttng-tools.git] / src / common / compat / poll.c
index d9acd901c0382802c136d49d9fa4a32eba22b24e..9da2470d08767e4d83bc2e9a3ff0a9fc9faf38d4 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #define _LGPL_SOURCE
-#include <assert.h>
 #include <stdlib.h>
 #include <stdbool.h>
 
@@ -48,7 +47,7 @@ static int resize_poll_event(struct lttng_poll_event *events,
 {
        struct epoll_event *ptr;
 
-       assert(events);
+       LTTNG_ASSERT(events);
 
        ptr = realloc(events->events, new_size * sizeof(*ptr));
        if (ptr == NULL) {
@@ -72,7 +71,6 @@ error:
 /*
  * Create epoll set and allocate returned events structure.
  */
-LTTNG_HIDDEN
 int compat_epoll_create(struct lttng_poll_event *events, int size, int flags)
 {
        int ret;
@@ -125,7 +123,6 @@ error:
 /*
  * Add a fd to the epoll set with requesting events.
  */
-LTTNG_HIDDEN
 int compat_epoll_add(struct lttng_poll_event *events, int fd, uint32_t req_events)
 {
        int ret;
@@ -173,7 +170,6 @@ error:
 /*
  * Remove a fd from the epoll set.
  */
-LTTNG_HIDDEN
 int compat_epoll_del(struct lttng_poll_event *events, int fd)
 {
        int ret;
@@ -208,7 +204,6 @@ error:
 /*
  * Set an fd's events.
  */
-LTTNG_HIDDEN
 int compat_epoll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events)
 {
        int ret;
@@ -250,7 +245,6 @@ error:
 /*
  * Wait on epoll set. This is a blocking call of timeout value.
  */
-LTTNG_HIDDEN
 int compat_epoll_wait(struct lttng_poll_event *events, int timeout,
                bool interruptible)
 {
@@ -305,7 +299,6 @@ error:
 /*
  * Setup poll set maximum size.
  */
-LTTNG_HIDDEN
 int compat_epoll_set_max_size(void)
 {
        int ret, fd, retval = 0;
@@ -374,7 +367,7 @@ static int resize_poll_event(struct compat_poll_event_array *array,
 {
        struct pollfd *ptr;
 
-       assert(array);
+       LTTNG_ASSERT(array);
 
        /* Refuse to resize the array more than the max size. */
        if (new_size > poll_max_size) {
@@ -408,7 +401,7 @@ static int update_current_events(struct lttng_poll_event *events)
        int ret;
        struct compat_poll_event_array *current, *wait;
 
-       assert(events);
+       LTTNG_ASSERT(events);
 
        current = &events->current;
        wait = &events->wait;
@@ -435,7 +428,6 @@ error:
 /*
  * Create pollfd data structure.
  */
-LTTNG_HIDDEN
 int compat_poll_create(struct lttng_poll_event *events, int size)
 {
        struct compat_poll_event_array *current, *wait;
@@ -488,7 +480,6 @@ error:
 /*
  * Add fd to pollfd data structure with requested events.
  */
-LTTNG_HIDDEN
 int compat_poll_add(struct lttng_poll_event *events, int fd,
                uint32_t req_events)
 {
@@ -535,7 +526,6 @@ error:
 /*
  * Modify an fd's events..
  */
-LTTNG_HIDDEN
 int compat_poll_mod(struct lttng_poll_event *events, int fd,
                uint32_t req_events)
 {
@@ -572,7 +562,6 @@ error:
 /*
  * Remove a fd from the pollfd structure.
  */
-LTTNG_HIDDEN
 int compat_poll_del(struct lttng_poll_event *events, int fd)
 {
        int i, count = 0, ret;
@@ -602,7 +591,7 @@ int compat_poll_del(struct lttng_poll_event *events, int fd)
        }
 
        /* No fd duplicate should be ever added into array. */
-       assert(current->nb_fd - 1 == count);
+       LTTNG_ASSERT(current->nb_fd - 1 == count);
        current->nb_fd = count;
 
        /* Resize array if needed. */
@@ -627,13 +616,11 @@ error:
 /*
  * Wait on poll() with timeout. Blocking call.
  */
-LTTNG_HIDDEN
 int compat_poll_wait(struct lttng_poll_event *events, int timeout,
                bool interruptible)
 {
        int ret, active_fd_count;
-       int idle_pfd_index = 0;
-       size_t i;
+       size_t pos = 0, consecutive_entries = 0, non_idle_pos;
 
        if (events == NULL || events->current.events == NULL) {
                ERR("poll wait arguments error");
@@ -668,34 +655,36 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout,
        active_fd_count = ret;
 
        /*
-        * Swap all active pollfd structs to the beginning of the
-        * array to emulate compat-epoll behaviour. This algorithm takes
-        * advantage of poll's returned value and the burst nature of active
-        * events on the file descriptors. The while loop guarantees that
-        * idle_pfd will always point to an idle fd.
+        * Move all active pollfd structs to the beginning of the
+        * array to emulate compat-epoll behaviour.
         */
        if (active_fd_count == events->wait.nb_fd) {
                goto end;
        }
-       while (idle_pfd_index < active_fd_count &&
-                       events->wait.events[idle_pfd_index].revents != 0) {
-               idle_pfd_index++;
-       }
 
-       for (i = idle_pfd_index + 1; idle_pfd_index < active_fd_count;
-                       i++) {
-               struct pollfd swap_pfd;
-               struct pollfd *idle_pfd = &events->wait.events[idle_pfd_index];
-               struct pollfd *current_pfd = &events->wait.events[i];
+       while (consecutive_entries != active_fd_count) {
+               struct pollfd *current = &events->wait.events[pos];
+               struct pollfd idle_entry;
 
-               if (idle_pfd->revents != 0) {
-                       swap_pfd = *current_pfd;
-                       *current_pfd = *idle_pfd;
-                       *idle_pfd = swap_pfd;
-                       idle_pfd_index++;
+               if (current->revents != 0) {
+                       consecutive_entries++;
+                       pos++;
+                       continue;
                }
-       }
 
+               non_idle_pos = pos;
+
+               /* Look for next non-idle entry. */
+               while (events->wait.events[++non_idle_pos].revents == 0);
+
+               /* Swap idle and non-idle entries. */
+               idle_entry = *current;
+               *current = events->wait.events[non_idle_pos];
+               events->wait.events[non_idle_pos] = idle_entry;
+
+               consecutive_entries++;
+               pos++;
+       }
 end:
        return ret;
 
@@ -706,7 +695,6 @@ error:
 /*
  * Setup poll set maximum size.
  */
-LTTNG_HIDDEN
 int compat_poll_set_max_size(void)
 {
        int ret, retval = 0;
This page took 0.026779 seconds and 4 git commands to generate.