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