X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fctf-ir%2Fpacket-context-field.c;h=55fdb7f4462e59d5663320646d076bf4c085525a;hp=598f1cf2928799f493c006da2d5836b9a62ee22c;hb=44c440bc5fe8219cc17d1b786d91fd83c4c9860a;hpb=c800eb3790218d2f33df01e77ec38cbd43cc02a1 diff --git a/lib/ctf-ir/packet-context-field.c b/lib/ctf-ir/packet-context-field.c index 598f1cf2..55fdb7f4 100644 --- a/lib/ctf-ir/packet-context-field.c +++ b/lib/ctf-ir/packet-context-field.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -35,9 +36,7 @@ struct bt_field *bt_packet_context_field_borrow_field( struct bt_field_wrapper *field_wrapper = (void *) context_field; BT_ASSERT_PRE_NON_NULL(field_wrapper, "Packet context field"); - BT_ASSERT_PRE_NON_NULL(field_wrapper->field, - "Packet context field's field object"); - return (void *) field_wrapper->field; + return field_wrapper->field; } void bt_packet_context_field_release(struct bt_packet_context_field *context_field) @@ -50,8 +49,42 @@ void bt_packet_context_field_release(struct bt_packet_context_field *context_fie * Do not recycle because the pool could be destroyed at this * point. This function is only called when there's an error * anyway because the goal of a packet context field wrapper is - * to eventually move it to a packet with bt_packet_move_context() - * after creating it. + * to eventually move it to a packet with + * bt_packet_move_context() after creating it. */ bt_field_wrapper_destroy(field_wrapper); } + +struct bt_packet_context_field *bt_packet_context_field_create( + struct bt_stream_class *stream_class) +{ + struct bt_field_wrapper *field_wrapper; + + BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class"); + BT_ASSERT_PRE(stream_class->frozen, + "Stream class is not part of a trace: %!+S", stream_class); + BT_ASSERT_PRE(stream_class->packet_context_ft, + "Stream class has no packet context field type: %!+S", + stream_class); + field_wrapper = bt_field_wrapper_create( + &stream_class->packet_context_field_pool, + (void *) stream_class->packet_context_ft); + if (!field_wrapper) { + BT_LIB_LOGE("Cannot allocate one packet context field from stream class: " + "%![sc-]+S", stream_class); + goto error; + } + + BT_ASSERT(field_wrapper->field); + bt_stream_class_freeze(stream_class); + goto end; + +error: + if (field_wrapper) { + bt_field_wrapper_destroy(field_wrapper); + field_wrapper = NULL; + } + +end: + return (void *) field_wrapper; +}