Commit | Line | Data |
---|---|---|
184597e3 | 1 | /* |
ab5be9fa | 2 | * Copyright (C) 2018 Jérémie Galarneau <jeremie.galarneau@efficios.com> |
184597e3 | 3 | * |
ab5be9fa | 4 | * SPDX-License-Identifier: GPL-2.0-only |
184597e3 | 5 | * |
184597e3 JG |
6 | */ |
7 | ||
c9e313bc | 8 | #include <common/compat/poll.hpp> |
184597e3 | 9 | |
c9e313bc | 10 | #include "utils.hpp" |
184597e3 | 11 | |
ce7fc42f | 12 | #ifdef HAVE_EPOLL |
0060607b | 13 | |
f1494934 | 14 | namespace { |
0060607b MJ |
15 | struct create_args { |
16 | struct lttng_poll_event *events; | |
17 | int size; | |
18 | int flags; | |
19 | }; | |
f1494934 | 20 | } /* namespace */ |
0060607b MJ |
21 | |
22 | static int open_epoll(void *data, int *out_fd) | |
23 | { | |
24 | int ret; | |
e032c6fd | 25 | struct create_args *args = (create_args *) data; |
0060607b MJ |
26 | |
27 | ret = lttng_poll_create(args->events, args->size, args->flags); | |
28 | if (ret < 0) { | |
29 | goto end; | |
30 | } | |
31 | ||
32 | *out_fd = args->events->epfd; | |
33 | end: | |
34 | return ret; | |
35 | } | |
36 | ||
f46376a1 | 37 | static int close_epoll(void *data, int *in_fd __attribute__((unused))) |
0060607b MJ |
38 | { |
39 | /* Will close the epfd. */ | |
40 | lttng_poll_clean((struct lttng_poll_event *) data); | |
41 | return 0; | |
42 | } | |
43 | ||
44 | /* | |
45 | * The epoll variant of the poll compat layer creates an unsuspendable fd which | |
46 | * must be tracked. | |
47 | */ | |
48 | int fd_tracker_util_poll_create(struct fd_tracker *tracker, | |
49 | const char *name, | |
50 | struct lttng_poll_event *events, | |
51 | int size, | |
52 | int flags) | |
53 | { | |
54 | int out_fd; | |
55 | struct create_args create_args = { | |
56 | .events = events, | |
57 | .size = size, | |
58 | .flags = flags, | |
59 | }; | |
60 | ||
61 | return fd_tracker_open_unsuspendable_fd( | |
62 | tracker, &out_fd, &name, 1, open_epoll, &create_args); | |
63 | } | |
64 | ||
65 | int fd_tracker_util_poll_clean( | |
66 | struct fd_tracker *tracker, struct lttng_poll_event *events) | |
67 | { | |
68 | return fd_tracker_close_unsuspendable_fd( | |
69 | tracker, &events->epfd, 1, close_epoll, events); | |
70 | } | |
71 | ||
72 | #else /* HAVE_EPOLL */ | |
73 | ||
184597e3 JG |
74 | /* |
75 | * The epoll variant of the poll compat layer creates an unsuspendable fd which | |
76 | * must be tracked. | |
77 | */ | |
4eac90eb MJ |
78 | int fd_tracker_util_poll_create( |
79 | struct fd_tracker *tracker __attribute__((unused)), | |
80 | const char *name __attribute__((unused)), | |
5c1f54d1 JG |
81 | struct lttng_poll_event *events, |
82 | int size, | |
4eac90eb | 83 | int flags __attribute__((unused))) |
184597e3 JG |
84 | { |
85 | return lttng_poll_create(events, size, flags); | |
86 | } | |
87 | ||
5c1f54d1 | 88 | int fd_tracker_util_poll_clean( |
4eac90eb MJ |
89 | struct fd_tracker *tracker __attribute__((unused)), |
90 | struct lttng_poll_event *events) | |
184597e3 JG |
91 | { |
92 | lttng_poll_clean(events); | |
93 | return 0; | |
94 | } | |
0060607b MJ |
95 | |
96 | #endif /* !HAVE_EPOLL */ |