X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=lib%2Fctf-ir%2Fevent.c;h=9fa9223e6f845422af13ffed75da224e2a807298;hb=3fea54f69edd1780566230255da196cb6e82df62;hp=5cfd5e14a124515e8bbcfc943722c71c8b75e005;hpb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;p=babeltrace.git diff --git a/lib/ctf-ir/event.c b/lib/ctf-ir/event.c index 5cfd5e14..9fa9223e 100644 --- a/lib/ctf-ir/event.c +++ b/lib/ctf-ir/event.c @@ -137,10 +137,10 @@ static int bt_event_common_create_fields( struct bt_stream_class_common *stream_class, struct bt_validation_output *validation_output, - void *(*create_field_func)(void *), - void (*release_field_func)(void *), - void *(*create_header_field_func)(void *, void *), - void (*release_header_field_func)(void *), + create_field_func create_field_func, + release_field_func release_field_func, + create_header_field_func create_header_field_func, + release_header_field_func release_header_field_func, struct bt_field_wrapper **header_field, struct bt_field_common **stream_event_context_field, struct bt_field_common **context_field, @@ -197,7 +197,7 @@ int bt_event_common_create_fields( error: if (*header_field) { - release_header_field_func(*header_field); + release_header_field_func(*header_field, stream_class); } if (*stream_event_context_field) { @@ -320,16 +320,16 @@ BT_HIDDEN int bt_event_common_initialize(struct bt_event_common *event, struct bt_event_class_common *event_class, struct bt_clock_class *init_expected_clock_class, - bt_object_release_func release_func, + bool is_shared_with_parent, bt_object_release_func release_func, bt_validation_flag_copy_field_type_func field_type_copy_func, bool must_be_in_trace, int (*map_clock_classes_func)(struct bt_stream_class_common *stream_class, struct bt_field_type_common *packet_context_field_type, struct bt_field_type_common *event_header_field_type), - void *(*create_field_func)(void *), - void (*release_field_func)(void *), - void *(*create_header_field_func)(void *, void *), - void (*release_header_field_func)(void *)) + create_field_func create_field_func, + release_field_func release_field_func, + create_header_field_func create_header_field_func, + release_header_field_func release_header_field_func) { int ret; struct bt_trace_common *trace = NULL; @@ -368,7 +368,11 @@ int bt_event_common_initialize(struct bt_event_common *event, * failure, the caller releases the reference to `event` to * destroy it. */ - bt_object_init(event, release_func); + if (is_shared_with_parent) { + bt_object_init_shared_with_parent(&event->base, release_func); + } else { + bt_object_init_unique(&event->base); + } if (!stream_class->frozen) { /* @@ -499,7 +503,7 @@ error: bt_put(expected_clock_class); if (event_header) { - release_header_field_func(event_header); + release_header_field_func(event_header, stream_class); } if (stream_event_context) { @@ -572,19 +576,18 @@ struct bt_event *bt_event_new(struct bt_event_class *event_class) } ret = bt_event_common_initialize(BT_TO_COMMON(event), - BT_TO_COMMON(event_class), NULL, NULL, + BT_TO_COMMON(event_class), NULL, false, NULL, (bt_validation_flag_copy_field_type_func) bt_field_type_copy, true, NULL, - (void *) bt_field_create_recursive, - (void *) bt_field_destroy_recursive, - (void *) create_event_header_field, - (void *) bt_event_header_field_recycle); + (create_field_func) bt_field_create_recursive, + (release_field_func) bt_field_destroy_recursive, + (create_header_field_func) create_event_header_field, + (release_header_field_func) bt_event_header_field_recycle); if (ret) { /* bt_event_common_initialize() logs errors */ goto error; } - bt_object_set_is_shared((void *) event, false); event->clock_values = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) bt_clock_value_recycle);