*/
#define _LGPL_SOURCE
-#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
{
struct epoll_event *ptr;
- assert(events);
+ LTTNG_ASSERT(events);
ptr = realloc(events->events, new_size * sizeof(*ptr));
if (ptr == NULL) {
/*
* 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;
/*
* 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;
/*
* Remove a fd from the epoll set.
*/
-LTTNG_HIDDEN
int compat_epoll_del(struct lttng_poll_event *events, int fd)
{
int ret;
/*
* Set an fd's events.
*/
-LTTNG_HIDDEN
int compat_epoll_mod(struct lttng_poll_event *events, int fd, uint32_t req_events)
{
int ret;
/*
* 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)
{
/*
* Setup poll set maximum size.
*/
-LTTNG_HIDDEN
int compat_epoll_set_max_size(void)
{
int ret, fd, retval = 0;
{
struct pollfd *ptr;
- assert(array);
+ LTTNG_ASSERT(array);
/* Refuse to resize the array more than the max size. */
if (new_size > poll_max_size) {
int ret;
struct compat_poll_event_array *current, *wait;
- assert(events);
+ LTTNG_ASSERT(events);
current = &events->current;
wait = &events->wait;
/*
* Create pollfd data structure.
*/
-LTTNG_HIDDEN
int compat_poll_create(struct lttng_poll_event *events, int size)
{
struct compat_poll_event_array *current, *wait;
/*
* 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)
{
/*
* Modify an fd's events..
*/
-LTTNG_HIDDEN
int compat_poll_mod(struct lttng_poll_event *events, int fd,
uint32_t req_events)
{
/*
* 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;
}
/* 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. */
/*
* 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");
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;
/*
* Setup poll set maximum size.
*/
-LTTNG_HIDDEN
int compat_poll_set_max_size(void)
{
int ret, retval = 0;