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