Use the trace format type for ust metadata generation
[deliverable/lttng-tools.git] / src / bin / lttng-sessiond / ust-registry.cpp
... / ...
CommitLineData
1/*
2 * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 */
7
8#define _LGPL_SOURCE
9
10#include "ust-registry.hpp"
11#include "lttng-sessiond.hpp"
12#include "notification-thread-commands.hpp"
13#include "ust-app.hpp"
14#include "ust-registry-session-pid.hpp"
15#include "ust-registry-session-uid.hpp"
16#include "utils.hpp"
17
18#include <common/common.hpp>
19#include <common/exception.hpp>
20#include <common/format.hpp>
21#include <common/hashtable/utils.hpp>
22#include <common/make-unique-wrapper.hpp>
23#include <lttng/lttng.h>
24#include <lttng/trace-format-descriptor-internal.hpp>
25
26#include <inttypes.h>
27
28namespace ls = lttng::sessiond;
29namespace lst = lttng::sessiond::trace;
30namespace lsu = lttng::sessiond::ust;
31
32/*
33 * Destroy event function call of the call RCU.
34 */
35static void ust_registry_event_destroy_rcu(struct rcu_head *head)
36{
37 DIAGNOSTIC_PUSH
38 DIAGNOSTIC_IGNORE_INVALID_OFFSETOF
39 lttng::sessiond::ust::registry_event *event =
40 lttng::utils::container_of(head, &lttng::sessiond::ust::registry_event::_head);
41 DIAGNOSTIC_POP
42
43 lttng::sessiond::ust::registry_event_destroy(event);
44}
45
46/*
47 * For a given event in a registry, delete the entry and destroy the event.
48 * This MUST be called within a RCU read side lock section.
49 */
50void ust_registry_channel_destroy_event(lsu::registry_channel *chan,
51 lttng::sessiond::ust::registry_event *event)
52{
53 int ret;
54 struct lttng_ht_iter iter;
55
56 LTTNG_ASSERT(chan);
57 LTTNG_ASSERT(event);
58 ASSERT_RCU_READ_LOCKED();
59
60 /* Delete the node first. */
61 iter.iter.node = &event->_node;
62 ret = lttng_ht_del(chan->_events, &iter);
63 LTTNG_ASSERT(!ret);
64
65 call_rcu(&event->_head, ust_registry_event_destroy_rcu);
66
67 return;
68}
69
70lsu::registry_session *ust_registry_session_per_uid_create(const lttng::sessiond::trace::abi& abi,
71 uint32_t major,
72 uint32_t minor,
73 const char *root_shm_path,
74 const char *shm_path,
75 uid_t euid,
76 gid_t egid,
77 uint64_t tracing_id,
78 uid_t tracing_uid,
79 const lttng::trace_format_descriptor& trace_format)
80{
81 try {
82 return new lsu::registry_session_per_uid(abi, major, minor, root_shm_path, shm_path,
83 euid, egid, tracing_id, tracing_uid, trace_format);
84 } catch (const std::exception& ex) {
85 ERR("Failed to create per-uid registry session: %s", ex.what());
86 return nullptr;
87 }
88}
89
90lsu::registry_session *ust_registry_session_per_pid_create(struct ust_app *app,
91 const lttng::sessiond::trace::abi& abi,
92 uint32_t major,
93 uint32_t minor,
94 const char *root_shm_path,
95 const char *shm_path,
96 uid_t euid,
97 gid_t egid,
98 uint64_t tracing_id,
99 const lttng::trace_format_descriptor& trace_format)
100{
101 try {
102 return new lsu::registry_session_per_pid(*app, abi, major, minor, root_shm_path,
103 shm_path, euid, egid, tracing_id, trace_format);
104 } catch (const std::exception& ex) {
105 ERR("Failed to create per-pid registry session: %s", ex.what());
106 return nullptr;
107 }
108}
109
110/*
111 * Destroy session registry. This does NOT free the given pointer since it
112 * might get passed as a reference. The registry lock should NOT be acquired.
113 */
114void ust_registry_session_destroy(lsu::registry_session *reg)
115{
116 delete reg;
117}
118
119lsu::registry_enum::registry_enum(
120 std::string in_name, enum lst::integer_type::signedness in_signedness) :
121 name{std::move(in_name)}, signedness{in_signedness}
122{
123 cds_lfht_node_init(&this->node.node);
124 this->rcu_head = {};
125}
126
127bool lsu::operator==(const lsu::registry_enum& lhs, const lsu::registry_enum& rhs) noexcept
128{
129 if (lhs.signedness != rhs.signedness) {
130 return false;
131 }
132
133 return lhs._is_equal(rhs);
134}
This page took 0.025117 seconds and 5 git commands to generate.