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 "utils.hpp" |
184597e3 | 9 | |
ce7fc42f | 10 | #ifdef HAVE_EPOLL |
0060607b | 11 | |
f1494934 | 12 | namespace { |
0060607b MJ |
13 | struct create_args { |
14 | struct lttng_poll_event *events; | |
15 | int size; | |
16 | int flags; | |
17 | }; | |
f1494934 | 18 | } /* namespace */ |
0060607b MJ |
19 | |
20 | static int open_epoll(void *data, int *out_fd) | |
21 | { | |
22 | int ret; | |
e032c6fd | 23 | struct create_args *args = (create_args *) data; |
0060607b MJ |
24 | |
25 | ret = lttng_poll_create(args->events, args->size, args->flags); | |
26 | if (ret < 0) { | |
27 | goto end; | |
28 | } | |
29 | ||
30 | *out_fd = args->events->epfd; | |
31 | end: | |
32 | return ret; | |
33 | } | |
34 | ||
f46376a1 | 35 | static int close_epoll(void *data, int *in_fd __attribute__((unused))) |
0060607b MJ |
36 | { |
37 | /* Will close the epfd. */ | |
38 | lttng_poll_clean((struct lttng_poll_event *) data); | |
39 | return 0; | |
40 | } | |
41 | ||
42 | /* | |
43 | * The epoll variant of the poll compat layer creates an unsuspendable fd which | |
44 | * must be tracked. | |
45 | */ | |
46 | int fd_tracker_util_poll_create(struct fd_tracker *tracker, | |
28ab034a JG |
47 | const char *name, |
48 | struct lttng_poll_event *events, | |
49 | int size, | |
50 | int flags) | |
0060607b MJ |
51 | { |
52 | int out_fd; | |
53 | struct create_args create_args = { | |
54 | .events = events, | |
55 | .size = size, | |
56 | .flags = flags, | |
57 | }; | |
58 | ||
59 | return fd_tracker_open_unsuspendable_fd( | |
28ab034a | 60 | tracker, &out_fd, &name, 1, open_epoll, &create_args); |
0060607b MJ |
61 | } |
62 | ||
28ab034a | 63 | int fd_tracker_util_poll_clean(struct fd_tracker *tracker, struct lttng_poll_event *events) |
0060607b | 64 | { |
28ab034a | 65 | return fd_tracker_close_unsuspendable_fd(tracker, &events->epfd, 1, close_epoll, events); |
0060607b MJ |
66 | } |
67 | ||
68 | #else /* HAVE_EPOLL */ | |
69 | ||
184597e3 JG |
70 | /* |
71 | * The epoll variant of the poll compat layer creates an unsuspendable fd which | |
72 | * must be tracked. | |
73 | */ | |
28ab034a JG |
74 | int fd_tracker_util_poll_create(struct fd_tracker *tracker __attribute__((unused)), |
75 | const char *name __attribute__((unused)), | |
76 | struct lttng_poll_event *events, | |
77 | int size, | |
78 | int flags __attribute__((unused))) | |
184597e3 JG |
79 | { |
80 | return lttng_poll_create(events, size, flags); | |
81 | } | |
82 | ||
28ab034a JG |
83 | int fd_tracker_util_poll_clean(struct fd_tracker *tracker __attribute__((unused)), |
84 | struct lttng_poll_event *events) | |
184597e3 JG |
85 | { |
86 | lttng_poll_clean(events); | |
87 | return 0; | |
88 | } | |
0060607b MJ |
89 | |
90 | #endif /* !HAVE_EPOLL */ |