X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fctf-ir%2Ftrace.c;h=eb4211cf8885d739b45bf3ce0c8ad922b2c1b643;hp=77b8c67b0d7035f737e8b3490306c861f520e859;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hpb=d1e4683534e67cc8643ad27536f64f6cc54bc5dc diff --git a/lib/ctf-ir/trace.c b/lib/ctf-ir/trace.c index 77b8c67b..eb4211cf 100644 --- a/lib/ctf-ir/trace.c +++ b/lib/ctf-ir/trace.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -103,6 +104,7 @@ void bt_trace_destroy(struct bt_object *obj) g_ptr_array_free(trace->listeners, TRUE); } + bt_object_pool_finalize(&trace->packet_header_field_pool); bt_trace_common_finalize(BT_TO_COMMON(trace)); g_free(trace); } @@ -188,6 +190,13 @@ void bt_trace_common_finalize(struct bt_trace_common *trace) bt_put(trace->packet_header_field_type); } +static +void free_packet_header_field(struct bt_field_wrapper *field_wrapper, + struct bt_trace *trace) +{ + bt_field_wrapper_destroy(field_wrapper); +} + struct bt_trace *bt_trace_create(void) { struct bt_trace *trace = NULL; @@ -220,6 +229,16 @@ struct bt_trace *bt_trace_create(void) goto error; } + ret = bt_object_pool_initialize(&trace->packet_header_field_pool, + (bt_object_pool_new_object_func) bt_field_wrapper_new, + (bt_object_pool_destroy_object_func) free_packet_header_field, + trace); + if (ret) { + BT_LOGE("Failed to initialize packet header field pool: ret=%d", + ret); + goto error; + } + BT_LOGD("Created trace object: addr=%p", trace); return trace; @@ -1966,3 +1985,35 @@ int bt_trace_remove_is_static_listener( end: return ret; } + +struct bt_packet_header_field *bt_trace_create_packet_header_field( + struct bt_trace *trace) +{ + struct bt_field_wrapper *field_wrapper; + + BT_ASSERT_PRE_NON_NULL(trace, "Trace"); + BT_ASSERT_PRE(trace->common.packet_header_field_type, + "Trace has no packet header field type: %!+t", + trace); + field_wrapper = bt_field_wrapper_create( + &trace->packet_header_field_pool, + (void *) trace->common.packet_header_field_type); + if (!field_wrapper) { + BT_LIB_LOGE("Cannot allocate one packet header field from trace: " + "%![trace-]+t", trace); + goto error; + } + + BT_ASSERT(field_wrapper->field); + bt_trace_common_freeze(BT_TO_COMMON(trace)); + goto end; + +error: + if (field_wrapper) { + bt_field_wrapper_destroy(field_wrapper); + field_wrapper = NULL; + } + +end: + return (void *) field_wrapper; +}