Refactoring: Channel structures
[lttng-ust.git] / liblttng-ust / lttng-events.c
1 /*
2 * SPDX-License-Identifier: LGPL-2.1-only
3 *
4 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 *
6 * Holds LTTng per-session event registry.
7 */
8
9 #define _LGPL_SOURCE
10 #include <stdio.h>
11 #include <assert.h>
12 #include <errno.h>
13 #include <limits.h>
14 #include <pthread.h>
15 #include <sys/shm.h>
16 #include <sys/ipc.h>
17 #include <stdint.h>
18 #include <stddef.h>
19 #include <inttypes.h>
20 #include <time.h>
21 #include <stdbool.h>
22 #include <unistd.h>
23 #include <dlfcn.h>
24 #include <lttng/ust-endian.h>
25
26 #include <urcu/arch.h>
27 #include <urcu/compiler.h>
28 #include <urcu/hlist.h>
29 #include <urcu/list.h>
30 #include <urcu/uatomic.h>
31
32 #include <lttng/tracepoint.h>
33 #include <lttng/ust-events.h>
34
35 #include <usterr-signal-safe.h>
36 #include <ust-helper.h>
37 #include <lttng/ust-ctl.h>
38 #include <ust-comm.h>
39 #include <ust-fd.h>
40 #include <ust-dynamic-type.h>
41 #include <ust-context-provider.h>
42 #include "error.h"
43 #include "compat.h"
44 #include "lttng-ust-uuid.h"
45
46 #include "tracepoint-internal.h"
47 #include "string-utils.h"
48 #include "lttng-bytecode.h"
49 #include "lttng-tracer.h"
50 #include "lttng-tracer-core.h"
51 #include "lttng-ust-statedump.h"
52 #include "context-internal.h"
53 #include "ust-events-internal.h"
54 #include "wait.h"
55 #include "../libringbuffer/shm.h"
56 #include "../libcounter/counter.h"
57 #include "jhash.h"
58 #include <lttng/ust-abi.h>
59
60 /*
61 * All operations within this file are called by the communication
62 * thread, under ust_lock protection.
63 */
64
65 static CDS_LIST_HEAD(sessions);
66 static CDS_LIST_HEAD(event_notifier_groups);
67
68 struct cds_list_head *lttng_get_sessions(void)
69 {
70 return &sessions;
71 }
72
73 static void _lttng_event_destroy(struct lttng_ust_event_common *event);
74 static void _lttng_enum_destroy(struct lttng_enum *_enum);
75
76 static
77 void lttng_session_lazy_sync_event_enablers(struct lttng_ust_session *session);
78 static
79 void lttng_session_sync_event_enablers(struct lttng_ust_session *session);
80 static
81 void lttng_event_notifier_group_sync_enablers(
82 struct lttng_event_notifier_group *event_notifier_group);
83 static
84 void lttng_enabler_destroy(struct lttng_enabler *enabler);
85
86 /*
87 * Called with ust lock held.
88 */
89 int lttng_session_active(void)
90 {
91 struct lttng_ust_session_private *iter;
92
93 cds_list_for_each_entry(iter, &sessions, node) {
94 if (iter->pub->active)
95 return 1;
96 }
97 return 0;
98 }
99
100 static
101 int lttng_loglevel_match(int loglevel,
102 unsigned int has_loglevel,
103 enum lttng_ust_abi_loglevel_type req_type,
104 int req_loglevel)
105 {
106 if (!has_loglevel)
107 loglevel = TRACE_DEFAULT;
108 switch (req_type) {
109 case LTTNG_UST_ABI_LOGLEVEL_RANGE:
110 if (loglevel <= req_loglevel
111 || (req_loglevel == -1 && loglevel <= TRACE_DEBUG))
112 return 1;
113 else
114 return 0;
115 case LTTNG_UST_ABI_LOGLEVEL_SINGLE:
116 if (loglevel == req_loglevel
117 || (req_loglevel == -1 && loglevel <= TRACE_DEBUG))
118 return 1;
119 else
120 return 0;
121 case LTTNG_UST_ABI_LOGLEVEL_ALL:
122 default:
123 if (loglevel <= TRACE_DEBUG)
124 return 1;
125 else
126 return 0;
127 }
128 }
129
130 struct lttng_ust_session *lttng_session_create(void)
131 {
132 struct lttng_ust_session *session;
133 struct lttng_ust_session_private *session_priv;
134 int i;
135
136 session = zmalloc(sizeof(struct lttng_ust_session));
137 if (!session)
138 return NULL;
139 session->struct_size = sizeof(struct lttng_ust_session);
140 session_priv = zmalloc(sizeof(struct lttng_ust_session_private));
141 if (!session_priv) {
142 free(session);
143 return NULL;
144 }
145 session->priv = session_priv;
146 session_priv->pub = session;
147 if (lttng_context_init_all(&session->priv->ctx)) {
148 free(session_priv);
149 free(session);
150 return NULL;
151 }
152 CDS_INIT_LIST_HEAD(&session->priv->chan_head);
153 CDS_INIT_LIST_HEAD(&session->priv->events_head);
154 CDS_INIT_LIST_HEAD(&session->priv->enums_head);
155 CDS_INIT_LIST_HEAD(&session->priv->enablers_head);
156 for (i = 0; i < LTTNG_UST_EVENT_HT_SIZE; i++)
157 CDS_INIT_HLIST_HEAD(&session->priv->events_ht.table[i]);
158 for (i = 0; i < LTTNG_UST_ENUM_HT_SIZE; i++)
159 CDS_INIT_HLIST_HEAD(&session->priv->enums_ht.table[i]);
160 cds_list_add(&session->priv->node, &sessions);
161 return session;
162 }
163
164 struct lttng_counter *lttng_ust_counter_create(
165 const char *counter_transport_name,
166 size_t number_dimensions, const struct lttng_counter_dimension *dimensions)
167 {
168 struct lttng_counter_transport *counter_transport = NULL;
169 struct lttng_counter *counter = NULL;
170
171 counter_transport = lttng_counter_transport_find(counter_transport_name);
172 if (!counter_transport)
173 goto notransport;
174 counter = zmalloc(sizeof(struct lttng_counter));
175 if (!counter)
176 goto nomem;
177
178 counter->ops = &counter_transport->ops;
179 counter->transport = counter_transport;
180
181 counter->counter = counter->ops->counter_create(
182 number_dimensions, dimensions, 0,
183 -1, 0, NULL, false);
184 if (!counter->counter) {
185 goto create_error;
186 }
187
188 return counter;
189
190 create_error:
191 free(counter);
192 nomem:
193 notransport:
194 return NULL;
195 }
196
197 static
198 void lttng_ust_counter_destroy(struct lttng_counter *counter)
199 {
200 counter->ops->counter_destroy(counter->counter);
201 free(counter);
202 }
203
204 struct lttng_event_notifier_group *lttng_event_notifier_group_create(void)
205 {
206 struct lttng_event_notifier_group *event_notifier_group;
207 int i;
208
209 event_notifier_group = zmalloc(sizeof(struct lttng_event_notifier_group));
210 if (!event_notifier_group)
211 return NULL;
212
213 /* Add all contexts. */
214 if (lttng_context_init_all(&event_notifier_group->ctx)) {
215 free(event_notifier_group);
216 return NULL;
217 }
218
219 CDS_INIT_LIST_HEAD(&event_notifier_group->enablers_head);
220 CDS_INIT_LIST_HEAD(&event_notifier_group->event_notifiers_head);
221 for (i = 0; i < LTTNG_UST_EVENT_NOTIFIER_HT_SIZE; i++)
222 CDS_INIT_HLIST_HEAD(&event_notifier_group->event_notifiers_ht.table[i]);
223
224 cds_list_add(&event_notifier_group->node, &event_notifier_groups);
225
226 return event_notifier_group;
227 }
228
229 /*
230 * Only used internally at session destruction.
231 */
232 static
233 void _lttng_channel_unmap(struct lttng_ust_channel_buffer *lttng_chan)
234 {
235 struct lttng_ust_lib_ring_buffer_channel *chan;
236 struct lttng_ust_shm_handle *handle;
237
238 cds_list_del(&lttng_chan->priv->node);
239 lttng_destroy_context(lttng_chan->ctx);
240 chan = lttng_chan->chan;
241 handle = lttng_chan->handle;
242 channel_destroy(chan, handle, 0);
243 free(lttng_chan->parent);
244 free(lttng_chan->priv);
245 free(lttng_chan);
246 }
247
248 static
249 void register_event(struct lttng_ust_event_common *event)
250 {
251 int ret;
252 struct lttng_ust_event_desc *desc;
253
254 assert(event->priv->registered == 0);
255 desc = event->priv->desc;
256 ret = lttng_ust_tp_probe_register_queue_release(desc->name,
257 desc->probe_callback,
258 event, desc->signature);
259 WARN_ON_ONCE(ret);
260 if (!ret)
261 event->priv->registered = 1;
262 }
263
264 static
265 void unregister_event(struct lttng_ust_event_common *event)
266 {
267 int ret;
268 struct lttng_ust_event_desc *desc;
269
270 assert(event->priv->registered == 1);
271 desc = event->priv->desc;
272 ret = lttng_ust_tp_probe_unregister_queue_release(desc->name,
273 desc->probe_callback,
274 event);
275 WARN_ON_ONCE(ret);
276 if (!ret)
277 event->priv->registered = 0;
278 }
279
280 static
281 void _lttng_event_unregister(struct lttng_ust_event_common *event)
282 {
283 if (event->priv->registered)
284 unregister_event(event);
285 }
286
287 void lttng_session_destroy(struct lttng_ust_session *session)
288 {
289 struct lttng_ust_channel_buffer_private *chan, *tmpchan;
290 struct lttng_ust_event_recorder_private *event_recorder_priv, *tmpevent_recorder_priv;
291 struct lttng_enum *_enum, *tmp_enum;
292 struct lttng_event_enabler *event_enabler, *event_tmpenabler;
293
294 CMM_ACCESS_ONCE(session->active) = 0;
295 cds_list_for_each_entry(event_recorder_priv, &session->priv->events_head, node) {
296 _lttng_event_unregister(event_recorder_priv->parent.pub);
297 }
298 lttng_ust_urcu_synchronize_rcu(); /* Wait for in-flight events to complete */
299 lttng_ust_tp_probe_prune_release_queue();
300 cds_list_for_each_entry_safe(event_enabler, event_tmpenabler,
301 &session->priv->enablers_head, node)
302 lttng_event_enabler_destroy(event_enabler);
303 cds_list_for_each_entry_safe(event_recorder_priv, tmpevent_recorder_priv,
304 &session->priv->events_head, node)
305 _lttng_event_destroy(event_recorder_priv->parent.pub);
306 cds_list_for_each_entry_safe(_enum, tmp_enum,
307 &session->priv->enums_head, node)
308 _lttng_enum_destroy(_enum);
309 cds_list_for_each_entry_safe(chan, tmpchan, &session->priv->chan_head, node)
310 _lttng_channel_unmap(chan->pub);
311 cds_list_del(&session->priv->node);
312 lttng_destroy_context(session->priv->ctx);
313 free(session->priv);
314 free(session);
315 }
316
317 void lttng_event_notifier_group_destroy(
318 struct lttng_event_notifier_group *event_notifier_group)
319 {
320 int close_ret;
321 struct lttng_event_notifier_enabler *notifier_enabler, *tmpnotifier_enabler;
322 struct lttng_ust_event_notifier_private *event_notifier_priv, *tmpevent_notifier_priv;
323
324 if (!event_notifier_group) {
325 return;
326 }
327
328 cds_list_for_each_entry(event_notifier_priv,
329 &event_notifier_group->event_notifiers_head, node)
330 _lttng_event_unregister(event_notifier_priv->parent.pub);
331
332 lttng_ust_urcu_synchronize_rcu();
333
334 cds_list_for_each_entry_safe(notifier_enabler, tmpnotifier_enabler,
335 &event_notifier_group->enablers_head, node)
336 lttng_event_notifier_enabler_destroy(notifier_enabler);
337
338 cds_list_for_each_entry_safe(event_notifier_priv, tmpevent_notifier_priv,
339 &event_notifier_group->event_notifiers_head, node)
340 _lttng_event_destroy(event_notifier_priv->parent.pub);
341
342 if (event_notifier_group->error_counter)
343 lttng_ust_counter_destroy(event_notifier_group->error_counter);
344
345 /* Close the notification fd to the listener of event_notifiers. */
346
347 lttng_ust_lock_fd_tracker();
348 close_ret = close(event_notifier_group->notification_fd);
349 if (!close_ret) {
350 lttng_ust_delete_fd_from_tracker(
351 event_notifier_group->notification_fd);
352 } else {
353 PERROR("close");
354 abort();
355 }
356 lttng_ust_unlock_fd_tracker();
357
358 cds_list_del(&event_notifier_group->node);
359
360 free(event_notifier_group);
361 }
362
363 static
364 void lttng_enabler_destroy(struct lttng_enabler *enabler)
365 {
366 struct lttng_ust_bytecode_node *filter_node, *tmp_filter_node;
367 struct lttng_ust_excluder_node *excluder_node, *tmp_excluder_node;
368
369 if (!enabler) {
370 return;
371 }
372
373 /* Destroy filter bytecode */
374 cds_list_for_each_entry_safe(filter_node, tmp_filter_node,
375 &enabler->filter_bytecode_head, node) {
376 free(filter_node);
377 }
378
379 /* Destroy excluders */
380 cds_list_for_each_entry_safe(excluder_node, tmp_excluder_node,
381 &enabler->excluder_head, node) {
382 free(excluder_node);
383 }
384 }
385
386 void lttng_event_notifier_enabler_destroy(struct lttng_event_notifier_enabler *event_notifier_enabler)
387 {
388 if (!event_notifier_enabler) {
389 return;
390 }
391
392 cds_list_del(&event_notifier_enabler->node);
393
394 lttng_enabler_destroy(lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
395
396 free(event_notifier_enabler);
397 }
398
399 static
400 int lttng_enum_create(struct lttng_ust_enum_desc *desc,
401 struct lttng_ust_session *session)
402 {
403 const char *enum_name = desc->name;
404 struct lttng_enum *_enum;
405 struct cds_hlist_head *head;
406 int ret = 0;
407 size_t name_len = strlen(enum_name);
408 uint32_t hash;
409 int notify_socket;
410
411 /* Check if this enum is already registered for this session. */
412 hash = jhash(enum_name, name_len, 0);
413 head = &session->priv->enums_ht.table[hash & (LTTNG_UST_ENUM_HT_SIZE - 1)];
414
415 _enum = lttng_ust_enum_get_from_desc(session, desc);
416 if (_enum) {
417 ret = -EEXIST;
418 goto exist;
419 }
420
421 notify_socket = lttng_get_notify_socket(session->priv->owner);
422 if (notify_socket < 0) {
423 ret = notify_socket;
424 goto socket_error;
425 }
426
427 _enum = zmalloc(sizeof(*_enum));
428 if (!_enum) {
429 ret = -ENOMEM;
430 goto cache_error;
431 }
432 _enum->session = session;
433 _enum->desc = desc;
434
435 ret = ustcomm_register_enum(notify_socket,
436 session->priv->objd,
437 enum_name,
438 desc->nr_entries,
439 desc->entries,
440 &_enum->id);
441 if (ret < 0) {
442 DBG("Error (%d) registering enumeration to sessiond", ret);
443 goto sessiond_register_error;
444 }
445 cds_list_add(&_enum->node, &session->priv->enums_head);
446 cds_hlist_add_head(&_enum->hlist, head);
447 return 0;
448
449 sessiond_register_error:
450 free(_enum);
451 cache_error:
452 socket_error:
453 exist:
454 return ret;
455 }
456
457 static
458 int lttng_create_enum_check(struct lttng_ust_type_common *type,
459 struct lttng_ust_session *session)
460 {
461 switch (type->type) {
462 case lttng_ust_type_enum:
463 {
464 struct lttng_ust_enum_desc *enum_desc;
465 int ret;
466
467 enum_desc = lttng_ust_get_type_enum(type)->desc;
468 ret = lttng_enum_create(enum_desc, session);
469 if (ret && ret != -EEXIST) {
470 DBG("Unable to create enum error: (%d)", ret);
471 return ret;
472 }
473 break;
474 }
475 case lttng_ust_type_dynamic:
476 {
477 struct lttng_ust_event_field *tag_field_generic;
478 struct lttng_ust_enum_desc *enum_desc;
479 int ret;
480
481 tag_field_generic = lttng_ust_dynamic_type_tag_field();
482 enum_desc = lttng_ust_get_type_enum(tag_field_generic->type)->desc;
483 ret = lttng_enum_create(enum_desc, session);
484 if (ret && ret != -EEXIST) {
485 DBG("Unable to create enum error: (%d)", ret);
486 return ret;
487 }
488 break;
489 }
490 default:
491 /* TODO: nested types when they become supported. */
492 break;
493 }
494 return 0;
495 }
496
497 static
498 int lttng_create_all_event_enums(size_t nr_fields,
499 struct lttng_ust_event_field **event_fields,
500 struct lttng_ust_session *session)
501 {
502 size_t i;
503 int ret;
504
505 /* For each field, ensure enum is part of the session. */
506 for (i = 0; i < nr_fields; i++) {
507 struct lttng_ust_type_common *type = event_fields[i]->type;
508
509 ret = lttng_create_enum_check(type, session);
510 if (ret)
511 return ret;
512 }
513 return 0;
514 }
515
516 static
517 int lttng_create_all_ctx_enums(size_t nr_fields,
518 struct lttng_ust_ctx_field **ctx_fields,
519 struct lttng_ust_session *session)
520 {
521 size_t i;
522 int ret;
523
524 /* For each field, ensure enum is part of the session. */
525 for (i = 0; i < nr_fields; i++) {
526 struct lttng_ust_type_common *type = ctx_fields[i]->event_field->type;
527
528 ret = lttng_create_enum_check(type, session);
529 if (ret)
530 return ret;
531 }
532 return 0;
533 }
534
535 /*
536 * Ensure that a state-dump will be performed for this session at the end
537 * of the current handle_message().
538 */
539 int lttng_session_statedump(struct lttng_ust_session *session)
540 {
541 session->priv->statedump_pending = 1;
542 lttng_ust_sockinfo_session_enabled(session->priv->owner);
543 return 0;
544 }
545
546 int lttng_session_enable(struct lttng_ust_session *session)
547 {
548 int ret = 0;
549 struct lttng_ust_channel_buffer_private *chan;
550 int notify_socket;
551
552 if (session->active) {
553 ret = -EBUSY;
554 goto end;
555 }
556
557 notify_socket = lttng_get_notify_socket(session->priv->owner);
558 if (notify_socket < 0)
559 return notify_socket;
560
561 /* Set transient enabler state to "enabled" */
562 session->priv->tstate = 1;
563
564 /* We need to sync enablers with session before activation. */
565 lttng_session_sync_event_enablers(session);
566
567 /*
568 * Snapshot the number of events per channel to know the type of header
569 * we need to use.
570 */
571 cds_list_for_each_entry(chan, &session->priv->chan_head, node) {
572 struct lttng_ust_ctx *ctx;
573 struct lttng_ust_ctx_field **fields = NULL;
574 size_t nr_fields = 0;
575 uint32_t chan_id;
576
577 /* don't change it if session stop/restart */
578 if (chan->header_type)
579 continue;
580 ctx = chan->pub->ctx;
581 if (ctx) {
582 nr_fields = ctx->nr_fields;
583 fields = ctx->fields;
584 ret = lttng_create_all_ctx_enums(nr_fields, fields,
585 session);
586 if (ret < 0) {
587 DBG("Error (%d) adding enum to session", ret);
588 return ret;
589 }
590 }
591 ret = ustcomm_register_channel(notify_socket,
592 session,
593 session->priv->objd,
594 chan->parent.objd,
595 nr_fields,
596 fields,
597 &chan_id,
598 &chan->header_type);
599 if (ret) {
600 DBG("Error (%d) registering channel to sessiond", ret);
601 return ret;
602 }
603 if (chan_id != chan->id) {
604 DBG("Error: channel registration id (%u) does not match id assigned at creation (%u)",
605 chan_id, chan->id);
606 return -EINVAL;
607 }
608 }
609
610 /* Set atomically the state to "active" */
611 CMM_ACCESS_ONCE(session->active) = 1;
612 CMM_ACCESS_ONCE(session->priv->been_active) = 1;
613
614 ret = lttng_session_statedump(session);
615 if (ret)
616 return ret;
617 end:
618 return ret;
619 }
620
621 int lttng_session_disable(struct lttng_ust_session *session)
622 {
623 int ret = 0;
624
625 if (!session->active) {
626 ret = -EBUSY;
627 goto end;
628 }
629 /* Set atomically the state to "inactive" */
630 CMM_ACCESS_ONCE(session->active) = 0;
631
632 /* Set transient enabler state to "disabled" */
633 session->priv->tstate = 0;
634 lttng_session_sync_event_enablers(session);
635 end:
636 return ret;
637 }
638
639 int lttng_channel_enable(struct lttng_ust_channel_common *lttng_channel)
640 {
641 int ret = 0;
642
643 if (lttng_channel->enabled) {
644 ret = -EBUSY;
645 goto end;
646 }
647 /* Set transient enabler state to "enabled" */
648 lttng_channel->priv->tstate = 1;
649 lttng_session_sync_event_enablers(lttng_channel->session);
650 /* Set atomically the state to "enabled" */
651 CMM_ACCESS_ONCE(lttng_channel->enabled) = 1;
652 end:
653 return ret;
654 }
655
656 int lttng_channel_disable(struct lttng_ust_channel_common *lttng_channel)
657 {
658 int ret = 0;
659
660 if (!lttng_channel->enabled) {
661 ret = -EBUSY;
662 goto end;
663 }
664 /* Set atomically the state to "disabled" */
665 CMM_ACCESS_ONCE(lttng_channel->enabled) = 0;
666 /* Set transient enabler state to "enabled" */
667 lttng_channel->priv->tstate = 0;
668 lttng_session_sync_event_enablers(lttng_channel->session);
669 end:
670 return ret;
671 }
672
673 static inline
674 struct cds_hlist_head *borrow_hash_table_bucket(
675 struct cds_hlist_head *hash_table,
676 unsigned int hash_table_size,
677 struct lttng_ust_event_desc *desc)
678 {
679 const char *event_name;
680 size_t name_len;
681 uint32_t hash;
682
683 event_name = desc->name;
684 name_len = strlen(event_name);
685
686 hash = jhash(event_name, name_len, 0);
687 return &hash_table[hash & (hash_table_size - 1)];
688 }
689
690 /*
691 * Supports event creation while tracing session is active.
692 */
693 static
694 int lttng_event_recorder_create(struct lttng_ust_event_desc *desc,
695 struct lttng_ust_channel_buffer *chan)
696 {
697 struct lttng_ust_event_recorder *event_recorder;
698 struct lttng_ust_event_recorder_private *event_recorder_priv;
699 struct lttng_ust_session *session = chan->parent->session;
700 struct cds_hlist_head *head;
701 int ret = 0;
702 int notify_socket, loglevel;
703 const char *uri;
704
705 head = borrow_hash_table_bucket(chan->parent->session->priv->events_ht.table,
706 LTTNG_UST_EVENT_HT_SIZE, desc);
707
708 notify_socket = lttng_get_notify_socket(session->priv->owner);
709 if (notify_socket < 0) {
710 ret = notify_socket;
711 goto socket_error;
712 }
713
714 ret = lttng_create_all_event_enums(desc->nr_fields, desc->fields,
715 session);
716 if (ret < 0) {
717 DBG("Error (%d) adding enum to session", ret);
718 goto create_enum_error;
719 }
720
721 /*
722 * Check if loglevel match. Refuse to connect event if not.
723 */
724 event_recorder = zmalloc(sizeof(struct lttng_ust_event_recorder));
725 if (!event_recorder) {
726 ret = -ENOMEM;
727 goto cache_error;
728 }
729 event_recorder->struct_size = sizeof(struct lttng_ust_event_recorder);
730
731 event_recorder->parent = zmalloc(sizeof(struct lttng_ust_event_common));
732 if (!event_recorder->parent) {
733 ret = -ENOMEM;
734 goto parent_error;
735 }
736 event_recorder->parent->struct_size = sizeof(struct lttng_ust_event_common);
737 event_recorder->parent->type = LTTNG_UST_EVENT_TYPE_RECORDER;
738 event_recorder->parent->child = event_recorder;
739
740 event_recorder_priv = zmalloc(sizeof(struct lttng_ust_event_recorder_private));
741 if (!event_recorder_priv) {
742 ret = -ENOMEM;
743 goto priv_error;
744 }
745 event_recorder->priv = event_recorder_priv;
746 event_recorder_priv->pub = event_recorder;
747 event_recorder->parent->priv = &event_recorder_priv->parent;
748 event_recorder_priv->parent.pub = event_recorder->parent;
749
750 event_recorder->chan = chan;
751
752 /* Event will be enabled by enabler sync. */
753 event_recorder->parent->enabled = 0;
754 event_recorder->parent->priv->registered = 0;
755 CDS_INIT_LIST_HEAD(&event_recorder->parent->filter_bytecode_runtime_head);
756 CDS_INIT_LIST_HEAD(&event_recorder->parent->priv->enablers_ref_head);
757 event_recorder->parent->priv->desc = desc;
758
759 if (desc->loglevel)
760 loglevel = *(*event_recorder->parent->priv->desc->loglevel);
761 else
762 loglevel = TRACE_DEFAULT;
763 if (desc->model_emf_uri)
764 uri = *(desc->model_emf_uri);
765 else
766 uri = NULL;
767
768 /* Fetch event ID from sessiond */
769 ret = ustcomm_register_event(notify_socket,
770 session,
771 session->priv->objd,
772 chan->priv->parent.objd,
773 desc->name,
774 loglevel,
775 desc->signature,
776 desc->nr_fields,
777 desc->fields,
778 uri,
779 &event_recorder->id);
780 if (ret < 0) {
781 DBG("Error (%d) registering event to sessiond", ret);
782 goto sessiond_register_error;
783 }
784
785 cds_list_add(&event_recorder_priv->node, &chan->parent->session->priv->events_head);
786 cds_hlist_add_head(&event_recorder_priv->hlist, head);
787 return 0;
788
789 sessiond_register_error:
790 free(event_recorder_priv);
791 priv_error:
792 free(event_recorder->parent);
793 parent_error:
794 free(event_recorder);
795 cache_error:
796 create_enum_error:
797 socket_error:
798 return ret;
799 }
800
801 static
802 int lttng_event_notifier_create(struct lttng_ust_event_desc *desc,
803 uint64_t token, uint64_t error_counter_index,
804 struct lttng_event_notifier_group *event_notifier_group)
805 {
806 struct lttng_ust_event_notifier *event_notifier;
807 struct lttng_ust_event_notifier_private *event_notifier_priv;
808 struct cds_hlist_head *head;
809 int ret = 0;
810
811 /*
812 * Get the hashtable bucket the created lttng_event_notifier object
813 * should be inserted.
814 */
815 head = borrow_hash_table_bucket(
816 event_notifier_group->event_notifiers_ht.table,
817 LTTNG_UST_EVENT_NOTIFIER_HT_SIZE, desc);
818
819 event_notifier = zmalloc(sizeof(struct lttng_ust_event_notifier));
820 if (!event_notifier) {
821 ret = -ENOMEM;
822 goto error;
823 }
824 event_notifier->struct_size = sizeof(struct lttng_ust_event_notifier);
825
826 event_notifier->parent = zmalloc(sizeof(struct lttng_ust_event_common));
827 if (!event_notifier->parent) {
828 ret = -ENOMEM;
829 goto parent_error;
830 }
831 event_notifier->parent->struct_size = sizeof(struct lttng_ust_event_common);
832 event_notifier->parent->type = LTTNG_UST_EVENT_TYPE_NOTIFIER;
833 event_notifier->parent->child = event_notifier;
834
835 event_notifier_priv = zmalloc(sizeof(struct lttng_ust_event_notifier_private));
836 if (!event_notifier_priv) {
837 ret = -ENOMEM;
838 goto priv_error;
839 }
840 event_notifier->priv = event_notifier_priv;
841 event_notifier_priv->pub = event_notifier;
842 event_notifier->parent->priv = &event_notifier_priv->parent;
843 event_notifier_priv->parent.pub = event_notifier->parent;
844
845 event_notifier_priv->group = event_notifier_group;
846 event_notifier_priv->parent.user_token = token;
847 event_notifier_priv->error_counter_index = error_counter_index;
848
849 /* Event notifier will be enabled by enabler sync. */
850 event_notifier->parent->enabled = 0;
851 event_notifier_priv->parent.registered = 0;
852
853 CDS_INIT_LIST_HEAD(&event_notifier->parent->filter_bytecode_runtime_head);
854 CDS_INIT_LIST_HEAD(&event_notifier->capture_bytecode_runtime_head);
855 CDS_INIT_LIST_HEAD(&event_notifier_priv->parent.enablers_ref_head);
856 event_notifier_priv->parent.desc = desc;
857 event_notifier->notification_send = lttng_event_notifier_notification_send;
858
859 cds_list_add(&event_notifier_priv->node,
860 &event_notifier_group->event_notifiers_head);
861 cds_hlist_add_head(&event_notifier_priv->hlist, head);
862
863 return 0;
864
865 priv_error:
866 free(event_notifier->parent);
867 parent_error:
868 free(event_notifier);
869 error:
870 return ret;
871 }
872
873 static
874 int lttng_desc_match_star_glob_enabler(struct lttng_ust_event_desc *desc,
875 struct lttng_enabler *enabler)
876 {
877 int loglevel = 0;
878 unsigned int has_loglevel = 0;
879
880 assert(enabler->format_type == LTTNG_ENABLER_FORMAT_STAR_GLOB);
881 if (!strutils_star_glob_match(enabler->event_param.name, SIZE_MAX,
882 desc->name, SIZE_MAX))
883 return 0;
884 if (desc->loglevel) {
885 loglevel = *(*desc->loglevel);
886 has_loglevel = 1;
887 }
888 if (!lttng_loglevel_match(loglevel,
889 has_loglevel,
890 enabler->event_param.loglevel_type,
891 enabler->event_param.loglevel))
892 return 0;
893 return 1;
894 }
895
896 static
897 int lttng_desc_match_event_enabler(struct lttng_ust_event_desc *desc,
898 struct lttng_enabler *enabler)
899 {
900 int loglevel = 0;
901 unsigned int has_loglevel = 0;
902
903 assert(enabler->format_type == LTTNG_ENABLER_FORMAT_EVENT);
904 if (strcmp(desc->name, enabler->event_param.name))
905 return 0;
906 if (desc->loglevel) {
907 loglevel = *(*desc->loglevel);
908 has_loglevel = 1;
909 }
910 if (!lttng_loglevel_match(loglevel,
911 has_loglevel,
912 enabler->event_param.loglevel_type,
913 enabler->event_param.loglevel))
914 return 0;
915 return 1;
916 }
917
918 static
919 int lttng_desc_match_enabler(struct lttng_ust_event_desc *desc,
920 struct lttng_enabler *enabler)
921 {
922 switch (enabler->format_type) {
923 case LTTNG_ENABLER_FORMAT_STAR_GLOB:
924 {
925 struct lttng_ust_excluder_node *excluder;
926
927 if (!lttng_desc_match_star_glob_enabler(desc, enabler)) {
928 return 0;
929 }
930
931 /*
932 * If the matching event matches with an excluder,
933 * return 'does not match'
934 */
935 cds_list_for_each_entry(excluder, &enabler->excluder_head, node) {
936 int count;
937
938 for (count = 0; count < excluder->excluder.count; count++) {
939 int len;
940 char *excluder_name;
941
942 excluder_name = (char *) (excluder->excluder.names)
943 + count * LTTNG_UST_ABI_SYM_NAME_LEN;
944 len = strnlen(excluder_name, LTTNG_UST_ABI_SYM_NAME_LEN);
945 if (len > 0 && strutils_star_glob_match(excluder_name, len, desc->name, SIZE_MAX))
946 return 0;
947 }
948 }
949 return 1;
950 }
951 case LTTNG_ENABLER_FORMAT_EVENT:
952 return lttng_desc_match_event_enabler(desc, enabler);
953 default:
954 return -EINVAL;
955 }
956 }
957
958 static
959 int lttng_event_enabler_match_event(struct lttng_event_enabler *event_enabler,
960 struct lttng_ust_event_recorder *event_recorder)
961 {
962 if (lttng_desc_match_enabler(event_recorder->parent->priv->desc,
963 lttng_event_enabler_as_enabler(event_enabler))
964 && event_recorder->chan == event_enabler->chan)
965 return 1;
966 else
967 return 0;
968 }
969
970 static
971 int lttng_event_notifier_enabler_match_event_notifier(
972 struct lttng_event_notifier_enabler *event_notifier_enabler,
973 struct lttng_ust_event_notifier *event_notifier)
974 {
975 int desc_matches = lttng_desc_match_enabler(event_notifier->priv->parent.desc,
976 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
977
978 if (desc_matches && event_notifier->priv->group == event_notifier_enabler->group &&
979 event_notifier->priv->parent.user_token == event_notifier_enabler->user_token)
980 return 1;
981 else
982 return 0;
983 }
984
985 static
986 struct lttng_enabler_ref *lttng_enabler_ref(
987 struct cds_list_head *enabler_ref_list,
988 struct lttng_enabler *enabler)
989 {
990 struct lttng_enabler_ref *enabler_ref;
991
992 cds_list_for_each_entry(enabler_ref, enabler_ref_list, node) {
993 if (enabler_ref->ref == enabler)
994 return enabler_ref;
995 }
996 return NULL;
997 }
998
999 /*
1000 * Create struct lttng_event if it is missing and present in the list of
1001 * tracepoint probes.
1002 */
1003 static
1004 void lttng_create_event_recorder_if_missing(struct lttng_event_enabler *event_enabler)
1005 {
1006 struct lttng_ust_session *session = event_enabler->chan->parent->session;
1007 struct lttng_ust_probe_desc *probe_desc;
1008 struct lttng_ust_event_desc *desc;
1009 struct lttng_ust_event_recorder_private *event_recorder_priv;
1010 int i;
1011 struct cds_list_head *probe_list;
1012
1013 probe_list = lttng_get_probe_list_head();
1014 /*
1015 * For each probe event, if we find that a probe event matches
1016 * our enabler, create an associated lttng_event if not
1017 * already present.
1018 */
1019 cds_list_for_each_entry(probe_desc, probe_list, head) {
1020 for (i = 0; i < probe_desc->nr_events; i++) {
1021 int ret;
1022 bool found = false;
1023 struct cds_hlist_head *head;
1024 struct cds_hlist_node *node;
1025
1026 desc = probe_desc->event_desc[i];
1027 if (!lttng_desc_match_enabler(desc,
1028 lttng_event_enabler_as_enabler(event_enabler)))
1029 continue;
1030
1031 head = borrow_hash_table_bucket(
1032 session->priv->events_ht.table,
1033 LTTNG_UST_EVENT_HT_SIZE, desc);
1034
1035 cds_hlist_for_each_entry(event_recorder_priv, node, head, hlist) {
1036 if (event_recorder_priv->parent.desc == desc
1037 && event_recorder_priv->pub->chan == event_enabler->chan) {
1038 found = true;
1039 break;
1040 }
1041 }
1042 if (found)
1043 continue;
1044
1045 /*
1046 * We need to create an event for this
1047 * event probe.
1048 */
1049 ret = lttng_event_recorder_create(probe_desc->event_desc[i],
1050 event_enabler->chan);
1051 if (ret) {
1052 DBG("Unable to create event %s, error %d\n",
1053 probe_desc->event_desc[i]->name, ret);
1054 }
1055 }
1056 }
1057 }
1058
1059 static
1060 void probe_provider_event_for_each(struct lttng_ust_probe_desc *provider_desc,
1061 void (*event_func)(struct lttng_ust_event_common *event))
1062 {
1063 struct cds_hlist_node *node, *tmp_node;
1064 struct cds_list_head *sessionsp;
1065 unsigned int i;
1066
1067 /* Get handle on list of sessions. */
1068 sessionsp = lttng_get_sessions();
1069
1070 /*
1071 * Iterate over all events in the probe provider descriptions and
1072 * sessions to queue the unregistration of the events.
1073 */
1074 for (i = 0; i < provider_desc->nr_events; i++) {
1075 struct lttng_ust_event_desc *event_desc;
1076 struct lttng_event_notifier_group *event_notifier_group;
1077 struct lttng_ust_event_recorder_private *event_recorder_priv;
1078 struct lttng_ust_event_notifier_private *event_notifier_priv;
1079 struct lttng_ust_session_private *session_priv;
1080 struct cds_hlist_head *head;
1081
1082 event_desc = provider_desc->event_desc[i];
1083
1084 /*
1085 * Iterate over all session to find the current event
1086 * description.
1087 */
1088 cds_list_for_each_entry(session_priv, sessionsp, node) {
1089 /*
1090 * Get the list of events in the hashtable bucket and
1091 * iterate to find the event matching this descriptor.
1092 */
1093 head = borrow_hash_table_bucket(
1094 session_priv->events_ht.table,
1095 LTTNG_UST_EVENT_HT_SIZE, event_desc);
1096
1097 cds_hlist_for_each_entry_safe(event_recorder_priv, node, tmp_node, head, hlist) {
1098 if (event_desc == event_recorder_priv->parent.desc) {
1099 event_func(event_recorder_priv->parent.pub);
1100 break;
1101 }
1102 }
1103 }
1104
1105 /*
1106 * Iterate over all event_notifier groups to find the current event
1107 * description.
1108 */
1109 cds_list_for_each_entry(event_notifier_group, &event_notifier_groups, node) {
1110 /*
1111 * Get the list of event_notifiers in the hashtable bucket and
1112 * iterate to find the event_notifier matching this
1113 * descriptor.
1114 */
1115 head = borrow_hash_table_bucket(
1116 event_notifier_group->event_notifiers_ht.table,
1117 LTTNG_UST_EVENT_NOTIFIER_HT_SIZE, event_desc);
1118
1119 cds_hlist_for_each_entry_safe(event_notifier_priv, node, tmp_node, head, hlist) {
1120 if (event_desc == event_notifier_priv->parent.desc) {
1121 event_func(event_notifier_priv->parent.pub);
1122 break;
1123 }
1124 }
1125 }
1126 }
1127 }
1128
1129 static
1130 void _event_enum_destroy(struct lttng_ust_event_common *event)
1131 {
1132
1133 switch (event->type) {
1134 case LTTNG_UST_EVENT_TYPE_RECORDER:
1135 {
1136 struct lttng_ust_event_recorder *event_recorder = event->child;
1137 struct lttng_ust_session *session = event_recorder->chan->parent->session;
1138 unsigned int i;
1139
1140 /* Destroy enums of the current event. */
1141 for (i = 0; i < event_recorder->parent->priv->desc->nr_fields; i++) {
1142 struct lttng_ust_enum_desc *enum_desc;
1143 struct lttng_ust_event_field *field;
1144 struct lttng_enum *curr_enum;
1145
1146 field = event_recorder->parent->priv->desc->fields[i];
1147 switch (field->type->type) {
1148 case lttng_ust_type_enum:
1149 enum_desc = lttng_ust_get_type_enum(field->type)->desc;
1150 break;
1151 default:
1152 continue;
1153 }
1154
1155 curr_enum = lttng_ust_enum_get_from_desc(session, enum_desc);
1156 if (curr_enum) {
1157 _lttng_enum_destroy(curr_enum);
1158 }
1159 }
1160 break;
1161 }
1162 case LTTNG_UST_EVENT_TYPE_NOTIFIER:
1163 break;
1164 default:
1165 abort();
1166 }
1167 /* Destroy event. */
1168 _lttng_event_destroy(event);
1169 }
1170
1171 /*
1172 * Iterate over all the UST sessions to unregister and destroy all probes from
1173 * the probe provider descriptor received as argument. Must me called with the
1174 * ust_lock held.
1175 */
1176 void lttng_probe_provider_unregister_events(
1177 struct lttng_ust_probe_desc *provider_desc)
1178 {
1179 /*
1180 * Iterate over all events in the probe provider descriptions and sessions
1181 * to queue the unregistration of the events.
1182 */
1183 probe_provider_event_for_each(provider_desc, _lttng_event_unregister);
1184
1185 /* Wait for grace period. */
1186 lttng_ust_urcu_synchronize_rcu();
1187 /* Prune the unregistration queue. */
1188 lttng_ust_tp_probe_prune_release_queue();
1189
1190 /*
1191 * It is now safe to destroy the events and remove them from the event list
1192 * and hashtables.
1193 */
1194 probe_provider_event_for_each(provider_desc, _event_enum_destroy);
1195 }
1196
1197 /*
1198 * Create events associated with an event enabler (if not already present),
1199 * and add backward reference from the event to the enabler.
1200 */
1201 static
1202 int lttng_event_enabler_ref_event_recorders(struct lttng_event_enabler *event_enabler)
1203 {
1204 struct lttng_ust_session *session = event_enabler->chan->parent->session;
1205 struct lttng_ust_event_recorder_private *event_recorder_priv;
1206
1207 if (!lttng_event_enabler_as_enabler(event_enabler)->enabled)
1208 goto end;
1209
1210 /* First ensure that probe events are created for this enabler. */
1211 lttng_create_event_recorder_if_missing(event_enabler);
1212
1213 /* For each event matching enabler in session event list. */
1214 cds_list_for_each_entry(event_recorder_priv, &session->priv->events_head, node) {
1215 struct lttng_enabler_ref *enabler_ref;
1216
1217 if (!lttng_event_enabler_match_event(event_enabler, event_recorder_priv->pub))
1218 continue;
1219
1220 enabler_ref = lttng_enabler_ref(&event_recorder_priv->parent.enablers_ref_head,
1221 lttng_event_enabler_as_enabler(event_enabler));
1222 if (!enabler_ref) {
1223 /*
1224 * If no backward ref, create it.
1225 * Add backward ref from event to enabler.
1226 */
1227 enabler_ref = zmalloc(sizeof(*enabler_ref));
1228 if (!enabler_ref)
1229 return -ENOMEM;
1230 enabler_ref->ref = lttng_event_enabler_as_enabler(
1231 event_enabler);
1232 cds_list_add(&enabler_ref->node,
1233 &event_recorder_priv->parent.enablers_ref_head);
1234 }
1235
1236 /*
1237 * Link filter bytecodes if not linked yet.
1238 */
1239 lttng_enabler_link_bytecode(event_recorder_priv->parent.desc,
1240 &session->priv->ctx,
1241 &event_recorder_priv->pub->parent->filter_bytecode_runtime_head,
1242 &lttng_event_enabler_as_enabler(event_enabler)->filter_bytecode_head);
1243
1244 /* TODO: merge event context. */
1245 }
1246 end:
1247 return 0;
1248 }
1249
1250 /*
1251 * Called at library load: connect the probe on all enablers matching
1252 * this event.
1253 * Called with session mutex held.
1254 */
1255 int lttng_fix_pending_events(void)
1256 {
1257 struct lttng_ust_session_private *session_priv;
1258
1259 cds_list_for_each_entry(session_priv, &sessions, node) {
1260 lttng_session_lazy_sync_event_enablers(session_priv->pub);
1261 }
1262 return 0;
1263 }
1264
1265 int lttng_fix_pending_event_notifiers(void)
1266 {
1267 struct lttng_event_notifier_group *event_notifier_group;
1268
1269 cds_list_for_each_entry(event_notifier_group, &event_notifier_groups, node) {
1270 lttng_event_notifier_group_sync_enablers(event_notifier_group);
1271 }
1272 return 0;
1273 }
1274
1275 /*
1276 * For each session of the owner thread, execute pending statedump.
1277 * Only dump state for the sessions owned by the caller thread, because
1278 * we don't keep ust_lock across the entire iteration.
1279 */
1280 void lttng_handle_pending_statedump(void *owner)
1281 {
1282 struct lttng_ust_session_private *session_priv;
1283
1284 /* Execute state dump */
1285 do_lttng_ust_statedump(owner);
1286
1287 /* Clear pending state dump */
1288 if (ust_lock()) {
1289 goto end;
1290 }
1291 cds_list_for_each_entry(session_priv, &sessions, node) {
1292 if (session_priv->owner != owner)
1293 continue;
1294 if (!session_priv->statedump_pending)
1295 continue;
1296 session_priv->statedump_pending = 0;
1297 }
1298 end:
1299 ust_unlock();
1300 return;
1301 }
1302
1303 static
1304 void _lttng_event_destroy(struct lttng_ust_event_common *event)
1305 {
1306 struct lttng_enabler_ref *enabler_ref, *tmp_enabler_ref;
1307
1308 lttng_free_event_filter_runtime(event);
1309 /* Free event enabler refs */
1310 cds_list_for_each_entry_safe(enabler_ref, tmp_enabler_ref,
1311 &event->priv->enablers_ref_head, node)
1312 free(enabler_ref);
1313
1314 switch (event->type) {
1315 case LTTNG_UST_EVENT_TYPE_RECORDER:
1316 {
1317 struct lttng_ust_event_recorder *event_recorder = event->child;
1318
1319 /* Remove from event list. */
1320 cds_list_del(&event_recorder->priv->node);
1321 /* Remove from event hash table. */
1322 cds_hlist_del(&event_recorder->priv->hlist);
1323
1324 lttng_destroy_context(event_recorder->ctx);
1325 free(event_recorder->parent);
1326 free(event_recorder->priv);
1327 free(event_recorder);
1328 break;
1329 }
1330 case LTTNG_UST_EVENT_TYPE_NOTIFIER:
1331 {
1332 struct lttng_ust_event_notifier *event_notifier = event->child;
1333
1334 /* Remove from event list. */
1335 cds_list_del(&event_notifier->priv->node);
1336 /* Remove from event hash table. */
1337 cds_hlist_del(&event_notifier->priv->hlist);
1338
1339 free(event_notifier->priv);
1340 free(event_notifier->parent);
1341 free(event_notifier);
1342 break;
1343 }
1344 default:
1345 abort();
1346 }
1347 }
1348
1349 static
1350 void _lttng_enum_destroy(struct lttng_enum *_enum)
1351 {
1352 cds_list_del(&_enum->node);
1353 cds_hlist_del(&_enum->hlist);
1354 free(_enum);
1355 }
1356
1357 void lttng_ust_abi_events_exit(void)
1358 {
1359 struct lttng_ust_session_private *session_priv, *tmpsession_priv;
1360
1361 cds_list_for_each_entry_safe(session_priv, tmpsession_priv, &sessions, node)
1362 lttng_session_destroy(session_priv->pub);
1363 }
1364
1365 /*
1366 * Enabler management.
1367 */
1368 struct lttng_event_enabler *lttng_event_enabler_create(
1369 enum lttng_enabler_format_type format_type,
1370 struct lttng_ust_abi_event *event_param,
1371 struct lttng_ust_channel_buffer *chan)
1372 {
1373 struct lttng_event_enabler *event_enabler;
1374
1375 event_enabler = zmalloc(sizeof(*event_enabler));
1376 if (!event_enabler)
1377 return NULL;
1378 event_enabler->base.format_type = format_type;
1379 CDS_INIT_LIST_HEAD(&event_enabler->base.filter_bytecode_head);
1380 CDS_INIT_LIST_HEAD(&event_enabler->base.excluder_head);
1381 memcpy(&event_enabler->base.event_param, event_param,
1382 sizeof(event_enabler->base.event_param));
1383 event_enabler->chan = chan;
1384 /* ctx left NULL */
1385 event_enabler->base.enabled = 0;
1386 cds_list_add(&event_enabler->node, &event_enabler->chan->parent->session->priv->enablers_head);
1387 lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session);
1388
1389 return event_enabler;
1390 }
1391
1392 struct lttng_event_notifier_enabler *lttng_event_notifier_enabler_create(
1393 struct lttng_event_notifier_group *event_notifier_group,
1394 enum lttng_enabler_format_type format_type,
1395 struct lttng_ust_abi_event_notifier *event_notifier_param)
1396 {
1397 struct lttng_event_notifier_enabler *event_notifier_enabler;
1398
1399 event_notifier_enabler = zmalloc(sizeof(*event_notifier_enabler));
1400 if (!event_notifier_enabler)
1401 return NULL;
1402 event_notifier_enabler->base.format_type = format_type;
1403 CDS_INIT_LIST_HEAD(&event_notifier_enabler->base.filter_bytecode_head);
1404 CDS_INIT_LIST_HEAD(&event_notifier_enabler->capture_bytecode_head);
1405 CDS_INIT_LIST_HEAD(&event_notifier_enabler->base.excluder_head);
1406
1407 event_notifier_enabler->user_token = event_notifier_param->event.token;
1408 event_notifier_enabler->error_counter_index = event_notifier_param->error_counter_index;
1409 event_notifier_enabler->num_captures = 0;
1410
1411 memcpy(&event_notifier_enabler->base.event_param.name,
1412 event_notifier_param->event.name,
1413 sizeof(event_notifier_enabler->base.event_param.name));
1414 event_notifier_enabler->base.event_param.instrumentation =
1415 event_notifier_param->event.instrumentation;
1416 event_notifier_enabler->base.event_param.loglevel =
1417 event_notifier_param->event.loglevel;
1418 event_notifier_enabler->base.event_param.loglevel_type =
1419 event_notifier_param->event.loglevel_type;
1420
1421 event_notifier_enabler->base.enabled = 0;
1422 event_notifier_enabler->group = event_notifier_group;
1423
1424 cds_list_add(&event_notifier_enabler->node,
1425 &event_notifier_group->enablers_head);
1426
1427 lttng_event_notifier_group_sync_enablers(event_notifier_group);
1428
1429 return event_notifier_enabler;
1430 }
1431
1432 int lttng_event_enabler_enable(struct lttng_event_enabler *event_enabler)
1433 {
1434 lttng_event_enabler_as_enabler(event_enabler)->enabled = 1;
1435 lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session);
1436
1437 return 0;
1438 }
1439
1440 int lttng_event_enabler_disable(struct lttng_event_enabler *event_enabler)
1441 {
1442 lttng_event_enabler_as_enabler(event_enabler)->enabled = 0;
1443 lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session);
1444
1445 return 0;
1446 }
1447
1448 static
1449 void _lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler,
1450 struct lttng_ust_bytecode_node **bytecode)
1451 {
1452 (*bytecode)->enabler = enabler;
1453 cds_list_add_tail(&(*bytecode)->node, &enabler->filter_bytecode_head);
1454 /* Take ownership of bytecode */
1455 *bytecode = NULL;
1456 }
1457
1458 int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event_enabler,
1459 struct lttng_ust_bytecode_node **bytecode)
1460 {
1461 _lttng_enabler_attach_filter_bytecode(
1462 lttng_event_enabler_as_enabler(event_enabler), bytecode);
1463
1464 lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session);
1465 return 0;
1466 }
1467
1468 static
1469 void _lttng_enabler_attach_exclusion(struct lttng_enabler *enabler,
1470 struct lttng_ust_excluder_node **excluder)
1471 {
1472 (*excluder)->enabler = enabler;
1473 cds_list_add_tail(&(*excluder)->node, &enabler->excluder_head);
1474 /* Take ownership of excluder */
1475 *excluder = NULL;
1476 }
1477
1478 int lttng_event_enabler_attach_exclusion(struct lttng_event_enabler *event_enabler,
1479 struct lttng_ust_excluder_node **excluder)
1480 {
1481 _lttng_enabler_attach_exclusion(
1482 lttng_event_enabler_as_enabler(event_enabler), excluder);
1483
1484 lttng_session_lazy_sync_event_enablers(event_enabler->chan->parent->session);
1485 return 0;
1486 }
1487
1488 int lttng_event_notifier_enabler_enable(
1489 struct lttng_event_notifier_enabler *event_notifier_enabler)
1490 {
1491 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)->enabled = 1;
1492 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
1493
1494 return 0;
1495 }
1496
1497 int lttng_event_notifier_enabler_disable(
1498 struct lttng_event_notifier_enabler *event_notifier_enabler)
1499 {
1500 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)->enabled = 0;
1501 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
1502
1503 return 0;
1504 }
1505
1506 int lttng_event_notifier_enabler_attach_filter_bytecode(
1507 struct lttng_event_notifier_enabler *event_notifier_enabler,
1508 struct lttng_ust_bytecode_node **bytecode)
1509 {
1510 _lttng_enabler_attach_filter_bytecode(
1511 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler),
1512 bytecode);
1513
1514 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
1515 return 0;
1516 }
1517
1518 int lttng_event_notifier_enabler_attach_capture_bytecode(
1519 struct lttng_event_notifier_enabler *event_notifier_enabler,
1520 struct lttng_ust_bytecode_node **bytecode)
1521 {
1522 (*bytecode)->enabler = lttng_event_notifier_enabler_as_enabler(
1523 event_notifier_enabler);
1524 cds_list_add_tail(&(*bytecode)->node,
1525 &event_notifier_enabler->capture_bytecode_head);
1526 /* Take ownership of bytecode */
1527 *bytecode = NULL;
1528 event_notifier_enabler->num_captures++;
1529
1530 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
1531 return 0;
1532 }
1533
1534 int lttng_event_notifier_enabler_attach_exclusion(
1535 struct lttng_event_notifier_enabler *event_notifier_enabler,
1536 struct lttng_ust_excluder_node **excluder)
1537 {
1538 _lttng_enabler_attach_exclusion(
1539 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler),
1540 excluder);
1541
1542 lttng_event_notifier_group_sync_enablers(event_notifier_enabler->group);
1543 return 0;
1544 }
1545
1546 int lttng_attach_context(struct lttng_ust_abi_context *context_param,
1547 union lttng_ust_abi_args *uargs,
1548 struct lttng_ust_ctx **ctx, struct lttng_ust_session *session)
1549 {
1550 /*
1551 * We cannot attach a context after trace has been started for a
1552 * session because the metadata does not allow expressing this
1553 * information outside of the original channel scope.
1554 */
1555 if (session->priv->been_active)
1556 return -EPERM;
1557
1558 switch (context_param->ctx) {
1559 case LTTNG_UST_ABI_CONTEXT_PTHREAD_ID:
1560 return lttng_add_pthread_id_to_ctx(ctx);
1561 case LTTNG_UST_ABI_CONTEXT_PERF_THREAD_COUNTER:
1562 {
1563 struct lttng_ust_abi_perf_counter_ctx *perf_ctx_param;
1564
1565 perf_ctx_param = &context_param->u.perf_counter;
1566 return lttng_add_perf_counter_to_ctx(
1567 perf_ctx_param->type,
1568 perf_ctx_param->config,
1569 perf_ctx_param->name,
1570 ctx);
1571 }
1572 case LTTNG_UST_ABI_CONTEXT_VTID:
1573 return lttng_add_vtid_to_ctx(ctx);
1574 case LTTNG_UST_ABI_CONTEXT_VPID:
1575 return lttng_add_vpid_to_ctx(ctx);
1576 case LTTNG_UST_ABI_CONTEXT_PROCNAME:
1577 return lttng_add_procname_to_ctx(ctx);
1578 case LTTNG_UST_ABI_CONTEXT_IP:
1579 return lttng_add_ip_to_ctx(ctx);
1580 case LTTNG_UST_ABI_CONTEXT_CPU_ID:
1581 return lttng_add_cpu_id_to_ctx(ctx);
1582 case LTTNG_UST_ABI_CONTEXT_APP_CONTEXT:
1583 return lttng_ust_add_app_context_to_ctx_rcu(uargs->app_context.ctxname,
1584 ctx);
1585 case LTTNG_UST_ABI_CONTEXT_CGROUP_NS:
1586 return lttng_add_cgroup_ns_to_ctx(ctx);
1587 case LTTNG_UST_ABI_CONTEXT_IPC_NS:
1588 return lttng_add_ipc_ns_to_ctx(ctx);
1589 case LTTNG_UST_ABI_CONTEXT_MNT_NS:
1590 return lttng_add_mnt_ns_to_ctx(ctx);
1591 case LTTNG_UST_ABI_CONTEXT_NET_NS:
1592 return lttng_add_net_ns_to_ctx(ctx);
1593 case LTTNG_UST_ABI_CONTEXT_PID_NS:
1594 return lttng_add_pid_ns_to_ctx(ctx);
1595 case LTTNG_UST_ABI_CONTEXT_TIME_NS:
1596 return lttng_add_time_ns_to_ctx(ctx);
1597 case LTTNG_UST_ABI_CONTEXT_USER_NS:
1598 return lttng_add_user_ns_to_ctx(ctx);
1599 case LTTNG_UST_ABI_CONTEXT_UTS_NS:
1600 return lttng_add_uts_ns_to_ctx(ctx);
1601 case LTTNG_UST_ABI_CONTEXT_VUID:
1602 return lttng_add_vuid_to_ctx(ctx);
1603 case LTTNG_UST_ABI_CONTEXT_VEUID:
1604 return lttng_add_veuid_to_ctx(ctx);
1605 case LTTNG_UST_ABI_CONTEXT_VSUID:
1606 return lttng_add_vsuid_to_ctx(ctx);
1607 case LTTNG_UST_ABI_CONTEXT_VGID:
1608 return lttng_add_vgid_to_ctx(ctx);
1609 case LTTNG_UST_ABI_CONTEXT_VEGID:
1610 return lttng_add_vegid_to_ctx(ctx);
1611 case LTTNG_UST_ABI_CONTEXT_VSGID:
1612 return lttng_add_vsgid_to_ctx(ctx);
1613 default:
1614 return -EINVAL;
1615 }
1616 }
1617
1618 int lttng_event_enabler_attach_context(struct lttng_event_enabler *enabler,
1619 struct lttng_ust_abi_context *context_param)
1620 {
1621 return -ENOSYS;
1622 }
1623
1624 void lttng_event_enabler_destroy(struct lttng_event_enabler *event_enabler)
1625 {
1626 if (!event_enabler) {
1627 return;
1628 }
1629 cds_list_del(&event_enabler->node);
1630
1631 lttng_enabler_destroy(lttng_event_enabler_as_enabler(event_enabler));
1632
1633 lttng_destroy_context(event_enabler->ctx);
1634 free(event_enabler);
1635 }
1636
1637 /*
1638 * lttng_session_sync_event_enablers should be called just before starting a
1639 * session.
1640 */
1641 static
1642 void lttng_session_sync_event_enablers(struct lttng_ust_session *session)
1643 {
1644 struct lttng_event_enabler *event_enabler;
1645 struct lttng_ust_event_recorder_private *event_recorder_priv;
1646
1647 cds_list_for_each_entry(event_enabler, &session->priv->enablers_head, node)
1648 lttng_event_enabler_ref_event_recorders(event_enabler);
1649 /*
1650 * For each event, if at least one of its enablers is enabled,
1651 * and its channel and session transient states are enabled, we
1652 * enable the event, else we disable it.
1653 */
1654 cds_list_for_each_entry(event_recorder_priv, &session->priv->events_head, node) {
1655 struct lttng_enabler_ref *enabler_ref;
1656 struct lttng_ust_bytecode_runtime *runtime;
1657 int enabled = 0, has_enablers_without_bytecode = 0;
1658
1659 /* Enable events */
1660 cds_list_for_each_entry(enabler_ref,
1661 &event_recorder_priv->parent.enablers_ref_head, node) {
1662 if (enabler_ref->ref->enabled) {
1663 enabled = 1;
1664 break;
1665 }
1666 }
1667 /*
1668 * Enabled state is based on union of enablers, with
1669 * intesection of session and channel transient enable
1670 * states.
1671 */
1672 enabled = enabled && session->priv->tstate && event_recorder_priv->pub->chan->priv->parent.tstate;
1673
1674 CMM_STORE_SHARED(event_recorder_priv->pub->parent->enabled, enabled);
1675 /*
1676 * Sync tracepoint registration with event enabled
1677 * state.
1678 */
1679 if (enabled) {
1680 if (!event_recorder_priv->parent.registered)
1681 register_event(event_recorder_priv->parent.pub);
1682 } else {
1683 if (event_recorder_priv->parent.registered)
1684 unregister_event(event_recorder_priv->parent.pub);
1685 }
1686
1687 /* Check if has enablers without bytecode enabled */
1688 cds_list_for_each_entry(enabler_ref,
1689 &event_recorder_priv->parent.enablers_ref_head, node) {
1690 if (enabler_ref->ref->enabled
1691 && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) {
1692 has_enablers_without_bytecode = 1;
1693 break;
1694 }
1695 }
1696 event_recorder_priv->pub->parent->has_enablers_without_bytecode =
1697 has_enablers_without_bytecode;
1698
1699 /* Enable filters */
1700 cds_list_for_each_entry(runtime,
1701 &event_recorder_priv->pub->parent->filter_bytecode_runtime_head, node) {
1702 lttng_bytecode_filter_sync_state(runtime);
1703 }
1704 }
1705 lttng_ust_tp_probe_prune_release_queue();
1706 }
1707
1708 /* Support for event notifier is introduced by probe provider major version 2. */
1709 static
1710 bool lttng_ust_probe_supports_event_notifier(struct lttng_ust_probe_desc *probe_desc)
1711 {
1712 return probe_desc->major >= 2;
1713 }
1714
1715 static
1716 void lttng_create_event_notifier_if_missing(
1717 struct lttng_event_notifier_enabler *event_notifier_enabler)
1718 {
1719 struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group;
1720 struct lttng_ust_probe_desc *probe_desc;
1721 struct cds_list_head *probe_list;
1722 int i;
1723
1724 probe_list = lttng_get_probe_list_head();
1725
1726 cds_list_for_each_entry(probe_desc, probe_list, head) {
1727 for (i = 0; i < probe_desc->nr_events; i++) {
1728 int ret;
1729 bool found = false;
1730 struct lttng_ust_event_desc *desc;
1731 struct lttng_ust_event_notifier_private *event_notifier_priv;
1732 struct cds_hlist_head *head;
1733 struct cds_hlist_node *node;
1734
1735 desc = probe_desc->event_desc[i];
1736
1737 if (!lttng_desc_match_enabler(desc,
1738 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)))
1739 continue;
1740
1741 /*
1742 * Given the current event_notifier group, get the bucket that
1743 * the target event_notifier would be if it was already
1744 * created.
1745 */
1746 head = borrow_hash_table_bucket(
1747 event_notifier_group->event_notifiers_ht.table,
1748 LTTNG_UST_EVENT_NOTIFIER_HT_SIZE, desc);
1749
1750 cds_hlist_for_each_entry(event_notifier_priv, node, head, hlist) {
1751 /*
1752 * Check if event_notifier already exists by checking
1753 * if the event_notifier and enabler share the same
1754 * description and id.
1755 */
1756 if (event_notifier_priv->parent.desc == desc &&
1757 event_notifier_priv->parent.user_token == event_notifier_enabler->user_token) {
1758 found = true;
1759 break;
1760 }
1761 }
1762
1763 if (found)
1764 continue;
1765
1766 /* Check that the probe supports event notifiers, else report the error. */
1767 if (!lttng_ust_probe_supports_event_notifier(probe_desc)) {
1768 ERR("Probe \"%s\" contains event \"%s\" which matches an enabled event notifier, "
1769 "but its version (%u.%u) is too old and does not implement event notifiers. "
1770 "It needs to be recompiled against a newer version of LTTng-UST, otherwise "
1771 "this event will not generate any notification.",
1772 probe_desc->provider,
1773 desc->name,
1774 probe_desc->major,
1775 probe_desc->minor);
1776 continue;
1777 }
1778 /*
1779 * We need to create a event_notifier for this event probe.
1780 */
1781 ret = lttng_event_notifier_create(desc,
1782 event_notifier_enabler->user_token,
1783 event_notifier_enabler->error_counter_index,
1784 event_notifier_group);
1785 if (ret) {
1786 DBG("Unable to create event_notifier %s, error %d\n",
1787 probe_desc->event_desc[i]->name, ret);
1788 }
1789 }
1790 }
1791 }
1792
1793 /*
1794 * Create event_notifiers associated with a event_notifier enabler (if not already present).
1795 */
1796 static
1797 int lttng_event_notifier_enabler_ref_event_notifiers(
1798 struct lttng_event_notifier_enabler *event_notifier_enabler)
1799 {
1800 struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group;
1801 struct lttng_ust_event_notifier_private *event_notifier_priv;
1802
1803 /*
1804 * Only try to create event_notifiers for enablers that are enabled, the user
1805 * might still be attaching filter or exclusion to the
1806 * event_notifier_enabler.
1807 */
1808 if (!lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)->enabled)
1809 goto end;
1810
1811 /* First, ensure that probe event_notifiers are created for this enabler. */
1812 lttng_create_event_notifier_if_missing(event_notifier_enabler);
1813
1814 /* Link the created event_notifier with its associated enabler. */
1815 cds_list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) {
1816 struct lttng_enabler_ref *enabler_ref;
1817
1818 if (!lttng_event_notifier_enabler_match_event_notifier(event_notifier_enabler, event_notifier_priv->pub))
1819 continue;
1820
1821 enabler_ref = lttng_enabler_ref(&event_notifier_priv->parent.enablers_ref_head,
1822 lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
1823 if (!enabler_ref) {
1824 /*
1825 * If no backward ref, create it.
1826 * Add backward ref from event_notifier to enabler.
1827 */
1828 enabler_ref = zmalloc(sizeof(*enabler_ref));
1829 if (!enabler_ref)
1830 return -ENOMEM;
1831
1832 enabler_ref->ref = lttng_event_notifier_enabler_as_enabler(
1833 event_notifier_enabler);
1834 cds_list_add(&enabler_ref->node,
1835 &event_notifier_priv->parent.enablers_ref_head);
1836 }
1837
1838 /*
1839 * Link filter bytecodes if not linked yet.
1840 */
1841 lttng_enabler_link_bytecode(event_notifier_priv->parent.desc,
1842 &event_notifier_group->ctx,
1843 &event_notifier_priv->pub->parent->filter_bytecode_runtime_head,
1844 &lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)->filter_bytecode_head);
1845
1846 /*
1847 * Link capture bytecodes if not linked yet.
1848 */
1849 lttng_enabler_link_bytecode(event_notifier_priv->parent.desc,
1850 &event_notifier_group->ctx, &event_notifier_priv->pub->capture_bytecode_runtime_head,
1851 &event_notifier_enabler->capture_bytecode_head);
1852
1853 event_notifier_priv->num_captures = event_notifier_enabler->num_captures;
1854 }
1855 end:
1856 return 0;
1857 }
1858
1859 static
1860 void lttng_event_notifier_group_sync_enablers(struct lttng_event_notifier_group *event_notifier_group)
1861 {
1862 struct lttng_event_notifier_enabler *event_notifier_enabler;
1863 struct lttng_ust_event_notifier_private *event_notifier_priv;
1864
1865 cds_list_for_each_entry(event_notifier_enabler, &event_notifier_group->enablers_head, node)
1866 lttng_event_notifier_enabler_ref_event_notifiers(event_notifier_enabler);
1867
1868 /*
1869 * For each event_notifier, if at least one of its enablers is enabled,
1870 * we enable the event_notifier, else we disable it.
1871 */
1872 cds_list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) {
1873 struct lttng_enabler_ref *enabler_ref;
1874 struct lttng_ust_bytecode_runtime *runtime;
1875 int enabled = 0, has_enablers_without_bytecode = 0;
1876
1877 /* Enable event_notifiers */
1878 cds_list_for_each_entry(enabler_ref,
1879 &event_notifier_priv->parent.enablers_ref_head, node) {
1880 if (enabler_ref->ref->enabled) {
1881 enabled = 1;
1882 break;
1883 }
1884 }
1885
1886 CMM_STORE_SHARED(event_notifier_priv->pub->parent->enabled, enabled);
1887 /*
1888 * Sync tracepoint registration with event_notifier enabled
1889 * state.
1890 */
1891 if (enabled) {
1892 if (!event_notifier_priv->parent.registered)
1893 register_event(event_notifier_priv->parent.pub);
1894 } else {
1895 if (event_notifier_priv->parent.registered)
1896 unregister_event(event_notifier_priv->parent.pub);
1897 }
1898
1899 /* Check if has enablers without bytecode enabled */
1900 cds_list_for_each_entry(enabler_ref,
1901 &event_notifier_priv->parent.enablers_ref_head, node) {
1902 if (enabler_ref->ref->enabled
1903 && cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) {
1904 has_enablers_without_bytecode = 1;
1905 break;
1906 }
1907 }
1908 event_notifier_priv->pub->parent->has_enablers_without_bytecode =
1909 has_enablers_without_bytecode;
1910
1911 /* Enable filters */
1912 cds_list_for_each_entry(runtime,
1913 &event_notifier_priv->pub->parent->filter_bytecode_runtime_head, node) {
1914 lttng_bytecode_filter_sync_state(runtime);
1915 }
1916
1917 /* Enable captures. */
1918 cds_list_for_each_entry(runtime,
1919 &event_notifier_priv->pub->capture_bytecode_runtime_head, node) {
1920 lttng_bytecode_capture_sync_state(runtime);
1921 }
1922 }
1923 lttng_ust_tp_probe_prune_release_queue();
1924 }
1925
1926 /*
1927 * Apply enablers to session events, adding events to session if need
1928 * be. It is required after each modification applied to an active
1929 * session, and right before session "start".
1930 * "lazy" sync means we only sync if required.
1931 */
1932 static
1933 void lttng_session_lazy_sync_event_enablers(struct lttng_ust_session *session)
1934 {
1935 /* We can skip if session is not active */
1936 if (!session->active)
1937 return;
1938 lttng_session_sync_event_enablers(session);
1939 }
1940
1941 /*
1942 * Update all sessions with the given app context.
1943 * Called with ust lock held.
1944 * This is invoked when an application context gets loaded/unloaded. It
1945 * ensures the context callbacks are in sync with the application
1946 * context (either app context callbacks, or dummy callbacks).
1947 */
1948 void lttng_ust_context_set_session_provider(const char *name,
1949 size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset),
1950 void (*record)(struct lttng_ust_ctx_field *field,
1951 struct lttng_ust_lib_ring_buffer_ctx *ctx,
1952 struct lttng_ust_channel_buffer *chan),
1953 void (*get_value)(struct lttng_ust_ctx_field *field,
1954 struct lttng_ust_ctx_value *value))
1955 {
1956 struct lttng_ust_session_private *session_priv;
1957
1958 cds_list_for_each_entry(session_priv, &sessions, node) {
1959 struct lttng_ust_channel_buffer_private *chan;
1960 struct lttng_ust_event_recorder_private *event_recorder_priv;
1961 int ret;
1962
1963 ret = lttng_ust_context_set_provider_rcu(&session_priv->ctx,
1964 name, get_size, record, get_value);
1965 if (ret)
1966 abort();
1967 cds_list_for_each_entry(chan, &session_priv->chan_head, node) {
1968 ret = lttng_ust_context_set_provider_rcu(&chan->pub->ctx,
1969 name, get_size, record, get_value);
1970 if (ret)
1971 abort();
1972 }
1973 cds_list_for_each_entry(event_recorder_priv, &session_priv->events_head, node) {
1974 ret = lttng_ust_context_set_provider_rcu(&event_recorder_priv->pub->ctx,
1975 name, get_size, record, get_value);
1976 if (ret)
1977 abort();
1978 }
1979 }
1980 }
1981
1982 /*
1983 * Update all event_notifier groups with the given app context.
1984 * Called with ust lock held.
1985 * This is invoked when an application context gets loaded/unloaded. It
1986 * ensures the context callbacks are in sync with the application
1987 * context (either app context callbacks, or dummy callbacks).
1988 */
1989 void lttng_ust_context_set_event_notifier_group_provider(const char *name,
1990 size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset),
1991 void (*record)(struct lttng_ust_ctx_field *field,
1992 struct lttng_ust_lib_ring_buffer_ctx *ctx,
1993 struct lttng_ust_channel_buffer *chan),
1994 void (*get_value)(struct lttng_ust_ctx_field *field,
1995 struct lttng_ust_ctx_value *value))
1996 {
1997 struct lttng_event_notifier_group *event_notifier_group;
1998
1999 cds_list_for_each_entry(event_notifier_group, &event_notifier_groups, node) {
2000 int ret;
2001
2002 ret = lttng_ust_context_set_provider_rcu(
2003 &event_notifier_group->ctx,
2004 name, get_size, record, get_value);
2005 if (ret)
2006 abort();
2007 }
2008 }
This page took 0.06896 seconds and 5 git commands to generate.