lib: trace IR, values: reset pointers to `NULL` on destruction
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Fri, 30 Nov 2018 20:51:42 +0000 (15:51 -0500)
committerFrancis Deslauriers <francis.deslauriers@efficios.com>
Thu, 2 May 2019 20:50:15 +0000 (20:50 +0000)
When an object's member is destroyed, internally, reset its pointer
to `NULL` immediately. This makes it possible to log partial objects
during destruction while keeping Valgrind's memcheck happy.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
14 files changed:
lib/trace-ir/attributes.c
lib/trace-ir/clock-class.c
lib/trace-ir/clock-value.c
lib/trace-ir/event-class.c
lib/trace-ir/event.c
lib/trace-ir/field-classes.c
lib/trace-ir/field-path.c
lib/trace-ir/field-wrapper.c
lib/trace-ir/fields.c
lib/trace-ir/packet.c
lib/trace-ir/stream-class.c
lib/trace-ir/stream.c
lib/trace-ir/trace.c
lib/values.c

index 68c83f5f1e23309277acf0f251c3bea628a1b8eb..44068de24c0e6387d457820447215e111d14c731 100644 (file)
@@ -71,7 +71,7 @@ BT_HIDDEN
 void bt_attributes_destroy(struct bt_private_value *attr_obj)
 {
        BT_LOGD("Destroying attributes object: addr=%p", attr_obj);
-       bt_object_put_ref(attr_obj);
+       BT_OBJECT_PUT_REF_AND_RESET(attr_obj);
 }
 
 BT_HIDDEN
index d268ec3f560d15f9bb609ddaf10bc71eed59037b..4cfd01c852128e46eb178375b28298a6557891d4 100644 (file)
@@ -50,10 +50,14 @@ void destroy_clock_class(struct bt_object *obj)
 
        if (clock_class->name.str) {
                g_string_free(clock_class->name.str, TRUE);
+               clock_class->name.str = NULL;
+               clock_class->name.value = NULL;
        }
 
        if (clock_class->description.str) {
                g_string_free(clock_class->description.str, TRUE);
+               clock_class->description.str = NULL;
+               clock_class->description.value = NULL;
        }
 
        bt_object_pool_finalize(&clock_class->cv_pool);
index 877d8687f8b0968e751c63273e56c53133e4565e..affc565c02cd1a0f5eb543a952df10fdb995f296 100644 (file)
@@ -39,7 +39,7 @@ BT_HIDDEN
 void bt_clock_value_destroy(struct bt_clock_value *clock_value)
 {
        BT_LIB_LOGD("Destroying clock value: %!+k", clock_value);
-       bt_object_put_ref(clock_value->clock_class);
+       BT_OBJECT_PUT_REF_AND_RESET(clock_value->clock_class);
        g_free(clock_value);
 }
 
index 15397ff657c3eb4e9a1210de9bab6f30019052a9..685c09c32b2153ce2d65bad7072a05e590de81f0 100644 (file)
@@ -63,16 +63,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_OBJECT_PUT_REF_AND_RESET(event_class->specific_context_fc);
        BT_LOGD_STR("Putting payload field classe.");
-       bt_object_put_ref(event_class->payload_fc);
+       BT_OBJECT_PUT_REF_AND_RESET(event_class->payload_fc);
        bt_object_pool_finalize(&event_class->event_pool);
        g_free(obj);
 }
index dc88ab5c1404f3aa653cae59794dda3ce9faf1ba..7d31a40162b67734511b477ed34ec0113dd124d9 100644 (file)
@@ -283,21 +283,25 @@ void bt_event_destroy(struct bt_event *event)
        if (event->header_field) {
                BT_LOGD_STR("Releasing event's header field.");
                release_event_header_field(event->header_field, event);
+               event->header_field = NULL;
        }
 
        if (event->common_context_field) {
                BT_LOGD_STR("Destroying event's stream event context field.");
                bt_field_destroy(event->common_context_field);
+               event->common_context_field = NULL;
        }
 
        if (event->specific_context_field) {
                BT_LOGD_STR("Destroying event's context field.");
                bt_field_destroy(event->specific_context_field);
+               event->specific_context_field = NULL;
        }
 
        if (event->payload_field) {
                BT_LOGD_STR("Destroying event's payload field.");
                bt_field_destroy(event->payload_field);
+               event->payload_field = NULL;
        }
 
        BT_LOGD_STR("Putting event's class.");
@@ -305,10 +309,11 @@ void bt_event_destroy(struct bt_event *event)
 
        if (event->default_cv) {
                bt_clock_value_recycle(event->default_cv);
+               event->default_cv = NULL;
        }
 
        BT_LOGD_STR("Putting event's packet.");
-       bt_object_put_ref(event->packet);
+       BT_OBJECT_PUT_REF_AND_RESET(event->packet);
        g_free(event);
 }
 
index 485482f83e876152db1ee000a3c962f212e7ef86..2adf0348b9d78a26daea2c2db31e636a53ce506b 100644 (file)
@@ -216,10 +216,12 @@ void destroy_enumeration_field_class(struct bt_object *obj)
                }
 
                g_array_free(fc->mappings, TRUE);
+               fc->mappings = NULL;
        }
 
        if (fc->label_buf) {
                g_ptr_array_free(fc->label_buf, TRUE);
+               fc->label_buf = NULL;
        }
 
        g_free(fc);
@@ -668,7 +670,7 @@ void finalize_named_field_class(struct bt_named_field_class *named_fc)
        }
 
        BT_LOGD_STR("Putting named field class's field class.");
-       bt_object_put_ref(named_fc->fc);
+       BT_OBJECT_PUT_REF_AND_RESET(named_fc->fc);
 }
 
 static
@@ -876,7 +878,9 @@ void destroy_variant_field_class(struct bt_object *obj)
        BT_LIB_LOGD("Destroying variant field class object: %!+F", fc);
        finalize_named_field_classes_container((void *) fc);
        BT_LOGD_STR("Putting selector field path.");
-       bt_object_put_ref(fc->selector_field_path);
+       BT_OBJECT_PUT_REF_AND_RESET(fc->selector_field_path);
+       BT_LOGD_STR("Putting selector field class.");
+       BT_OBJECT_PUT_REF_AND_RESET(fc->selector_fc);
        g_free(fc);
 }
 
@@ -920,7 +924,7 @@ int bt_private_field_class_variant_set_selector_field_class(
        BT_ASSERT_PRE_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_VARIANT, "Field class");
        BT_ASSERT_PRE_FC_IS_ENUM(selector_fc, "Selector field class");
        BT_ASSERT_PRE_FC_HOT(fc, "Variant field class");
-       var_fc->selector_fc = (void *) selector_fc;
+       var_fc->selector_fc = bt_object_get_ref(selector_fc);
        bt_field_class_freeze((void *) selector_fc);
        return 0;
 }
@@ -1008,7 +1012,7 @@ void finalize_array_field_class(struct bt_field_class_array *array_fc)
 {
        BT_ASSERT(array_fc);
        BT_LOGD_STR("Putting element field class.");
-       bt_object_put_ref(array_fc->element_fc);
+       BT_OBJECT_PUT_REF_AND_RESET(array_fc->element_fc);
 }
 
 static
@@ -1086,7 +1090,9 @@ void destroy_dynamic_array_field_class(struct bt_object *obj)
        BT_LIB_LOGD("Destroying dynamic array field class object: %!+F", fc);
        finalize_array_field_class((void *) fc);
        BT_LOGD_STR("Putting length field path.");
-       bt_object_put_ref(fc->length_field_path);
+       BT_OBJECT_PUT_REF_AND_RESET(fc->length_field_path);
+       BT_LOGD_STR("Putting length field class.");
+       BT_OBJECT_PUT_REF_AND_RESET(fc->length_fc);
        g_free(fc);
 }
 
@@ -1130,7 +1136,7 @@ int bt_private_field_class_dynamic_array_set_length_field_class(
                "Field class");
        BT_ASSERT_PRE_FC_IS_UNSIGNED_INT(length_fc, "Length field class");
        BT_ASSERT_PRE_FC_HOT(fc, "Dynamic array field class");
-       array_fc->length_fc = length_fc;
+       array_fc->length_fc = bt_object_get_ref(length_fc);
        bt_field_class_freeze(length_fc);
        return 0;
 }
index 613974e699802c84c638d301fd00db167ba7863d..48a03a86b5ec82472a1bf18a75f55a4738c1b75d 100644 (file)
@@ -44,6 +44,7 @@ void destroy_field_path(struct bt_object *obj)
        BT_ASSERT(field_path);
        BT_LIB_LOGD("Destroying field path: %!+P", field_path);
        g_array_free(field_path->indexes, TRUE);
+       field_path->indexes = NULL;
        g_free(field_path);
 }
 
index ed50537abc03b6ec1c1220cb80a112632677d543..08cd11e6af63f40ba0d0014b5491f14b3a22c000 100644 (file)
@@ -58,6 +58,7 @@ void bt_field_wrapper_destroy(struct bt_field_wrapper *field_wrapper)
        if (field_wrapper->field) {
                BT_LOGD_STR("Destroying field.");
                bt_field_destroy((void *) field_wrapper->field);
+               field_wrapper->field = NULL;
        }
 
        BT_LOGD_STR("Putting stream class.");
index 91e85099fefe0aa1a20de5ce7b72b99f23a368d8..8eadc75711f9e902fbe187ae9e90a99dacec7865 100644 (file)
@@ -871,7 +871,7 @@ void bt_field_finalize(struct bt_field *field)
 {
        BT_ASSERT(field);
        BT_LOGD_STR("Putting field's class.");
-       bt_object_put_ref(field->class);
+       BT_OBJECT_PUT_REF_AND_RESET(field->class);
 }
 
 static
@@ -903,6 +903,7 @@ void destroy_structure_field(struct bt_field *field)
 
        if (struct_field->fields) {
                g_ptr_array_free(struct_field->fields, TRUE);
+               struct_field->fields = NULL;
        }
 
        g_free(field);
@@ -919,6 +920,7 @@ void destroy_variant_field(struct bt_field *field)
 
        if (var_field->fields) {
                g_ptr_array_free(var_field->fields, TRUE);
+               var_field->fields = NULL;
        }
 
        g_free(field);
@@ -935,6 +937,7 @@ void destroy_array_field(struct bt_field *field)
 
        if (array_field->fields) {
                g_ptr_array_free(array_field->fields, TRUE);
+               array_field->fields = NULL;
        }
 
        g_free(field);
@@ -951,6 +954,7 @@ void destroy_string_field(struct bt_field *field)
 
        if (string_field->buf) {
                g_array_free(string_field->buf, TRUE);
+               string_field->buf = NULL;
        }
 
        g_free(field);
index 44a06fb0f77107273233d2a8647448412ed5828f..983887c42ebe1166cd5a8612cf48d7f2e8ad1799 100644 (file)
@@ -218,6 +218,8 @@ void bt_packet_destroy(struct bt_packet *packet)
                } else {
                        bt_field_wrapper_destroy(packet->header_field);
                }
+
+               packet->header_field = NULL;
        }
 
        if (packet->context_field) {
@@ -228,20 +230,24 @@ void bt_packet_destroy(struct bt_packet *packet)
                } else {
                        bt_field_wrapper_destroy(packet->context_field);
                }
+
+               packet->context_field = NULL;
        }
 
        if (packet->default_beginning_cv) {
                BT_LOGD_STR("Recycling beginning clock value.");
                bt_clock_value_recycle(packet->default_beginning_cv);
+               packet->default_beginning_cv = NULL;
        }
 
        if (packet->default_end_cv) {
                BT_LOGD_STR("Recycling end clock value.");
                bt_clock_value_recycle(packet->default_end_cv);
+               packet->default_end_cv = NULL;
        }
 
        BT_LOGD_STR("Putting packet's stream.");
-       bt_object_put_ref(packet->stream);
+       BT_OBJECT_PUT_REF_AND_RESET(packet->stream);
        g_free(packet);
 }
 
index d3e1e90ec834fd070da22e0ff6417ad4d428375d..9d016844f83bfe14038dbe1845e1bc78679607c8 100644 (file)
@@ -56,23 +56,26 @@ void destroy_stream_class(struct bt_object *obj)
 
        BT_LIB_LOGD("Destroying stream class: %!+S", stream_class);
        BT_LOGD_STR("Putting default clock class.");
-       bt_object_put_ref(stream_class->default_clock_class);
+       BT_OBJECT_PUT_REF_AND_RESET(stream_class->default_clock_class);
 
        if (stream_class->event_classes) {
                BT_LOGD_STR("Destroying event classes.");
                g_ptr_array_free(stream_class->event_classes, TRUE);
+               stream_class->event_classes = NULL;
        }
 
        if (stream_class->name.str) {
                g_string_free(stream_class->name.str, TRUE);
+               stream_class->name.str = NULL;
+               stream_class->name.value = NULL;
        }
 
        BT_LOGD_STR("Putting event header field classe.");
-       bt_object_put_ref(stream_class->event_header_fc);
+       BT_OBJECT_PUT_REF_AND_RESET(stream_class->event_header_fc);
        BT_LOGD_STR("Putting packet context field classe.");
-       bt_object_put_ref(stream_class->packet_context_fc);
+       BT_OBJECT_PUT_REF_AND_RESET(stream_class->packet_context_fc);
        BT_LOGD_STR("Putting event common context field classe.");
-       bt_object_put_ref(stream_class->event_common_context_fc);
+       BT_OBJECT_PUT_REF_AND_RESET(stream_class->event_common_context_fc);
        bt_object_pool_finalize(&stream_class->event_header_field_pool);
        bt_object_pool_finalize(&stream_class->packet_context_field_pool);
        g_free(stream_class);
index 5bf37b52a01d0b90c1c94e9d6dbbe16d91f157e8..c90728daf91ac820198b2fa6706042b35f247c6b 100644 (file)
@@ -54,6 +54,8 @@ void destroy_stream(struct bt_object *obj)
 
        if (stream->name.str) {
                g_string_free(stream->name.str, TRUE);
+               stream->name.str = NULL;
+               stream->name.value = NULL;
        }
 
        bt_object_pool_finalize(&stream->packet_pool);
index b57f2dcc1e311fb5464f3e183a8e4cdc07789497..f5c66cb8332d22087d6ac4f1a0e5ccbd77542bde 100644 (file)
@@ -89,6 +89,7 @@ void destroy_trace(struct bt_object *obj)
                }
 
                g_array_free(trace->is_static_listeners, TRUE);
+               trace->is_static_listeners = NULL;
        }
 
        bt_object_pool_finalize(&trace->packet_header_field_pool);
@@ -96,28 +97,35 @@ void destroy_trace(struct bt_object *obj)
        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;
+               trace->name.value = NULL;
        }
 
        if (trace->streams) {
                BT_LOGD_STR("Destroying streams.");
                g_ptr_array_free(trace->streams, TRUE);
+               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;
        g_free(trace);
 }
 
index d14bec8447a6473ecf8f226123ef1c4979d8c4f1..ffe289c2bdeec5d44e3466619ebfbf0090866e60 100644 (file)
@@ -130,6 +130,7 @@ static
 void bt_value_string_destroy(struct bt_value *object)
 {
        g_string_free(BT_VALUE_TO_STRING(object)->gstr, TRUE);
+       BT_VALUE_TO_STRING(object)->gstr = NULL;
 }
 
 static
@@ -140,6 +141,7 @@ void bt_value_array_destroy(struct bt_value *object)
         * of putting each contained object.
         */
        g_ptr_array_free(BT_VALUE_TO_ARRAY(object)->garray, TRUE);
+       BT_VALUE_TO_ARRAY(object)->garray = NULL;
 }
 
 static
@@ -151,6 +153,7 @@ void bt_value_map_destroy(struct bt_value *object)
         * be destroyed anyway.
         */
        g_hash_table_destroy(BT_VALUE_TO_MAP(object)->ght);
+       BT_VALUE_TO_MAP(object)->ght = NULL;
 }
 
 static
This page took 0.032516 seconds and 4 git commands to generate.