lib: update and simplify the `bt_object` API
[babeltrace.git] / lib / ctf-ir / trace.c
index 77b8c67b0d7035f737e8b3490306c861f520e859..c9a588fbe063fb6170064a84801479a035e87cb0 100644 (file)
@@ -39,6 +39,7 @@
 #include <babeltrace/ctf-ir/event-class-internal.h>
 #include <babeltrace/ctf-writer/functor-internal.h>
 #include <babeltrace/ctf-writer/clock-internal.h>
+#include <babeltrace/ctf-ir/field-wrapper-internal.h>
 #include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/ctf-ir/attributes-internal.h>
 #include <babeltrace/ctf-ir/validation-internal.h>
@@ -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);
 }
@@ -115,7 +117,7 @@ int bt_trace_common_initialize(struct bt_trace_common *trace,
 
        BT_LOGD_STR("Initializing common trace object.");
        trace->native_byte_order = BT_BYTE_ORDER_UNSPECIFIED;
-       bt_object_init(trace, release_func);
+       bt_object_init_shared_with_parent(&trace->base, release_func);
        trace->clock_classes = g_ptr_array_new_with_free_func(
                (GDestroyNotify) bt_put);
        if (!trace->clock_classes) {
@@ -124,14 +126,14 @@ int bt_trace_common_initialize(struct bt_trace_common *trace,
        }
 
        trace->streams = g_ptr_array_new_with_free_func(
-               (GDestroyNotify) bt_object_release);
+               (GDestroyNotify) bt_object_try_spec_release);
        if (!trace->streams) {
                BT_LOGE_STR("Failed to allocate one GPtrArray.");
                goto error;
        }
 
        trace->stream_classes = g_ptr_array_new_with_free_func(
-               (GDestroyNotify) bt_object_release);
+               (GDestroyNotify) bt_object_try_spec_release);
        if (!trace->stream_classes) {
                BT_LOGE_STR("Failed to allocate one GPtrArray.");
                goto error;
@@ -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;
 
@@ -1393,7 +1412,7 @@ int bt_trace_common_add_stream_class(struct bt_trace_common *trace,
                }
        }
 
-       bt_object_set_parent(stream_class, trace);
+       bt_object_set_parent(&stream_class->base, &trace->base);
        g_ptr_array_add(trace->stream_classes, stream_class);
 
        /*
@@ -1454,7 +1473,7 @@ int bt_trace_common_add_stream_class(struct bt_trace_common *trace,
 
 end:
        if (ret) {
-               bt_object_set_parent(stream_class, NULL);
+               bt_object_set_parent(&stream_class->base, NULL);
 
                if (ec_validation_outputs) {
                        for (i = 0; i < event_class_count; i++) {
@@ -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;
+}
This page took 0.026392 seconds and 4 git commands to generate.