static inline
size_t remaining_mmap_bytes(struct ctf_fs_ds_file *ds_file)
{
- return ds_file->mmap_valid_len - ds_file->request_offset;
+ return ds_file->mmap_len - ds_file->request_offset;
}
static
}
if (bt_munmap(ds_file->mmap_addr, ds_file->mmap_len)) {
- BT_LOGE("Cannot memory-unmap address %p (size %zu) of file \"%s\" (%p): %s",
+ BT_LOGE_ERRNO("Cannot memory-unmap file",
+ ": address=%p, size=%zu, file_path=\"%s\", file=%p",
ds_file->mmap_addr, ds_file->mmap_len,
- ds_file->file->path->str, ds_file->file->fp,
- strerror(errno));
+ ds_file->file->path->str,
+ ds_file->file ? ds_file->file->fp : NULL);
ret = -1;
goto end;
}
goto error;
}
- ds_file->mmap_offset += ds_file->mmap_valid_len;
+ /*
+ * mmap_len is guaranteed to be page-aligned except on the
+ * last mapping where it may not be possible (since the file's
+ * size itself may not be a page multiple).
+ */
+ ds_file->mmap_offset += ds_file->mmap_len;
ds_file->request_offset = 0;
}
- ds_file->mmap_valid_len = MIN(ds_file->file->size - ds_file->mmap_offset,
+ ds_file->mmap_len = MIN(ds_file->file->size - ds_file->mmap_offset,
ds_file->mmap_max_len);
- if (ds_file->mmap_valid_len == 0) {
+ if (ds_file->mmap_len == 0) {
ret = BT_CTF_NOTIF_ITER_MEDIUM_STATUS_EOF;
goto end;
}
- /* Round up to next page, assuming page size being a power of 2. */
- ds_file->mmap_len = (ds_file->mmap_valid_len + page_size - 1)
- & ~(page_size - 1);
/* Map new region */
assert(ds_file->mmap_len);
ds_file->mmap_addr = bt_mmap((void *) 0, ds_file->mmap_len,
PROT_READ, MAP_PRIVATE, fileno(ds_file->file->fp),
ds_file->mmap_offset);
if (ds_file->mmap_addr == MAP_FAILED) {
- BT_LOGE("Cannot memory-map address (size %zu) of file \"%s\" (%p) at offset %zu: %s",
+ BT_LOGE("Cannot memory-map address (size %zu) of file \"%s\" (%p) at offset %jd: %s",
ds_file->mmap_len, ds_file->file->path->str,
- ds_file->file->fp, ds_file->mmap_offset,
+ ds_file->file->fp, (intmax_t) ds_file->mmap_offset,
strerror(errno));
goto error;
}
static
struct bt_ctf_stream *medop_get_stream(
- struct bt_ctf_stream_class *stream_class, void *data)
+ struct bt_ctf_stream_class *stream_class, uint64_t stream_id,
+ void *data)
{
struct ctf_fs_ds_file *ds_file = data;
struct bt_ctf_stream_class *ds_file_stream_class;
return stream;
}
-static struct bt_ctf_notif_iter_medium_ops medops = {
+BT_HIDDEN
+struct bt_ctf_notif_iter_medium_ops ctf_fs_ds_file_medops = {
.request_bytes = medop_request_bytes,
.get_stream = medop_get_stream,
};
+
static
struct ctf_fs_ds_index *ctf_fs_ds_index_create(size_t length)
{
BT_HIDDEN
struct ctf_fs_ds_file *ctf_fs_ds_file_create(
struct ctf_fs_trace *ctf_fs_trace,
+ struct bt_ctf_notif_iter *notif_iter,
struct bt_ctf_stream *stream, const char *path)
{
int ret;
goto error;
}
- ds_file->notif_iter = bt_ctf_notif_iter_create(
- ctf_fs_trace->metadata->trace, page_size, medops, ds_file);
+ ds_file->notif_iter = notif_iter;
+ bt_ctf_notif_iter_set_medops_data(ds_file->notif_iter, ds_file);
if (!ds_file->notif_iter) {
goto error;
}
ctf_fs_file_destroy(ds_file->file);
}
- if (ds_file->notif_iter) {
- bt_ctf_notif_iter_destroy(ds_file->notif_iter);
- }
-
g_free(ds_file);
}