X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fgraph%2Fmessage%2Fpacket.c;h=9ed9a0c47f2eb3054553feb4402dab82f0d6d504;hb=8cc5f12befb744624f1683cda7d979d7c6cff4a5;hp=22894c9b611c3b088be5b82e64316c101e2931f9;hpb=d6e69534ef08a2dd8bff9eb5af1eab63736b3d31;p=babeltrace.git diff --git a/lib/graph/message/packet.c b/lib/graph/message/packet.c index 22894c9b..9ed9a0c4 100644 --- a/lib/graph/message/packet.c +++ b/lib/graph/message/packet.c @@ -22,38 +22,39 @@ */ #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 -BT_HIDDEN -struct bt_message *bt_message_packet_beginning_new(struct bt_graph *graph) +static inline +struct bt_message *new_packet_message(struct bt_graph *graph, + enum bt_message_type type, bt_object_release_func recycle_func) { - struct bt_message_packet_beginning *message; + struct bt_message_packet *message; - message = g_new0(struct bt_message_packet_beginning, 1); + message = g_new0(struct bt_message_packet, 1); if (!message) { - BT_LOGE_STR("Failed to allocate one packet beginning message."); + BT_LOGE_STR("Failed to allocate one packet message."); goto error; } - bt_message_init(&message->parent, - BT_MESSAGE_TYPE_PACKET_BEGINNING, - (bt_object_release_func) bt_message_packet_beginning_recycle, - graph); + bt_message_init(&message->parent, type, recycle_func, graph); goto end; error: @@ -63,38 +64,90 @@ end: return (void *) message; } -struct bt_message *bt_message_packet_beginning_create( - struct bt_self_message_iterator *self_msg_iter, - struct bt_packet *packet) +BT_HIDDEN +struct bt_message *bt_message_packet_beginning_new(struct bt_graph *graph) { - struct bt_self_component_port_input_message_iterator *msg_iter = - (void *) self_msg_iter; - struct bt_message_packet_beginning *message = NULL; + return new_packet_message(graph, BT_MESSAGE_TYPE_PACKET_BEGINNING, + (bt_object_release_func) bt_message_packet_beginning_recycle); +} + +BT_HIDDEN +struct bt_message *bt_message_packet_end_new(struct bt_graph *graph) +{ + return new_packet_message(graph, BT_MESSAGE_TYPE_PACKET_END, + (bt_object_release_func) bt_message_packet_end_recycle); +} + +static inline +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, + 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_PRE_NON_NULL(msg_iter, "Message iterator"); + BT_ASSERT(msg_iter); BT_ASSERT_PRE_NON_NULL(packet, "Packet"); stream = bt_packet_borrow_stream(packet); BT_ASSERT(stream); stream_class = bt_stream_borrow_class(stream); BT_ASSERT(stream_class); - BT_LIB_LOGD("Creating packet beginning message object: " + + 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); - message = (void *) bt_message_create_from_pool( - &msg_iter->graph->packet_begin_msg_pool, msg_iter->graph); + message = (void *) bt_message_create_from_pool(pool, msg_iter->graph); if (!message) { /* bt_message_create_from_pool() logs errors */ 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( &message->packet->base); bt_packet_set_is_frozen(packet, true); - BT_LIB_LOGD("Created packet beginning message object: " + BT_LIB_LOGD("Created packet message object: " "%![msg-]+n, %![packet-]+a, %![stream-]+s, %![sc-]+S", message, packet, stream, stream_class); goto end; @@ -103,164 +156,143 @@ end: return (void *) message; } -BT_HIDDEN -void bt_message_packet_beginning_destroy(struct bt_message *msg) +struct bt_message *bt_message_packet_beginning_create( + struct bt_self_message_iterator *self_msg_iter, + const struct bt_packet *packet) { - struct bt_message_packet_beginning *packet_begin_msg = (void *) msg; + struct bt_self_component_port_input_message_iterator *msg_iter = + (void *) self_msg_iter; - BT_LIB_LOGD("Destroying packet beginning message: %!+n", msg); - BT_LIB_LOGD("Putting packet: %!+a", packet_begin_msg->packet); - BT_OBJECT_PUT_REF_AND_RESET(packet_begin_msg->packet); - g_free(msg); + BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_begin_msg_pool, false, 0); } -BT_HIDDEN -void bt_message_packet_beginning_recycle(struct bt_message *msg) +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_message_packet_beginning *packet_begin_msg = (void *) msg; - struct bt_graph *graph; - - BT_ASSERT(packet_begin_msg); - - if (unlikely(!msg->graph)) { - bt_message_packet_beginning_destroy(msg); - return; - } + struct bt_self_component_port_input_message_iterator *msg_iter = + (void *) self_msg_iter; - BT_LIB_LOGD("Recycling packet beginning message: %!+n", msg); - bt_message_reset(msg); - bt_object_put_no_null_check(&packet_begin_msg->packet->base); - packet_begin_msg->packet = NULL; - graph = msg->graph; - msg->graph = NULL; - bt_object_pool_recycle_object(&graph->packet_begin_msg_pool, msg); + 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_packet *bt_message_packet_beginning_borrow_packet( - struct bt_message *message) +struct bt_message *bt_message_packet_end_create( + struct bt_self_message_iterator *self_msg_iter, + const struct bt_packet *packet) { - struct bt_message_packet_beginning *packet_begin; + struct bt_self_component_port_input_message_iterator *msg_iter = + (void *) self_msg_iter; - BT_ASSERT_PRE_NON_NULL(message, "Message"); - BT_ASSERT_PRE_MSG_IS_TYPE(message, - BT_MESSAGE_TYPE_PACKET_BEGINNING); - packet_begin = (void *) message; - return packet_begin->packet; + BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); + return create_packet_message(msg_iter, (void *) packet, + &msg_iter->graph->packet_end_msg_pool, false, 0); } -const struct bt_packet *bt_message_packet_beginning_borrow_packet_const( - const struct bt_message *message) +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) { - return bt_message_packet_beginning_borrow_packet( - (void *) message); + 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 -struct bt_message *bt_message_packet_end_new(struct bt_graph *graph) +void bt_message_packet_destroy(struct bt_message *msg) { - struct bt_message_packet_end *message; - - message = g_new0(struct bt_message_packet_end, 1); - if (!message) { - BT_LOGE_STR("Failed to allocate one packet end message."); - goto error; - } + struct bt_message_packet *packet_msg = (void *) msg; - bt_message_init(&message->parent, - BT_MESSAGE_TYPE_PACKET_END, - (bt_object_release_func) bt_message_packet_end_recycle, - graph); - goto end; + 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); -error: - BT_OBJECT_PUT_REF_AND_RESET(message); + if (packet_msg->default_cs) { + bt_clock_snapshot_recycle(packet_msg->default_cs); + packet_msg->default_cs = NULL; + } -end: - return (void *) message; + g_free(msg); } -struct bt_message *bt_message_packet_end_create( - struct bt_self_message_iterator *self_msg_iter, - struct bt_packet *packet) +static inline +void recycle_packet_message(struct bt_message *msg, struct bt_object_pool *pool) { - struct bt_self_component_port_input_message_iterator *msg_iter = - (void *) self_msg_iter; - struct bt_message_packet_end *message = NULL; - struct bt_stream *stream; - struct bt_stream_class *stream_class; + struct bt_message_packet *packet_msg = (void *) msg; - BT_ASSERT_PRE_NON_NULL(msg_iter, "Message iterator"); - BT_ASSERT_PRE_NON_NULL(packet, "Packet"); - stream = bt_packet_borrow_stream(packet); - BT_ASSERT(stream); - stream_class = bt_stream_borrow_class(stream); - BT_ASSERT(stream_class); - BT_LIB_LOGD("Creating packet end message object: " - "%![packet-]+a, %![stream-]+s, %![sc-]+S", - packet, stream, stream_class); - message = (void *) bt_message_create_from_pool( - &msg_iter->graph->packet_end_msg_pool, msg_iter->graph); - if (!message) { - /* bt_message_create_from_pool() logs errors */ - goto end; - } + BT_LIB_LOGD("Recycling packet message: %!+n", msg); + bt_message_reset(msg); + bt_object_put_no_null_check(&packet_msg->packet->base); - BT_ASSERT(!message->packet); - message->packet = packet; - bt_object_get_no_null_check_no_parent_check( - &message->packet->base); - bt_packet_set_is_frozen(packet, true); - BT_LIB_LOGD("Created packet end message object: " - "%![msg-]+n, %![packet-]+a, %![stream-]+s, %![sc-]+S", - message, packet, stream, stream_class); - goto end; + if (packet_msg->default_cs) { + bt_clock_snapshot_recycle(packet_msg->default_cs); + packet_msg->default_cs = NULL; + } -end: - return (void *) message; + packet_msg->packet = NULL; + msg->graph = NULL; + bt_object_pool_recycle_object(pool, msg); } BT_HIDDEN -void bt_message_packet_end_destroy(struct bt_message *msg) +void bt_message_packet_beginning_recycle(struct bt_message *msg) { - struct bt_message_packet_end *packet_end_msg = (void *) msg; + BT_ASSERT(msg); - BT_LIB_LOGD("Destroying packet end message: %!+n", msg); - BT_LIB_LOGD("Putting packet: %!+a", packet_end_msg->packet); - BT_OBJECT_PUT_REF_AND_RESET(packet_end_msg->packet); - g_free(msg); + if (unlikely(!msg->graph)) { + bt_message_packet_destroy(msg); + return; + } + + recycle_packet_message(msg, &msg->graph->packet_begin_msg_pool); } BT_HIDDEN void bt_message_packet_end_recycle(struct bt_message *msg) { - struct bt_message_packet_end *packet_end_msg = (void *) msg; - struct bt_graph *graph; - - BT_ASSERT(packet_end_msg); + BT_ASSERT(msg); - if (!msg->graph) { - bt_message_packet_end_destroy(msg); + if (unlikely(!msg->graph)) { + bt_message_packet_destroy(msg); return; } - BT_LIB_LOGD("Recycling packet end message: %!+n", msg); - bt_message_reset(msg); - BT_OBJECT_PUT_REF_AND_RESET(packet_end_msg->packet); - graph = msg->graph; - msg->graph = NULL; - bt_object_pool_recycle_object(&graph->packet_end_msg_pool, msg); + recycle_packet_message(msg, &msg->graph->packet_end_msg_pool); +} + +struct bt_packet *bt_message_packet_beginning_borrow_packet( + struct bt_message *message) +{ + struct bt_message_packet *packet_msg = (void *) message; + + BT_ASSERT_PRE_NON_NULL(message, "Message"); + BT_ASSERT_PRE_MSG_IS_TYPE(message, + BT_MESSAGE_TYPE_PACKET_BEGINNING); + return packet_msg->packet; +} + +const struct bt_packet *bt_message_packet_beginning_borrow_packet_const( + const struct bt_message *message) +{ + return bt_message_packet_beginning_borrow_packet( + (void *) message); } struct bt_packet *bt_message_packet_end_borrow_packet( struct bt_message *message) { - struct bt_message_packet_end *packet_end; + struct bt_message_packet *packet_msg = (void *) message; BT_ASSERT_PRE_NON_NULL(message, "Message"); BT_ASSERT_PRE_MSG_IS_TYPE(message, BT_MESSAGE_TYPE_PACKET_END); - packet_end = (void *) message; - return packet_end->packet; + return packet_msg->packet; } const struct bt_packet *bt_message_packet_end_borrow_packet_const( @@ -269,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); +}