X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Ffs-src%2Fdata-stream-file.c;h=30da41a140fca4ee278dc5cfdd63f7d6f1c8b675;hb=ebe4c684d397992e70455847890cc2fe13d2b79d;hp=b8091f660755c6524715fc92c71ed45a09a31ac5;hpb=55e57fc952297e772d08a4b71d2447341f54c82b;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 b8091f66..30da41a1 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 @@ -150,7 +153,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; @@ -173,8 +176,8 @@ enum ctf_msg_iter_medium_status medop_request_bytes( *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 +213,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,21 +233,19 @@ 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; + ds_file->request_offset_in_mapping = offset - ds_file->mmap_offset_in_file; goto test_end; } @@ -260,17 +253,19 @@ 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 @@ -796,39 +791,6 @@ void ctf_fs_ds_file_destroy(struct ctf_fs_ds_file *ds_file) g_free(ds_file); } -BT_HIDDEN -bt_component_class_message_iterator_next_method_status ctf_fs_ds_file_next( - struct ctf_msg_iter *msg_iter, - const bt_message **msg) -{ - enum ctf_msg_iter_status msg_iter_status; - bt_component_class_message_iterator_next_method_status status; - - msg_iter_status = ctf_msg_iter_get_next_message(msg_iter, msg); - - switch (msg_iter_status) { - case CTF_MSG_ITER_STATUS_EOF: - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_END; - break; - case CTF_MSG_ITER_STATUS_OK: - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_OK; - break; - case CTF_MSG_ITER_STATUS_AGAIN: - /* - * Should not make it this far as this is - * medium-specific; there is nothing for the user to do - * and it should have been handled upstream. - */ - bt_common_abort(); - case CTF_MSG_ITER_STATUS_INVAL: - case CTF_MSG_ITER_STATUS_ERROR: - default: - status = BT_COMPONENT_CLASS_MESSAGE_ITERATOR_NEXT_METHOD_STATUS_ERROR; - break; - } - return status; -} - BT_HIDDEN void ctf_fs_ds_index_destroy(struct ctf_fs_ds_index *index) {