Provide an idiomatic c++ interface for action lists
[lttng-tools.git] / src / bin / lttng / utils.hpp
... / ...
CommitLineData
1/*
2 * Copyright (C) 2011 EfficiOS Inc.
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 */
7
8#ifndef _LTTNG_UTILS_H
9#define _LTTNG_UTILS_H
10
11#include <common/argpar/argpar.h>
12#include <common/dynamic-array.hpp>
13#include <common/make-unique-wrapper.hpp>
14
15#include <lttng/lttng.h>
16
17#include <iterator>
18#include <memory>
19#include <popt.h>
20
21extern char *opt_relayd_path;
22extern int opt_no_sessiond;
23extern char *opt_sessiond_path;
24extern pid_t sessiond_pid;
25
26struct cmd_struct;
27
28struct session_spec {
29 enum class type {
30 NAME,
31 GLOB_PATTERN,
32 ALL,
33 };
34
35 explicit session_spec(type spec_type, const char *name_or_pattern = nullptr) noexcept :
36 type_(spec_type), value(name_or_pattern)
37 {
38 }
39
40 /* Disambiguate type enum from the member for buggy g++ versions. */
41 type type_;
42 const char *value;
43};
44
45/*
46 * We don't use a std::vector here because it would make a copy of the C array.
47 */
48class session_list {
49 template <typename ContainerType, typename DereferenceReturnType>
50 class _iterator : public std::iterator<std::random_access_iterator_tag, std::size_t> {
51 public:
52 explicit _iterator(ContainerType& list, std::size_t k) : _list(list), _index(k)
53 {
54 }
55
56 _iterator& operator++() noexcept
57 {
58 ++_index;
59 return *this;
60 }
61
62 _iterator& operator--() noexcept
63 {
64 --_index;
65 return *this;
66 }
67
68 _iterator& operator++(int) noexcept
69 {
70 _index++;
71 return *this;
72 }
73
74 _iterator& operator--(int) noexcept
75 {
76 _index--;
77 return *this;
78 }
79
80 bool operator==(_iterator other) const noexcept
81 {
82 return _index == other._index;
83 }
84
85 bool operator!=(_iterator other) const noexcept
86 {
87 return !(*this == other);
88 }
89
90 DereferenceReturnType& operator*() const noexcept
91 {
92 return _list[_index];
93 }
94
95 private:
96 ContainerType& _list;
97 std::size_t _index;
98 };
99
100 using iterator = _iterator<session_list, lttng_session>;
101 using const_iterator = _iterator<const session_list, const lttng_session>;
102
103public:
104 session_list() : _sessions_count(0), _sessions(nullptr)
105 {
106 }
107
108 session_list(session_list&& original, std::size_t new_count)
109 {
110 _sessions_count = new_count;
111 _sessions = std::move(original._sessions);
112 }
113
114 session_list(struct lttng_session *raw_sessions, std::size_t raw_sessions_count)
115 {
116 _sessions_count = raw_sessions_count;
117 _sessions.reset(raw_sessions);
118 }
119
120 iterator begin() noexcept
121 {
122 return iterator(*this, 0);
123 }
124
125 iterator end() noexcept
126 {
127 return iterator(*this, _sessions_count);
128 }
129
130 const_iterator begin() const noexcept
131 {
132 return const_iterator(*this, 0);
133 }
134
135 const_iterator end() const noexcept
136 {
137 return const_iterator(*this, _sessions_count);
138 }
139
140 std::size_t size() const noexcept
141 {
142 return _sessions_count;
143 }
144
145 void resize(std::size_t new_size) noexcept
146 {
147 _sessions_count = new_size;
148 }
149
150 lttng_session& operator[](std::size_t index)
151 {
152 LTTNG_ASSERT(index < _sessions_count);
153 return _sessions.get()[index];
154 }
155
156 const lttng_session& operator[](std::size_t index) const
157 {
158 LTTNG_ASSERT(index < _sessions_count);
159 return _sessions.get()[index];
160 }
161
162private:
163 std::size_t _sessions_count;
164 std::unique_ptr<lttng_session,
165 lttng::memory::create_deleter_class<lttng_session, lttng::free>::deleter>
166 _sessions;
167};
168
169char *get_session_name(void);
170char *get_session_name_quiet(void);
171void list_commands(struct cmd_struct *commands, FILE *ofp);
172void list_cmd_options(FILE *ofp, struct poptOption *options);
173void list_cmd_options_argpar(FILE *ofp, const struct argpar_opt_descr *options);
174
175/*
176 * Return the minimum order for which x <= (1UL << order).
177 * Return -1 if x is 0.
178 */
179int get_count_order_u32(uint32_t x);
180
181/*
182 * Return the minimum order for which x <= (1UL << order).
183 * Return -1 if x is 0.
184 */
185int get_count_order_u64(uint64_t x);
186
187/*
188 * Return the minimum order for which x <= (1UL << order).
189 * Return -1 if x is 0.
190 */
191int get_count_order_ulong(unsigned long x);
192
193const char *get_event_type_str(enum lttng_event_type event_type);
194
195int print_missing_or_multiple_domains(unsigned int domain_count, bool include_agent_domains);
196
197int spawn_relayd(const char *pathname, int port);
198int check_relayd(void);
199void print_session_stats(const char *session_name);
200int get_session_stats_str(const char *session_name, char **str);
201int show_cmd_help(const char *cmd_name, const char *help_msg);
202
203int print_trace_archive_location(const struct lttng_trace_archive_location *location,
204 const char *session_name);
205
206int validate_exclusion_list(const char *event_name,
207 const struct lttng_dynamic_pointer_array *exclusions);
208
209session_list list_sessions(const struct session_spec& spec);
210
211#endif /* _LTTNG_UTILS_H */
This page took 0.022692 seconds and 4 git commands to generate.