From 46e54e26e85bd942b154a842b71873cf014ebf11 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 27 Jun 2018 15:05:06 -0400 Subject: [PATCH] Backport: fd-tracker: add epoll/poll management wrappers to fd-tracker MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- src/common/fd-tracker/Makefile.am | 8 ++- src/common/fd-tracker/utils-epoll.c | 75 +++++++++++++++++++++++++++++ src/common/fd-tracker/utils-poll.c | 37 ++++++++++++++ src/common/fd-tracker/utils.h | 12 +++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 src/common/fd-tracker/utils-epoll.c create mode 100644 src/common/fd-tracker/utils-poll.c diff --git a/src/common/fd-tracker/Makefile.am b/src/common/fd-tracker/Makefile.am index 8453f4b10..7c458dc9b 100644 --- a/src/common/fd-tracker/Makefile.am +++ b/src/common/fd-tracker/Makefile.am @@ -1,3 +1,9 @@ noinst_LTLIBRARIES = libfd-tracker.la -libfd_tracker_la_SOURCES = fd-tracker.h fd-tracker.c utils.h utils.c +if COMPAT_EPOLL +COMPAT=utils-epoll.c +else +COMPAT=utils-poll.c +endif + +libfd_tracker_la_SOURCES = fd-tracker.h fd-tracker.c utils.h utils.c $(COMPAT) diff --git a/src/common/fd-tracker/utils-epoll.c b/src/common/fd-tracker/utils-epoll.c new file mode 100644 index 000000000..3b387789c --- /dev/null +++ b/src/common/fd-tracker/utils-epoll.c @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2018 - Jérémie Galarneau + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "utils.h" + +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); +} diff --git a/src/common/fd-tracker/utils-poll.c b/src/common/fd-tracker/utils-poll.c new file mode 100644 index 000000000..ec5042e42 --- /dev/null +++ b/src/common/fd-tracker/utils-poll.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2018 - Jérémie Galarneau + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include "utils.h" + +/* + * 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, + struct lttng_poll_event *events, int size, int flags) +{ + return lttng_poll_create(events, size, flags); +} + +int fd_tracker_util_poll_clean(struct fd_tracker *tracker, + struct lttng_poll_event *events) +{ + lttng_poll_clean(events); + return 0; +} diff --git a/src/common/fd-tracker/utils.h b/src/common/fd-tracker/utils.h index e1c3b790d..86af3c6e1 100644 --- a/src/common/fd-tracker/utils.h +++ b/src/common/fd-tracker/utils.h @@ -18,10 +18,22 @@ #ifndef FD_TRACKER_UTILS_H #define FD_TRACKER_UTILS_H +#include + +struct lttng_poll_event; + /* * Utility implementing a close_fd callback which receives one file descriptor * and closes it, returning close()'s return value. */ int fd_tracker_util_close_fd(void *, int *fd); +/* + * Create a poll event and track its underlying fd, if applicable. + */ +int fd_tracker_util_poll_create(struct fd_tracker *tracker, const char *name, + struct lttng_poll_event *events, int size, int flags); +int fd_tracker_util_poll_clean(struct fd_tracker *tracker, + struct lttng_poll_event *events); + #endif /* FD_TRACKER_UTILS_H */ -- 2.34.1