Fix: sessiond: ODR violation results in memory corruption
[lttng-tools.git] / src / common / fd-tracker / utils-poll.cpp
... / ...
CommitLineData
1/*
2 * Copyright (C) 2018 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 */
7
8#include <common/compat/poll.hpp>
9
10#include "utils.hpp"
11
12#ifdef HAVE_EPOLL
13
14namespace {
15struct create_args {
16 struct lttng_poll_event *events;
17 int size;
18 int flags;
19};
20} /* namespace */
21
22static int open_epoll(void *data, int *out_fd)
23{
24 int ret;
25 struct create_args *args = (create_args *) data;
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;
33end:
34 return ret;
35}
36
37static int close_epoll(void *data, int *in_fd __attribute__((unused)))
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 */
48int 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
65int 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
74/*
75 * The epoll variant of the poll compat layer creates an unsuspendable fd which
76 * must be tracked.
77 */
78int fd_tracker_util_poll_create(
79 struct fd_tracker *tracker __attribute__((unused)),
80 const char *name __attribute__((unused)),
81 struct lttng_poll_event *events,
82 int size,
83 int flags __attribute__((unused)))
84{
85 return lttng_poll_create(events, size, flags);
86}
87
88int fd_tracker_util_poll_clean(
89 struct fd_tracker *tracker __attribute__((unused)),
90 struct lttng_poll_event *events)
91{
92 lttng_poll_clean(events);
93 return 0;
94}
95
96#endif /* !HAVE_EPOLL */
This page took 0.033688 seconds and 4 git commands to generate.