cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / include / babeltrace2 / trace-ir / stream.h
CommitLineData
c057dea0 1/*
0235b0db 2 * SPDX-License-Identifier: MIT
c057dea0 3 *
0235b0db 4 * Copyright (C) 2010-2019 EfficiOS Inc. and Linux Foundation
c057dea0
PP
5 */
6
0235b0db
MJ
7#ifndef BABELTRACE2_TRACE_IR_STREAM_H
8#define BABELTRACE2_TRACE_IR_STREAM_H
9
f38da6ca
SM
10/* IWYU pragma: private, include <babeltrace2/babeltrace.h> */
11
4fa90f32
PP
12#ifndef __BT_IN_BABELTRACE_H
13# error "Please include <babeltrace2/babeltrace.h> instead."
14#endif
15
d24d5663
PP
16#include <stdint.h>
17
3fadfbc0 18#include <babeltrace2/types.h>
b19ff26f 19
c057dea0
PP
20#ifdef __cplusplus
21extern "C" {
22#endif
23
43c59509
PP
24/*!
25@defgroup api-tir-stream Stream
26@ingroup api-tir
27
28@brief
29 Trace stream.
30
31A <strong><em>stream</em></strong> is a conceptual
32\ref api-msg-seq "sequence of messages" within a \bt_trace:
33
34@image html trace-structure.png
35
36In the illustration above, notice that:
37
38- A \bt_stream is a conceptual sequence of \bt_p_msg.
39
40 The sequence always starts with a \bt_sb_msg and ends with a
41 \bt_se_msg.
42
43- A stream is an instance of a \bt_stream_cls.
44
45- A \bt_trace contains one or more streams.
46
47A stream is a \ref api-tir "trace IR" data object.
48
49A stream is said to be a \em conceptual sequence of messages because the
50stream object itself does not contain messages: it only represents a
51common timeline to which messages are associated.
52
53\bt_cp_comp exchange messages, within a trace processing \bt_graph,
54which can belong to different streams, as long as the stream clocks are
55\ref api-tir-clock-cls-origin "correlatable".
56
57A typical use case for streams is to use one for each traced CPU. Then
118ae153 58the messages related to a given stream are the ones which occurred on a
43c59509
PP
59given CPU. Other schemes are possible: they are completely
60application-specific, and \bt_name does not enforce any specific
61stream arrangement pattern.
62
63A \bt_trace contains streams. All the streams of a
64given trace, for a given stream class, have unique numeric IDs. Borrow
65the trace which contains a stream with bt_stream_borrow_trace() or
66bt_stream_borrow_trace_const().
67
68A \bt_stream can conceptually contain a default clock if its class
69has a \ref api-tir-stream-cls-prop-def-clock-cls "default clock class".
70There's no function to access a stream's default clock because it's
71a stateful object: \bt_p_msg cannot refer to stateful objects
72because they must not change while being transported from one
73\bt_comp to the other. Instead of having a stream default clock object,
74\bt_p_msg have a default \bt_cs: this is a snapshot of the value of a
75stream's default clock (a \bt_clock_cls instance):
76
77@image html clocks.png
78
79In the illustration above, notice that:
80
81- Streams (horizontal blue rectangles) are instances of a
82 \bt_stream_cls (orange).
83
84- A stream class has a default \bt_clock_cls (orange bell alarm clock).
85
86- Each stream has a default clock (yellow bell alarm clock): this is an
87 instance of the stream's class's default clock class.
88
89- Each \bt_msg (objects in blue stream rectangles) created for a given
90 stream has a default \bt_cs (yellow star): this is a snapshot of the
91 stream's default clock.
92
93 In other words, a default clock snapshot contains the value of the
118ae153 94 stream's default clock when this message occurred.
43c59509
PP
95
96To create a stream:
97
98<dl>
99 <dt>
100 If bt_stream_class_assigns_automatic_stream_id() returns
101 #BT_TRUE (the default) for the stream class to use
102 </dt>
103 <dd>Use bt_stream_create().</dd>
104
105 <dt>
106 If bt_stream_class_assigns_automatic_stream_id() returns
107 #BT_FALSE for the stream class to use
108 </dt>
109 <dd>Use bt_stream_create_with_id().</dd>
110</dl>
111
112A stream is a \ref api-fund-shared-object "shared object": get a
113new reference with bt_stream_get_ref() and put an existing
114reference with bt_stream_put_ref().
115
116Some library functions \ref api-fund-freezing "freeze" streams on
117success. The documentation of those functions indicate this
118postcondition.
119
120The type of a stream is #bt_stream.
121
122<h1>Properties</h1>
123
124A stream has the following property:
125
126<dl>
127 <dt>\anchor api-tir-stream-prop-id Numeric ID</dt>
128 <dd>
129 Numeric ID, unique amongst the numeric IDs of the stream's
130 \bt_trace's streams for a given \bt_stream_cls. In other words,
131 two streams which belong to the same trace can have the same numeric
132 ID if they aren't instances of the same class.
133
134 Depending on whether or not the stream's class
135 automatically assigns stream IDs
136 (see bt_stream_class_assigns_automatic_stream_id()),
137 set the stream's numeric ID on creation with
138 bt_stream_create() or bt_stream_create_with_id().
139
140 You cannot change the numeric ID once the stream is created.
141
142 Get a stream's numeric ID with bt_stream_get_id().
143 </dd>
144
145 <dt>\anchor api-tir-stream-prop-name \bt_dt_opt Name</dt>
146 <dd>
147 Name of the stream.
148
149 Use bt_stream_set_name() and bt_stream_get_name().
150 </dd>
151
152 <dt>
153 \anchor api-tir-stream-prop-user-attrs
154 \bt_dt_opt User attributes
155 </dt>
156 <dd>
157 User attributes of the stream.
158
159 User attributes are custom attributes attached to a stream.
160
161 Use bt_stream_set_user_attributes(),
162 bt_stream_borrow_user_attributes(), and
163 bt_stream_borrow_user_attributes_const().
164 </dd>
165</dl>
166*/
167
168/*! @{ */
169
170/*!
171@name Type
172@{
173
174@typedef struct bt_stream bt_stream;
175
176@brief
177 Stream.
178
179@}
180*/
181
182/*!
183@name Creation
184@{
185*/
186
187/*!
188@brief
189 Creates a stream from the \bt_stream_cls \bt_p{stream_class} and
190 adds it to the \bt_trace \bt_p{trace}.
191
192This function instantiates \bt_p{stream_class}.
193
194@attention
195 @parblock
196 Only use this function if
197
198 @code
199 bt_stream_class_assigns_automatic_stream_id(stream_class)
200 @endcode
201
202 returns #BT_TRUE.
203
204 Otherwise, use bt_stream_create_with_id().
205 @endparblock
206
207On success, the returned stream has the following property values:
208
209<table>
210 <tr>
211 <th>Property
212 <th>Value
213 <tr>
214 <td>\ref api-tir-stream-prop-id "Numeric ID"
215 <td>Automatically assigned by \bt_p{stream_class} and \bt_p{trace}
216 <tr>
217 <td>\ref api-tir-stream-prop-name "Name"
218 <td>\em None
219 <tr>
220 <td>\ref api-tir-stream-prop-user-attrs "User attributes"
221 <td>Empty \bt_map_val
222</table>
223
224@param[in] stream_class
225 Stream class from which to create the stream.
226@param[in] trace
227 Trace to add the created stream to.
228
229@returns
230 New stream reference, or \c NULL on memory error.
231
232@bt_pre_not_null{stream_class}
233@pre
234 <code>bt_stream_class_assigns_automatic_stream_id(stream_class)</code>
235 returns #BT_TRUE.
236@bt_pre_not_null{trace}
237
238@bt_post_success_frozen{stream_class}
239@bt_post_success_frozen{trace}
240
241@sa bt_stream_create_with_id() &mdash;
242 Creates a stream with a specific numeric ID and adds it to a
243 trace.
244*/
b19ff26f 245extern bt_stream *bt_stream_create(bt_stream_class *stream_class,
4c81a2b7 246 bt_trace *trace) __BT_NOEXCEPT;
40f4ba76 247
43c59509
PP
248/*!
249@brief
250 Creates a stream with the numeric ID \bt_p{id}
251 from the \bt_stream_cls \bt_p{stream_class} and adds
252 it to the \bt_trace \bt_p{trace}.
253
254This function instantiates \bt_p{stream_class}.
255
256@attention
257 @parblock
258 Only use this function if
259
260 @code
261 bt_stream_class_assigns_automatic_stream_id(stream_class)
262 @endcode
263
264 returns #BT_FALSE.
265
266 Otherwise, use bt_stream_create().
267 @endparblock
268
269On success, the returned stream has the following property values:
270
271<table>
272 <tr>
273 <th>Property
274 <th>Value
275 <tr>
276 <td>\ref api-tir-stream-prop-id "Numeric ID"
277 <td>\bt_p{id}
278 <tr>
279 <td>\ref api-tir-stream-prop-name "Name"
280 <td>\em None
281 <tr>
282 <td>\ref api-tir-stream-prop-user-attrs "User attributes"
283 <td>Empty \bt_map_val
284</table>
285
286@param[in] stream_class
287 Stream class from which to create the stream.
288@param[in] trace
289 Trace to add the created stream to.
290@param[in] id
291 Numeric ID of the stream to create and add to \bt_p{trace}.
292
293@returns
294 New stream reference, or \c NULL on memory error.
295
296@bt_pre_not_null{stream_class}
297@pre
298 <code>bt_stream_class_assigns_automatic_stream_id(stream_class)</code>
299 returns #BT_FALSE.
300@bt_pre_not_null{trace}
301@pre
302 \bt_p{trace} does not contain an instance of \bt_p{stream_class}
303 with the numeric ID \bt_p{id}.
304
305@bt_post_success_frozen{stream_class}
306@bt_post_success_frozen{trace}
307
308@sa bt_stream_create() &mdash;
309 Creates a stream with an automatic numeric ID and adds it to a
310 trace.
311*/
b19ff26f
PP
312extern bt_stream *bt_stream_create_with_id(
313 bt_stream_class *stream_class,
4c81a2b7 314 bt_trace *trace, uint64_t id) __BT_NOEXCEPT;
862ca4ed 315
43c59509 316/*! @} */
c6962c96 317
43c59509
PP
318/*!
319@name Class access
320@{
321*/
c6962c96 322
43c59509
PP
323/*!
324@brief
325 Borrows the \ref api-tir-stream-cls "class" of the stream
326 \bt_p{stream}.
327
328@param[in] stream
329 Stream of which to borrow the class.
330
331@returns
332 \em Borrowed reference of the class of \bt_p{stream}.
333
334@bt_pre_not_null{stream}
44c440bc 335
43c59509
PP
336@sa bt_stream_borrow_class_const() &mdash;
337 \c const version of this function.
338*/
4c81a2b7 339extern bt_stream_class *bt_stream_borrow_class(bt_stream *stream) __BT_NOEXCEPT;
094ff7c0 340
43c59509
PP
341/*!
342@brief
343 Borrows the \ref api-tir-stream-cls "class" of the stream
344 \bt_p{stream} (\c const version).
345
346See bt_stream_borrow_class().
347*/
348extern const bt_stream_class *bt_stream_borrow_class_const(
4c81a2b7 349 const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
350
351/*! @} */
352
353/*!
354@name Trace access
355@{
356*/
357
358/*!
359@brief
360 Borrows the \bt_trace which contains the stream \bt_p{stream}.
361
362@param[in] stream
363 Stream of which to borrow the trace containing it.
364
365@returns
366 \em Borrowed reference of the trace containing \bt_p{stream}.
367
368@bt_pre_not_null{stream}
369
370@sa bt_stream_borrow_trace_const() &mdash;
371 \c const version of this function.
372*/
4c81a2b7 373extern bt_trace *bt_stream_borrow_trace(bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
374
375/*!
376@brief
377 Borrows the \bt_trace which contains the stream \bt_p{stream}
378 (\c const version).
379
380See bt_stream_borrow_trace().
381*/
382extern const bt_trace *bt_stream_borrow_trace_const(
4c81a2b7 383 const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
384
385/*! @} */
386
387/*!
388@name Properties
389@{
390*/
391
392/*!
393@brief
394 Returns the numeric ID of the stream \bt_p{stream}.
395
396See the \ref api-tir-stream-prop-id "numeric ID" property.
397
398@param[in] stream
399 Stream of which to get the numeric ID.
400
401@returns
402 Numeric ID of \bt_p{stream}.
403
404@bt_pre_not_null{stream}
405
406@sa bt_stream_create_with_id() &mdash;
407 Creates a stream with a specific numeric ID and adds it to a
408 trace.
409*/
4c81a2b7 410extern uint64_t bt_stream_get_id(const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
411
412/*!
413@brief
414 Status codes for bt_stream_set_name().
415*/
d24d5663 416typedef enum bt_stream_set_name_status {
43c59509
PP
417 /*!
418 @brief
419 Success.
420 */
d24d5663 421 BT_STREAM_SET_NAME_STATUS_OK = __BT_FUNC_STATUS_OK,
43c59509
PP
422
423 /*!
424 @brief
425 Out of memory.
426 */
427 BT_STREAM_SET_NAME_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR,
d24d5663
PP
428} bt_stream_set_name_status;
429
43c59509
PP
430/*!
431@brief
432 Sets the name of the stream \bt_p{stream} to
433 a copy of \bt_p{name}.
434
435See the \ref api-tir-stream-prop-name "name" property.
436
437@param[in] stream
438 Stream of which to set the name to \bt_p{name}.
439@param[in] name
440 New name of \bt_p{stream} (copied).
441
442@retval #BT_STREAM_CLASS_SET_NAME_STATUS_OK
443 Success.
444@retval #BT_STREAM_CLASS_SET_NAME_STATUS_MEMORY_ERROR
445 Out of memory.
446
447@bt_pre_not_null{stream}
448@bt_pre_hot{stream}
449@bt_pre_not_null{name}
450
451@sa bt_stream_get_name() &mdash;
452 Returns the name of a stream.
453*/
d24d5663 454extern bt_stream_set_name_status bt_stream_set_name(bt_stream *stream,
4c81a2b7 455 const char *name) __BT_NOEXCEPT;
c057dea0 456
43c59509
PP
457/*!
458@brief
459 Returns the name of the stream \bt_p{stream}.
460
461See the \ref api-tir-stream-prop-name "name" property.
462
463If \bt_p{stream} has no name, this function returns \c NULL.
464
465@param[in] stream
466 Stream of which to get the name.
467
468@returns
469 @parblock
470 Name of \bt_p{stream}, or \c NULL if none.
471
472 The returned pointer remains valid as long as \bt_p{stream}
473 is not modified.
474 @endparblock
475
476@bt_pre_not_null{stream}
477
478@sa bt_stream_class_set_name() &mdash;
479 Sets the name of a stream.
480*/
4c81a2b7 481extern const char *bt_stream_get_name(const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
482
483/*!
484@brief
485 Sets the user attributes of the stream \bt_p{stream} to
486 \bt_p{user_attributes}.
487
488See the \ref api-tir-stream-prop-user-attrs "user attributes"
489property.
490
491@note
492 When you create a default stream with bt_stream_create()
493 or bt_stream_create_with_id(), the stream's initial user
494 attributes is an empty \bt_map_val. Therefore you can borrow it with
495 bt_stream_borrow_user_attributes() and fill it directly
496 instead of setting a new one with this function.
497
498@param[in] stream
499 Stream of which to set the user attributes to
500 \bt_p{user_attributes}.
501@param[in] user_attributes
502 New user attributes of \bt_p{stream}.
503
504@bt_pre_not_null{stream}
505@bt_pre_hot{stream}
506@bt_pre_not_null{user_attributes}
507@bt_pre_is_map_val{user_attributes}
508
509@sa bt_stream_borrow_user_attributes() &mdash;
510 Borrows the user attributes of a stream.
511*/
512extern void bt_stream_set_user_attributes(
4c81a2b7
PP
513 bt_stream *stream, const bt_value *user_attributes)
514 __BT_NOEXCEPT;
43c59509
PP
515
516/*!
517@brief
518 Borrows the user attributes of the stream \bt_p{stream}.
519
520See the \ref api-tir-stream-prop-user-attrs "user attributes"
521property.
522
523@note
524 When you create a default stream with bt_stream_create()
525 or bt_stream_create_with_id(), the stream's initial user
526 attributes is an empty \bt_map_val.
527
528@param[in] stream
529 Stream from which to borrow the user attributes.
530
531@returns
532 User attributes of \bt_p{stream} (a \bt_map_val).
533
534@bt_pre_not_null{stream}
535
536@sa bt_stream_set_user_attributes() &mdash;
537 Sets the user attributes of a stream.
538@sa bt_stream_borrow_user_attributes_const() &mdash;
539 \c const version of this function.
540*/
4c81a2b7
PP
541extern bt_value *bt_stream_borrow_user_attributes(bt_stream *stream)
542 __BT_NOEXCEPT;
43c59509
PP
543
544/*!
545@brief
546 Borrows the user attributes of the stream \bt_p{stream}
547 (\c const version).
548
549See bt_stream_borrow_user_attributes().
550*/
551extern const bt_value *bt_stream_borrow_user_attributes_const(
4c81a2b7 552 const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
553
554/*! @} */
555
556/*!
557@name Reference count
558@{
559*/
560
561/*!
562@brief
563 Increments the \ref api-fund-shared-object "reference count" of
564 the stream \bt_p{stream}.
565
566@param[in] stream
567 @parblock
568 Stream of which to increment the reference count.
569
570 Can be \c NULL.
571 @endparblock
572
573@sa bt_stream_put_ref() &mdash;
574 Decrements the reference count of a stream.
575*/
4c81a2b7 576extern void bt_stream_get_ref(const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
577
578/*!
579@brief
580 Decrements the \ref api-fund-shared-object "reference count" of
581 the stream \bt_p{stream}.
582
583@param[in] stream
584 @parblock
585 Stream of which to decrement the reference count.
586
587 Can be \c NULL.
588 @endparblock
589
590@sa bt_stream_get_ref() &mdash;
591 Increments the reference count of a stream.
592*/
4c81a2b7 593extern void bt_stream_put_ref(const bt_stream *stream) __BT_NOEXCEPT;
43c59509
PP
594
595/*!
596@brief
597 Decrements the reference count of the stream
598 \bt_p{_stream}, and then sets \bt_p{_stream} to \c NULL.
599
600@param _stream
601 @parblock
602 Stream of which to decrement the reference count.
603
604 Can contain \c NULL.
605 @endparblock
606
607@bt_pre_assign_expr{_stream}
608*/
609#define BT_STREAM_PUT_REF_AND_RESET(_stream) \
610 do { \
611 bt_stream_put_ref(_stream); \
612 (_stream) = NULL; \
613 } while (0)
614
615/*!
616@brief
617 Decrements the reference count of the stream \bt_p{_dst}, sets
618 \bt_p{_dst} to \bt_p{_src}, and then sets \bt_p{_src} to \c NULL.
619
620This macro effectively moves a stream reference from the expression
621\bt_p{_src} to the expression \bt_p{_dst}, putting the existing
622\bt_p{_dst} reference.
623
624@param _dst
625 @parblock
626 Destination expression.
627
628 Can contain \c NULL.
629 @endparblock
630@param _src
631 @parblock
632 Source expression.
633
634 Can contain \c NULL.
635 @endparblock
636
637@bt_pre_assign_expr{_dst}
638@bt_pre_assign_expr{_src}
639*/
640#define BT_STREAM_MOVE_REF(_dst, _src) \
641 do { \
642 bt_stream_put_ref(_dst); \
643 (_dst) = (_src); \
644 (_src) = NULL; \
645 } while (0)
646
647/*! @} */
648
649/*! @} */
650
c057dea0
PP
651#ifdef __cplusplus
652}
653#endif
654
924dc299 655#endif /* BABELTRACE2_TRACE_IR_STREAM_H */
This page took 0.101612 seconds and 4 git commands to generate.