1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
5 * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Copyright (C) 2021 Francis Deslauriers <francis.deslauriers@efficios.com>
10 #include <linux/utsname.h>
11 #include <linux/ktime.h>
12 #include <linux/timekeeping.h>
14 #include <lttng/events.h>
15 #include <lttng/events-internal.h>
17 #include "metadata-printer.h"
18 #include "clock-utils.h"
21 int _lttng_field_statedump(struct lttng_kernel_session
*session
,
22 const struct lttng_kernel_event_field
*field
,
23 size_t nesting
, const char **prev_field_name_p
);
26 int _lttng_type_statedump(struct lttng_kernel_session
*session
,
27 const struct lttng_kernel_type_common
*type
,
28 enum lttng_kernel_string_encoding parent_encoding
,
32 int print_tabs(struct lttng_kernel_session
*session
, size_t nesting
)
36 for (i
= 0; i
< nesting
; i
++) {
39 ret
= lttng_metadata_printf(session
, " ");
48 int lttng_field_name_statedump(struct lttng_kernel_session
*session
,
49 const struct lttng_kernel_event_field
*field
,
52 return lttng_metadata_printf(session
, " _%s;\n", field
->name
);
56 int _lttng_integer_type_statedump(struct lttng_kernel_session
*session
,
57 const struct lttng_kernel_type_integer
*type
,
58 enum lttng_kernel_string_encoding parent_encoding
,
63 ret
= print_tabs(session
, nesting
);
66 ret
= lttng_metadata_printf(session
,
67 "integer { size = %u; align = %u; signed = %u; encoding = %s; base = %u;%s }",
71 (parent_encoding
== lttng_kernel_string_encoding_none
)
73 : (parent_encoding
== lttng_kernel_string_encoding_UTF8
)
77 #if __BYTE_ORDER == __BIG_ENDIAN
78 type
->reverse_byte_order
? " byte_order = le;" : ""
80 type
->reverse_byte_order
? " byte_order = be;" : ""
87 * Must be called with sessions_mutex held.
90 int _lttng_struct_type_statedump(struct lttng_kernel_session
*session
,
91 const struct lttng_kernel_type_struct
*type
,
94 const char *prev_field_name
= NULL
;
96 uint32_t i
, nr_fields
;
97 unsigned int alignment
;
99 ret
= print_tabs(session
, nesting
);
102 ret
= lttng_metadata_printf(session
,
106 nr_fields
= type
->nr_fields
;
107 for (i
= 0; i
< nr_fields
; i
++) {
108 const struct lttng_kernel_event_field
*iter_field
;
110 iter_field
= type
->fields
[i
];
111 ret
= _lttng_field_statedump(session
, iter_field
, nesting
+ 1, &prev_field_name
);
115 ret
= print_tabs(session
, nesting
);
118 alignment
= type
->alignment
;
120 ret
= lttng_metadata_printf(session
,
124 ret
= lttng_metadata_printf(session
,
131 * Must be called with sessions_mutex held.
134 int _lttng_struct_field_statedump(struct lttng_kernel_session
*session
,
135 const struct lttng_kernel_event_field
*field
,
140 ret
= _lttng_struct_type_statedump(session
,
141 lttng_kernel_get_type_struct(field
->type
), nesting
);
144 return lttng_field_name_statedump(session
, field
, nesting
);
148 * Must be called with sessions_mutex held.
151 int _lttng_variant_type_statedump(struct lttng_kernel_session
*session
,
152 const struct lttng_kernel_type_variant
*type
,
154 const char *prev_field_name
)
156 const char *tag_name
;
158 uint32_t i
, nr_choices
;
160 tag_name
= type
->tag_name
;
162 tag_name
= prev_field_name
;
166 * CTF 1.8 does not allow expressing nonzero variant alignment in a nestable way.
168 if (type
->alignment
!= 0)
170 ret
= print_tabs(session
, nesting
);
173 ret
= lttng_metadata_printf(session
,
178 nr_choices
= type
->nr_choices
;
179 for (i
= 0; i
< nr_choices
; i
++) {
180 const struct lttng_kernel_event_field
*iter_field
;
182 iter_field
= type
->choices
[i
];
183 ret
= _lttng_field_statedump(session
, iter_field
, nesting
+ 1, NULL
);
187 ret
= print_tabs(session
, nesting
);
190 ret
= lttng_metadata_printf(session
,
196 * Must be called with sessions_mutex held.
199 int _lttng_variant_field_statedump(struct lttng_kernel_session
*session
,
200 const struct lttng_kernel_event_field
*field
,
202 const char *prev_field_name
)
206 ret
= _lttng_variant_type_statedump(session
,
207 lttng_kernel_get_type_variant(field
->type
), nesting
,
211 return lttng_field_name_statedump(session
, field
, nesting
);
215 * Must be called with sessions_mutex held.
218 int _lttng_array_field_statedump(struct lttng_kernel_session
*session
,
219 const struct lttng_kernel_event_field
*field
,
223 const struct lttng_kernel_type_array
*array_type
;
224 const struct lttng_kernel_type_common
*elem_type
;
226 array_type
= lttng_kernel_get_type_array(field
->type
);
227 WARN_ON_ONCE(!array_type
);
229 if (array_type
->alignment
) {
230 ret
= print_tabs(session
, nesting
);
233 ret
= lttng_metadata_printf(session
,
234 "struct { } align(%u) _%s_padding;\n",
235 array_type
->alignment
* CHAR_BIT
,
241 * Nested compound types: Only array of structures and variants are
242 * currently supported.
244 elem_type
= array_type
->elem_type
;
245 switch (elem_type
->type
) {
246 case lttng_kernel_type_integer
:
247 case lttng_kernel_type_struct
:
248 case lttng_kernel_type_variant
:
249 ret
= _lttng_type_statedump(session
, elem_type
,
250 array_type
->encoding
, nesting
);
258 ret
= lttng_metadata_printf(session
,
266 * Must be called with sessions_mutex held.
269 int _lttng_sequence_field_statedump(struct lttng_kernel_session
*session
,
270 const struct lttng_kernel_event_field
*field
,
272 const char *prev_field_name
)
275 const char *length_name
;
276 const struct lttng_kernel_type_sequence
*sequence_type
;
277 const struct lttng_kernel_type_common
*elem_type
;
279 sequence_type
= lttng_kernel_get_type_sequence(field
->type
);
280 WARN_ON_ONCE(!sequence_type
);
282 length_name
= sequence_type
->length_name
;
284 length_name
= prev_field_name
;
288 if (sequence_type
->alignment
) {
289 ret
= print_tabs(session
, nesting
);
292 ret
= lttng_metadata_printf(session
,
293 "struct { } align(%u) _%s_padding;\n",
294 sequence_type
->alignment
* CHAR_BIT
,
301 * Nested compound types: Only array of structures and variants are
302 * currently supported.
304 elem_type
= sequence_type
->elem_type
;
305 switch (elem_type
->type
) {
306 case lttng_kernel_type_integer
:
307 case lttng_kernel_type_struct
:
308 case lttng_kernel_type_variant
:
309 ret
= _lttng_type_statedump(session
, elem_type
,
310 sequence_type
->encoding
, nesting
);
318 ret
= lttng_metadata_printf(session
,
326 * Must be called with sessions_mutex held.
329 int _lttng_enum_type_statedump(struct lttng_kernel_session
*session
,
330 const struct lttng_kernel_type_enum
*type
,
333 const struct lttng_kernel_enum_desc
*enum_desc
;
334 const struct lttng_kernel_type_common
*container_type
;
336 unsigned int i
, nr_entries
;
338 container_type
= type
->container_type
;
339 if (container_type
->type
!= lttng_kernel_type_integer
) {
343 enum_desc
= type
->desc
;
344 nr_entries
= enum_desc
->nr_entries
;
346 ret
= print_tabs(session
, nesting
);
349 ret
= lttng_metadata_printf(session
, "enum : ");
352 ret
= _lttng_integer_type_statedump(session
, lttng_kernel_get_type_integer(container_type
),
353 lttng_kernel_string_encoding_none
, 0);
356 ret
= lttng_metadata_printf(session
, " {\n");
359 /* Dump all entries */
360 for (i
= 0; i
< nr_entries
; i
++) {
361 const struct lttng_kernel_enum_entry
*entry
= enum_desc
->entries
[i
];
364 ret
= print_tabs(session
, nesting
+ 1);
367 ret
= lttng_metadata_printf(session
,
371 len
= strlen(entry
->string
);
372 /* Escape the character '"' */
373 for (j
= 0; j
< len
; j
++) {
374 char c
= entry
->string
[j
];
378 ret
= lttng_metadata_printf(session
,
382 ret
= lttng_metadata_printf(session
,
386 ret
= lttng_metadata_printf(session
,
393 ret
= lttng_metadata_printf(session
, "\"");
397 if (entry
->options
.is_auto
) {
398 ret
= lttng_metadata_printf(session
, ",\n");
402 ret
= lttng_metadata_printf(session
,
406 if (entry
->start
.signedness
)
407 ret
= lttng_metadata_printf(session
,
408 "%lld", (long long) entry
->start
.value
);
410 ret
= lttng_metadata_printf(session
,
411 "%llu", entry
->start
.value
);
414 if (entry
->start
.signedness
== entry
->end
.signedness
&&
416 == entry
->end
.value
) {
417 ret
= lttng_metadata_printf(session
,
420 if (entry
->end
.signedness
) {
421 ret
= lttng_metadata_printf(session
,
423 (long long) entry
->end
.value
);
425 ret
= lttng_metadata_printf(session
,
434 ret
= print_tabs(session
, nesting
);
437 ret
= lttng_metadata_printf(session
, "}");
443 * Must be called with sessions_mutex held.
446 int _lttng_enum_field_statedump(struct lttng_kernel_session
*session
,
447 const struct lttng_kernel_event_field
*field
,
451 const struct lttng_kernel_type_enum
*enum_type
;
453 enum_type
= lttng_kernel_get_type_enum(field
->type
);
454 WARN_ON_ONCE(!enum_type
);
455 ret
= _lttng_enum_type_statedump(session
, enum_type
, nesting
);
458 return lttng_field_name_statedump(session
, field
, nesting
);
462 int _lttng_integer_field_statedump(struct lttng_kernel_session
*session
,
463 const struct lttng_kernel_event_field
*field
,
468 ret
= _lttng_integer_type_statedump(session
, lttng_kernel_get_type_integer(field
->type
),
469 lttng_kernel_string_encoding_none
, nesting
);
472 return lttng_field_name_statedump(session
, field
, nesting
);
476 int _lttng_string_type_statedump(struct lttng_kernel_session
*session
,
477 const struct lttng_kernel_type_string
*type
,
482 /* Default encoding is UTF8 */
483 ret
= print_tabs(session
, nesting
);
486 ret
= lttng_metadata_printf(session
,
488 type
->encoding
== lttng_kernel_string_encoding_ASCII
?
489 " { encoding = ASCII; }" : "");
494 int _lttng_string_field_statedump(struct lttng_kernel_session
*session
,
495 const struct lttng_kernel_event_field
*field
,
498 const struct lttng_kernel_type_string
*string_type
;
501 string_type
= lttng_kernel_get_type_string(field
->type
);
502 WARN_ON_ONCE(!string_type
);
503 ret
= _lttng_string_type_statedump(session
, string_type
, nesting
);
506 return lttng_field_name_statedump(session
, field
, nesting
);
510 * Must be called with sessions_mutex held.
513 int _lttng_type_statedump(struct lttng_kernel_session
*session
,
514 const struct lttng_kernel_type_common
*type
,
515 enum lttng_kernel_string_encoding parent_encoding
,
520 switch (type
->type
) {
521 case lttng_kernel_type_integer
:
522 ret
= _lttng_integer_type_statedump(session
,
523 lttng_kernel_get_type_integer(type
),
524 parent_encoding
, nesting
);
526 case lttng_kernel_type_enum
:
527 ret
= _lttng_enum_type_statedump(session
,
528 lttng_kernel_get_type_enum(type
),
531 case lttng_kernel_type_string
:
532 ret
= _lttng_string_type_statedump(session
,
533 lttng_kernel_get_type_string(type
),
536 case lttng_kernel_type_struct
:
537 ret
= _lttng_struct_type_statedump(session
,
538 lttng_kernel_get_type_struct(type
),
541 case lttng_kernel_type_variant
:
542 ret
= _lttng_variant_type_statedump(session
,
543 lttng_kernel_get_type_variant(type
),
547 /* Nested arrays and sequences are not supported yet. */
548 case lttng_kernel_type_array
:
549 case lttng_kernel_type_sequence
:
558 * Must be called with sessions_mutex held.
561 int _lttng_field_statedump(struct lttng_kernel_session
*session
,
562 const struct lttng_kernel_event_field
*field
,
564 const char **prev_field_name_p
)
566 const char *prev_field_name
= NULL
;
569 if (prev_field_name_p
)
570 prev_field_name
= *prev_field_name_p
;
571 switch (field
->type
->type
) {
572 case lttng_kernel_type_integer
:
573 ret
= _lttng_integer_field_statedump(session
, field
, nesting
);
575 case lttng_kernel_type_enum
:
576 ret
= _lttng_enum_field_statedump(session
, field
, nesting
);
578 case lttng_kernel_type_string
:
579 ret
= _lttng_string_field_statedump(session
, field
, nesting
);
581 case lttng_kernel_type_struct
:
582 ret
= _lttng_struct_field_statedump(session
, field
, nesting
);
584 case lttng_kernel_type_array
:
585 ret
= _lttng_array_field_statedump(session
, field
, nesting
);
587 case lttng_kernel_type_sequence
:
588 ret
= _lttng_sequence_field_statedump(session
, field
, nesting
, prev_field_name
);
590 case lttng_kernel_type_variant
:
591 ret
= _lttng_variant_field_statedump(session
, field
, nesting
, prev_field_name
);
598 if (prev_field_name_p
)
599 *prev_field_name_p
= field
->name
;
604 int _lttng_context_metadata_statedump(struct lttng_kernel_session
*session
,
605 struct lttng_kernel_ctx
*ctx
)
607 const char *prev_field_name
= NULL
;
613 for (i
= 0; i
< ctx
->nr_fields
; i
++) {
614 const struct lttng_kernel_ctx_field
*field
= &ctx
->fields
[i
];
616 ret
= _lttng_field_statedump(session
, field
->event_field
, 2, &prev_field_name
);
624 int _lttng_fields_metadata_statedump(struct lttng_kernel_session
*session
,
625 struct lttng_kernel_event_recorder
*event_recorder
)
627 const char *prev_field_name
= NULL
;
628 const struct lttng_kernel_event_desc
*desc
= event_recorder
->priv
->parent
.desc
;
632 for (i
= 0; i
< desc
->tp_class
->nr_fields
; i
++) {
633 const struct lttng_kernel_event_field
*field
= desc
->tp_class
->fields
[i
];
635 ret
= _lttng_field_statedump(session
, field
, 2, &prev_field_name
);
643 * Must be called with sessions_mutex held.
644 * The entire event metadata is printed as a single atomic metadata
647 int _lttng_event_recorder_metadata_statedump(struct lttng_kernel_event_common
*event
)
649 struct lttng_kernel_event_recorder
*event_recorder
;
650 struct lttng_kernel_channel_buffer
*chan
;
651 struct lttng_kernel_session
*session
;
654 if (event
->type
!= LTTNG_KERNEL_EVENT_TYPE_RECORDER
)
656 event_recorder
= container_of(event
, struct lttng_kernel_event_recorder
, parent
);
657 chan
= event_recorder
->chan
;
658 session
= chan
->parent
.session
;
660 if (event_recorder
->priv
->metadata_dumped
|| !LTTNG_READ_ONCE(session
->active
))
662 if (chan
->priv
->channel_type
== METADATA_CHANNEL
)
665 lttng_metadata_begin(session
);
667 ret
= lttng_metadata_printf(session
,
671 " stream_id = %u;\n",
672 event_recorder
->priv
->parent
.desc
->event_name
,
673 event_recorder
->priv
->id
,
674 event_recorder
->chan
->priv
->id
);
678 ret
= lttng_metadata_printf(session
,
679 " fields := struct {\n"
684 ret
= _lttng_fields_metadata_statedump(session
, event_recorder
);
689 * LTTng space reservation can only reserve multiples of the
692 ret
= lttng_metadata_printf(session
,
698 event_recorder
->priv
->metadata_dumped
= 1;
700 lttng_metadata_end(session
);
706 * Must be called with sessions_mutex held.
707 * The entire channel metadata is printed as a single atomic metadata
711 int lttng_channel_metadata_statedump(struct lttng_kernel_session
*session
,
712 struct lttng_kernel_channel_buffer
*chan
)
716 if (chan
->priv
->metadata_dumped
|| !LTTNG_READ_ONCE(session
->active
))
719 if (chan
->priv
->channel_type
== METADATA_CHANNEL
)
722 lttng_metadata_begin(session
);
724 WARN_ON_ONCE(!chan
->priv
->header_type
);
725 ret
= lttng_metadata_printf(session
,
728 " event.header := %s;\n"
729 " packet.context := struct packet_context;\n",
731 chan
->priv
->header_type
== 1 ? "struct event_header_compact" :
732 "struct event_header_large");
736 if (chan
->priv
->ctx
) {
737 ret
= lttng_metadata_printf(session
,
738 " event.context := struct {\n");
742 ret
= _lttng_context_metadata_statedump(session
, chan
->priv
->ctx
);
745 if (chan
->priv
->ctx
) {
746 ret
= lttng_metadata_printf(session
,
752 ret
= lttng_metadata_printf(session
,
755 chan
->priv
->metadata_dumped
= 1;
757 lttng_metadata_end(session
);
762 * Must be called with sessions_mutex held.
765 int _lttng_stream_packet_context_declare(struct lttng_kernel_session
*session
)
767 return lttng_metadata_printf(session
,
768 "struct packet_context {\n"
769 " uint64_clock_monotonic_t timestamp_begin;\n"
770 " uint64_clock_monotonic_t timestamp_end;\n"
771 " uint64_t content_size;\n"
772 " uint64_t packet_size;\n"
773 " uint64_t packet_seq_num;\n"
774 " unsigned long events_discarded;\n"
775 " uint32_t cpu_id;\n"
783 * id 31 is reserved to indicate an extended header.
786 * id: range: 0 - 65534.
787 * id 65535 is reserved to indicate an extended header.
789 * Must be called with sessions_mutex held.
792 int _lttng_event_header_declare(struct lttng_kernel_session
*session
)
794 return lttng_metadata_printf(session
,
795 "struct event_header_compact {\n"
796 " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
799 " uint27_clock_monotonic_t timestamp;\n"
803 " uint64_clock_monotonic_t timestamp;\n"
808 "struct event_header_large {\n"
809 " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
812 " uint32_clock_monotonic_t timestamp;\n"
816 " uint64_clock_monotonic_t timestamp;\n"
820 lttng_alignof(uint32_t) * CHAR_BIT
,
821 lttng_alignof(uint16_t) * CHAR_BIT
826 int print_escaped_ctf_string(struct lttng_kernel_session
*session
, const char *string
)
834 while (cur
!= '\0') {
837 ret
= lttng_metadata_printf(session
, "%s", "\\n");
841 ret
= lttng_metadata_printf(session
, "%c", '\\');
844 /* We still print the current char */
847 ret
= lttng_metadata_printf(session
, "%c", cur
);
861 int print_metadata_escaped_field(struct lttng_kernel_session
*session
, const char *field
,
862 const char *field_value
)
866 ret
= lttng_metadata_printf(session
, " %s = \"", field
);
870 ret
= print_escaped_ctf_string(session
, field_value
);
874 ret
= lttng_metadata_printf(session
, "\";\n");
881 * Output metadata into this session's metadata buffers.
882 * Must be called with sessions_mutex held.
884 int _lttng_session_metadata_statedump(struct lttng_kernel_session
*session
)
886 unsigned char *uuid_c
= session
->priv
->uuid
.b
;
887 unsigned char uuid_s
[37], clock_uuid_s
[BOOT_ID_LEN
];
888 const char *product_uuid
;
889 struct lttng_kernel_channel_buffer_private
*chan_priv
;
890 struct lttng_kernel_event_recorder_private
*event_recorder_priv
;
893 if (!LTTNG_READ_ONCE(session
->active
))
896 lttng_metadata_begin(session
);
898 if (session
->priv
->metadata_dumped
)
901 snprintf(uuid_s
, sizeof(uuid_s
),
902 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
903 uuid_c
[0], uuid_c
[1], uuid_c
[2], uuid_c
[3],
904 uuid_c
[4], uuid_c
[5], uuid_c
[6], uuid_c
[7],
905 uuid_c
[8], uuid_c
[9], uuid_c
[10], uuid_c
[11],
906 uuid_c
[12], uuid_c
[13], uuid_c
[14], uuid_c
[15]);
908 ret
= lttng_metadata_printf(session
,
909 "typealias integer { size = 8; align = %u; signed = false; } := uint8_t;\n"
910 "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n"
911 "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n"
912 "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n"
913 "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n"
914 "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
915 "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
921 " byte_order = %s;\n"
922 " packet.header := struct {\n"
924 " uint8_t uuid[16];\n"
925 " uint32_t stream_id;\n"
926 " uint64_t stream_instance_id;\n"
929 lttng_alignof(uint8_t) * CHAR_BIT
,
930 lttng_alignof(uint16_t) * CHAR_BIT
,
931 lttng_alignof(uint32_t) * CHAR_BIT
,
932 lttng_alignof(uint64_t) * CHAR_BIT
,
933 sizeof(unsigned long) * CHAR_BIT
,
934 lttng_alignof(unsigned long) * CHAR_BIT
,
938 #if __BYTE_ORDER == __BIG_ENDIAN
947 ret
= lttng_metadata_printf(session
,
949 " hostname = \"%s\";\n"
950 " domain = \"kernel\";\n"
951 " sysname = \"%s\";\n"
952 " kernel_release = \"%s\";\n"
953 " kernel_version = \"%s\";\n"
954 " tracer_name = \"lttng-modules\";\n"
955 " tracer_major = %d;\n"
956 " tracer_minor = %d;\n"
957 " tracer_patchlevel = %d;\n"
958 " trace_buffering_scheme = \"global\";\n",
959 current
->nsproxy
->uts_ns
->name
.nodename
,
963 LTTNG_MODULES_MAJOR_VERSION
,
964 LTTNG_MODULES_MINOR_VERSION
,
965 LTTNG_MODULES_PATCHLEVEL_VERSION
970 ret
= print_metadata_escaped_field(session
, "trace_name", session
->priv
->name
);
973 ret
= print_metadata_escaped_field(session
, "trace_creation_datetime",
974 session
->priv
->creation_time
);
978 /* Add the product UUID to the 'env' section */
979 product_uuid
= dmi_get_system_info(DMI_PRODUCT_UUID
);
981 ret
= lttng_metadata_printf(session
,
982 " product_uuid = \"%s\";\n",
989 /* Close the 'env' section */
990 ret
= lttng_metadata_printf(session
, "};\n\n");
994 ret
= lttng_metadata_printf(session
,
1002 if (!trace_clock_uuid(clock_uuid_s
)) {
1003 ret
= lttng_metadata_printf(session
,
1004 " uuid = \"%s\";\n",
1011 ret
= lttng_metadata_printf(session
,
1012 " description = \"%s\";\n"
1013 " freq = %llu; /* Frequency, in Hz */\n"
1014 " /* clock value offset from Epoch is: offset * (1/freq) */\n"
1017 trace_clock_description(),
1018 (unsigned long long) trace_clock_freq(),
1019 (long long) trace_clock_offset()
1024 ret
= lttng_metadata_printf(session
,
1025 "typealias integer {\n"
1026 " size = 27; align = 1; signed = false;\n"
1027 " map = clock.%s.value;\n"
1028 "} := uint27_clock_monotonic_t;\n"
1030 "typealias integer {\n"
1031 " size = 32; align = %u; signed = false;\n"
1032 " map = clock.%s.value;\n"
1033 "} := uint32_clock_monotonic_t;\n"
1035 "typealias integer {\n"
1036 " size = 64; align = %u; signed = false;\n"
1037 " map = clock.%s.value;\n"
1038 "} := uint64_clock_monotonic_t;\n\n",
1040 lttng_alignof(uint32_t) * CHAR_BIT
,
1042 lttng_alignof(uint64_t) * CHAR_BIT
,
1048 ret
= _lttng_stream_packet_context_declare(session
);
1052 ret
= _lttng_event_header_declare(session
);
1057 list_for_each_entry(chan_priv
, &session
->priv
->chan
, node
) {
1058 ret
= lttng_channel_metadata_statedump(session
, chan_priv
->pub
);
1063 list_for_each_entry(event_recorder_priv
, &session
->priv
->events
, parent
.node
) {
1064 ret
= _lttng_event_recorder_metadata_statedump(&event_recorder_priv
->pub
->parent
);
1068 session
->priv
->metadata_dumped
= 1;
1070 lttng_metadata_end(session
);