From 62e59bea302bcc586d645d65c522cfbbaa5f65f5 Mon Sep 17 00:00:00 2001 From: Jose Antonio Moral Date: Mon, 31 May 2021 14:15:19 +0200 Subject: [PATCH 1/2] Support for SubscriptionOptions::ignore_local_publications Signed-off-by: Jose Antonio Moral --- rmw_fastrtps_shared_cpp/src/rmw_take.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rmw_fastrtps_shared_cpp/src/rmw_take.cpp b/rmw_fastrtps_shared_cpp/src/rmw_take.cpp index 485c377e6..f67e10955 100644 --- a/rmw_fastrtps_shared_cpp/src/rmw_take.cpp +++ b/rmw_fastrtps_shared_cpp/src/rmw_take.cpp @@ -83,6 +83,15 @@ _take( data.data = ros_message; data.impl = info->type_support_impl_; if (info->data_reader_->take_next_sample(&data, &sinfo) == ReturnCode_t::RETCODE_OK) { + if (subscription->options.ignore_local_publications) { + auto sample_writer_guid = + eprosima::fastrtps::rtps::iHandle2GUID(sinfo.publication_handle); + + if (sample_writer_guid.guidPrefix == info->data_reader_->guid().guidPrefix) { + // This is a local publication. Ignore it + return RMW_RET_OK; + } + } // Update hasData from listener info->listener_->update_has_data(info->data_reader_); From 116ecfbea203f82a87207a1945ce1f016eb9c2e3 Mon Sep 17 00:00:00 2001 From: Jose Antonio Moral Date: Tue, 1 Jun 2021 14:18:38 +0200 Subject: [PATCH 2/2] Improve ignore_local_publications logic Signed-off-by: Jose Antonio Moral --- rmw_fastrtps_shared_cpp/src/rmw_take.cpp | 33 ++++++++++++++---------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/rmw_fastrtps_shared_cpp/src/rmw_take.cpp b/rmw_fastrtps_shared_cpp/src/rmw_take.cpp index f67e10955..ac37033d3 100644 --- a/rmw_fastrtps_shared_cpp/src/rmw_take.cpp +++ b/rmw_fastrtps_shared_cpp/src/rmw_take.cpp @@ -82,24 +82,29 @@ _take( data.is_cdr_buffer = false; data.data = ros_message; data.impl = info->type_support_impl_; - if (info->data_reader_->take_next_sample(&data, &sinfo) == ReturnCode_t::RETCODE_OK) { - if (subscription->options.ignore_local_publications) { - auto sample_writer_guid = - eprosima::fastrtps::rtps::iHandle2GUID(sinfo.publication_handle); - if (sample_writer_guid.guidPrefix == info->data_reader_->guid().guidPrefix) { - // This is a local publication. Ignore it - return RMW_RET_OK; + while (0 < info->data_reader_->get_unread_count()) { + if (info->data_reader_->take_next_sample(&data, &sinfo) == ReturnCode_t::RETCODE_OK) { + // Update hasData from listener + info->listener_->update_has_data(info->data_reader_); + + if (subscription->options.ignore_local_publications) { + auto sample_writer_guid = + eprosima::fastrtps::rtps::iHandle2GUID(sinfo.publication_handle); + + if (sample_writer_guid.guidPrefix == info->data_reader_->guid().guidPrefix) { + // This is a local publication. Ignore it + continue; + } } - } - // Update hasData from listener - info->listener_->update_has_data(info->data_reader_); - if (sinfo.valid_data) { - if (message_info) { - _assign_message_info(identifier, message_info, &sinfo); + if (sinfo.valid_data) { + if (message_info) { + _assign_message_info(identifier, message_info, &sinfo); + } + *taken = true; + break; } - *taken = true; } }