Port fix: don't round mmap offset to next page
[babeltrace.git] / plugins / ctf / fs-src / data-stream-file.c
index 5d255ab78441ecf08bc882fc9ac4dbb3547c3672..2fddc39dfc9d2ec3cd0bc0f43ce8a43a33476a5b 100644 (file)
@@ -50,7 +50,7 @@
 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
@@ -63,10 +63,11 @@ int ds_file_munmap(struct ctf_fs_ds_file *ds_file)
        }
 
        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;
        }
@@ -91,28 +92,30 @@ enum bt_ctf_notif_iter_medium_status ds_file_mmap_next(
                        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;
        }
@@ -176,7 +179,8 @@ end:
 
 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;
@@ -199,10 +203,12 @@ end:
        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)
 {
@@ -521,6 +527,7 @@ error:
 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;
@@ -544,8 +551,8 @@ struct ctf_fs_ds_file *ctf_fs_ds_file_create(
                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;
        }
@@ -585,10 +592,6 @@ void ctf_fs_ds_file_destroy(struct ctf_fs_ds_file *ds_file)
                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);
 }
 
This page took 0.027596 seconds and 4 git commands to generate.