2 * SPDX-License-Identifier: LGPL-2.1-only
4 * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
12 #include "context-internal.h"
13 #include "lib/lttng-ust/events.h"
14 #include "common/logging.h"
15 #include "lttng-tracer-core.h"
16 #include "lttng-rb-clients.h"
17 #include "lttng-counter-client.h"
18 #include "common/jhash.h"
20 static CDS_LIST_HEAD(lttng_transport_list
);
21 static CDS_LIST_HEAD(lttng_counter_transport_list
);
23 struct lttng_transport
*lttng_ust_transport_find(const char *name
)
25 struct lttng_transport
*transport
;
27 cds_list_for_each_entry(transport
, <tng_transport_list
, node
) {
28 if (!strcmp(transport
->name
, name
))
34 struct lttng_counter_transport
*lttng_counter_transport_find(const char *name
)
36 struct lttng_counter_transport
*transport
;
38 cds_list_for_each_entry(transport
, <tng_counter_transport_list
, node
) {
39 if (!strcmp(transport
->name
, name
))
46 * lttng_transport_register - LTT transport registration
47 * @transport: transport structure
49 * Registers a transport which can be used as output to extract the data out of
50 * LTTng. Called with ust_lock held.
52 void lttng_transport_register(struct lttng_transport
*transport
)
54 cds_list_add_tail(&transport
->node
, <tng_transport_list
);
58 * lttng_transport_unregister - LTT transport unregistration
59 * @transport: transport structure
60 * Called with ust_lock held.
62 void lttng_transport_unregister(struct lttng_transport
*transport
)
64 cds_list_del(&transport
->node
);
68 * lttng_counter_transport_register - LTTng counter transport registration
69 * @transport: transport structure
71 * Registers a counter transport which can be used as output to extract
72 * the data out of LTTng. Called with ust_lock held.
74 void lttng_counter_transport_register(struct lttng_counter_transport
*transport
)
76 cds_list_add_tail(&transport
->node
, <tng_counter_transport_list
);
80 * lttng_counter_transport_unregister - LTTng counter transport unregistration
81 * @transport: transport structure
82 * Called with ust_lock held.
84 void lttng_counter_transport_unregister(struct lttng_counter_transport
*transport
)
86 cds_list_del(&transport
->node
);
90 * Needed by comm layer.
92 struct lttng_enum
*lttng_ust_enum_get_from_desc(struct lttng_ust_session
*session
,
93 const struct lttng_ust_enum_desc
*enum_desc
)
95 struct lttng_enum
*_enum
;
96 struct cds_hlist_head
*head
;
97 struct cds_hlist_node
*node
;
98 size_t name_len
= strlen(enum_desc
->name
);
101 hash
= jhash(enum_desc
->name
, name_len
, 0);
102 head
= &session
->priv
->enums_ht
.table
[hash
& (LTTNG_UST_ENUM_HT_SIZE
- 1)];
103 cds_hlist_for_each_entry(_enum
, node
, head
, hlist
) {
105 if (_enum
->desc
== enum_desc
)
111 size_t lttng_ust_dummy_get_size(void *priv
__attribute__((unused
)),
112 struct lttng_ust_probe_ctx
*probe_ctx
__attribute__((unused
)),
117 size
+= lttng_ust_ring_buffer_align(offset
, lttng_ust_rb_alignof(char));
118 size
+= sizeof(char); /* tag */
122 void lttng_ust_dummy_record(void *priv
__attribute__((unused
)),
123 struct lttng_ust_probe_ctx
*probe_ctx
__attribute__((unused
)),
124 struct lttng_ust_ring_buffer_ctx
*ctx
,
125 struct lttng_ust_channel_buffer
*chan
)
127 char sel_char
= (char) LTTNG_UST_DYNAMIC_TYPE_NONE
;
129 chan
->ops
->event_write(ctx
, &sel_char
, sizeof(sel_char
), lttng_ust_rb_alignof(sel_char
));
132 void lttng_ust_dummy_get_value(void *priv
__attribute__((unused
)),
133 struct lttng_ust_probe_ctx
*probe_ctx
__attribute__((unused
)),
134 struct lttng_ust_ctx_value
*value
)
136 value
->sel
= LTTNG_UST_DYNAMIC_TYPE_NONE
;
139 int lttng_context_is_app(const char *name
)
141 if (strncmp(name
, "$app.", strlen("$app.")) != 0) {
147 struct lttng_ust_channel_buffer
*lttng_ust_alloc_channel_buffer(void)
149 struct lttng_ust_channel_buffer
*lttng_chan_buf
;
150 struct lttng_ust_channel_common
*lttng_chan_common
;
151 struct lttng_ust_channel_buffer_private
*lttng_chan_buf_priv
;
153 lttng_chan_buf
= zmalloc(sizeof(struct lttng_ust_channel_buffer
));
155 goto lttng_chan_buf_error
;
156 lttng_chan_buf
->struct_size
= sizeof(struct lttng_ust_channel_buffer
);
157 lttng_chan_common
= zmalloc(sizeof(struct lttng_ust_channel_common
));
158 if (!lttng_chan_common
)
159 goto lttng_chan_common_error
;
160 lttng_chan_common
->struct_size
= sizeof(struct lttng_ust_channel_common
);
161 lttng_chan_buf_priv
= zmalloc(sizeof(struct lttng_ust_channel_buffer_private
));
162 if (!lttng_chan_buf_priv
)
163 goto lttng_chan_buf_priv_error
;
164 lttng_chan_buf
->parent
= lttng_chan_common
;
165 lttng_chan_common
->type
= LTTNG_UST_CHANNEL_TYPE_BUFFER
;
166 lttng_chan_common
->child
= lttng_chan_buf
;
167 lttng_chan_buf
->priv
= lttng_chan_buf_priv
;
168 lttng_chan_common
->priv
= <tng_chan_buf_priv
->parent
;
169 lttng_chan_buf_priv
->pub
= lttng_chan_buf
;
170 lttng_chan_buf_priv
->parent
.pub
= lttng_chan_common
;
172 return lttng_chan_buf
;
174 lttng_chan_buf_priv_error
:
175 free(lttng_chan_common
);
176 lttng_chan_common_error
:
177 free(lttng_chan_buf
);
178 lttng_chan_buf_error
:
182 void lttng_ust_free_channel_common(struct lttng_ust_channel_common
*chan
)
184 switch (chan
->type
) {
185 case LTTNG_UST_CHANNEL_TYPE_BUFFER
:
187 struct lttng_ust_channel_buffer
*chan_buf
;
189 chan_buf
= (struct lttng_ust_channel_buffer
*)chan
->child
;
190 free(chan_buf
->parent
);
191 free(chan_buf
->priv
);
200 void lttng_ust_ring_buffer_clients_init(void)
202 lttng_ring_buffer_metadata_client_init();
203 lttng_ring_buffer_client_overwrite_init();
204 lttng_ring_buffer_client_overwrite_rt_init();
205 lttng_ring_buffer_client_discard_init();
206 lttng_ring_buffer_client_discard_rt_init();
209 void lttng_ust_ring_buffer_clients_exit(void)
211 lttng_ring_buffer_client_discard_rt_exit();
212 lttng_ring_buffer_client_discard_exit();
213 lttng_ring_buffer_client_overwrite_rt_exit();
214 lttng_ring_buffer_client_overwrite_exit();
215 lttng_ring_buffer_metadata_client_exit();
218 void lttng_ust_counter_clients_init(void)
220 lttng_counter_client_percpu_64_modular_init();
221 lttng_counter_client_percpu_32_modular_init();
224 void lttng_ust_counter_clients_exit(void)
226 lttng_counter_client_percpu_32_modular_exit();
227 lttng_counter_client_percpu_64_modular_exit();