From 6a9bb5e9cc9074a65d24b2ec2cd5f71e613996de Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Tue, 19 Feb 2019 11:45:42 -0500 Subject: [PATCH] src.ctf.fs: implement "seek beginning" method This message iterator method resets the `src.ctf.fs` iterator's current index within the file group and the stream decoder. Signed-off-by: Philippe Proulx --- plugins/ctf/fs-src/fs.c | 42 +++++++++++++++++++++++++++++++++++++---- plugins/ctf/fs-src/fs.h | 4 ++++ plugins/ctf/plugin.c | 2 ++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/plugins/ctf/fs-src/fs.c b/plugins/ctf/fs-src/fs.c index 29c22eb5..6260a248 100644 --- a/plugins/ctf/fs-src/fs.c +++ b/plugins/ctf/fs-src/fs.c @@ -194,12 +194,49 @@ bt_self_message_iterator_status ctf_fs_iterator_next( return status; } +static +int ctf_fs_iterator_reset(struct ctf_fs_msg_iter_data *msg_iter_data) +{ + int ret; + + msg_iter_data->ds_file_info_index = 0; + ret = msg_iter_data_set_current_ds_file(msg_iter_data); + if (ret) { + goto end; + } + + bt_msg_iter_reset(msg_iter_data->msg_iter); + set_msg_iter_emits_stream_beginning_end_messages(msg_iter_data); + +end: + return ret; +} + +BT_HIDDEN +bt_self_message_iterator_status ctf_fs_iterator_seek_beginning( + bt_self_message_iterator *it) +{ + struct ctf_fs_msg_iter_data *msg_iter_data = + bt_self_message_iterator_get_data(it); + bt_self_message_iterator_status status = + BT_SELF_MESSAGE_ITERATOR_STATUS_OK; + + BT_ASSERT(msg_iter_data); + if (ctf_fs_iterator_reset(msg_iter_data)) { + status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + } + + return status; +} + +BT_HIDDEN void ctf_fs_iterator_finalize(bt_self_message_iterator *it) { ctf_fs_msg_iter_data_destroy( bt_self_message_iterator_get_data(it)); } +BT_HIDDEN bt_self_message_iterator_status ctf_fs_iterator_init( bt_self_message_iterator *self_msg_iter, bt_self_component_source *self_comp, @@ -209,7 +246,6 @@ bt_self_message_iterator_status ctf_fs_iterator_init( struct ctf_fs_msg_iter_data *msg_iter_data = NULL; bt_self_message_iterator_status ret = BT_SELF_MESSAGE_ITERATOR_STATUS_OK; - int iret; port_data = bt_self_component_port_get_data( bt_self_component_port_output_as_self_component_port( @@ -233,13 +269,11 @@ bt_self_message_iterator_status ctf_fs_iterator_init( } msg_iter_data->ds_file_group = port_data->ds_file_group; - iret = msg_iter_data_set_current_ds_file(msg_iter_data); - if (iret) { + if (ctf_fs_iterator_reset(msg_iter_data)) { ret = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; goto error; } - set_msg_iter_emits_stream_beginning_end_messages(msg_iter_data); bt_self_message_iterator_set_data(self_msg_iter, msg_iter_data); if (ret != BT_SELF_MESSAGE_ITERATOR_STATUS_OK) { diff --git a/plugins/ctf/fs-src/fs.h b/plugins/ctf/fs-src/fs.h index d43885f0..694b1848 100644 --- a/plugins/ctf/fs-src/fs.h +++ b/plugins/ctf/fs-src/fs.h @@ -195,4 +195,8 @@ bt_self_message_iterator_status ctf_fs_iterator_next( bt_message_array_const msgs, uint64_t capacity, uint64_t *count); +BT_HIDDEN +bt_self_message_iterator_status ctf_fs_iterator_seek_beginning( + bt_self_message_iterator *message_iterator); + #endif /* BABELTRACE_PLUGIN_CTF_FS_H */ diff --git a/plugins/ctf/plugin.c b/plugins/ctf/plugin.c index e87f83fe..43afb775 100644 --- a/plugins/ctf/plugin.c +++ b/plugins/ctf/plugin.c @@ -50,6 +50,8 @@ BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_INIT_METHOD(fs, ctf_fs_iterator_init); BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_FINALIZE_METHOD(fs, ctf_fs_iterator_finalize); +BT_PLUGIN_SOURCE_COMPONENT_CLASS_MESSAGE_ITERATOR_SEEK_BEGINNING_METHOD(fs, + ctf_fs_iterator_seek_beginning); #if 0 /* ctf.fs sink */ -- 2.34.1