X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Ffs-src%2Fdata-stream-file.c;h=078e8b5fccd10d10568ddf83c19e975dbced54cc;hb=3073da6664aa036a96fa3e78d35d53c76a23448b;hp=1fd9e4257f5ca59f94bf7867eb9893c409689f36;hpb=4829c3e2f7137d73c75baff615bce560268ebba4;p=babeltrace.git diff --git a/src/plugins/ctf/fs-src/data-stream-file.c b/src/plugins/ctf/fs-src/data-stream-file.c index 1fd9e425..078e8b5f 100644 --- a/src/plugins/ctf/fs-src/data-stream-file.c +++ b/src/plugins/ctf/fs-src/data-stream-file.c @@ -47,18 +47,22 @@ static inline size_t remaining_mmap_bytes(struct ctf_fs_ds_file *ds_file) { - BT_ASSERT_DBG(ds_file->mmap_len >= ds_file->request_offset); - return ds_file->mmap_len - ds_file->request_offset; + BT_ASSERT_DBG(ds_file->mmap_len >= ds_file->request_offset_in_mapping); + return ds_file->mmap_len - ds_file->request_offset_in_mapping; } static -int ds_file_munmap(struct ctf_fs_ds_file *ds_file) +enum ctf_msg_iter_medium_status ds_file_munmap( + struct ctf_fs_ds_file *ds_file) { - int ret = 0; + enum ctf_msg_iter_medium_status status; bt_self_component *self_comp = ds_file->self_comp; bt_logging_level log_level = ds_file->log_level; - if (!ds_file || !ds_file->mmap_addr) { + BT_ASSERT(ds_file); + + if (!ds_file->mmap_addr) { + status = CTF_MSG_ITER_MEDIUM_STATUS_OK; goto end; } @@ -68,29 +72,30 @@ int ds_file_munmap(struct ctf_fs_ds_file *ds_file) ds_file->mmap_addr, ds_file->mmap_len, ds_file->file ? ds_file->file->path->str : "NULL", ds_file->file ? ds_file->file->fp : NULL); - ret = -1; + status = CTF_MSG_ITER_MEDIUM_STATUS_ERROR; goto end; } ds_file->mmap_addr = NULL; + status = CTF_MSG_ITER_MEDIUM_STATUS_OK; end: - return ret; + return status; } static enum ctf_msg_iter_medium_status ds_file_mmap_next( struct ctf_fs_ds_file *ds_file) { - enum ctf_msg_iter_medium_status ret = - CTF_MSG_ITER_MEDIUM_STATUS_OK; + enum ctf_msg_iter_medium_status status; bt_self_component *self_comp = ds_file->self_comp; bt_logging_level log_level = ds_file->log_level; /* Unmap old region */ if (ds_file->mmap_addr) { - if (ds_file_munmap(ds_file)) { - goto error; + status = ds_file_munmap(ds_file); + if (status != CTF_MSG_ITER_MEDIUM_STATUS_OK) { + goto end; } /* @@ -98,35 +103,33 @@ enum ctf_msg_iter_medium_status ds_file_mmap_next( * 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_offset_in_file += ds_file->mmap_len; + ds_file->request_offset_in_mapping = 0; } - ds_file->mmap_len = MIN(ds_file->file->size - ds_file->mmap_offset, + ds_file->mmap_len = MIN(ds_file->file->size - ds_file->mmap_offset_in_file, ds_file->mmap_max_len); if (ds_file->mmap_len == 0) { - ret = CTF_MSG_ITER_MEDIUM_STATUS_EOF; + status = CTF_MSG_ITER_MEDIUM_STATUS_EOF; goto end; } /* Map new region */ BT_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, ds_file->log_level); + ds_file->mmap_offset_in_file, ds_file->log_level); if (ds_file->mmap_addr == MAP_FAILED) { BT_COMP_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, (intmax_t) ds_file->mmap_offset, + ds_file->file->fp, (intmax_t) ds_file->mmap_offset_in_file, strerror(errno)); - goto error; + status = CTF_MSG_ITER_MEDIUM_STATUS_ERROR; + goto end; } - goto end; -error: - ds_file_munmap(ds_file); - ret = CTF_MSG_ITER_MEDIUM_STATUS_ERROR; + status = CTF_MSG_ITER_MEDIUM_STATUS_OK; end: - return ret; + return status; } static @@ -140,9 +143,7 @@ enum ctf_msg_iter_medium_status medop_request_bytes( bt_self_component *self_comp = ds_file->self_comp; bt_logging_level log_level = ds_file->log_level; - if (request_sz == 0) { - goto end; - } + BT_ASSERT(request_sz > 0); /* * Check if we have at least one memory-mapped byte left. If we don't, @@ -150,7 +151,7 @@ enum ctf_msg_iter_medium_status medop_request_bytes( */ if (remaining_mmap_bytes(ds_file) == 0) { /* Are we at the end of the file? */ - if (ds_file->mmap_offset >= ds_file->file->size) { + if (ds_file->mmap_offset_in_file >= ds_file->file->size) { BT_COMP_LOGD("Reached end of file \"%s\" (%p)", ds_file->file->path->str, ds_file->file->fp); status = CTF_MSG_ITER_MEDIUM_STATUS_EOF; @@ -171,10 +172,13 @@ enum ctf_msg_iter_medium_status medop_request_bytes( } } + BT_ASSERT(remaining_mmap_bytes(ds_file) > 0); *buffer_sz = MIN(remaining_mmap_bytes(ds_file), request_sz); + BT_ASSERT(ds_file->mmap_addr); - *buffer_addr = ((uint8_t *) ds_file->mmap_addr) + ds_file->request_offset; - ds_file->request_offset += *buffer_sz; + *buffer_addr = ((uint8_t *) ds_file->mmap_addr) + ds_file->request_offset_in_mapping; + + ds_file->request_offset_in_mapping += *buffer_sz; goto end; error: @@ -210,24 +214,16 @@ end: } static -enum ctf_msg_iter_medium_status medop_seek(enum ctf_msg_iter_seek_whence whence, - off_t offset, void *data) +enum ctf_msg_iter_medium_status medop_seek(off_t offset, void *data) { - enum ctf_msg_iter_medium_status ret = - CTF_MSG_ITER_MEDIUM_STATUS_OK; + enum ctf_msg_iter_medium_status status; struct ctf_fs_ds_file *ds_file = data; off_t offset_in_mapping, file_size = ds_file->file->size; bt_self_component *self_comp = ds_file->self_comp; bt_logging_level log_level = ds_file->log_level; - if (whence != CTF_MSG_ITER_SEEK_WHENCE_SET || - offset < 0 || offset > file_size) { - BT_COMP_LOGE("Invalid medium seek request: whence=%d, offset=%jd, " - "file-size=%jd", (int) whence, (intmax_t) offset, - (intmax_t) file_size); - ret = CTF_MSG_ITER_MEDIUM_STATUS_INVAL; - goto end; - } + BT_ASSERT(offset >= 0); + BT_ASSERT(offset < file_size); /* If there is no current mapping, map the right file directly. */ if (!ds_file->mmap_addr) { @@ -238,39 +234,37 @@ enum ctf_msg_iter_medium_status medop_seek(enum ctf_msg_iter_seek_whence whence, * Determine whether or not the destination is contained within the * current mapping. */ - if (offset < ds_file->mmap_offset || - offset >= ds_file->mmap_offset + ds_file->mmap_len) { - int unmap_ret; + if (offset < ds_file->mmap_offset_in_file || + offset >= ds_file->mmap_offset_in_file + ds_file->mmap_len) { BT_COMP_LOGD("Medium seek request cannot be accomodated by the current " "file mapping: offset=%jd, mmap-offset=%jd, " - "mmap-len=%zu", (intmax_t) offset, (intmax_t) ds_file->mmap_offset, + "mmap-len=%zu", (intmax_t) offset, (intmax_t) ds_file->mmap_offset_in_file, ds_file->mmap_len); - unmap_ret = ds_file_munmap(ds_file); - if (unmap_ret) { - ret = CTF_MSG_ITER_MEDIUM_STATUS_ERROR; + status = ds_file_munmap(ds_file); + if (status != CTF_MSG_ITER_MEDIUM_STATUS_OK) { goto end; } goto map_requested_offset; } else { - ds_file->request_offset = offset - ds_file->mmap_offset; - goto test_end; + ds_file->request_offset_in_mapping = offset - ds_file->mmap_offset_in_file; + status = CTF_MSG_ITER_MEDIUM_STATUS_OK; + goto end; } map_requested_offset: offset_in_mapping = offset % bt_mmap_get_offset_align_size(ds_file->log_level); - ds_file->mmap_offset = offset - offset_in_mapping; - ds_file->request_offset = offset_in_mapping; - ret = ds_file_mmap_next(ds_file); - if (ret != CTF_MSG_ITER_MEDIUM_STATUS_OK) { + ds_file->mmap_offset_in_file = offset - offset_in_mapping; + ds_file->request_offset_in_mapping = offset_in_mapping; + status = ds_file_mmap_next(ds_file); + if (status != CTF_MSG_ITER_MEDIUM_STATUS_OK) { goto end; } -test_end: - ds_file->end_reached = (offset == file_size); + status = CTF_MSG_ITER_MEDIUM_STATUS_OK; end: - return ret; + return status; } BT_HIDDEN