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
)),
116 size
+= lttng_ust_lib_ring_buffer_align(offset
, lttng_ust_rb_alignof(char));
117 size
+= sizeof(char); /* tag */
121 void lttng_ust_dummy_record(void *priv
__attribute__((unused
)),
122 struct lttng_ust_lib_ring_buffer_ctx
*ctx
,
123 struct lttng_ust_channel_buffer
*chan
)
125 char sel_char
= (char) LTTNG_UST_DYNAMIC_TYPE_NONE
;
127 chan
->ops
->event_write(ctx
, &sel_char
, sizeof(sel_char
), lttng_ust_rb_alignof(sel_char
));
130 void lttng_ust_dummy_get_value(void *priv
__attribute__((unused
)),
131 struct lttng_ust_ctx_value
*value
)
133 value
->sel
= LTTNG_UST_DYNAMIC_TYPE_NONE
;
136 int lttng_context_is_app(const char *name
)
138 if (strncmp(name
, "$app.", strlen("$app.")) != 0) {
144 struct lttng_ust_channel_buffer
*lttng_ust_alloc_channel_buffer(void)
146 struct lttng_ust_channel_buffer
*lttng_chan_buf
;
147 struct lttng_ust_channel_common
*lttng_chan_common
;
148 struct lttng_ust_channel_buffer_private
*lttng_chan_buf_priv
;
150 lttng_chan_buf
= zmalloc(sizeof(struct lttng_ust_channel_buffer
));
152 goto lttng_chan_buf_error
;
153 lttng_chan_buf
->struct_size
= sizeof(struct lttng_ust_channel_buffer
);
154 lttng_chan_common
= zmalloc(sizeof(struct lttng_ust_channel_common
));
155 if (!lttng_chan_common
)
156 goto lttng_chan_common_error
;
157 lttng_chan_common
->struct_size
= sizeof(struct lttng_ust_channel_common
);
158 lttng_chan_buf_priv
= zmalloc(sizeof(struct lttng_ust_channel_buffer_private
));
159 if (!lttng_chan_buf_priv
)
160 goto lttng_chan_buf_priv_error
;
161 lttng_chan_buf
->parent
= lttng_chan_common
;
162 lttng_chan_common
->type
= LTTNG_UST_CHANNEL_TYPE_BUFFER
;
163 lttng_chan_common
->child
= lttng_chan_buf
;
164 lttng_chan_buf
->priv
= lttng_chan_buf_priv
;
165 lttng_chan_common
->priv
= <tng_chan_buf_priv
->parent
;
166 lttng_chan_buf_priv
->pub
= lttng_chan_buf
;
167 lttng_chan_buf_priv
->parent
.pub
= lttng_chan_common
;
169 return lttng_chan_buf
;
171 lttng_chan_buf_priv_error
:
172 free(lttng_chan_common
);
173 lttng_chan_common_error
:
174 free(lttng_chan_buf
);
175 lttng_chan_buf_error
:
179 void lttng_ust_free_channel_common(struct lttng_ust_channel_common
*chan
)
181 switch (chan
->type
) {
182 case LTTNG_UST_CHANNEL_TYPE_BUFFER
:
184 struct lttng_ust_channel_buffer
*chan_buf
;
186 chan_buf
= (struct lttng_ust_channel_buffer
*)chan
->child
;
187 free(chan_buf
->parent
);
188 free(chan_buf
->priv
);
197 void lttng_ust_ring_buffer_clients_init(void)
199 lttng_ring_buffer_metadata_client_init();
200 lttng_ring_buffer_client_overwrite_init();
201 lttng_ring_buffer_client_overwrite_rt_init();
202 lttng_ring_buffer_client_discard_init();
203 lttng_ring_buffer_client_discard_rt_init();
206 void lttng_ust_ring_buffer_clients_exit(void)
208 lttng_ring_buffer_client_discard_rt_exit();
209 lttng_ring_buffer_client_discard_exit();
210 lttng_ring_buffer_client_overwrite_rt_exit();
211 lttng_ring_buffer_client_overwrite_exit();
212 lttng_ring_buffer_metadata_client_exit();
215 void lttng_ust_counter_clients_init(void)
217 lttng_counter_client_percpu_64_modular_init();
218 lttng_counter_client_percpu_32_modular_init();
221 void lttng_ust_counter_clients_exit(void)
223 lttng_counter_client_percpu_32_modular_exit();
224 lttng_counter_client_percpu_64_modular_exit();