From: Jérémie Galarneau Date: Fri, 22 Nov 2019 23:46:47 +0000 (-0500) Subject: fd-tracker: add epoll/poll management wrappers to fd-tracker X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=184597e3d22331d64e93acab4691670534f218cb fd-tracker: add epoll/poll management wrappers to fd-tracker Add wrappers which create an lttng_poll_event object, tracking any file descriptor created in the process of initializing the object. When the build is configured to use the epoll interface, the underlying epoll fd is tracked by the fd-tracker. If the build is configured to use the poll interace, the fd tracker is not involved in the process and the utility will simply defer the call to lttng_poll_create() directly. Signed-off-by: Jérémie Galarneau --- 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..b56936a0f --- /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, const char *name, + 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 */