Commit | Line | Data |
---|---|---|
d0b96690 | 1 | /* |
ab5be9fa | 2 | * Copyright (C) 2013 David Goulet <dgoulet@efficios.com> |
d0b96690 | 3 | * |
ab5be9fa | 4 | * SPDX-License-Identifier: GPL-2.0-only |
d0b96690 | 5 | * |
d0b96690 | 6 | */ |
890d8fe4 | 7 | |
6c1c0768 | 8 | #define _LGPL_SOURCE |
7972aab2 | 9 | |
c9e313bc | 10 | #include "ust-registry.hpp" |
c9e313bc SM |
11 | #include "lttng-sessiond.hpp" |
12 | #include "notification-thread-commands.hpp" | |
d7bfb9b0 | 13 | #include "ust-app.hpp" |
b0f2e8db JG |
14 | #include "ust-registry-session-pid.hpp" |
15 | #include "ust-registry-session-uid.hpp" | |
d7bfb9b0 | 16 | #include "utils.hpp" |
d0b96690 | 17 | |
d7bfb9b0 JG |
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> | |
10b56aef | 24 | |
d7bfb9b0 | 25 | #include <inttypes.h> |
3b016e58 | 26 | |
d7bfb9b0 JG |
27 | namespace ls = lttng::sessiond; |
28 | namespace lst = lttng::sessiond::trace; | |
29 | namespace lsu = lttng::sessiond::ust; | |
10b56aef | 30 | |
d0b96690 DG |
31 | /* |
32 | * Destroy event function call of the call RCU. | |
33 | */ | |
d7bfb9b0 | 34 | static void ust_registry_event_destroy_rcu(struct rcu_head *head) |
d0b96690 | 35 | { |
d7bfb9b0 JG |
36 | struct lttng_ht_node_u64 *node = caa_container_of(head, struct lttng_ht_node_u64, head); |
37 | DIAGNOSTIC_PUSH | |
38 | DIAGNOSTIC_IGNORE_INVALID_OFFSETOF | |
39 | lttng::sessiond::ust::registry_event *event = | |
40 | caa_container_of(node, lttng::sessiond::ust::registry_event, _node); | |
41 | DIAGNOSTIC_POP | |
42 | ||
43 | lttng::sessiond::ust::registry_event_destroy(event); | |
d0b96690 DG |
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 | */ | |
d7bfb9b0 JG |
50 | void ust_registry_channel_destroy_event(lsu::registry_channel *chan, |
51 | lttng::sessiond::ust::registry_event *event) | |
d0b96690 DG |
52 | { |
53 | int ret; | |
54 | struct lttng_ht_iter iter; | |
55 | ||
a0377dfe FD |
56 | LTTNG_ASSERT(chan); |
57 | LTTNG_ASSERT(event); | |
48b7cdc2 | 58 | ASSERT_RCU_READ_LOCKED(); |
d0b96690 DG |
59 | |
60 | /* Delete the node first. */ | |
d7bfb9b0 JG |
61 | iter.iter.node = &event->_node.node; |
62 | ret = lttng_ht_del(chan->_events, &iter); | |
a0377dfe | 63 | LTTNG_ASSERT(!ret); |
d0b96690 | 64 | |
d7bfb9b0 | 65 | call_rcu(&event->_node.head, ust_registry_event_destroy_rcu); |
d0b96690 DG |
66 | |
67 | return; | |
68 | } | |
69 | ||
b0f2e8db | 70 | lsu::registry_session *ust_registry_session_per_uid_create(const lttng::sessiond::trace::abi& abi, |
af6142cf | 71 | uint32_t major, |
d7ba1388 | 72 | uint32_t minor, |
3d071855 | 73 | const char *root_shm_path, |
d7ba1388 MD |
74 | const char *shm_path, |
75 | uid_t euid, | |
8de88061 JR |
76 | gid_t egid, |
77 | uint64_t tracing_id, | |
78 | uid_t tracing_uid) | |
d0b96690 | 79 | { |
aeeb48c6 | 80 | try { |
b0f2e8db | 81 | return new lsu::registry_session_per_uid(abi, major, minor, root_shm_path, shm_path, |
aeeb48c6 | 82 | euid, egid, tracing_id, tracing_uid); |
d7bfb9b0 | 83 | } catch (const std::exception& ex) { |
aeeb48c6 JG |
84 | ERR("Failed to create per-uid registry session: %s", ex.what()); |
85 | return nullptr; | |
d7ba1388 | 86 | } |
aeeb48c6 | 87 | } |
8de88061 | 88 | |
b0f2e8db | 89 | lsu::registry_session *ust_registry_session_per_pid_create(struct ust_app *app, |
d7bfb9b0 | 90 | const lttng::sessiond::trace::abi& abi, |
aeeb48c6 JG |
91 | uint32_t major, |
92 | uint32_t minor, | |
93 | const char *root_shm_path, | |
94 | const char *shm_path, | |
95 | uid_t euid, | |
96 | gid_t egid, | |
97 | uint64_t tracing_id) | |
98 | { | |
99 | try { | |
b0f2e8db | 100 | return new lsu::registry_session_per_pid(*app, abi, major, minor, root_shm_path, |
d7bfb9b0 JG |
101 | shm_path, euid, egid, tracing_id); |
102 | } catch (const std::exception& ex) { | |
aeeb48c6 JG |
103 | ERR("Failed to create per-pid registry session: %s", ex.what()); |
104 | return nullptr; | |
d0b96690 | 105 | } |
d0b96690 DG |
106 | } |
107 | ||
108 | /* | |
109 | * Destroy session registry. This does NOT free the given pointer since it | |
110 | * might get passed as a reference. The registry lock should NOT be acquired. | |
111 | */ | |
b0f2e8db | 112 | void ust_registry_session_destroy(lsu::registry_session *reg) |
d0b96690 | 113 | { |
aeeb48c6 | 114 | delete reg; |
d0b96690 | 115 | } |
d7bfb9b0 JG |
116 | |
117 | lsu::registry_enum::registry_enum( | |
118 | std::string in_name, enum lst::integer_type::signedness in_signedness) : | |
119 | name{std::move(in_name)}, signedness{in_signedness} | |
120 | { | |
121 | cds_lfht_node_init(&this->node.node); | |
122 | this->rcu_head = {}; | |
123 | } | |
124 | ||
125 | bool lsu::operator==(const lsu::registry_enum& lhs, const lsu::registry_enum& rhs) noexcept | |
126 | { | |
127 | if (lhs.signedness != rhs.signedness) { | |
128 | return false; | |
129 | } | |
130 | ||
131 | return lhs._is_equal(rhs); | |
132 | } |