X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=lib%2Ftrace-ir%2Ftrace.c;h=a46d8684f04cbfe4990806163b118ffa4468ccf3;hb=35fa110e5bea4a35497313adf3e3d0fa09db9ff7;hp=d2b58899a2d74761effad899b5e598307b8ca62e;hpb=ce141536303570f5101012630f4068e981d4af31;p=babeltrace.git diff --git a/lib/trace-ir/trace.c b/lib/trace-ir/trace.c index d2b58899..a46d8684 100644 --- a/lib/trace-ir/trace.c +++ b/lib/trace-ir/trace.c @@ -1,8 +1,7 @@ /* + * Copyright 2017-2018 Philippe Proulx * Copyright 2014 Jérémie Galarneau * - * Author: Jérémie Galarneau - * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -26,7 +25,9 @@ #include #include -#include +#include +#include +#include #include #include #include @@ -37,15 +38,14 @@ #include #include #include -#include +#include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include #include #include #include @@ -56,8 +56,8 @@ #include struct bt_trace_is_static_listener_elem { - bt_private_trace_is_static_listener func; - bt_private_trace_listener_removed removed; + bt_trace_is_static_listener_func func; + bt_trace_listener_removed_func removed; void *data; }; @@ -92,14 +92,6 @@ void destroy_trace(struct bt_object *obj) trace->is_static_listeners = NULL; } - bt_object_pool_finalize(&trace->packet_header_field_pool); - - if (trace->environment) { - BT_LOGD_STR("Destroying environment attributes."); - bt_attributes_destroy(trace->environment); - trace->environment = NULL; - } - if (trace->name.str) { g_string_free(trace->name.str, TRUE); trace->name.str = NULL; @@ -112,43 +104,29 @@ void destroy_trace(struct bt_object *obj) trace->streams = NULL; } - if (trace->stream_classes) { - BT_LOGD_STR("Destroying stream classes."); - g_ptr_array_free(trace->stream_classes, TRUE); - trace->stream_classes = NULL; - } - if (trace->stream_classes_stream_count) { g_hash_table_destroy(trace->stream_classes_stream_count); trace->stream_classes_stream_count = NULL; } - BT_LOGD_STR("Putting packet header field classe."); - bt_object_put_ref(trace->packet_header_fc); - trace->packet_header_fc = NULL; + BT_LOGD_STR("Putting trace's class."); + bt_object_put_ref(trace->class); + trace->class = NULL; g_free(trace); } -static -void free_packet_header_field(struct bt_field_wrapper *field_wrapper, - struct bt_trace *trace) -{ - bt_field_wrapper_destroy(field_wrapper); -} - -struct bt_private_trace *bt_private_trace_create(void) +struct bt_trace *bt_trace_create(struct bt_trace_class *tc) { struct bt_trace *trace = NULL; - int ret; - BT_LOGD_STR("Creating default trace object."); + BT_LIB_LOGD("Creating trace object: %![tc-]+T", tc); trace = g_new0(struct bt_trace, 1); if (!trace) { BT_LOGE_STR("Failed to allocate one trace."); goto error; } - bt_object_init_shared_with_parent(&trace->base, destroy_trace); + bt_object_init_shared(&trace->base, destroy_trace); trace->streams = g_ptr_array_new_with_free_func( (GDestroyNotify) bt_object_try_spec_release); if (!trace->streams) { @@ -156,13 +134,6 @@ struct bt_private_trace *bt_private_trace_create(void) goto error; } - trace->stream_classes = g_ptr_array_new_with_free_func( - (GDestroyNotify) bt_object_try_spec_release); - if (!trace->stream_classes) { - BT_LOGE_STR("Failed to allocate one GPtrArray."); - goto error; - } - trace->stream_classes_stream_count = g_hash_table_new(g_direct_hash, g_direct_equal); if (!trace->stream_classes_stream_count) { @@ -176,12 +147,6 @@ struct bt_private_trace *bt_private_trace_create(void) goto error; } - trace->environment = bt_attributes_create(); - if (!trace->environment) { - BT_LOGE_STR("Cannot create empty attributes object."); - goto error; - } - trace->is_static_listeners = g_array_new(FALSE, TRUE, sizeof(struct bt_trace_is_static_listener_elem)); if (!trace->is_static_listeners) { @@ -189,17 +154,8 @@ struct bt_private_trace *bt_private_trace_create(void) goto error; } - trace->assigns_automatic_stream_class_id = true; - 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; - } - + trace->class = tc; + bt_object_get_no_null_check(trace->class); BT_LIB_LOGD("Created trace object: %!+t", trace); goto end; @@ -207,187 +163,27 @@ error: BT_OBJECT_PUT_REF_AND_RESET(trace); end: - return (void *) trace; + return trace; } -const char *bt_trace_get_name(struct bt_trace *trace) +const char *bt_trace_get_name(const struct bt_trace *trace) { BT_ASSERT_PRE_NON_NULL(trace, "Trace"); return trace->name.value; } -int bt_private_trace_set_name(struct bt_private_trace *priv_trace, - const char *name) +enum bt_trace_status bt_trace_set_name(struct bt_trace *trace, const char *name) { - struct bt_trace *trace = (void *) priv_trace; - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); BT_ASSERT_PRE_NON_NULL(name, "Name"); BT_ASSERT_PRE_TRACE_HOT(trace); g_string_assign(trace->name.str, name); trace->name.value = trace->name.str->str; BT_LIB_LOGV("Set trace's name: %!+t", trace); - return 0; -} - -bt_uuid bt_trace_get_uuid(struct bt_trace *trace) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - return trace->uuid.value; -} - -void bt_private_trace_set_uuid(struct bt_private_trace *priv_trace, - bt_uuid uuid) -{ - struct bt_trace *trace = (void *) priv_trace; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(uuid, "UUID"); - BT_ASSERT_PRE_TRACE_HOT(trace); - memcpy(trace->uuid.uuid, uuid, BABELTRACE_UUID_LEN); - trace->uuid.value = trace->uuid.uuid; - BT_LIB_LOGV("Set trace's UUID: %!+t", trace); -} - -BT_ASSERT_FUNC -static -bool trace_has_environment_entry(struct bt_trace *trace, const char *name) -{ - BT_ASSERT(trace); - - return bt_attributes_borrow_field_value_by_name( - trace->environment, name) != NULL; -} - -static -int set_environment_entry(struct bt_trace *trace, const char *name, - struct bt_value *value) -{ - int ret; - - BT_ASSERT(trace); - BT_ASSERT(name); - BT_ASSERT(value); - BT_ASSERT_PRE(!trace->frozen || - !trace_has_environment_entry(trace, name), - "Trace is frozen: cannot replace environment entry: " - "%![trace-]+t, entry-name=\"%s\"", trace, name); - ret = bt_attributes_set_field_value(trace->environment, name, - value); - bt_value_freeze(value); - if (ret) { - BT_LIB_LOGE("Cannot set trace's environment entry: " - "%![trace-]+t, entry-name=\"%s\"", trace, name); - } else { - BT_LIB_LOGV("Set trace's environment entry: " - "%![trace-]+t, entry-name=\"%s\"", trace, name); - } - - return ret; -} - -int bt_private_trace_set_environment_entry_string( - struct bt_private_trace *priv_trace, - const char *name, const char *value) -{ - int ret; - struct bt_value *value_obj; - struct bt_trace *trace = (void *) priv_trace; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(name, "Name"); - BT_ASSERT_PRE_NON_NULL(value, "Value"); - value_obj = bt_value_string_create_init(value); - if (!value_obj) { - BT_LOGE_STR("Cannot create a string value object."); - ret = -1; - goto end; - } - - /* set_environment_entry() logs errors */ - ret = set_environment_entry(trace, name, value_obj); - -end: - bt_object_put_ref(value_obj); - return ret; -} - -int bt_private_trace_set_environment_entry_integer( - struct bt_private_trace *priv_trace, - const char *name, int64_t value) -{ - int ret; - struct bt_value *value_obj; - struct bt_trace *trace = (void *) priv_trace; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(name, "Name"); - value_obj = bt_value_integer_create_init(value); - if (!value_obj) { - BT_LOGE_STR("Cannot create an integer value object."); - ret = -1; - goto end; - } - - /* set_environment_entry() logs errors */ - ret = set_environment_entry(trace, name, value_obj); - -end: - bt_object_put_ref(value_obj); - return ret; -} - -uint64_t bt_trace_get_environment_entry_count(struct bt_trace *trace) -{ - int64_t ret; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - ret = bt_attributes_get_count(trace->environment); - BT_ASSERT(ret >= 0); - return (uint64_t) ret; -} - -void bt_trace_borrow_environment_entry_by_index( - struct bt_trace *trace, uint64_t index, - const char **name, const struct bt_value **value) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(name, "Name"); - BT_ASSERT_PRE_NON_NULL(value, "Value"); - BT_ASSERT_PRE_VALID_INDEX(index, - bt_attributes_get_count(trace->environment)); - *value = bt_attributes_borrow_field_value(trace->environment, index); - BT_ASSERT(*value); - *name = bt_attributes_get_field_name(trace->environment, index); - BT_ASSERT(*name); -} - -void bt_private_trace_borrow_environment_entry_by_index( - struct bt_private_trace *trace, uint64_t index, - const char **name, const struct bt_value **value) -{ - bt_trace_borrow_environment_entry_by_index((void *) trace, - index, name, (void *) value); -} - -const struct bt_value *bt_trace_borrow_environment_entry_value_by_name( - struct bt_trace *trace, const char *name) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(name, "Name"); - return bt_attributes_borrow_field_value_by_name(trace->environment, - name); -} - -const struct bt_value * -bt_private_trace_borrow_environment_entry_value_by_name( - struct bt_private_trace *trace, const char *name) -{ - return (void *) bt_trace_borrow_environment_entry_value_by_name( - (void *) trace, name); + return BT_TRACE_STATUS_OK; } -uint64_t bt_trace_get_stream_count(struct bt_trace *trace) +uint64_t bt_trace_get_stream_count(const struct bt_trace *trace) { BT_ASSERT_PRE_NON_NULL(trace, "Trace"); return (uint64_t) trace->streams->len; @@ -401,14 +197,14 @@ struct bt_stream *bt_trace_borrow_stream_by_index( return g_ptr_array_index(trace->streams, index); } -struct bt_private_stream *bt_private_trace_borrow_stream_by_index( - struct bt_private_trace *trace, uint64_t index) +const struct bt_stream *bt_trace_borrow_stream_by_index_const( + const struct bt_trace *trace, uint64_t index) { - return (void *) bt_trace_borrow_stream_by_index((void *) trace, index); + return bt_trace_borrow_stream_by_index((void *) trace, index); } -struct bt_stream *bt_trace_borrow_stream_by_id( - struct bt_trace *trace, uint64_t id) +struct bt_stream *bt_trace_borrow_stream_by_id(struct bt_trace *trace, + uint64_t id) { struct bt_stream *stream = NULL; uint64_t i; @@ -429,119 +225,20 @@ end: return stream; } -struct bt_private_stream *bt_private_trace_borrow_private_stream_by_id( - struct bt_private_trace *trace, uint64_t id) -{ - return (void *) bt_trace_borrow_stream_by_id((void *) trace, id); -} - -uint64_t bt_trace_get_stream_class_count(struct bt_trace *trace) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - return (uint64_t) trace->stream_classes->len; -} - -struct bt_stream_class *bt_trace_borrow_stream_class_by_index( - struct bt_trace *trace, uint64_t index) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_VALID_INDEX(index, trace->stream_classes->len); - return g_ptr_array_index(trace->stream_classes, index); -} - -struct bt_private_stream_class * -bt_private_trace_borrow_stream_class_by_index( - struct bt_private_trace *trace, uint64_t index) -{ - return (void *) bt_trace_borrow_stream_class_by_index( - (void *) trace, index); -} - -struct bt_stream_class *bt_trace_borrow_stream_class_by_id( - struct bt_trace *trace, uint64_t id) -{ - struct bt_stream_class *stream_class = NULL; - uint64_t i; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - - for (i = 0; i < trace->stream_classes->len; i++) { - struct bt_stream_class *stream_class_candidate = - g_ptr_array_index(trace->stream_classes, i); - - if (stream_class_candidate->id == id) { - stream_class = stream_class_candidate; - goto end; - } - } - -end: - return stream_class; -} - -struct bt_private_stream_class * -bt_private_trace_borrow_stream_class_by_id( - struct bt_private_trace *trace, uint64_t id) -{ - return (void *) bt_trace_borrow_stream_class_by_id((void *) trace, id); -} - -struct bt_field_class *bt_trace_borrow_packet_header_field_class( - struct bt_trace *trace) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - return trace->packet_header_fc; -} - -int bt_private_trace_set_packet_header_field_class( - struct bt_private_trace *priv_trace, - struct bt_private_field_class *priv_field_class) +const struct bt_stream *bt_trace_borrow_stream_by_id_const( + const struct bt_trace *trace, uint64_t id) { - int ret; - struct bt_trace *trace = (void *) priv_trace; - struct bt_field_class *field_class = (void *) priv_field_class; - struct bt_resolve_field_path_context resolve_ctx = { - .packet_header = field_class, - .packet_context = NULL, - .event_header = NULL, - .event_common_context = NULL, - .event_specific_context = NULL, - .event_payload = NULL, - }; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_NON_NULL(field_class, "Field class"); - BT_ASSERT_PRE_TRACE_HOT(trace); - BT_ASSERT_PRE(bt_field_class_get_type(field_class) == - BT_FIELD_CLASS_TYPE_STRUCTURE, - "Packet header field classe is not a structure field classe: %!+F", - field_class); - ret = bt_resolve_field_paths(field_class, &resolve_ctx); - if (ret) { - goto end; - } - - bt_field_class_make_part_of_trace(field_class); - bt_object_put_ref(trace->packet_header_fc); - trace->packet_header_fc = field_class; - bt_object_get_no_null_check(trace->packet_header_fc); - bt_field_class_freeze(field_class); - BT_LIB_LOGV("Set trace's packet header field classe: %!+t", trace); - -end: - return ret; + return bt_trace_borrow_stream_by_id((void *) trace, id); } -bt_bool bt_trace_is_static(struct bt_trace *trace) +bt_bool bt_trace_is_static(const struct bt_trace *trace) { BT_ASSERT_PRE_NON_NULL(trace, "Trace"); return (bt_bool) trace->is_static; } -int bt_private_trace_make_static(struct bt_private_trace *priv_trace) -{ - struct bt_trace *trace = (void *) priv_trace; - uint64_t i; +enum bt_trace_status bt_trace_make_static(struct bt_trace *trace) +{ uint64_t i; BT_ASSERT_PRE_NON_NULL(trace, "Trace"); trace->is_static = true; @@ -559,16 +256,16 @@ int bt_private_trace_make_static(struct bt_private_trace *priv_trace) } } - return 0; + return BT_TRACE_STATUS_OK; } -int bt_private_trace_add_is_static_listener( - struct bt_private_trace *priv_trace, - bt_private_trace_is_static_listener listener, - bt_private_trace_listener_removed listener_removed, void *data, +enum bt_trace_status bt_trace_add_is_static_listener( + const struct bt_trace *c_trace, + bt_trace_is_static_listener_func listener, + bt_trace_listener_removed_func listener_removed, void *data, uint64_t *listener_id) { - struct bt_trace *trace = (void *) priv_trace; + struct bt_trace *trace = (void *) c_trace; uint64_t i; struct bt_trace_is_static_listener_elem new_elem = { .func = listener, @@ -607,12 +304,12 @@ int bt_private_trace_add_is_static_listener( BT_LIB_LOGV("Added \"trace is static\" listener: " "%![trace-]+t, listener-id=%" PRIu64, trace, i); - return 0; + return BT_TRACE_STATUS_OK; } BT_ASSERT_PRE_FUNC static -bool has_listener_id(struct bt_trace *trace, uint64_t listener_id) +bool has_listener_id(const struct bt_trace *trace, uint64_t listener_id) { BT_ASSERT(listener_id < trace->is_static_listeners->len); return (&g_array_index(trace->is_static_listeners, @@ -620,10 +317,10 @@ bool has_listener_id(struct bt_trace *trace, uint64_t listener_id) listener_id))->func != NULL; } -int bt_private_trace_remove_is_static_listener( - struct bt_private_trace *priv_trace, uint64_t listener_id) +enum bt_trace_status bt_trace_remove_is_static_listener( + const struct bt_trace *c_trace, uint64_t listener_id) { - struct bt_trace *trace = (void *) priv_trace; + struct bt_trace *trace = (void *) c_trace; struct bt_trace_is_static_listener_elem *elem; BT_ASSERT_PRE_NON_NULL(trace, "Trace"); @@ -656,34 +353,18 @@ int bt_private_trace_remove_is_static_listener( BT_LIB_LOGV("Removed \"trace is static\" listener: " "%![trace-]+t, listener-id=%" PRIu64, trace, listener_id); - return 0; + return BT_TRACE_STATUS_OK; } BT_HIDDEN -void _bt_trace_freeze(struct bt_trace *trace) +void _bt_trace_freeze(const struct bt_trace *trace) { - /* The packet header field classe is already frozen */ + /* The packet header field class is already frozen */ BT_ASSERT(trace); + BT_LIB_LOGD("Freezing trace's class: %!+T", trace->class); + bt_trace_class_freeze(trace->class); BT_LIB_LOGD("Freezing trace: %!+t", trace); - trace->frozen = true; -} - -bt_bool bt_trace_assigns_automatic_stream_class_id(struct bt_trace *trace) -{ - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - return (bt_bool) trace->assigns_automatic_stream_class_id; -} - -void bt_private_trace_set_assigns_automatic_stream_class_id( - struct bt_private_trace *priv_trace, bt_bool value) -{ - struct bt_trace *trace = (void *) priv_trace; - - BT_ASSERT_PRE_NON_NULL(trace, "Trace"); - BT_ASSERT_PRE_TRACE_HOT(trace); - trace->assigns_automatic_stream_class_id = (bool) value; - BT_LIB_LOGV("Set trace's automatic stream class ID " - "assignment property: %!+t", trace); + ((struct bt_trace *) trace)->frozen = true; } BT_HIDDEN @@ -706,8 +387,8 @@ void bt_trace_add_stream(struct bt_trace *trace, struct bt_stream *stream) } BT_HIDDEN -uint64_t bt_trace_get_automatic_stream_id(struct bt_trace *trace, - struct bt_stream_class *stream_class) +uint64_t bt_trace_get_automatic_stream_id(const struct bt_trace *trace, + const struct bt_stream_class *stream_class) { gpointer orig_key; gpointer value; @@ -722,3 +403,25 @@ uint64_t bt_trace_get_automatic_stream_id(struct bt_trace *trace, return id; } + +struct bt_trace_class *bt_trace_borrow_class(struct bt_trace *trace) +{ + BT_ASSERT_PRE_NON_NULL(trace, "Trace"); + return trace->class; +} + +const struct bt_trace_class *bt_trace_borrow_class_const( + const struct bt_trace *trace) +{ + return bt_trace_borrow_class((void *) trace); +} + +void bt_trace_get_ref(const struct bt_trace *trace) +{ + bt_object_get_ref(trace); +} + +void bt_trace_put_ref(const struct bt_trace *trace) +{ + bt_object_put_ref(trace); +}