2 * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
4 * SPDX-License-Identifier: GPL-2.0-only
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"
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>
28 namespace ls
= lttng::sessiond
;
29 namespace lst
= lttng::sessiond::trace
;
30 namespace lsu
= lttng::sessiond::ust
;
33 * Destroy event function call of the call RCU.
35 static void ust_registry_event_destroy_rcu(struct rcu_head
*head
)
38 DIAGNOSTIC_IGNORE_INVALID_OFFSETOF
39 lttng::sessiond::ust::registry_event
*event
=
40 lttng::utils::container_of(head
, <tng::sessiond::ust::registry_event::_head
);
43 lttng::sessiond::ust::registry_event_destroy(event
);
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.
50 void ust_registry_channel_destroy_event(lsu::registry_channel
*chan
,
51 lttng::sessiond::ust::registry_event
*event
)
54 struct lttng_ht_iter iter
;
58 ASSERT_RCU_READ_LOCKED();
60 /* Delete the node first. */
61 iter
.iter
.node
= &event
->_node
;
62 ret
= lttng_ht_del(chan
->_events
, &iter
);
65 call_rcu(&event
->_head
, ust_registry_event_destroy_rcu
);
70 lsu::registry_session
*ust_registry_session_per_uid_create(const lttng::sessiond::trace::abi
& abi
,
73 const char *root_shm_path
,
79 const lttng::trace_format_descriptor
& trace_format
)
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());
90 lsu::registry_session
*ust_registry_session_per_pid_create(struct ust_app
*app
,
91 const lttng::sessiond::trace::abi
& abi
,
94 const char *root_shm_path
,
99 const lttng::trace_format_descriptor
& trace_format
)
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());
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.
114 void ust_registry_session_destroy(lsu::registry_session
*reg
)
119 lsu::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
}
123 cds_lfht_node_init(&this->node
.node
);
127 bool lsu::operator==(const lsu::registry_enum
& lhs
, const lsu::registry_enum
& rhs
) noexcept
129 if (lhs
.signedness
!= rhs
.signedness
) {
133 return lhs
._is_equal(rhs
);