X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Ffs%2Fdata-stream.c;h=905e26a946525c99ce4b35716d3d8d12fd0ea2c8;hb=33b34c437c354e1c065e33151135bc2e57e2e29c;hp=cd414c5c1f991e2c084ae44e874d495fd302620a;hpb=924dc8dcf6fbfcb559094c7ec8e502ed7030a13a;p=babeltrace.git diff --git a/plugins/ctf/fs/data-stream.c b/plugins/ctf/fs/data-stream.c index cd414c5c..905e26a9 100644 --- a/plugins/ctf/fs/data-stream.c +++ b/plugins/ctf/fs/data-stream.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include "file.h" #include "metadata.h" #include "../common/notif-iter/notif-iter.h" @@ -66,9 +66,10 @@ end: } static -int mmap_next(struct ctf_fs_stream *stream) +enum bt_ctf_notif_iter_medium_status mmap_next(struct ctf_fs_stream *stream) { - int ret = 0; + enum bt_ctf_notif_iter_medium_status ret = + BT_CTF_NOTIF_ITER_MEDIUM_STATUS_OK; struct ctf_fs_component *ctf_fs = stream->file->ctf_fs; /* Unmap old region */ @@ -83,10 +84,15 @@ int mmap_next(struct ctf_fs_stream *stream) stream->mmap_valid_len = MIN(stream->file->size - stream->mmap_offset, stream->mmap_max_len); + if (stream->mmap_valid_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. */ stream->mmap_len = (stream->mmap_valid_len + ctf_fs->page_size - 1) & ~(ctf_fs->page_size - 1); /* Map new region */ + assert(stream->mmap_len); stream->mmap_addr = mmap((void *) 0, stream->mmap_len, PROT_READ, MAP_PRIVATE, fileno(stream->file->fp), stream->mmap_offset); @@ -101,7 +107,7 @@ int mmap_next(struct ctf_fs_stream *stream) goto end; error: stream_munmap(stream); - ret = -1; + ret = BT_CTF_NOTIF_ITER_MEDIUM_STATUS_ERROR; end: return ret; } @@ -123,16 +129,23 @@ enum bt_ctf_notif_iter_medium_status medop_request_bytes( /* Check if we have at least one memory-mapped byte left */ if (remaining_mmap_bytes(stream) == 0) { /* Are we at the end of the file? */ - if (stream->request_offset >= stream->file->size) { + if (stream->mmap_offset >= stream->file->size) { PDBG("Reached end of file \"%s\" (%p)\n", stream->file->path->str, stream->file->fp); status = BT_CTF_NOTIF_ITER_MEDIUM_STATUS_EOF; goto end; } - if (mmap_next(stream)) { + status = mmap_next(stream); + switch (status) { + case BT_CTF_NOTIF_ITER_MEDIUM_STATUS_OK: + break; + case BT_CTF_NOTIF_ITER_MEDIUM_STATUS_EOF: + goto end; + default: PERR("Cannot memory-map next region of file \"%s\" (%p)\n", - stream->file->path->str, stream->file->fp); + stream->file->path->str, + stream->file->fp); goto error; } } @@ -217,6 +230,10 @@ int build_index_from_idx_file(struct ctf_fs_stream *stream) index_file_path = g_build_filename(directory, "index", index_basename->str, NULL); mapped_file = g_mapped_file_new(index_file_path, FALSE, NULL); + if (!mapped_file) { + ret = -1; + goto end; + } filesize = g_mapped_file_get_length(mapped_file); if (filesize < sizeof(*header)) { printf_error("Invalid LTTng trace index: file size < header size"); @@ -294,8 +311,12 @@ end: g_free(directory); g_free(basename); g_free(index_file_path); - g_string_free(index_basename, TRUE); - g_mapped_file_unref(mapped_file); + if (index_basename) { + g_string_free(index_basename, TRUE); + } + if (mapped_file) { + g_mapped_file_unref(mapped_file); + } return ret; invalid_index: g_array_free(stream->index.entries, TRUE);