X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Ffd-tracker%2Futils-poll.c;h=17349a45ff252972d2607260ffb7bb08248a0be8;hp=fa957432d01945e397f49c7d0836ba4338182b59;hb=0060607b4f1947339819316b63f00e42aab2a341;hpb=4fb28dfc10106c4095ca3b1155d4da9a04467fd1 diff --git a/src/common/fd-tracker/utils-poll.c b/src/common/fd-tracker/utils-poll.c index fa957432d..17349a45f 100644 --- a/src/common/fd-tracker/utils-poll.c +++ b/src/common/fd-tracker/utils-poll.c @@ -9,6 +9,66 @@ #include "utils.h" +#if HAVE_EPOLL + +struct create_args { + struct lttng_poll_event *events; + int size; + int flags; +}; + +static int open_epoll(void *data, int *out_fd) +{ + int ret; + struct create_args *args = data; + + ret = lttng_poll_create(args->events, args->size, args->flags); + if (ret < 0) { + goto end; + } + + *out_fd = args->events->epfd; +end: + return ret; +} + +static int close_epoll(void *data, int *in_fd) +{ + /* Will close the epfd. */ + lttng_poll_clean((struct lttng_poll_event *) data); + return 0; +} + +/* + * The epoll variant of the poll compat layer creates an unsuspendable fd which + * must be tracked. + */ +int fd_tracker_util_poll_create(struct fd_tracker *tracker, + const char *name, + struct lttng_poll_event *events, + int size, + int flags) +{ + int out_fd; + struct create_args create_args = { + .events = events, + .size = size, + .flags = flags, + }; + + return fd_tracker_open_unsuspendable_fd( + tracker, &out_fd, &name, 1, open_epoll, &create_args); +} + +int fd_tracker_util_poll_clean( + struct fd_tracker *tracker, struct lttng_poll_event *events) +{ + return fd_tracker_close_unsuspendable_fd( + tracker, &events->epfd, 1, close_epoll, events); +} + +#else /* HAVE_EPOLL */ + /* * The epoll variant of the poll compat layer creates an unsuspendable fd which * must be tracked. @@ -28,3 +88,5 @@ int fd_tracker_util_poll_clean( lttng_poll_clean(events); return 0; } + +#endif /* !HAVE_EPOLL */