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,
error:
if (*header_field) {
- release_header_field_func(*header_field);
+ release_header_field_func(*header_field, stream_class);
}
if (*stream_event_context_field) {
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;
* 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) {
/*
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) {
}
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);