static
struct bt_stream *medop_borrow_stream(
- struct bt_stream_class *stream_class, uint64_t stream_id,
+ struct bt_stream_class *stream_class, int64_t stream_id,
void *data)
{
struct ctf_fs_ds_file *ds_file = data;
struct bt_stream_class *ds_file_stream_class;
struct bt_stream *stream = NULL;
- ds_file_stream_class = bt_stream_borrow_class(ds_file->stream);
+ ds_file_stream_class = bt_stream_borrow_class(
+ ds_file->stream);
+
if (stream_class != ds_file_stream_class) {
/*
* Not supported: two packets described by two different
index->entries->len - 1);
}
-static
-struct bt_clock_class *borrow_field_mapped_clock_class(
- struct bt_field *field)
-{
- struct bt_field_type *field_type;
- struct bt_clock_class *clock_class = NULL;
-
- field_type = bt_field_borrow_type(field);
- if (!field_type) {
- goto end;
- }
-
- clock_class = bt_field_type_integer_borrow_mapped_clock_class(
- field_type);
- if (!clock_class) {
- goto end;
- }
-
-end:
- return clock_class;
-}
-
-static
-int borrow_packet_bounds_from_packet_context(
- struct bt_field *packet_context,
- struct bt_clock_class **_timestamp_begin_cc,
- struct bt_field **_timestamp_begin,
- struct bt_clock_class **_timestamp_end_cc,
- struct bt_field **_timestamp_end)
-{
- int ret = 0;
- struct bt_clock_class *timestamp_begin_cc = NULL;
- struct bt_clock_class *timestamp_end_cc = NULL;
- struct bt_field *timestamp_begin = NULL;
- struct bt_field *timestamp_end = NULL;
-
- timestamp_begin = bt_field_structure_borrow_field_by_name(
- packet_context, "timestamp_begin");
- if (!timestamp_begin) {
- BT_LOGD_STR("Cannot retrieve timestamp_begin field in packet context.");
- ret = -1;
- goto end;
- }
-
- timestamp_begin_cc = borrow_field_mapped_clock_class(timestamp_begin);
- if (!timestamp_begin_cc) {
- BT_LOGD_STR("Cannot retrieve the clock mapped to timestamp_begin.");
- }
-
- timestamp_end = bt_field_structure_borrow_field_by_name(
- packet_context, "timestamp_end");
- if (!timestamp_end) {
- BT_LOGD_STR("Cannot retrieve timestamp_end field in packet context.");
- ret = -1;
- goto end;
- }
-
- timestamp_end_cc = borrow_field_mapped_clock_class(timestamp_end);
- if (!timestamp_end_cc) {
- BT_LOGD_STR("Cannot retrieve the clock mapped to timestamp_end.");
- }
-
- if (_timestamp_begin_cc) {
- *_timestamp_begin_cc = timestamp_begin_cc;
- }
- if (_timestamp_begin) {
- *_timestamp_begin = timestamp_begin;
- }
- if (_timestamp_end_cc) {
- *_timestamp_end_cc = timestamp_end_cc;
- }
- if (_timestamp_end) {
- *_timestamp_end = timestamp_end;
- }
-end:
- return ret;
-}
-
-static
-int borrow_ds_file_packet_bounds_clock_classes(struct ctf_fs_ds_file *ds_file,
- struct bt_clock_class **timestamp_begin_cc,
- struct bt_clock_class **timestamp_end_cc)
-{
- struct bt_field *packet_context = NULL;
- int ret = ctf_fs_ds_file_borrow_packet_header_context_fields(ds_file,
- NULL, &packet_context);
-
- if (ret || !packet_context) {
- BT_LOGD("Cannot retrieve packet context field: ds-file-path=\"%s\"",
- ds_file->file->path->str);
- ret = -1;
- goto end;
- }
-
- ret = borrow_packet_bounds_from_packet_context(packet_context,
- timestamp_begin_cc, NULL,
- timestamp_end_cc, NULL);
-
-end:
- return ret;
-}
-
static
int convert_cycles_to_ns(struct bt_clock_class *clock_class,
uint64_t cycles, int64_t *ns)
{
- return bt_clock_class_cycles_to_ns(clock_class, cycles, ns);
+ return bt_clock_class_cycles_to_ns_from_origin(clock_class, cycles,
+ ns);
}
static
size_t file_index_entry_size;
size_t file_entry_count;
size_t i;
- struct bt_clock_class *timestamp_begin_cc = NULL;
- struct bt_clock_class *timestamp_end_cc = NULL;
+ struct ctf_stream_class *sc;
+ struct bt_notif_iter_packet_properties props;
BT_LOGD("Building index from .idx file of stream file %s",
ds_file->file->path->str);
- ret = borrow_ds_file_packet_bounds_clock_classes(ds_file,
- ×tamp_begin_cc, ×tamp_end_cc);
+ ret = bt_notif_iter_borrow_packet_header_context_fields(
+ ds_file->notif_iter, NULL, NULL);
if (ret) {
- BT_LOGD_STR("Cannot get clock classes of \"timestamp_begin\" "
- "and \"timestamp_end\" fields");
+ BT_LOGD_STR("Cannot borrow first packet's header and context "
+ "fields.");
+ goto error;
+ }
+
+ ret = bt_notif_iter_get_packet_properties(ds_file->notif_iter, &props);
+ BT_ASSERT(ret == 0);
+ sc = ctf_trace_class_borrow_stream_class_by_id(ds_file->metadata->tc,
+ props.stream_class_id);
+ BT_ASSERT(sc);
+ if (!sc->default_clock_class) {
+ BT_LOGD_STR("Cannot find stream class's default clock class.");
goto error;
}
}
/* Convert the packet's bound to nanoseconds since Epoch. */
- ret = convert_cycles_to_ns(timestamp_begin_cc,
+ ret = convert_cycles_to_ns(sc->default_clock_class,
index_entry->timestamp_begin,
&index_entry->timestamp_begin_ns);
if (ret) {
BT_LOGD_STR("Failed to convert raw timestamp to nanoseconds since Epoch during index parsing");
goto error;
}
- ret = convert_cycles_to_ns(timestamp_end_cc,
+ ret = convert_cycles_to_ns(sc->default_clock_class,
index_entry->timestamp_end,
&index_entry->timestamp_end_ns);
if (ret) {
static
int init_index_entry(struct ctf_fs_ds_index_entry *entry,
- struct bt_field *packet_context, off_t packet_size,
- off_t packet_offset)
+ struct ctf_fs_ds_file *ds_file,
+ struct bt_notif_iter_packet_properties *props,
+ off_t packet_size, off_t packet_offset)
{
int ret;
- struct bt_field *timestamp_begin = NULL;
- struct bt_field *timestamp_end = NULL;
- struct bt_clock_class *timestamp_begin_cc = NULL;
- struct bt_clock_class *timestamp_end_cc = NULL;
-
- ret = borrow_packet_bounds_from_packet_context(packet_context,
- ×tamp_begin_cc, ×tamp_begin,
- ×tamp_end_cc, ×tamp_end);
- if (ret || !timestamp_begin_cc || !timestamp_begin ||
- !timestamp_end_cc || ! timestamp_end) {
- BT_LOGD_STR("Failed to determine time bound fields of packet.");
- goto end;
- }
+ struct ctf_stream_class *sc;
+ sc = ctf_trace_class_borrow_stream_class_by_id(ds_file->metadata->tc,
+ props->stream_class_id);
+ BT_ASSERT(sc);
BT_ASSERT(packet_offset >= 0);
entry->offset = packet_offset;
-
BT_ASSERT(packet_size >= 0);
entry->packet_size = packet_size;
- ret = bt_field_integer_unsigned_get_value(timestamp_begin,
- &entry->timestamp_begin);
- if (ret) {
- goto end;
- }
- ret = bt_field_integer_unsigned_get_value(timestamp_end,
- &entry->timestamp_end);
- if (ret) {
- goto end;
- }
-
/* Convert the packet's bound to nanoseconds since Epoch. */
- ret = convert_cycles_to_ns(timestamp_begin_cc,
- entry->timestamp_begin,
+ ret = convert_cycles_to_ns(sc->default_clock_class,
+ props->snapshots.beginning_clock,
&entry->timestamp_begin_ns);
if (ret) {
BT_LOGD_STR("Failed to convert raw timestamp to nanoseconds since Epoch.");
goto end;
}
- ret = convert_cycles_to_ns(timestamp_end_cc,
- entry->timestamp_end,
+ ret = convert_cycles_to_ns(sc->default_clock_class,
+ props->snapshots.end_clock,
&entry->timestamp_end_ns);
if (ret) {
BT_LOGD_STR("Failed to convert raw timestamp to nanoseconds since Epoch.");
do {
off_t current_packet_offset;
off_t next_packet_offset;
- off_t current_packet_size, current_packet_size_bytes;
+ off_t current_packet_size_bytes;
struct ctf_fs_ds_index_entry *entry;
- struct bt_field *packet_context = NULL;
+ struct bt_notif_iter_packet_properties props;
iter_status = bt_notif_iter_borrow_packet_header_context_fields(
- ds_file->notif_iter, NULL, &packet_context);
+ ds_file->notif_iter, NULL, NULL);
if (iter_status != BT_NOTIF_ITER_STATUS_OK) {
if (iter_status == BT_NOTIF_ITER_STATUS_EOF) {
break;
goto error;
}
+ ret = bt_notif_iter_get_packet_properties(ds_file->notif_iter,
+ &props);
+ BT_ASSERT(ret == 0);
+
current_packet_offset =
bt_notif_iter_get_current_packet_offset(
ds_file->notif_iter);
goto error;
}
- current_packet_size = bt_notif_iter_get_current_packet_size(
- ds_file->notif_iter);
- if (current_packet_size < 0) {
- BT_LOGE("Cannot get packet size: packet-offset=%jd",
- current_packet_offset);
- goto error;
- }
current_packet_size_bytes =
- ((current_packet_size + 7) & ~7) / CHAR_BIT;
+ ((props.exp_packet_total_size + 7) & ~7) / CHAR_BIT;
if (current_packet_offset + current_packet_size_bytes >
ds_file->file->size) {
goto error;
}
- ret = init_index_entry(entry, packet_context,
- current_packet_size_bytes,
- current_packet_offset);
+ ret = init_index_entry(entry, ds_file, &props,
+ current_packet_size_bytes, current_packet_offset);
if (ret) {
goto error;
}
BT_HIDDEN
struct ctf_fs_ds_file *ctf_fs_ds_file_create(
struct ctf_fs_trace *ctf_fs_trace,
- struct bt_graph *graph, struct bt_notif_iter *notif_iter,
+ struct bt_self_notification_iterator *pc_notif_iter,
+ struct bt_notif_iter *notif_iter,
struct bt_stream *stream, const char *path)
{
int ret;
goto error;
}
- ds_file->graph = graph;
+ ds_file->pc_notif_iter = pc_notif_iter;
ds_file->file = ctf_fs_file_create();
if (!ds_file->file) {
goto error;
}
- ds_file->stream = bt_get(stream);
- ds_file->cc_prio_map = bt_get(ctf_fs_trace->cc_prio_map);
+ ds_file->stream = stream;
+ bt_object_get_ref(ds_file->stream);
+ ds_file->metadata = ctf_fs_trace->metadata;
g_string_assign(ds_file->file->path, path);
ret = ctf_fs_file_open(ds_file->file, "rb");
if (ret) {
return;
}
- bt_put(ds_file->cc_prio_map);
- bt_put(ds_file->stream);
+ bt_object_put_ref(ds_file->stream);
(void) ds_file_munmap(ds_file);
if (ds_file->file) {
enum bt_notification_iterator_status status;
notif_iter_status = bt_notif_iter_get_next_notification(
- ds_file->notif_iter, ds_file->graph, notif);
+ ds_file->notif_iter, ds_file->pc_notif_iter, notif);
switch (notif_iter_status) {
case BT_NOTIF_ITER_STATUS_EOF:
status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
break;
}
-
return status;
}