fd-tracker: add epoll/poll management wrappers to fd-tracker
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 22 Nov 2019 23:46:47 +0000 (18:46 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 23 Nov 2019 01:11:40 +0000 (20:11 -0500)
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 <jeremie.galarneau@efficios.com>
src/common/fd-tracker/Makefile.am
src/common/fd-tracker/utils-epoll.c [new file with mode: 0644]
src/common/fd-tracker/utils-poll.c [new file with mode: 0644]
src/common/fd-tracker/utils.h

index 8453f4b106f568df1b0f2f0019515a581ff8c8cb..7c458dc9bf2baa76898a47db8feaa609c4b83fd8 100644 (file)
@@ -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 (file)
index 0000000..3b38778
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * 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 <common/compat/poll.h>
+
+#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 (file)
index 0000000..b56936a
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * 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 <common/compat/poll.h>
+
+#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;
+}
index e1c3b790dc173add970801eaed378deb28ca848e..86af3c6e1aadf695317a082160b37dbb2fd71874 100644 (file)
 #ifndef FD_TRACKER_UTILS_H
 #define FD_TRACKER_UTILS_H
 
+#include <common/fd-tracker/fd-tracker.h>
+
+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 */
This page took 0.028825 seconds and 5 git commands to generate.