- if (offset < ds_file->mmap_offset ||
- offset >= ds_file->mmap_offset + ds_file->mmap_len) {
- int unmap_ret;
- BT_COMP_LOGD("Medium seek request cannot be accomodated by the current "
- "file mapping: offset=%jd, mmap-offset=%jd, "
- "mmap-len=%zu", offset, ds_file->mmap_offset,
- ds_file->mmap_len);
- unmap_ret = ds_file_munmap(ds_file);
- if (unmap_ret) {
- ret = BT_MSG_ITER_MEDIUM_STATUS_ERROR;
+ guint next_index_entry_index;
+
+ /*
+ * File we are currently reading. Changes whenever we switch to
+ * reading another data file.
+ *
+ * Owned by this.
+ */
+ struct ctf_fs_ds_file *file;
+
+ /* Weak, for context / logging / appending causes. */
+ bt_self_message_iterator *self_msg_iter;
+ bt_logging_level log_level;
+};
+
+static
+enum ctf_msg_iter_medium_status medop_group_request_bytes(
+ size_t request_sz,
+ uint8_t **buffer_addr,
+ size_t *buffer_sz,
+ void *void_data)
+{
+ struct ctf_fs_ds_group_medops_data *data = void_data;
+
+ /* Return bytes from the current file. */
+ return medop_request_bytes(request_sz, buffer_addr, buffer_sz, data->file);
+}
+
+static
+bt_stream *medop_group_borrow_stream(
+ bt_stream_class *stream_class,
+ int64_t stream_id,
+ void *void_data)
+{
+ struct ctf_fs_ds_group_medops_data *data = void_data;
+
+ return medop_borrow_stream(stream_class, stream_id, data->file);
+}
+
+/*
+ * Set `data->file` to prepare it to read the packet described
+ * by `index_entry`.
+ */
+
+static
+enum ctf_msg_iter_medium_status ctf_fs_ds_group_medops_set_file(
+ struct ctf_fs_ds_group_medops_data *data,
+ struct ctf_fs_ds_index_entry *index_entry,
+ bt_self_message_iterator *self_msg_iter,
+ bt_logging_level log_level)
+{
+ enum ctf_msg_iter_medium_status status;
+
+ BT_ASSERT(data);
+ BT_ASSERT(index_entry);
+
+ /* Check if that file is already the one mapped. */
+ if (!data->file || strcmp(index_entry->path, data->file->file->path->str) != 0) {
+ /* Destroy the previously used file. */
+ ctf_fs_ds_file_destroy(data->file);
+
+ /* Create the new file. */
+ data->file = ctf_fs_ds_file_create(
+ data->ds_file_group->ctf_fs_trace,
+ self_msg_iter,
+ data->ds_file_group->stream,
+ index_entry->path,
+ log_level);
+ if (!data->file) {
+ BT_MSG_ITER_LOGE_APPEND_CAUSE(self_msg_iter,
+ "failed to create ctf_fs_ds_file.");
+ status = CTF_MSG_ITER_MEDIUM_STATUS_ERROR;