1 #ifndef BABELTRACE_CTF_IR_TRACE_H
2 #define BABELTRACE_CTF_IR_TRACE_H
5 * BabelTrace - CTF IR: Trace
7 * Copyright 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 * The Common Trace Format (CTF) Specification is available at
30 * http://www.efficios.com/ctf
33 #include <babeltrace/ctf-ir/field-types.h>
34 #include <babeltrace/ctf-ir/visitor.h>
35 #include <babeltrace/values.h>
36 #include <babeltrace/graph/notification.h>
44 @defgroup ctfirtraceclass CTF IR trace class
46 @brief CTF IR trace class.
49 #include <babeltrace/ctf-ir/trace.h>
52 A CTF IR <strong><em>trace class</em></strong> is a descriptor of
55 You can obtain a trace class in two different modes:
57 - <strong>Normal mode</strong>: use bt_ctf_trace_create() to create a
58 default, empty trace class.
59 - <strong>CTF writer mode</strong>: use bt_ctf_writer_get_trace() to
60 get the trace class created by a given CTF writer object.
62 A trace class has the following properties:
65 - A <strong>default byte order</strong>: all the
66 \link ctfirfieldtypes field types\endlink eventually part of the trace
67 class with a byte order set to #BT_CTF_BYTE_ORDER_NATIVE have this
69 - An \b environment, which is a custom key-value mapping. Keys are
70 strings and values can be strings or integers.
72 In the Babeltrace CTF IR system, a trace class contains zero or more
73 \link ctfirstreamclass stream classes\endlink, and a stream class
74 contains zero or more \link ctfireventclass event classes\endlink. You
75 can add an event class to a stream class with
76 bt_ctf_stream_class_add_event_class(). You can add a stream class to a
77 trace class with bt_ctf_trace_add_stream_class().
79 A trace class owns the <strong>trace packet header</strong>
80 \link ctfirfieldtypes field type\endlink, which represents the
81 \c trace.packet.header CTF scope. This field type describes the
82 trace packet header fields of the traces that this trace class
85 The trace packet header field type \em must be a structure field type as
86 of Babeltrace \btversion.
88 As per the CTF specification, the trace packet header field type \em
89 must contain a field named \c stream_id if the trace class contains more
90 than one stream class.
92 As a reminder, here's the structure of a CTF packet:
96 A trace class also contains zero or more
97 \link ctfirclockclass CTF IR clock classes\endlink.
100 Elaborate about clock classes irt clock values.
102 As with any Babeltrace object, CTF IR trace class objects have
103 <a href="https://en.wikipedia.org/wiki/Reference_counting">reference
104 counts</a>. See \ref refs to learn more about the reference counting
105 management of Babeltrace objects.
107 The following functions \em freeze their trace class parameter on
110 - bt_ctf_trace_add_stream_class()
111 - bt_ctf_writer_create_stream()
112 (\link ctfwriter CTF writer\endlink mode only)
114 You cannot modify a frozen trace class: it is considered immutable,
117 - Adding a stream class to it with
118 bt_ctf_trace_add_stream_class().
119 - Adding a CTF IR clock class to it with bt_ctf_trace_add_clock_class().
120 - \link refs Reference counting\endlink.
122 You can add a custom listener with bt_ctf_trace_add_listener() to get
123 notified if anything changes in a trace class, that is, if an event
124 class is added to one of its stream class, if a stream class is added,
125 or if a clock class is added.
132 @brief CTF IR trace class type and functions.
135 @addtogroup ctfirtraceclass
141 @brief A CTF IR trace class.
145 struct bt_ctf_stream
;
146 struct bt_ctf_stream_class
;
147 struct bt_ctf_clock_class
;
150 @name Creation function
155 @brief Creates a default CTF IR trace class.
157 On success, the trace packet header field type of the created trace
158 class has the following fields:
160 - <code>magic</code>: a 32-bit unsigned integer field type.
161 - <code>uuid</code>: an array field type of 16 8-bit unsigned integer
163 - <code>stream_id</code>: a 32-bit unsigned integer field type.
165 You can modify this default trace packet header field type after the
166 trace class is created with bt_ctf_trace_set_packet_header_type().
168 The created trace class has the following initial properties:
170 - <strong>Name</strong>: none. You can set a name
171 with bt_ctf_trace_set_name().
172 - <strong>Default byte order</strong>: #BT_CTF_BYTE_ORDER_NATIVE. You
173 can set a default byte order with bt_ctf_trace_set_native_byte_order().
175 Note that you \em must set the default byte order if any field type
176 contained in the created trace class, in its stream classes, or in
177 its event classes, has a byte order set to #BT_CTF_BYTE_ORDER_NATIVE.
178 - <strong>Environment</strong>: empty. You can add environment entries
179 with bt_ctf_trace_set_environment_field(),
180 bt_ctf_trace_set_environment_field_integer(), and
181 bt_ctf_trace_set_environment_field_string().
183 @returns Created trace class, or \c NULL on error.
185 @postsuccessrefcountret1
187 extern struct bt_ctf_trace
*bt_ctf_trace_create(void);
192 @name Properties functions
197 @brief Returns the name of the CTF IR trace class \p trace_class.
199 On success, \p trace_class remains the sole owner of the returned
200 string. The returned string is valid as long as \p trace_class exists
203 @param[in] trace_class Trace class of which to get the name.
204 @returns Name of trace class \p trace_class, or
205 \c NULL if \p trace_class is unnamed or
208 @prenotnull{trace_class}
209 @postrefcountsame{trace_class}
211 @sa bt_ctf_trace_set_name(): Sets the name of a given trace class.
213 extern const char *bt_ctf_trace_get_name(struct bt_ctf_trace
*trace_class
);
216 @brief Sets the name of the CTF IR trace class \p trace_class
219 @param[in] trace_class Trace class of which to set the name.
220 @param[in] name Name of the trace class (copied on success).
221 @returns 0 on success, or a negative value on error.
223 @prenotnull{trace_class}
226 @postrefcountsame{trace_class}
228 @sa bt_ctf_trace_get_name(): Returns the name of a given trace class.
230 extern int bt_ctf_trace_set_name(struct bt_ctf_trace
*trace_class
,
234 @brief Returns the default byte order of the CTF IR trace class
237 @param[in] trace_class Trace class of which to get the default byte
239 @returns Default byte order of trace class
240 \p trace_class, or #BT_CTF_BYTE_ORDER_UNKNOWN
243 @prenotnull{trace_class}
244 @postrefcountsame{trace_class}
246 @sa bt_ctf_trace_set_name(): Sets the name of a given trace class.
248 extern enum bt_ctf_byte_order
bt_ctf_trace_get_byte_order(
249 struct bt_ctf_trace
*trace_class
);
252 @brief Sets the default byte order of the CTF IR trace class
253 \p trace_class to \p native_byte_order.
255 \p native_byte_order \em must be one of:
257 - #BT_CTF_BYTE_ORDER_LITTLE_ENDIAN
258 - #BT_CTF_BYTE_ORDER_BIG_ENDIAN
259 - #BT_CTF_BYTE_ORDER_NETWORK
261 @param[in] trace_class Trace class of which to set the default byte
263 @param[in] native_byte_order Default byte order of the trace class.
264 @returns 0 on success, or a negative value on error.
266 @prenotnull{trace_class}
269 @pre \p native_byte_order is either #BT_CTF_BYTE_ORDER_LITTLE_ENDIAN,
270 #BT_CTF_BYTE_ORDER_BIG_ENDIAN, or
271 #BT_CTF_BYTE_ORDER_NETWORK.
272 @postrefcountsame{trace_class}
274 @sa bt_ctf_trace_get_name(): Returns the name of a given trace class.
276 extern int bt_ctf_trace_set_native_byte_order(struct bt_ctf_trace
*trace_class
,
277 enum bt_ctf_byte_order native_byte_order
);
280 @brief Returns the number of entries contained in the environment of
281 the CTF IR trace class \p trace_class.
283 @param[in] trace_class Trace class of which to get the number
284 of environment entries.
285 @returns Number of environment entries
286 contained in \p trace_class, or
287 a negative value on error.
289 @prenotnull{trace_class}
290 @postrefcountsame{trace_class}
292 extern int bt_ctf_trace_get_environment_field_count(
293 struct bt_ctf_trace
*trace_class
);
296 @brief Returns the field name of the environment entry at index
297 \p index in the CTF IR trace class \p trace_class.
299 On success, the returned string is valid as long as this trace class
300 exists and is \em not modified. \p trace_class remains the sole owner of
303 @param[in] trace_class Trace class of which to get the name of the
304 environment entry at index \p index.
305 @param[in] index Index of environment entry to find.
306 @returns Name of the environment entry at index \p index
307 in \p trace_class, or \c NULL on error.
309 @prenotnull{trace_class}
310 @pre \p index is lesser than the number of environment entries in
311 \p trace_class (see bt_ctf_trace_get_environment_field_count()).
312 @postrefcountsame{trace_class}
314 @sa bt_ctf_trace_get_environment_field_value(): Finds a trace class's
315 environment entry by index.
316 @sa bt_ctf_trace_get_environment_field_value_by_name(): Finds a trace
317 class's environment entry by name.
318 @sa bt_ctf_trace_set_environment_field(): Sets the value of a trace
319 class's environment entry.
322 bt_ctf_trace_get_environment_field_name(struct bt_ctf_trace
*trace_class
,
326 @brief Returns the value of the environment entry at index
327 \p index in the CTF IR trace class \p trace_class.
329 @param[in] trace_class Trace class of which to get the value of the
330 environment entry at index \p index.
331 @param[in] index Index of the environment entry to find.
332 @returns Value of the environment entry at index \p index
333 in \p trace_class, or \c NULL on error.
335 @prenotnull{trace_class}
336 @pre \p index is lesser than the number of environment entries in
337 \p trace_class (see bt_ctf_trace_get_environment_field_count()).
338 @postrefcountsame{trace_class}
339 @postsuccessrefcountretinc
341 @sa bt_ctf_trace_get_environment_field_value_by_name(): Finds a trace
342 class's environment entry by name.
343 @sa bt_ctf_trace_set_environment_field(): Sets the value of a trace
344 class's environment entry.
346 extern struct bt_value
*
347 bt_ctf_trace_get_environment_field_value(struct bt_ctf_trace
*trace_class
,
351 @brief Returns the value of the environment entry named \p name
352 in the CTF IR trace class \p trace_class.
354 @param[in] trace_class Trace class of which to get the value of the
355 environment entry named \p name.
356 @param[in] name Name of the environment entry to find.
357 @returns Value of the environment entry named \p name
358 in \p trace_class, or \c NULL if there's no such
361 @prenotnull{trace_class}
363 @postrefcountsame{trace_class}
364 @postsuccessrefcountretinc
366 @sa bt_ctf_trace_get_environment_field_value(): Finds a trace class's
367 environment entry by index.
368 @sa bt_ctf_trace_set_environment_field(): Sets the value of a trace
369 class's environment entry.
371 extern struct bt_value
*
372 bt_ctf_trace_get_environment_field_value_by_name(
373 struct bt_ctf_trace
*trace_class
, const char *name
);
376 @brief Sets the environment entry named \p name in the
377 CTF IR trace class \p trace_class to \p value.
379 If an environment entry named \p name exists in \p trace_class, its
380 value is first put, and then replaced by \p value.
382 @param[in] trace_class Trace class of which to set the environment
384 @param[in] name Name of the environment entry to set (copied
386 @param[in] value Value of the environment entry named \p name.
387 @returns 0 on success, or a negative value on error.
389 @prenotnull{trace_class}
394 \link bt_value_integer_create() integer value object\endlink
396 \link bt_value_string_create() string value object\endlink.
397 @postrefcountsame{trace_class}
398 @postsuccessrefcountinc{value}
400 @sa bt_ctf_trace_get_environment_field_value(): Finds a trace class's
401 environment entry by index.
402 @sa bt_ctf_trace_get_environment_field_value_by_name(): Finds a trace
403 class's environment entry by name.
405 extern int bt_ctf_trace_set_environment_field(
406 struct bt_ctf_trace
*trace_class
, const char *name
,
407 struct bt_value
*value
);
410 @brief Sets the environment entry named \p name in the
411 CTF IR trace class \p trace_class to \p value.
413 If an environment entry named \p name exists in \p trace_class, its
414 value is first put, and then replaced by a new
415 \link bt_value_integer_create() integer value object\endlink
418 @param[in] trace_class Trace class of which to set the environment
420 @param[in] name Name of the environment entry to set (copied
422 @param[in] value Value of the environment entry named \p name.
423 @returns 0 on success, or a negative value on error.
425 @prenotnull{trace_class}
428 @postrefcountsame{trace_class}
430 @sa bt_ctf_trace_set_environment_field(): Sets the value of a trace
431 class's environment entry.
433 extern int bt_ctf_trace_set_environment_field_integer(
434 struct bt_ctf_trace
*trace_class
, const char *name
,
438 @brief Sets the environment entry named \p name in the
439 CTF IR trace class \p trace_class to \p value.
441 If an environment entry named \p name exists in \p trace_class, its
442 value is first put, and then replaced by a new
443 \link bt_value_string_create() string value object\endlink
446 @param[in] trace_class Trace class of which to set the environment
448 @param[in] name Name of the environment entry to set (copied
450 @param[in] value Value of the environment entry named \p name
452 @returns 0 on success, or a negative value on error.
454 @prenotnull{trace_class}
458 @postrefcountsame{trace_class}
460 @sa bt_ctf_trace_set_environment_field(): Sets the value of a trace
461 class's environment entry.
463 extern int bt_ctf_trace_set_environment_field_string(
464 struct bt_ctf_trace
*trace_class
, const char *name
,
470 @name Contained field types functions
475 @brief Returns the packet header field type of the CTF IR trace class
478 @param[in] trace_class Trace class of which to get the packet
480 @returns Packet header field type of \p trace_class,
481 or \c NULL if \p trace_class has no packet header field
484 @prenotnull{trace_class}
485 @postrefcountsame{trace_class}
486 @post <strong>On success, if the return value is a field type</strong>, its
487 reference count is incremented.
489 @sa bt_ctf_trace_set_packet_header_type(): Sets the packet
490 header field type of a given trace class.
492 extern struct bt_ctf_field_type
*bt_ctf_trace_get_packet_header_type(
493 struct bt_ctf_trace
*trace_class
);
496 @brief Sets the packet header field type of the CTF IR trace class
497 \p trace_class to \p packet_header_type, or unsets the current packet
498 header field type from \p trace_class.
500 If \p packet_header_type is \c NULL, then this function unsets the current
501 packet header field type from \p trace_class, effectively making \p trace_class
502 a trace without a packet header field type.
504 As of Babeltrace \btversion, if \p packet_header_type is not \c NULL,
505 \p packet_header_type \em must be a CTF IR structure field type object.
507 @param[in] trace_class Trace class of which to set the packet
509 @param[in] packet_header_type Packet header field type, or \c NULL to unset
510 the current packet header field type.
511 @returns 0 on success, or a negative value on error.
513 @prenotnull{trace_class}
515 @pre <strong>\p packet_header_type, if not \c NULL</strong>, is a CTF IR
516 structure field type.
517 @postrefcountsame{trace_class}
518 @post <strong>On success, if \p packet_header_type is not \c NULL</strong>,
519 the reference count of \p packet_header_type is incremented.
521 @sa bt_ctf_trace_get_packet_header_type(): Returns the packet
522 header field type of a given trace class.
524 extern int bt_ctf_trace_set_packet_header_type(struct bt_ctf_trace
*trace_class
,
525 struct bt_ctf_field_type
*packet_header_type
);
530 @name Contained clock classes functions
535 @brief Returns the number of CTF IR clock classes contained in the
536 CTF IR trace class \p trace_class.
538 @param[in] trace_class Trace class of which to get the number
539 of contained clock classes.
540 @returns Number of contained clock classes
541 contained in \p trace_class, or a negative
544 @prenotnull{trace_class}
545 @postrefcountsame{trace_class}
547 extern int bt_ctf_trace_get_clock_class_count(struct bt_ctf_trace
*trace_class
);
550 @brief Returns the CTF IR clock class at index \p index in the CTF
551 IR trace class \p trace_class.
553 @param[in] trace_class Trace class of which to get the clock class
554 contained at index \p index.
555 @param[in] index Index of the clock class to find in
557 @returns Clock class at index \p index in \p trace_class,
560 @prenotnull{trace_class}
561 @pre \p index is lesser than the number of clock classes contained in
562 the trace class \p trace_class (see
563 bt_ctf_trace_get_clock_class_count()).
564 @postrefcountsame{trace_class}
565 @postsuccessrefcountretinc
567 @sa bt_ctf_trace_get_clock_class_by_name(): Finds a clock class by name
568 in a given trace class.
569 @sa bt_ctf_trace_add_clock_class(): Adds a clock class to a trace class.
571 extern struct bt_ctf_clock_class
*bt_ctf_trace_get_clock_class(
572 struct bt_ctf_trace
*trace_class
, int index
);
575 @brief Returns the CTF IR clock class named \c name found in the CTF
576 IR trace class \p trace_class.
578 @param[in] trace_class Trace class of which to get the clock class
580 @param[in] name Name of the clock class to find in \p trace_class.
581 @returns Clock class named \p name in \p trace_class,
584 @prenotnull{trace_class}
586 @postrefcountsame{trace_class}
587 @postsuccessrefcountretinc
589 @sa bt_ctf_trace_get_clock_class(): Returns the clock class contained
590 in a given trace class at a given index.
591 @sa bt_ctf_trace_add_clock_class(): Adds a clock class to a trace class.
593 extern struct bt_ctf_clock_class
*bt_ctf_trace_get_clock_class_by_name(
594 struct bt_ctf_trace
*trace_class
, const char *name
);
597 @brief Adds the CTF IR clock class \p clock_class to the CTF IR
598 trace class \p trace_class.
600 On success, \p trace_class contains \p clock_class.
602 You can call this function even if \p trace_class or \p clock_class
605 @param[in] trace_class Trace class to which to add \p clock_class.
606 @param[in] clock_class Clock class to add to \p trace_class.
607 @returns 0 on success, or a negative value on error.
609 @prenotnull{trace_class}
610 @prenotnull{clock_class}
611 @postrefcountsame{trace_class}
612 @postsuccessrefcountinc{clock_class}
613 @post <strong>On success, if \p trace_class is frozen</strong>,
614 \p clock_class is frozen.
616 @sa bt_ctf_trace_get_clock_class(): Returns the clock class contained
617 in a given trace class at a given index.
618 @sa bt_ctf_trace_get_clock_class_by_name(): Finds a clock class by name
619 in a given trace class.
621 extern int bt_ctf_trace_add_clock_class(struct bt_ctf_trace
*trace_class
,
622 struct bt_ctf_clock_class
*clock_class
);
627 @name Stream class children functions
632 @brief Returns the number of stream classes contained in the
633 CTF IR trace class \p trace_class.
635 @param[in] trace_class Trace class of which to get the number
636 of children stream classes.
637 @returns Number of children stream classes
638 contained in \p trace_class, or a negative
641 @prenotnull{trace_class}
642 @postrefcountsame{trace_class}
644 extern int bt_ctf_trace_get_stream_class_count(struct bt_ctf_trace
*trace_class
);
647 @brief Returns the stream class at index \p index in the CTF IR trace
648 class \p trace_class.
650 @param[in] trace_class Trace class of which to get the stream class.
651 @param[in] index Index of the stream class to find.
652 @returns Stream class at index \p index, or \c NULL
655 @prenotnull{trace_class}
656 @pre \p index is lesser than the number of stream classes contained in
657 the trace class \p trace_class (see
658 bt_ctf_trace_get_stream_class_count()).
659 @postrefcountsame{trace_class}
661 @sa bt_ctf_trace_get_stream_class_by_id(): Finds a stream class by ID.
662 @sa bt_ctf_trace_add_stream_class(): Adds a stream class to a trace class.
664 extern struct bt_ctf_stream_class
*bt_ctf_trace_get_stream_class(
665 struct bt_ctf_trace
*trace_class
, int index
);
668 @brief Returns the stream class with ID \c id found in the CTF IR
669 trace class \p trace_class.
671 @param[in] trace_class Trace class of which to get the stream class.
672 @param[in] id ID of the stream class to find.
673 @returns Stream class with ID \p id, or \c NULL
676 @prenotnull{trace_class}
677 @postrefcountsame{trace_class}
678 @postsuccessrefcountretinc
680 @sa bt_ctf_trace_get_stream_class(): Returns the stream class contained
681 in a given trace class at a given index.
682 @sa bt_ctf_trace_add_stream_class(): Adds a stream class to a trace class.
684 extern struct bt_ctf_stream_class
*bt_ctf_trace_get_stream_class_by_id(
685 struct bt_ctf_trace
*trace_class
, uint32_t id
);
688 @brief Adds the CTF IR stream class \p stream_class to the
689 CTF IR trace class \p trace_class.
691 On success, \p stream_class becomes the child of \p trace_class.
693 You can only add a given stream class to one trace class.
695 You can call this function even if \p trace_class is frozen.
697 This function tries to resolve the needed
698 \link ctfirfieldtypes CTF IR field type\endlink of the dynamic field
699 types that are found anywhere in the root field types of
700 \p stream_class and of all its currently contained
701 \link ctfireventclass CTF IR event classes\endlink. If any automatic
702 resolving fails, then this function fails.
704 @param[in] trace_class Trace class to which to add \p stream_class.
705 @param[in] stream_class Stream class to add to \p trace_class.
706 @returns 0 on success, or a negative value on error.
708 @prenotnull{trace_class}
709 @prenotnull{stream_class}
710 @postrefcountsame{trace_class}
711 @postsuccessrefcountinc{stream_class}
712 @postsuccessfrozen{stream_class}
714 @sa bt_ctf_trace_get_stream_class(): Returns the stream class contained
715 in a given trace class at a given index.
716 @sa bt_ctf_trace_get_stream_class_by_id(): Finds a stream class by ID.
718 extern int bt_ctf_trace_add_stream_class(struct bt_ctf_trace
*trace_class
,
719 struct bt_ctf_stream_class
*stream_class
);
724 @name Misc. functions
729 @brief Accepts the visitor \p visitor to visit the hierarchy of the
730 CTF IR trace class \p trace_class.
732 This function traverses the hierarchy of \p trace_class in pre-order
733 and calls \p visitor on each element.
735 The trace class itself is visited first, then, for each children stream
736 class, the stream class itself, and all its children event classes.
738 @param[in] trace_class Trace class to visit.
739 @param[in] visitor Visiting function.
740 @param[in] data User data.
741 @returns 0 on success, or a negative value on error.
743 @prenotnull{trace_class}
746 extern int bt_ctf_trace_visit(struct bt_ctf_trace
*trace_class
,
747 bt_ctf_visitor visitor
, void *data
);
754 * bt_ctf_trace_get_metadata_string: get metadata string.
756 * Get the trace's TSDL metadata. The caller assumes the ownership of the
759 * @param trace Trace instance.
761 * Returns the metadata string on success, NULL on error.
763 extern char *bt_ctf_trace_get_metadata_string(struct bt_ctf_trace
*trace
);
769 #endif /* BABELTRACE_CTF_IR_TRACE_H */