X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fmessage%2Fpacket.c;h=9ed9a0c47f2eb3054553feb4402dab82f0d6d504;hb=8cc5f12befb744624f1683cda7d979d7c6cff4a5;hp=adf64950a5e509652d3850096015ac3a8e2275e1;hpb=58085ca4d234fafe66bf875c32364598e180eafa;p=babeltrace.git diff --git a/lib/graph/message/packet.c b/lib/graph/message/packet.c index adf64950..9ed9a0c4 100644 --- a/lib/graph/message/packet.c +++ b/lib/graph/message/packet.c @@ -22,23 +22,24 @@ */ #define BT_LOG_TAG "MSG-PACKET" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include static inline @@ -78,13 +79,15 @@ struct bt_message *bt_message_packet_end_new(struct bt_graph *graph) } static inline -struct bt_message *bt_message_packet_create( +struct bt_message *create_packet_message( struct bt_self_component_port_input_message_iterator *msg_iter, - struct bt_packet *packet, struct bt_object_pool *pool) + struct bt_packet *packet, struct bt_object_pool *pool, + bool with_cs, uint64_t raw_value) { struct bt_message_packet *message = NULL; struct bt_stream *stream; struct bt_stream_class *stream_class; + bool need_cs; BT_ASSERT(msg_iter); BT_ASSERT_PRE_NON_NULL(packet, "Packet"); @@ -92,6 +95,31 @@ struct bt_message *bt_message_packet_create( BT_ASSERT(stream); stream_class = bt_stream_borrow_class(stream); BT_ASSERT(stream_class); + + if (pool == &msg_iter->graph->packet_begin_msg_pool) { + need_cs = stream_class->packets_have_beginning_default_clock_snapshot; + } else { + need_cs = stream_class->packets_have_end_default_clock_snapshot; + } + + /* + * `packet_has_default_clock_snapshot` implies that the stream + * class has a default clock class (precondition). + */ + BT_ASSERT_PRE(need_cs ? with_cs : true, + "Unexpected stream class configuration when creating " + "a packet beginning or end message: " + "a default clock snapshot is needed, but none was provided: " + "%![stream-]+s, %![sc-]+S, with-cs=%d, " + "cs-val=%" PRIu64, + stream, stream_class, with_cs, raw_value); + BT_ASSERT_PRE(!need_cs ? !with_cs : true, + "Unexpected stream class configuration when creating " + "a packet beginning or end message: " + "no default clock snapshot is needed, but one was provided: " + "%![stream-]+s, %![sc-]+S, with-cs=%d, " + "cs-val=%" PRIu64, + stream, stream_class, with_cs, raw_value); BT_LIB_LOGD("Creating packet message object: " "%![packet-]+a, %![stream-]+s, %![sc-]+S", packet, stream, stream_class); @@ -101,6 +129,19 @@ struct bt_message *bt_message_packet_create( goto end; } + if (with_cs) { + BT_ASSERT(stream_class->default_clock_class); + message->default_cs = bt_clock_snapshot_create( + stream_class->default_clock_class); + if (!message->default_cs) { + bt_object_put_no_null_check(message); + message = NULL; + goto end; + } + + bt_clock_snapshot_set_raw_value(message->default_cs, raw_value); + } + BT_ASSERT(!message->packet); message->packet = packet; bt_object_get_no_null_check_no_parent_check( @@ -123,8 +164,20 @@ struct bt_message *bt_message_packet_beginning_create( (void *) self_msg_iter; BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); - return bt_message_packet_create(msg_iter, (void *) packet, - &msg_iter->graph->packet_begin_msg_pool); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_begin_msg_pool, false, 0); +} + +struct bt_message *bt_message_packet_beginning_create_with_default_clock_snapshot( + struct bt_self_message_iterator *self_msg_iter, + const struct bt_packet *packet, uint64_t raw_value) +{ + struct bt_self_component_port_input_message_iterator *msg_iter = + (void *) self_msg_iter; + + BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_begin_msg_pool, true, raw_value); } struct bt_message *bt_message_packet_end_create( @@ -135,8 +188,20 @@ struct bt_message *bt_message_packet_end_create( (void *) self_msg_iter; BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); - return bt_message_packet_create(msg_iter, (void *) packet, - &msg_iter->graph->packet_end_msg_pool); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_end_msg_pool, false, 0); +} + +struct bt_message *bt_message_packet_end_create_with_default_clock_snapshot( + struct bt_self_message_iterator *self_msg_iter, + const struct bt_packet *packet, uint64_t raw_value) +{ + struct bt_self_component_port_input_message_iterator *msg_iter = + (void *) self_msg_iter; + + BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_end_msg_pool, true, raw_value); } BT_HIDDEN @@ -147,6 +212,12 @@ void bt_message_packet_destroy(struct bt_message *msg) BT_LIB_LOGD("Destroying packet message: %!+n", msg); BT_LIB_LOGD("Putting packet: %!+a", packet_msg->packet); BT_OBJECT_PUT_REF_AND_RESET(packet_msg->packet); + + if (packet_msg->default_cs) { + bt_clock_snapshot_recycle(packet_msg->default_cs); + packet_msg->default_cs = NULL; + } + g_free(msg); } @@ -158,6 +229,12 @@ void recycle_packet_message(struct bt_message *msg, struct bt_object_pool *pool) BT_LIB_LOGD("Recycling packet message: %!+n", msg); bt_message_reset(msg); bt_object_put_no_null_check(&packet_msg->packet->base); + + if (packet_msg->default_cs) { + bt_clock_snapshot_recycle(packet_msg->default_cs); + packet_msg->default_cs = NULL; + } + packet_msg->packet = NULL; msg->graph = NULL; bt_object_pool_recycle_object(pool, msg); @@ -224,3 +301,65 @@ const struct bt_packet *bt_message_packet_end_borrow_packet_const( return bt_message_packet_end_borrow_packet( (void *) message); } + +static inline +const struct bt_clock_snapshot * +borrow_packet_message_default_clock_snapshot_const( + const struct bt_message *message) +{ + struct bt_message_packet *packet_msg = (void *) message; + + BT_ASSERT(message); + BT_ASSERT_PRE(packet_msg->packet->stream->class->default_clock_class, + "Message's stream's class has no default clock class: " + "%![msg-]+n, %![sc-]+S", + message, packet_msg->packet->stream->class); + return packet_msg->default_cs; +} + +const struct bt_clock_snapshot * +bt_message_packet_beginning_borrow_default_clock_snapshot_const( + const struct bt_message *msg) +{ + BT_ASSERT_PRE_NON_NULL(msg, "Message"); + BT_ASSERT_PRE_MSG_IS_TYPE(msg, BT_MESSAGE_TYPE_PACKET_BEGINNING); + return borrow_packet_message_default_clock_snapshot_const(msg); +} + +const struct bt_clock_snapshot * +bt_message_packet_end_borrow_default_clock_snapshot_const( + const struct bt_message *msg) +{ + BT_ASSERT_PRE_NON_NULL(msg, "Message"); + BT_ASSERT_PRE_MSG_IS_TYPE(msg, BT_MESSAGE_TYPE_PACKET_END); + return borrow_packet_message_default_clock_snapshot_const(msg); +} + +static inline +const struct bt_clock_class * +borrow_packet_message_stream_class_default_clock_class( + const struct bt_message *msg) +{ + struct bt_message_packet *packet_msg = (void *) msg; + + BT_ASSERT(msg); + return packet_msg->packet->stream->class->default_clock_class; +} + +const struct bt_clock_class * +bt_message_packet_beginning_borrow_stream_class_default_clock_class_const( + const struct bt_message *msg) +{ + BT_ASSERT_PRE_NON_NULL(msg, "Message"); + BT_ASSERT_PRE_MSG_IS_TYPE(msg, BT_MESSAGE_TYPE_PACKET_BEGINNING); + return borrow_packet_message_stream_class_default_clock_class(msg); +} + +const struct bt_clock_class * +bt_message_packet_end_borrow_stream_class_default_clock_class_const( + const struct bt_message *msg) +{ + BT_ASSERT_PRE_NON_NULL(msg, "Message"); + BT_ASSERT_PRE_MSG_IS_TYPE(msg, BT_MESSAGE_TYPE_PACKET_END); + return borrow_packet_message_stream_class_default_clock_class(msg); +}