From 1e0027edddd922067ee6faaa3a11cec1ba22ccdf Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Thu, 21 Oct 2021 20:13:57 -0700 Subject: [PATCH 01/29] Add support for user-specified content filters. Signed-off-by: Andrea Sorbini --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 18 + rmw_connextdds_common/CMakeLists.txt | 3 +- .../include/rmw_connextdds/dds_api.hpp | 18 + .../include/rmw_connextdds/rmw_api_impl.hpp | 12 + .../include/rmw_connextdds/rmw_impl.hpp | 22 + rmw_connextdds_common/package.xml | 1 + .../src/common/rmw_context.cpp | 6 + rmw_connextdds_common/src/common/rmw_impl.cpp | 75 +- .../src/common/rmw_subscription.cpp | 45 ++ .../src/ndds/dds_api_ndds.cpp | 160 +++- .../src/rtime/dds_api_rtime.cpp | 37 + .../src/rmw_api_impl_rtime.cpp | 16 + .../CMakeLists.txt | 66 ++ .../custom_sql_filter.hpp | 32 + .../visibility_control.h | 48 ++ rti_connext_dds_custom_sql_filter/package.xml | 20 + .../src/custom_sql_filter.cpp | 732 ++++++++++++++++++ 17 files changed, 1297 insertions(+), 14 deletions(-) create mode 100644 rti_connext_dds_custom_sql_filter/CMakeLists.txt create mode 100644 rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp create mode 100644 rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h create mode 100644 rti_connext_dds_custom_sql_filter/package.xml create mode 100644 rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index 3a8ec4ef..df2ca1c1 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -647,6 +647,24 @@ rmw_subscription_get_actual_qos( return rmw_api_connextdds_subscription_get_actual_qos(subscription, qos); } +rmw_ret_t +rmw_subscription_set_cft_expression_parameters( + rmw_subscription_t * subscription, + const rmw_subscription_content_filtered_topic_options_t * options) +{ + return rmw_api_connextdds_subscription_set_cft_expression_parameters( + subscription, options); +} + +rmw_ret_t +rmw_subscription_get_cft_expression_parameters( + const rmw_subscription_t * subscription, + rcutils_allocator_t * allocator, + rmw_subscription_content_filtered_topic_options_t * options) +{ + return rmw_api_connextdds_subscription_get_cft_expression_parameters( + subscription, allocator, options); +} rmw_ret_t rmw_destroy_subscription( diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index 5ead1d96..ed08d1d5 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -112,7 +112,8 @@ set(RMW_CONNEXT_DEPS rosidl_typesupport_fastrtps_cpp rosidl_typesupport_introspection_c rosidl_typesupport_introspection_cpp - rti_connext_dds_cmake_module) + rti_connext_dds_cmake_module + rti_connext_dds_custom_sql_filter) foreach(pkg_dep ${RMW_CONNEXT_DEPS}) find_package(${pkg_dep} REQUIRED) diff --git a/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp b/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp index f342e4b3..e2cb70c8 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp @@ -65,6 +65,11 @@ rmw_connextdds_initialize_participant_qos_impl( rmw_context_impl_t * const ctx, DDS_DomainParticipantQos * const dp_qos); +rmw_ret_t +rmw_connextdds_configure_participant( + rmw_context_impl_t * const ctx, + DDS_DomainParticipant * const participant); + rmw_ret_t rmw_connextdds_create_contentfilteredtopic( rmw_context_impl_t * const ctx, @@ -72,6 +77,7 @@ rmw_connextdds_create_contentfilteredtopic( DDS_Topic * const base_topic, const char * const cft_name, const char * const cft_filter, + const rcutils_string_array_t * const cft_expression_parameters, DDS_TopicDescription ** const cft_out); rmw_ret_t @@ -258,4 +264,16 @@ rmw_connextdds_enable_security( DDS_SECURITY_PROPERTY_PREFIX ".logging.log_level" #endif /* DDS_SECURITY_LOGGING_LEVEL_PROPERTY */ +rmw_ret_t +rmw_connextdds_set_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + const char * const cft_expression, + const rcutils_string_array_t * const cft_expression_parameters); + +rmw_ret_t +rmw_connextdds_get_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + rcutils_allocator_t * const allocator, + rmw_subscription_content_filtered_topic_options_t * const options); + #endif // RMW_CONNEXTDDS__DDS_API_HPP_ diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp index 565e2941..a1d0536a 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp @@ -435,6 +435,18 @@ rmw_api_connextdds_subscription_get_actual_qos( const rmw_subscription_t * subscription, rmw_qos_profile_t * qos); +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_subscription_set_cft_expression_parameters( + rmw_subscription_t * subscription, + const rmw_subscription_content_filtered_topic_options_t * options); + +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_subscription_get_cft_expression_parameters( + const rmw_subscription_t * subscription, + rcutils_allocator_t * const allocator, + rmw_subscription_content_filtered_topic_options_t * options); RMW_CONNEXTDDS_PUBLIC rmw_ret_t diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp index 8895d868..95e445ca 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp @@ -438,6 +438,15 @@ class RMW_Connext_Subscriber rmw_message_info_t * const message_info, bool * const taken); + rmw_ret_t + set_cft_expression_parameters( + const rmw_subscription_content_filtered_topic_options_t * const options); + + rmw_ret_t + get_cft_expression_parameters( + rcutils_allocator_t * allocator, + rmw_subscription_content_filtered_topic_options_t * const options); + bool has_data() { @@ -470,6 +479,17 @@ class RMW_Connext_Subscriber return this->dds_topic; } + static std::string get_atomic_id() + { + static std::atomic_uint64_t id; + return std::to_string(id++); + } + + bool is_cft_enabled() + { + return !this->cft_expression.empty(); + } + const bool internal; const bool ignore_local; @@ -478,6 +498,7 @@ class RMW_Connext_Subscriber DDS_DataReader * dds_reader; DDS_Topic * dds_topic; DDS_TopicDescription * dds_topic_cft; + std::string cft_expression; RMW_Connext_MessageTypeSupport * type_support; rmw_gid_t ros_gid; const bool created_topic; @@ -496,6 +517,7 @@ class RMW_Connext_Subscriber const bool ignore_local, const bool created_topic, DDS_TopicDescription * const dds_topic_cft, + const char * const cft_expression, const bool internal); friend class RMW_Connext_SubscriberStatusCondition; diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index 4b78bc85..d2d908bd 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -11,6 +11,7 @@ ament_cmake rti_connext_dds_cmake_module + rti_connext_dds_custom_sql_filter fastcdr rcutils rcpputils diff --git a/rmw_connextdds_common/src/common/rmw_context.cpp b/rmw_connextdds_common/src/common/rmw_context.cpp index 54102045..59bff921 100644 --- a/rmw_connextdds_common/src/common/rmw_context.cpp +++ b/rmw_connextdds_common/src/common/rmw_context.cpp @@ -218,6 +218,12 @@ rmw_context_impl_t::initialize_participant(const bool localhost_only) return RMW_RET_ERROR; } + rmw_ret_t cfg_rc = rmw_connextdds_configure_participant(this, this->participant); + if (RMW_RET_OK != cfg_rc) { + RMW_CONNEXT_LOG_ERROR("failed to configure DDS participant") + return cfg_rc; + } + /* Create DDS publisher/subscriber objects that will be used for all DDS writers/readers created to support RMW publishers/subscriptions. */ diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 295b440a..3d339897 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -29,6 +29,7 @@ const char * const ROS_TOPIC_PREFIX = "rt"; const char * const ROS_SERVICE_REQUESTER_PREFIX = ROS_SERVICE_REQUESTER_PREFIX_STR; const char * const ROS_SERVICE_RESPONSE_PREFIX = ROS_SERVICE_RESPONSE_PREFIX_STR; +const char * const ROS_CFT_TOPIC_NAME_INFIX = "_ContentFilterTopic"; std::string rmw_connextdds_create_topic_name( @@ -1129,6 +1130,7 @@ RMW_Connext_Subscriber::RMW_Connext_Subscriber( const bool ignore_local, const bool created_topic, DDS_TopicDescription * const dds_topic_cft, + const char * const cft_expression, const bool internal) : internal(internal), ignore_local(ignore_local), @@ -1136,6 +1138,7 @@ RMW_Connext_Subscriber::RMW_Connext_Subscriber( dds_reader(dds_reader), dds_topic(dds_topic), dds_topic_cft(dds_topic_cft), + cft_expression(cft_expression), type_support(type_support), created_topic(created_topic), status_condition(dds_reader, ignore_local, internal) @@ -1256,19 +1259,40 @@ RMW_Connext_Subscriber::create( }); DDS_TopicDescription * sub_topic = DDS_Topic_as_topicdescription(topic); + std::string sub_cft_name; + const char * sub_cft_expr = ""; + const rcutils_string_array_t * sub_cft_params = nullptr; if (nullptr != cft_name) { - rmw_ret_t cft_rc = - rmw_connextdds_create_contentfilteredtopic( - ctx, dp, topic, cft_name, cft_filter, &cft_topic); + sub_cft_name = cft_name; + sub_cft_expr = cft_filter; + } else { + sub_cft_name = + fqtopic_name + ROS_CFT_TOPIC_NAME_INFIX + RMW_Connext_Subscriber::get_atomic_id(); + if (nullptr != subscriber_options->content_filtered_topic_options) { + sub_cft_expr = + subscriber_options->content_filtered_topic_options->filter_expression; + sub_cft_params = + subscriber_options->content_filtered_topic_options->expression_parameters; + } + } - if (RMW_RET_OK != cft_rc) { - if (RMW_RET_UNSUPPORTED != cft_rc) { - return nullptr; - } - } else { - sub_topic = cft_topic; + rmw_ret_t cft_rc = + rmw_connextdds_create_contentfilteredtopic( + ctx, + dp, + topic, + sub_cft_name.c_str(), + sub_cft_expr, + sub_cft_params, + &cft_topic); + + if (RMW_RET_OK != cft_rc) { + if (RMW_RET_UNSUPPORTED != cft_rc) { + return nullptr; } + } else { + sub_topic = cft_topic; } // The following initialization generates warnings when built @@ -1337,6 +1361,7 @@ RMW_Connext_Subscriber::create( subscriber_options->ignore_local_publications, topic_created, cft_topic, + sub_cft_expr, internal); if (nullptr == rmw_sub_impl) { @@ -1529,6 +1554,37 @@ RMW_Connext_Subscriber::take_serialized( return rc; } + +rmw_ret_t +RMW_Connext_Subscriber::set_cft_expression_parameters( + const rmw_subscription_content_filtered_topic_options_t * const options) +{ + const char * const filter_expression = + (nullptr != options && nullptr != options->filter_expression) ? + options->filter_expression : ""; + + const rcutils_string_array_t * filter_params = + (nullptr != options) ? options->expression_parameters : nullptr; + + rmw_ret_t rc = rmw_connextdds_set_cft_filter_expression( + this->dds_topic_cft, filter_expression, filter_params); + if (RMW_RET_OK != rc) { + return rc; + } + + this->cft_expression = filter_expression; + + return RMW_RET_OK; +} + +rmw_ret_t +RMW_Connext_Subscriber::get_cft_expression_parameters( + rcutils_allocator_t * allocator, + rmw_subscription_content_filtered_topic_options_t * const options) +{ + return rmw_connextdds_get_cft_filter_expression(this->dds_topic_cft, allocator, options); +} + rmw_ret_t RMW_Connext_Subscriber::loan_messages(const bool update_condition) { @@ -1815,6 +1871,7 @@ rmw_connextdds_create_subscriber( topic_name_len + 1); rmw_subscriber->options = *subscriber_options; rmw_subscriber->can_loan_messages = false; + rmw_subscriber->is_cft_enabled = rmw_sub_impl->is_cft_enabled(); if (!internal) { if (RMW_RET_OK != rmw_sub_impl->enable()) { diff --git a/rmw_connextdds_common/src/common/rmw_subscription.cpp b/rmw_connextdds_common/src/common/rmw_subscription.cpp index 97f6a779..d48fbab6 100644 --- a/rmw_connextdds_common/src/common/rmw_subscription.cpp +++ b/rmw_connextdds_common/src/common/rmw_subscription.cpp @@ -166,6 +166,51 @@ rmw_api_connextdds_subscription_get_actual_qos( return sub_impl->qos(qos); } +rmw_ret_t +rmw_api_connextdds_subscription_set_cft_expression_parameters( + rmw_subscription_t * subscription, + const rmw_subscription_content_filtered_topic_options_t * options) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + subscription, + subscription->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + // RMW_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Subscriber * const sub_impl = + reinterpret_cast(subscription->data); + + rmw_ret_t rc = sub_impl->set_cft_expression_parameters(options); + subscription->is_cft_enabled = sub_impl->is_cft_enabled(); + + return rc; +} + + +rmw_ret_t +rmw_api_connextdds_subscription_get_cft_expression_parameters( + const rmw_subscription_t * subscription, + rcutils_allocator_t * const allocator, + rmw_subscription_content_filtered_topic_options_t * options) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + subscription, + subscription->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + RMW_CHECK_ARGUMENT_FOR_NULL(allocator, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Subscriber * const sub_impl = + reinterpret_cast(subscription->data); + + rmw_ret_t rc = sub_impl->get_cft_expression_parameters(allocator, options); + + return rc; +} rmw_ret_t rmw_api_connextdds_destroy_subscription( diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index 546daea1..37035b11 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -17,6 +17,7 @@ #include #include "rmw/impl/cpp/key_value.hpp" +#include "rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp" #include "rmw_connextdds/type_support.hpp" #include "rmw_connextdds/rmw_impl.hpp" @@ -229,6 +230,46 @@ rmw_connextdds_initialize_participant_qos_impl( return RMW_RET_OK; } +rmw_ret_t +rmw_connextdds_configure_participant( + rmw_context_impl_t * const ctx, + DDS_DomainParticipant * const participant) +{ + UNUSED_ARG(ctx); + + if (DDS_RETCODE_OK != + rti_connext_dds_custom_sql_filter::register_content_filter(participant)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to register custom SQL filter") + return RMW_RET_ERROR; + } + + return RMW_RET_OK; +} + +static +rmw_ret_t +rmw_connextdds_initialize_cft_parameters( + struct DDS_StringSeq * const cft_parameters, + const rcutils_string_array_t * const cft_expression_parameters) +{ + if (!DDS_StringSeq_ensure_length( + cft_parameters, cft_expression_parameters->size, cft_expression_parameters->size)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to ensure length for cft parameters sequence") + return RMW_RET_ERROR; + } + if (!DDS_StringSeq_from_array( + cft_parameters, + const_cast(cft_expression_parameters->data), + cft_expression_parameters->size)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to copy data for cft parameters sequence") + return RMW_RET_ERROR; + } + return RMW_RET_OK; +} + rmw_ret_t rmw_connextdds_create_contentfilteredtopic( rmw_context_impl_t * const ctx, @@ -236,6 +277,7 @@ rmw_connextdds_create_contentfilteredtopic( DDS_Topic * const base_topic, const char * const cft_name, const char * const cft_filter, + const rcutils_string_array_t * const cft_expression_parameters, DDS_TopicDescription ** const cft_out) { UNUSED_ARG(ctx); @@ -243,13 +285,28 @@ rmw_connextdds_create_contentfilteredtopic( RMW_CONNEXT_ASSERT(nullptr != cft_filter) struct DDS_StringSeq cft_parameters = DDS_SEQUENCE_INITIALIZER; - DDS_StringSeq_ensure_length(&cft_parameters, 0, 0); + auto scope_exit_cft_params = rcpputils::make_scope_exit( + [&cft_parameters]() { + if (!DDS_StringSeq_finalize(&cft_parameters)) { + RMW_CONNEXT_LOG_ERROR_SET("failed to finalize cft parameters sequence") + } + }); + if (cft_expression_parameters) { + if (RMW_RET_OK != + rmw_connextdds_initialize_cft_parameters(&cft_parameters, cft_expression_parameters)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to rmw_connextdds_initialize_cft_parameters") + return RMW_RET_ERROR; + } + } *cft_out = nullptr; DDS_ContentFilteredTopic * cft_topic = - DDS_DomainParticipant_create_contentfilteredtopic( - dp, cft_name, base_topic, cft_filter, &cft_parameters); + DDS_DomainParticipant_create_contentfilteredtopic_with_filter( + dp, cft_name, base_topic, cft_filter, &cft_parameters, + rti_connext_dds_custom_sql_filter::PLUGIN_NAME); + if (nullptr == cft_topic) { RMW_CONNEXT_LOG_ERROR_A_SET( "failed to create content-filtered topic: " @@ -570,7 +627,6 @@ rmw_connextdds_write_message( // enable WriteParams::replace_auto to retrieve SN of published message write_params.replace_auto = DDS_BOOLEAN_TRUE; } - if (DDS_RETCODE_OK != DDS_DataWriter_write_w_params_untypedI( pub->writer(), message, &write_params)) @@ -1243,3 +1299,99 @@ rmw_connextdds_enable_security( return RMW_RET_OK; } + + +rmw_ret_t +rmw_connextdds_set_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + const char * const cft_expression, + const rcutils_string_array_t * const cft_expression_parameters) +{ + DDS_ContentFilteredTopic * const cft_topic = + DDS_ContentFilteredTopic_narrow(topic_desc); + + struct DDS_StringSeq cft_parameters = DDS_SEQUENCE_INITIALIZER; + auto scope_exit_cft_parameters = rcpputils::make_scope_exit( + [&cft_parameters]() { + if (!DDS_StringSeq_finalize(&cft_parameters)) { + RMW_CONNEXT_LOG_ERROR_SET("failed to finalize cft parameters sequence") + } + }); + if (nullptr != cft_expression_parameters) { + if (RMW_RET_OK != + rmw_connextdds_initialize_cft_parameters(&cft_parameters, cft_expression_parameters)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to rmw_connextdds_initialize_cft_parameters") + return RMW_RET_ERROR; + } + } + + DDS_ReturnCode_t ret = + DDS_ContentFilteredTopic_set_expression(cft_topic, cft_expression, &cft_parameters); + if (DDS_RETCODE_OK != ret) { + RMW_CONNEXT_LOG_ERROR_SET("failed to set content-filtered topic") + return RMW_RET_ERROR; + } + return RMW_RET_OK; +} + + +rmw_ret_t +rmw_connextdds_get_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + rcutils_allocator_t * const allocator, + rmw_subscription_content_filtered_topic_options_t * const options) +{ + DDS_ContentFilteredTopic * const cft_topic = + DDS_ContentFilteredTopic_narrow(topic_desc); + + // get filter_expression + const char * filter_expression = DDS_ContentFilteredTopic_get_filter_expression(cft_topic); + if (!filter_expression) { + RMW_CONNEXT_LOG_ERROR_SET("failed to get filter expression") + return RMW_RET_ERROR; + } + + // get parameters + struct DDS_StringSeq parameters = DDS_SEQUENCE_INITIALIZER; + DDS_ReturnCode_t status = + DDS_ContentFilteredTopic_get_expression_parameters(cft_topic, ¶meters); + if (DDS_RETCODE_OK != status) { + RMW_CONNEXT_LOG_ERROR_SET("failed to get expression parameters") + return RMW_RET_ERROR; + } + auto scope_exit_parameters_delete = + rcpputils::make_scope_exit( + [¶meters]() + { + DDS_StringSeq_finalize(¶meters); + }); + + const DDS_Long parameters_len = DDS_StringSeq_get_length(¶meters); + std::vector expression_parameters; + expression_parameters.reserve(parameters_len); + + for (DDS_Long i = 0; i < parameters_len; ++i) { + const char * ref = *DDS_StringSeq_get_reference(¶meters, i); + if (!ref) { + RMW_CONNEXT_LOG_ERROR_A_SET( + "failed to get a reference for parameters with index %d", i) + return RMW_RET_ERROR; + } + + expression_parameters.push_back(ref); + } + + if (RMW_RET_OK != rmw_subscription_content_filtered_topic_options_init( + filter_expression, + expression_parameters.size(), + expression_parameters.data(), + allocator, + options)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to rmw_subscription_content_filtered_topic_options_init") + return RMW_RET_ERROR; + } + + return RMW_RET_OK; +} diff --git a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp index bac3ab0d..5952d8de 100644 --- a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp @@ -860,6 +860,17 @@ rmw_connextdds_initialize_participant_qos_impl( return RMW_RET_OK; } +rmw_ret_t +rmw_connextdds_configure_participant( + rmw_context_impl_t * const ctx, + DDS_DomainParticipant * const participant) +{ + UNUSED_ARG(ctx); + UNUSED_ARG(ctx); + + return RMW_RET_OK; +} + rmw_ret_t rmw_connextdds_create_contentfilteredtopic( rmw_context_impl_t * const ctx, @@ -867,6 +878,7 @@ rmw_connextdds_create_contentfilteredtopic( DDS_Topic * const base_topic, const char * const cft_name, const char * const cft_filter, + const rcutils_string_array_t * const cft_expression_parameters, DDS_TopicDescription ** const cft_out) { UNUSED_ARG(ctx); @@ -874,6 +886,7 @@ rmw_connextdds_create_contentfilteredtopic( UNUSED_ARG(base_topic); UNUSED_ARG(cft_name); UNUSED_ARG(cft_filter); + UNUSED_ARG(cft_expression_parameters); UNUSED_ARG(cft_out); return RMW_RET_UNSUPPORTED; } @@ -1952,3 +1965,27 @@ rmw_connextdds_enable_security( return RMW_RET_ERROR; #endif /* RMW_CONNEXT_ENABLE_SECURITY */ } + +rmw_ret_t +rmw_connextdds_set_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + const char * const cft_expression, + const rcutils_string_array_t * const cft_expression_parameters) +{ + UNUSED_ARG(topic_desc); + UNUSED_ARG(cft_expression); + UNUSED_ARG(cft_expression_parameters); + return RMW_RET_UNSUPPORTED; +} + +rmw_ret_t +rmw_connextdds_get_cft_filter_expression( + DDS_TopicDescription * const topic_desc, + rcutils_allocator_t * const allocator, + rmw_subscription_content_filtered_topic_options_t * const options); +{ + UNUSED_ARG(topic_desc); + UNUSED_ARG(allocator); + UNUSED_ARG(options); + return RMW_RET_UNSUPPORTED; +} diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index cac394cf..fc8e731e 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -647,6 +647,22 @@ rmw_subscription_get_actual_qos( return rmw_api_connextdds_subscription_get_actual_qos(subscription, qos); } +rmw_ret_t +rmw_subscription_set_cft_expression_parameters( + rmw_subscription_t * subscription, + const rmw_subscription_content_filtered_topic_options_t * options) +{ + return RMW_RET_UNSUPPORTED; +} + +rmw_ret_t +rmw_subscription_get_cft_expression_parameters( + const rmw_subscription_t * subscription, + rcutils_allocator_t * allocator, + rmw_subscription_content_filtered_topic_options_t * options) +{ + return RMW_RET_UNSUPPORTED; +} rmw_ret_t rmw_destroy_subscription( diff --git a/rti_connext_dds_custom_sql_filter/CMakeLists.txt b/rti_connext_dds_custom_sql_filter/CMakeLists.txt new file mode 100644 index 00000000..836b408d --- /dev/null +++ b/rti_connext_dds_custom_sql_filter/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.8) +project(rti_connext_dds_custom_sql_filter) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(ament_cmake_ros REQUIRED) +find_package(rti_connext_dds_cmake_module REQUIRED) +find_package(rcpputils REQUIRED) + +rti_find_connextpro() +if(NOT RTIConnextDDS_FOUND) + # Skip package if Connext DDS Professional was not found + message(STATUS + "RTI Connext DDS Professional not found. " + "Skipping library ${PROJECT_NAME}") +else() + + add_library(${PROJECT_NAME} + src/custom_sql_filter.cpp + include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp + include/rti_connext_dds_custom_sql_filter/visibility_control.h + ) + target_compile_features(${PROJECT_NAME} PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 + target_include_directories(${PROJECT_NAME} PUBLIC + $ + $) + target_link_libraries(${PROJECT_NAME} RTIConnextDDS::c_api) + ament_target_dependencies(${PROJECT_NAME} + rcpputils) + + # Causes the visibility macros to use dllexport rather than dllimport, + # which is appropriate when building the dll but not consuming it. + target_compile_definitions(${PROJECT_NAME} PRIVATE "RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_BUILDING_LIBRARY") + + install( + DIRECTORY include/ + DESTINATION include + ) + install( + TARGETS ${PROJECT_NAME} + EXPORT export_${PROJECT_NAME} + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + ament_export_include_directories( + include + ) + ament_export_libraries( + ${PROJECT_NAME} + ) + ament_export_targets( + export_${PROJECT_NAME} + ) +endif() + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp new file mode 100644 index 00000000..48d99ae9 --- /dev/null +++ b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp @@ -0,0 +1,32 @@ +// Copyright 2021 Real-Time Innovations, Inc. (RTI) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ +#define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ + +#include "rti_connext_dds_custom_sql_filter/visibility_control.h" +#include "ndds/ndds_c.h" + +namespace rti_connext_dds_custom_sql_filter +{ + +RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC +DDS_ReturnCode_t +register_content_filter(DDS_DomainParticipant * const participant); + +RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC +extern const char * const PLUGIN_NAME; + +} // namespace rti_connext_dds_custom_sql_filter + +#endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ diff --git a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h new file mode 100644 index 00000000..9b591fb0 --- /dev/null +++ b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h @@ -0,0 +1,48 @@ +// Copyright 2021 Real-Time Innovations, Inc. (RTI) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ +#define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ + +// This logic was borrowed (then namespaced) from the examples on the gcc wiki: +// https://gcc.gnu.org/wiki/Visibility + +#if defined _WIN32 || defined __CYGWIN__ + #ifdef __GNUC__ + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __attribute__ ((dllexport)) + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT __attribute__ ((dllimport)) + #else + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __declspec(dllexport) + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT __declspec(dllimport) + #endif + #ifdef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_BUILDING_LIBRARY + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT + #else + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT + #endif + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC_TYPE RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL +#else + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __attribute__ ((visibility("default"))) + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT + #if __GNUC__ >= 4 + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC __attribute__ ((visibility("default"))) + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL __attribute__ ((visibility("hidden"))) + #else + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL + #endif + #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC_TYPE +#endif + +#endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ diff --git a/rti_connext_dds_custom_sql_filter/package.xml b/rti_connext_dds_custom_sql_filter/package.xml new file mode 100644 index 00000000..c8063d78 --- /dev/null +++ b/rti_connext_dds_custom_sql_filter/package.xml @@ -0,0 +1,20 @@ + + + + rti_connext_dds_custom_sql_filter + 0.0.0 + A custom content-filter for RTI Connext DDS which allows empty expressions. + Andrea Sorbini + Apache License 2.0 + + ament_cmake_ros + + rti_connext_dds_cmake_module + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp new file mode 100644 index 00000000..2a496c0b --- /dev/null +++ b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp @@ -0,0 +1,732 @@ +// Copyright 2021 Real-Time Innovations, Inc. (RTI) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include +#include +#include + +#include "rcpputils/scope_exit.hpp" + +#include "rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp" + +extern "C" { +// This is an internal function from RTI Connext DDS which allows a filter to +// be registered as "built-in". We need this because we want this custom filter +// to be a replacement for the built-in SQL-like filter. +DDS_ReturnCode_t +DDS_ContentFilter_register_filter( + DDS_DomainParticipant * participant, + const char * name, + const struct DDS_ContentFilter * filter, + const DDS_ContentFilterEvaluateFunction evaluateOnSerialized, + const DDS_ContentFilterWriterEvaluateFunction writerEvaluateOnSerialized, + const DDS_ContentFilterQueryFunction query, + DDS_Boolean isBuiltin); +} + +struct RTI_CustomSqlFilterProgram +{ + void * base{nullptr}; + std::string expression; + std::string type_name; + DDS_StringSeq expression_params DDS_SEQUENCE_INITIALIZER; + ~RTI_CustomSqlFilterProgram() + { + DDS_StringSeq_finalize(&this->expression_params); + } +}; + +struct RTI_CustomSqlFilterWriterData +{ + void * base{nullptr}; + size_t filtered_readers_count{0}; + size_t unfiltered_readers_count{0}; + std::vector unfiltered_readers_buffer; + std::vector matched_readers_buffer; + DDS_CookieSeq matched_readers DDS_SEQUENCE_INITIALIZER; + REDASkiplistDescription readers_desc; + REDASkiplist readers; +}; + +struct RTI_CustomSqlFilterReaderData +{ + DDS_Cookie_t cookie; + REDAWeakReference wr; + std::string expression; + + explicit RTI_CustomSqlFilterReaderData(REDAWeakReference * const wr) + : cookie(DDS_COOKIE_DEFAULT), + wr(*wr) + { + DDS_Cookie_t_initialize(&this->cookie); + DDS_OctetSeq_loan_contiguous( + &this->cookie.value, + reinterpret_cast(&this->wr), + sizeof(struct REDAWeakReference), + sizeof(struct REDAWeakReference)); + } +}; + +struct RTI_CustomSqlFilterData +{ + DDS_SqlFilterGeneratorQos base; + + RTI_CustomSqlFilterData() + : base(DDS_SQLFILTER_QOS_DEFAULT) + {} + + DDS_ReturnCode_t + set_memory_management_property( + const DDS_DomainParticipantQos & dp_qos) + { + static const DDS_SqlFilterMemoryManagementQos DEFAULT = + DDS_SqlFilterMemoryManagementQos_INITIALIZER; + this->base.memory_management = DEFAULT; + + auto properties = const_cast(&dp_qos.property); + + const DDS_Property_t * property = DDS_PropertyQosPolicyHelper_lookup_property( + properties, + DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_MIN_BUFFER_SIZE_PROPERTY_NAME); + + if (nullptr != property) { + if (!sscanf( + property->value, "%d", + &this->base.memory_management.buffer_min_size)) + { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + } + + property = DDS_PropertyQosPolicyHelper_lookup_property( + properties, + DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_TRIM_TO_SIZE_PROPERTY_NAME); + + if (nullptr != property) { + if (!REDAString_iCompare(property->value, "1") || + !REDAString_iCompare(property->value, "true") || + !REDAString_iCompare(property->value, "yes")) + { + this->base.memory_management.trim_buffer = DDS_BOOLEAN_TRUE; + } + } + + return DDS_RETCODE_OK; + } +}; + +static +int +RTI_CustomSqlFilter_compare_reader_data( + const void * left, + const void * right) +{ + RTI_CustomSqlFilterReaderData * const l = + const_cast( + static_cast(left)); + RTI_CustomSqlFilterReaderData * const r = + const_cast( + static_cast(right)); + + return RTIOsapiMemory_compare( + DDS_OctetSeq_get_contiguous_buffer(&l->cookie.value), + DDS_OctetSeq_get_contiguous_buffer(&r->cookie.value), + sizeof(struct REDAWeakReference)); +} + +static +DDS_ReturnCode_t +RTI_CustomSqlFilter_compile( + void * filter_data, + void ** newHandle, + const char * expression, + const struct DDS_StringSeq * param_seq, + const struct DDS_TypeCode * typeCode, + const char * typeClassName, + void * oldhandle) +{ + *newHandle = nullptr; + + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + + RTI_CustomSqlFilterProgram * program = + new (std::nothrow) RTI_CustomSqlFilterProgram(); + if (nullptr == program) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + auto scope_exit_program = rcpputils::make_scope_exit( + [program]() + { + delete program; + }); + + RTI_CustomSqlFilterProgram * old_program = + static_cast(oldhandle); + void * const old_program_base = + (nullptr != old_program) ? old_program->base : nullptr; + + program->type_name = typeClassName; + program->expression = expression; + if (!DDS_StringSeq_copy(&program->expression_params, param_seq)) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + if (!program->expression.empty()) { + const DDS_ReturnCode_t retcode = + DDS_SqlFilter_compile( + &cft_data->base, + &program->base, + expression, + param_seq, + typeCode, + typeClassName, + old_program_base); + if (DDS_RETCODE_OK != retcode) { + // TODO(asorbini) log error + return retcode; + } + } + + // Delete old_program if we didn't actually compile anything. + // In the other case, Connext doesn't delete the old program to + // avoid a possible race condition, so we do the same here and + // leave it alone. TODO(asorbini) This is likely a memory leak. + if (nullptr != old_program && nullptr == old_program->base) { + delete old_program; + } + + *newHandle = program; + + scope_exit_program.cancel(); + return DDS_RETCODE_OK; +} + +static +DDS_ReturnCode_t +RTI_CustomSqlFilter_writer_attach( + void * filter_data, + void ** writer_filter_data, + void * reserved) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * writer_data = + new (std::nothrow) RTI_CustomSqlFilterWriterData(); + if (nullptr == writer_data) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + auto scope_exit_data = rcpputils::make_scope_exit( + [writer_data]() + { + delete writer_data; + }); + + if (!REDASkiplist_newDefaultAllocator( + &writer_data->readers_desc, + REDASkiplist_getOptimumMaximumLevel(REDA_FAST_BUFFER_POOL_UNLIMITED), + 1)) + { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + REDASkiplist_init( + &writer_data->readers, + &writer_data->readers_desc, + RTI_CustomSqlFilter_compare_reader_data, + nullptr, + 0, + 0); + + DDS_ReturnCode_t rc = + DDS_SqlFilter_writerAttach(&cft_data->base, &writer_data->base, reserved); + if (DDS_RETCODE_OK != rc) { + // TODO(asorbini) log error + return rc; + } + *writer_filter_data = writer_data; + scope_exit_data.cancel(); + return DDS_RETCODE_OK; +} + +void +RTI_CustomSqlFilter_writer_detach( + void * filter_data, + void * writer_filter_data) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + + DDS_SqlFilter_writerDetach(&cft_data->base, writer_data->base); + delete writer_data; +} + +static +void +RTI_CustomSqlFilter_update_unfiltered_list( + RTI_CustomSqlFilterWriterData * const writer_data) +{ + writer_data->unfiltered_readers_buffer.clear(); + writer_data->unfiltered_readers_buffer.reserve(writer_data->unfiltered_readers_count); + + REDASkiplistNode * node = nullptr; + REDASkiplist_gotoTopNode(&writer_data->readers, &node); + while (REDASkiplist_gotoNextNode(&writer_data->readers, &node)) { + RTI_CustomSqlFilterReaderData * const rdata = + static_cast(REDASkiplistNode_getUserData(node)); + if (rdata->expression.empty()) { + writer_data->unfiltered_readers_buffer.push_back(&rdata->cookie); + } + } +} + +static +DDS_ReturnCode_t +RTI_CustomSqlFilter_writer_compile( + void * filter_data, + void * writer_filter_data, + struct DDS_ExpressionProperty * prop, + const char * expression, + const struct DDS_StringSeq * parameters, + const struct DDS_TypeCode * type_code, + const char * type_class_name, + const struct DDS_Cookie_t * cookie) +{ + const bool empty_expr = expression[0] == '\0'; + + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + + bool regen_unfiltered = false; + bool new_reader = false; + + RTI_CustomSqlFilterReaderData * reader_data = nullptr; + bool reader_data_added = false; + bool reader_data_compiled = false; + auto scope_exit_reader_data = rcpputils::make_scope_exit( + [cft_data, writer_data, cookie, + &reader_data_added, &reader_data_compiled, &reader_data]() + { + if (reader_data_compiled) { + DDS_SqlFilter_writerFinalize( + &cft_data->base, writer_data->base, cookie); + } + if (reader_data_added) { + REDASkiplist_removeNodeEA(&writer_data->readers, reader_data); + } + if (nullptr != reader_data) { + delete reader_data; + } + }); + REDAWeakReference cookie_wr; + RTIOsapiMemory_copy( + &cookie_wr, + DDS_OctetSeq_get_contiguous_buffer(&cookie->value), + sizeof(struct REDAWeakReference)); + RTI_CustomSqlFilterReaderData lookup_data(&cookie_wr); + + REDASkiplistNode * node = nullptr; + RTIBool precise_match = RTI_FALSE; + REDASkiplist_findNode( + &writer_data->readers, + const_cast(&node), + &precise_match, + static_cast(&lookup_data)); + if (!precise_match) { + node = nullptr; + } + if (nullptr != node) { + reader_data = + static_cast(REDASkiplistNode_getUserData(node)); + reader_data_added = true; + + if (!reader_data->expression.empty() && empty_expr) { + DDS_SqlFilter_writerFinalize( + &cft_data->base, writer_data->base, cookie); + writer_data->unfiltered_readers_count += 1; + writer_data->filtered_readers_count -= 1; + } else if (reader_data->expression.empty() && !empty_expr) { + // Regenerate the list of unfiltered readers + writer_data->unfiltered_readers_count -= 1; + writer_data->filtered_readers_count += 1; + regen_unfiltered = true; + } + + } else { + new_reader = true; + reader_data = new (std::nothrow) RTI_CustomSqlFilterReaderData(&cookie_wr); + if (nullptr == reader_data) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + if (REDASkiplist_assertNodeEA( + &writer_data->readers, + nullptr, + reader_data, + 0, + 0) == nullptr) + { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + reader_data_added = true; + + if (empty_expr) { + writer_data->unfiltered_readers_count += 1; + } else { + writer_data->filtered_readers_count += 1; + } + } + + reader_data->expression = expression; + + if (empty_expr) { + prop->key_only_filter = DDS_BOOLEAN_FALSE; + prop->writer_side_filter_optimization = DDS_BOOLEAN_FALSE; + } else { + DDS_ReturnCode_t rc = DDS_SqlFilter_writerCompile( + &cft_data->base, + writer_data->base, + prop, + expression, + parameters, + type_code, + type_class_name, + cookie); + if (DDS_RETCODE_OK != rc) { + // TODO(asorbini) log error + return rc; + } + reader_data_compiled = true; + } + + const size_t readers_size = writer_data->matched_readers_buffer.size(); + if (new_reader) { + writer_data->matched_readers_buffer.reserve(readers_size + 1); + } + + if (regen_unfiltered) { + RTI_CustomSqlFilter_update_unfiltered_list(writer_data); + } else if (new_reader && empty_expr) { + writer_data->unfiltered_readers_buffer.push_back(&reader_data->cookie); + } + + scope_exit_reader_data.cancel(); + return DDS_RETCODE_OK; +} + +DDS_CookieSeq * +RTI_CustomSqlFilter_writer_evaluated_result( + RTI_CustomSqlFilterWriterData * const writer_data, + DDS_CookieSeq * const sql_matched) +{ + if (DDS_CookieSeq_get_maximum(&writer_data->matched_readers) > 0) { + DDS_CookieSeq_unloan(&writer_data->matched_readers); + } + + const size_t sql_matched_len = + (nullptr != sql_matched) ? DDS_CookieSeq_get_length(sql_matched) : 0; + const size_t unfiltered_size = writer_data->unfiltered_readers_buffer.size(); + size_t readers_size = sql_matched_len + unfiltered_size; + size_t matched_readers_start = 0; + + writer_data->matched_readers_buffer.resize(readers_size); + + if (sql_matched_len > 0) { + DDS_Cookie_t ** const sql_matched_buffer = + DDS_CookieSeq_get_discontiguous_buffer(sql_matched); + memcpy( + &(writer_data->matched_readers_buffer[matched_readers_start]), + sql_matched_buffer, + sizeof(DDS_Cookie_t *) * sql_matched_len); + matched_readers_start += sql_matched_len; + } + + if (unfiltered_size > 0) { + memcpy( + &(writer_data->matched_readers_buffer[matched_readers_start]), + &(writer_data->unfiltered_readers_buffer[0]), + sizeof(DDS_Cookie_t *) * unfiltered_size); + } + + readers_size = writer_data->matched_readers_buffer.size(); + if (readers_size > 0) { + if (!DDS_CookieSeq_loan_discontiguous( + &writer_data->matched_readers, + &(writer_data->matched_readers_buffer[0]), + readers_size, + readers_size)) + { + // TODO(asorbini) log error + return nullptr; + } + } + + return &writer_data->matched_readers; +} + +DDS_CookieSeq * +RTI_CustomSqlFilter_writer_evaluate( + void * filter_data, + void * writer_filter_data, + const void * sample, + const DDS_FilterSampleInfo * meta_data) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + + DDS_CookieSeq * sql_matched = nullptr; + + if (writer_data->filtered_readers_count > 0) { + sql_matched = DDS_SqlFilter_writerEvaluate( + &cft_data->base, writer_data->base, sample, meta_data); + if (nullptr == sql_matched) { + // TODO(asorbini) log error + printf("RTI_CustomSqlFilter_writer_evaluate >> ERROR!!!\n"); + return nullptr; + } + } + + return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, sql_matched); +} + +void +RTI_CustomSqlFilter_writer_finalize( + void * filter_data, + void * writer_filter_data, + const struct DDS_Cookie_t * cookie) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + + REDAWeakReference cookie_wr; + RTIOsapiMemory_copy( + &cookie_wr, + DDS_OctetSeq_get_contiguous_buffer(&cookie->value), + sizeof(struct REDAWeakReference)); + RTI_CustomSqlFilterReaderData lookup_data(&cookie_wr); + + REDASkiplistNode * node = + const_cast( + REDASkiplist_removeNodeEA(&writer_data->readers, &lookup_data)); + if (nullptr != node) { + RTI_CustomSqlFilterReaderData * reader_data = + static_cast(REDASkiplistNode_getUserData(node)); + if (reader_data->expression.empty()) { + writer_data->unfiltered_readers_count -= 1; + RTI_CustomSqlFilter_update_unfiltered_list(writer_data); + } else { + writer_data->filtered_readers_count -= 1; + DDS_SqlFilter_writerFinalize(&cft_data->base, writer_data->base, cookie); + } + delete reader_data; + REDASkiplist_deleteNode(&writer_data->readers, node); + } +} + +void +RTI_CustomSqlFilter_writer_return_loan( + void * filter_data, + void * writer_filter_data, + struct DDS_CookieSeq * cookies) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + (void)cft_data; + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + (void)writer_data; + DDS_CookieSeq_set_length(cookies, 0); +} + +DDS_Boolean +RTI_CustomSqlFilter_evaluate( + void * filter_data, + void * handle, + const void * sample, + const struct DDS_FilterSampleInfo * meta_data) +{ + + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); + + if (nullptr == program->base) { + return DDS_BOOLEAN_TRUE; + } + + return DDS_SqlFilter_evaluate(&cft_data->base, program->base, sample, meta_data); +} + +void +RTI_CustomSqlFilter_finalize(void * filter_data, void * handle) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); + + if (nullptr != program->base) { + DDS_SqlFilter_finalize(&cft_data->base, program->base); + } + + delete program; +} + +DDS_Boolean +RTI_CustomSqlFilter_evaluate_on_serialized( + void * filter_data, + void * handle, + const void * sample, + const struct DDS_FilterSampleInfo * meta_data) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); + DDS_Boolean accepted = DDS_BOOLEAN_TRUE; + if (nullptr != program->base) { + accepted = DDS_SqlFilter_evaluateOnSerialized( + &cft_data->base, program->base, sample, meta_data); + } + return accepted; +} + +struct DDS_CookieSeq * +RTI_CustomSqlFilter_writer_evaluate_on_serialized( + void * filter_data, + void * writer_filter_data, + const void * sample, + const struct DDS_FilterSampleInfo * meta_data) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); + + DDS_CookieSeq * sql_matched = nullptr; + + if (writer_data->filtered_readers_count > 0) { + sql_matched = DDS_SqlFilter_writerEvaluateOnSerialized( + &cft_data->base, writer_data->base, sample, meta_data); + if (nullptr == sql_matched) { + // TODO(asorbini) log error + printf( + "DDS_SqlFilter_writerEvaluateOnSerialized FAILED (%lu)\n", + writer_data->filtered_readers_count); + return nullptr; + } + } + + return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, sql_matched); +} + +DDS_Long +RTI_CustomSqlFilter_query(void * filter_data, void * handle) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + (void)cft_data; + + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); + + if (nullptr == program->base) { + return 0; + } + + return DDS_SqlFilter_query(filter_data, program->base); +} + +DDS_ReturnCode_t +rti_connext_dds_custom_sql_filter::register_content_filter( + DDS_DomainParticipant * const participant) +{ + DDS_DomainParticipantQos dp_qos = DDS_DomainParticipantQos_INITIALIZER; + auto scope_exit_qos = rcpputils::make_scope_exit( + [&dp_qos]() + { + if (DDS_RETCODE_OK != DDS_DomainParticipantQos_finalize(&dp_qos)) { + // TODO(asorbini) log error + } + }); + + + if (DDS_RETCODE_OK != DDS_DomainParticipant_get_qos(participant, &dp_qos)) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + RTI_CustomSqlFilterData * cft_data = new (std::nothrow) RTI_CustomSqlFilterData(); + if (nullptr == cft_data) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + auto scope_exit_data = rcpputils::make_scope_exit( + [cft_data]() + { + delete cft_data; + }); + DDS_ReturnCode_t rc = cft_data->set_memory_management_property(dp_qos); + if (DDS_RETCODE_OK != rc) { + // TODO(asorbini) log error + return rc; + } + + DDS_ContentFilter filter = DDS_ContentFilter_INITIALIZER; + filter.compile = RTI_CustomSqlFilter_compile; + filter.writer_attach = RTI_CustomSqlFilter_writer_attach; + filter.writer_compile = RTI_CustomSqlFilter_writer_compile; + filter.writer_detach = RTI_CustomSqlFilter_writer_detach; + filter.writer_evaluate = RTI_CustomSqlFilter_writer_evaluate; + filter.writer_finalize = RTI_CustomSqlFilter_writer_finalize; + filter.writer_return_loan = RTI_CustomSqlFilter_writer_return_loan; + filter.evaluate = RTI_CustomSqlFilter_evaluate; + filter.finalize = RTI_CustomSqlFilter_finalize; + filter.filter_data = cft_data; + + rc = DDS_ContentFilter_register_filter( + participant, + PLUGIN_NAME, + &filter, + RTI_CustomSqlFilter_evaluate_on_serialized, + RTI_CustomSqlFilter_writer_evaluate_on_serialized, + RTI_CustomSqlFilter_query, + DDS_BOOLEAN_TRUE); + if (DDS_RETCODE_OK != rc) { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; + } + + scope_exit_data.cancel(); + return DDS_RETCODE_OK; +} + +const char * const +rti_connext_dds_custom_sql_filter::PLUGIN_NAME = "RTI_CONNEXTDDS_CUSTOM_SQL_FILTER"; From d4788f9dc3a783b9184fd6f7110487c6cb36b7a8 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 14:39:35 -0700 Subject: [PATCH 02/29] - Resolve memory leak of custom content-filter resources - Add missing package dependencies for rti_connext_dds_custom_sql_filter - Clean up all participants upon factory finalization - Reset context state upon finalization (rmw_connextddsmicro) Signed-off-by: Andrea Sorbini --- .../src/common/rmw_context.cpp | 3 +- rmw_connextdds_common/src/common/rmw_impl.cpp | 4 +- .../src/ndds/dds_api_ndds.cpp | 85 ++++++++++++++- .../src/rtime/dds_api_rtime.cpp | 2 + .../custom_sql_filter.hpp | 15 ++- rti_connext_dds_custom_sql_filter/package.xml | 1 + .../src/custom_sql_filter.cpp | 100 +++++++++--------- 7 files changed, 153 insertions(+), 57 deletions(-) diff --git a/rmw_connextdds_common/src/common/rmw_context.cpp b/rmw_connextdds_common/src/common/rmw_context.cpp index 59bff921..b1be70af 100644 --- a/rmw_connextdds_common/src/common/rmw_context.cpp +++ b/rmw_connextdds_common/src/common/rmw_context.cpp @@ -392,7 +392,7 @@ rmw_context_impl_t::finalize_participant() if (nullptr != this->participant) { // If we are cleaning up after some RMW failure, it is possible for some // DataWriter to not have been deleted. - // Call DDS_Publisher_delete_contained_entities() to make sure we can + // Call DDS_DomainParticipant_delete_contained_entities() to make sure we can // dispose the publisher. if (DDS_RETCODE_OK != DDS_DomainParticipant_delete_contained_entities(this->participant)) @@ -408,6 +408,7 @@ rmw_context_impl_t::finalize_participant() RMW_CONNEXT_LOG_ERROR_SET("failed to delete DDS participant") return RMW_RET_ERROR; } + this->participant = nullptr; } diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 3d339897..b4b9a9b1 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1368,9 +1368,9 @@ RMW_Connext_Subscriber::create( RMW_CONNEXT_LOG_ERROR_SET("failed to allocate RMW subscriber") return nullptr; } - scope_exit_type_unregister.cancel(); - scope_exit_topic_delete.cancel(); scope_exit_dds_reader_delete.cancel(); + scope_exit_topic_delete.cancel(); + scope_exit_type_unregister.cancel(); return rmw_sub_impl; } diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index 37035b11..69f8fb3d 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -26,6 +26,13 @@ const char * const RMW_CONNEXTDDS_ID = "rmw_connextdds"; const char * const RMW_CONNEXTDDS_SERIALIZATION_FORMAT = "cdr"; +struct rmw_connextdds_api_pro +{ + rti_connext_dds_custom_sql_filter::CustomSqlFilterData custom_filter_data; +}; + +rmw_connextdds_api_pro * RMW_Connext_fv_FactoryContext = nullptr; + rmw_ret_t rmw_connextdds_set_log_verbosity(rmw_log_severity_t severity) { @@ -70,9 +77,28 @@ rmw_ret_t rmw_connextdds_initialize_participant_factory_context( rmw_context_impl_t * const ctx) { + RMW_CONNEXT_ASSERT(RMW_Connext_fv_FactoryContext == nullptr) + // RMW_Connext_gv_DomainParticipantFactory is initialized by + // rmw_api_connextdds_init(). RMW_CONNEXT_ASSERT(RMW_Connext_gv_DomainParticipantFactory == nullptr) UNUSED_ARG(ctx); - // Nothing to do + + rmw_connextdds_api_pro * ctx_api = nullptr; + auto scope_exit_api_delete = rcpputils::make_scope_exit( + [ctx_api]() + { + if (nullptr != ctx_api) { + delete ctx_api; + } + }); + + ctx_api = new (std::nothrow) rmw_connextdds_api_pro(); + if (nullptr == ctx_api) { + return RMW_RET_ERROR; + } + + scope_exit_api_delete.cancel(); + RMW_Connext_fv_FactoryContext = ctx_api; return RMW_RET_OK; } @@ -80,6 +106,60 @@ rmw_ret_t rmw_connextdds_finalize_participant_factory_context( rmw_context_impl_t * const ctx) { + RMW_CONNEXT_ASSERT(nullptr != RMW_Connext_fv_FactoryContext) + rmw_connextdds_api_pro * const ctx_api = RMW_Connext_fv_FactoryContext; + RMW_Connext_fv_FactoryContext = nullptr; + + delete ctx_api; + + // There might be some DomainParticipants left-over from a ("failed context + // initialization" + "failed participant finalization"), so let's try to + // clean them up. + DDS_DomainParticipantSeq participants = DDS_SEQUENCE_INITIALIZER; + auto scope_exit_seq = rcpputils::make_scope_exit( + [&participants]() + { + DDS_DomainParticipantSeq_finalize(&participants); + }); + + if (DDS_RETCODE_OK != + DDS_DomainParticipantFactory_get_participants( + RMW_Connext_gv_DomainParticipantFactory, &participants)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to list existing participants") + return RMW_RET_ERROR; + } + + const DDS_Long pending = DDS_DomainParticipantSeq_get_length(&participants); + for (DDS_Long i = 0; i < pending; i++) { + DDS_DomainParticipant * const participant = + *DDS_DomainParticipantSeq_get_reference(&participants, i); + + if (DDS_RETCODE_OK != + DDS_Entity_enable(DDS_DomainParticipant_as_entity(participant))) + { + RMW_CONNEXT_LOG_ERROR_SET( + "failed to enable pending DomainParticipant before deletion") + return RMW_RET_ERROR; + } + + if (DDS_RETCODE_OK != + DDS_DomainParticipant_delete_contained_entities(participant)) + { + RMW_CONNEXT_LOG_ERROR_SET( + "failed to delete pending DomainParticipant's entities") + return RMW_RET_ERROR; + } + + if (DDS_RETCODE_OK != + DDS_DomainParticipantFactory_delete_participant( + RMW_Connext_gv_DomainParticipantFactory, participant)) + { + RMW_CONNEXT_LOG_ERROR_SET("failed to delete pending DomainParticipant") + return RMW_RET_ERROR; + } + } + UNUSED_ARG(ctx); return RMW_RET_OK; } @@ -238,7 +318,8 @@ rmw_connextdds_configure_participant( UNUSED_ARG(ctx); if (DDS_RETCODE_OK != - rti_connext_dds_custom_sql_filter::register_content_filter(participant)) + rti_connext_dds_custom_sql_filter::register_content_filter( + participant, &RMW_Connext_fv_FactoryContext->custom_filter_data)) { RMW_CONNEXT_LOG_ERROR_SET("failed to register custom SQL filter") return RMW_RET_ERROR; diff --git a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp index 5952d8de..0496e740 100644 --- a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp @@ -649,6 +649,8 @@ rmw_connextdds_finalize_participant_factory_context( RMW_CONNEXT_ASSERT(nullptr != RMW_Connext_fv_FactoryContext) rmw_connextdds_api_micro * const ctx_api = RMW_Connext_fv_FactoryContext; + RMW_Connext_fv_FactoryContext = nullptr; + RT_Registry_T * registry = DDS_DomainParticipantFactory_get_registry( RMW_Connext_gv_DomainParticipantFactory); diff --git a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp index 48d99ae9..e5d5767d 100644 --- a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp +++ b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp @@ -20,9 +20,22 @@ namespace rti_connext_dds_custom_sql_filter { +struct CustomSqlFilterData +{ + DDS_SqlFilterGeneratorQos base; + + CustomSqlFilterData(); + + DDS_ReturnCode_t + set_memory_management_property( + const DDS_DomainParticipantQos & dp_qos); +}; + RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC DDS_ReturnCode_t -register_content_filter(DDS_DomainParticipant * const participant); +register_content_filter( + DDS_DomainParticipant * const participant, + CustomSqlFilterData * const filter_data); RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC extern const char * const PLUGIN_NAME; diff --git a/rti_connext_dds_custom_sql_filter/package.xml b/rti_connext_dds_custom_sql_filter/package.xml index c8063d78..08166ab9 100644 --- a/rti_connext_dds_custom_sql_filter/package.xml +++ b/rti_connext_dds_custom_sql_filter/package.xml @@ -10,6 +10,7 @@ ament_cmake_ros rti_connext_dds_cmake_module + rcpputils ament_lint_auto ament_lint_common diff --git a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp index 2a496c0b..b1644160 100644 --- a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp +++ b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp @@ -77,54 +77,52 @@ struct RTI_CustomSqlFilterReaderData } }; -struct RTI_CustomSqlFilterData -{ - DDS_SqlFilterGeneratorQos base; +using RTI_CustomSqlFilterData = rti_connext_dds_custom_sql_filter::CustomSqlFilterData; - RTI_CustomSqlFilterData() +RTI_CustomSqlFilterData::CustomSqlFilterData() : base(DDS_SQLFILTER_QOS_DEFAULT) - {} +{ +} - DDS_ReturnCode_t - set_memory_management_property( - const DDS_DomainParticipantQos & dp_qos) - { - static const DDS_SqlFilterMemoryManagementQos DEFAULT = - DDS_SqlFilterMemoryManagementQos_INITIALIZER; - this->base.memory_management = DEFAULT; +DDS_ReturnCode_t +RTI_CustomSqlFilterData::set_memory_management_property( + const DDS_DomainParticipantQos & dp_qos) +{ + static const DDS_SqlFilterMemoryManagementQos DEFAULT = + DDS_SqlFilterMemoryManagementQos_INITIALIZER; + this->base.memory_management = DEFAULT; - auto properties = const_cast(&dp_qos.property); + auto properties = const_cast(&dp_qos.property); - const DDS_Property_t * property = DDS_PropertyQosPolicyHelper_lookup_property( - properties, - DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_MIN_BUFFER_SIZE_PROPERTY_NAME); + const DDS_Property_t * property = DDS_PropertyQosPolicyHelper_lookup_property( + properties, + DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_MIN_BUFFER_SIZE_PROPERTY_NAME); - if (nullptr != property) { - if (!sscanf( - property->value, "%d", - &this->base.memory_management.buffer_min_size)) - { - // TODO(asorbini) log error - return DDS_RETCODE_ERROR; - } + if (nullptr != property) { + if (!sscanf( + property->value, "%d", + &this->base.memory_management.buffer_min_size)) + { + // TODO(asorbini) log error + return DDS_RETCODE_ERROR; } + } - property = DDS_PropertyQosPolicyHelper_lookup_property( - properties, - DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_TRIM_TO_SIZE_PROPERTY_NAME); + property = DDS_PropertyQosPolicyHelper_lookup_property( + properties, + DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_TRIM_TO_SIZE_PROPERTY_NAME); - if (nullptr != property) { - if (!REDAString_iCompare(property->value, "1") || - !REDAString_iCompare(property->value, "true") || - !REDAString_iCompare(property->value, "yes")) - { - this->base.memory_management.trim_buffer = DDS_BOOLEAN_TRUE; - } + if (nullptr != property) { + if (!REDAString_iCompare(property->value, "1") || + !REDAString_iCompare(property->value, "true") || + !REDAString_iCompare(property->value, "yes")) + { + this->base.memory_management.trim_buffer = DDS_BOOLEAN_TRUE; } - - return DDS_RETCODE_OK; } -}; + + return DDS_RETCODE_OK; +} static int @@ -276,6 +274,16 @@ RTI_CustomSqlFilter_writer_detach( static_cast(writer_filter_data); DDS_SqlFilter_writerDetach(&cft_data->base, writer_data->base); + + REDASkiplistNode * node = nullptr; + REDASkiplist_gotoTopNode(&writer_data->readers, &node); + while (REDASkiplist_gotoNextNode(&writer_data->readers, &node)) { + RTI_CustomSqlFilterReaderData * const rdata = + static_cast(REDASkiplistNode_getUserData(node)); + delete rdata; + } + + REDASkiplist_deleteDefaultAllocator(&writer_data->readers_desc); delete writer_data; } @@ -666,7 +674,8 @@ RTI_CustomSqlFilter_query(void * filter_data, void * handle) DDS_ReturnCode_t rti_connext_dds_custom_sql_filter::register_content_filter( - DDS_DomainParticipant * const participant) + DDS_DomainParticipant * const participant, + rti_connext_dds_custom_sql_filter::CustomSqlFilterData * const filter_data) { DDS_DomainParticipantQos dp_qos = DDS_DomainParticipantQos_INITIALIZER; auto scope_exit_qos = rcpputils::make_scope_exit( @@ -683,17 +692,7 @@ rti_connext_dds_custom_sql_filter::register_content_filter( return DDS_RETCODE_ERROR; } - RTI_CustomSqlFilterData * cft_data = new (std::nothrow) RTI_CustomSqlFilterData(); - if (nullptr == cft_data) { - // TODO(asorbini) log error - return DDS_RETCODE_ERROR; - } - auto scope_exit_data = rcpputils::make_scope_exit( - [cft_data]() - { - delete cft_data; - }); - DDS_ReturnCode_t rc = cft_data->set_memory_management_property(dp_qos); + DDS_ReturnCode_t rc = filter_data->set_memory_management_property(dp_qos); if (DDS_RETCODE_OK != rc) { // TODO(asorbini) log error return rc; @@ -709,7 +708,7 @@ rti_connext_dds_custom_sql_filter::register_content_filter( filter.writer_return_loan = RTI_CustomSqlFilter_writer_return_loan; filter.evaluate = RTI_CustomSqlFilter_evaluate; filter.finalize = RTI_CustomSqlFilter_finalize; - filter.filter_data = cft_data; + filter.filter_data = filter_data; rc = DDS_ContentFilter_register_filter( participant, @@ -724,7 +723,6 @@ rti_connext_dds_custom_sql_filter::register_content_filter( return DDS_RETCODE_ERROR; } - scope_exit_data.cancel(); return DDS_RETCODE_OK; } From d9a2ba04bf5a460a570ccc0397c72b5f9fb879f5 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 16:16:16 -0700 Subject: [PATCH 03/29] Assume non-null options argument Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/src/common/rmw_impl.cpp | 17 +++++------------ .../src/common/rmw_subscription.cpp | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index b4b9a9b1..ab61cccd 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1559,21 +1559,14 @@ rmw_ret_t RMW_Connext_Subscriber::set_cft_expression_parameters( const rmw_subscription_content_filtered_topic_options_t * const options) { - const char * const filter_expression = - (nullptr != options && nullptr != options->filter_expression) ? - options->filter_expression : ""; - - const rcutils_string_array_t * filter_params = - (nullptr != options) ? options->expression_parameters : nullptr; - - rmw_ret_t rc = rmw_connextdds_set_cft_filter_expression( - this->dds_topic_cft, filter_expression, filter_params); - if (RMW_RET_OK != rc) { + if (RMW_RET_OK != + rmw_connextdds_set_cft_filter_expression( + this->dds_topic_cft, options->filter_expression, options->expression_parameters)) + { return rc; } - this->cft_expression = filter_expression; - + this->cft_expression = options->filter_expression; return RMW_RET_OK; } diff --git a/rmw_connextdds_common/src/common/rmw_subscription.cpp b/rmw_connextdds_common/src/common/rmw_subscription.cpp index d48fbab6..993fb9dd 100644 --- a/rmw_connextdds_common/src/common/rmw_subscription.cpp +++ b/rmw_connextdds_common/src/common/rmw_subscription.cpp @@ -177,7 +177,7 @@ rmw_api_connextdds_subscription_set_cft_expression_parameters( subscription->implementation_identifier, RMW_CONNEXTDDS_ID, return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); - // RMW_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); RMW_Connext_Subscriber * const sub_impl = reinterpret_cast(subscription->data); From 1c313e3a2fe066307dada108221ea2492e75ef64 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 16:23:29 -0700 Subject: [PATCH 04/29] - Return error when retrieving content-filter from a subscription that doesn't have one. - Rename internal functions related to content-filters Signed-off-by: Andrea Sorbini --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 4 ++-- .../include/rmw_connextdds/rmw_api_impl.hpp | 4 ++-- .../include/rmw_connextdds/rmw_impl.hpp | 4 ++-- rmw_connextdds_common/src/common/rmw_impl.cpp | 4 ++-- .../src/common/rmw_subscription.cpp | 13 ++++++++----- rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp | 4 ++-- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index df2ca1c1..e75ac1ef 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -652,7 +652,7 @@ rmw_subscription_set_cft_expression_parameters( rmw_subscription_t * subscription, const rmw_subscription_content_filtered_topic_options_t * options) { - return rmw_api_connextdds_subscription_set_cft_expression_parameters( + return rmw_api_connextdds_subscription_set_content_filter( subscription, options); } @@ -662,7 +662,7 @@ rmw_subscription_get_cft_expression_parameters( rcutils_allocator_t * allocator, rmw_subscription_content_filtered_topic_options_t * options) { - return rmw_api_connextdds_subscription_get_cft_expression_parameters( + return rmw_api_connextdds_subscription_get_content_filter( subscription, allocator, options); } diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp index a1d0536a..1c0f2363 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp @@ -437,13 +437,13 @@ rmw_api_connextdds_subscription_get_actual_qos( RMW_CONNEXTDDS_PUBLIC rmw_ret_t -rmw_api_connextdds_subscription_set_cft_expression_parameters( +rmw_api_connextdds_subscription_set_content_filter( rmw_subscription_t * subscription, const rmw_subscription_content_filtered_topic_options_t * options); RMW_CONNEXTDDS_PUBLIC rmw_ret_t -rmw_api_connextdds_subscription_get_cft_expression_parameters( +rmw_api_connextdds_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * const allocator, rmw_subscription_content_filtered_topic_options_t * options); diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp index 95e445ca..2bb97f19 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp @@ -439,11 +439,11 @@ class RMW_Connext_Subscriber bool * const taken); rmw_ret_t - set_cft_expression_parameters( + set_content_filter( const rmw_subscription_content_filtered_topic_options_t * const options); rmw_ret_t - get_cft_expression_parameters( + get_content_filter( rcutils_allocator_t * allocator, rmw_subscription_content_filtered_topic_options_t * const options); diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index ab61cccd..b9f1bc17 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1556,7 +1556,7 @@ RMW_Connext_Subscriber::take_serialized( rmw_ret_t -RMW_Connext_Subscriber::set_cft_expression_parameters( +RMW_Connext_Subscriber::set_content_filter( const rmw_subscription_content_filtered_topic_options_t * const options) { if (RMW_RET_OK != @@ -1571,7 +1571,7 @@ RMW_Connext_Subscriber::set_cft_expression_parameters( } rmw_ret_t -RMW_Connext_Subscriber::get_cft_expression_parameters( +RMW_Connext_Subscriber::get_content_filter( rcutils_allocator_t * allocator, rmw_subscription_content_filtered_topic_options_t * const options) { diff --git a/rmw_connextdds_common/src/common/rmw_subscription.cpp b/rmw_connextdds_common/src/common/rmw_subscription.cpp index 993fb9dd..c728bbe1 100644 --- a/rmw_connextdds_common/src/common/rmw_subscription.cpp +++ b/rmw_connextdds_common/src/common/rmw_subscription.cpp @@ -167,7 +167,7 @@ rmw_api_connextdds_subscription_get_actual_qos( } rmw_ret_t -rmw_api_connextdds_subscription_set_cft_expression_parameters( +rmw_api_connextdds_subscription_set_content_filter( rmw_subscription_t * subscription, const rmw_subscription_content_filtered_topic_options_t * options) { @@ -182,7 +182,7 @@ rmw_api_connextdds_subscription_set_cft_expression_parameters( RMW_Connext_Subscriber * const sub_impl = reinterpret_cast(subscription->data); - rmw_ret_t rc = sub_impl->set_cft_expression_parameters(options); + rmw_ret_t rc = sub_impl->set_content_filter(options); subscription->is_cft_enabled = sub_impl->is_cft_enabled(); return rc; @@ -190,7 +190,7 @@ rmw_api_connextdds_subscription_set_cft_expression_parameters( rmw_ret_t -rmw_api_connextdds_subscription_get_cft_expression_parameters( +rmw_api_connextdds_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * const allocator, rmw_subscription_content_filtered_topic_options_t * options) @@ -207,9 +207,12 @@ rmw_api_connextdds_subscription_get_cft_expression_parameters( RMW_Connext_Subscriber * const sub_impl = reinterpret_cast(subscription->data); - rmw_ret_t rc = sub_impl->get_cft_expression_parameters(allocator, options); + if (!sub_impl->is_cft_enabled()) { + RMW_CONNEXT_LOG_ERROR_SET("no content-filter associated with subscription") + return RMW_RET_ERROR; + } - return rc; + return sub_impl->get_content_filter(allocator, options); } rmw_ret_t diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index fc8e731e..553cd3e9 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -648,7 +648,7 @@ rmw_subscription_get_actual_qos( } rmw_ret_t -rmw_subscription_set_cft_expression_parameters( +rmw_subscription_set_content_filter( rmw_subscription_t * subscription, const rmw_subscription_content_filtered_topic_options_t * options) { @@ -656,7 +656,7 @@ rmw_subscription_set_cft_expression_parameters( } rmw_ret_t -rmw_subscription_get_cft_expression_parameters( +rmw_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * allocator, rmw_subscription_content_filtered_topic_options_t * options) From 3c532ce8c5c68dddd9dad67109b89c388c58f39b Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 16:32:35 -0700 Subject: [PATCH 05/29] Fix compilation error, oops. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/src/common/rmw_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index b9f1bc17..e2c5b1f3 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1563,7 +1563,7 @@ RMW_Connext_Subscriber::set_content_filter( rmw_connextdds_set_cft_filter_expression( this->dds_topic_cft, options->filter_expression, options->expression_parameters)) { - return rc; + return RMW_RET_ERROR; } this->cft_expression = options->filter_expression; From 669ff31956919c3a654a62964710a60f29c164c9 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 16:53:11 -0700 Subject: [PATCH 06/29] - Define RMW_CONNEXT_DEBUG when building Debug libraries. - Make sure participant is enabled before deleting contained entities when using Connext debug libraries. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/CMakeLists.txt | 6 ++++++ .../include/rmw_connextdds/static_config.hpp | 7 +++++++ rmw_connextdds_common/src/common/rmw_context.cpp | 15 +++++++++++++++ rmw_connextdds_common/src/ndds/dds_api_ndds.cpp | 10 ++++++++-- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index ed08d1d5..03fd8645 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -62,6 +62,11 @@ function(rtirmw_add_library) ament_target_dependencies(${_rti_build_NAME} ${_rti_build_DEPS}) + set(_extra_defines) + if("${CMAKE_BUILD_TYPE}" MATCHES "[dD]ebug") + list(APPEND _extra_defines "RMW_CONNEXT_DEBUG=1") + endif() + target_compile_definitions(${_rti_build_NAME} PUBLIC RMW_VERSION_MAJOR=${rmw_VERSION_MAJOR} @@ -69,6 +74,7 @@ function(rtirmw_add_library) RMW_VERSION_PATCH=${rmw_VERSION_PATCH} RMW_CONNEXT_DDS_API=RMW_CONNEXT_DDS_API_${_rti_build_API} ${_rti_build_DEFINES} + ${_extra_defines} ) set(private_defines) diff --git a/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp b/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp index b5f1022f..e69d84f2 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp @@ -15,6 +15,13 @@ #ifndef RMW_CONNEXTDDS__STATIC_CONFIG_HPP_ #define RMW_CONNEXTDDS__STATIC_CONFIG_HPP_ +/****************************************************************************** + * Debug flags + ******************************************************************************/ +#ifndef RMW_CONNEXT_DEBUG +#define RMW_CONNEXT_DEBUG 0 +#endif // RMW_CONNEXT_DEBUG + /****************************************************************************** * Default User Configuration ******************************************************************************/ diff --git a/rmw_connextdds_common/src/common/rmw_context.cpp b/rmw_connextdds_common/src/common/rmw_context.cpp index b1be70af..51cf2df1 100644 --- a/rmw_connextdds_common/src/common/rmw_context.cpp +++ b/rmw_connextdds_common/src/common/rmw_context.cpp @@ -390,6 +390,21 @@ rmw_context_impl_t::finalize_participant() } if (nullptr != this->participant) { +#if RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO + // If we are building in Debug mode, an issue in Connext may prevent the + // participant from being able to delete any content-filtered topic if + // the participant has not been enabled. + // For this reason, make sure to enable the participant before trying to + // finalize it. + // TODO(asorbini) reconsider the need for this code in Connext > 6.1.0 + if (DDS_RETCODE_OK != + DDS_Entity_enable(DDS_DomainParticipant_as_entity(participant))) + { + RMW_CONNEXT_LOG_ERROR_SET( + "failed to enable pending DomainParticipant before deletion") + return RMW_RET_ERROR; + } +#endif // RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO // If we are cleaning up after some RMW failure, it is possible for some // DataWriter to not have been deleted. // Call DDS_DomainParticipant_delete_contained_entities() to make sure we can diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index 69f8fb3d..1b7679da 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -134,7 +134,13 @@ rmw_connextdds_finalize_participant_factory_context( for (DDS_Long i = 0; i < pending; i++) { DDS_DomainParticipant * const participant = *DDS_DomainParticipantSeq_get_reference(&participants, i); - +#if RMW_CONNEXT_DEBUG + // If we are building in Debug mode, an issue in Connext may prevent the + // participant from being able to delete any content-filtered topic if + // the participant has not been enabled. + // For this reason, make sure to enable the participant before trying to + // finalize it. + // TODO(asorbini) reconsider the need for this code in Connext > 6.1.0 if (DDS_RETCODE_OK != DDS_Entity_enable(DDS_DomainParticipant_as_entity(participant))) { @@ -142,7 +148,7 @@ rmw_connextdds_finalize_participant_factory_context( "failed to enable pending DomainParticipant before deletion") return RMW_RET_ERROR; } - +#endif // RMW_CONNEXT_DEBUG if (DDS_RETCODE_OK != DDS_DomainParticipant_delete_contained_entities(participant)) { From 13087f106acd106babf0719d1539a293233ab458 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 25 Oct 2021 20:05:55 -0700 Subject: [PATCH 07/29] Resolve memory leak for finalization on error. Signed-off-by: Andrea Sorbini --- .../src/common/rmw_context.cpp | 31 +++++++++---------- rmw_connextdds_common/src/common/rmw_impl.cpp | 23 +++++++++++++- .../src/custom_sql_filter.cpp | 4 --- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/rmw_connextdds_common/src/common/rmw_context.cpp b/rmw_connextdds_common/src/common/rmw_context.cpp index 51cf2df1..4ca175f7 100644 --- a/rmw_connextdds_common/src/common/rmw_context.cpp +++ b/rmw_connextdds_common/src/common/rmw_context.cpp @@ -338,7 +338,21 @@ rmw_ret_t rmw_context_impl_t::finalize_participant() { RMW_CONNEXT_LOG_DEBUG("finalizing DDS DomainParticipant") - +#if RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO + // If we are building in Debug mode, an issue in Connext may prevent the + // participant from being able to delete any content-filtered topic if + // the participant has not been enabled. + // For this reason, make sure to enable the participant before trying to + // finalize it. + // TODO(asorbini) reconsider the need for this code in Connext > 6.1.0 + if (DDS_RETCODE_OK != + DDS_Entity_enable(DDS_DomainParticipant_as_entity(participant))) + { + RMW_CONNEXT_LOG_ERROR_SET( + "failed to enable DomainParticipant before deletion") + return RMW_RET_ERROR; + } +#endif // RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO if (RMW_RET_OK != rmw_connextdds_graph_finalize(this)) { RMW_CONNEXT_LOG_ERROR("failed to finalize graph cache") return RMW_RET_ERROR; @@ -390,21 +404,6 @@ rmw_context_impl_t::finalize_participant() } if (nullptr != this->participant) { -#if RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO - // If we are building in Debug mode, an issue in Connext may prevent the - // participant from being able to delete any content-filtered topic if - // the participant has not been enabled. - // For this reason, make sure to enable the participant before trying to - // finalize it. - // TODO(asorbini) reconsider the need for this code in Connext > 6.1.0 - if (DDS_RETCODE_OK != - DDS_Entity_enable(DDS_DomainParticipant_as_entity(participant))) - { - RMW_CONNEXT_LOG_ERROR_SET( - "failed to enable pending DomainParticipant before deletion") - return RMW_RET_ERROR; - } -#endif // RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO // If we are cleaning up after some RMW failure, it is possible for some // DataWriter to not have been deleted. // Call DDS_DomainParticipant_delete_contained_entities() to make sure we can diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index e2c5b1f3..2e68f25a 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1820,7 +1820,6 @@ rmw_connextdds_create_subscriber( "failed to allocate RMW_Connext_Subscriber") return nullptr; } - auto scope_exit_rmw_reader_impl_delete = rcpputils::make_scope_exit( [rmw_sub_impl]() @@ -1831,6 +1830,25 @@ rmw_connextdds_create_subscriber( } delete rmw_sub_impl; }); +#if RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO + auto scope_exit_enable_participant_on_error = + rcpputils::make_scope_exit( + [ctx]() + { + // If we are building in Debug mode, an issue in Connext may prevent the + // participant from being able to delete any content-filtered topic if + // the participant has not been enabled. + // For this reason, make sure to enable the participant before trying to + // finalize it. + // TODO(asorbini) reconsider the need for this code in Connext > 6.1.0 + if (DDS_RETCODE_OK != + DDS_Entity_enable(DDS_DomainParticipant_as_entity(ctx->participant))) + { + RMW_CONNEXT_LOG_ERROR_SET( + "failed to enable DomainParticipant on subscriber creation error") + } + }); +#endif // RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO rmw_subscription_t * rmw_subscriber = rmw_subscription_allocate(); if (nullptr == rmw_subscriber) { @@ -1881,6 +1899,9 @@ rmw_connextdds_create_subscriber( } } +#if RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO + scope_exit_enable_participant_on_error.cancel(); +#endif // RMW_CONNEXT_DEBUG && RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO scope_exit_rmw_reader_impl_delete.cancel(); scope_exit_rmw_reader_delete.cancel(); return rmw_subscriber; diff --git a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp index b1644160..583fba59 100644 --- a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp +++ b/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp @@ -513,7 +513,6 @@ RTI_CustomSqlFilter_writer_evaluate( &cft_data->base, writer_data->base, sample, meta_data); if (nullptr == sql_matched) { // TODO(asorbini) log error - printf("RTI_CustomSqlFilter_writer_evaluate >> ERROR!!!\n"); return nullptr; } } @@ -645,9 +644,6 @@ RTI_CustomSqlFilter_writer_evaluate_on_serialized( &cft_data->base, writer_data->base, sample, meta_data); if (nullptr == sql_matched) { // TODO(asorbini) log error - printf( - "DDS_SqlFilter_writerEvaluateOnSerialized FAILED (%lu)\n", - writer_data->filtered_readers_count); return nullptr; } } From 883e9cf625699e59aa9e8f19ec7fa561cc47b13f Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Tue, 26 Oct 2021 09:16:51 -0700 Subject: [PATCH 08/29] Rename content filter public API. Signed-off-by: Andrea Sorbini --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 8 ++++---- .../include/rmw_connextdds/dds_api.hpp | 2 +- .../include/rmw_connextdds/rmw_api_impl.hpp | 4 ++-- .../include/rmw_connextdds/rmw_impl.hpp | 4 ++-- rmw_connextdds_common/src/common/rmw_impl.cpp | 10 +++++----- rmw_connextdds_common/src/common/rmw_subscription.cpp | 4 ++-- rmw_connextdds_common/src/ndds/dds_api_ndds.cpp | 6 +++--- rmw_connextdds_common/src/rtime/dds_api_rtime.cpp | 2 +- rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index e75ac1ef..fe7bbfa0 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -648,19 +648,19 @@ rmw_subscription_get_actual_qos( } rmw_ret_t -rmw_subscription_set_cft_expression_parameters( +rmw_subscription_set_content_filter( rmw_subscription_t * subscription, - const rmw_subscription_content_filtered_topic_options_t * options) + const rmw_subscription_content_filter_options_t * options) { return rmw_api_connextdds_subscription_set_content_filter( subscription, options); } rmw_ret_t -rmw_subscription_get_cft_expression_parameters( +rmw_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * allocator, - rmw_subscription_content_filtered_topic_options_t * options) + rmw_subscription_content_filter_options_t * options) { return rmw_api_connextdds_subscription_get_content_filter( subscription, allocator, options); diff --git a/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp b/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp index e2cb70c8..3a8d2b3d 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/dds_api.hpp @@ -274,6 +274,6 @@ rmw_ret_t rmw_connextdds_get_cft_filter_expression( DDS_TopicDescription * const topic_desc, rcutils_allocator_t * const allocator, - rmw_subscription_content_filtered_topic_options_t * const options); + rmw_subscription_content_filter_options_t * const options); #endif // RMW_CONNEXTDDS__DDS_API_HPP_ diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp index 1c0f2363..b32be4ff 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp @@ -439,14 +439,14 @@ RMW_CONNEXTDDS_PUBLIC rmw_ret_t rmw_api_connextdds_subscription_set_content_filter( rmw_subscription_t * subscription, - const rmw_subscription_content_filtered_topic_options_t * options); + const rmw_subscription_content_filter_options_t * options); RMW_CONNEXTDDS_PUBLIC rmw_ret_t rmw_api_connextdds_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * const allocator, - rmw_subscription_content_filtered_topic_options_t * options); + rmw_subscription_content_filter_options_t * options); RMW_CONNEXTDDS_PUBLIC rmw_ret_t diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp index 2bb97f19..a75d4214 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp @@ -440,12 +440,12 @@ class RMW_Connext_Subscriber rmw_ret_t set_content_filter( - const rmw_subscription_content_filtered_topic_options_t * const options); + const rmw_subscription_content_filter_options_t * const options); rmw_ret_t get_content_filter( rcutils_allocator_t * allocator, - rmw_subscription_content_filtered_topic_options_t * const options); + rmw_subscription_content_filter_options_t * const options); bool has_data() diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 2e68f25a..0be5aaf8 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -1269,11 +1269,11 @@ RMW_Connext_Subscriber::create( } else { sub_cft_name = fqtopic_name + ROS_CFT_TOPIC_NAME_INFIX + RMW_Connext_Subscriber::get_atomic_id(); - if (nullptr != subscriber_options->content_filtered_topic_options) { + if (nullptr != subscriber_options->content_filter_options) { sub_cft_expr = - subscriber_options->content_filtered_topic_options->filter_expression; + subscriber_options->content_filter_options->filter_expression; sub_cft_params = - subscriber_options->content_filtered_topic_options->expression_parameters; + subscriber_options->content_filter_options->expression_parameters; } } @@ -1557,7 +1557,7 @@ RMW_Connext_Subscriber::take_serialized( rmw_ret_t RMW_Connext_Subscriber::set_content_filter( - const rmw_subscription_content_filtered_topic_options_t * const options) + const rmw_subscription_content_filter_options_t * const options) { if (RMW_RET_OK != rmw_connextdds_set_cft_filter_expression( @@ -1573,7 +1573,7 @@ RMW_Connext_Subscriber::set_content_filter( rmw_ret_t RMW_Connext_Subscriber::get_content_filter( rcutils_allocator_t * allocator, - rmw_subscription_content_filtered_topic_options_t * const options) + rmw_subscription_content_filter_options_t * const options) { return rmw_connextdds_get_cft_filter_expression(this->dds_topic_cft, allocator, options); } diff --git a/rmw_connextdds_common/src/common/rmw_subscription.cpp b/rmw_connextdds_common/src/common/rmw_subscription.cpp index c728bbe1..698ccb3e 100644 --- a/rmw_connextdds_common/src/common/rmw_subscription.cpp +++ b/rmw_connextdds_common/src/common/rmw_subscription.cpp @@ -169,7 +169,7 @@ rmw_api_connextdds_subscription_get_actual_qos( rmw_ret_t rmw_api_connextdds_subscription_set_content_filter( rmw_subscription_t * subscription, - const rmw_subscription_content_filtered_topic_options_t * options) + const rmw_subscription_content_filter_options_t * options) { RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT); RMW_CHECK_TYPE_IDENTIFIERS_MATCH( @@ -193,7 +193,7 @@ rmw_ret_t rmw_api_connextdds_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * const allocator, - rmw_subscription_content_filtered_topic_options_t * options) + rmw_subscription_content_filter_options_t * options) { RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT); RMW_CHECK_TYPE_IDENTIFIERS_MATCH( diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index 1b7679da..d31537f5 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -1427,7 +1427,7 @@ rmw_ret_t rmw_connextdds_get_cft_filter_expression( DDS_TopicDescription * const topic_desc, rcutils_allocator_t * const allocator, - rmw_subscription_content_filtered_topic_options_t * const options) + rmw_subscription_content_filter_options_t * const options) { DDS_ContentFilteredTopic * const cft_topic = DDS_ContentFilteredTopic_narrow(topic_desc); @@ -1469,14 +1469,14 @@ rmw_connextdds_get_cft_filter_expression( expression_parameters.push_back(ref); } - if (RMW_RET_OK != rmw_subscription_content_filtered_topic_options_init( + if (RMW_RET_OK != rmw_subscription_content_filter_options_init( filter_expression, expression_parameters.size(), expression_parameters.data(), allocator, options)) { - RMW_CONNEXT_LOG_ERROR_SET("failed to rmw_subscription_content_filtered_topic_options_init") + RMW_CONNEXT_LOG_ERROR_SET("failed to rmw_subscription_content_filter_options_init") return RMW_RET_ERROR; } diff --git a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp index 0496e740..835c13d0 100644 --- a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp @@ -1984,7 +1984,7 @@ rmw_ret_t rmw_connextdds_get_cft_filter_expression( DDS_TopicDescription * const topic_desc, rcutils_allocator_t * const allocator, - rmw_subscription_content_filtered_topic_options_t * const options); + rmw_subscription_content_filter_options_t * const options); { UNUSED_ARG(topic_desc); UNUSED_ARG(allocator); diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index 553cd3e9..37c56438 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -650,7 +650,7 @@ rmw_subscription_get_actual_qos( rmw_ret_t rmw_subscription_set_content_filter( rmw_subscription_t * subscription, - const rmw_subscription_content_filtered_topic_options_t * options) + const rmw_subscription_content_filter_options_t * options) { return RMW_RET_UNSUPPORTED; } @@ -659,7 +659,7 @@ rmw_ret_t rmw_subscription_get_content_filter( const rmw_subscription_t * subscription, rcutils_allocator_t * allocator, - rmw_subscription_content_filtered_topic_options_t * options) + rmw_subscription_content_filter_options_t * options) { return RMW_RET_UNSUPPORTED; } From ced2a156e5affa83bd2e3e9dc15dab68d9bb027e Mon Sep 17 00:00:00 2001 From: mauropasse Date: Fri, 19 Nov 2021 20:22:24 +0000 Subject: [PATCH 09/29] Add client/service QoS getters (#67) Signed-off-by: Mauro Passerino --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 40 +++++++++ .../include/rmw_connextdds/rmw_api_impl.hpp | 24 ++++++ .../include/rmw_connextdds/rmw_impl.hpp | 12 +++ rmw_connextdds_common/src/common/rmw_impl.cpp | 44 ++++++++++ .../src/common/rmw_service.cpp | 84 +++++++++++++++++++ .../src/rmw_api_impl_rtime.cpp | 39 +++++++++ 6 files changed, 243 insertions(+) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index fe7bbfa0..ed2e45c8 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -566,6 +566,26 @@ rmw_create_client( } +rmw_ret_t +rmw_client_request_publisher_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_client_request_publisher_get_actual_qos( + client, qos); +} + + +rmw_ret_t +rmw_client_response_subscription_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_client_response_subscription_get_actual_qos( + client, qos); +} + + rmw_ret_t rmw_destroy_client( rmw_node_t * node, @@ -587,6 +607,26 @@ rmw_create_service( } +rmw_ret_t +rmw_service_response_publisher_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_service_response_publisher_get_actual_qos( + service, qos); +} + + +rmw_ret_t +rmw_service_request_subscription_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_service_request_subscription_get_actual_qos( + service, qos); +} + + rmw_ret_t rmw_destroy_service( rmw_node_t * node, diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp index b32be4ff..d07a97fb 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp @@ -380,6 +380,18 @@ rmw_api_connextdds_create_client( const char * service_name, const rmw_qos_profile_t * qos_policies); +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_client_request_publisher_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos); + +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_client_response_subscription_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos); + RMW_CONNEXTDDS_PUBLIC rmw_ret_t rmw_api_connextdds_destroy_client( @@ -394,6 +406,18 @@ rmw_api_connextdds_create_service( const char * service_name, const rmw_qos_profile_t * qos_policies); +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_service_response_publisher_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos); + +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_service_request_subscription_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos); + RMW_CONNEXTDDS_PUBLIC rmw_ret_t rmw_api_connextdds_destroy_service( diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp index a75d4214..5bf93f0c 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_impl.hpp @@ -604,6 +604,12 @@ class RMW_Connext_Client rmw_ret_t enable(); + + rmw_ret_t + request_publisher_qos(rmw_qos_profile_t * const qos); + + rmw_ret_t + response_subscription_qos(rmw_qos_profile_t * const qos); }; class RMW_Connext_Service @@ -651,6 +657,12 @@ class RMW_Connext_Service rmw_ret_t enable(); + + rmw_ret_t + response_publisher_qos(rmw_qos_profile_t * const qos); + + rmw_ret_t + request_subscription_qos(rmw_qos_profile_t * const qos); }; /****************************************************************************** diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 0be5aaf8..1ad5e661 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -2693,6 +2693,28 @@ RMW_Connext_Client::send_request( return rc; } +rmw_ret_t +RMW_Connext_Client::request_publisher_qos(rmw_qos_profile_t * const qos) +{ + rmw_ret_t rc = this->request_pub->qos(qos); + if (rc != RMW_RET_OK) { + RMW_SET_ERROR_MSG("coudn't get client's request publisher qos"); + return rc; + } + return RMW_RET_OK; +} + +rmw_ret_t +RMW_Connext_Client::response_subscription_qos(rmw_qos_profile_t * const qos) +{ + rmw_ret_t rc = this->reply_sub->qos(qos); + if (rc != RMW_RET_OK) { + RMW_SET_ERROR_MSG("coudn't get client's response subscription qos"); + return rc; + } + return RMW_RET_OK; +} + rmw_ret_t RMW_Connext_Client::finalize() { @@ -2944,6 +2966,28 @@ RMW_Connext_Service::send_response( return this->reply_pub->write(&rr_msg, false /* serialized */); } +rmw_ret_t +RMW_Connext_Service::response_publisher_qos(rmw_qos_profile_t * const qos) +{ + rmw_ret_t rc = this->reply_pub->qos(qos); + if (rc != RMW_RET_OK) { + RMW_SET_ERROR_MSG("coudn't get service's response publisher qos"); + return rc; + } + return RMW_RET_OK; +} + +rmw_ret_t +RMW_Connext_Service::request_subscription_qos(rmw_qos_profile_t * const qos) +{ + rmw_ret_t rc = this->request_sub->qos(qos); + if (rc != RMW_RET_OK) { + RMW_SET_ERROR_MSG("coudn't get service's request subscription qos"); + return rc; + } + return RMW_RET_OK; +} + rmw_ret_t RMW_Connext_Service::finalize() { diff --git a/rmw_connextdds_common/src/common/rmw_service.cpp b/rmw_connextdds_common/src/common/rmw_service.cpp index a52d2425..c04e725c 100644 --- a/rmw_connextdds_common/src/common/rmw_service.cpp +++ b/rmw_connextdds_common/src/common/rmw_service.cpp @@ -267,6 +267,48 @@ rmw_api_connextdds_destroy_client( } +rmw_ret_t +rmw_api_connextdds_client_request_publisher_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(client, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + client, + client->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + + RMW_CHECK_ARGUMENT_FOR_NULL(qos, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Client * const client_impl = + reinterpret_cast(client->data); + + return client_impl->request_publisher_qos(qos); +} + + +rmw_ret_t +rmw_api_connextdds_client_response_subscription_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(client, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + client, + client->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + + RMW_CHECK_ARGUMENT_FOR_NULL(qos, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Client * const client_impl = + reinterpret_cast(client->data); + + return client_impl->response_subscription_qos(qos); +} + + rmw_service_t * rmw_api_connextdds_create_service( const rmw_node_t * node, @@ -374,6 +416,48 @@ rmw_api_connextdds_create_service( } +rmw_ret_t +rmw_api_connextdds_service_response_publisher_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(service, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + service, + service->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + + RMW_CHECK_ARGUMENT_FOR_NULL(qos, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Service * const svc_impl = + reinterpret_cast(service->data); + + return svc_impl->response_publisher_qos(qos); +} + + +rmw_ret_t +rmw_api_connextdds_service_request_subscription_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(service, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + service, + service->implementation_identifier, + RMW_CONNEXTDDS_ID, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + + RMW_CHECK_ARGUMENT_FOR_NULL(qos, RMW_RET_INVALID_ARGUMENT); + + RMW_Connext_Service * const svc_impl = + reinterpret_cast(service->data); + + return svc_impl->request_subscription_qos(qos); +} + + rmw_ret_t rmw_api_connextdds_destroy_service( rmw_node_t * node, diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index 37c56438..4c6417c3 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -566,6 +566,25 @@ rmw_create_client( } +rmw_ret_t +rmw_client_request_publisher_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_client_request_publisher_get_actual_qos( + client, qos); +} + + +rmw_ret_t +rmw_client_response_subscription_get_actual_qos( + const rmw_client_t * client, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_client_response_subscription_get_actual_qos( + client, qos); +} + rmw_ret_t rmw_destroy_client( rmw_node_t * node, @@ -587,6 +606,26 @@ rmw_create_service( } +rmw_ret_t +rmw_service_response_publisher_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_service_response_publisher_get_actual_qos( + service, qos); +} + + +rmw_ret_t +rmw_service_request_subscription_get_actual_qos( + const rmw_service_t * service, + rmw_qos_profile_t * qos) +{ + return rmw_api_connextdds_service_request_subscription_get_actual_qos( + service, qos); +} + + rmw_ret_t rmw_destroy_service( rmw_node_t * node, From 896839faa4085a5f434034563e386855ec311e71 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 19 Nov 2021 21:19:07 +0000 Subject: [PATCH 10/29] Changelogs Signed-off-by: Ivan Santiago Paunovic --- rmw_connextdds/CHANGELOG.rst | 5 +++++ rmw_connextdds_common/CHANGELOG.rst | 5 +++++ rmw_connextddsmicro/CHANGELOG.rst | 5 +++++ rti_connext_dds_cmake_module/CHANGELOG.rst | 3 +++ 4 files changed, 18 insertions(+) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index 98836fbb..ee734ef2 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add client/service QoS getters. (`#67 `_) +* Contributors: mauropasse + 0.8.0 (2021-09-15) ------------------ diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index abd4fe43..74b60e13 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add client/service QoS getters. (`#67 `_) +* Contributors: mauropasse + 0.8.0 (2021-09-15) ------------------ * Update rmw_context_impl_t definition (`#65 `_) diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index 38ff62ef..1e2e25b3 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add client/service QoS getters. (`#67 `_) +* Contributors: mauropasse + 0.8.0 (2021-09-15) ------------------ diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index 2a4e107c..77f8c885 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.8.0 (2021-09-15) ------------------ From a3bbfb62fa22eacdaefb3f69544e91b262c9737b Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 19 Nov 2021 21:20:07 +0000 Subject: [PATCH 11/29] 0.8.1 --- rmw_connextdds/CHANGELOG.rst | 4 ++-- rmw_connextdds/package.xml | 2 +- rmw_connextdds_common/CHANGELOG.rst | 4 ++-- rmw_connextdds_common/package.xml | 2 +- rmw_connextddsmicro/CHANGELOG.rst | 4 ++-- rmw_connextddsmicro/package.xml | 2 +- rti_connext_dds_cmake_module/CHANGELOG.rst | 4 ++-- rti_connext_dds_cmake_module/package.xml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index ee734ef2..7cea115c 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.8.1 (2021-11-19) +------------------ * Add client/service QoS getters. (`#67 `_) * Contributors: mauropasse diff --git a/rmw_connextdds/package.xml b/rmw_connextdds/package.xml index 50fb7733..563909d8 100644 --- a/rmw_connextdds/package.xml +++ b/rmw_connextdds/package.xml @@ -2,7 +2,7 @@ rmw_connextdds - 0.8.0 + 0.8.1 A ROS2 RMW implementation built with RTI Connext DDS Professional. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index 74b60e13..698bb591 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.8.1 (2021-11-19) +------------------ * Add client/service QoS getters. (`#67 `_) * Contributors: mauropasse diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index d2d908bd..31e4c91b 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -2,7 +2,7 @@ rmw_connextdds_common - 0.8.0 + 0.8.1 Common source for RMW implementations built with RTI Connext DDS Professional and RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index 1e2e25b3..43924863 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.8.1 (2021-11-19) +------------------ * Add client/service QoS getters. (`#67 `_) * Contributors: mauropasse diff --git a/rmw_connextddsmicro/package.xml b/rmw_connextddsmicro/package.xml index 59d02968..6e71f487 100644 --- a/rmw_connextddsmicro/package.xml +++ b/rmw_connextddsmicro/package.xml @@ -2,7 +2,7 @@ rmw_connextddsmicro - 0.8.0 + 0.8.1 A ROS2 RMW implementation built with RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index 77f8c885..69c30b1e 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.8.1 (2021-11-19) +------------------ 0.8.0 (2021-09-15) ------------------ diff --git a/rti_connext_dds_cmake_module/package.xml b/rti_connext_dds_cmake_module/package.xml index f24237da..5d570e24 100644 --- a/rti_connext_dds_cmake_module/package.xml +++ b/rti_connext_dds_cmake_module/package.xml @@ -2,7 +2,7 @@ rti_connext_dds_cmake_module - 0.8.0 + 0.8.1 Helper module to provide access to RTI products like Connext DDS Professional Andrea Sorbini Apache License 2.0 From 8b10debdeee72206e6e6b8b7c18b66f8786438ca Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 12 Jan 2022 14:25:32 -0800 Subject: [PATCH 12/29] Fix cpplint errors (#69) * Use static_cast instead of C-style cast Fixes cpplint error. Signed-off-by: Jacob Perron * Update NOLINT category Relates to https://github.com/ament/ament_lint/pull/324 Signed-off-by: Jacob Perron --- rmw_connextdds_common/include/rmw_connextdds/dds_api_rtime.hpp | 2 +- rmw_connextdds_common/src/rtime/dds_api_rtime.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rmw_connextdds_common/include/rmw_connextdds/dds_api_rtime.hpp b/rmw_connextdds_common/include/rmw_connextdds/dds_api_rtime.hpp index bf89b236..d73b15af 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/dds_api_rtime.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/dds_api_rtime.hpp @@ -15,7 +15,7 @@ #ifndef RMW_CONNEXTDDS__DDS_API_RTIME_HPP_ #define RMW_CONNEXTDDS__DDS_API_RTIME_HPP_ -#include "rti_me_c.h" // NOLINT(build/include) +#include "rti_me_c.h" // NOLINT(build/include_subdir) #include "disc_dpde/disc_dpde_discovery_plugin.h" #include "wh_sm/wh_sm_history.h" #include "rh_sm/rh_sm_history.h" diff --git a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp index 835c13d0..012cf6bb 100644 --- a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp @@ -938,7 +938,7 @@ rmw_connextdds_get_qos_policies( size_t max_samples = RMW_CONNEXT_LIMIT_SAMPLES_MAX; if (DDS_LENGTH_UNLIMITED != history->depth && - (size_t)history->depth > max_samples) + static_cast(history->depth) > max_samples) { max_samples = history->depth; } From 099692a119c554fae23610236aa2115d58751f1b Mon Sep 17 00:00:00 2001 From: Audrow Nash Date: Fri, 14 Jan 2022 16:23:55 -0800 Subject: [PATCH 13/29] 0.8.2 Signed-off-by: Audrow Nash --- rmw_connextdds/CHANGELOG.rst | 3 +++ rmw_connextdds/package.xml | 2 +- rmw_connextdds_common/CHANGELOG.rst | 5 +++++ rmw_connextdds_common/package.xml | 2 +- rmw_connextddsmicro/CHANGELOG.rst | 3 +++ rmw_connextddsmicro/package.xml | 2 +- rti_connext_dds_cmake_module/CHANGELOG.rst | 3 +++ rti_connext_dds_cmake_module/package.xml | 2 +- 8 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index 7cea115c..61cbb384 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.2 (2022-01-14) +------------------ + 0.8.1 (2021-11-19) ------------------ * Add client/service QoS getters. (`#67 `_) diff --git a/rmw_connextdds/package.xml b/rmw_connextdds/package.xml index 563909d8..63ac0f08 100644 --- a/rmw_connextdds/package.xml +++ b/rmw_connextdds/package.xml @@ -2,7 +2,7 @@ rmw_connextdds - 0.8.1 + 0.8.2 A ROS2 RMW implementation built with RTI Connext DDS Professional. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index 698bb591..94ac1966 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.2 (2022-01-14) +------------------ +* Fix cpplint errors (`#69 `_) +* Contributors: Jacob Perron + 0.8.1 (2021-11-19) ------------------ * Add client/service QoS getters. (`#67 `_) diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index 31e4c91b..b180697b 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -2,7 +2,7 @@ rmw_connextdds_common - 0.8.1 + 0.8.2 Common source for RMW implementations built with RTI Connext DDS Professional and RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index 43924863..370c1925 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.2 (2022-01-14) +------------------ + 0.8.1 (2021-11-19) ------------------ * Add client/service QoS getters. (`#67 `_) diff --git a/rmw_connextddsmicro/package.xml b/rmw_connextddsmicro/package.xml index 6e71f487..1fd261b1 100644 --- a/rmw_connextddsmicro/package.xml +++ b/rmw_connextddsmicro/package.xml @@ -2,7 +2,7 @@ rmw_connextddsmicro - 0.8.1 + 0.8.2 A ROS2 RMW implementation built with RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index 69c30b1e..ed105dbc 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.2 (2022-01-14) +------------------ + 0.8.1 (2021-11-19) ------------------ diff --git a/rti_connext_dds_cmake_module/package.xml b/rti_connext_dds_cmake_module/package.xml index 5d570e24..073b8817 100644 --- a/rti_connext_dds_cmake_module/package.xml +++ b/rti_connext_dds_cmake_module/package.xml @@ -2,7 +2,7 @@ rti_connext_dds_cmake_module - 0.8.1 + 0.8.2 Helper module to provide access to RTI products like Connext DDS Professional Andrea Sorbini Apache License 2.0 From 70d6e2eae703567b4203acccc37c4540c580d51e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnar=C3=B6k?= Date: Thu, 10 Feb 2022 11:46:57 -0500 Subject: [PATCH 14/29] Update rti-connext-dds dependency to 6.0.1. (#71) Now that this package is available in the ROS bootstrap repository for Ubuntu Focal and Jammy we can bump the expected dependency version. --- rti_connext_dds_cmake_module/package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rti_connext_dds_cmake_module/package.xml b/rti_connext_dds_cmake_module/package.xml index 073b8817..6ddc7581 100644 --- a/rti_connext_dds_cmake_module/package.xml +++ b/rti_connext_dds_cmake_module/package.xml @@ -10,7 +10,7 @@ ament_cmake ament_cmake - rti-connext-dds-5.3.1 + rti-connext-dds-6.0.1 ament_lint_auto ament_lint_common From bbdf5af7c5344d3b521d35c37ab88cd70ac58e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnar=C3=B6k?= Date: Thu, 10 Feb 2022 15:02:30 -0800 Subject: [PATCH 15/29] 0.8.3 --- rmw_connextdds/CHANGELOG.rst | 3 +++ rmw_connextdds/package.xml | 2 +- rmw_connextdds_common/CHANGELOG.rst | 3 +++ rmw_connextdds_common/package.xml | 2 +- rmw_connextddsmicro/CHANGELOG.rst | 3 +++ rmw_connextddsmicro/package.xml | 2 +- rti_connext_dds_cmake_module/CHANGELOG.rst | 5 +++++ rti_connext_dds_cmake_module/package.xml | 2 +- 8 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index 61cbb384..7db4152c 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.3 (2022-02-10) +------------------ + 0.8.2 (2022-01-14) ------------------ diff --git a/rmw_connextdds/package.xml b/rmw_connextdds/package.xml index 63ac0f08..cafc0aca 100644 --- a/rmw_connextdds/package.xml +++ b/rmw_connextdds/package.xml @@ -2,7 +2,7 @@ rmw_connextdds - 0.8.2 + 0.8.3 A ROS2 RMW implementation built with RTI Connext DDS Professional. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index 94ac1966..10c5d867 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.3 (2022-02-10) +------------------ + 0.8.2 (2022-01-14) ------------------ * Fix cpplint errors (`#69 `_) diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index b180697b..a02ba85e 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -2,7 +2,7 @@ rmw_connextdds_common - 0.8.2 + 0.8.3 Common source for RMW implementations built with RTI Connext DDS Professional and RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index 370c1925..caf952f8 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.3 (2022-02-10) +------------------ + 0.8.2 (2022-01-14) ------------------ diff --git a/rmw_connextddsmicro/package.xml b/rmw_connextddsmicro/package.xml index 1fd261b1..2f1e5ae9 100644 --- a/rmw_connextddsmicro/package.xml +++ b/rmw_connextddsmicro/package.xml @@ -2,7 +2,7 @@ rmw_connextddsmicro - 0.8.2 + 0.8.3 A ROS2 RMW implementation built with RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index ed105dbc..a61e5949 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.8.3 (2022-02-10) +------------------ +* Update rti-connext-dds dependency to 6.0.1. (`#71 `_) +* Contributors: Steven! Ragnarök + 0.8.2 (2022-01-14) ------------------ diff --git a/rti_connext_dds_cmake_module/package.xml b/rti_connext_dds_cmake_module/package.xml index 6ddc7581..7cf59bd4 100644 --- a/rti_connext_dds_cmake_module/package.xml +++ b/rti_connext_dds_cmake_module/package.xml @@ -2,7 +2,7 @@ rti_connext_dds_cmake_module - 0.8.2 + 0.8.3 Helper module to provide access to RTI products like Connext DDS Professional Andrea Sorbini Apache License 2.0 From 4129331c262655a3b68658341064e905d8b54316 Mon Sep 17 00:00:00 2001 From: iRobot ROS <49500531+irobot-ros@users.noreply.github.com> Date: Thu, 24 Feb 2022 08:31:41 +0000 Subject: [PATCH 16/29] Add rmw listener apis (#44) * Add stubs for setting listener callbacks Signed-off-by: Mauro Passerino * Address PR suggestions Signed-off-by: Mauro Passerino * Fix linter issues Signed-off-by: Mauro Passerino Co-authored-by: Mauro Passerino Co-authored-by: Alberto Soragna --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 39 ++++++++++ rmw_connextdds_common/CMakeLists.txt | 1 + .../include/rmw_connextdds/rmw_api_impl.hpp | 29 +++++++ .../src/common/rmw_listener.cpp | 76 +++++++++++++++++++ .../src/rmw_api_impl_rtime.cpp | 40 ++++++++++ 5 files changed, 185 insertions(+) create mode 100644 rmw_connextdds_common/src/common/rmw_listener.cpp diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index ed2e45c8..b4caf481 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -120,6 +120,14 @@ rmw_take_event( return rmw_api_connextdds_take_event(event_handle, event_info, taken); } +rmw_ret_t +rmw_event_set_callback( + rmw_event_t * event, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_event_set_callback(event, callback, user_data); +} /***************************************************************************** * Info API *****************************************************************************/ @@ -634,6 +642,27 @@ rmw_destroy_service( { return rmw_api_connextdds_destroy_service(node, service); } + +rmw_ret_t +rmw_service_set_on_new_request_callback( + rmw_service_t * rmw_service, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_service_set_on_new_request_callback( + rmw_service, callback, user_data); +} + +rmw_ret_t +rmw_client_set_on_new_response_callback( + rmw_client_t * rmw_client, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_client_set_on_new_response_callback( + rmw_client, callback, user_data); +} + /***************************************************************************** * Subscription API *****************************************************************************/ @@ -812,6 +841,16 @@ rmw_return_loaned_message_from_subscription( subscription, loaned_message); } +rmw_ret_t +rmw_subscription_set_on_new_message_callback( + rmw_subscription_t * rmw_subscription, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_subscription_set_on_new_message_callback( + rmw_subscription, callback, user_data); +} + /***************************************************************************** * WaitSet API *****************************************************************************/ diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index 03fd8645..925d1beb 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -139,6 +139,7 @@ set(RMW_CONNEXT_COMMON_SOURCE_CPP src/common/rmw_impl.cpp src/common/rmw_impl_waitset_std.cpp src/common/rmw_info.cpp + src/common/rmw_listener.cpp src/common/rmw_node.cpp src/common/rmw_publication.cpp src/common/rmw_qos.cpp diff --git a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp index d07a97fb..ac2d82b0 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/rmw_api_impl.hpp @@ -86,6 +86,13 @@ rmw_api_connextdds_take_event( void * event_info, bool * taken); +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_event_set_callback( + rmw_event_t * event, + rmw_event_callback_t callback, + const void * user_data); + /***************************************************************************** * Info API *****************************************************************************/ @@ -423,6 +430,21 @@ rmw_ret_t rmw_api_connextdds_destroy_service( rmw_node_t * node, rmw_service_t * service); + +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_service_set_on_new_request_callback( + rmw_service_t * rmw_service, + rmw_event_callback_t callback, + const void * user_data); + +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_client_set_on_new_response_callback( + rmw_client_t * rmw_client, + rmw_event_callback_t callback, + const void * user_data); + /***************************************************************************** * Subscription API *****************************************************************************/ @@ -547,6 +569,13 @@ rmw_api_connextdds_return_loaned_message_from_subscription( const rmw_subscription_t * subscription, void * loaned_message); +RMW_CONNEXTDDS_PUBLIC +rmw_ret_t +rmw_api_connextdds_subscription_set_on_new_message_callback( + rmw_subscription_t * rmw_subscription, + rmw_event_callback_t callback, + const void * user_data); + /***************************************************************************** * WaitSet API *****************************************************************************/ diff --git a/rmw_connextdds_common/src/common/rmw_listener.cpp b/rmw_connextdds_common/src/common/rmw_listener.cpp new file mode 100644 index 00000000..730eaa92 --- /dev/null +++ b/rmw_connextdds_common/src/common/rmw_listener.cpp @@ -0,0 +1,76 @@ +// Copyright 2021 Real-Time Innovations, Inc. (RTI) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "rmw_connextdds/rmw_impl.hpp" + +/****************************************************************************** + * Event Listener API + ******************************************************************************/ +rmw_ret_t +rmw_api_connextdds_event_set_callback( + rmw_event_t * event, + rmw_event_callback_t callback, + const void * user_data) +{ + UNUSED_ARG(event); + UNUSED_ARG(callback); + UNUSED_ARG(user_data); + RMW_CONNEXT_LOG_ERROR_SET("rmw_event_set_callback not implemented") + return RMW_RET_UNSUPPORTED; +} + +/****************************************************************************** + * Service Listener API + ******************************************************************************/ +rmw_ret_t +rmw_api_connextdds_service_set_on_new_request_callback( + rmw_service_t * rmw_service, + rmw_event_callback_t callback, + const void * user_data) +{ + UNUSED_ARG(rmw_service); + UNUSED_ARG(callback); + UNUSED_ARG(user_data); + RMW_CONNEXT_LOG_ERROR_SET("rmw_service_set_on_new_request_callback not implemented") + return RMW_RET_UNSUPPORTED; +} + +rmw_ret_t +rmw_api_connextdds_client_set_on_new_response_callback( + rmw_client_t * rmw_client, + rmw_event_callback_t callback, + const void * user_data) +{ + UNUSED_ARG(rmw_client); + UNUSED_ARG(callback); + UNUSED_ARG(user_data); + RMW_CONNEXT_LOG_ERROR_SET("rmw_client_set_on_new_response_callback not implemented") + return RMW_RET_UNSUPPORTED; +} + +/****************************************************************************** + * Subscription Listener API + ******************************************************************************/ +rmw_ret_t +rmw_api_connextdds_subscription_set_on_new_message_callback( + rmw_subscription_t * rmw_subscription, + rmw_event_callback_t callback, + const void * user_data) +{ + UNUSED_ARG(rmw_subscription); + UNUSED_ARG(callback); + UNUSED_ARG(user_data); + RMW_CONNEXT_LOG_ERROR_SET("rmw_subscription_set_on_new_message_callback not implemented") + return RMW_RET_UNSUPPORTED; +} diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index 4c6417c3..d56d0ccf 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -120,6 +120,15 @@ rmw_take_event( return rmw_api_connextdds_take_event(event_handle, event_info, taken); } +rmw_ret_t +rmw_event_set_callback( + rmw_event_t * event, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_event_set_callback(event, callback, user_data); +} + /***************************************************************************** * Info API *****************************************************************************/ @@ -633,6 +642,27 @@ rmw_destroy_service( { return rmw_api_connextdds_destroy_service(node, service); } + +rmw_ret_t +rmw_service_set_on_new_request_callback( + rmw_service_t * rmw_service, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_service_set_on_new_request_callback( + rmw_service, callback, user_data); +} + +rmw_ret_t +rmw_client_set_on_new_response_callback( + rmw_client_t * rmw_client, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_client_set_on_new_response_callback( + rmw_client, callback, user_data); +} + /***************************************************************************** * Subscription API *****************************************************************************/ @@ -809,6 +839,16 @@ rmw_return_loaned_message_from_subscription( subscription, loaned_message); } +rmw_ret_t +rmw_subscription_set_on_new_message_callback( + rmw_subscription_t * rmw_subscription, + rmw_event_callback_t callback, + const void * user_data) +{ + return rmw_api_connextdds_subscription_set_on_new_message_callback( + rmw_subscription, callback, user_data); +} + /***************************************************************************** * WaitSet API *****************************************************************************/ From 49f3b55e761a5d2376b7ed99da9435bb89cf75aa Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Tue, 1 Mar 2022 15:01:30 -0500 Subject: [PATCH 17/29] Changelog. (#73) Signed-off-by: Chris Lalancette --- rmw_connextdds/CHANGELOG.rst | 5 +++++ rmw_connextdds_common/CHANGELOG.rst | 5 +++++ rmw_connextddsmicro/CHANGELOG.rst | 5 +++++ rti_connext_dds_cmake_module/CHANGELOG.rst | 3 +++ 4 files changed, 18 insertions(+) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index 7db4152c..bde18ffb 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add rmw listener apis (`#44 `_) +* Contributors: iRobot ROS + 0.8.3 (2022-02-10) ------------------ diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index 10c5d867..cee972f4 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add rmw listener apis (`#44 `_) +* Contributors: iRobot ROS + 0.8.3 (2022-02-10) ------------------ diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index caf952f8..3f3f6480 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add rmw listener apis (`#44 `_) +* Contributors: iRobot ROS + 0.8.3 (2022-02-10) ------------------ diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index a61e5949..638f23c8 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.8.3 (2022-02-10) ------------------ * Update rti-connext-dds dependency to 6.0.1. (`#71 `_) From 4becb93b031385c05d05e91b242491779aebed86 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Tue, 1 Mar 2022 20:01:49 +0000 Subject: [PATCH 18/29] 0.9.0 --- rmw_connextdds/CHANGELOG.rst | 4 ++-- rmw_connextdds/package.xml | 2 +- rmw_connextdds_common/CHANGELOG.rst | 4 ++-- rmw_connextdds_common/package.xml | 2 +- rmw_connextddsmicro/CHANGELOG.rst | 4 ++-- rmw_connextddsmicro/package.xml | 2 +- rti_connext_dds_cmake_module/CHANGELOG.rst | 4 ++-- rti_connext_dds_cmake_module/package.xml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rmw_connextdds/CHANGELOG.rst b/rmw_connextdds/CHANGELOG.rst index bde18ffb..f199c3a9 100644 --- a/rmw_connextdds/CHANGELOG.rst +++ b/rmw_connextdds/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextdds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.9.0 (2022-03-01) +------------------ * Add rmw listener apis (`#44 `_) * Contributors: iRobot ROS diff --git a/rmw_connextdds/package.xml b/rmw_connextdds/package.xml index cafc0aca..8c96eeb2 100644 --- a/rmw_connextdds/package.xml +++ b/rmw_connextdds/package.xml @@ -2,7 +2,7 @@ rmw_connextdds - 0.8.3 + 0.9.0 A ROS2 RMW implementation built with RTI Connext DDS Professional. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextdds_common/CHANGELOG.rst b/rmw_connextdds_common/CHANGELOG.rst index cee972f4..b5fedb66 100644 --- a/rmw_connextdds_common/CHANGELOG.rst +++ b/rmw_connextdds_common/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextdds_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.9.0 (2022-03-01) +------------------ * Add rmw listener apis (`#44 `_) * Contributors: iRobot ROS diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index a02ba85e..0e5c3933 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -2,7 +2,7 @@ rmw_connextdds_common - 0.8.3 + 0.9.0 Common source for RMW implementations built with RTI Connext DDS Professional and RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rmw_connextddsmicro/CHANGELOG.rst b/rmw_connextddsmicro/CHANGELOG.rst index 3f3f6480..0d25e166 100644 --- a/rmw_connextddsmicro/CHANGELOG.rst +++ b/rmw_connextddsmicro/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rmw_connextddsmicro ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.9.0 (2022-03-01) +------------------ * Add rmw listener apis (`#44 `_) * Contributors: iRobot ROS diff --git a/rmw_connextddsmicro/package.xml b/rmw_connextddsmicro/package.xml index 2f1e5ae9..9ea0db43 100644 --- a/rmw_connextddsmicro/package.xml +++ b/rmw_connextddsmicro/package.xml @@ -2,7 +2,7 @@ rmw_connextddsmicro - 0.8.3 + 0.9.0 A ROS2 RMW implementation built with RTI Connext DDS Micro. Andrea Sorbini Apache License 2.0 diff --git a/rti_connext_dds_cmake_module/CHANGELOG.rst b/rti_connext_dds_cmake_module/CHANGELOG.rst index 638f23c8..69736d78 100644 --- a/rti_connext_dds_cmake_module/CHANGELOG.rst +++ b/rti_connext_dds_cmake_module/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rti_connext_dds_cmake_module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.9.0 (2022-03-01) +------------------ 0.8.3 (2022-02-10) ------------------ diff --git a/rti_connext_dds_cmake_module/package.xml b/rti_connext_dds_cmake_module/package.xml index 7cf59bd4..7eb14726 100644 --- a/rti_connext_dds_cmake_module/package.xml +++ b/rti_connext_dds_cmake_module/package.xml @@ -2,7 +2,7 @@ rti_connext_dds_cmake_module - 0.8.3 + 0.9.0 Helper module to provide access to RTI products like Connext DDS Professional Andrea Sorbini Apache License 2.0 From 203f820382cae34d3c63a111227052abeef6f4cc Mon Sep 17 00:00:00 2001 From: Chen Lihui Date: Fri, 18 Mar 2022 09:27:19 +0800 Subject: [PATCH 19/29] add stub for content filtered topic Signed-off-by: Chen Lihui --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 26 +++++++++++++++++++ .../src/rmw_api_impl_rtime.cpp | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index b4caf481..6c754f82 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -735,6 +735,32 @@ rmw_subscription_get_content_filter( subscription, allocator, options); } +rmw_ret_t +rmw_subscription_set_content_filter( + rmw_subscription_t * subscription, + const rmw_subscription_content_filter_options_t * options) +{ + UNUSED_ARG(subscription); + UNUSED_ARG(options); + RMW_CONNEXT_LOG_NOT_IMPLEMENTED + return RMW_RET_UNSUPPORTED; +} + + +rmw_ret_t +rmw_subscription_get_content_filter( + const rmw_subscription_t * subscription, + rcutils_allocator_t * allocator, + rmw_subscription_content_filter_options_t * options) +{ + UNUSED_ARG(subscription); + UNUSED_ARG(allocator); + UNUSED_ARG(options); + RMW_CONNEXT_LOG_NOT_IMPLEMENTED + return RMW_RET_UNSUPPORTED; +} + + rmw_ret_t rmw_destroy_subscription( rmw_node_t * node, diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index d56d0ccf..3640784a 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -733,6 +733,32 @@ rmw_subscription_get_content_filter( return RMW_RET_UNSUPPORTED; } +rmw_ret_t +rmw_subscription_set_content_filter( + rmw_subscription_t * subscription, + const rmw_subscription_content_filter_options_t * options) +{ + UNUSED_ARG(subscription); + UNUSED_ARG(options); + RMW_CONNEXT_LOG_NOT_IMPLEMENTED + return RMW_RET_UNSUPPORTED; +} + + +rmw_ret_t +rmw_subscription_get_content_filter( + const rmw_subscription_t * subscription, + rcutils_allocator_t * allocator, + rmw_subscription_content_filter_options_t * options) +{ + UNUSED_ARG(subscription); + UNUSED_ARG(allocator); + UNUSED_ARG(options); + RMW_CONNEXT_LOG_NOT_IMPLEMENTED + return RMW_RET_UNSUPPORTED; +} + + rmw_ret_t rmw_destroy_subscription( rmw_node_t * node, From 5a36784eacb4959bc27e006223924aacfb5d784f Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Fri, 18 Mar 2022 17:41:23 -0700 Subject: [PATCH 20/29] * Rebased branch asorbini/cft on top of 0.9.0. * Resolved CFT finalization issues on error. * Verified and cleaned up build for rmw_connextddsmicro. Signed-off-by: Andrea Sorbini --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 26 -------------- rmw_connextdds_common/CMakeLists.txt | 12 +++++-- rmw_connextdds_common/src/common/rmw_impl.cpp | 11 ++++-- .../src/ndds/dds_api_ndds.cpp | 1 - .../src/rtime/dds_api_rtime.cpp | 4 +-- .../src/rmw_api_impl_rtime.cpp | 34 +++++-------------- 6 files changed, 27 insertions(+), 61 deletions(-) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index 6c754f82..b4caf481 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -735,32 +735,6 @@ rmw_subscription_get_content_filter( subscription, allocator, options); } -rmw_ret_t -rmw_subscription_set_content_filter( - rmw_subscription_t * subscription, - const rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - -rmw_ret_t -rmw_subscription_get_content_filter( - const rmw_subscription_t * subscription, - rcutils_allocator_t * allocator, - rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(allocator); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - rmw_ret_t rmw_destroy_subscription( rmw_node_t * node, diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index 925d1beb..224c85f3 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -118,8 +118,7 @@ set(RMW_CONNEXT_DEPS rosidl_typesupport_fastrtps_cpp rosidl_typesupport_introspection_c rosidl_typesupport_introspection_cpp - rti_connext_dds_cmake_module - rti_connext_dds_custom_sql_filter) + rti_connext_dds_cmake_module) foreach(pkg_dep ${RMW_CONNEXT_DEPS}) find_package(${pkg_dep} REQUIRED) @@ -195,6 +194,7 @@ else() if("${CONNEXTDDS_VERSION}" VERSION_LESS "6.0.0") list(APPEND extra_defines "RMW_CONNEXT_DDS_API_PRO_LEGACY=1") endif() + find_package(rti_connext_dds_custom_sql_filter REQUIRED) rtirmw_add_library( NAME ${PROJECT_NAME}_pro API PRO @@ -206,6 +206,7 @@ else() include/rmw_connextdds/typecode.hpp include/rmw_connextdds/dds_api_ndds.hpp DEPS ${RMW_CONNEXT_DEPS} + rti_connext_dds_custom_sql_filter LIBRARIES RTIConnextDDS::c_api DEFINES ${extra_defines}) endif() @@ -290,7 +291,12 @@ endif() ################################################################################ # Configure Ament package ################################################################################ -ament_export_dependencies(${RMW_CONNEXT_DEPS}) +set(RMW_AMENT_EXPORT_DEPS ${RMW_CONNEXT_DEPS}) +if(TARGET ${PROJECT_NAME}_pro) + list(APPEND RMW_AMENT_EXPORT_DEPS rti_connext_dds_custom_sql_filter) +endif() +ament_export_dependencies( + ${RMW_AMENT_EXPORT_DEPS}) if(RMW_CONNEXT_BUILT) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 1ad5e661..1d0b090f 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -948,6 +948,11 @@ rmw_ret_t RMW_Connext_Publisher::wait_for_all_acked(rmw_time_t wait_timeout) { DDS_Duration_t timeout = rmw_connextdds_duration_from_ros_time(&wait_timeout); +#if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_MICRO + // Avoid warnings for unused variable in micro, since wait_for_ack() is + // mapped to an empty call. + UNUSED_ARG(timeout); +#endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_MICRO const DDS_ReturnCode_t dds_rc = DDS_DataWriter_wait_for_acknowledgments(this->dds_writer, &timeout); @@ -1239,7 +1244,7 @@ RMW_Connext_Subscriber::create( } auto scope_exit_topic_delete = rcpputils::make_scope_exit( - [ctx, topic_created, dp, topic, cft_topic]() + [ctx, &topic_created, dp, &topic, &cft_topic]() { if (nullptr != cft_topic) { if (RMW_RET_OK != @@ -1273,7 +1278,7 @@ RMW_Connext_Subscriber::create( sub_cft_expr = subscriber_options->content_filter_options->filter_expression; sub_cft_params = - subscriber_options->content_filter_options->expression_parameters; + &subscriber_options->content_filter_options->expression_parameters; } } @@ -1561,7 +1566,7 @@ RMW_Connext_Subscriber::set_content_filter( { if (RMW_RET_OK != rmw_connextdds_set_cft_filter_expression( - this->dds_topic_cft, options->filter_expression, options->expression_parameters)) + this->dds_topic_cft, options->filter_expression, &options->expression_parameters)) { return RMW_RET_ERROR; } diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index d31537f5..a6c1d49d 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -1422,7 +1422,6 @@ rmw_connextdds_set_cft_filter_expression( return RMW_RET_OK; } - rmw_ret_t rmw_connextdds_get_cft_filter_expression( DDS_TopicDescription * const topic_desc, diff --git a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp index 012cf6bb..bdc6d4ac 100644 --- a/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/dds_api_rtime.cpp @@ -867,7 +867,7 @@ rmw_connextdds_configure_participant( rmw_context_impl_t * const ctx, DDS_DomainParticipant * const participant) { - UNUSED_ARG(ctx); + UNUSED_ARG(participant); UNUSED_ARG(ctx); return RMW_RET_OK; @@ -1984,7 +1984,7 @@ rmw_ret_t rmw_connextdds_get_cft_filter_expression( DDS_TopicDescription * const topic_desc, rcutils_allocator_t * const allocator, - rmw_subscription_content_filter_options_t * const options); + rmw_subscription_content_filter_options_t * const options) { UNUSED_ARG(topic_desc); UNUSED_ARG(allocator); diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index 3640784a..461446c0 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -721,27 +721,10 @@ rmw_subscription_set_content_filter( rmw_subscription_t * subscription, const rmw_subscription_content_filter_options_t * options) { - return RMW_RET_UNSUPPORTED; -} - -rmw_ret_t -rmw_subscription_get_content_filter( - const rmw_subscription_t * subscription, - rcutils_allocator_t * allocator, - rmw_subscription_content_filter_options_t * options) -{ - return RMW_RET_UNSUPPORTED; -} - -rmw_ret_t -rmw_subscription_set_content_filter( - rmw_subscription_t * subscription, - const rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; + // Content filters are not supported by Micro and this call will + // eventually fail with RMW_RET_UNSUPPORTED. + return rmw_api_connextdds_subscription_set_content_filter( + subscription, options); } @@ -751,11 +734,10 @@ rmw_subscription_get_content_filter( rcutils_allocator_t * allocator, rmw_subscription_content_filter_options_t * options) { - UNUSED_ARG(subscription); - UNUSED_ARG(allocator); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; + // Content filters are not supported by Micro and this call will + // eventually fail with RMW_RET_UNSUPPORTED. + return rmw_api_connextdds_subscription_get_content_filter( + subscription, allocator, options); } From d43b0324fb406e99c1593801c4d02192d1246c10 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Sat, 19 Mar 2022 13:30:02 -0700 Subject: [PATCH 21/29] Move custom SQL filter to rmw_connextdds_common Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/CMakeLists.txt | 11 +--- .../rmw_connextdds}/custom_sql_filter.hpp | 15 +++-- rmw_connextdds_common/package.xml | 1 - .../src/ndds}/custom_sql_filter.cpp | 6 +- .../src/ndds/dds_api_ndds.cpp | 2 +- .../CMakeLists.txt | 66 ------------------- .../visibility_control.h | 48 -------------- rti_connext_dds_custom_sql_filter/package.xml | 21 ------ 8 files changed, 18 insertions(+), 152 deletions(-) rename {rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter => rmw_connextdds_common/include/rmw_connextdds}/custom_sql_filter.hpp (79%) rename {rti_connext_dds_custom_sql_filter/src => rmw_connextdds_common/src/ndds}/custom_sql_filter.cpp (99%) delete mode 100644 rti_connext_dds_custom_sql_filter/CMakeLists.txt delete mode 100644 rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h delete mode 100644 rti_connext_dds_custom_sql_filter/package.xml diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index 224c85f3..a2f76ca7 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -194,7 +194,6 @@ else() if("${CONNEXTDDS_VERSION}" VERSION_LESS "6.0.0") list(APPEND extra_defines "RMW_CONNEXT_DDS_API_PRO_LEGACY=1") endif() - find_package(rti_connext_dds_custom_sql_filter REQUIRED) rtirmw_add_library( NAME ${PROJECT_NAME}_pro API PRO @@ -203,10 +202,11 @@ else() src/ndds/rmw_type_support_ndds.cpp src/ndds/rmw_typecode.cpp src/ndds/dds_api_ndds.cpp + src/ndds/custom_sql_filter.cpp include/rmw_connextdds/typecode.hpp include/rmw_connextdds/dds_api_ndds.hpp + include/rmw_connextdds/custom_sql_filter.hpp DEPS ${RMW_CONNEXT_DEPS} - rti_connext_dds_custom_sql_filter LIBRARIES RTIConnextDDS::c_api DEFINES ${extra_defines}) endif() @@ -291,12 +291,7 @@ endif() ################################################################################ # Configure Ament package ################################################################################ -set(RMW_AMENT_EXPORT_DEPS ${RMW_CONNEXT_DEPS}) -if(TARGET ${PROJECT_NAME}_pro) - list(APPEND RMW_AMENT_EXPORT_DEPS rti_connext_dds_custom_sql_filter) -endif() -ament_export_dependencies( - ${RMW_AMENT_EXPORT_DEPS}) +ament_export_dependencies(${RMW_CONNEXT_DEPS}) if(RMW_CONNEXT_BUILT) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) diff --git a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp similarity index 79% rename from rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp rename to rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp index e5d5767d..e676de36 100644 --- a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp @@ -11,11 +11,12 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -#ifndef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ -#define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ +#ifndef RMW_CONNEXTDDS__CUSTOM_SQL_FILTER_HPP_ +#define RMW_CONNEXTDDS__CUSTOM_SQL_FILTER_HPP_ -#include "rti_connext_dds_custom_sql_filter/visibility_control.h" -#include "ndds/ndds_c.h" +#include "rmw_connextdds/dds_api.hpp" + +#if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO namespace rti_connext_dds_custom_sql_filter { @@ -31,15 +32,17 @@ struct CustomSqlFilterData const DDS_DomainParticipantQos & dp_qos); }; -RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC +RMW_CONNEXTDDS_PUBLIC DDS_ReturnCode_t register_content_filter( DDS_DomainParticipant * const participant, CustomSqlFilterData * const filter_data); -RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC +RMW_CONNEXTDDS_PUBLIC extern const char * const PLUGIN_NAME; } // namespace rti_connext_dds_custom_sql_filter +#endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO + #endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ diff --git a/rmw_connextdds_common/package.xml b/rmw_connextdds_common/package.xml index 0e5c3933..a42b52d0 100644 --- a/rmw_connextdds_common/package.xml +++ b/rmw_connextdds_common/package.xml @@ -11,7 +11,6 @@ ament_cmake rti_connext_dds_cmake_module - rti_connext_dds_custom_sql_filter fastcdr rcutils rcpputils diff --git a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp similarity index 99% rename from rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp rename to rmw_connextdds_common/src/ndds/custom_sql_filter.cpp index 583fba59..43f289ed 100644 --- a/rti_connext_dds_custom_sql_filter/src/custom_sql_filter.cpp +++ b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp @@ -17,7 +17,9 @@ #include "rcpputils/scope_exit.hpp" -#include "rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp" +#include "rmw_connextdds/custom_sql_filter.hpp" + +#if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO extern "C" { // This is an internal function from RTI Connext DDS which allows a filter to @@ -724,3 +726,5 @@ rti_connext_dds_custom_sql_filter::register_content_filter( const char * const rti_connext_dds_custom_sql_filter::PLUGIN_NAME = "RTI_CONNEXTDDS_CUSTOM_SQL_FILTER"; + +#endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index a6c1d49d..cbe4b042 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -17,7 +17,7 @@ #include #include "rmw/impl/cpp/key_value.hpp" -#include "rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp" +#include "rmw_connextdds/custom_sql_filter.hpp" #include "rmw_connextdds/type_support.hpp" #include "rmw_connextdds/rmw_impl.hpp" diff --git a/rti_connext_dds_custom_sql_filter/CMakeLists.txt b/rti_connext_dds_custom_sql_filter/CMakeLists.txt deleted file mode 100644 index 836b408d..00000000 --- a/rti_connext_dds_custom_sql_filter/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(rti_connext_dds_custom_sql_filter) - -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wall -Wextra -Wpedantic) -endif() - -# find dependencies -find_package(ament_cmake REQUIRED) -find_package(ament_cmake_ros REQUIRED) -find_package(rti_connext_dds_cmake_module REQUIRED) -find_package(rcpputils REQUIRED) - -rti_find_connextpro() -if(NOT RTIConnextDDS_FOUND) - # Skip package if Connext DDS Professional was not found - message(STATUS - "RTI Connext DDS Professional not found. " - "Skipping library ${PROJECT_NAME}") -else() - - add_library(${PROJECT_NAME} - src/custom_sql_filter.cpp - include/rti_connext_dds_custom_sql_filter/custom_sql_filter.hpp - include/rti_connext_dds_custom_sql_filter/visibility_control.h - ) - target_compile_features(${PROJECT_NAME} PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 - target_include_directories(${PROJECT_NAME} PUBLIC - $ - $) - target_link_libraries(${PROJECT_NAME} RTIConnextDDS::c_api) - ament_target_dependencies(${PROJECT_NAME} - rcpputils) - - # Causes the visibility macros to use dllexport rather than dllimport, - # which is appropriate when building the dll but not consuming it. - target_compile_definitions(${PROJECT_NAME} PRIVATE "RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_BUILDING_LIBRARY") - - install( - DIRECTORY include/ - DESTINATION include - ) - install( - TARGETS ${PROJECT_NAME} - EXPORT export_${PROJECT_NAME} - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin - ) - ament_export_include_directories( - include - ) - ament_export_libraries( - ${PROJECT_NAME} - ) - ament_export_targets( - export_${PROJECT_NAME} - ) -endif() - -if(BUILD_TESTING) - find_package(ament_lint_auto REQUIRED) - ament_lint_auto_find_test_dependencies() -endif() - -ament_package() diff --git a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h b/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h deleted file mode 100644 index 9b591fb0..00000000 --- a/rti_connext_dds_custom_sql_filter/include/rti_connext_dds_custom_sql_filter/visibility_control.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021 Real-Time Innovations, Inc. (RTI) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ -#define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ - -// This logic was borrowed (then namespaced) from the examples on the gcc wiki: -// https://gcc.gnu.org/wiki/Visibility - -#if defined _WIN32 || defined __CYGWIN__ - #ifdef __GNUC__ - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __attribute__ ((dllexport)) - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT __attribute__ ((dllimport)) - #else - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __declspec(dllexport) - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT __declspec(dllimport) - #endif - #ifdef RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_BUILDING_LIBRARY - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT - #else - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT - #endif - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC_TYPE RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL -#else - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_EXPORT __attribute__ ((visibility("default"))) - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_IMPORT - #if __GNUC__ >= 4 - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC __attribute__ ((visibility("default"))) - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL __attribute__ ((visibility("hidden"))) - #else - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_LOCAL - #endif - #define RTI_CONNEXTDDS_CUSTOM_SQL_FILTER_PUBLIC_TYPE -#endif - -#endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__VISIBILITY_CONTROL_H_ diff --git a/rti_connext_dds_custom_sql_filter/package.xml b/rti_connext_dds_custom_sql_filter/package.xml deleted file mode 100644 index 08166ab9..00000000 --- a/rti_connext_dds_custom_sql_filter/package.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - rti_connext_dds_custom_sql_filter - 0.0.0 - A custom content-filter for RTI Connext DDS which allows empty expressions. - Andrea Sorbini - Apache License 2.0 - - ament_cmake_ros - - rti_connext_dds_cmake_module - rcpputils - - ament_lint_auto - ament_lint_common - - - ament_cmake - - From 60a347c8fdd2afeb0bed11207b534d69e0dfb321 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Sat, 19 Mar 2022 13:33:45 -0700 Subject: [PATCH 22/29] Try to resolve linking error on Windows. Signed-off-by: Andrea Sorbini --- .../include/rmw_connextdds/custom_sql_filter.hpp | 16 ++++++++++++++++ .../src/ndds/custom_sql_filter.cpp | 15 --------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp index e676de36..87fd5517 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp @@ -43,6 +43,22 @@ extern const char * const PLUGIN_NAME; } // namespace rti_connext_dds_custom_sql_filter +extern "C" { +// This is an internal function from RTI Connext DDS which allows a filter to +// be registered as "built-in". We need this because we want this custom filter +// to be a replacement for the built-in SQL-like filter. +RMW_CONNEXTDDS_PUBLIC +DDS_ReturnCode_t +DDS_ContentFilter_register_filter( + DDS_DomainParticipant * participant, + const char * name, + const struct DDS_ContentFilter * filter, + const DDS_ContentFilterEvaluateFunction evaluateOnSerialized, + const DDS_ContentFilterWriterEvaluateFunction writerEvaluateOnSerialized, + const DDS_ContentFilterQueryFunction query, + DDS_Boolean isBuiltin); +} + #endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO #endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ diff --git a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp index 43f289ed..d1e4160f 100644 --- a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp +++ b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp @@ -21,21 +21,6 @@ #if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO -extern "C" { -// This is an internal function from RTI Connext DDS which allows a filter to -// be registered as "built-in". We need this because we want this custom filter -// to be a replacement for the built-in SQL-like filter. -DDS_ReturnCode_t -DDS_ContentFilter_register_filter( - DDS_DomainParticipant * participant, - const char * name, - const struct DDS_ContentFilter * filter, - const DDS_ContentFilterEvaluateFunction evaluateOnSerialized, - const DDS_ContentFilterWriterEvaluateFunction writerEvaluateOnSerialized, - const DDS_ContentFilterQueryFunction query, - DDS_Boolean isBuiltin); -} - struct RTI_CustomSqlFilterProgram { void * base{nullptr}; From d7d211c0a9162db7b33f46a7afd61c450470b210 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Sat, 19 Mar 2022 19:09:38 -0700 Subject: [PATCH 23/29] Optionally disable writer-side CFT optimizations to support Windows. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/CMakeLists.txt | 3 + .../include/rmw_connextdds/dds_api_ndds.hpp | 12 - .../include/rmw_connextdds/static_config.hpp | 8 + .../include/rmw_connextdds/type_support.hpp | 30 ++- rmw_connextdds_common/src/common/rmw_impl.cpp | 14 +- .../src/common/rmw_type_support.cpp | 33 +++ .../src/ndds/custom_sql_filter.cpp | 252 ++++++++++++------ .../src/ndds/dds_api_ndds.cpp | 10 +- .../src/ndds/rmw_type_support_ndds.cpp | 105 ++++---- .../src/rtime/rmw_type_support_rtime.cpp | 68 +++-- 10 files changed, 344 insertions(+), 191 deletions(-) diff --git a/rmw_connextdds_common/CMakeLists.txt b/rmw_connextdds_common/CMakeLists.txt index a2f76ca7..aea621d6 100644 --- a/rmw_connextdds_common/CMakeLists.txt +++ b/rmw_connextdds_common/CMakeLists.txt @@ -194,6 +194,9 @@ else() if("${CONNEXTDDS_VERSION}" VERSION_LESS "6.0.0") list(APPEND extra_defines "RMW_CONNEXT_DDS_API_PRO_LEGACY=1") endif() + if(CONNEXTDDS_ARCH MATCHES ".*Win.*") + list(APPEND extra_defines "RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE=1") + endif() rtirmw_add_library( NAME ${PROJECT_NAME}_pro API PRO diff --git a/rmw_connextdds_common/include/rmw_connextdds/dds_api_ndds.hpp b/rmw_connextdds_common/include/rmw_connextdds/dds_api_ndds.hpp index a40b5b30..1b0305c1 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/dds_api_ndds.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/dds_api_ndds.hpp @@ -19,18 +19,6 @@ #include "rcutils/types.h" -DDS_SEQUENCE(RMW_Connext_Uint8ArrayPtrSeq, rcutils_uint8_array_t *); - -typedef RMW_Connext_Uint8ArrayPtrSeq RMW_Connext_UntypedSampleSeq; - -#define RMW_Connext_UntypedSampleSeq_INITIALIZER DDS_SEQUENCE_INITIALIZER - -#define DDS_UntypedSampleSeq_get_reference(seq_, i_) \ - *RMW_Connext_Uint8ArrayPtrSeq_get_reference(seq_, i_) - -#define DDS_UntypedSampleSeq_get_length(seq_) \ - RMW_Connext_Uint8ArrayPtrSeq_get_length(seq_) - #if RMW_CONNEXT_DDS_API_PRO_LEGACY #ifndef RTIXCdrLong_MAX #define RTIXCdrLong_MAX 2147483647 diff --git a/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp b/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp index e69d84f2..120e5790 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/static_config.hpp @@ -318,6 +318,14 @@ #define RMW_CONNEXT_LEGACY_RMW_COMPATIBILITY_MODE 1 #endif /* RMW_CONNEXT_LEGACY_RMW_COMPATIBILITY_MODE */ +/****************************************************************************** + * On windows, the custom SQL filter cannot be registered as "built-in", so we + * must enable some additional code to register it as a user plugin. + ******************************************************************************/ +#ifndef RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE +#define RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE 0 +#endif /* RMW_CONNEXT_LEGACY_RMW_COMPATIBILITY_MODE */ + #include "resource_limits.hpp" #endif // RMW_CONNEXTDDS__STATIC_CONFIG_HPP_ diff --git a/rmw_connextdds_common/include/rmw_connextdds/type_support.hpp b/rmw_connextdds_common/include/rmw_connextdds/type_support.hpp index 41d3bd8e..284148de 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/type_support.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/type_support.hpp @@ -167,11 +167,21 @@ class RMW_Connext_MessageTypeSupport struct RMW_Connext_Message { - const void * user_data; - bool serialized; - RMW_Connext_MessageTypeSupport * type_support; + const void * user_data{nullptr}; + bool serialized{false}; + RMW_Connext_MessageTypeSupport * type_support{nullptr}; + rcutils_uint8_array_t data_buffer; }; +rmw_ret_t +RMW_Connext_Message_initialize( + RMW_Connext_Message * const self, + RMW_Connext_MessageTypeSupport * const type_support, + const size_t data_buffer_size); + +void +RMW_Connext_Message_finalize(RMW_Connext_Message * const self); + class RMW_Connext_ServiceTypeSupportWrapper { public: @@ -276,5 +286,19 @@ class RMW_Connext_ServiceTypeSupportWrapper const rosidl_service_type_support_t * const type_supports); }; +#if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO +DDS_SEQUENCE(RMW_Connext_MessagePtrSeq, RMW_Connext_Message *); + +typedef RMW_Connext_MessagePtrSeq RMW_Connext_UntypedSampleSeq; + +#define RMW_Connext_UntypedSampleSeq_INITIALIZER DDS_SEQUENCE_INITIALIZER + +#define DDS_UntypedSampleSeq_get_reference(seq_, i_) \ + *RMW_Connext_MessagePtrSeq_get_reference(seq_, i_) + +#define DDS_UntypedSampleSeq_get_length(seq_) \ + RMW_Connext_MessagePtrSeq_get_length(seq_) + +#endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO #endif // RMW_CONNEXTDDS__TYPE_SUPPORT_HPP_ diff --git a/rmw_connextdds_common/src/common/rmw_impl.cpp b/rmw_connextdds_common/src/common/rmw_impl.cpp index 1d0b090f..c7f3af0e 100644 --- a/rmw_connextdds_common/src/common/rmw_impl.cpp +++ b/rmw_connextdds_common/src/common/rmw_impl.cpp @@ -904,9 +904,11 @@ RMW_Connext_Publisher::write( int64_t * const sn_out) { RMW_Connext_Message user_msg; + if (RMW_RET_OK != RMW_Connext_Message_initialize(&user_msg, this->type_support, 0)) { + return RMW_RET_ERROR; + } user_msg.user_data = ros_message; user_msg.serialized = serialized; - user_msg.type_support = this->type_support; return rmw_connextdds_write_message(this, &user_msg, sn_out); } @@ -1688,8 +1690,8 @@ RMW_Connext_Subscriber::take_next( RMW_RET_OK == rc_exit; this->loan_next++) { - rcutils_uint8_array_t * data_buffer = - reinterpret_cast( + RMW_Connext_Message * msg = + reinterpret_cast( DDS_UntypedSampleSeq_get_reference( &this->loan_data, static_cast(this->loan_next))); DDS_SampleInfo * info = @@ -1710,7 +1712,7 @@ RMW_Connext_Subscriber::take_next( if (RMW_RET_OK != this->type_support->deserialize( - ros_message, data_buffer, deserialized_size, true /* header_only */)) + ros_message, &msg->data_buffer, deserialized_size, true /* header_only */)) { RMW_CONNEXT_LOG_ERROR_SET("failed to deserialize taken sample") rc_exit = RMW_RET_ERROR; @@ -1749,7 +1751,7 @@ RMW_Connext_Subscriber::take_next( if (RCUTILS_RET_OK != rcutils_uint8_array_copy( reinterpret_cast(ros_message), - data_buffer)) + &msg->data_buffer)) { RMW_CONNEXT_LOG_ERROR_SET("failed to copy uint8 array") rc_exit = RMW_RET_ERROR; @@ -1760,7 +1762,7 @@ RMW_Connext_Subscriber::take_next( if (RMW_RET_OK != this->type_support->deserialize( - ros_message, data_buffer, deserialized_size)) + ros_message, &msg->data_buffer, deserialized_size)) { RMW_CONNEXT_LOG_ERROR_SET( "failed to deserialize taken sample") diff --git a/rmw_connextdds_common/src/common/rmw_type_support.cpp b/rmw_connextdds_common/src/common/rmw_type_support.cpp index 9209dc68..8055398b 100644 --- a/rmw_connextdds_common/src/common/rmw_type_support.cpp +++ b/rmw_connextdds_common/src/common/rmw_type_support.cpp @@ -813,3 +813,36 @@ RMW_Connext_ServiceTypeSupportWrapper::get_response_type_name( return rmw_connextdds_create_type_name_response(svc_callbacks); } + + +rmw_ret_t +RMW_Connext_Message_initialize( + RMW_Connext_Message * const self, + RMW_Connext_MessageTypeSupport * const type_support, + const size_t data_buffer_size) +{ + const rcutils_allocator_t allocator = rcutils_get_default_allocator(); + + self->user_data = nullptr; + self->serialized = false; + self->type_support = type_support; + + if (RCUTILS_RET_OK != + rcutils_uint8_array_init(&self->data_buffer, data_buffer_size, &allocator)) + { + RMW_CONNEXT_LOG_ERROR_A_SET( + "failed to initialize message buffer: size=%lu", + data_buffer_size) + return RMW_RET_ERROR; + } + + return RMW_RET_OK; +} + +void +RMW_Connext_Message_finalize(RMW_Connext_Message * const self) +{ + if (RCUTILS_RET_OK != rcutils_uint8_array_fini(&self->data_buffer)) { + RMW_CONNEXT_LOG_ERROR_SET("failed to finalize uint8 array") + } +} diff --git a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp index d1e4160f..60be4cb8 100644 --- a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp +++ b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp @@ -14,10 +14,12 @@ #include #include #include +#include #include "rcpputils/scope_exit.hpp" #include "rmw_connextdds/custom_sql_filter.hpp" +#include "rmw_connextdds/type_support.hpp" #if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO @@ -43,6 +45,7 @@ struct RTI_CustomSqlFilterWriterData DDS_CookieSeq matched_readers DDS_SEQUENCE_INITIALIZER; REDASkiplistDescription readers_desc; REDASkiplist readers; + std::vector serialize_buffer; }; struct RTI_CustomSqlFilterReaderData @@ -111,25 +114,6 @@ RTI_CustomSqlFilterData::set_memory_management_property( return DDS_RETCODE_OK; } -static -int -RTI_CustomSqlFilter_compare_reader_data( - const void * left, - const void * right) -{ - RTI_CustomSqlFilterReaderData * const l = - const_cast( - static_cast(left)); - RTI_CustomSqlFilterReaderData * const r = - const_cast( - static_cast(right)); - - return RTIOsapiMemory_compare( - DDS_OctetSeq_get_contiguous_buffer(&l->cookie.value), - DDS_OctetSeq_get_contiguous_buffer(&r->cookie.value), - sizeof(struct REDAWeakReference)); -} - static DDS_ReturnCode_t RTI_CustomSqlFilter_compile( @@ -201,6 +185,26 @@ RTI_CustomSqlFilter_compile( return DDS_RETCODE_OK; } +#if !RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE +static +int +RTI_CustomSqlFilter_compare_reader_data( + const void * left, + const void * right) +{ + RTI_CustomSqlFilterReaderData * const l = + const_cast( + static_cast(left)); + RTI_CustomSqlFilterReaderData * const r = + const_cast( + static_cast(right)); + + return RTIOsapiMemory_compare( + DDS_OctetSeq_get_contiguous_buffer(&l->cookie.value), + DDS_OctetSeq_get_contiguous_buffer(&r->cookie.value), + sizeof(struct REDAWeakReference)); +} + static DDS_ReturnCode_t RTI_CustomSqlFilter_writer_attach( @@ -481,6 +485,14 @@ RTI_CustomSqlFilter_writer_evaluated_result( return &writer_data->matched_readers; } +static +struct DDS_CookieSeq * +RTI_CustomSqlFilter_writer_evaluate_on_serialized( + void * filter_data, + void * writer_filter_data, + const void * sample, + const struct DDS_FilterSampleInfo * meta_data); + DDS_CookieSeq * RTI_CustomSqlFilter_writer_evaluate( void * filter_data, @@ -488,23 +500,65 @@ RTI_CustomSqlFilter_writer_evaluate( const void * sample, const DDS_FilterSampleInfo * meta_data) { - RTI_CustomSqlFilterData * const cft_data = - static_cast(filter_data); + // RTI_CustomSqlFilterData * const cft_data = + // static_cast(filter_data); RTI_CustomSqlFilterWriterData * const writer_data = static_cast(writer_filter_data); - DDS_CookieSeq * sql_matched = nullptr; - if (writer_data->filtered_readers_count > 0) { - sql_matched = DDS_SqlFilter_writerEvaluate( - &cft_data->base, writer_data->base, sample, meta_data); - if (nullptr == sql_matched) { - // TODO(asorbini) log error - return nullptr; + // `sample` is a ROS 2 message so we can't pass it to the SQL filter's + // evaluate() function because the filter expects a Connext memory layout. + // For this reason, we must first serialize the sample to a buffer, then + // we can then call evaluate_on_serialized(). + size_t serialized_size = 0; + const RMW_Connext_Message * const msg = + reinterpret_cast(sample); + const uint8_t * serialized_sample = nullptr; + + if (msg->serialized) { + const rcutils_uint8_array_t * const serialized_msg = + reinterpret_cast(msg->user_data); + serialized_size += static_cast(serialized_msg->buffer_length); + serialized_sample = serialized_msg->buffer; + } else { + RMW_CONNEXT_ASSERT(nullptr != msg->type_support) + serialized_size += + msg->type_support->serialized_size_max( + msg->user_data, true /* include_encapsulation */); + writer_data->serialize_buffer.resize(serialized_size); + + rcutils_uint8_array_t data_buffer; + data_buffer.allocator = rcutils_get_default_allocator(); + data_buffer.buffer = &writer_data->serialize_buffer[0]; + data_buffer.buffer_length = serialized_size; + data_buffer.buffer_capacity = serialized_size; + rmw_ret_t rc = msg->type_support->serialize(msg->user_data, &data_buffer); + if (RMW_RET_OK != rc) { + return nullptr; + } + serialized_sample = &writer_data->serialize_buffer[0]; } - } - return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, sql_matched); + RTICdrStream cdr_stream; + RTICdrStream_init(&cdr_stream); + RTICdrStream_set( + &cdr_stream, + // "Cast the const away", but the buffer will not be written to. + reinterpret_cast( + const_cast(serialized_sample)), + serialized_size); + RTICdrStream_setCurrentPositionOffset( + &cdr_stream, + RMW_Connext_MessageTypeSupport::ENCAPSULATION_HEADER_SIZE); + + return RTI_CustomSqlFilter_writer_evaluate_on_serialized( + filter_data, + writer_filter_data, + &cdr_stream, + meta_data); + } else { + return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, nullptr); + } } void @@ -551,46 +605,38 @@ RTI_CustomSqlFilter_writer_return_loan( { RTI_CustomSqlFilterData * const cft_data = static_cast(filter_data); - (void)cft_data; + UNUSED_ARG(cft_data); RTI_CustomSqlFilterWriterData * const writer_data = static_cast(writer_filter_data); - (void)writer_data; + UNUSED_ARG(writer_data); DDS_CookieSeq_set_length(cookies, 0); } -DDS_Boolean -RTI_CustomSqlFilter_evaluate( + +static +struct DDS_CookieSeq * +RTI_CustomSqlFilter_writer_evaluate_on_serialized( void * filter_data, - void * handle, + void * writer_filter_data, const void * sample, const struct DDS_FilterSampleInfo * meta_data) { - RTI_CustomSqlFilterData * const cft_data = static_cast(filter_data); - RTI_CustomSqlFilterProgram * const program = - static_cast(handle); - - if (nullptr == program->base) { - return DDS_BOOLEAN_TRUE; - } - - return DDS_SqlFilter_evaluate(&cft_data->base, program->base, sample, meta_data); -} + RTI_CustomSqlFilterWriterData * const writer_data = + static_cast(writer_filter_data); -void -RTI_CustomSqlFilter_finalize(void * filter_data, void * handle) -{ - RTI_CustomSqlFilterData * const cft_data = - static_cast(filter_data); - RTI_CustomSqlFilterProgram * const program = - static_cast(handle); + DDS_CookieSeq * sql_matched = nullptr; - if (nullptr != program->base) { - DDS_SqlFilter_finalize(&cft_data->base, program->base); + if (writer_data->filtered_readers_count > 0) { + sql_matched = DDS_SqlFilter_writerEvaluateOnSerialized( + &cft_data->base, writer_data->base, sample, meta_data); + if (nullptr == sql_matched) { + // TODO(asorbini) log error + return nullptr; + } } - - delete program; + return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, sql_matched); } DDS_Boolean @@ -612,49 +658,87 @@ RTI_CustomSqlFilter_evaluate_on_serialized( return accepted; } -struct DDS_CookieSeq * -RTI_CustomSqlFilter_writer_evaluate_on_serialized( +DDS_Long +RTI_CustomSqlFilter_query(void * filter_data, void * handle) +{ + RTI_CustomSqlFilterData * const cft_data = + static_cast(filter_data); + (void)cft_data; + + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); + + if (nullptr == program->base) { + return 0; + } + + return DDS_SqlFilter_query(filter_data, program->base); +} + +#endif // !RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE + +// This function is only called when RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE +// is enabled. In that flag is set, the filter will be registered as a user +// filter instead of built-in one, so it won't be able to do filtering on +// serialized samples. When this function is used, we don't perform +// writer-side optimizations and we rely only on reader-side filtering to +// avoid having to serialize the sample unnecessarily. +DDS_Boolean +RTI_CustomSqlFilter_evaluate( void * filter_data, - void * writer_filter_data, + void * handle, const void * sample, const struct DDS_FilterSampleInfo * meta_data) { RTI_CustomSqlFilterData * const cft_data = static_cast(filter_data); - RTI_CustomSqlFilterWriterData * const writer_data = - static_cast(writer_filter_data); + RTI_CustomSqlFilterProgram * const program = + static_cast(handle); - DDS_CookieSeq * sql_matched = nullptr; + if (nullptr == program->base) { + return DDS_BOOLEAN_TRUE; + } - if (writer_data->filtered_readers_count > 0) { - sql_matched = DDS_SqlFilter_writerEvaluateOnSerialized( - &cft_data->base, writer_data->base, sample, meta_data); - if (nullptr == sql_matched) { - // TODO(asorbini) log error - return nullptr; - } + const RMW_Connext_Message * const msg = + static_cast(sample); + + if (nullptr != msg->user_data) { + // On the writer side we don't actually perform any filtering, because that + // could require to perform a (possibly useless) additional serialization + // into a buffer, so we always return true. + return DDS_BOOLEAN_TRUE; } - return RTI_CustomSqlFilter_writer_evaluated_result(writer_data, sql_matched); + RTICdrStream cdr_stream; + RTICdrStream_init(&cdr_stream); + RTICdrStream_set( + &cdr_stream, + reinterpret_cast(msg->data_buffer.buffer), + msg->data_buffer.buffer_length); + RTICdrStream_setCurrentPositionOffset( + &cdr_stream, + RMW_Connext_MessageTypeSupport::ENCAPSULATION_HEADER_SIZE); + + return DDS_SqlFilter_evaluateOnSerialized( + &cft_data->base, program->base, &cdr_stream, meta_data); } -DDS_Long -RTI_CustomSqlFilter_query(void * filter_data, void * handle) +void +RTI_CustomSqlFilter_finalize(void * filter_data, void * handle) { RTI_CustomSqlFilterData * const cft_data = static_cast(filter_data); - (void)cft_data; - RTI_CustomSqlFilterProgram * const program = static_cast(handle); - if (nullptr == program->base) { - return 0; + if (nullptr != program->base) { + DDS_SqlFilter_finalize(&cft_data->base, program->base); } - return DDS_SqlFilter_query(filter_data, program->base); + delete program; } + DDS_ReturnCode_t rti_connext_dds_custom_sql_filter::register_content_filter( DDS_DomainParticipant * const participant, @@ -683,15 +767,22 @@ rti_connext_dds_custom_sql_filter::register_content_filter( DDS_ContentFilter filter = DDS_ContentFilter_INITIALIZER; filter.compile = RTI_CustomSqlFilter_compile; + filter.evaluate = RTI_CustomSqlFilter_evaluate; + filter.finalize = RTI_CustomSqlFilter_finalize; + filter.filter_data = filter_data; + +#if RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE + rc = DDS_DomainParticipant_register_contentfilter( + participant, + PLUGIN_NAME, + &filter); +#else filter.writer_attach = RTI_CustomSqlFilter_writer_attach; filter.writer_compile = RTI_CustomSqlFilter_writer_compile; filter.writer_detach = RTI_CustomSqlFilter_writer_detach; filter.writer_evaluate = RTI_CustomSqlFilter_writer_evaluate; filter.writer_finalize = RTI_CustomSqlFilter_writer_finalize; filter.writer_return_loan = RTI_CustomSqlFilter_writer_return_loan; - filter.evaluate = RTI_CustomSqlFilter_evaluate; - filter.finalize = RTI_CustomSqlFilter_finalize; - filter.filter_data = filter_data; rc = DDS_ContentFilter_register_filter( participant, @@ -701,6 +792,7 @@ rti_connext_dds_custom_sql_filter::register_content_filter( RTI_CustomSqlFilter_writer_evaluate_on_serialized, RTI_CustomSqlFilter_query, DDS_BOOLEAN_TRUE); +#endif // RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE if (DDS_RETCODE_OK != rc) { // TODO(asorbini) log error return DDS_RETCODE_ERROR; diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index cbe4b042..f20f09f5 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -783,9 +783,9 @@ rmw_connextdds_take_samples( RMW_CONNEXT_LOG_ERROR_SET("failed to take data from DDS reader") return RMW_RET_ERROR; } - RMW_CONNEXT_ASSERT(data_len > 0)(void) RMW_Connext_Uint8ArrayPtrSeq_loan_contiguous( + RMW_CONNEXT_ASSERT(data_len > 0)(void) RMW_Connext_MessagePtrSeq_loan_contiguous( sub->data_seq(), - reinterpret_cast(data_buffer), + reinterpret_cast(data_buffer), data_len, data_len); @@ -797,11 +797,11 @@ rmw_connextdds_return_samples( RMW_Connext_Subscriber * const sub) { void ** data_buffer = reinterpret_cast( - RMW_Connext_Uint8ArrayPtrSeq_get_contiguous_buffer(sub->data_seq())); + RMW_Connext_MessagePtrSeq_get_contiguous_buffer(sub->data_seq())); const DDS_Long data_len = - RMW_Connext_Uint8ArrayPtrSeq_get_length(sub->data_seq()); + RMW_Connext_MessagePtrSeq_get_length(sub->data_seq()); - if (!RMW_Connext_Uint8ArrayPtrSeq_unloan(sub->data_seq())) { + if (!RMW_Connext_MessagePtrSeq_unloan(sub->data_seq())) { RMW_CONNEXT_LOG_ERROR_SET("failed to unloan sample sequence") return RMW_RET_ERROR; } diff --git a/rmw_connextdds_common/src/ndds/rmw_type_support_ndds.cpp b/rmw_connextdds_common/src/ndds/rmw_type_support_ndds.cpp index dc4e33f6..ffbb6862 100644 --- a/rmw_connextdds_common/src/ndds/rmw_type_support_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/rmw_type_support_ndds.cpp @@ -88,15 +88,15 @@ struct RMW_Connext_NddsTypePluginI REDAFastBufferPool_delete(this->pool_samples); } - rcutils_uint8_array_t * + RMW_Connext_Message * allocate_sample() { - return reinterpret_cast( + return reinterpret_cast( REDAFastBufferPool_getBuffer(this->pool_samples)); } void - return_sample(rcutils_uint8_array_t * const sample) + return_sample(RMW_Connext_Message * const sample) { REDAFastBufferPool_returnBuffer(this->pool_samples, sample); } @@ -126,8 +126,8 @@ struct RMW_Connext_NddsParticipantData static RTIBool -RMW_Connext_Uint8ArrayPtr_initialize_w_params( - rcutils_uint8_array_t ** self, +RMW_Connext_MessagePtr_initialize_w_params( + RMW_Connext_Message ** self, const struct DDS_TypeAllocationParams_t * allocParams) { UNUSED_ARG(allocParams); @@ -136,8 +136,8 @@ RMW_Connext_Uint8ArrayPtr_initialize_w_params( } static RTIBool -RMW_Connext_Uint8ArrayPtr_finalize_w_params( - rcutils_uint8_array_t ** self, +RMW_Connext_MessagePtr_finalize_w_params( + RMW_Connext_Message ** self, const struct DDS_TypeDeallocationParams_t * deallocParams) { UNUSED_ARG(deallocParams); @@ -146,19 +146,19 @@ RMW_Connext_Uint8ArrayPtr_finalize_w_params( } static RTIBool -RMW_Connext_Uint8ArrayPtr_copy( - rcutils_uint8_array_t ** dst, - const rcutils_uint8_array_t ** src) +RMW_Connext_MessagePtr_copy( + RMW_Connext_Message ** dst, + const RMW_Connext_Message ** src) { - *dst = const_cast(*src); + *dst = const_cast(*src); return RTI_TRUE; } -#define T rcutils_uint8_array_t * -#define TSeq RMW_Connext_Uint8ArrayPtrSeq -#define T_initialize_w_params RMW_Connext_Uint8ArrayPtr_initialize_w_params -#define T_finalize_w_params RMW_Connext_Uint8ArrayPtr_finalize_w_params -#define T_copy RMW_Connext_Uint8ArrayPtr_copy +#define T RMW_Connext_Message * +#define TSeq RMW_Connext_MessagePtrSeq +#define T_initialize_w_params RMW_Connext_MessagePtr_initialize_w_params +#define T_finalize_w_params RMW_Connext_MessagePtr_finalize_w_params +#define T_copy RMW_Connext_MessagePtr_copy #include "dds_c/generic/dds_c_sequence_TSeq.gen" static @@ -232,29 +232,22 @@ RMW_Connext_TypePlugin_create_data(void ** sample, void * user_data) RMW_Connext_MessageTypeSupport * const type_support = reinterpret_cast(user_data); - rcutils_uint8_array_t * data_buffer = - new (std::nothrow) rcutils_uint8_array_t(); - if (nullptr == data_buffer) { - return RTI_FALSE; - } - - const rcutils_allocator_t allocator = rcutils_get_default_allocator(); size_t buffer_size = 0; - if (type_support->unbounded()) { buffer_size = 0; } else { buffer_size = type_support->type_serialized_size_max(); } - if (RCUTILS_RET_OK != - rcutils_uint8_array_init(data_buffer, buffer_size, &allocator)) - { - delete data_buffer; + RMW_Connext_Message * msg = new (std::nothrow) RMW_Connext_Message(); + if (nullptr == msg) { return RTI_FALSE; } - - *sample = data_buffer; + if (RMW_RET_OK != RMW_Connext_Message_initialize(msg, type_support, buffer_size)) { + delete msg; + return RTI_FALSE; + } + *sample = msg; return RTI_TRUE; } @@ -268,14 +261,9 @@ RMW_Connext_TypePlugin_destroy_data(void ** sample, void * user_data) UNUSED_ARG(type_support); - rcutils_uint8_array_t * data_buffer = - reinterpret_cast(*sample); - - if (RCUTILS_RET_OK != rcutils_uint8_array_fini(data_buffer)) { - RMW_CONNEXT_LOG_ERROR_SET("failed to finalize array") - } - - delete data_buffer; + RMW_Connext_Message * msg = reinterpret_cast(*sample); + RMW_Connext_Message_finalize(msg); + delete msg; } /* ---------------------------------------------------------------------------- @@ -418,11 +406,14 @@ RMW_Connext_TypePlugin_copy_sample( { UNUSED_ARG(endpoint_data); - const rcutils_uint8_array_t * src_buffer = - reinterpret_cast(src); - rcutils_uint8_array_t * dst_buffer = reinterpret_cast(dst); + const RMW_Connext_Message * src_msg = + reinterpret_cast(src); + RMW_Connext_Message * dst_msg = + reinterpret_cast(dst); - if (RCUTILS_RET_OK != rcutils_uint8_array_copy(dst_buffer, src_buffer)) { + if (RCUTILS_RET_OK != + rcutils_uint8_array_copy(&dst_msg->data_buffer, &src_msg->data_buffer)) + { return RTI_FALSE; } @@ -461,6 +452,14 @@ RMW_Connext_TypePlugin_serialize( const RMW_Connext_Message * const msg = reinterpret_cast(sample); + if (nullptr == msg->user_data) { + // Samples written by the application layer should always have a non-null + // user_data pointer. The only samples which do not use that pointers are + // the ones created internally in the DataReader queue, and it would be + // unexpected for them to be passed to this function. + return RTI_FALSE; + } + rcutils_uint8_array_t data_buffer; data_buffer.allocator = rcutils_get_default_allocator(); data_buffer.buffer = @@ -517,22 +516,22 @@ RMW_Connext_TypePlugin_deserialize( return RTI_FALSE; } - rcutils_uint8_array_t * const data_buffer = - reinterpret_cast(*sample); + RMW_Connext_Message * const msg = + reinterpret_cast(*sample); + const size_t deserialize_size = RTICdrStream_getRemainder(stream); void * const src_ptr = RTICdrStream_getCurrentPosition(stream); - if (data_buffer->buffer_capacity < deserialize_size) { + if (msg->data_buffer.buffer_capacity < deserialize_size) { if (RCUTILS_RET_OK != - rcutils_uint8_array_resize(data_buffer, deserialize_size)) + rcutils_uint8_array_resize(&msg->data_buffer, deserialize_size)) { return RTI_FALSE; } } - memcpy(data_buffer->buffer, src_ptr, deserialize_size); - - data_buffer->buffer_length = deserialize_size; + memcpy(msg->data_buffer.buffer, src_ptr, deserialize_size); + msg->data_buffer.buffer_length = deserialize_size; RTICdrStream_setCurrentPosition(stream, reinterpret_cast(src_ptr) + deserialize_size); @@ -606,6 +605,12 @@ RMW_Connext_TypePlugin_get_serialized_sample_size( const RMW_Connext_Message * const msg = reinterpret_cast(sample); + // Samples written by the application layer should always have a non-null + // user_data pointer. The only samples which do not use that pointers are + // the ones created internally in the DataReader queue, and it would be + // unexpected for them to be passed to this function. + RMW_CONNEXT_ASSERT(nullptr != msg->user_data) + if (msg->serialized) { const rcutils_uint8_array_t * const serialized_msg = reinterpret_cast(msg->user_data); @@ -796,7 +801,7 @@ rmw_connextdds_register_type_support( struct REDAFastBufferPool * const pool_samples = REDAFastBufferPool_new( - sizeof(rcutils_uint8_array_t), + sizeof(RMW_Connext_Message), RTIOsapiAlignment_getDefaultAlignment(), &pool_prop); diff --git a/rmw_connextdds_common/src/rtime/rmw_type_support_rtime.cpp b/rmw_connextdds_common/src/rtime/rmw_type_support_rtime.cpp index a0af9461..57086bb6 100644 --- a/rmw_connextdds_common/src/rtime/rmw_type_support_rtime.cpp +++ b/rmw_connextdds_common/src/rtime/rmw_type_support_rtime.cpp @@ -62,29 +62,23 @@ RMW_Connext_MemoryPlugin_create_sample( { auto type_support = RMW_Connext_RtimeTypePluginI::type_support(tp); - rcutils_uint8_array_t * data_buffer = - new (std::nothrow) rcutils_uint8_array_t(); - if (nullptr == data_buffer) { - return RTI_FALSE; - } - - const rcutils_allocator_t allocator = rcutils_get_default_allocator(); size_t buffer_size = 0; - if (type_support->unbounded()) { buffer_size = 0; } else { buffer_size = type_support->type_serialized_size_max(); } - if (RCUTILS_RET_OK != - rcutils_uint8_array_init(data_buffer, buffer_size, &allocator)) - { - delete data_buffer; + RMW_Connext_Message * const msg = new (std::nothrow) RMW_Connext_Message(); + if (nullptr == msg) { + return RTI_FALSE; + } + if (RMW_RET_OK != RMW_Connext_Message_initialize(msg, type_support, buffer_size)) { + delete msg; return RTI_FALSE; } - *sample = data_buffer; + *sample = msg; return RTI_TRUE; } @@ -97,15 +91,10 @@ RMW_Connext_MemoryPlugin_delete_sample( { UNUSED_ARG(plugin); - rcutils_uint8_array_t * data_buffer = - reinterpret_cast(sample); - - if (RCUTILS_RET_OK != rcutils_uint8_array_fini(data_buffer)) { - delete data_buffer; - return RTI_FALSE; - } - - delete data_buffer; + RMW_Connext_Message * const msg = + reinterpret_cast(sample); + RMW_Connext_Message_finalize(msg); + delete msg; return RTI_TRUE; } @@ -117,14 +106,16 @@ RMW_Connext_MemoryPlugin_copy_sample( void * dst, const void * src) { - const rcutils_uint8_array_t * src_buffer = - reinterpret_cast(src); - rcutils_uint8_array_t * dst_buffer = - reinterpret_cast(dst); + const RMW_Connext_Message * src_msg = + reinterpret_cast(src); + RMW_Connext_Message * dst_msg = + reinterpret_cast(dst); UNUSED_ARG(plugin); - if (RCUTILS_RET_OK != rcutils_uint8_array_copy(dst_buffer, src_buffer)) { + if (RCUTILS_RET_OK != + rcutils_uint8_array_copy(&dst_msg->data_buffer, &src_msg->data_buffer)) + { return RTI_FALSE; } @@ -145,6 +136,14 @@ RMW_Connext_EncapsulationPlugin_serialize( UNUSED_ARG(plugin); UNUSED_ARG(destination); + if (nullptr == msg->user_data) { + // Samples written by the application layer should always have a non-null + // user_data pointer. The only samples which do not use that pointers are + // the ones created internally in the DataReader queue, and it would be + // unexpected for them to be passed to this function. + return RTI_FALSE; + } + DDS_TypePluginBuffer * const tbuf = reinterpret_cast(stream->real_buff); @@ -182,8 +181,7 @@ RMW_Connext_EncapsulationPlugin_serialize( if (type_support->unbounded()) { if (msg_buffer_unbound->buffer_capacity < serialized_size) { if (RCUTILS_RET_OK != - rcutils_uint8_array_resize( - msg_buffer_unbound, serialized_size)) + rcutils_uint8_array_resize(msg_buffer_unbound, serialized_size)) { return RTI_FALSE; } @@ -243,15 +241,15 @@ RMW_Connext_EncapsulationPlugin_deserialize( UNUSED_ARG(source); UNUSED_ARG(plugin); - rcutils_uint8_array_t * const data_buffer = - reinterpret_cast(void_sample); + RMW_Connext_Message * const msg = + reinterpret_cast(void_sample); const size_t deserialize_size = stream->length - CDR_Stream_get_current_position_offset(stream) + RMW_Connext_MessageTypeSupport::ENCAPSULATION_HEADER_SIZE; - if (data_buffer->buffer_capacity < deserialize_size) { + if (msg->data_buffer.buffer_capacity < deserialize_size) { if (RCUTILS_RET_OK != - rcutils_uint8_array_resize(data_buffer, deserialize_size)) + rcutils_uint8_array_resize(&msg->data_buffer, deserialize_size)) { return RTI_FALSE; } @@ -262,11 +260,11 @@ RMW_Connext_EncapsulationPlugin_deserialize( RMW_Connext_MessageTypeSupport::ENCAPSULATION_HEADER_SIZE; memcpy( - data_buffer->buffer, + msg->data_buffer.buffer, src_ptr, deserialize_size); - data_buffer->buffer_length = deserialize_size; + msg->data_buffer.buffer_length = deserialize_size; return RTI_TRUE; } From ad985bc9cca38db6048c14ddab02a74c6da38ab6 Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Sat, 19 Mar 2022 19:16:58 -0700 Subject: [PATCH 24/29] No need to declare private CFT function on Windows. Signed-off-by: Andrea Sorbini --- .../include/rmw_connextdds/custom_sql_filter.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp index 87fd5517..4a8612f1 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp @@ -43,6 +43,7 @@ extern const char * const PLUGIN_NAME; } // namespace rti_connext_dds_custom_sql_filter +#if !RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE extern "C" { // This is an internal function from RTI Connext DDS which allows a filter to // be registered as "built-in". We need this because we want this custom filter @@ -58,6 +59,7 @@ DDS_ContentFilter_register_filter( const DDS_ContentFilterQueryFunction query, DDS_Boolean isBuiltin); } +#endif // RMW_CONNEXT_BUILTIN_CFT_COMPATIBILITY_MODE #endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO From d30bb6ec9fa6a9f455fa8047a0170a0dedf77526 Mon Sep 17 00:00:00 2001 From: Tomoya Fujita Date: Mon, 21 Mar 2022 10:05:15 -0700 Subject: [PATCH 25/29] remove stub implementation for ContentFilteredTopic. Signed-off-by: Tomoya Fujita --- rmw_connextdds/src/rmw_api_impl_ndds.cpp | 26 ------------------- .../src/rmw_api_impl_rtime.cpp | 26 ------------------- 2 files changed, 52 deletions(-) diff --git a/rmw_connextdds/src/rmw_api_impl_ndds.cpp b/rmw_connextdds/src/rmw_api_impl_ndds.cpp index 7fcb4e76..19251f1c 100644 --- a/rmw_connextdds/src/rmw_api_impl_ndds.cpp +++ b/rmw_connextdds/src/rmw_api_impl_ndds.cpp @@ -735,32 +735,6 @@ rmw_subscription_get_content_filter( subscription, allocator, options); } -rmw_ret_t -rmw_subscription_set_content_filter( - rmw_subscription_t * subscription, - const rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - -rmw_ret_t -rmw_subscription_get_content_filter( - const rmw_subscription_t * subscription, - rcutils_allocator_t * allocator, - rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(allocator); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - rmw_ret_t rmw_destroy_subscription( rmw_node_t * node, diff --git a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp index 14833537..7d1f6cc8 100644 --- a/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp +++ b/rmw_connextddsmicro/src/rmw_api_impl_rtime.cpp @@ -741,32 +741,6 @@ rmw_subscription_get_content_filter( } -rmw_ret_t -rmw_subscription_set_content_filter( - rmw_subscription_t * subscription, - const rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - -rmw_ret_t -rmw_subscription_get_content_filter( - const rmw_subscription_t * subscription, - rcutils_allocator_t * allocator, - rmw_subscription_content_filter_options_t * options) -{ - UNUSED_ARG(subscription); - UNUSED_ARG(allocator); - UNUSED_ARG(options); - RMW_CONNEXT_LOG_NOT_IMPLEMENTED - return RMW_RET_UNSUPPORTED; -} - - rmw_ret_t rmw_destroy_subscription( rmw_node_t * node, From 995e244a45817be17cff3a0bcce3491c205cb715 Mon Sep 17 00:00:00 2001 From: Tomoya Fujita Date: Mon, 21 Mar 2022 10:12:23 -0700 Subject: [PATCH 26/29] address cpplint error. Signed-off-by: Tomoya Fujita --- .../include/rmw_connextdds/custom_sql_filter.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp index 4a8612f1..7c134205 100644 --- a/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp +++ b/rmw_connextdds_common/include/rmw_connextdds/custom_sql_filter.hpp @@ -63,4 +63,4 @@ DDS_ContentFilter_register_filter( #endif // RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO -#endif // RTI_CONNEXTDDS_CUSTOM_SQL_FILTER__CUSTOM_SQL_FILTER_HPP_ +#endif // RMW_CONNEXTDDS__CUSTOM_SQL_FILTER_HPP_ From b12c6b258c9606f15d734b88883fbcf419a4a52c Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 21 Mar 2022 15:19:51 -0700 Subject: [PATCH 27/29] Avoid conversion warnings on Windows. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/src/ndds/dds_api_ndds.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index f20f09f5..a30f0150 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -340,16 +340,17 @@ rmw_connextdds_initialize_cft_parameters( struct DDS_StringSeq * const cft_parameters, const rcutils_string_array_t * const cft_expression_parameters) { - if (!DDS_StringSeq_ensure_length( - cft_parameters, cft_expression_parameters->size, cft_expression_parameters->size)) - { + // Cache value locally to avoid conversion warnings on Windows. + const DDS_Long params_len = static_cast(cft_expression_parameters->size); + + if (!DDS_StringSeq_ensure_length(cft_parameters, params_len, params_len)) { RMW_CONNEXT_LOG_ERROR_SET("failed to ensure length for cft parameters sequence") return RMW_RET_ERROR; } if (!DDS_StringSeq_from_array( cft_parameters, const_cast(cft_expression_parameters->data), - cft_expression_parameters->size)) + params_len)) { RMW_CONNEXT_LOG_ERROR_SET("failed to copy data for cft parameters sequence") return RMW_RET_ERROR; From b1b5851238199d340bece72b08f043580597eced Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 21 Mar 2022 15:35:10 -0700 Subject: [PATCH 28/29] Use strtol instead of sscanf to avoid warnings on Windows. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/src/ndds/custom_sql_filter.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp index 60be4cb8..3050d44c 100644 --- a/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp +++ b/rmw_connextdds_common/src/ndds/custom_sql_filter.cpp @@ -89,13 +89,7 @@ RTI_CustomSqlFilterData::set_memory_management_property( DDS_CONTENT_FILTER_SQL_DESERIALIZED_SAMPLE_MIN_BUFFER_SIZE_PROPERTY_NAME); if (nullptr != property) { - if (!sscanf( - property->value, "%d", - &this->base.memory_management.buffer_min_size)) - { - // TODO(asorbini) log error - return DDS_RETCODE_ERROR; - } + this->base.memory_management.buffer_min_size = strtol(property->value, nullptr, 0); } property = DDS_PropertyQosPolicyHelper_lookup_property( From 3edb5aeb5af7e658b35a914b30d42687a25ba1ed Mon Sep 17 00:00:00 2001 From: Andrea Sorbini Date: Mon, 21 Mar 2022 15:46:04 -0700 Subject: [PATCH 29/29] Avoid finalizing participants if factory is not available. Signed-off-by: Andrea Sorbini --- rmw_connextdds_common/src/ndds/dds_api_ndds.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp index a30f0150..8cc2c123 100644 --- a/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp +++ b/rmw_connextdds_common/src/ndds/dds_api_ndds.cpp @@ -112,6 +112,11 @@ rmw_connextdds_finalize_participant_factory_context( delete ctx_api; + if (nullptr == RMW_Connext_gv_DomainParticipantFactory) { + // Nothing else to do if we didn't even initialize the factory; + return RMW_RET_OK; + } + // There might be some DomainParticipants left-over from a ("failed context // initialization" + "failed participant finalization"), so let's try to // clean them up.