+static
+void replace_clock_classes(const bt_trace *trace_copy,
+ bt_field_type *field_type)
+{
+ int ret;
+
+ BT_ASSERT(trace_copy);
+ BT_ASSERT(field_type);
+
+ switch (bt_field_type_get_type_id(field_type)) {
+ case BT_FIELD_TYPE_ID_INTEGER:
+ {
+ const bt_clock_class *mapped_clock_class =
+ bt_field_type_integer_get_mapped_clock_class(field_type);
+ const bt_clock_class *clock_class_copy = NULL;
+ const char *name;
+
+ if (!mapped_clock_class) {
+ break;
+ }
+
+ name = bt_clock_class_get_name(mapped_clock_class);
+ BT_ASSERT(name);
+ clock_class_copy = bt_trace_get_clock_class_by_name(
+ trace_copy, name);
+ BT_ASSERT(clock_class_copy);
+ ret = bt_field_type_integer_set_mapped_clock_class(
+ field_type, clock_class_copy);
+ BT_ASSERT(ret == 0);
+ bt_clock_class_put_ref(mapped_clock_class);
+ bt_clock_class_put_ref(clock_class_copy);
+ break;
+ }
+ case BT_FIELD_TYPE_ID_ENUM:
+ case BT_FIELD_TYPE_ID_ARRAY:
+ case BT_FIELD_TYPE_ID_SEQUENCE:
+ {
+ bt_field_type *subtype = NULL;
+
+ switch (bt_field_type_get_type_id(field_type)) {
+ case BT_FIELD_TYPE_ID_ENUM:
+ subtype = bt_field_type_enumeration_get_container_type(
+ field_type);
+ break;
+ case BT_FIELD_TYPE_ID_ARRAY:
+ subtype = bt_field_type_array_get_element_type(
+ field_type);
+ break;
+ case BT_FIELD_TYPE_ID_SEQUENCE:
+ subtype = bt_field_type_sequence_get_element_type(
+ field_type);
+ break;
+ default:
+ BT_LOGF("Unexpected field type ID: id=%d",
+ bt_field_type_get_type_id(field_type));
+ abort();
+ }
+
+ BT_ASSERT(subtype);
+ replace_clock_classes(trace_copy, subtype);
+ bt_object_put_ref(subtype);
+ break;
+ }
+ case BT_FIELD_TYPE_ID_STRUCT:
+ {
+ uint64_t i;
+ int64_t count = bt_field_type_structure_get_field_count(
+ field_type);
+
+ for (i = 0; i < count; i++) {
+ const char *name;
+ bt_field_type *member_type;
+
+ ret = bt_field_type_structure_get_field_by_index(
+ field_type, &name, &member_type, i);
+ BT_ASSERT(ret == 0);
+ replace_clock_classes(trace_copy, member_type);
+ bt_object_put_ref(member_type);
+ }
+
+ break;
+ }
+ case BT_FIELD_TYPE_ID_VARIANT:
+ {
+ uint64_t i;
+ int64_t count = bt_field_type_variant_get_field_count(
+ field_type);
+
+ for (i = 0; i < count; i++) {
+ const char *name;
+ bt_field_type *member_type;
+
+ ret = bt_field_type_variant_get_field_by_index(
+ field_type, &name, &member_type, i);
+ BT_ASSERT(ret == 0);
+ replace_clock_classes(trace_copy, member_type);
+ bt_object_put_ref(member_type);
+ }
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+