doc/api/libbabeltrace2/DoxygenLayout.xml: use `topics` tab
[babeltrace.git] / src / lib / graph / message / stream.c
... / ...
CommitLineData
1/*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
5 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
6 */
7
8#define BT_LOG_TAG "LIB/MSG-STREAM"
9#include "lib/logging.h"
10
11#include "lib/assert-cond.h"
12#include "compat/compiler.h"
13#include <babeltrace2/trace-ir/clock-snapshot.h>
14#include "lib/trace-ir/stream.h"
15#include <babeltrace2/trace-ir/stream-class.h>
16#include "lib/trace-ir/stream-class.h"
17#include <babeltrace2/graph/message.h>
18#include "common/assert.h"
19#include <inttypes.h>
20
21#include "stream.h"
22
23#define BT_ASSERT_PRE_DEV_MSG_IS_STREAM_BEGINNING(_msg) \
24 BT_ASSERT_PRE_DEV_MSG_HAS_TYPE("message", (_msg), \
25 "stream-beginning", BT_MESSAGE_TYPE_STREAM_BEGINNING)
26
27#define BT_ASSERT_PRE_DEV_MSG_IS_STREAM_END(_msg) \
28 BT_ASSERT_PRE_DEV_MSG_HAS_TYPE("message", (_msg), \
29 "stream-end", BT_MESSAGE_TYPE_STREAM_END)
30
31static
32void destroy_stream_message(struct bt_object *obj)
33{
34 struct bt_message_stream *message = (void *) obj;
35
36 BT_LIB_LOGD("Destroying stream message: %!+n", message);
37
38 if (message->default_cs) {
39 BT_LIB_LOGD("Putting default clock snapshot: %!+k",
40 message->default_cs);
41 bt_clock_snapshot_destroy(message->default_cs);
42 message->default_cs = NULL;
43 }
44
45 BT_LIB_LOGD("Putting stream: %!+s", message->stream);
46 BT_OBJECT_PUT_REF_AND_RESET(message->stream);
47 g_free(message);
48}
49
50static inline
51struct bt_message *create_stream_message(
52 struct bt_self_message_iterator *self_msg_iter,
53 struct bt_stream *stream, enum bt_message_type type,
54 const char *api_func)
55{
56 struct bt_message_stream *message;
57 struct bt_stream_class *stream_class;
58
59 BT_ASSERT_PRE_MSG_ITER_NON_NULL_FROM_FUNC(api_func, self_msg_iter);
60 BT_ASSERT_PRE_STREAM_NON_NULL_FROM_FUNC(api_func, stream);
61 stream_class = bt_stream_borrow_class(stream);
62 BT_ASSERT(stream_class);
63 BT_LIB_LOGD("Creating stream message object: "
64 "type=%s, %![stream-]+s, %![sc-]+S",
65 bt_common_message_type_string(type), stream, stream_class);
66 message = g_new0(struct bt_message_stream, 1);
67 if (!message) {
68 BT_LIB_LOGE_APPEND_CAUSE(
69 "Failed to allocate one stream message.");
70 goto error;
71 }
72
73 bt_message_init(&message->parent, type,
74 destroy_stream_message, NULL);
75 message->stream = stream;
76 bt_object_get_ref_no_null_check(message->stream);
77
78 if (stream_class->default_clock_class) {
79 message->default_cs = bt_clock_snapshot_create(
80 stream_class->default_clock_class);
81 if (!message->default_cs) {
82 goto error;
83 }
84 }
85
86 BT_LIB_LOGD("Created stream message object: "
87 "%![msg-]+n, %![stream-]+s, %![sc-]+S", message,
88 stream, stream_class);
89
90 goto end;
91
92error:
93 if (message) {
94 g_free(message);
95 message = NULL;
96 }
97
98end:
99 return &message->parent;
100}
101
102BT_EXPORT
103struct bt_message *bt_message_stream_beginning_create(
104 struct bt_self_message_iterator *self_msg_iter,
105 const struct bt_stream *stream)
106{
107 BT_ASSERT_PRE_DEV_NO_ERROR();
108
109 return create_stream_message(self_msg_iter, (void *) stream,
110 BT_MESSAGE_TYPE_STREAM_BEGINNING, __func__);
111}
112
113BT_EXPORT
114struct bt_message *bt_message_stream_end_create(
115 struct bt_self_message_iterator *self_msg_iter,
116 const struct bt_stream *stream)
117{
118 BT_ASSERT_PRE_DEV_NO_ERROR();
119
120 return create_stream_message(self_msg_iter, (void *) stream,
121 BT_MESSAGE_TYPE_STREAM_END, __func__);
122}
123
124static inline
125struct bt_stream *borrow_stream_message_stream(struct bt_message *message)
126{
127 struct bt_message_stream *stream_msg;
128
129 BT_ASSERT_DBG(message);
130 stream_msg = (void *) message;
131 return stream_msg->stream;
132}
133
134BT_EXPORT
135struct bt_stream *bt_message_stream_beginning_borrow_stream(
136 struct bt_message *message)
137{
138 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
139 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_BEGINNING(message);
140 return borrow_stream_message_stream(message);
141}
142
143BT_EXPORT
144struct bt_stream *bt_message_stream_end_borrow_stream(
145 struct bt_message *message)
146{
147 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
148 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_END(message);
149 return borrow_stream_message_stream(message);
150}
151
152BT_EXPORT
153const struct bt_stream *bt_message_stream_beginning_borrow_stream_const(
154 const struct bt_message *message)
155{
156 return bt_message_stream_beginning_borrow_stream(
157 (void *) message);
158}
159
160BT_EXPORT
161const struct bt_stream *bt_message_stream_end_borrow_stream_const(
162 const struct bt_message *message)
163{
164 return bt_message_stream_end_borrow_stream(
165 (void *) message);
166}
167
168static
169void set_stream_default_clock_snapshot(
170 struct bt_message *msg, uint64_t raw_value,
171 const char *api_func)
172{
173 struct bt_message_stream *stream_msg = (void *) msg;
174 struct bt_stream_class *sc;
175
176 BT_ASSERT(msg);
177 BT_ASSERT_PRE_DEV_HOT_FROM_FUNC(api_func, "message", msg,
178 "Message", ": %!+n", msg);
179 sc = stream_msg->stream->class;
180 BT_ASSERT(sc);
181 BT_ASSERT_PRE_MSG_SC_DEF_CLK_CLS_FROM_FUNC(api_func, msg, sc);
182 BT_ASSERT(stream_msg->default_cs);
183 bt_clock_snapshot_set_raw_value(stream_msg->default_cs, raw_value);
184 stream_msg->default_cs_state = BT_MESSAGE_STREAM_CLOCK_SNAPSHOT_STATE_KNOWN;
185 BT_LIB_LOGD("Set stream message's default clock snapshot: "
186 "%![msg-]+n, value=%" PRIu64, msg, raw_value);
187}
188
189BT_EXPORT
190void bt_message_stream_beginning_set_default_clock_snapshot(
191 struct bt_message *message, uint64_t raw_value)
192{
193 BT_ASSERT_PRE_MSG_NON_NULL(message);
194 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_BEGINNING(message);
195 set_stream_default_clock_snapshot(message, raw_value, __func__);
196}
197
198BT_EXPORT
199void bt_message_stream_end_set_default_clock_snapshot(
200 struct bt_message *message, uint64_t raw_value)
201{
202 BT_ASSERT_PRE_MSG_NON_NULL(message);
203 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_END(message);
204 return set_stream_default_clock_snapshot(message, raw_value, __func__);
205}
206
207static enum bt_message_stream_clock_snapshot_state
208borrow_stream_message_default_clock_snapshot_const(
209 const bt_message *msg, const bt_clock_snapshot **snapshot,
210 const char *api_func)
211{
212 struct bt_message_stream *stream_msg = (void *) msg;
213 struct bt_stream_class *sc;
214
215 BT_ASSERT_DBG(msg);
216 sc = stream_msg->stream->class;
217 BT_ASSERT_DBG(sc);
218 BT_ASSERT_PRE_DEV_MSG_SC_DEF_CLK_CLS_FROM_FUNC(api_func, msg, sc);
219 BT_ASSERT_DBG(stream_msg->default_cs);
220
221 *snapshot = stream_msg->default_cs;
222
223 return stream_msg->default_cs_state;
224}
225
226BT_EXPORT
227enum bt_message_stream_clock_snapshot_state
228bt_message_stream_beginning_borrow_default_clock_snapshot_const(
229 const bt_message *message, const bt_clock_snapshot **snapshot)
230{
231 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
232 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_BEGINNING(message);
233 return borrow_stream_message_default_clock_snapshot_const(
234 message, snapshot, __func__);
235}
236
237BT_EXPORT
238enum bt_message_stream_clock_snapshot_state
239bt_message_stream_end_borrow_default_clock_snapshot_const(
240 const bt_message *message, const bt_clock_snapshot **snapshot)
241{
242 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
243 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_END(message);
244 return borrow_stream_message_default_clock_snapshot_const(
245 message, snapshot, __func__);
246}
247
248static inline
249const struct bt_clock_class *
250borrow_stream_message_stream_class_default_clock_class(
251 const struct bt_message *msg)
252{
253 struct bt_message_stream *stream_msg = (void *) msg;
254
255 BT_ASSERT_DBG(msg);
256 return stream_msg->stream->class->default_clock_class;
257}
258
259BT_EXPORT
260const struct bt_clock_class *
261bt_message_stream_beginning_borrow_stream_class_default_clock_class_const(
262 const struct bt_message *msg)
263{
264 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
265 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_BEGINNING(msg);
266 return borrow_stream_message_stream_class_default_clock_class(msg);
267}
268
269BT_EXPORT
270const struct bt_clock_class *
271bt_message_stream_end_borrow_stream_class_default_clock_class_const(
272 const struct bt_message *msg)
273{
274 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
275 BT_ASSERT_PRE_DEV_MSG_IS_STREAM_END(msg);
276 return borrow_stream_message_stream_class_default_clock_class(msg);
277}
This page took 0.024058 seconds and 5 git commands to generate.