X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Ftrace-ir%2Fevent-class.c;h=db3911a083b6dd06adfc3af5bd50f1ce8e6ffb59;hb=68b66a256a54d32992dfefeaad11eea88b7df234;hp=15397ff657c3eb4e9a1210de9bab6f30019052a9;hpb=140e6d943ff8f5657db28fbbe24ee8c98b7ca2f9;p=babeltrace.git diff --git a/lib/trace-ir/event-class.c b/lib/trace-ir/event-class.c index 15397ff6..db3911a0 100644 --- a/lib/trace-ir/event-class.c +++ b/lib/trace-ir/event-class.c @@ -1,8 +1,7 @@ /* + * Copyright 2017-2018 Philippe Proulx * Copyright 2013, 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 @@ -23,35 +22,33 @@ */ #define BT_LOG_TAG "EVENT-CLASS" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #define BT_ASSERT_PRE_EVENT_CLASS_HOT(_ec) \ - BT_ASSERT_PRE_HOT(((struct bt_event_class *) (_ec)), \ + BT_ASSERT_PRE_HOT(((const struct bt_event_class *) (_ec)), \ "Event class", ": %!+E", (_ec)) static @@ -63,16 +60,18 @@ void destroy_event_class(struct bt_object *obj) if (event_class->name.str) { g_string_free(event_class->name.str, TRUE); + event_class->name.str = NULL; } if (event_class->emf_uri.str) { g_string_free(event_class->emf_uri.str, TRUE); + event_class->emf_uri.str = NULL; } - BT_LOGD_STR("Putting context field classe."); - bt_object_put_ref(event_class->specific_context_fc); - BT_LOGD_STR("Putting payload field classe."); - bt_object_put_ref(event_class->payload_fc); + BT_LOGD_STR("Putting context field class."); + BT_OBJECT_PUT_REF_AND_RESET(event_class->specific_context_fc); + BT_LOGD_STR("Putting payload field class."); + BT_OBJECT_PUT_REF_AND_RESET(event_class->payload_fc); bt_object_pool_finalize(&event_class->event_pool); g_free(obj); } @@ -86,13 +85,14 @@ void free_event(struct bt_event *event, BT_ASSERT_PRE_FUNC static -bool event_class_id_is_unique(struct bt_stream_class *stream_class, uint64_t id) +bool event_class_id_is_unique(const struct bt_stream_class *stream_class, + uint64_t id) { uint64_t i; bool is_unique = true; for (i = 0; i < stream_class->event_classes->len; i++) { - struct bt_event_class *ec = + const struct bt_event_class *ec = stream_class->event_classes->pdata[i]; if (ec->id == id) { @@ -166,58 +166,52 @@ end: return event_class; } -struct bt_private_event_class *bt_private_event_class_create( - struct bt_private_stream_class *priv_stream_class) +struct bt_event_class *bt_event_class_create( + struct bt_stream_class *stream_class) { - struct bt_stream_class *stream_class = (void *) priv_stream_class; - BT_ASSERT_PRE_NON_NULL(stream_class, "Stream class"); BT_ASSERT_PRE(stream_class->assigns_automatic_event_class_id, "Stream class does not automatically assigns event class IDs: " "%![sc-]+S", stream_class); - return (void *) create_event_class_with_id((void *) stream_class, + return create_event_class_with_id(stream_class, (uint64_t) stream_class->event_classes->len); } -struct bt_private_event_class *bt_private_event_class_create_with_id( - struct bt_private_stream_class *priv_stream_class, uint64_t id) +struct bt_event_class *bt_event_class_create_with_id( + struct bt_stream_class *stream_class, uint64_t id) { - struct bt_stream_class *stream_class = (void *) priv_stream_class; - BT_ASSERT_PRE(!stream_class->assigns_automatic_event_class_id, "Stream class automatically assigns event class IDs: " "%![sc-]+S", stream_class); - return (void *) create_event_class_with_id((void *) stream_class, id); + return create_event_class_with_id(stream_class, id); } -const char *bt_event_class_get_name(struct bt_event_class *event_class) +const char *bt_event_class_get_name(const struct bt_event_class *event_class) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); return event_class->name.value; } -int bt_private_event_class_set_name(struct bt_private_event_class *priv_event_class, - const char *name) +enum bt_event_class_status bt_event_class_set_name( + struct bt_event_class *event_class, const char *name) { - struct bt_event_class *event_class = (void *) priv_event_class; - BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); BT_ASSERT_PRE_NON_NULL(name, "Name"); BT_ASSERT_PRE_EVENT_CLASS_HOT(event_class); g_string_assign(event_class->name.str, name); event_class->name.value = event_class->name.str->str; BT_LIB_LOGV("Set event class's name: %!+E", event_class); - return 0; + return BT_EVENT_CLASS_STATUS_OK; } -uint64_t bt_event_class_get_id(struct bt_event_class *event_class) +uint64_t bt_event_class_get_id(const struct bt_event_class *event_class) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); return event_class->id; } enum bt_property_availability bt_event_class_get_log_level( - struct bt_event_class *event_class, + const struct bt_event_class *event_class, enum bt_event_class_log_level *log_level) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); @@ -227,12 +221,10 @@ enum bt_property_availability bt_event_class_get_log_level( return event_class->log_level.base.avail; } -void bt_private_event_class_set_log_level( - struct bt_private_event_class *priv_event_class, +void bt_event_class_set_log_level( + struct bt_event_class *event_class, enum bt_event_class_log_level log_level) { - struct bt_event_class *event_class = (void *) priv_event_class; - BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); BT_ASSERT_PRE_EVENT_CLASS_HOT(event_class); bt_property_uint_set(&event_class->log_level, @@ -240,25 +232,23 @@ void bt_private_event_class_set_log_level( BT_LIB_LOGV("Set event class's log level: %!+E", event_class); } -const char *bt_event_class_get_emf_uri(struct bt_event_class *event_class) +const char *bt_event_class_get_emf_uri(const struct bt_event_class *event_class) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); return event_class->emf_uri.value; } -int bt_private_event_class_set_emf_uri( - struct bt_private_event_class *priv_event_class, +enum bt_event_class_status bt_event_class_set_emf_uri( + struct bt_event_class *event_class, const char *emf_uri) { - struct bt_event_class *event_class = (void *) priv_event_class; - BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); BT_ASSERT_PRE_NON_NULL(emf_uri, "EMF URI"); BT_ASSERT_PRE_EVENT_CLASS_HOT(event_class); g_string_assign(event_class->emf_uri.str, emf_uri); event_class->emf_uri.value = event_class->emf_uri.str->str; BT_LIB_LOGV("Set event class's EMF URI: %!+E", event_class); - return 0; + return BT_EVENT_CLASS_STATUS_OK; } struct bt_stream_class *bt_event_class_borrow_stream_class( @@ -268,42 +258,37 @@ struct bt_stream_class *bt_event_class_borrow_stream_class( return bt_event_class_borrow_stream_class_inline(event_class); } -struct bt_private_stream_class * -bt_private_event_class_borrow_stream_class( - struct bt_private_event_class *event_class) +const struct bt_stream_class * +bt_event_class_borrow_stream_class_const( + const struct bt_event_class *event_class) { - return (void *) bt_event_class_borrow_stream_class( - (void *) event_class); + return bt_event_class_borrow_stream_class((void *) event_class); } -struct bt_field_class *bt_event_class_borrow_specific_context_field_class( - struct bt_event_class *event_class) +const struct bt_field_class * +bt_event_class_borrow_specific_context_field_class_const( + const struct bt_event_class *event_class) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); return event_class->specific_context_fc; } -struct bt_private_field_class * -bt_private_event_class_borrow_specific_context_field_class( - struct bt_private_event_class *event_class) +struct bt_field_class * +bt_event_class_borrow_specific_context_field_class( + struct bt_event_class *event_class) { - return (void *) bt_event_class_borrow_specific_context_field_class( - (void *) event_class); + BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); + return event_class->specific_context_fc; } -int bt_private_event_class_set_specific_context_field_class( - struct bt_private_event_class *priv_event_class, - struct bt_private_field_class *priv_field_class) +enum bt_event_class_status bt_event_class_set_specific_context_field_class( + struct bt_event_class *event_class, + struct bt_field_class *field_class) { int ret; - struct bt_event_class *event_class = (void *) priv_event_class; - struct bt_field_class *field_class = (void *) priv_field_class; struct bt_stream_class *stream_class; - struct bt_trace *trace; struct bt_resolve_field_path_context resolve_ctx = { - .packet_header = NULL, .packet_context = NULL, - .event_header = NULL, .event_common_context = NULL, .event_specific_context = field_class, .event_payload = NULL, @@ -314,60 +299,59 @@ int bt_private_event_class_set_specific_context_field_class( BT_ASSERT_PRE_EVENT_CLASS_HOT(event_class); BT_ASSERT_PRE(bt_field_class_get_type(field_class) == BT_FIELD_CLASS_TYPE_STRUCTURE, - "Specific context field classe is not a structure field classe: " + "Specific context field class is not a structure field class: " "%!+F", field_class); stream_class = bt_event_class_borrow_stream_class_inline( event_class); - trace = bt_stream_class_borrow_trace_inline(stream_class); - resolve_ctx.packet_header = trace->packet_header_fc; resolve_ctx.packet_context = stream_class->packet_context_fc; - resolve_ctx.event_header = stream_class->event_header_fc; resolve_ctx.event_common_context = stream_class->event_common_context_fc; ret = bt_resolve_field_paths(field_class, &resolve_ctx); if (ret) { + /* + * This is the only reason for which + * bt_resolve_field_paths() can fail: anything else + * would be because a precondition is not satisfied. + */ + ret = BT_EVENT_CLASS_STATUS_NOMEM; goto end; } - bt_field_class_make_part_of_trace(field_class); + bt_field_class_make_part_of_trace_class(field_class); bt_object_put_ref(event_class->specific_context_fc); - event_class->specific_context_fc = bt_object_get_ref(field_class); + event_class->specific_context_fc = field_class; + bt_object_get_no_null_check(event_class->specific_context_fc); bt_field_class_freeze(field_class); - BT_LIB_LOGV("Set event class's specific context field classe: %!+E", + BT_LIB_LOGV("Set event class's specific context field class: %!+E", event_class); end: return ret; } -struct bt_field_class *bt_event_class_borrow_payload_field_class( - struct bt_event_class *event_class) +const struct bt_field_class *bt_event_class_borrow_payload_field_class_const( + const struct bt_event_class *event_class) { BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); return event_class->payload_fc; } -struct bt_private_field_class *bt_private_event_class_borrow_payload_field_class( - struct bt_private_event_class *event_class) +struct bt_field_class *bt_event_class_borrow_payload_field_class( + struct bt_event_class *event_class) { - return (void *) bt_event_class_borrow_payload_field_class( - (void *) event_class); + BT_ASSERT_PRE_NON_NULL(event_class, "Event class"); + return event_class->payload_fc; } -int bt_private_event_class_set_payload_field_class( - struct bt_private_event_class *priv_event_class, - struct bt_private_field_class *priv_field_class) +enum bt_event_class_status bt_event_class_set_payload_field_class( + struct bt_event_class *event_class, + struct bt_field_class *field_class) { int ret; - struct bt_event_class *event_class = (void *) priv_event_class; - struct bt_field_class *field_class = (void *) priv_field_class; struct bt_stream_class *stream_class; - struct bt_trace *trace; struct bt_resolve_field_path_context resolve_ctx = { - .packet_header = NULL, .packet_context = NULL, - .event_header = NULL, .event_common_context = NULL, .event_specific_context = NULL, .event_payload = field_class, @@ -378,38 +362,52 @@ int bt_private_event_class_set_payload_field_class( BT_ASSERT_PRE_EVENT_CLASS_HOT(event_class); BT_ASSERT_PRE(bt_field_class_get_type(field_class) == BT_FIELD_CLASS_TYPE_STRUCTURE, - "Payload field classe is not a structure field classe: %!+F", + "Payload field class is not a structure field class: %!+F", field_class); stream_class = bt_event_class_borrow_stream_class_inline( event_class); - trace = bt_stream_class_borrow_trace_inline(stream_class); - resolve_ctx.packet_header = trace->packet_header_fc; resolve_ctx.packet_context = stream_class->packet_context_fc; - resolve_ctx.event_header = stream_class->event_header_fc; resolve_ctx.event_common_context = stream_class->event_common_context_fc; resolve_ctx.event_specific_context = event_class->specific_context_fc; ret = bt_resolve_field_paths(field_class, &resolve_ctx); if (ret) { + /* + * This is the only reason for which + * bt_resolve_field_paths() can fail: anything else + * would be because a precondition is not satisfied. + */ + ret = BT_EVENT_CLASS_STATUS_NOMEM; goto end; } - bt_field_class_make_part_of_trace(field_class); + bt_field_class_make_part_of_trace_class(field_class); bt_object_put_ref(event_class->payload_fc); - event_class->payload_fc = bt_object_get_ref(field_class); + event_class->payload_fc = field_class; + bt_object_get_no_null_check(event_class->payload_fc); bt_field_class_freeze(field_class); - BT_LIB_LOGV("Set event class's payload field classe: %!+E", event_class); + BT_LIB_LOGV("Set event class's payload field class: %!+E", event_class); end: return ret; } BT_HIDDEN -void _bt_event_class_freeze(struct bt_event_class *event_class) +void _bt_event_class_freeze(const struct bt_event_class *event_class) { /* The field classes are already frozen */ BT_ASSERT(event_class); BT_LIB_LOGD("Freezing event class: %!+E", event_class); - event_class->frozen = true; + ((struct bt_event_class *) event_class)->frozen = true; +} + +void bt_event_class_get_ref(const struct bt_event_class *event_class) +{ + bt_object_get_ref(event_class); +} + +void bt_event_class_put_ref(const struct bt_event_class *event_class) +{ + bt_object_put_ref(event_class); }