Always use lttng_get_probe_list_head to get probe list
[lttng-ust.git] / liblttng-ust / lttng-events.c
CommitLineData
8020ceb5 1/*
7dd08bec 2 * lttng-events.c
8020ceb5 3 *
8020ceb5
MD
4 * Holds LTTng per-session event registry.
5 *
e92f3e28
MD
6 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; only
11 * version 2.1 of the License.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
8020ceb5
MD
21 */
22
b5234c06
MD
23#define _GNU_SOURCE
24#include <stdio.h>
25#include <urcu/list.h>
8165c8da 26#include <urcu/hlist.h>
b5234c06 27#include <pthread.h>
b5234c06 28#include <errno.h>
f4681817
MD
29#include <sys/shm.h>
30#include <sys/ipc.h>
44c72f10
MD
31#include <stdint.h>
32#include <stddef.h>
28b12049
MD
33#include <inttypes.h>
34#include <time.h>
2ae57758 35#include <lttng/ust-endian.h>
28b12049 36#include "clock.h"
44c72f10
MD
37
38#include <urcu-bp.h>
39#include <urcu/compiler.h>
40#include <urcu/uatomic.h>
41#include <urcu/arch.h>
42
43#include <lttng/tracepoint.h>
4318ae1b 44#include <lttng/ust-events.h>
44c72f10
MD
45
46#include <usterr-signal-safe.h>
47#include <helper.h>
1f18504e 48#include "error.h"
08114193 49#include "compat.h"
eda498b8 50#include "lttng-ust-uuid.h"
44c72f10 51
457a6b58 52#include "tracepoint-internal.h"
7dd08bec
MD
53#include "lttng-tracer.h"
54#include "lttng-tracer-core.h"
b728d87e 55#include "wait.h"
8d8a24c8 56#include "../libringbuffer/shm.h"
596c4223 57#include "jhash.h"
8165c8da
MD
58
59/*
60 * The sessions mutex is the centralized mutex across UST tracing
17dfb34b
MD
61 * control and probe registration. All operations within this file are
62 * called by the communication thread, under ust_lock protection.
8165c8da 63 */
2b2d6ff7 64static pthread_mutex_t sessions_mutex = PTHREAD_MUTEX_INITIALIZER;
8165c8da 65
17dfb34b 66void ust_lock(void)
8165c8da
MD
67{
68 pthread_mutex_lock(&sessions_mutex);
69}
70
17dfb34b 71void ust_unlock(void)
8165c8da
MD
72{
73 pthread_mutex_unlock(&sessions_mutex);
74}
75
b5234c06 76static CDS_LIST_HEAD(sessions);
8165c8da 77
7dd08bec 78static void _lttng_event_destroy(struct lttng_event *event);
7dd08bec 79static int _lttng_event_unregister(struct lttng_event *event);
8020ceb5 80static
7dd08bec
MD
81int _lttng_event_metadata_statedump(struct lttng_session *session,
82 struct lttng_channel *chan,
83 struct lttng_event *event);
8020ceb5 84static
7dd08bec 85int _lttng_session_metadata_statedump(struct lttng_session *session);
8020ceb5 86
e58095ef
MD
87static
88void lttng_session_lazy_sync_enablers(struct lttng_session *session);
89static
90void lttng_session_sync_enablers(struct lttng_session *session);
91static
92void lttng_enabler_destroy(struct lttng_enabler *enabler);
93
94static
95int lttng_loglevel_match(int loglevel,
96 unsigned int has_loglevel,
457a6b58
MD
97 enum lttng_ust_loglevel_type req_type,
98 int req_loglevel)
99{
457a6b58
MD
100 if (req_type == LTTNG_UST_LOGLEVEL_ALL)
101 return 1;
e58095ef
MD
102 if (!has_loglevel)
103 loglevel = TRACE_DEFAULT;
457a6b58
MD
104 switch (req_type) {
105 case LTTNG_UST_LOGLEVEL_RANGE:
e58095ef 106 if (loglevel <= req_loglevel || req_loglevel == -1)
457a6b58
MD
107 return 1;
108 else
109 return 0;
110 case LTTNG_UST_LOGLEVEL_SINGLE:
e58095ef 111 if (loglevel == req_loglevel || req_loglevel == -1)
457a6b58
MD
112 return 1;
113 else
114 return 0;
115 case LTTNG_UST_LOGLEVEL_ALL:
116 default:
117 return 1;
118 }
119}
120
8020ceb5
MD
121void synchronize_trace(void)
122{
8020ceb5 123 synchronize_rcu();
8020ceb5
MD
124}
125
7dd08bec 126struct lttng_session *lttng_session_create(void)
8020ceb5 127{
7dd08bec 128 struct lttng_session *session;
74d81a6c 129 int i;
8020ceb5 130
7dd08bec 131 session = zmalloc(sizeof(struct lttng_session));
8020ceb5
MD
132 if (!session)
133 return NULL;
e58095ef
MD
134 CDS_INIT_LIST_HEAD(&session->chan_head);
135 CDS_INIT_LIST_HEAD(&session->events_head);
136 CDS_INIT_LIST_HEAD(&session->enablers_head);
d56fa719
MD
137 for (i = 0; i < LTTNG_UST_EVENT_HT_SIZE; i++)
138 CDS_INIT_HLIST_HEAD(&session->events_ht.table[i]);
e58095ef 139 cds_list_add(&session->node, &sessions);
8020ceb5
MD
140 return session;
141}
142
74d81a6c
MD
143/*
144 * Only used internally at session destruction.
145 */
146static
147void _lttng_channel_unmap(struct lttng_channel *lttng_chan)
148{
149 struct channel *chan;
150 struct lttng_ust_shm_handle *handle;
151
152 cds_list_del(&lttng_chan->node);
153 lttng_destroy_context(lttng_chan->ctx);
154 chan = lttng_chan->chan;
155 handle = lttng_chan->handle;
156 /*
157 * note: lttng_chan is private data contained within handle. It
158 * will be freed along with the handle.
159 */
160 channel_destroy(chan, handle, 0);
161}
162
7dd08bec 163void lttng_session_destroy(struct lttng_session *session)
8020ceb5 164{
7dd08bec
MD
165 struct lttng_channel *chan, *tmpchan;
166 struct lttng_event *event, *tmpevent;
e58095ef 167 struct lttng_enabler *enabler, *tmpenabler;
8020ceb5
MD
168 int ret;
169
b5234c06 170 CMM_ACCESS_ONCE(session->active) = 0;
e58095ef 171 cds_list_for_each_entry(event, &session->events_head, node) {
7dd08bec 172 ret = _lttng_event_unregister(event);
8020ceb5
MD
173 WARN_ON(ret);
174 }
175 synchronize_trace(); /* Wait for in-flight events to complete */
e58095ef
MD
176 cds_list_for_each_entry_safe(enabler, tmpenabler,
177 &session->enablers_head, node)
178 lttng_enabler_destroy(enabler);
179 cds_list_for_each_entry_safe(event, tmpevent,
180 &session->events_head, node)
7dd08bec 181 _lttng_event_destroy(event);
e58095ef 182 cds_list_for_each_entry_safe(chan, tmpchan, &session->chan_head, node)
74d81a6c 183 _lttng_channel_unmap(chan);
e58095ef 184 cds_list_del(&session->node);
b5234c06 185 free(session);
8020ceb5
MD
186}
187
7dd08bec 188int lttng_session_enable(struct lttng_session *session)
8020ceb5
MD
189{
190 int ret = 0;
7dd08bec 191 struct lttng_channel *chan;
8020ceb5 192
8020ceb5
MD
193 if (session->active) {
194 ret = -EBUSY;
195 goto end;
196 }
197
e58095ef
MD
198 /* We need to sync enablers with session before activation. */
199 lttng_session_sync_enablers(session);
200
8020ceb5
MD
201 /*
202 * Snapshot the number of events per channel to know the type of header
203 * we need to use.
204 */
e58095ef 205 cds_list_for_each_entry(chan, &session->chan_head, node) {
8020ceb5
MD
206 if (chan->header_type)
207 continue; /* don't change it if session stop/restart */
208 if (chan->free_event_id < 31)
209 chan->header_type = 1; /* compact */
210 else
211 chan->header_type = 2; /* large */
212 }
213
b5234c06
MD
214 CMM_ACCESS_ONCE(session->active) = 1;
215 CMM_ACCESS_ONCE(session->been_active) = 1;
7dd08bec 216 ret = _lttng_session_metadata_statedump(session);
4b4de73e 217 if (ret)
b5234c06 218 CMM_ACCESS_ONCE(session->active) = 0;
8020ceb5 219end:
8020ceb5
MD
220 return ret;
221}
222
7dd08bec 223int lttng_session_disable(struct lttng_session *session)
8020ceb5
MD
224{
225 int ret = 0;
226
8020ceb5
MD
227 if (!session->active) {
228 ret = -EBUSY;
229 goto end;
230 }
b5234c06 231 CMM_ACCESS_ONCE(session->active) = 0;
8020ceb5 232end:
8020ceb5
MD
233 return ret;
234}
235
7dd08bec 236int lttng_channel_enable(struct lttng_channel *channel)
976fe9ea
MD
237{
238 int old;
239
9beb36ba
MD
240 if (channel == channel->session->metadata)
241 return -EPERM;
b5234c06 242 old = uatomic_xchg(&channel->enabled, 1);
976fe9ea
MD
243 if (old)
244 return -EEXIST;
245 return 0;
246}
247
7dd08bec 248int lttng_channel_disable(struct lttng_channel *channel)
976fe9ea
MD
249{
250 int old;
251
9beb36ba
MD
252 if (channel == channel->session->metadata)
253 return -EPERM;
b5234c06 254 old = uatomic_xchg(&channel->enabled, 0);
976fe9ea
MD
255 if (!old)
256 return -EEXIST;
257 return 0;
258}
259
7dd08bec 260int lttng_event_enable(struct lttng_event *event)
976fe9ea
MD
261{
262 int old;
263
9beb36ba
MD
264 if (event->chan == event->chan->session->metadata)
265 return -EPERM;
b5234c06 266 old = uatomic_xchg(&event->enabled, 1);
976fe9ea
MD
267 if (old)
268 return -EEXIST;
269 return 0;
270}
271
7dd08bec 272int lttng_event_disable(struct lttng_event *event)
976fe9ea
MD
273{
274 int old;
275
9beb36ba
MD
276 if (event->chan == event->chan->session->metadata)
277 return -EPERM;
b5234c06 278 old = uatomic_xchg(&event->enabled, 0);
976fe9ea
MD
279 if (!old)
280 return -EEXIST;
281 return 0;
282}
283
8020ceb5
MD
284/*
285 * Supports event creation while tracing session is active.
286 */
e58095ef
MD
287static
288int lttng_event_create(const struct lttng_event_desc *desc,
289 struct lttng_channel *chan)
8020ceb5 290{
e58095ef 291 const char *event_name = desc->name;
7dd08bec 292 struct lttng_event *event;
d56fa719
MD
293 struct cds_hlist_head *head;
294 struct cds_hlist_node *node;
576599a0 295 int ret = 0;
d56fa719
MD
296 size_t name_len = strlen(event_name);
297 uint32_t hash;
8020ceb5 298
38eb0baa 299 if (chan->used_event_id == -1U) {
576599a0 300 ret = -ENOMEM;
8020ceb5 301 goto full;
576599a0 302 }
d56fa719
MD
303 hash = jhash(event_name, name_len, 0);
304 head = &chan->session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)];
305 cds_hlist_for_each_entry(event, node, head, hlist) {
e58095ef
MD
306 assert(event->desc);
307 if (!strncmp(event->desc->name,
308 desc->name,
ff412fb5 309 LTTNG_UST_SYM_NAME_LEN - 1)) {
576599a0 310 ret = -EEXIST;
8020ceb5 311 goto exist;
576599a0
MD
312 }
313 }
457a6b58
MD
314
315 /*
316 * Check if loglevel match. Refuse to connect event if not.
317 */
7dd08bec 318 event = zmalloc(sizeof(struct lttng_event));
576599a0
MD
319 if (!event) {
320 ret = -ENOMEM;
8020ceb5 321 goto cache_error;
576599a0 322 }
8020ceb5 323 event->chan = chan;
e58095ef 324
8165c8da
MD
325 /*
326 * used_event_id counts the maximum number of event IDs that can
327 * register if all probes register.
328 */
329 chan->used_event_id++;
976fe9ea 330 event->enabled = 1;
e58095ef
MD
331 CDS_INIT_LIST_HEAD(&event->bytecode_runtime_head);
332 CDS_INIT_LIST_HEAD(&event->enablers_ref_head);
333 event->desc = desc;
7dd08bec 334 /* Populate lttng_event structure before tracepoint registration. */
b5234c06 335 cmm_smp_wmb();
e58095ef
MD
336 ret = __tracepoint_probe_register(event_name,
337 desc->probe_callback,
338 event, desc->signature);
339 if (ret)
340 goto register_error;
341 event->id = chan->free_event_id++;
342 ret = _lttng_event_metadata_statedump(chan->session, chan, event);
343 if (ret)
344 goto statedump_error;
345 cds_list_add(&event->node, &chan->session->events_head);
d56fa719 346 cds_hlist_add_head(&event->hlist, head);
576599a0 347 return 0;
8020ceb5
MD
348
349statedump_error:
e58095ef
MD
350 WARN_ON_ONCE(__tracepoint_probe_unregister(event_name,
351 desc->probe_callback,
352 event));
8020ceb5 353register_error:
b5234c06 354 free(event);
8020ceb5
MD
355cache_error:
356exist:
357full:
576599a0 358 return ret;
8020ceb5
MD
359}
360
e58095ef
MD
361static
362int lttng_desc_match_wildcard_enabler(const struct lttng_event_desc *desc,
363 struct lttng_enabler *enabler)
364{
365 int loglevel = 0;
366 unsigned int has_loglevel;
367
368 assert(enabler->type == LTTNG_ENABLER_WILDCARD);
369 /* Compare excluding final '*' */
370 if (strncmp(desc->name, enabler->event_param.name,
371 strlen(enabler->event_param.name) - 1))
372 return 0;
373 if (desc->loglevel) {
374 loglevel = *(*desc->loglevel);
375 has_loglevel = 1;
376 }
377 if (!lttng_loglevel_match(loglevel,
378 has_loglevel,
379 enabler->event_param.loglevel_type,
380 enabler->event_param.loglevel))
381 return 0;
382 return 1;
383}
384
385static
386int lttng_desc_match_event_enabler(const struct lttng_event_desc *desc,
387 struct lttng_enabler *enabler)
388{
389 int loglevel = 0;
390 unsigned int has_loglevel = 0;
391
392 assert(enabler->type == LTTNG_ENABLER_EVENT);
393 if (strcmp(desc->name, enabler->event_param.name))
394 return 0;
395 if (desc->loglevel) {
396 loglevel = *(*desc->loglevel);
397 has_loglevel = 1;
398 }
399 if (!lttng_loglevel_match(loglevel,
400 has_loglevel,
401 enabler->event_param.loglevel_type,
402 enabler->event_param.loglevel))
403 return 0;
404 return 1;
405}
406
407static
408int lttng_desc_match_enabler(const struct lttng_event_desc *desc,
409 struct lttng_enabler *enabler)
410{
411 switch (enabler->type) {
412 case LTTNG_ENABLER_WILDCARD:
413 return lttng_desc_match_wildcard_enabler(desc, enabler);
414 case LTTNG_ENABLER_EVENT:
415 return lttng_desc_match_event_enabler(desc, enabler);
416 default:
417 return -EINVAL;
418 }
419}
420
421static
422int lttng_event_match_enabler(struct lttng_event *event,
423 struct lttng_enabler *enabler)
424{
425 return lttng_desc_match_enabler(event->desc, enabler);
426}
427
428static
429struct lttng_enabler_ref * lttng_event_enabler_ref(struct lttng_event *event,
430 struct lttng_enabler *enabler)
431{
432 struct lttng_enabler_ref *enabler_ref;
433
434 cds_list_for_each_entry(enabler_ref,
435 &event->enablers_ref_head, node) {
436 if (enabler_ref->ref == enabler)
437 return enabler_ref;
438 }
439 return NULL;
440}
441
8020ceb5 442/*
e58095ef
MD
443 * Create struct lttng_event if it is missing and present in the list of
444 * tracepoint probes.
8020ceb5 445 */
e58095ef
MD
446static
447void lttng_create_event_if_missing(struct lttng_enabler *enabler)
8020ceb5 448{
e58095ef
MD
449 struct lttng_session *session = enabler->chan->session;
450 struct lttng_probe_desc *probe_desc;
451 const struct lttng_event_desc *desc;
452 struct lttng_event *event;
453 int i;
454 struct cds_list_head *probe_list;
455
456 probe_list = lttng_get_probe_list_head();
457 /*
458 * For each probe event, if we find that a probe event matches
459 * our enabler, create an associated lttng_event if not
460 * already present.
461 */
462 cds_list_for_each_entry(probe_desc, probe_list, head) {
463 for (i = 0; i < probe_desc->nr_events; i++) {
464 int found = 0, ret;
d56fa719
MD
465 struct cds_hlist_head *head;
466 struct cds_hlist_node *node;
467 const char *event_name;
468 size_t name_len;
469 uint32_t hash;
e58095ef
MD
470
471 desc = probe_desc->event_desc[i];
472 if (!lttng_desc_match_enabler(desc, enabler))
473 continue;
d56fa719
MD
474 event_name = desc->name;
475 name_len = strlen(event_name);
e58095ef
MD
476
477 /*
d56fa719 478 * Check if already created.
e58095ef 479 */
d56fa719
MD
480 hash = jhash(event_name, name_len, 0);
481 head = &session->events_ht.table[hash & (LTTNG_UST_EVENT_HT_SIZE - 1)];
482 cds_hlist_for_each_entry(event, node, head, hlist) {
e58095ef
MD
483 if (event->desc == desc)
484 found = 1;
485 }
486 if (found)
487 continue;
488
489 /*
490 * We need to create an event for this
491 * event probe.
492 */
493 ret = lttng_event_create(probe_desc->event_desc[i],
494 enabler->chan);
495 if (ret) {
496 DBG("Unable to create event %s\n",
497 probe_desc->event_desc[i]->name);
498 }
8165c8da 499 }
8020ceb5 500 }
8020ceb5
MD
501}
502
503/*
e58095ef
MD
504 * Create events associated with an enabler (if not already present),
505 * and add backward reference from the event to the enabler.
8020ceb5
MD
506 */
507static
e58095ef 508int lttng_enabler_ref_events(struct lttng_enabler *enabler)
8020ceb5 509{
e58095ef
MD
510 struct lttng_session *session = enabler->chan->session;
511 struct lttng_event *event;
512
513 /* First ensure that probe events are created for this enabler. */
514 lttng_create_event_if_missing(enabler);
515
516 /* For each event matching enabler in session event list. */
517 cds_list_for_each_entry(event, &session->events_head, node) {
518 struct lttng_enabler_ref *enabler_ref;
519
520 if (!lttng_event_match_enabler(event, enabler))
521 continue;
522
523 enabler_ref = lttng_event_enabler_ref(event, enabler);
524 if (!enabler_ref) {
525 /*
526 * If no backward ref, create it.
527 * Add backward ref from event to enabler.
528 */
529 enabler_ref = zmalloc(sizeof(*enabler_ref));
530 if (!enabler_ref)
531 return -ENOMEM;
532 enabler_ref->ref = enabler;
533 cds_list_add(&enabler_ref->node,
534 &event->enablers_ref_head);
8165c8da 535 }
e58095ef
MD
536
537 /*
538 * Link filter bytecodes if not linked yet.
539 */
540 lttng_enabler_event_link_bytecode(event, enabler);
541
542 /* TODO: merge event context. */
543 }
544 return 0;
545}
546
547/*
548 * Called at library load: connect the probe on all enablers matching
549 * this event.
550 * called with session mutex held.
551 * TODO: currently, for each desc added, we iterate on all event desc
552 * (inefficient). We should create specific code that only target the
553 * added desc.
554 */
555int lttng_fix_pending_event_desc(const struct lttng_event_desc *desc)
556{
557 struct lttng_session *session;
558
559 cds_list_for_each_entry(session, &sessions, node) {
560 lttng_session_lazy_sync_enablers(session);
8020ceb5 561 }
e58095ef
MD
562 return 0;
563}
564
565/*
566 * Only used internally at session destruction.
567 */
568int _lttng_event_unregister(struct lttng_event *event)
569{
570 return __tracepoint_probe_unregister(event->desc->name,
571 event->desc->probe_callback,
572 event);
573}
574
575/*
576 * Only used internally at session destruction.
577 */
578static
579void _lttng_event_destroy(struct lttng_event *event)
580{
581 struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref;
582
e58095ef 583 cds_list_del(&event->node);
8020ceb5 584 lttng_destroy_context(event->ctx);
f488575f 585 lttng_free_event_filter_runtime(event);
e58095ef
MD
586 /* Free event enabler refs */
587 cds_list_for_each_entry_safe(enabler_ref, tmp_enabler_ref,
588 &event->enablers_ref_head, node)
589 free(enabler_ref);
b5234c06 590 free(event);
8020ceb5
MD
591}
592
593/*
594 * We have exclusive access to our metadata buffer (protected by the
17dfb34b 595 * ust_lock), so we can do racy operations such as looking for
8020ceb5
MD
596 * remaining space left in packet and write, since mutual exclusion
597 * protects us from concurrent writes.
598 */
7dd08bec 599int lttng_metadata_printf(struct lttng_session *session,
8020ceb5
MD
600 const char *fmt, ...)
601{
4cfec15c 602 struct lttng_ust_lib_ring_buffer_ctx ctx;
7dd08bec 603 struct lttng_channel *chan = session->metadata;
b5234c06 604 char *str = NULL;
8020ceb5
MD
605 int ret = 0, waitret;
606 size_t len, reserve_len, pos;
607 va_list ap;
608
b5234c06 609 WARN_ON_ONCE(!CMM_ACCESS_ONCE(session->active));
8020ceb5
MD
610
611 va_start(ap, fmt);
b5234c06 612 ret = vasprintf(&str, fmt, ap);
8020ceb5 613 va_end(ap);
b5234c06 614 if (ret < 0)
8020ceb5
MD
615 return -ENOMEM;
616
617 len = strlen(str);
618 pos = 0;
619
620 for (pos = 0; pos < len; pos += reserve_len) {
621 reserve_len = min_t(size_t,
1d498196 622 chan->ops->packet_avail_size(chan->chan, chan->handle),
8020ceb5
MD
623 len - pos);
624 lib_ring_buffer_ctx_init(&ctx, chan->chan, NULL, reserve_len,
1d498196 625 sizeof(char), -1, chan->handle);
8020ceb5
MD
626 /*
627 * We don't care about metadata buffer's records lost
628 * count, because we always retry here. Report error if
629 * we need to bail out after timeout or being
630 * interrupted.
631 */
b5234c06 632 waitret = wait_cond_interruptible_timeout(
8020ceb5
MD
633 ({
634 ret = chan->ops->event_reserve(&ctx, 0);
635 ret != -ENOBUFS || !ret;
636 }),
b5234c06 637 LTTNG_METADATA_TIMEOUT_MSEC);
b472cfc0 638 if (waitret == -ETIMEDOUT || waitret == -EINTR || ret) {
b5234c06
MD
639 DBG("LTTng: Failure to write metadata to buffers (%s)\n",
640 waitret == -EINTR ? "interrupted" :
8020ceb5 641 (ret == -ENOBUFS ? "timeout" : "I/O error"));
b5234c06 642 if (waitret == -EINTR)
8020ceb5
MD
643 ret = waitret;
644 goto end;
645 }
646 chan->ops->event_write(&ctx, &str[pos], reserve_len);
647 chan->ops->event_commit(&ctx);
648 }
649end:
b5234c06 650 free(str);
8020ceb5
MD
651 return ret;
652}
653
654static
7dd08bec 655int _lttng_field_statedump(struct lttng_session *session,
8020ceb5
MD
656 const struct lttng_event_field *field)
657{
658 int ret = 0;
659
180901e6 660 if (field->nowrite)
4774c8f3
MD
661 return 0;
662
8020ceb5
MD
663 switch (field->type.atype) {
664 case atype_integer:
665 ret = lttng_metadata_printf(session,
4e2ee1f5 666 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s;\n",
8020ceb5
MD
667 field->type.u.basic.integer.size,
668 field->type.u.basic.integer.alignment,
669 field->type.u.basic.integer.signedness,
670 (field->type.u.basic.integer.encoding == lttng_encode_none)
671 ? "none"
672 : (field->type.u.basic.integer.encoding == lttng_encode_UTF8)
673 ? "UTF8"
674 : "ASCII",
675 field->type.u.basic.integer.base,
8a98a75d 676#if (BYTE_ORDER == BIG_ENDIAN)
403c40b4
MD
677 field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
678#else
679 field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
680#endif
681 field->name);
682 break;
683 case atype_float:
684 ret = lttng_metadata_printf(session,
8a98a75d 685 " floating_point { exp_dig = %u; mant_dig = %u; align = %u;%s } _%s;\n",
403c40b4
MD
686 field->type.u.basic._float.exp_dig,
687 field->type.u.basic._float.mant_dig,
688 field->type.u.basic._float.alignment,
8a98a75d 689#if (BYTE_ORDER == BIG_ENDIAN)
8020ceb5
MD
690 field->type.u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
691#else
692 field->type.u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
693#endif
694 field->name);
695 break;
696 case atype_enum:
697 ret = lttng_metadata_printf(session,
698 " %s %s;\n",
699 field->type.u.basic.enumeration.name,
700 field->name);
701 break;
702 case atype_array:
703 {
704 const struct lttng_basic_type *elem_type;
705
706 elem_type = &field->type.u.array.elem_type;
707 ret = lttng_metadata_printf(session,
4e2ee1f5 708 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[%u];\n",
8020ceb5
MD
709 elem_type->u.basic.integer.size,
710 elem_type->u.basic.integer.alignment,
711 elem_type->u.basic.integer.signedness,
712 (elem_type->u.basic.integer.encoding == lttng_encode_none)
713 ? "none"
714 : (elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
715 ? "UTF8"
716 : "ASCII",
717 elem_type->u.basic.integer.base,
8a98a75d 718#if (BYTE_ORDER == BIG_ENDIAN)
8020ceb5
MD
719 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
720#else
721 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
722#endif
723 field->name, field->type.u.array.length);
724 break;
725 }
726 case atype_sequence:
727 {
728 const struct lttng_basic_type *elem_type;
729 const struct lttng_basic_type *length_type;
730
731 elem_type = &field->type.u.sequence.elem_type;
732 length_type = &field->type.u.sequence.length_type;
733 ret = lttng_metadata_printf(session,
734 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } __%s_length;\n",
735 length_type->u.basic.integer.size,
736 (unsigned int) length_type->u.basic.integer.alignment,
737 length_type->u.basic.integer.signedness,
738 (length_type->u.basic.integer.encoding == lttng_encode_none)
739 ? "none"
740 : ((length_type->u.basic.integer.encoding == lttng_encode_UTF8)
741 ? "UTF8"
742 : "ASCII"),
743 length_type->u.basic.integer.base,
8a98a75d 744#if (BYTE_ORDER == BIG_ENDIAN)
8020ceb5
MD
745 length_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
746#else
747 length_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
748#endif
749 field->name);
750 if (ret)
751 return ret;
752
753 ret = lttng_metadata_printf(session,
4e2ee1f5 754 " integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s } _%s[ __%s_length ];\n",
8020ceb5
MD
755 elem_type->u.basic.integer.size,
756 (unsigned int) elem_type->u.basic.integer.alignment,
757 elem_type->u.basic.integer.signedness,
758 (elem_type->u.basic.integer.encoding == lttng_encode_none)
759 ? "none"
760 : ((elem_type->u.basic.integer.encoding == lttng_encode_UTF8)
761 ? "UTF8"
762 : "ASCII"),
763 elem_type->u.basic.integer.base,
8a98a75d 764#if (BYTE_ORDER == BIG_ENDIAN)
8020ceb5
MD
765 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = le;" : "",
766#else
767 elem_type->u.basic.integer.reverse_byte_order ? " byte_order = be;" : "",
768#endif
769 field->name,
770 field->name);
771 break;
772 }
773
774 case atype_string:
775 /* Default encoding is UTF8 */
776 ret = lttng_metadata_printf(session,
4e2ee1f5 777 " string%s _%s;\n",
8020ceb5
MD
778 field->type.u.basic.string.encoding == lttng_encode_ASCII ?
779 " { encoding = ASCII; }" : "",
780 field->name);
781 break;
782 default:
783 WARN_ON_ONCE(1);
784 return -EINVAL;
785 }
786 return ret;
787}
788
789static
7dd08bec 790int _lttng_context_metadata_statedump(struct lttng_session *session,
8020ceb5
MD
791 struct lttng_ctx *ctx)
792{
793 int ret = 0;
794 int i;
795
796 if (!ctx)
797 return 0;
798 for (i = 0; i < ctx->nr_fields; i++) {
799 const struct lttng_ctx_field *field = &ctx->fields[i];
800
7dd08bec 801 ret = _lttng_field_statedump(session, &field->event_field);
8020ceb5
MD
802 if (ret)
803 return ret;
804 }
805 return ret;
806}
807
808static
7dd08bec
MD
809int _lttng_fields_metadata_statedump(struct lttng_session *session,
810 struct lttng_event *event)
8020ceb5
MD
811{
812 const struct lttng_event_desc *desc = event->desc;
813 int ret = 0;
814 int i;
815
816 for (i = 0; i < desc->nr_fields; i++) {
817 const struct lttng_event_field *field = &desc->fields[i];
818
7dd08bec 819 ret = _lttng_field_statedump(session, field);
8020ceb5
MD
820 if (ret)
821 return ret;
822 }
823 return ret;
824}
825
826static
7dd08bec
MD
827int _lttng_event_metadata_statedump(struct lttng_session *session,
828 struct lttng_channel *chan,
829 struct lttng_event *event)
8020ceb5
MD
830{
831 int ret = 0;
8155c5e8 832 int loglevel = TRACE_DEFAULT;
8020ceb5 833
b5234c06 834 if (event->metadata_dumped || !CMM_ACCESS_ONCE(session->active))
8020ceb5
MD
835 return 0;
836 if (chan == session->metadata)
837 return 0;
8165c8da
MD
838 /*
839 * Don't print events for which probe load is pending.
840 */
841 if (!event->desc)
842 return 0;
8020ceb5
MD
843
844 ret = lttng_metadata_printf(session,
845 "event {\n"
7083f0fe 846 " name = \"%s\";\n"
8020ceb5
MD
847 " id = %u;\n"
848 " stream_id = %u;\n",
849 event->desc->name,
850 event->id,
851 event->chan->id);
852 if (ret)
853 goto end;
854
8155c5e8
MD
855 if (event->desc->loglevel)
856 loglevel = *(*event->desc->loglevel);
857
858 ret = lttng_metadata_printf(session,
859 " loglevel = %d;\n",
860 loglevel);
861 if (ret)
862 goto end;
e6c12e3d 863
6ddc916d
MD
864 if (event->desc->u.ext.model_emf_uri) {
865 ret = lttng_metadata_printf(session,
866 " model.emf.uri = \"%s\";\n",
867 *(event->desc->u.ext.model_emf_uri));
868 if (ret)
869 goto end;
870 }
871
8020ceb5
MD
872 if (event->ctx) {
873 ret = lttng_metadata_printf(session,
874 " context := struct {\n");
875 if (ret)
876 goto end;
877 }
7dd08bec 878 ret = _lttng_context_metadata_statedump(session, event->ctx);
8020ceb5
MD
879 if (ret)
880 goto end;
881 if (event->ctx) {
882 ret = lttng_metadata_printf(session,
883 " };\n");
884 if (ret)
885 goto end;
886 }
887
888 ret = lttng_metadata_printf(session,
889 " fields := struct {\n"
890 );
891 if (ret)
892 goto end;
893
7dd08bec 894 ret = _lttng_fields_metadata_statedump(session, event);
8020ceb5
MD
895 if (ret)
896 goto end;
897
898 /*
899 * LTTng space reservation can only reserve multiples of the
900 * byte size.
901 */
902 ret = lttng_metadata_printf(session,
903 " };\n"
904 "};\n\n");
905 if (ret)
906 goto end;
907
908 event->metadata_dumped = 1;
909end:
910 return ret;
911
912}
913
914static
7dd08bec
MD
915int _lttng_channel_metadata_statedump(struct lttng_session *session,
916 struct lttng_channel *chan)
8020ceb5
MD
917{
918 int ret = 0;
919
b5234c06 920 if (chan->metadata_dumped || !CMM_ACCESS_ONCE(session->active))
8020ceb5
MD
921 return 0;
922 if (chan == session->metadata)
923 return 0;
924
925 WARN_ON_ONCE(!chan->header_type);
926 ret = lttng_metadata_printf(session,
927 "stream {\n"
928 " id = %u;\n"
929 " event.header := %s;\n"
930 " packet.context := struct packet_context;\n",
931 chan->id,
932 chan->header_type == 1 ? "struct event_header_compact" :
933 "struct event_header_large");
934 if (ret)
935 goto end;
936
937 if (chan->ctx) {
938 ret = lttng_metadata_printf(session,
939 " event.context := struct {\n");
940 if (ret)
941 goto end;
942 }
7dd08bec 943 ret = _lttng_context_metadata_statedump(session, chan->ctx);
8020ceb5
MD
944 if (ret)
945 goto end;
946 if (chan->ctx) {
947 ret = lttng_metadata_printf(session,
948 " };\n");
949 if (ret)
950 goto end;
951 }
952
953 ret = lttng_metadata_printf(session,
954 "};\n\n");
955
956 chan->metadata_dumped = 1;
957end:
958 return ret;
959}
960
961static
7dd08bec 962int _lttng_stream_packet_context_declare(struct lttng_session *session)
8020ceb5
MD
963{
964 return lttng_metadata_printf(session,
965 "struct packet_context {\n"
28b12049
MD
966 " uint64_clock_monotonic_t timestamp_begin;\n"
967 " uint64_clock_monotonic_t timestamp_end;\n"
0c00a107
MD
968 " uint64_t content_size;\n"
969 " uint64_t packet_size;\n"
18fc8d71 970 " unsigned long events_discarded;\n"
8020ceb5
MD
971 " uint32_t cpu_id;\n"
972 "};\n\n"
973 );
974}
975
976/*
977 * Compact header:
978 * id: range: 0 - 30.
979 * id 31 is reserved to indicate an extended header.
980 *
981 * Large header:
982 * id: range: 0 - 65534.
983 * id 65535 is reserved to indicate an extended header.
984 */
985static
7dd08bec 986int _lttng_event_header_declare(struct lttng_session *session)
8020ceb5
MD
987{
988 return lttng_metadata_printf(session,
989 "struct event_header_compact {\n"
990 " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
991 " variant <id> {\n"
992 " struct {\n"
28b12049 993 " uint27_clock_monotonic_t timestamp;\n"
8020ceb5
MD
994 " } compact;\n"
995 " struct {\n"
996 " uint32_t id;\n"
28b12049 997 " uint64_clock_monotonic_t timestamp;\n"
8020ceb5
MD
998 " } extended;\n"
999 " } v;\n"
1000 "} align(%u);\n"
1001 "\n"
1002 "struct event_header_large {\n"
1003 " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
1004 " variant <id> {\n"
1005 " struct {\n"
28b12049 1006 " uint32_clock_monotonic_t timestamp;\n"
8020ceb5
MD
1007 " } compact;\n"
1008 " struct {\n"
1009 " uint32_t id;\n"
28b12049 1010 " uint64_clock_monotonic_t timestamp;\n"
8020ceb5
MD
1011 " } extended;\n"
1012 " } v;\n"
1013 "} align(%u);\n\n",
1dbfff0c
MD
1014 lttng_alignof(uint32_t) * CHAR_BIT,
1015 lttng_alignof(uint16_t) * CHAR_BIT
8020ceb5
MD
1016 );
1017}
1018
28b12049
MD
1019/*
1020 * Approximation of NTP time of day to clock monotonic correlation,
1021 * taken at start of trace.
1022 * Yes, this is only an approximation. Yes, we can (and will) do better
1023 * in future versions.
1024 */
1025static
1026uint64_t measure_clock_offset(void)
1027{
1028 uint64_t offset, monotonic[2], realtime;
1029 struct timespec rts = { 0, 0 };
1030 int ret;
1031
1032 monotonic[0] = trace_clock_read64();
1033 ret = clock_gettime(CLOCK_REALTIME, &rts);
1034 if (ret < 0)
1035 return 0;
1036 monotonic[1] = trace_clock_read64();
1037 offset = (monotonic[0] + monotonic[1]) >> 1;
17ec046a 1038 realtime = (uint64_t) rts.tv_sec * 1000000000ULL;
28b12049
MD
1039 realtime += rts.tv_nsec;
1040 offset = realtime - offset;
1041 return offset;
1042}
1043
8020ceb5
MD
1044/*
1045 * Output metadata into this session's metadata buffers.
1046 */
1047static
7dd08bec 1048int _lttng_session_metadata_statedump(struct lttng_session *session)
8020ceb5 1049{
74d81a6c 1050 unsigned char *uuid_c;
19d8b1b3
MD
1051 char uuid_s[LTTNG_UST_UUID_STR_LEN],
1052 clock_uuid_s[LTTNG_UST_UUID_STR_LEN];
7dd08bec
MD
1053 struct lttng_channel *chan;
1054 struct lttng_event *event;
8020ceb5 1055 int ret = 0;
08114193 1056 char procname[LTTNG_UST_PROCNAME_LEN] = "";
9e4d42a0 1057 char hostname[HOST_NAME_MAX];
8020ceb5 1058
b5234c06 1059 if (!CMM_ACCESS_ONCE(session->active))
8020ceb5
MD
1060 return 0;
1061 if (session->metadata_dumped)
1062 goto skip_session;
1063 if (!session->metadata) {
b5234c06 1064 DBG("LTTng: attempt to start tracing, but metadata channel is not found. Operation abort.\n");
8020ceb5
MD
1065 return -EPERM;
1066 }
74d81a6c 1067 uuid_c = session->metadata->uuid;
8020ceb5
MD
1068
1069 snprintf(uuid_s, sizeof(uuid_s),
1070 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
1071 uuid_c[0], uuid_c[1], uuid_c[2], uuid_c[3],
1072 uuid_c[4], uuid_c[5], uuid_c[6], uuid_c[7],
1073 uuid_c[8], uuid_c[9], uuid_c[10], uuid_c[11],
1074 uuid_c[12], uuid_c[13], uuid_c[14], uuid_c[15]);
1075
1076 ret = lttng_metadata_printf(session,
1077 "typealias integer { size = 8; align = %u; signed = false; } := uint8_t;\n"
1078 "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n"
1079 "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n"
1080 "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n"
18fc8d71 1081 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
8020ceb5
MD
1082 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
1083 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
1084 "\n"
1085 "trace {\n"
1086 " major = %u;\n"
1087 " minor = %u;\n"
1088 " uuid = \"%s\";\n"
1089 " byte_order = %s;\n"
1090 " packet.header := struct {\n"
1091 " uint32_t magic;\n"
1092 " uint8_t uuid[16];\n"
1093 " uint32_t stream_id;\n"
1094 " };\n"
1095 "};\n\n",
1dbfff0c
MD
1096 lttng_alignof(uint8_t) * CHAR_BIT,
1097 lttng_alignof(uint16_t) * CHAR_BIT,
1098 lttng_alignof(uint32_t) * CHAR_BIT,
1099 lttng_alignof(uint64_t) * CHAR_BIT,
18fc8d71
MD
1100 sizeof(unsigned long) * CHAR_BIT,
1101 lttng_alignof(unsigned long) * CHAR_BIT,
2694975d
MD
1102 CTF_SPEC_MAJOR,
1103 CTF_SPEC_MINOR,
8020ceb5 1104 uuid_s,
8a98a75d 1105#if (BYTE_ORDER == BIG_ENDIAN)
8020ceb5
MD
1106 "be"
1107#else
1108 "le"
1109#endif
1110 );
1111 if (ret)
1112 goto end;
1113
b020e504 1114 /* ignore error, just use empty string if error. */
9e4d42a0
MD
1115 hostname[0] = '\0';
1116 ret = gethostname(hostname, sizeof(hostname));
1117 if (ret && errno == ENAMETOOLONG)
1118 hostname[HOST_NAME_MAX - 1] = '\0';
08114193
MD
1119 lttng_ust_getprocname(procname);
1120 procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
b020e504
MD
1121 ret = lttng_metadata_printf(session,
1122 "env {\n"
9e4d42a0 1123 " hostname = \"%s\";\n"
b020e504
MD
1124 " vpid = %d;\n"
1125 " procname = \"%s\";\n"
2694975d
MD
1126 " domain = \"ust\";\n"
1127 " tracer_name = \"lttng-ust\";\n"
1128 " tracer_major = %u;\n"
1129 " tracer_minor = %u;\n"
1130 " tracer_patchlevel = %u;\n"
b020e504 1131 "};\n\n",
9e4d42a0 1132 hostname,
b020e504
MD
1133 (int) getpid(),
1134 procname,
2694975d
MD
1135 LTTNG_UST_MAJOR_VERSION,
1136 LTTNG_UST_MINOR_VERSION,
1137 LTTNG_UST_PATCHLEVEL_VERSION
b020e504
MD
1138 );
1139 if (ret)
1140 goto end;
1141
28b12049
MD
1142 ret = lttng_metadata_printf(session,
1143 "clock {\n"
939950af
MD
1144 " name = %s;\n",
1145 "monotonic"
1146 );
1147 if (ret)
1148 goto end;
1149
1150 if (!trace_clock_uuid(clock_uuid_s)) {
1151 ret = lttng_metadata_printf(session,
1152 " uuid = \"%s\";\n",
1153 clock_uuid_s
1154 );
1155 if (ret)
1156 goto end;
1157 }
1158
1159 ret = lttng_metadata_printf(session,
28b12049
MD
1160 " description = \"Monotonic Clock\";\n"
1161 " freq = %" PRIu64 "; /* Frequency, in Hz */\n"
1162 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
1163 " offset = %" PRIu64 ";\n"
1164 "};\n\n",
28b12049
MD
1165 trace_clock_freq(),
1166 measure_clock_offset()
1167 );
1168 if (ret)
1169 goto end;
1170
1171 ret = lttng_metadata_printf(session,
1172 "typealias integer {\n"
1173 " size = 27; align = 1; signed = false;\n"
1174 " map = clock.monotonic.value;\n"
1175 "} := uint27_clock_monotonic_t;\n"
1176 "\n"
1177 "typealias integer {\n"
1178 " size = 32; align = %u; signed = false;\n"
1179 " map = clock.monotonic.value;\n"
1180 "} := uint32_clock_monotonic_t;\n"
1181 "\n"
1182 "typealias integer {\n"
1183 " size = 64; align = %u; signed = false;\n"
1184 " map = clock.monotonic.value;\n"
1185 "} := uint64_clock_monotonic_t;\n\n",
1186 lttng_alignof(uint32_t) * CHAR_BIT,
1187 lttng_alignof(uint64_t) * CHAR_BIT
1188 );
1189 if (ret)
1190 goto end;
1191
7dd08bec 1192 ret = _lttng_stream_packet_context_declare(session);
8020ceb5
MD
1193 if (ret)
1194 goto end;
1195
7dd08bec 1196 ret = _lttng_event_header_declare(session);
8020ceb5
MD
1197 if (ret)
1198 goto end;
1199
1200skip_session:
e58095ef 1201 cds_list_for_each_entry(chan, &session->chan_head, node) {
7dd08bec 1202 ret = _lttng_channel_metadata_statedump(session, chan);
8020ceb5
MD
1203 if (ret)
1204 goto end;
1205 }
1206
e58095ef 1207 cds_list_for_each_entry(event, &session->events_head, node) {
7dd08bec 1208 ret = _lttng_event_metadata_statedump(session, event->chan, event);
8020ceb5
MD
1209 if (ret)
1210 goto end;
1211 }
1212 session->metadata_dumped = 1;
1213end:
1214 return ret;
1215}
1216
003fedf4 1217void lttng_ust_events_exit(void)
8020ceb5 1218{
7dd08bec 1219 struct lttng_session *session, *tmpsession;
8020ceb5 1220
e58095ef 1221 cds_list_for_each_entry_safe(session, tmpsession, &sessions, node)
7dd08bec 1222 lttng_session_destroy(session);
8020ceb5 1223}
457a6b58 1224
e58095ef
MD
1225/*
1226 * Enabler management.
1227 */
1228struct lttng_enabler *lttng_enabler_create(enum lttng_enabler_type type,
1229 struct lttng_ust_event *event_param,
1230 struct lttng_channel *chan)
457a6b58 1231{
e58095ef
MD
1232 struct lttng_enabler *enabler;
1233
1234 enabler = zmalloc(sizeof(*enabler));
1235 if (!enabler)
1236 return NULL;
1237 enabler->type = type;
1238 CDS_INIT_LIST_HEAD(&enabler->filter_bytecode_head);
1239 memcpy(&enabler->event_param, event_param,
1240 sizeof(enabler->event_param));
1241 enabler->chan = chan;
1242 /* ctx left NULL */
1243 enabler->enabled = 1;
1244 cds_list_add(&enabler->node, &enabler->chan->session->enablers_head);
1245 lttng_session_lazy_sync_enablers(enabler->chan->session);
1246 return enabler;
457a6b58
MD
1247}
1248
e58095ef 1249int lttng_enabler_enable(struct lttng_enabler *enabler)
457a6b58 1250{
e58095ef
MD
1251 enabler->enabled = 1;
1252 lttng_session_lazy_sync_enablers(enabler->chan->session);
1253 return 0;
457a6b58 1254}
457a6b58 1255
e58095ef 1256int lttng_enabler_disable(struct lttng_enabler *enabler)
457a6b58 1257{
e58095ef
MD
1258 if (enabler->chan == enabler->chan->session->metadata)
1259 return -EPERM;
1260 enabler->enabled = 0;
1261 lttng_session_lazy_sync_enablers(enabler->chan->session);
1262 return 0;
1263}
457a6b58 1264
e58095ef
MD
1265int lttng_enabler_attach_bytecode(struct lttng_enabler *enabler,
1266 struct lttng_ust_filter_bytecode_node *bytecode)
1267{
1268 bytecode->enabler = enabler;
1269 cds_list_add_tail(&bytecode->node, &enabler->filter_bytecode_head);
1270 lttng_session_lazy_sync_enablers(enabler->chan->session);
1271 return 0;
1272}
f488575f 1273
e58095ef
MD
1274int lttng_attach_context(struct lttng_ust_context *context_param,
1275 struct lttng_ctx **ctx, struct lttng_session *session)
1276{
457a6b58 1277 /*
e58095ef
MD
1278 * We cannot attach a context after trace has been started for a
1279 * session because the metadata does not allow expressing this
1280 * information outside of the original channel scope.
457a6b58 1281 */
e58095ef
MD
1282 if (session->been_active)
1283 return -EPERM;
457a6b58 1284
e58095ef
MD
1285 switch (context_param->ctx) {
1286 case LTTNG_UST_CONTEXT_PTHREAD_ID:
1287 return lttng_add_pthread_id_to_ctx(ctx);
1288 case LTTNG_UST_CONTEXT_VTID:
1289 return lttng_add_vtid_to_ctx(ctx);
1290 case LTTNG_UST_CONTEXT_VPID:
1291 return lttng_add_vpid_to_ctx(ctx);
1292 case LTTNG_UST_CONTEXT_PROCNAME:
1293 return lttng_add_procname_to_ctx(ctx);
1294 default:
1295 return -EINVAL;
457a6b58 1296 }
457a6b58
MD
1297}
1298
e58095ef
MD
1299int lttng_enabler_attach_context(struct lttng_enabler *enabler,
1300 struct lttng_ust_context *context_param)
457a6b58 1301{
e58095ef
MD
1302#if 0 // disabled for now.
1303 struct lttng_session *session = enabler->chan->session;
1304 int ret;
457a6b58 1305
e58095ef
MD
1306 ret = lttng_attach_context(context_param, &enabler->ctx,
1307 session);
1308 if (ret)
1309 return ret;
1310 lttng_session_lazy_sync_enablers(enabler->chan->session);
1311#endif
1312 return -ENOSYS;
457a6b58
MD
1313}
1314
e58095ef
MD
1315static
1316void lttng_enabler_destroy(struct lttng_enabler *enabler)
457a6b58 1317{
e58095ef 1318 struct lttng_ust_filter_bytecode_node *filter_node, *tmp_filter_node;
457a6b58 1319
e58095ef
MD
1320 /* Destroy filter bytecode */
1321 cds_list_for_each_entry_safe(filter_node, tmp_filter_node,
1322 &enabler->filter_bytecode_head, node) {
1323 free(filter_node);
457a6b58 1324 }
e58095ef
MD
1325
1326 /* Destroy contexts */
1327 lttng_destroy_context(enabler->ctx);
1328
1329 cds_list_del(&enabler->node);
1330 free(enabler);
457a6b58
MD
1331}
1332
e58095ef
MD
1333/*
1334 * lttng_session_sync_enablers should be called just before starting a
1335 * session.
1336 */
457a6b58 1337static
e58095ef 1338void lttng_session_sync_enablers(struct lttng_session *session)
457a6b58 1339{
e58095ef
MD
1340 struct lttng_enabler *enabler;
1341 struct lttng_event *event;
457a6b58 1342
e58095ef
MD
1343 cds_list_for_each_entry(enabler, &session->enablers_head, node)
1344 lttng_enabler_ref_events(enabler);
1345 /*
1346 * For each event, if at least one of its enablers is enabled,
1347 * we enable the event, else we disable it.
1348 */
1349 cds_list_for_each_entry(event, &session->events_head, node) {
1350 struct lttng_enabler_ref *enabler_ref;
1351 struct lttng_bytecode_runtime *runtime;
dcdeaff0 1352 int enabled = 0, has_enablers_without_bytecode = 0;
e58095ef
MD
1353
1354 /* Enable events */
1355 cds_list_for_each_entry(enabler_ref,
1356 &event->enablers_ref_head, node) {
1357 if (enabler_ref->ref->enabled) {
1358 enabled = 1;
1359 break;
1360 }
1361 }
1362 event->enabled = enabled;
457a6b58 1363
1f49fc05 1364 /* Check if has enablers without bytecode enabled */
dcdeaff0
MD
1365 cds_list_for_each_entry(enabler_ref,
1366 &event->enablers_ref_head, node) {
1f49fc05
MD
1367 if (enabler_ref->ref->enabled
1368 && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) {
dcdeaff0
MD
1369 has_enablers_without_bytecode = 1;
1370 break;
1371 }
1372 }
1373 event->has_enablers_without_bytecode =
1374 has_enablers_without_bytecode;
1375
e58095ef
MD
1376 /* Enable filters */
1377 cds_list_for_each_entry(runtime,
1378 &event->bytecode_runtime_head, node) {
1379 lttng_filter_sync_state(runtime);
457a6b58
MD
1380 }
1381 }
457a6b58
MD
1382}
1383
e58095ef
MD
1384/*
1385 * Apply enablers to session events, adding events to session if need
1386 * be. It is required after each modification applied to an active
1387 * session, and right before session "start".
1388 * "lazy" sync means we only sync if required.
1389 */
1390static
1391void lttng_session_lazy_sync_enablers(struct lttng_session *session)
457a6b58 1392{
e58095ef
MD
1393 /* We can skip if session is not active */
1394 if (!session->active)
1395 return;
1396 lttng_session_sync_enablers(session);
457a6b58 1397}
This page took 0.111597 seconds and 4 git commands to generate.