Visibility hidden by default
[babeltrace.git] / src / lib / trace-ir / event.h
CommitLineData
273b65be 1/*
0235b0db
MJ
2 * SPDX-License-Identifier: MIT
3 *
e2f7325d 4 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
de9dd397 5 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
273b65be
JG
6 */
7
0235b0db
MJ
8#ifndef BABELTRACE_TRACE_IR_EVENT_INTERNAL_H
9#define BABELTRACE_TRACE_IR_EVENT_INTERNAL_H
10
44c440bc 11/* Protection: this file uses BT_LIB_LOG*() macros directly */
7151fb67 12#ifndef BT_LIB_LOG_SUPPORTED
c2d9d9cf 13# error Please include "lib/logging.h" before including this file.
44c440bc
PP
14#endif
15
d98421f2 16#include "lib/assert-cond.h"
91d81473 17#include "common/macros.h"
3fadfbc0
MJ
18#include <babeltrace2/value.h>
19#include <babeltrace2/trace-ir/stream-class.h>
20#include <babeltrace2/trace-ir/stream.h>
3fadfbc0 21#include <babeltrace2/trace-ir/packet.h>
3fadfbc0 22#include <babeltrace2/trace-ir/field.h>
578e048b
MJ
23#include "lib/object.h"
24#include "common/assert.h"
273b65be 25#include <glib.h>
c4f23e30 26#include <stdbool.h>
273b65be 27
578e048b
MJ
28#include "event-class.h"
29#include "field.h"
30#include "field-wrapper.h"
31#include "packet.h"
32#include "stream.h"
33
bdb288b3
PP
34#define BT_ASSERT_PRE_DEV_EVENT_HOT(_event) \
35 BT_ASSERT_PRE_DEV_HOT(((const struct bt_event *) (_event)), \
40f4ba76 36 "Event", ": %!+e", (_event))
dc3fffef 37
cb6f1f7d 38struct bt_event {
83509119 39 struct bt_object base;
862ca4ed
PP
40
41 /* Owned by this */
cb6f1f7d 42 struct bt_event_class *class;
862ca4ed 43
26fc5aed 44 /* Owned by this (can be `NULL`) */
44c440bc 45 struct bt_packet *packet;
862ca4ed 46
26fc5aed
PP
47 /* Owned by this */
48 struct bt_stream *stream;
49
44c440bc
PP
50 struct bt_field *common_context_field;
51 struct bt_field *specific_context_field;
cb6f1f7d 52 struct bt_field *payload_field;
44c440bc 53 bool frozen;
273b65be
JG
54};
55
cb6f1f7d 56void bt_event_destroy(struct bt_event *event);
273b65be 57
cb6f1f7d 58struct bt_event *bt_event_new(struct bt_event_class *event_class);
4ce9f9d0 59
40f4ba76 60void _bt_event_set_is_frozen(const struct bt_event *event, bool is_frozen);
f6ccaed9
PP
61
62#ifdef BT_DEV_MODE
6c677fb5 63# define bt_event_set_is_frozen _bt_event_set_is_frozen
f6ccaed9 64#else
6c677fb5 65# define bt_event_set_is_frozen(_event, _is_frozen)
f6ccaed9
PP
66#endif
67
91d81473 68__attribute__((unused))
3dca2276 69static inline
cb6f1f7d 70void _bt_event_reset_dev_mode(struct bt_event *event)
3dca2276 71{
98b15851 72 BT_ASSERT_DBG(event);
312c056a 73
44c440bc
PP
74 if (event->common_context_field) {
75 bt_field_set_is_frozen(
76 event->common_context_field, false);
77 bt_field_reset(
78 event->common_context_field);
312c056a
PP
79 }
80
44c440bc
PP
81 if (event->specific_context_field) {
82 bt_field_set_is_frozen(
83 event->specific_context_field, false);
84 bt_field_reset(event->specific_context_field);
312c056a
PP
85 }
86
87 if (event->payload_field) {
44c440bc 88 bt_field_set_is_frozen(
cb6f1f7d 89 event->payload_field, false);
44c440bc 90 bt_field_reset(event->payload_field);
6c677fb5 91 }
6c677fb5
PP
92}
93
94#ifdef BT_DEV_MODE
95# define bt_event_reset_dev_mode _bt_event_reset_dev_mode
96#else
97# define bt_event_reset_dev_mode(_x)
98#endif
312c056a 99
6c677fb5
PP
100static inline
101void bt_event_reset(struct bt_event *event)
102{
98b15851 103 BT_ASSERT_DBG(event);
44c440bc 104 BT_LIB_LOGD("Resetting event: %!+e", event);
6c677fb5 105 bt_event_set_is_frozen(event, false);
6871026b 106 bt_object_put_ref_no_null_check(&event->stream->base);
26fc5aed
PP
107 event->stream = NULL;
108
109 if (event->packet) {
6871026b 110 bt_object_put_ref_no_null_check(&event->packet->base);
26fc5aed
PP
111 event->packet = NULL;
112 }
6c677fb5
PP
113}
114
115static inline
116void bt_event_recycle(struct bt_event *event)
117{
118 struct bt_event_class *event_class;
119
98b15851 120 BT_ASSERT_DBG(event);
6c677fb5
PP
121 BT_LIB_LOGD("Recycling event: %!+e", event);
122
123 /*
124 * Those are the important ordered steps:
125 *
126 * 1. Reset the event object (put any permanent reference it
127 * has, unfreeze it and its fields in developer mode, etc.),
128 * but do NOT put its class's reference. This event class
129 * contains the pool to which we're about to recycle this
130 * event object, so we must guarantee its existence thanks
131 * to this existing reference.
132 *
133 * 2. Move the event class reference to our `event_class`
134 * variable so that we can set the event's class member
135 * to NULL before recycling it. We CANNOT do this after
65300d60 136 * we put the event class reference because this bt_object_put_ref()
6c677fb5
PP
137 * could destroy the event class, also destroying its
138 * event pool, thus also destroying our event object (this
139 * would result in an invalid write access).
140 *
141 * 3. Recycle the event object.
142 *
143 * 4. Put our event class reference.
144 */
145 bt_event_reset(event);
cb6f1f7d 146 event_class = event->class;
98b15851 147 BT_ASSERT_DBG(event_class);
cb6f1f7d 148 event->class = NULL;
6c677fb5 149 bt_object_pool_recycle_object(&event_class->event_pool, event);
6871026b 150 bt_object_put_ref_no_null_check(&event_class->base);
6c677fb5
PP
151}
152
56e18c4c 153#endif /* BABELTRACE_TRACE_IR_EVENT_INTERNAL_H */
This page took 0.10759 seconds and 4 git commands to generate.