+ BT_LOGW("Cannot get unsigned integer field's value: "
+ "event-header-field-addr=%p, "
+ "timestamp-field-addr=%p",
+ event_header, timestamp_field);
+ goto end;
+ }
+
+end:
+ bt_put(timestamp_field);
+ bt_put(ts_field_mapped_clock_class);
+ return ret;
+}
+
+static
+int set_packet_context_timestamp_field(struct bt_ctf_stream *stream,
+ const char *field_name, struct bt_ctf_event *event)
+{
+ int ret = 0;
+ struct bt_ctf_field *field = bt_ctf_field_structure_get_field(
+ stream->packet_context, field_name);
+ struct bt_ctf_clock_class *field_mapped_clock_class = NULL;
+ uint64_t ts;
+
+ assert(stream);
+
+ if (!field) {
+ /* No beginning timestamp field found. Not an error, skip. */
+ BT_LOGV("No field named `%s` in packet context: skipping: "
+ "stream-addr=%p, stream-name=\"%s\"", field_name,
+ stream, bt_ctf_stream_get_name(stream));
+ goto end;
+ }
+
+ if (!stream->stream_class->clock) {
+ BT_LOGV("Stream has no clock: skipping: "
+ "stream-addr=%p, stream-name=\"%s\"",
+ stream, bt_ctf_stream_get_name(stream));
+ goto end;
+ }
+
+ field_mapped_clock_class =
+ bt_ctf_field_type_integer_get_mapped_clock_class(field->type);
+ if (!field_mapped_clock_class) {
+ BT_LOGV("Packet context's `%s` field's type is not mapped to a clock class: skipping: "
+ "stream-addr=%p, stream-name=\"%s\", "
+ "field-addr=%p, ft-addr=%p", field_name,
+ stream, bt_ctf_stream_get_name(stream),
+ field, field->type);
+ goto end;
+ }
+
+ if (field_mapped_clock_class !=
+ stream->stream_class->clock->clock_class) {
+ BT_LOGV("Packet context's `%s` field's type is not mapped to the stream's clock's class: skipping: "
+ "stream-addr=%p, stream-name=\"%s\", "
+ "field-addr=%p, ft-addr=%p, "
+ "ft-mapped-clock-class-addr=%p, "
+ "ft-mapped-clock-class-name=\"%s\", "
+ "stream-clock-class-addr=%p, "
+ "stream-clock-class-name=\"%s\"",
+ field_name,
+ stream, bt_ctf_stream_get_name(stream),
+ field, field->type,
+ field_mapped_clock_class,
+ bt_ctf_clock_class_get_name(field_mapped_clock_class),
+ stream->stream_class->clock->clock_class,
+ bt_ctf_clock_class_get_name(
+ stream->stream_class->clock->clock_class));
+ goto end;
+ }
+
+ if (get_event_header_timestamp(stream, event->event_header, &ts)) {
+ BT_LOGW("Cannot get event's timestamp: "
+ "event-header-field-addr=%p",
+ event->event_header);
+ ret = -1;
+ goto end;
+ }
+
+ ret = bt_ctf_field_unsigned_integer_set_value(field, ts);
+ if (ret) {
+ BT_LOGW("Cannot set packet context field's `%s` integer field's value: "
+ "stream-addr=%p, stream-name=\"%s\", field-addr=%p, value=%" PRIu64,
+ field_name, stream, bt_ctf_stream_get_name(stream),
+ field, stream->discarded_events);