X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fpoll.c;h=9da2470d08767e4d83bc2e9a3ff0a9fc9faf38d4;hb=02c3d2c2e3b27ab0bad1207c70465f84b649c816;hp=d9acd901c0382802c136d49d9fa4a32eba22b24e;hpb=0060607b4f1947339819316b63f00e42aab2a341;p=lttng-tools.git diff --git a/src/common/compat/poll.c b/src/common/compat/poll.c index d9acd901c..9da2470d0 100644 --- a/src/common/compat/poll.c +++ b/src/common/compat/poll.c @@ -7,7 +7,6 @@ */ #define _LGPL_SOURCE -#include #include #include @@ -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;