lib: assign a unique ID to each pre/postcond. and report it on failure
[babeltrace.git] / src / lib / graph / message / packet.c
CommitLineData
d6e69534 1/*
0235b0db
MJ
2 * SPDX-License-Identifier: MIT
3 *
d6e69534
PP
4 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
5 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
d6e69534
PP
6 */
7
350ad6c1 8#define BT_LOG_TAG "LIB/MSG-PACKET"
c2d9d9cf 9#include "lib/logging.h"
d6e69534 10
c4f23e30
FD
11#include <stdbool.h>
12
d98421f2 13#include "lib/assert-cond.h"
578e048b 14#include "compat/compiler.h"
3fadfbc0 15#include <babeltrace2/trace-ir/packet.h>
578e048b 16#include "lib/trace-ir/packet.h"
3fadfbc0
MJ
17#include <babeltrace2/trace-ir/stream-class.h>
18#include <babeltrace2/trace-ir/stream.h>
578e048b
MJ
19#include "lib/trace-ir/stream.h"
20#include "lib/trace-ir/stream-class.h"
21#include "lib/graph/graph.h"
43c59509 22#include <babeltrace2/graph/message.h>
578e048b 23#include "common/assert.h"
578e048b 24#include "lib/object.h"
d6e69534
PP
25#include <inttypes.h>
26
578e048b
MJ
27#include "packet.h"
28
1778c2a4
PP
29#define BT_ASSERT_PRE_DEV_MSG_IS_PACKET_BEGINNING(_msg) \
30 BT_ASSERT_PRE_DEV_MSG_HAS_TYPE("message", (_msg), \
31 "packet-beginning", BT_MESSAGE_TYPE_PACKET_BEGINNING)
32
33#define BT_ASSERT_PRE_DEV_MSG_IS_PACKET_END(_msg) \
34 BT_ASSERT_PRE_DEV_MSG_HAS_TYPE("message", (_msg), \
35 "packet-end", BT_MESSAGE_TYPE_PACKET_END)
36
5df26c89
PP
37static inline
38struct bt_message *new_packet_message(struct bt_graph *graph,
39 enum bt_message_type type, bt_object_release_func recycle_func)
d6e69534 40{
5df26c89 41 struct bt_message_packet *message;
d6e69534 42
5df26c89 43 message = g_new0(struct bt_message_packet, 1);
d6e69534 44 if (!message) {
870631a2
PP
45 BT_LIB_LOGE_APPEND_CAUSE(
46 "Failed to allocate one packet message.");
d6e69534
PP
47 goto error;
48 }
49
5df26c89 50 bt_message_init(&message->parent, type, recycle_func, graph);
d6e69534
PP
51 goto end;
52
53error:
54 BT_OBJECT_PUT_REF_AND_RESET(message);
55
56end:
57 return (void *) message;
58}
59
5df26c89
PP
60BT_HIDDEN
61struct bt_message *bt_message_packet_beginning_new(struct bt_graph *graph)
d6e69534 62{
5df26c89
PP
63 return new_packet_message(graph, BT_MESSAGE_TYPE_PACKET_BEGINNING,
64 (bt_object_release_func) bt_message_packet_beginning_recycle);
65}
66
67BT_HIDDEN
68struct bt_message *bt_message_packet_end_new(struct bt_graph *graph)
69{
70 return new_packet_message(graph, BT_MESSAGE_TYPE_PACKET_END,
71 (bt_object_release_func) bt_message_packet_end_recycle);
72}
73
74static inline
a6d85d2f 75struct bt_message *create_packet_message(
9a2c8b8e 76 struct bt_message_iterator *msg_iter,
a6d85d2f 77 struct bt_packet *packet, struct bt_object_pool *pool,
1778c2a4 78 bool with_cs, uint64_t raw_value, const char *api_func)
5df26c89
PP
79{
80 struct bt_message_packet *message = NULL;
d6e69534
PP
81 struct bt_stream *stream;
82 struct bt_stream_class *stream_class;
8cc5f12b 83 bool need_cs;
d6e69534 84
5df26c89 85 BT_ASSERT(msg_iter);
1778c2a4 86 BT_ASSERT_PRE_PACKET_NON_NULL_FROM_FUNC(api_func, packet);
d6e69534
PP
87 stream = bt_packet_borrow_stream(packet);
88 BT_ASSERT(stream);
89 stream_class = bt_stream_borrow_class(stream);
90 BT_ASSERT(stream_class);
649934d2 91
26fc5aed
PP
92 /*
93 * It's not possible to create a packet from a stream of which
94 * the class indicates that packets are not supported.
95 */
96 BT_ASSERT(stream_class->supports_packets);
97
83a5656a 98 if (pool == &msg_iter->graph->packet_begin_msg_pool) {
8cc5f12b 99 need_cs = stream_class->packets_have_beginning_default_clock_snapshot;
649934d2 100 } else {
8cc5f12b 101 need_cs = stream_class->packets_have_end_default_clock_snapshot;
649934d2
PP
102 }
103
104 /*
105 * `packet_has_default_clock_snapshot` implies that the stream
106 * class has a default clock class (precondition).
107 */
1778c2a4
PP
108 BT_ASSERT_PRE_FROM_FUNC(api_func, "with-default-clock-snapshot",
109 need_cs ? with_cs : true,
7fe92073 110 "Unexpected stream class configuration when creating "
8cc5f12b
PP
111 "a packet beginning or end message: "
112 "a default clock snapshot is needed, but none was provided: "
113 "%![stream-]+s, %![sc-]+S, with-cs=%d, "
114 "cs-val=%" PRIu64,
115 stream, stream_class, with_cs, raw_value);
1778c2a4
PP
116 BT_ASSERT_PRE_FROM_FUNC(api_func, "without-default-clock-snapshot",
117 !need_cs ? !with_cs : true,
8cc5f12b
PP
118 "Unexpected stream class configuration when creating "
119 "a packet beginning or end message: "
120 "no default clock snapshot is needed, but one was provided: "
a6d85d2f
PP
121 "%![stream-]+s, %![sc-]+S, with-cs=%d, "
122 "cs-val=%" PRIu64,
123 stream, stream_class, with_cs, raw_value);
5df26c89 124 BT_LIB_LOGD("Creating packet message object: "
d6e69534
PP
125 "%![packet-]+a, %![stream-]+s, %![sc-]+S",
126 packet, stream, stream_class);
5df26c89 127 message = (void *) bt_message_create_from_pool(pool, msg_iter->graph);
d6e69534
PP
128 if (!message) {
129 /* bt_message_create_from_pool() logs errors */
130 goto end;
131 }
132
a6d85d2f
PP
133 if (with_cs) {
134 BT_ASSERT(stream_class->default_clock_class);
135 message->default_cs = bt_clock_snapshot_create(
136 stream_class->default_clock_class);
137 if (!message->default_cs) {
6871026b 138 bt_object_put_ref_no_null_check(message);
a6d85d2f
PP
139 message = NULL;
140 goto end;
141 }
142
143 bt_clock_snapshot_set_raw_value(message->default_cs, raw_value);
144 }
145
d6e69534
PP
146 BT_ASSERT(!message->packet);
147 message->packet = packet;
6871026b 148 bt_object_get_ref_no_null_check_no_parent_check(
d6e69534
PP
149 &message->packet->base);
150 bt_packet_set_is_frozen(packet, true);
5df26c89 151 BT_LIB_LOGD("Created packet message object: "
d6e69534
PP
152 "%![msg-]+n, %![packet-]+a, %![stream-]+s, %![sc-]+S",
153 message, packet, stream, stream_class);
154 goto end;
155
156end:
157 return (void *) message;
158}
159
5df26c89
PP
160struct bt_message *bt_message_packet_beginning_create(
161 struct bt_self_message_iterator *self_msg_iter,
58085ca4 162 const struct bt_packet *packet)
d6e69534 163{
9a2c8b8e 164 struct bt_message_iterator *msg_iter =
5df26c89 165 (void *) self_msg_iter;
d6e69534 166
17f3083a 167 BT_ASSERT_PRE_DEV_NO_ERROR();
d5b13b9b 168 BT_ASSERT_PRE_MSG_ITER_NON_NULL(msg_iter);
a6d85d2f 169 return create_packet_message(msg_iter, (void *) packet,
1778c2a4 170 &msg_iter->graph->packet_begin_msg_pool, false, 0, __func__);
a6d85d2f
PP
171}
172
173struct bt_message *bt_message_packet_beginning_create_with_default_clock_snapshot(
174 struct bt_self_message_iterator *self_msg_iter,
175 const struct bt_packet *packet, uint64_t raw_value)
176{
9a2c8b8e 177 struct bt_message_iterator *msg_iter =
a6d85d2f
PP
178 (void *) self_msg_iter;
179
17f3083a 180 BT_ASSERT_PRE_DEV_NO_ERROR();
d5b13b9b 181 BT_ASSERT_PRE_MSG_ITER_NON_NULL(msg_iter);
a6d85d2f 182 return create_packet_message(msg_iter, (void *) packet,
1778c2a4
PP
183 &msg_iter->graph->packet_begin_msg_pool, true, raw_value,
184 __func__);
d6e69534
PP
185}
186
5df26c89
PP
187struct bt_message *bt_message_packet_end_create(
188 struct bt_self_message_iterator *self_msg_iter,
58085ca4 189 const struct bt_packet *packet)
d6e69534 190{
9a2c8b8e 191 struct bt_message_iterator *msg_iter =
5df26c89 192 (void *) self_msg_iter;
d6e69534 193
17f3083a 194 BT_ASSERT_PRE_DEV_NO_ERROR();
d5b13b9b 195 BT_ASSERT_PRE_MSG_ITER_NON_NULL(msg_iter);
a6d85d2f 196 return create_packet_message(msg_iter, (void *) packet,
1778c2a4 197 &msg_iter->graph->packet_end_msg_pool, false, 0, __func__);
a6d85d2f
PP
198}
199
200struct bt_message *bt_message_packet_end_create_with_default_clock_snapshot(
201 struct bt_self_message_iterator *self_msg_iter,
202 const struct bt_packet *packet, uint64_t raw_value)
203{
9a2c8b8e 204 struct bt_message_iterator *msg_iter =
a6d85d2f
PP
205 (void *) self_msg_iter;
206
17f3083a 207 BT_ASSERT_PRE_DEV_NO_ERROR();
d5b13b9b 208 BT_ASSERT_PRE_MSG_ITER_NON_NULL(msg_iter);
a6d85d2f 209 return create_packet_message(msg_iter, (void *) packet,
1778c2a4
PP
210 &msg_iter->graph->packet_end_msg_pool, true, raw_value,
211 __func__);
d6e69534
PP
212}
213
5df26c89
PP
214BT_HIDDEN
215void bt_message_packet_destroy(struct bt_message *msg)
d6e69534 216{
5df26c89 217 struct bt_message_packet *packet_msg = (void *) msg;
d6e69534 218
5df26c89
PP
219 BT_LIB_LOGD("Destroying packet message: %!+n", msg);
220 BT_LIB_LOGD("Putting packet: %!+a", packet_msg->packet);
221 BT_OBJECT_PUT_REF_AND_RESET(packet_msg->packet);
a6d85d2f
PP
222
223 if (packet_msg->default_cs) {
224 bt_clock_snapshot_recycle(packet_msg->default_cs);
225 packet_msg->default_cs = NULL;
226 }
227
5df26c89 228 g_free(msg);
d6e69534
PP
229}
230
5df26c89
PP
231static inline
232void recycle_packet_message(struct bt_message *msg, struct bt_object_pool *pool)
d6e69534 233{
5df26c89
PP
234 struct bt_message_packet *packet_msg = (void *) msg;
235
236 BT_LIB_LOGD("Recycling packet message: %!+n", msg);
237 bt_message_reset(msg);
6871026b 238 bt_object_put_ref_no_null_check(&packet_msg->packet->base);
a6d85d2f
PP
239
240 if (packet_msg->default_cs) {
241 bt_clock_snapshot_recycle(packet_msg->default_cs);
242 packet_msg->default_cs = NULL;
243 }
244
5df26c89
PP
245 packet_msg->packet = NULL;
246 msg->graph = NULL;
247 bt_object_pool_recycle_object(pool, msg);
d6e69534
PP
248}
249
250BT_HIDDEN
5df26c89 251void bt_message_packet_beginning_recycle(struct bt_message *msg)
d6e69534 252{
5df26c89 253 BT_ASSERT(msg);
d6e69534 254
91d81473 255 if (G_UNLIKELY(!msg->graph)) {
5df26c89
PP
256 bt_message_packet_destroy(msg);
257 return;
d6e69534
PP
258 }
259
5df26c89 260 recycle_packet_message(msg, &msg->graph->packet_begin_msg_pool);
d6e69534
PP
261}
262
5df26c89
PP
263BT_HIDDEN
264void bt_message_packet_end_recycle(struct bt_message *msg)
d6e69534 265{
5df26c89 266 BT_ASSERT(msg);
d6e69534 267
91d81473 268 if (G_UNLIKELY(!msg->graph)) {
5df26c89
PP
269 bt_message_packet_destroy(msg);
270 return;
d6e69534
PP
271 }
272
5df26c89 273 recycle_packet_message(msg, &msg->graph->packet_end_msg_pool);
d6e69534
PP
274}
275
5df26c89
PP
276struct bt_packet *bt_message_packet_beginning_borrow_packet(
277 struct bt_message *message)
d6e69534 278{
5df26c89 279 struct bt_message_packet *packet_msg = (void *) message;
d6e69534 280
d5b13b9b 281 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
1778c2a4 282 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_BEGINNING(message);
5df26c89 283 return packet_msg->packet;
d6e69534
PP
284}
285
5df26c89
PP
286const struct bt_packet *bt_message_packet_beginning_borrow_packet_const(
287 const struct bt_message *message)
d6e69534 288{
5df26c89
PP
289 return bt_message_packet_beginning_borrow_packet(
290 (void *) message);
d6e69534
PP
291}
292
293struct bt_packet *bt_message_packet_end_borrow_packet(
294 struct bt_message *message)
295{
5df26c89 296 struct bt_message_packet *packet_msg = (void *) message;
d6e69534 297
d5b13b9b 298 BT_ASSERT_PRE_DEV_MSG_NON_NULL(message);
1778c2a4 299 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_END(message);
5df26c89 300 return packet_msg->packet;
d6e69534
PP
301}
302
303const struct bt_packet *bt_message_packet_end_borrow_packet_const(
304 const struct bt_message *message)
305{
306 return bt_message_packet_end_borrow_packet(
307 (void *) message);
308}
a6d85d2f 309
1778c2a4
PP
310#define BT_ASSERT_PRE_DEV_FOR_BORROW_DEF_CS(_msg) \
311 BT_ASSERT_PRE_DEV_MSG_SC_DEF_CLK_CLS((_msg), \
312 ((struct bt_message_packet *) _msg)->packet->stream->class)
313
a6d85d2f 314static inline
0cbc2c33 315const struct bt_clock_snapshot *
a6d85d2f 316borrow_packet_message_default_clock_snapshot_const(
0cbc2c33 317 const struct bt_message *message)
a6d85d2f
PP
318{
319 struct bt_message_packet *packet_msg = (void *) message;
320
98b15851 321 BT_ASSERT_DBG(message);
0cbc2c33 322 return packet_msg->default_cs;
a6d85d2f
PP
323}
324
0cbc2c33 325const struct bt_clock_snapshot *
a6d85d2f 326bt_message_packet_beginning_borrow_default_clock_snapshot_const(
0cbc2c33 327 const struct bt_message *msg)
a6d85d2f 328{
d5b13b9b 329 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
1778c2a4
PP
330 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_BEGINNING(msg);
331 BT_ASSERT_PRE_DEV_FOR_BORROW_DEF_CS(msg);
0cbc2c33 332 return borrow_packet_message_default_clock_snapshot_const(msg);
a6d85d2f
PP
333}
334
0cbc2c33 335const struct bt_clock_snapshot *
a6d85d2f 336bt_message_packet_end_borrow_default_clock_snapshot_const(
0cbc2c33 337 const struct bt_message *msg)
a6d85d2f 338{
d5b13b9b 339 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
1778c2a4
PP
340 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_END(msg);
341 BT_ASSERT_PRE_DEV_FOR_BORROW_DEF_CS(msg);
0cbc2c33 342 return borrow_packet_message_default_clock_snapshot_const(msg);
a6d85d2f 343}
33931ab8
PP
344
345static inline
346const struct bt_clock_class *
347borrow_packet_message_stream_class_default_clock_class(
348 const struct bt_message *msg)
349{
350 struct bt_message_packet *packet_msg = (void *) msg;
351
98b15851 352 BT_ASSERT_DBG(msg);
33931ab8
PP
353 return packet_msg->packet->stream->class->default_clock_class;
354}
355
356const struct bt_clock_class *
357bt_message_packet_beginning_borrow_stream_class_default_clock_class_const(
358 const struct bt_message *msg)
359{
d5b13b9b 360 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
1778c2a4 361 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_BEGINNING(msg);
33931ab8
PP
362 return borrow_packet_message_stream_class_default_clock_class(msg);
363}
364
365const struct bt_clock_class *
366bt_message_packet_end_borrow_stream_class_default_clock_class_const(
367 const struct bt_message *msg)
368{
d5b13b9b 369 BT_ASSERT_PRE_DEV_MSG_NON_NULL(msg);
1778c2a4 370 BT_ASSERT_PRE_DEV_MSG_IS_PACKET_END(msg);
33931ab8
PP
371 return borrow_packet_message_stream_class_default_clock_class(msg);
372}
This page took 0.082062 seconds and 4 git commands to generate.