sessiond: add a CTF 2-generating trace class visitor
[lttng-tools.git] / src / bin / lttng-sessiond / ust-registry.hpp
1 /*
2 * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
3 * Copyright (C) 2022 Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-only
6 *
7 */
8
9 #ifndef LTTNG_UST_REGISTRY_H
10 #define LTTNG_UST_REGISTRY_H
11
12 #include "event-class.hpp"
13 #include "field.hpp"
14 #include "lttng-ust-ctl.hpp"
15 #include "session.hpp"
16 #include "stream-class.hpp"
17 #include "trace-class.hpp"
18 #include "ust-clock-class.hpp"
19 #include "ust-registry-channel.hpp"
20 #include "ust-registry-event.hpp"
21
22 #include <common/format.hpp>
23 #include <common/hashtable/hashtable.hpp>
24 #include <common/locked-reference.hpp>
25 #include <common/urcu.hpp>
26 #include <common/uuid.hpp>
27
28 #include <lttng/domain.h>
29
30 #include <ctime>
31 #include <memory>
32 #include <pthread.h>
33 #include <stdint.h>
34 #include <string>
35 #include <type_traits>
36
37 #define CTF_SPEC_MAJOR 1
38 #define CTF_SPEC_MINOR 8
39
40 struct ust_app;
41
42 namespace lttng {
43 namespace sessiond {
44 namespace ust {
45
46 class registry_session;
47
48 namespace details {
49
50 template <class MappingIntegerType>
51 typename trace::typed_enumeration_type<MappingIntegerType>::mappings mappings_from_ust_ctl_entries(
52 const lttng_ust_ctl_enum_entry *in_entries, size_t in_entry_count)
53 {
54 typename trace::typed_enumeration_type<MappingIntegerType>::mappings mappings;
55
56 MappingIntegerType next_range_begin = 0;
57 for (size_t entry_idx = 0; entry_idx < in_entry_count; entry_idx++) {
58 const auto& entry = in_entries[entry_idx];
59 MappingIntegerType range_begin, range_end;
60
61 if (entry.u.extra.options & LTTNG_UST_CTL_UST_ENUM_ENTRY_OPTION_IS_AUTO) {
62 range_begin = range_end = next_range_begin;
63 } else {
64 range_begin = (MappingIntegerType) entry.start.value;
65 range_end = (MappingIntegerType) entry.end.value;
66 }
67
68 next_range_begin = range_end + 1;
69 mappings.emplace_back(entry.string,
70 typename trace::typed_enumeration_type<
71 MappingIntegerType>::mapping::range_t{
72 range_begin, range_end});
73 }
74
75 return mappings;
76 }
77 } /* namespace details */
78
79 class registry_enum {
80 public:
81 using const_rcu_protected_reference = lttng::locked_reference<const registry_enum, lttng::urcu::unique_read_lock>;
82
83 registry_enum(std::string name, enum lttng::sessiond::trace::integer_type::signedness signedness);
84 virtual ~registry_enum() = default;
85
86 std::string name;
87 enum lttng::sessiond::trace::integer_type::signedness signedness;
88 /* enum id in session */
89 uint64_t id = -1ULL;
90 /* Enumeration node in session hash table. */
91 struct lttng_ht_node_str node;
92 /* For delayed reclaim. */
93 struct rcu_head rcu_head;
94
95 friend bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept;
96 protected:
97 virtual bool _is_equal(const registry_enum& other) const noexcept = 0;
98 };
99
100 bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept;
101
102 template <class MappingIntegerType>
103 class registry_typed_enum : public registry_enum {
104 public:
105 registry_typed_enum(const char *in_name,
106 const lttng_ust_ctl_enum_entry *entries,
107 size_t entry_count) :
108 registry_enum(in_name,
109 std::is_signed<MappingIntegerType>::value ?
110 lttng::sessiond::trace::integer_type::signedness::SIGNED :
111 lttng::sessiond::trace::integer_type::signedness::UNSIGNED),
112 _mappings{std::make_shared<
113 typename trace::typed_enumeration_type<MappingIntegerType>::mappings>(
114 details::mappings_from_ust_ctl_entries<MappingIntegerType>(
115 entries, entry_count))}
116 {
117 }
118
119 const typename std::shared_ptr<const typename lttng::sessiond::trace::typed_enumeration_type<
120 MappingIntegerType>::mappings>
121 _mappings;
122
123 protected:
124 virtual bool _is_equal(const registry_enum& base_other) const noexcept
125 {
126 const auto &other = static_cast<decltype(*this)&>(base_other);
127
128 /* Don't compare IDs as some comparisons are performed before an id is assigned. */
129 return this->name == other.name && *this->_mappings == *other._mappings;
130 }
131 };
132
133 using registry_signed_enum = registry_typed_enum<int64_t>;
134 using registry_unsigned_enum = registry_typed_enum<uint64_t>;
135
136 } /* namespace ust */
137 } /* namespace sessiond */
138 } /* namespace lttng */
139
140 #ifdef HAVE_LIBLTTNG_UST_CTL
141
142 /*
143 * Create per-uid registry with default values.
144 *
145 * Return new instance on success, nullptr on error.
146 */
147 lttng::sessiond::ust::registry_session *ust_registry_session_per_uid_create(
148 const lttng::sessiond::trace::abi& abi,
149 uint32_t major,
150 uint32_t minor,
151 const char *root_shm_path,
152 const char *shm_path,
153 uid_t euid,
154 gid_t egid,
155 uint64_t tracing_id,
156 uid_t tracing_uid);
157
158 /*
159 * Create per-pid registry with default values.
160 *
161 * Return new instance on success, nullptr on error.
162 */
163 lttng::sessiond::ust::registry_session *ust_registry_session_per_pid_create(struct ust_app *app,
164 const lttng::sessiond::trace::abi& abi,
165 uint32_t major,
166 uint32_t minor,
167 const char *root_shm_path,
168 const char *shm_path,
169 uid_t euid,
170 gid_t egid,
171 uint64_t tracing_id);
172 void ust_registry_session_destroy(lttng::sessiond::ust::registry_session *session);
173
174 void ust_registry_channel_destroy_event(lttng::sessiond::ust::registry_channel *chan,
175 lttng::sessiond::ust::registry_event *event);
176
177 #else /* HAVE_LIBLTTNG_UST_CTL */
178
179 static inline
180 lttng::sessiond::ust::registry_session *ust_registry_session_per_uid_create(
181 uint32_t bits_per_long __attribute__((unused)),
182 uint32_t uint8_t_alignment __attribute__((unused)),
183 uint32_t uint16_t_alignment __attribute__((unused)),
184 uint32_t uint32_t_alignment __attribute__((unused)),
185 uint32_t uint64_t_alignment __attribute__((unused)),
186 uint32_t long_alignment __attribute__((unused)),
187 int byte_order __attribute__((unused)),
188 uint32_t major __attribute__((unused)),
189 uint32_t minor __attribute__((unused)),
190 const char *root_shm_path __attribute__((unused)),
191 const char *shm_path __attribute__((unused)),
192 uid_t euid __attribute__((unused)),
193 gid_t egid __attribute__((unused)),
194 uint64_t tracing_id __attribute__((unused)),
195 uid_t tracing_uid __attribute__((unused)))
196 {
197 return nullptr;
198 }
199
200 static inline
201 lttng::sessiond::ust::registry_session *ust_registry_session_per_pid_create(
202 struct ust_app *app __attribute__((unused)),
203 uint32_t bits_per_long __attribute__((unused)),
204 uint32_t uint8_t_alignment __attribute__((unused)),
205 uint32_t uint16_t_alignment __attribute__((unused)),
206 uint32_t uint32_t_alignment __attribute__((unused)),
207 uint32_t uint64_t_alignment __attribute__((unused)),
208 uint32_t long_alignment __attribute__((unused)),
209 int byte_order __attribute__((unused)),
210 uint32_t major __attribute__((unused)),
211 uint32_t minor __attribute__((unused)),
212 const char *root_shm_path __attribute__((unused)),
213 const char *shm_path __attribute__((unused)),
214 uid_t euid __attribute__((unused)),
215 gid_t egid __attribute__((unused)),
216 uint64_t tracing_id __attribute__((unused)))
217 {
218 return nullptr;
219 }
220
221 static inline
222 void ust_registry_session_destroy(
223 lttng::sessiond::ust::registry_session *session __attribute__((unused)))
224 {}
225
226 static inline
227 void ust_registry_destroy_event(
228 lttng::sessiond::ust::registry_channel *chan __attribute__((unused)),
229 lttng::sessiond::ust::registry_event *event __attribute__((unused)))
230 {}
231
232 /* The app object can be NULL for registry shared across applications. */
233 static inline
234 int ust_metadata_session_statedump(
235 lttng::sessiond::ust::registry_session *session __attribute__((unused)))
236 {
237 return 0;
238 }
239
240 static inline
241 int ust_metadata_channel_statedump(
242 lttng::sessiond::ust::registry_session *session __attribute__((unused)),
243 lttng::sessiond::ust::registry_channel *chan __attribute__((unused)))
244 {
245 return 0;
246 }
247
248 static inline
249 int ust_metadata_event_statedump(
250 lttng::sessiond::ust::registry_session *session __attribute__((unused)),
251 lttng::sessiond::ust::registry_channel *chan __attribute__((unused)),
252 lttng::sessiond::ust::registry_event *event __attribute__((unused)))
253 {
254 return 0;
255 }
256
257 #endif /* HAVE_LIBLTTNG_UST_CTL */
258
259 #endif /* LTTNG_UST_REGISTRY_H */
This page took 0.0355220000000001 seconds and 5 git commands to generate.