X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Ffs-src%2Fdata-stream-file.c;h=2fddc39dfc9d2ec3cd0bc0f43ce8a43a33476a5b;hb=52eb1a72ea30c44e7ddd39d19566255e2d4c32bf;hp=0fb3a6bd1ce54a4306daa10159d5d2b0ab948865;hpb=65cbebeffddfc58e42600933ec511ad03bd59239;p=babeltrace.git diff --git a/plugins/ctf/fs-src/data-stream-file.c b/plugins/ctf/fs-src/data-stream-file.c index 0fb3a6bd..2fddc39d 100644 --- a/plugins/ctf/fs-src/data-stream-file.c +++ b/plugins/ctf/fs-src/data-stream-file.c @@ -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 @@ -62,11 +62,12 @@ int ds_file_munmap(struct ctf_fs_ds_file *ds_file) goto end; } - if (munmap(ds_file->mmap_addr, ds_file->mmap_len)) { - BT_LOGE("Cannot memory-unmap address %p (size %zu) of file \"%s\" (%p): %s", + if (bt_munmap(ds_file->mmap_addr, ds_file->mmap_len)) { + 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 = mmap((void *) 0, 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); }