#include "logging.h"
#include <babeltrace/babeltrace.h>
-#include <assert.h>
+#include <babeltrace/assert-internal.h>
#include "ctfcopytrace.h"
#include "clock-fields.h"
const char *name, *description;
struct bt_clock_class *writer_clock_class = NULL;
- assert(err && clock_class);
+ BT_ASSERT(err && clock_class);
name = bt_clock_class_get_name(clock_class);
- assert(name);
+ BT_ASSERT(name);
writer_clock_class = bt_clock_class_create(name,
bt_clock_class_get_frequency(clock_class));
if (description) {
int_ret = bt_clock_class_set_description(writer_clock_class,
description);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
}
u64_ret = bt_clock_class_get_precision(clock_class);
- assert(u64_ret != -1ULL);
+ BT_ASSERT(u64_ret != -1ULL);
int_ret = bt_clock_class_set_precision(writer_clock_class,
u64_ret);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
int_ret = bt_clock_class_get_offset_s(clock_class, &offset_s);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
int_ret = bt_clock_class_set_offset_s(writer_clock_class, offset_s);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
int_ret = bt_clock_class_get_offset_cycles(clock_class, &offset);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
int_ret = bt_clock_class_set_offset_cycles(writer_clock_class, offset);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
int_ret = bt_clock_class_is_absolute(clock_class);
- assert(int_ret >= 0);
+ BT_ASSERT(int_ret >= 0);
int_ret = bt_clock_class_set_is_absolute(writer_clock_class, int_ret);
- assert(!int_ret);
+ BT_ASSERT(!int_ret);
end:
return writer_clock_class;
struct bt_clock_class *clock_class =
bt_trace_get_clock_class_by_index(trace, i);
- assert(clock_class);
+ BT_ASSERT(clock_class);
writer_clock_class = ctf_copy_clock_class(err, clock_class);
bt_put(clock_class);
return ret;
}
+static
+void replace_clock_classes(struct bt_trace *trace_copy,
+ struct 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:
+ {
+ struct bt_clock_class *mapped_clock_class =
+ bt_field_type_integer_get_mapped_clock_class(field_type);
+ struct 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_put(mapped_clock_class);
+ bt_put(clock_class_copy);
+ break;
+ }
+ case BT_FIELD_TYPE_ID_ENUM:
+ case BT_FIELD_TYPE_ID_ARRAY:
+ case BT_FIELD_TYPE_ID_SEQUENCE:
+ {
+ struct 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_put(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;
+ struct 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_put(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;
+ struct 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_put(member_type);
+ }
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
BT_HIDDEN
struct bt_event_class *ctf_copy_event_class(FILE *err,
+ struct bt_trace *trace_copy,
struct bt_event_class *event_class)
{
struct bt_event_class *writer_event_class = NULL;
- struct bt_field_type *context, *payload_type;
+ struct bt_field_type *context = NULL, *payload_type = NULL;
const char *name;
int ret;
int64_t id;
name = bt_event_class_get_name(event_class);
writer_event_class = bt_event_class_create(name);
- assert(writer_event_class);
+ BT_ASSERT(writer_event_class);
id = bt_event_class_get_id(event_class);
- assert(id >= 0);
+ BT_ASSERT(id >= 0);
ret = bt_event_class_set_id(writer_event_class, id);
if (ret) {
payload_type = bt_event_class_get_payload_type(event_class);
if (payload_type) {
+ struct bt_field_type *ft_copy =
+ bt_field_type_copy(payload_type);
+
+ if (!ft_copy) {
+ BT_LOGE_STR("Cannot copy payload field type.");
+ }
+
+ replace_clock_classes(trace_copy, ft_copy);
ret = bt_event_class_set_payload_type(writer_event_class,
- payload_type);
+ ft_copy);
+ bt_put(ft_copy);
if (ret < 0) {
BT_LOGE_STR("Failed to set payload type.");
goto error;
}
- BT_PUT(payload_type);
}
context = bt_event_class_get_context_type(event_class);
if (context) {
+ struct bt_field_type *ft_copy =
+ bt_field_type_copy(context);
+
+ if (!ft_copy) {
+ BT_LOGE_STR("Cannot copy context field type.");
+ }
+
ret = bt_event_class_set_context_type(
- writer_event_class, context);
- BT_PUT(context);
+ writer_event_class, ft_copy);
+ bt_put(ft_copy);
if (ret < 0) {
BT_LOGE_STR("Failed to set context type.");
goto error;
error:
BT_PUT(writer_event_class);
end:
+ BT_PUT(context);
+ BT_PUT(payload_type);
return writer_event_class;
}
enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
struct bt_event_class *event_class = NULL, *writer_event_class = NULL;
int count, i;
+ struct bt_trace *writer_trace =
+ bt_stream_class_get_trace(writer_stream_class);
+ BT_ASSERT(writer_trace);
count = bt_stream_class_get_event_class_count(stream_class);
- assert(count >= 0);
+ BT_ASSERT(count >= 0);
for (i = 0; i < count; i++) {
int int_ret;
event_class = bt_stream_class_get_event_class_by_index(
stream_class, i);
- assert(event_class);
+ BT_ASSERT(event_class);
if (i < bt_stream_class_get_event_class_count(writer_stream_class)) {
writer_event_class = bt_stream_class_get_event_class_by_index(
}
}
- writer_event_class = ctf_copy_event_class(err, event_class);
+ writer_event_class = ctf_copy_event_class(err, writer_trace,
+ event_class);
if (!writer_event_class) {
BT_LOGE_STR("Failed to copy event_class.");
ret = BT_COMPONENT_STATUS_ERROR;
bt_put(event_class);
bt_put(writer_event_class);
end:
+ bt_put(writer_trace);
return ret;
}
bool override_ts64)
{
struct bt_field_type *type = NULL;
+ struct bt_field_type *type_copy = NULL;
struct bt_stream_class *writer_stream_class = NULL;
int ret_int;
const char *name = bt_stream_class_get_name(stream_class);
writer_stream_class = bt_stream_class_create_empty(name);
- assert(writer_stream_class);
+ BT_ASSERT(writer_stream_class);
type = bt_stream_class_get_packet_context_type(stream_class);
if (type) {
+ type_copy = bt_field_type_copy(type);
+ if (!type_copy) {
+ BT_LOGE_STR("Cannot copy packet context field type.");
+ }
+
+ replace_clock_classes(writer_trace, type_copy);
ret_int = bt_stream_class_set_packet_context_type(
- writer_stream_class, type);
+ writer_stream_class, type_copy);
+ BT_PUT(type_copy);
if (ret_int < 0) {
BT_LOGE_STR("Failed to set packet_context type.");
goto error;
type = bt_stream_class_get_event_header_type(stream_class);
if (type) {
+ type_copy = bt_field_type_copy(type);
+ if (!type_copy) {
+ BT_LOGE_STR("Cannot copy event header field type.");
+ }
+
ret_int = bt_trace_get_clock_class_count(writer_trace);
- assert(ret_int >= 0);
+ BT_ASSERT(ret_int >= 0);
if (override_ts64 && ret_int > 0) {
struct bt_field_type *new_event_header_type;
- new_event_header_type = override_header_type(err, type,
+ new_event_header_type = override_header_type(err, type_copy,
writer_trace);
if (!new_event_header_type) {
BT_LOGE_STR("Failed to override header type.");
goto error;
}
+ replace_clock_classes(writer_trace, type_copy);
ret_int = bt_stream_class_set_event_header_type(
writer_stream_class, new_event_header_type);
+ BT_PUT(type_copy);
BT_PUT(new_event_header_type);
if (ret_int < 0) {
BT_LOGE_STR("Failed to set event_header type.");
goto error;
}
} else {
+ replace_clock_classes(writer_trace, type_copy);
ret_int = bt_stream_class_set_event_header_type(
- writer_stream_class, type);
+ writer_stream_class, type_copy);
+ BT_PUT(type_copy);
if (ret_int < 0) {
BT_LOGE_STR("Failed to set event_header type.");
goto error;
type = bt_stream_class_get_event_context_type(stream_class);
if (type) {
+ type_copy = bt_field_type_copy(type);
+ if (!type_copy) {
+ BT_LOGE_STR("Cannot copy event context field type.");
+ }
+
+ replace_clock_classes(writer_trace, type_copy);
ret_int = bt_stream_class_set_event_context_type(
- writer_stream_class, type);
+ writer_stream_class, type_copy);
+ BT_PUT(type_copy);
if (ret_int < 0) {
BT_LOGE_STR("Failed to set event_contexttype.");
goto error;
BT_PUT(writer_stream_class);
end:
bt_put(type);
+ bt_put(type_copy);
return writer_stream_class;
}
clock_value = bt_event_get_clock_value(event, clock_class);
BT_PUT(clock_class);
- assert(clock_value);
+ BT_ASSERT(clock_value);
ret = bt_clock_value_get_value(clock_value, &value);
BT_PUT(clock_value);
struct bt_stream_class *stream_class = NULL;
stream_class = bt_event_class_get_stream_class(event_class);
- assert(stream_class);
+ BT_ASSERT(stream_class);
trace = bt_stream_class_get_trace(stream_class);
- assert(trace);
+ BT_ASSERT(trace);
bt_put(stream_class);
return trace;
* is.
*/
ret = bt_trace_get_clock_class_count(writer_trace);
- assert(ret >= 0);
+ BT_ASSERT(ret >= 0);
if (override_ts64 && ret > 0) {
copy_field = bt_event_get_header(writer_event);
- assert(copy_field);
+ BT_ASSERT(copy_field);
ret = copy_override_field(err, event, writer_event, field,
copy_field);
name = bt_trace_get_environment_field_name_by_index(
trace, i);
- assert(name);
+ BT_ASSERT(name);
value = bt_trace_get_environment_field_value_by_index(
trace, i);
- assert(value);
+ BT_ASSERT(value);
ret_int = bt_trace_set_environment_field(writer_trace,
name, value);
}
order = bt_trace_get_native_byte_order(trace);
- assert(order != BT_BYTE_ORDER_UNKNOWN);
+ BT_ASSERT(order != BT_BYTE_ORDER_UNKNOWN);
/*
* Only explicitly set the writer trace's native byte order if