Add trimmer plug-in skeleton
[babeltrace.git] / include / babeltrace / ctf-ir / event.h
CommitLineData
adc315b8
JG
1#ifndef BABELTRACE_CTF_IR_EVENT_H
2#define BABELTRACE_CTF_IR_EVENT_H
3
4/*
5 * BabelTrace - CTF IR: Event
6 *
de9dd397 7 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
adc315b8
JG
8 *
9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
10 *
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:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
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
27 * SOFTWARE.
28 *
29 * The Common Trace Format (CTF) Specification is available at
30 * http://www.efficios.com/ctf
31 */
32
2f100782
JG
33#include <stdint.h>
34#include <stddef.h>
dac5c838 35#include <babeltrace/values.h>
2f100782 36
adc315b8
JG
37#ifdef __cplusplus
38extern "C" {
39#endif
40
5a1d009d
PP
41/**
42@defgroup ctfirevent CTF IR event
43@ingroup ctfir
44@brief CTF IR event.
45
6dd2bd0c
PP
46@code
47#include <babeltrace/ctf-ir/event.h>
48@endcode
49
5a1d009d
PP
50A CTF IR <strong><em>event</em></strong> is a container of event
51fields:
52
53- <strong>Stream event header</strong> field, described by the
54 <em>stream event header field type</em> of a
55 \link ctfirstreamclass CTF IR stream class\endlink.
56- <strong>Stream event context</strong> field, described by the
57 <em>stream event context field type</em> of a stream class.
58- <strong>Event context</strong> field, described by the
59 <em>event context field type</em> of a
60 \link ctfireventclass CTF IR event class\endlink.
61- <strong>Event payload</strong>, described by the
62 <em>event payload field type</em> of an event class.
63
64As a reminder, here's the structure of a CTF packet:
65
66@imgpacketstructure
67
68You can create a CTF IR event \em from a
69\link ctfireventclass CTF IR event class\endlink with
70bt_ctf_event_create(). The event class you use to create an event
71object becomes its parent.
72
73If the \link ctfirtraceclass CTF IR trace class\endlink of an event
74object (parent of its \link ctfirstreamclass CTF IR stream class\endlink,
75which is the parent of its event class) was created by a
76\link ctfirwriter CTF IR writer\endlink object, then the only possible
77action you can do with this event object is to append it to a
78\link ctfirstream CTF IR stream\endlink with
79bt_ctf_stream_append_event(). Otherwise, you can create an event
80notification with bt_notification_event_create(). The event you pass
81to this function \em must have an attached packet object first.
82
83You can attach a \link ctfirpacket CTF IR packet object\endlink to an
84event object with bt_ctf_event_set_packet().
85
86A CTF IR event has a mapping of
87\link ctfirclockvalue CTF IR clock values\endlink. A clock value is
88an instance of a specific
89\link ctfirclockclass CTF IR clock class\endlink when the event is
90emitted. You can set an event object's clock value with
91bt_ctf_event_set_clock_value().
92
93As with any Babeltrace object, CTF IR event objects have
94<a href="https://en.wikipedia.org/wiki/Reference_counting">reference
95counts</a>. See \ref refs to learn more about the reference counting
96management of Babeltrace objects.
97
98bt_notification_event_create() \em freezes its event parameter on
99success. You cannot modify a frozen event object: it is considered
100immutable, except for \link refs reference counting\endlink.
101
102@sa ctfireventclass
103@sa ctfirpacket
104
105@file
106@brief CTF IR event type and functions.
107@sa ctfirevent
108
109@addtogroup ctfirevent
110@{
111*/
112
113/**
114@struct bt_ctf_event
115@brief A CTF IR event.
116@sa ctfirevent
117*/
118struct bt_ctf_event;
1556a1af
JG
119struct bt_ctf_clock;
120struct bt_ctf_clock_value;
adc315b8 121struct bt_ctf_event_class;
adc315b8
JG
122struct bt_ctf_field;
123struct bt_ctf_field_type;
2f100782 124struct bt_ctf_stream_class;
5c3b707d 125struct bt_ctf_packet;
adc315b8 126
5a1d009d
PP
127/**
128@name Creation and parent access functions
129@{
130*/
131
132/**
133@brief Creates a default CTF IR event from the CTF IR event class
134 \p event_class.
135
136\p event_class \em must have a parent
137\link ctfirstreamclass CTF IR stream class\endlink.
138
139On success, the four fields of the created event object are not set. You
140can set them with bt_ctf_event_set_header(),
141bt_ctf_event_set_stream_event_context(),
142bt_ctf_event_set_event_context(), and bt_ctf_event_set_payload_field().
143
4cdafd51
PP
144This function tries to resolve the needed
145\link ctfirfieldtypes CTF IR field type\endlink of the dynamic field
146types that are found anywhere in the context or payload field
147types of \p event_class and in the root field types of the
148parent stream class of \p event_class. If any automatic resolving fails,
149this function fails. This means that, if any dynamic field type need
150a field type which should be found in the trace packet header root
151field type, and if the parent stream class of \p event_class was not
152added to a \link ctfirtraceclass CTF IR trace class\endlink yet
153with bt_ctf_trace_add_stream_class(), then this function fails.
154
5a1d009d
PP
155@param[in] event_class CTF IR event class to use to create the
156 CTF IR event.
157@returns Created event object, or \c NULL on error.
158
159@prenotnull{event_class}
160@pre \p event_class has a parent stream class.
161@postsuccessrefcountret1
162*/
adc315b8
JG
163extern struct bt_ctf_event *bt_ctf_event_create(
164 struct bt_ctf_event_class *event_class);
165
5a1d009d
PP
166/**
167@brief Returns the parent CTF IR event class of the CTF IR event
168 \p event.
169
170This function returns a reference to the event class which was used to
171create the event object in the first place with bt_ctf_event_create().
172
173@param[in] event Event of which to get the parent event class.
174@returns Parent event class of \p event,
175 or \c NULL on error.
176
177@prenotnull{event}
c2f29fb9 178@postrefcountsame{event}
5a1d009d
PP
179@postsuccessrefcountretinc
180*/
2f100782
JG
181extern struct bt_ctf_event_class *bt_ctf_event_get_class(
182 struct bt_ctf_event *event);
183
5a1d009d
PP
184/**
185@brief Returns the CTF IR packet associated to the CTF IR event
186 \p event.
187
188This function returns a reference to the event class which was set to
189\p event in the first place with bt_ctf_event_set_packet().
190
191@param[in] event Event of which to get the associated packet.
192@returns Packet associated to \p event,
193 or \c NULL if no packet is associated to
194 \p event or on error.
195
196@prenotnull{event}
c2f29fb9 197@postrefcountsame{event}
5a1d009d
PP
198@postsuccessrefcountretinc
199
200@sa bt_ctf_event_set_packet(): Associates a given event to a given
201 packet.
202*/
203extern struct bt_ctf_packet *bt_ctf_event_get_packet(
204 struct bt_ctf_event *event);
205
206/**
207@brief Associates the CTF IR event \p event to the CTF IR packet
208 \p packet.
209
210The \link ctfirstreamclass CTF IR stream class\endlink of the
211parent \link ctfirstream CTF IR stream\endlink of \p packet \em must
212be the same as the parent stream class of the
213\link ctfireventclass CTF IR event class\endlink returned
214by bt_ctf_event_get_class() for \p event.
215
216You \em must call this function to create an event-packet association
217before you call bt_notification_event_create() with \p event.
218
219On success, this function also sets the parent stream object of
220\p event to the parent stream of \p packet.
221
222@param[in] event Event to which to associate \p packet.
7113dedb 223@param[in] packet Packet to associate to \p event.
5a1d009d
PP
224@returns 0 on success, or a negative value on error.
225
226@prenotnull{event}
227@prenotnull{packet}
228@prehot{event}
229@pre The parent stream class of \p packet is the same as the parent
230 stream class of \p event.
231@postsuccessrefcountretinc
232
233@sa bt_ctf_event_get_packet(): Returns the associated packet of a
234 given event object.
235*/
236extern int bt_ctf_event_set_packet(struct bt_ctf_event *event,
237 struct bt_ctf_packet *packet);
238
239/**
240@brief Returns the parent CTF IR stream associated to the CTF IR event
241 \p event.
242
243@param[in] event Event of which to get the parent stream.
244@returns Parent stream of \p event, or \c NULL on error.
245
246@prenotnull{event}
c2f29fb9 247@postrefcountsame{event}
5a1d009d
PP
248@postsuccessrefcountretinc
249*/
8e5003bb
JG
250extern struct bt_ctf_stream *bt_ctf_event_get_stream(
251 struct bt_ctf_event *event);
252
5a1d009d
PP
253/** @} */
254
255/**
256@name Contained fields functions
257@{
258*/
259
260/**
261@brief Returns the stream event header field of the CTF IR event
262 \p event.
263
264@param[in] event Event of which to get the stream event header
265 field.
266@returns Stream event header field of \p event,
267 or \c NULL if the stream event header
268 field is not set or on error.
269
270@prenotnull{event}
c2f29fb9 271@postrefcountsame{event}
5a1d009d
PP
272@postsuccessrefcountretinc
273
274@sa bt_ctf_event_get_header(): Sets the stream event header
275 field of a given event.
276*/
277extern struct bt_ctf_field *bt_ctf_event_get_header(
278 struct bt_ctf_event *event);
279
280/**
281@brief Sets the stream event header field of the CTF IR event
6b783f49
JG
282 \p event to \p header, or unsets the current stream event header field
283 from \p event.
5a1d009d 284
6b783f49
JG
285If \p header is not \c NULL, the field type of \p header, as returned by
286bt_ctf_field_get_type(), \em must be equivalent to the field type returned by
5a1d009d
PP
287bt_ctf_stream_class_get_event_header_type() for the parent stream class
288of \p event.
289
290@param[in] event Event of which to set the stream event header
291 field.
292@param[in] header Stream event header field.
293@returns 0 on success, or a negative value on error.
294
295@prenotnull{event}
5a1d009d 296@prehot{event}
6b783f49
JG
297@pre <strong>\p header, if not \c NULL</strong>, has a field type equivalent to
298 the field type returned by bt_ctf_stream_class_get_event_header_type()
299 for the parent stream class of \p event.
5a1d009d 300@postrefcountsame{event}
6b783f49
JG
301@post <strong>On success, if \p header is not \c NULL</strong>,
302 the reference count of \p header is incremented.
5a1d009d
PP
303
304@sa bt_ctf_event_get_header(): Returns the stream event header field
305 of a given event.
306*/
307extern int bt_ctf_event_set_header(struct bt_ctf_event *event,
308 struct bt_ctf_field *header);
309
310/**
311@brief Returns the stream event context field of the CTF IR event
312 \p event.
313
314@param[in] event Event of which to get the stream event context
315 field.
316@returns Stream event context field of \p event,
317 or \c NULL if the stream event context
318 field is not set or on error.
319
320@prenotnull{event}
c2f29fb9 321@postrefcountsame{event}
5a1d009d
PP
322@postsuccessrefcountretinc
323
6b783f49
JG
324@sa bt_ctf_event_set_stream_event_context(): Sets the stream event context
325 field of a given event.
5a1d009d
PP
326*/
327extern struct bt_ctf_field *bt_ctf_event_get_stream_event_context(
328 struct bt_ctf_event *event);
329
330/**
331@brief Sets the stream event context field of the CTF IR event
6b783f49
JG
332 \p event to \p context, or unsets the current stream event context field
333 from \p event.
5a1d009d 334
6b783f49
JG
335If \p context is not \c NULL, the field type of \p context, as returned by
336bt_ctf_field_get_type(), \em must be equivalent to the field type returned by
5a1d009d
PP
337bt_ctf_stream_class_get_event_context_type() for the parent stream class
338of \p event.
339
6b783f49 340@param[in] event Event of which to set the stream event context field.
5a1d009d
PP
341@param[in] context Stream event context field.
342@returns 0 on success, or a negative value on error.
343
344@prenotnull{event}
5a1d009d 345@prehot{event}
6b783f49
JG
346@pre <strong>\p context, if not \c NULL</strong>, has a field type equivalent to
347 the field type returned by bt_ctf_stream_class_get_event_context_type()
348 for the parent stream class of \p event.
5a1d009d 349@postrefcountsame{event}
6b783f49
JG
350@post <strong>On success, if \p context is not \c NULL</strong>, the reference
351 count of \p context is incremented.
5a1d009d 352
6b783f49
JG
353@sa bt_ctf_event_get_stream_event_context(): Returns the stream event context
354 field of a given event.
5a1d009d
PP
355*/
356extern int bt_ctf_event_set_stream_event_context(struct bt_ctf_event *event,
357 struct bt_ctf_field *context);
358
359/**
6b783f49 360@brief Returns the event context field of the CTF IR event \p event.
5a1d009d 361
6b783f49
JG
362@param[in] event Event of which to get the context field.
363@returns Event context field of \p event, or \c NULL if the
364 event context field is not set or on error.
5a1d009d
PP
365
366@prenotnull{event}
c2f29fb9 367@postrefcountsame{event}
5a1d009d
PP
368@postsuccessrefcountretinc
369
6b783f49
JG
370@sa bt_ctf_event_set_event_context(): Sets the event context field of a given
371 event.
5a1d009d
PP
372*/
373extern struct bt_ctf_field *bt_ctf_event_get_event_context(
374 struct bt_ctf_event *event);
375
376/**
6b783f49
JG
377@brief Sets the event context field of the CTF IR event \p event to \p context,
378 or unsets the current event context field from \p event.
5a1d009d 379
6b783f49
JG
380If \p context is not \c NULL, the field type of \p context, as returned by
381bt_ctf_field_get_type(), \em must be equivalent to the field type returned by
382bt_ctf_event_class_get_context_type() for the parent class of \p event.
5a1d009d 383
6b783f49 384@param[in] event Event of which to set the context field.
5a1d009d
PP
385@param[in] context Event context field.
386@returns 0 on success, or a negative value on error.
387
388@prenotnull{event}
5a1d009d 389@prehot{event}
6b783f49
JG
390@pre <strong>\p context, if not \c NULL</strong>, has a field type equivalent to
391 the field type returned by bt_ctf_event_class_get_context_type() for the
392 parent class of \p event.
5a1d009d 393@postrefcountsame{event}
6b783f49
JG
394@post <strong>On success, if \p context is not \c NULL</strong>, the reference
395 count of \p context is incremented.
5a1d009d 396
6b783f49 397@sa bt_ctf_event_get_context(): Returns the context field of a given event.
5a1d009d
PP
398*/
399extern int bt_ctf_event_set_event_context(struct bt_ctf_event *event,
400 struct bt_ctf_field *context);
401
402/**
6b783f49 403@brief Returns the payload field of the CTF IR event \p event.
5a1d009d 404
6b783f49
JG
405@param[in] event Event of which to get the payload field.
406@returns Payload field of \p event, or \c NULL if the payload
407 field is not set or on error.
5a1d009d
PP
408
409@prenotnull{event}
c2f29fb9 410@postrefcountsame{event}
5a1d009d
PP
411@postsuccessrefcountretinc
412
6b783f49
JG
413@sa bt_ctf_event_set_payload_field(): Sets the payload field of a given
414 event.
5a1d009d 415*/
71362d53
PP
416extern struct bt_ctf_field *bt_ctf_event_get_payload_field(
417 struct bt_ctf_event *event);
418
5a1d009d 419/**
6b783f49
JG
420@brief Sets the payload field of the CTF IR event \p event to \p payload,
421 or unsets the current event payload field from \p event.
5a1d009d 422
6b783f49
JG
423If \p payload is not \c NULL, the field type of \p payload, as returned by
424bt_ctf_field_get_type(), \em must be equivalent to the field type returned by
425bt_ctf_event_class_get_payload_type() for the parent class of \p event.
5a1d009d 426
6b783f49 427@param[in] event Event of which to set the payload field.
5a1d009d
PP
428@param[in] payload Event payload field.
429@returns 0 on success, or a negative value on error.
430
431@prenotnull{event}
5a1d009d 432@prehot{event}
6b783f49
JG
433@pre <strong>\p payload, if not \c NULL</strong>, has a field type equivalent to
434 the field typereturned by bt_ctf_event_class_get_payload_type() for the
435 parent class of \p event.
5a1d009d 436@postrefcountsame{event}
6b783f49
JG
437@post <strong>On success, if \p payload is not \c NULL</strong>, the reference
438 count of \p payload is incremented.
5a1d009d 439
6b783f49 440@sa bt_ctf_event_get_payload(): Returns the payload field of a given event.
5a1d009d 441*/
e5e6eb3a
JG
442extern int bt_ctf_event_set_payload_field(struct bt_ctf_event *event,
443 struct bt_ctf_field *payload);
444
76acdb71 445/** @cond DOCUMENT */
5a1d009d 446
2f100782 447/*
5a1d009d
PP
448 * TODO: Doxygenize.
449 *
2f100782
JG
450 * bt_ctf_event_get_payload: get an event's field.
451 *
51865548 452 * Returns the field matching "name". bt_put() must be called on the
2f100782
JG
453 * returned value.
454 *
455 * @param event Event instance.
c5a9aa19 456 * @param name Event field name, see notes.
2f100782
JG
457 *
458 * Returns a field instance on success, NULL on error.
c5a9aa19
JG
459 *
460 * Note: Passing a name will cause the function to perform a look-up by
461 * name assuming the event's payload is a structure. This will return
462 * the raw payload instance if name is NULL.
2f100782
JG
463 */
464extern struct bt_ctf_field *bt_ctf_event_get_payload(struct bt_ctf_event *event,
465 const char *name);
466
adc315b8 467/*
5a1d009d 468 * TODO: Doxygenize.
c5a9aa19 469 *
2f100782 470 * bt_ctf_event_get_payload_by_index: Get event's field by index.
adc315b8 471 *
51865548 472 * Returns the field associated with the provided index. bt_put()
2f100782
JG
473 * must be called on the returned value. The indexes to be provided are
474 * the same as can be retrieved from the event class.
adc315b8 475 *
2f100782
JG
476 * @param event Event.
477 * @param index Index of field.
adc315b8 478 *
2f100782 479 * Returns the event's field, NULL on error.
c5a9aa19
JG
480 *
481 * Note: Will return an error if the payload's type is not a structure.
adc315b8 482 */
2f100782 483extern struct bt_ctf_field *bt_ctf_event_get_payload_by_index(
074ee56d 484 struct bt_ctf_event *event, int index);
adc315b8 485
662e778c 486/*
5a1d009d 487 * TODO: Doxygenize.
662e778c 488 *
5a1d009d 489 * bt_ctf_event_set_payload: set an event's field.
662e778c 490 *
5a1d009d
PP
491 * Set a manually allocated field as an event's payload. The event will share
492 * the field's ownership by using its reference count.
493 * bt_put() must be called on the returned value.
662e778c
JG
494 *
495 * @param event Event instance.
5a1d009d
PP
496 * @param name Event field name, see notes.
497 * @param value Instance of a field whose type corresponds to the event's field.
f655a84d 498 *
5a1d009d 499 * Returns 0 on success, a negative value on error.
f655a84d 500 *
5a1d009d
PP
501 * Note: The function will return an error if a name is provided and the payload
502 * type is not a structure. If name is NULL, the payload field will be set
503 * directly and must match the event class' payload's type.
f655a84d 504 */
5a1d009d
PP
505extern int bt_ctf_event_set_payload(struct bt_ctf_event *event,
506 const char *name,
507 struct bt_ctf_field *value);
f655a84d 508
76acdb71 509/** @endcond */
f655a84d 510
5a1d009d 511/** @} */
5fd2e9fd 512
5a1d009d
PP
513/**
514@name Clock value functions
515@{
516*/
5fd2e9fd 517
5a1d009d
PP
518/**
519@brief Returns the value, as of the CTF IR event \p event, of the
520 clock described by the
521 \link ctfirclockclass CTF IR clock class\endlink \p clock_class.
5c0f40f4 522
5a1d009d
PP
523@param[in] event Event of which to get the value of the clock
524 described by \p clock_class.
525@param[in] clock_class Class of the clock of which to get the value.
526@returns Value of the clock described by \p clock_class
527 as of \p event.
5c3b707d 528
5a1d009d
PP
529@prenotnull{event}
530@prenotnull{clock_class}
531@postrefcountsame{event}
532@postrefcountsame{clock_class}
533@postsuccessrefcountretinc
534
535@sa bt_ctf_event_set_clock_value(): Sets the clock value of a given event.
536*/
1556a1af 537extern struct bt_ctf_clock_value *bt_ctf_event_get_clock_value(
5a1d009d
PP
538 struct bt_ctf_event *event, struct bt_ctf_clock *clock_class);
539
540/**
541@brief Sets the value, as of the CTF IR event \p event, of the
542 clock described by the
543 \link ctfirclockclass CTF IR clock class\endlink \p clock_class.
544
545@param[in] event Event of which to set the value of the clock
546 described by \p clock_class.
547@param[in] clock_class Class of the clock of which to set the value
548 for \p event.
549@param[in] clock_value Value of the clock described by \p clock_class
550 as of \p event.
551@returns 0 on success, or a negative value on error.
1556a1af 552
5a1d009d
PP
553@prenotnull{event}
554@prenotnull{clock_class}
555@prenotnull{clock_value}
556@prehot{event}
557@postrefcountsame{event}
558@postrefcountsame{clock_class}
559
560@sa bt_ctf_event_get_clock_value(): Returns the clock value of
561 a given event.
562*/
1556a1af 563extern int bt_ctf_event_set_clock_value(
5a1d009d
PP
564 struct bt_ctf_event *event, struct bt_ctf_clock *clock_class,
565 struct bt_ctf_clock_value *clock_value);
566
567/** @} */
568
569/** @} */
41ac640a 570
adc315b8
JG
571#ifdef __cplusplus
572}
573#endif
574
575#endif /* BABELTRACE_CTF_IR_EVENT_H */
This page took 0.056471 seconds and 4 git commands to generate.