From d620f46db29737379be7ea1935377a5052885da3 Mon Sep 17 00:00:00 2001 From: William Woodall Date: Thu, 29 Nov 2018 21:33:27 -0800 Subject: [PATCH] refactor to support init options and context (#308) * refactor to support init options and context Signed-off-by: William Woodall * style Signed-off-by: William Woodall * add missing rmw_shutdown * fix incorrect check for null Signed-off-by: William Woodall Signed-off-by: Devin Bonnie --- rmw_connext_cpp/src/rmw_guard_condition.cpp | 10 ++- rmw_connext_cpp/src/rmw_init.cpp | 80 ++++++++++++++++- rmw_connext_cpp/src/rmw_node.cpp | 8 ++ rmw_connext_dynamic_cpp/src/functions.cpp | 97 ++++++++++++++++++++- 4 files changed, 188 insertions(+), 7 deletions(-) diff --git a/rmw_connext_cpp/src/rmw_guard_condition.cpp b/rmw_connext_cpp/src/rmw_guard_condition.cpp index c29784b6..14602b0a 100644 --- a/rmw_connext_cpp/src/rmw_guard_condition.cpp +++ b/rmw_connext_cpp/src/rmw_guard_condition.cpp @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "rmw/impl/cpp/macros.hpp" #include "rmw/rmw.h" #include "rmw_connext_shared_cpp/guard_condition.hpp" @@ -21,8 +22,15 @@ extern "C" { rmw_guard_condition_t * -rmw_create_guard_condition() +rmw_create_guard_condition(rmw_context_t * context) { + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, NULL); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init context, + context->implementation_identifier, + rti_connext_identifier, + // TODO(wjwwood): replace this with RMW_RET_INCORRECT_RMW_IMPLEMENTATION when refactored + return NULL); return create_guard_condition(rti_connext_identifier); } diff --git a/rmw_connext_cpp/src/rmw_init.cpp b/rmw_connext_cpp/src/rmw_init.cpp index d3cf74c3..b9ae9058 100644 --- a/rmw_connext_cpp/src/rmw_init.cpp +++ b/rmw_connext_cpp/src/rmw_init.cpp @@ -12,15 +12,91 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "rmw/rmw.h" +#include "rmw/init.h" +#include "rmw/impl/cpp/macros.hpp" #include "rmw_connext_shared_cpp/init.hpp" +#include "rmw_connext_cpp/identifier.hpp" + extern "C" { rmw_ret_t -rmw_init() +rmw_init_options_init(rmw_init_options_t * init_options, rcutils_allocator_t allocator) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(init_options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ALLOCATOR(&allocator, return RMW_RET_INVALID_ARGUMENT); + if (NULL != init_options->implementation_identifier) { + RMW_SET_ERROR_MSG("expected zero-initialized init_options"); + return RMW_RET_INVALID_ARGUMENT; + } + init_options->instance_id = 0; + init_options->implementation_identifier = rti_connext_identifier; + init_options->allocator = allocator; + init_options->impl = nullptr; + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init_options_copy(const rmw_init_options_t * src, rmw_init_options_t * dst) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(src, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_ARGUMENT_FOR_NULL(dst, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + src, + src->implementation_identifier, + rti_connext_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + if (NULL != dst->implementation_identifier) { + RMW_SET_ERROR_MSG("expected zero-initialized dst"); + return RMW_RET_INVALID_ARGUMENT; + } + *dst = *src; + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init_options_fini(rmw_init_options_t * init_options) { + RMW_CHECK_ARGUMENT_FOR_NULL(init_options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ALLOCATOR(&(init_options->allocator), return RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init_options, + init_options->implementation_identifier, + rti_connext_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + *init_options = rmw_get_zero_initialized_init_options(); + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init(const rmw_init_options_t * options, rmw_context_t * context) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + options, + options->implementation_identifier, + rti_connext_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + context->instance_id = options->instance_id; + context->implementation_identifier = rti_connext_identifier; + context->impl = nullptr; return init(); } + +rmw_ret_t +rmw_shutdown(rmw_context_t * context) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + context, + context->implementation_identifier, + rti_connext_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + // context impl is explicitly supposed to be nullptr for now, see rmw_init's code + // RCUTILS_CHECK_ARGUMENT_FOR_NULL(context->impl, RMW_RET_INVALID_ARGUMENT); + *context = rmw_get_zero_initialized_context(); + return RMW_RET_OK; +} } // extern "C" diff --git a/rmw_connext_cpp/src/rmw_node.cpp b/rmw_connext_cpp/src/rmw_node.cpp index 26d31eae..c408f954 100644 --- a/rmw_connext_cpp/src/rmw_node.cpp +++ b/rmw_connext_cpp/src/rmw_node.cpp @@ -24,11 +24,19 @@ extern "C" { rmw_node_t * rmw_create_node( + rmw_context_t * context, const char * name, const char * namespace_, size_t domain_id, const rmw_node_security_options_t * security_options) { + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, NULL); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init context, + context->implementation_identifier, + rti_connext_identifier, + // TODO(wjwwood): replace this with RMW_RET_INCORRECT_RMW_IMPLEMENTATION when refactored + return NULL); return create_node( rti_connext_identifier, name, namespace_, domain_id, security_options); } diff --git a/rmw_connext_dynamic_cpp/src/functions.cpp b/rmw_connext_dynamic_cpp/src/functions.cpp index 71addb48..554892dd 100644 --- a/rmw_connext_dynamic_cpp/src/functions.cpp +++ b/rmw_connext_dynamic_cpp/src/functions.cpp @@ -52,6 +52,7 @@ #include "rmw/error_handling.h" #include "rmw/get_service_names_and_types.h" #include "rmw/get_topic_names_and_types.h" +#include "rmw/init.h" #include "rmw/rmw.h" #include "rmw/types.h" @@ -202,18 +203,99 @@ rmw_get_serialization_format() } rmw_ret_t -rmw_init() +rmw_init_options_init(rmw_init_options_t * init_options, rcutils_allocator_t allocator) { + RMW_CHECK_ARGUMENT_FOR_NULL(init_options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ALLOCATOR(&allocator, return RMW_RET_INVALID_ARGUMENT); + if (NULL != init_options->implementation_identifier) { + RMW_SET_ERROR_MSG("expected zero-initialized init_options"); + return RMW_RET_INVALID_ARGUMENT; + } + init_options->instance_id = 0; + init_options->implementation_identifier = rti_connext_dynamic_identifier; + init_options->allocator = allocator; + init_options->impl = nullptr; + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init_options_copy(const rmw_init_options_t * src, rmw_init_options_t * dst) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(src, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_ARGUMENT_FOR_NULL(dst, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + src, + src->implementation_identifier, + rti_connext_dynamic_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + if (NULL != dst->implementation_identifier) { + RMW_SET_ERROR_MSG("expected zero-initialized dst"); + return RMW_RET_INVALID_ARGUMENT; + } + *dst = *src; + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init_options_fini(rmw_init_options_t * init_options) +{ + RMW_CHECK_ARGUMENT_FOR_NULL(init_options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ALLOCATOR(&(init_options->allocator), return RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init_options, + init_options->implementation_identifier, + rti_connext_dynamic_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + *init_options = rmw_get_zero_initialized_init_options(); + return RMW_RET_OK; +} + +rmw_ret_t +rmw_init(const rmw_init_options_t * options, rmw_context_t * context) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(options, RMW_RET_INVALID_ARGUMENT); + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + options, + options->implementation_identifier, + rti_connext_dynamic_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + context->instance_id = options->instance_id; + context->implementation_identifier = rti_connext_dynamic_identifier; + context->impl = nullptr; return init(); } +rmw_ret_t +rmw_shutdown(rmw_context_t * context) +{ + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, RMW_RET_INVALID_ARGUMENT); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + context, + context->implementation_identifier, + rti_connext_dynamic_identifier, + return RMW_RET_INCORRECT_RMW_IMPLEMENTATION); + // context impl is explicitly supposed to be nullptr for now, see rmw_init's code + // RCUTILS_CHECK_ARGUMENT_FOR_NULL(context->impl, RMW_RET_INVALID_ARGUMENT); + *context = rmw_get_zero_initialized_context(); + return RMW_RET_OK; +} + rmw_node_t * rmw_create_node( + rmw_context_t * context, const char * name, const char * namespace_, size_t domain_id, const rmw_node_security_options_t * security_options) { + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, NULL); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init context, + context->implementation_identifier, + rti_connext_dynamic_identifier, + // TODO(wjwwood): replace this with RMW_RET_INCORRECT_RMW_IMPLEMENTATION when refactored + return NULL); return create_node( rti_connext_dynamic_identifier, name, namespace_, domain_id, security_options); } @@ -254,7 +336,7 @@ DDS_TypeCode * _create_type_code( type_name, untyped_members, typesupport); } - RMW_SET_ERROR_MSG("Unknown typesupport identifier") + RMW_SET_ERROR_MSG("Unknown typesupport identifier"); return NULL; } @@ -372,7 +454,7 @@ rmw_create_publisher( // partition operater takes ownership of it. printf("Original publisher topic name: %s\n", topic_name); if (rcutils_split_last(topic_name, '/', allocator, &name_tokens) != RCUTILS_RET_OK) { - RMW_SET_ERROR_MSG(rcutils_get_error_string().str) + RMW_SET_ERROR_MSG(rcutils_get_error_string().str); goto fail; } partition_str = NULL; @@ -1379,8 +1461,15 @@ rmw_deserialize( } rmw_guard_condition_t * -rmw_create_guard_condition() +rmw_create_guard_condition(rmw_context_t * context) { + RCUTILS_CHECK_ARGUMENT_FOR_NULL(context, NULL); + RMW_CHECK_TYPE_IDENTIFIERS_MATCH( + init context, + context->implementation_identifier, + rti_connext_dynamic_identifier, + // TODO(wjwwood): replace this with RMW_RET_INCORRECT_RMW_IMPLEMENTATION when refactored + return NULL); return create_guard_condition(rti_connext_dynamic_identifier); }