diff --git a/README.md b/README.md index 58879b46..c493a673 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ All the configurable parameters are: | RMW_UXRCE_MAX_SUBSCRIPTIONS | This value sets the maximum number of topic subscriptions for an application. | 4 | | RMW_UXRCE_MAX_SERVICES | This value sets the maximum number of service servers for an application. | 4 | | RMW_UXRCE_MAX_CLIENTS | This value sets the maximum number of service clients for an application. | 4 | -| RMW_UXRCE_MAX_TOPICS | This value sets the maximum number of topics for an application.
If set to -1 RMW_UXRCE_MAX_TOPICS = RMW_UXRCE_MAX_PUBLISHERS +
RMW_UXRCE_MAX_SUBSCRIPTIONS + RMW_UXRCE_MAX_NODES. | -1 | | RMW_UXRCE_MAX_WAIT_SETS | This value sets the maximum number of wait sets for an application. | 4 | | RMW_UXRCE_MAX_GUARD_CONDITION | This value sets the maximum number of guard conditions for an application. | 4 | | RMW_UXRCE_NODE_NAME_MAX_LENGTH | This value sets the maximum number of characters for a node name. | 60 | diff --git a/rmw_microxrcedds_c/CMakeLists.txt b/rmw_microxrcedds_c/CMakeLists.txt index e508e005..2d932225 100644 --- a/rmw_microxrcedds_c/CMakeLists.txt +++ b/rmw_microxrcedds_c/CMakeLists.txt @@ -55,9 +55,6 @@ set(RMW_UXRCE_MAX_SERVICES "4" CACHE STRING "This value sets the maximum number set(RMW_UXRCE_MAX_CLIENTS "4" CACHE STRING "This value sets the maximum number of clients for an application.") set(RMW_UXRCE_MAX_WAIT_SETS "4" CACHE STRING "This value sets the maximum number of wait sets for an application.") set(RMW_UXRCE_MAX_GUARD_CONDITION "4" CACHE STRING "This value sets the maximum number of guard conditions for an application.") -set(RMW_UXRCE_MAX_TOPICS "-1" CACHE STRING - "This value sets the maximum number of topics for an application. - If set to -1 RMW_UXRCE_MAX_TOPICS = RMW_UXRCE_MAX_PUBLISHERS + RMW_UXRCE_MAX_SUBSCRIPTIONS + RMW_UXRCE_MAX_NODES.") option(RMW_UXRCE_ALLOW_DYNAMIC_ALLOCATIONS "Enables increasing static pools with dynamic allocation when needed." OFF) set(RMW_UXRCE_NODE_NAME_MAX_LENGTH "60" CACHE STRING "This value sets the maximum number of characters for a node name.") set(RMW_UXRCE_TOPIC_NAME_MAX_LENGTH "60" CACHE STRING "This value sets the maximum number of characters for a topic name.") @@ -168,7 +165,6 @@ set(SRCS src/rmw_guard_condition.c src/rmw_init.c src/rmw_logging.c - src/rmw_microxrcedds_topic.c src/rmw_node.c src/rmw_node_info_and_types.c src/rmw_node_names.c diff --git a/rmw_microxrcedds_c/src/callbacks.c b/rmw_microxrcedds_c/src/callbacks.c index a25ad566..9cf021c1 100644 --- a/rmw_microxrcedds_c/src/callbacks.c +++ b/rmw_microxrcedds_c/src/callbacks.c @@ -80,9 +80,9 @@ void on_topic( "Not available static buffer memory node in on_topic callback", .node = custom_subscription->owner_node->node_name, .node_namespace = custom_subscription->owner_node->node_namespace, - .topic_name = custom_subscription->topic_name, .ucdr = ub, + .topic_name = custom_subscription->topic.topic_name, .ucdr = ub, .size = length, - .type_support.message_callbacks = custom_subscription->type_support_callbacks); + .type_support.message_callbacks = custom_subscription->topic.type_support_callbacks.msg); return; } @@ -139,9 +139,9 @@ void on_request( "Not available static buffer memory node in on_request callback", .node = custom_service->owner_node->node_name, .node_namespace = custom_service->owner_node->node_namespace, - .topic_name = custom_service->service_name, .ucdr = ub, + .topic_name = custom_service->topic.topic_name, .ucdr = ub, .size = length, - .type_support.service_callbacks = custom_service->type_support_callbacks); + .type_support.service_callbacks = custom_service->topic.type_support_callbacks.srv); return; } @@ -200,9 +200,9 @@ void on_reply( "Not available static buffer memory node in on_reply callback", .node = custom_client->owner_node->node_name, .node_namespace = custom_client->owner_node->node_namespace, - .topic_name = custom_client->service_name, .ucdr = ub, + .topic_name = custom_client->topic.topic_name, .ucdr = ub, .size = length, - .type_support.service_callbacks = custom_client->type_support_callbacks); + .type_support.service_callbacks = custom_client->topic.type_support_callbacks.srv); return; } diff --git a/rmw_microxrcedds_c/src/config.h.in b/rmw_microxrcedds_c/src/config.h.in index 22cd6dd3..a22b0f54 100644 --- a/rmw_microxrcedds_c/src/config.h.in +++ b/rmw_microxrcedds_c/src/config.h.in @@ -57,16 +57,9 @@ #define RMW_UXRCE_MAX_SUBSCRIPTIONS @RMW_UXRCE_MAX_SUBSCRIPTIONS@ #define RMW_UXRCE_MAX_SERVICES @RMW_UXRCE_MAX_SERVICES@ #define RMW_UXRCE_MAX_CLIENTS @RMW_UXRCE_MAX_CLIENTS@ -#define RMW_UXRCE_MAX_TOPICS @RMW_UXRCE_MAX_TOPICS@ #define RMW_UXRCE_MAX_WAIT_SETS @RMW_UXRCE_MAX_WAIT_SETS@ #define RMW_UXRCE_MAX_GUARD_CONDITION @RMW_UXRCE_MAX_GUARD_CONDITION@ -#if RMW_UXRCE_MAX_TOPICS == -1 -#define RMW_UXRCE_MAX_TOPICS_INTERNAL RMW_UXRCE_MAX_PUBLISHERS + RMW_UXRCE_MAX_SUBSCRIPTIONS -#else -#define RMW_UXRCE_MAX_TOPICS_INTERNAL RMW_UXRCE_MAX_TOPICS -#endif - #define RMW_UXRCE_NODE_NAME_MAX_LENGTH @RMW_UXRCE_NODE_NAME_MAX_LENGTH@ #define RMW_UXRCE_TOPIC_NAME_MAX_LENGTH @RMW_UXRCE_TOPIC_NAME_MAX_LENGTH@ #define RMW_UXRCE_TYPE_NAME_MAX_LENGTH @RMW_UXRCE_TYPE_NAME_MAX_LENGTH@ diff --git a/rmw_microxrcedds_c/src/rmw_client.c b/rmw_microxrcedds_c/src/rmw_client.c index 0b7a2f9e..9807ab84 100644 --- a/rmw_microxrcedds_c/src/rmw_client.c +++ b/rmw_microxrcedds_c/src/rmw_client.c @@ -12,17 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. - -#ifdef HAVE_C_TYPESUPPORT -#include -#endif /* ifdef HAVE_C_TYPESUPPORT */ -#ifdef HAVE_CPP_TYPESUPPORT -#include -#endif /* ifdef HAVE_CPP_TYPESUPPORT */ - #include #include +#include +#include + #include "./rmw_microros_internal/utils.h" #include "./rmw_microros_internal/error_handling_internal.h" @@ -56,8 +51,8 @@ rmw_create_client( rmw_client = &custom_client->rmw_client; rmw_client->data = NULL; rmw_client->implementation_identifier = rmw_get_implementation_identifier(); - rmw_client->service_name = custom_client->service_name; - if ((strlen(service_name) + 1 ) > sizeof(custom_client->service_name)) { + rmw_client->service_name = custom_client->topic.topic_name; + if ((strlen(service_name) + 1 ) > sizeof(custom_client->topic.topic_name)) { RMW_UROS_TRACE_MESSAGE("failed to allocate string") goto fail; } @@ -68,26 +63,18 @@ rmw_create_client( custom_client->session_timeout = RMW_UXRCE_PUBLISH_RELIABLE_TIMEOUT; custom_client->qos = *qos_policies; - const rosidl_service_type_support_t * type_support_xrce = NULL; -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE - type_support_xrce = get_service_typesupport_handle( + const rosidl_service_type_support_t * type_support_xrce = get_service_typesupport_handle( type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE); -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE */ -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE - if (NULL == type_support_xrce) { - type_support_xrce = get_service_typesupport_handle( - type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE); - } -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE */ + if (NULL == type_support_xrce) { RMW_UROS_TRACE_MESSAGE("Undefined type support") goto fail; } - custom_client->type_support_callbacks = + custom_client->topic.type_support_callbacks.srv = (const service_type_support_callbacks_t *)type_support_xrce->data; - if (custom_client->type_support_callbacks == NULL) { + if (custom_client->topic.type_support_callbacks.srv == NULL) { RMW_UROS_TRACE_MESSAGE("type support data is NULL") goto fail; } @@ -121,7 +108,7 @@ rmw_create_client( static char req_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; static char res_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; generate_service_types( - custom_client->type_support_callbacks, req_type_name, res_type_name, + custom_client->topic.type_support_callbacks.srv, req_type_name, res_type_name, RMW_UXRCE_TYPE_NAME_MAX_LENGTH); static char req_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; diff --git a/rmw_microxrcedds_c/src/rmw_init.c b/rmw_microxrcedds_c/src/rmw_init.c index 83121734..0c7a2aff 100644 --- a/rmw_microxrcedds_c/src/rmw_init.c +++ b/rmw_microxrcedds_c/src/rmw_init.c @@ -261,7 +261,6 @@ rmw_init( rmw_uxrce_init_publisher_memory(&publisher_memory, custom_publishers, RMW_UXRCE_MAX_PUBLISHERS); rmw_uxrce_init_service_memory(&service_memory, custom_services, RMW_UXRCE_MAX_SERVICES); rmw_uxrce_init_client_memory(&client_memory, custom_clients, RMW_UXRCE_MAX_CLIENTS); - rmw_uxrce_init_topic_memory(&topics_memory, custom_topics, RMW_UXRCE_MAX_TOPICS_INTERNAL); rmw_uxrce_init_init_options_impl_memory( &init_options_memory, custom_init_options, RMW_UXRCE_MAX_OPTIONS); diff --git a/rmw_microxrcedds_c/src/rmw_microros_internal/rmw_microxrcedds_topic.h b/rmw_microxrcedds_c/src/rmw_microros_internal/rmw_microxrcedds_topic.h deleted file mode 100644 index 444c5a89..00000000 --- a/rmw_microxrcedds_c/src/rmw_microros_internal/rmw_microxrcedds_topic.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// 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 RMW_MICROROS_INTERNAL__RMW_MICROXRCEDDS_TOPIC_H_ -#define RMW_MICROROS_INTERNAL__RMW_MICROXRCEDDS_TOPIC_H_ - -#include -#include - -#include "./rmw_microros_internal/types.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif // if defined(__cplusplus) - -rmw_uxrce_topic_t * -create_topic( - struct rmw_uxrce_node_t * custom_node, - const char * topic_name, - const message_type_support_callbacks_t * message_type_support_callbacks, - const rmw_qos_profile_t * qos_policies); - -rmw_ret_t destroy_topic( - rmw_uxrce_topic_t * topic); -size_t topic_count( - rmw_uxrce_node_t * custom_node); - -#if defined(__cplusplus) -} -#endif // if defined(__cplusplus) - -#endif // RMW_MICROROS_INTERNAL__RMW_MICROXRCEDDS_TOPIC_H_ diff --git a/rmw_microxrcedds_c/src/rmw_microros_internal/types.h b/rmw_microxrcedds_c/src/rmw_microros_internal/types.h index 45cadb25..e559d7e5 100644 --- a/rmw_microxrcedds_c/src/rmw_microros_internal/types.h +++ b/rmw_microxrcedds_c/src/rmw_microros_internal/types.h @@ -117,19 +117,22 @@ typedef struct rmw_init_options_impl_s rmw_uxrce_init_options_impl_t; typedef struct rmw_uxrce_topic_t { - rmw_uxrce_mempool_item_t mem; - uxrObjectId topic_id; - const message_type_support_callbacks_t * message_type_support_callbacks; struct rmw_uxrce_node_t * owner_node; + + union { + const message_type_support_callbacks_t * msg; + const service_type_support_callbacks_t * srv; + } type_support_callbacks; + + char topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; } rmw_uxrce_topic_t; typedef struct rmw_uxrce_service_t { rmw_uxrce_mempool_item_t mem; uxrObjectId service_id; - const service_type_support_callbacks_t * type_support_callbacks; uint16_t service_data_resquest; rmw_qos_profile_t qos; @@ -139,14 +142,13 @@ typedef struct rmw_uxrce_service_t struct rmw_uxrce_node_t * owner_node; rmw_service_t rmw_service; - char service_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + rmw_uxrce_topic_t topic; } rmw_uxrce_service_t; typedef struct rmw_uxrce_client_t { rmw_uxrce_mempool_item_t mem; uxrObjectId client_id; - const service_type_support_callbacks_t * type_support_callbacks; uint16_t client_data_request; rmw_qos_profile_t qos; @@ -156,7 +158,7 @@ typedef struct rmw_uxrce_client_t struct rmw_uxrce_node_t * owner_node; rmw_client_t rmw_client; - char service_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + rmw_uxrce_topic_t topic; } rmw_uxrce_client_t; typedef struct rmw_uxrce_subscription_t @@ -165,15 +167,12 @@ typedef struct rmw_uxrce_subscription_t uxrObjectId subscriber_id; uxrObjectId datareader_id; - const message_type_support_callbacks_t * type_support_callbacks; - struct rmw_uxrce_topic_t * topic; - struct rmw_uxrce_node_t * owner_node; rmw_qos_profile_t qos; uxrStreamId stream_id; rmw_subscription_t rmw_subscription; - char topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + rmw_uxrce_topic_t topic; } rmw_uxrce_subscription_t; typedef struct rmw_uxrce_publisher_t @@ -182,21 +181,16 @@ typedef struct rmw_uxrce_publisher_t uxrObjectId publisher_id; uxrObjectId datawriter_id; - const message_type_support_callbacks_t * type_support_callbacks; - rmw_uros_continous_serialization_size cs_cb_size; rmw_uros_continous_serialization cs_cb_serialization; - struct rmw_uxrce_topic_t * topic; - + struct rmw_uxrce_node_t * owner_node; rmw_qos_profile_t qos; uxrStreamId stream_id; int session_timeout; - struct rmw_uxrce_node_t * owner_node; - rmw_publisher_t rmw_publisher; - char topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + rmw_uxrce_topic_t topic; } rmw_uxrce_publisher_t; typedef struct rmw_uxrce_node_t @@ -279,9 +273,6 @@ extern rmw_uxrce_service_t custom_services[RMW_UXRCE_MAX_SERVICES]; extern rmw_uxrce_mempool_t client_memory; extern rmw_uxrce_client_t custom_clients[RMW_UXRCE_MAX_CLIENTS]; -extern rmw_uxrce_mempool_t topics_memory; -extern rmw_uxrce_topic_t custom_topics[RMW_UXRCE_MAX_TOPICS_INTERNAL]; - extern rmw_uxrce_mempool_t static_buffer_memory; extern rmw_uxrce_static_input_buffer_t custom_static_buffers[RMW_UXRCE_MAX_HISTORY]; @@ -336,8 +327,6 @@ void rmw_uxrce_fini_client_memory( rmw_client_t * client); void rmw_uxrce_fini_service_memory( rmw_service_t * service); -void rmw_uxrce_fini_topic_memory( - rmw_uxrce_topic_t * topic); // Memory pools functions diff --git a/rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c b/rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c deleted file mode 100644 index 86b95348..00000000 --- a/rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// 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 "./rmw_microros_internal/utils.h" -#include "./rmw_microros_internal/error_handling_internal.h" - -rmw_uxrce_topic_t * -create_topic( - struct rmw_uxrce_node_t * custom_node, - const char * topic_name, - const message_type_support_callbacks_t * message_type_support_callbacks, - const rmw_qos_profile_t * qos_policies) -{ - (void) qos_policies; - - rmw_uxrce_topic_t * custom_topic = NULL; - rmw_uxrce_mempool_item_t * memory_node = get_memory(&topics_memory); - - if (!memory_node) { - RMW_UROS_TRACE_MESSAGE("Not available memory node"); - goto fail; - } - - custom_topic = (rmw_uxrce_topic_t *)memory_node->data; - - // Init - custom_topic->owner_node = custom_node; - - // Asociate to typesupport - custom_topic->message_type_support_callbacks = message_type_support_callbacks; - - // Generate topic id - custom_topic->topic_id = uxr_object_id(custom_node->context->id_topic++, UXR_TOPIC_ID); - - // Generate request - uint16_t topic_req = 0; -#ifdef RMW_UXRCE_USE_REFS - (void)qos_policies; - if (!build_topic_profile( - topic_name, rmw_uxrce_entity_naming_buffer, - sizeof(rmw_uxrce_entity_naming_buffer))) - { - RMW_UROS_TRACE_MESSAGE("failed to generate xml request for node creation") - rmw_uxrce_fini_topic_memory(custom_topic); - custom_topic = NULL; - goto fail; - } - - topic_req = uxr_buffer_create_topic_ref( - &custom_node->context->session, - *custom_node->context->creation_stream, custom_topic->topic_id, - custom_node->participant_id, rmw_uxrce_entity_naming_buffer, UXR_REPLACE | UXR_REUSE); -#else - static char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; - static char type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; - - generate_topic_name(topic_name, full_topic_name, sizeof(full_topic_name)); - generate_type_name(message_type_support_callbacks, type_name, sizeof(type_name)); - - topic_req = uxr_buffer_create_topic_bin( - &custom_node->context->session, - *custom_node->context->creation_stream, - custom_topic->topic_id, - custom_node->participant_id, - full_topic_name, - type_name, - UXR_REPLACE | UXR_REUSE); -#endif /* ifdef RMW_UXRCE_USE_XML */ - - if (!run_xrce_session( - custom_node->context, custom_node->context->creation_stream, topic_req, - custom_node->context->creation_timeout)) - { - rmw_uxrce_fini_topic_memory(custom_topic); - custom_topic = NULL; - goto fail; - } - -fail: - return custom_topic; -} - -rmw_ret_t destroy_topic( - rmw_uxrce_topic_t * topic) -{ - rmw_ret_t result_ret = RMW_RET_OK; - if (topic->owner_node != NULL) { - rmw_uxrce_node_t * custom_node = topic->owner_node; - - uint16_t delete_topic = uxr_buffer_delete_entity( - &custom_node->context->session, - *custom_node->context->destroy_stream, - topic->topic_id); - - if (!run_xrce_session( - custom_node->context, custom_node->context->destroy_stream, delete_topic, - custom_node->context->destroy_timeout)) - { - result_ret = RMW_RET_TIMEOUT; - } - rmw_uxrce_fini_topic_memory(topic); - } else { - result_ret = RMW_RET_ERROR; - } - - return result_ret; -} - -size_t topic_count( - rmw_uxrce_node_t * custom_node) -{ - size_t count = 0; - rmw_uxrce_mempool_item_t * item = NULL; - - item = publisher_memory.allocateditems; - while (item != NULL) { - rmw_uxrce_publisher_t * custom_publisher = (rmw_uxrce_publisher_t *)item->data; - item = item->next; - if (custom_publisher->owner_node == custom_node && custom_publisher->topic != NULL) { - count++; - } - } - - item = subscription_memory.allocateditems; - while (item != NULL) { - rmw_uxrce_subscription_t * custom_subscription = (rmw_uxrce_subscription_t *)item->data; - item = item->next; - if (custom_subscription->owner_node == custom_node && custom_subscription->topic != NULL) { - count++; - } - } - - return count; -} diff --git a/rmw_microxrcedds_c/src/rmw_publish.c b/rmw_microxrcedds_c/src/rmw_publish.c index 8054d062..9cc6480b 100644 --- a/rmw_microxrcedds_c/src/rmw_publish.c +++ b/rmw_microxrcedds_c/src/rmw_publish.c @@ -50,7 +50,8 @@ rmw_publish( ret = RMW_RET_ERROR; } else { rmw_uxrce_publisher_t * custom_publisher = (rmw_uxrce_publisher_t *)publisher->data; - const message_type_support_callbacks_t * functions = custom_publisher->type_support_callbacks; + const message_type_support_callbacks_t * functions = + custom_publisher->topic.type_support_callbacks.msg; uint32_t topic_length = functions->get_serialized_size(ros_message); if (custom_publisher->cs_cb_size) { diff --git a/rmw_microxrcedds_c/src/rmw_publisher.c b/rmw_microxrcedds_c/src/rmw_publisher.c index 896342c4..2275c745 100644 --- a/rmw_microxrcedds_c/src/rmw_publisher.c +++ b/rmw_microxrcedds_c/src/rmw_publisher.c @@ -20,19 +20,14 @@ #include #endif // RMW_UXRCE_GRAPH -#ifdef HAVE_C_TYPESUPPORT +#include +#include +#include + #include -#endif /* ifdef HAVE_C_TYPESUPPORT */ -#ifdef HAVE_CPP_TYPESUPPORT -#include -#endif /* ifdef HAVE_CPP_TYPESUPPORT */ #include -#include -#include - #include "./rmw_microros_internal/utils.h" -#include "./rmw_microros_internal/rmw_microxrcedds_topic.h" #include "./rmw_microros_internal/error_handling_internal.h" rmw_ret_t @@ -90,15 +85,6 @@ rmw_create_publisher( rmw_publisher = &custom_publisher->rmw_publisher; rmw_publisher->data = NULL; rmw_publisher->implementation_identifier = rmw_get_implementation_identifier(); - rmw_publisher->topic_name = custom_publisher->topic_name; - - if ((strlen(topic_name) + 1 ) > sizeof(custom_publisher->topic_name)) { - RMW_UROS_TRACE_MESSAGE("failed to allocate string") - goto fail; - } - snprintf( - (char *)rmw_publisher->topic_name, sizeof(custom_publisher->topic_name), "%s", - topic_name); custom_publisher->owner_node = custom_node; custom_publisher->session_timeout = RMW_UXRCE_PUBLISH_RELIABLE_TIMEOUT; @@ -112,37 +98,57 @@ rmw_create_publisher( custom_publisher->cs_cb_size = NULL; custom_publisher->cs_cb_serialization = NULL; - const rosidl_message_type_support_t * type_support_xrce = NULL; -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE - type_support_xrce = get_message_typesupport_handle( + // Create topic + custom_publisher->topic.owner_node = custom_publisher->owner_node; + custom_publisher->topic.topic_id = + uxr_object_id(custom_node->context->id_topic++, UXR_TOPIC_ID); + + const rosidl_message_type_support_t * type_support_xrce = get_message_typesupport_handle( type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE); -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE */ -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE - if (NULL == type_support_xrce) { - type_support_xrce = get_message_typesupport_handle( - type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE); - } -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE */ + if (NULL == type_support_xrce) { RMW_UROS_TRACE_MESSAGE("Undefined type support") + custom_publisher = NULL; goto fail; } - custom_publisher->type_support_callbacks = + custom_publisher->topic.type_support_callbacks.msg = (const message_type_support_callbacks_t *)type_support_xrce->data; - if (custom_publisher->type_support_callbacks == NULL) { - RMW_UROS_TRACE_MESSAGE("type support data is NULL") + if ((strlen(topic_name) + 1 ) > sizeof(custom_publisher->topic.topic_name)) { + RMW_UROS_TRACE_MESSAGE("failed to allocate string") + custom_publisher = NULL; goto fail; } + snprintf( + (char *)custom_publisher->topic.topic_name, sizeof(custom_publisher->topic.topic_name), + "%s", topic_name); + rmw_publisher->topic_name = custom_publisher->topic.topic_name; - // Create topic - custom_publisher->topic = create_topic( - custom_node, topic_name, - custom_publisher->type_support_callbacks, qos_policies); + static char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + static char type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; + + generate_topic_name(topic_name, full_topic_name, sizeof(full_topic_name)); + generate_type_name( + custom_publisher->topic.type_support_callbacks.msg, type_name, + sizeof(type_name)); + + uint16_t topic_req = UXR_INVALID_REQUEST_ID; + + topic_req = uxr_buffer_create_topic_bin( + &custom_node->context->session, + *custom_node->context->creation_stream, + custom_publisher->topic.topic_id, + custom_node->participant_id, + full_topic_name, + type_name, + UXR_REPLACE | UXR_REUSE); - if (custom_publisher->topic == NULL) { - RMW_UROS_TRACE_MESSAGE("Error creating topic") + if (!run_xrce_session( + custom_node->context, custom_node->context->creation_stream, topic_req, + custom_node->context->creation_timeout)) + { + custom_publisher = NULL; goto fail; } @@ -203,7 +209,7 @@ rmw_create_publisher( *custom_node->context->creation_stream, custom_publisher->datawriter_id, custom_publisher->publisher_id, - custom_publisher->topic->topic_id, + custom_publisher->topic.topic_id, convert_qos_profile(qos_policies), UXR_REPLACE | UXR_REUSE); #endif /* ifdef RMW_UXRCE_USE_REFS */ @@ -343,8 +349,6 @@ rmw_destroy_publisher( rmw_uxrce_publisher_t * custom_publisher = (rmw_uxrce_publisher_t *)publisher->data; rmw_uxrce_node_t * custom_node = custom_publisher->owner_node; - destroy_topic(custom_publisher->topic); - uint16_t delete_writer = uxr_buffer_delete_entity( &custom_publisher->owner_node->context->session, *custom_publisher->owner_node->context->destroy_stream, @@ -353,6 +357,10 @@ rmw_destroy_publisher( &custom_publisher->owner_node->context->session, *custom_publisher->owner_node->context->destroy_stream, custom_publisher->publisher_id); + uint16_t delete_topic = uxr_buffer_delete_entity( + &custom_publisher->owner_node->context->session, + *custom_publisher->owner_node->context->destroy_stream, + custom_publisher->topic.topic_id); bool ret = run_xrce_session( custom_node->context, custom_node->context->destroy_stream, delete_writer, @@ -360,10 +368,14 @@ rmw_destroy_publisher( ret &= run_xrce_session( custom_node->context, custom_node->context->destroy_stream, delete_publisher, custom_node->context->destroy_timeout); + ret &= run_xrce_session( + custom_node->context, custom_node->context->destroy_stream, delete_topic, + custom_node->context->destroy_timeout); if (!ret) { result_ret = RMW_RET_TIMEOUT; } + memset(&custom_publisher->topic, 0, sizeof(rmw_uxrce_topic_t)); rmw_uxrce_fini_publisher_memory(publisher); } diff --git a/rmw_microxrcedds_c/src/rmw_request.c b/rmw_microxrcedds_c/src/rmw_request.c index 65b5e1e7..3344b958 100644 --- a/rmw_microxrcedds_c/src/rmw_request.c +++ b/rmw_microxrcedds_c/src/rmw_request.c @@ -33,7 +33,7 @@ rmw_send_request( rmw_uxrce_node_t * custom_node = custom_client->owner_node; const rosidl_message_type_support_t * req_members = - custom_client->type_support_callbacks->request_members_(); + custom_client->topic.type_support_callbacks.srv->request_members_(); const message_type_support_callbacks_t * functions = (const message_type_support_callbacks_t *)req_members->data; @@ -111,7 +111,7 @@ rmw_take_request( static_buffer->related.sample_id.writer_guid.guidPrefix.data, 12); const rosidl_message_type_support_t * req_members = - custom_service->type_support_callbacks->request_members_(); + custom_service->topic.type_support_callbacks.srv->request_members_(); const message_type_support_callbacks_t * functions = (const message_type_support_callbacks_t *)req_members->data; diff --git a/rmw_microxrcedds_c/src/rmw_response.c b/rmw_microxrcedds_c/src/rmw_response.c index 2d42fedb..3c368b9a 100644 --- a/rmw_microxrcedds_c/src/rmw_response.c +++ b/rmw_microxrcedds_c/src/rmw_response.c @@ -45,7 +45,7 @@ rmw_send_response( sizeof(sample_id.writer_guid.guidPrefix.data)); const rosidl_message_type_support_t * res_members = - custom_service->type_support_callbacks->response_members_(); + custom_service->topic.type_support_callbacks.srv->response_members_(); const message_type_support_callbacks_t * functions = (const message_type_support_callbacks_t *)res_members->data; @@ -112,7 +112,7 @@ rmw_take_response( request_header->request_id.sequence_number = static_buffer->related.reply_id; const rosidl_message_type_support_t * res_members = - custom_client->type_support_callbacks->response_members_(); + custom_client->topic.type_support_callbacks.srv->response_members_(); const message_type_support_callbacks_t * functions = (const message_type_support_callbacks_t *)res_members->data; diff --git a/rmw_microxrcedds_c/src/rmw_service.c b/rmw_microxrcedds_c/src/rmw_service.c index 43b50236..fa3cb6a0 100644 --- a/rmw_microxrcedds_c/src/rmw_service.c +++ b/rmw_microxrcedds_c/src/rmw_service.c @@ -12,18 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "./rmw_microros_internal/utils.h" - -#ifdef HAVE_C_TYPESUPPORT -#include -#endif /* ifdef HAVE_C_TYPESUPPORT */ -#ifdef HAVE_CPP_TYPESUPPORT -#include -#endif /* ifdef HAVE_CPP_TYPESUPPORT */ - #include #include +#include +#include + +#include "./rmw_microros_internal/utils.h" #include "./rmw_microros_internal/error_handling_internal.h" rmw_service_t * @@ -56,8 +51,8 @@ rmw_create_service( rmw_service = &custom_service->rmw_service; rmw_service->data = NULL; rmw_service->implementation_identifier = rmw_get_implementation_identifier(); - rmw_service->service_name = custom_service->service_name; - if ((strlen(service_name) + 1 ) > sizeof(custom_service->service_name)) { + rmw_service->service_name = custom_service->topic.topic_name; + if ((strlen(service_name) + 1 ) > sizeof(custom_service->topic.topic_name)) { RMW_UROS_TRACE_MESSAGE("failed to allocate string") goto fail; } @@ -68,26 +63,18 @@ rmw_create_service( custom_service->session_timeout = RMW_UXRCE_PUBLISH_RELIABLE_TIMEOUT; custom_service->qos = *qos_policies; - const rosidl_service_type_support_t * type_support_xrce = NULL; -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE - type_support_xrce = get_service_typesupport_handle( + const rosidl_service_type_support_t * type_support_xrce = get_service_typesupport_handle( type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE); -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE */ -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE - if (NULL == type_support_xrce) { - type_support_xrce = get_service_typesupport_handle( - type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE); - } -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE */ + if (NULL == type_support_xrce) { RMW_UROS_TRACE_MESSAGE("Undefined type support") goto fail; } - custom_service->type_support_callbacks = + custom_service->topic.type_support_callbacks.srv = (const service_type_support_callbacks_t *)type_support_xrce->data; - if (custom_service->type_support_callbacks == NULL) { + if (custom_service->topic.type_support_callbacks.srv == NULL) { RMW_UROS_TRACE_MESSAGE("type support data is NULL") goto fail; } @@ -119,7 +106,7 @@ rmw_create_service( static char req_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; static char res_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; generate_service_types( - custom_service->type_support_callbacks, req_type_name, res_type_name, + custom_service->topic.type_support_callbacks.srv, req_type_name, res_type_name, RMW_UXRCE_TYPE_NAME_MAX_LENGTH); static char req_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; diff --git a/rmw_microxrcedds_c/src/rmw_subscription.c b/rmw_microxrcedds_c/src/rmw_subscription.c index 57b4f4af..526374c5 100644 --- a/rmw_microxrcedds_c/src/rmw_subscription.c +++ b/rmw_microxrcedds_c/src/rmw_subscription.c @@ -18,19 +18,14 @@ #include #endif // RMW_UXRCE_GRAPH -#ifdef HAVE_C_TYPESUPPORT -#include -#endif /* ifdef HAVE_C_TYPESUPPORT */ -#ifdef HAVE_CPP_TYPESUPPORT -#include -#endif /* ifdef HAVE_CPP_TYPESUPPORT */ - #include #include #include +#include +#include + #include "./rmw_microros_internal/utils.h" -#include "./rmw_microros_internal/rmw_microxrcedds_topic.h" #include "./rmw_microros_internal/error_handling_internal.h" rmw_ret_t @@ -90,48 +85,62 @@ rmw_create_subscription( rmw_subscription = &custom_subscription->rmw_subscription; rmw_subscription->data = NULL; rmw_subscription->implementation_identifier = rmw_get_implementation_identifier(); - rmw_subscription->topic_name = custom_subscription->topic_name; - if ((strlen(topic_name) + 1 ) > sizeof(custom_subscription->topic_name)) { - RMW_UROS_TRACE_MESSAGE("failed to allocate string") - goto fail; - } - - snprintf( - (char *)rmw_subscription->topic_name, sizeof(custom_subscription->topic_name), "%s", - topic_name); custom_subscription->owner_node = custom_node; custom_subscription->qos = *qos_policies; - const rosidl_message_type_support_t * type_support_xrce = NULL; -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE - type_support_xrce = get_message_typesupport_handle( + // Create topic + custom_subscription->topic.owner_node = custom_subscription->owner_node; + custom_subscription->topic.topic_id = uxr_object_id( + custom_node->context->id_topic++, + UXR_TOPIC_ID); + + const rosidl_message_type_support_t * type_support_xrce = get_message_typesupport_handle( type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE); -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_C__IDENTIFIER_VALUE */ -#ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE - if (NULL == type_support_xrce) { - type_support_xrce = get_message_typesupport_handle( - type_support, ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE); - } -#endif /* ifdef ROSIDL_TYPESUPPORT_MICROXRCEDDS_CPP__IDENTIFIER_VALUE */ + if (NULL == type_support_xrce) { RMW_UROS_TRACE_MESSAGE("Undefined type support") + custom_subscription = NULL; goto fail; } - custom_subscription->type_support_callbacks = + custom_subscription->topic.type_support_callbacks.msg = (const message_type_support_callbacks_t *)type_support_xrce->data; - if (custom_subscription->type_support_callbacks == NULL) { - RMW_UROS_TRACE_MESSAGE("type support data is NULL") + if ((strlen(topic_name) + 1 ) > sizeof(custom_subscription->topic.topic_name)) { + RMW_UROS_TRACE_MESSAGE("failed to allocate string") + custom_subscription = NULL; goto fail; } + snprintf( + (char *)custom_subscription->topic.topic_name, + sizeof(custom_subscription->topic.topic_name), "%s", topic_name); + rmw_subscription->topic_name = custom_subscription->topic.topic_name; - // Create topic - custom_subscription->topic = create_topic( - custom_node, topic_name, - custom_subscription->type_support_callbacks, qos_policies); - if (custom_subscription->topic == NULL) { + static char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH]; + static char type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH]; + + generate_topic_name(topic_name, full_topic_name, sizeof(full_topic_name)); + generate_type_name( + custom_subscription->topic.type_support_callbacks.msg, type_name, + sizeof(type_name)); + + uint16_t topic_req = UXR_INVALID_REQUEST_ID; + + topic_req = uxr_buffer_create_topic_bin( + &custom_node->context->session, + *custom_node->context->creation_stream, + custom_subscription->topic.topic_id, + custom_node->participant_id, + full_topic_name, + type_name, + UXR_REPLACE | UXR_REUSE); + + if (!run_xrce_session( + custom_node->context, custom_node->context->creation_stream, topic_req, + custom_node->context->creation_timeout)) + { + custom_subscription = NULL; goto fail; } @@ -188,7 +197,7 @@ rmw_create_subscription( *custom_node->context->creation_stream, custom_subscription->datareader_id, custom_subscription->subscriber_id, - custom_subscription->topic->topic_id, + custom_subscription->topic.topic_id, convert_qos_profile(qos_policies), UXR_REPLACE | UXR_REUSE); #endif /* ifdef RMW_UXRCE_USE_XML */ @@ -321,8 +330,6 @@ rmw_destroy_subscription( custom_node->context, custom_node->context->destroy_stream, datareader_req, custom_node->context->destroy_timeout); - destroy_topic(custom_subscription->topic); - uint16_t delete_datareader = uxr_buffer_delete_entity( &custom_subscription->owner_node->context->session, @@ -333,6 +340,10 @@ rmw_destroy_subscription( &custom_subscription->owner_node->context->session, *custom_subscription->owner_node->context->destroy_stream, custom_subscription->subscriber_id); + uint16_t delete_topic = uxr_buffer_delete_entity( + &custom_subscription->owner_node->context->session, + *custom_subscription->owner_node->context->destroy_stream, + custom_subscription->topic.topic_id); bool ret = run_xrce_session( custom_node->context, custom_node->context->destroy_stream, delete_datareader, @@ -340,6 +351,9 @@ rmw_destroy_subscription( ret &= run_xrce_session( custom_node->context, custom_node->context->destroy_stream, delete_subscriber, custom_node->context->destroy_timeout); + ret &= run_xrce_session( + custom_node->context, custom_node->context->destroy_stream, delete_topic, + custom_node->context->destroy_timeout); if (!ret) { result_ret = RMW_RET_TIMEOUT; } diff --git a/rmw_microxrcedds_c/src/rmw_take.c b/rmw_microxrcedds_c/src/rmw_take.c index 0975a548..7c7b4a06 100644 --- a/rmw_microxrcedds_c/src/rmw_take.c +++ b/rmw_microxrcedds_c/src/rmw_take.c @@ -71,7 +71,7 @@ rmw_take_with_info( static_buffer->buffer, static_buffer->length); - bool deserialize_rv = custom_subscription->type_support_callbacks->cdr_deserialize( + bool deserialize_rv = custom_subscription->topic.type_support_callbacks.msg->cdr_deserialize( &temp_buffer, ros_message); diff --git a/rmw_microxrcedds_c/src/types.c b/rmw_microxrcedds_c/src/types.c index ff0f0cae..8a4ebfcf 100644 --- a/rmw_microxrcedds_c/src/types.c +++ b/rmw_microxrcedds_c/src/types.c @@ -27,7 +27,6 @@ #include "./rmw_microros_internal/utils.h" #include "./rmw_microros_internal/memory.h" -#include "./rmw_microros_internal/rmw_microxrcedds_topic.h" // Static memory pools @@ -51,9 +50,6 @@ rmw_uxrce_service_t custom_services[RMW_UXRCE_MAX_SERVICES]; rmw_uxrce_mempool_t client_memory; rmw_uxrce_client_t custom_clients[RMW_UXRCE_MAX_CLIENTS]; -rmw_uxrce_mempool_t topics_memory; -rmw_uxrce_topic_t custom_topics[RMW_UXRCE_MAX_TOPICS_INTERNAL]; - rmw_uxrce_mempool_t static_buffer_memory; rmw_uxrce_static_input_buffer_t custom_static_buffers[RMW_UXRCE_MAX_HISTORY]; @@ -103,7 +99,6 @@ RMW_INIT_MEMORY(publisher) RMW_INIT_MEMORY(subscription) RMW_INIT_MEMORY(node) RMW_INIT_MEMORY(session) -RMW_INIT_MEMORY(topic) RMW_INIT_MEMORY(static_input_buffer) RMW_INIT_MEMORY(init_options_impl) RMW_INIT_MEMORY(wait_set) @@ -209,13 +204,6 @@ void rmw_uxrce_fini_client_memory( client = NULL; } -void rmw_uxrce_fini_topic_memory( - rmw_uxrce_topic_t * topic) -{ - put_memory(&topics_memory, &topic->mem); - topic->owner_node = NULL; -} - size_t rmw_uxrce_count_static_input_buffer_for_entity( void * entity) { diff --git a/rmw_microxrcedds_c/test/CMakeLists.txt b/rmw_microxrcedds_c/test/CMakeLists.txt index 32198dee..386fad88 100644 --- a/rmw_microxrcedds_c/test/CMakeLists.txt +++ b/rmw_microxrcedds_c/test/CMakeLists.txt @@ -54,7 +54,6 @@ rmw_test(test-client test_client.cpp) rmw_test(test-subscriber test_subscription.cpp) rmw_test(test-pubsub test_pubsub.cpp) rmw_test(test-reqres test_reqres.cpp) -rmw_test(test-topic test_topic.cpp) rmw_test(test-rmw test_rmw.cpp) rmw_test(test-sizes test_sizes.cpp) rmw_test(test-guardcond test_guard_condition.cpp) \ No newline at end of file diff --git a/rmw_microxrcedds_c/test/test_sizes.cpp b/rmw_microxrcedds_c/test/test_sizes.cpp index dfab1ba0..58f5940e 100644 --- a/rmw_microxrcedds_c/test/test_sizes.cpp +++ b/rmw_microxrcedds_c/test/test_sizes.cpp @@ -28,7 +28,6 @@ TEST_F(RMWBaseTest, estimate_default_static_memory) { uint64_t context_size = sizeof(rmw_context_impl_t); - uint64_t topic_size = sizeof(rmw_uxrce_topic_t); uint64_t service_size = sizeof(rmw_uxrce_service_t); uint64_t client_size = sizeof(rmw_uxrce_client_t); uint64_t subscription_size = sizeof(rmw_uxrce_subscription_t); @@ -53,7 +52,6 @@ TEST_F(RMWBaseTest, estimate_default_static_memory) fprintf(stderr, "| Entity | Qty | Size per unit |\n"); fprintf(stderr, "| - | - | - |\n"); fprintf(stderr, "| Context | %d | %ld B | \n", RMW_UXRCE_MAX_SESSIONS, context_size); - fprintf(stderr, "| Topic | %d | %ld B | \n", RMW_UXRCE_MAX_TOPICS_INTERNAL, topic_size); fprintf(stderr, "| Service | %d | %ld B | \n", RMW_UXRCE_MAX_SERVICES, service_size); fprintf(stderr, "| Client | %d | %ld B | \n", RMW_UXRCE_MAX_CLIENTS, client_size); fprintf( @@ -74,7 +72,6 @@ TEST_F(RMWBaseTest, estimate_default_static_memory) uint64_t total = RMW_UXRCE_MAX_SESSIONS * context_size + - RMW_UXRCE_MAX_TOPICS_INTERNAL * topic_size + RMW_UXRCE_MAX_SERVICES * service_size + RMW_UXRCE_MAX_CLIENTS * client_size + RMW_UXRCE_MAX_SUBSCRIPTIONS * subscription_size + diff --git a/rmw_microxrcedds_c/test/test_topic.cpp b/rmw_microxrcedds_c/test/test_topic.cpp deleted file mode 100644 index b6d22b81..00000000 --- a/rmw_microxrcedds_c/test/test_topic.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// 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 -#include - -#include -#include -#include - -#include "./rmw_base_test.hpp" -#include "./test_utils.hpp" - -class TestTopic : public RMWBaseTest -{ -protected: - void SetUp() override - { - RMWBaseTest::SetUp(); - - node = rmw_create_node(&test_context, "my_node", "/ns"); - ASSERT_NE((void *)node, (void *)NULL); - } - - void TearDown() override - { - ASSERT_EQ(rmw_destroy_node(node), RMW_RET_OK); - RMWBaseTest::TearDown(); - } - - rmw_node_t * node; - const size_t attempts = RMW_UXRCE_MAX_TOPICS_INTERNAL; - size_t id_gen = 0; - - const char * topic_type = "topic_type"; - const char * topic_name = "topic_name"; - const char * package_name = "package_name"; -}; - - -/* - * Testing topic construction and destruction. - */ -TEST_F(TestTopic, construction_and_destruction) -{ - dummy_type_support_t dummy_type_support; - - ConfigureDummyTypeSupport( - topic_type, - topic_type, - package_name, - id_gen++, - &dummy_type_support); - - rmw_qos_profile_t dummy_qos_policies; - ConfigureDefaultQOSPolices(&dummy_qos_policies); - - rmw_uxrce_topic_t * topic = create_topic( - reinterpret_cast(node->data), - package_name, - &dummy_type_support.callbacks, - &dummy_qos_policies); - ASSERT_NE((void *)topic, (void *)NULL); - - // TODO(pablogs9): Topic must be related to publisher in order to be counted - // ASSERT_EQ(topic_count(reinterpret_cast(node->data)), 1); - - rmw_ret_t ret = destroy_topic(topic); - // TODO(pablogs9): Topic must be related to publisher in order to be counted - // ASSERT_EQ(topic_count(reinterpret_cast(node->data)), 0); - ASSERT_EQ(ret, RMW_RET_OK); -} - -/* - * Testing creation multiple topics - */ -TEST_F(TestTopic, multiple_topic_creation) -{ - rmw_qos_profile_t dummy_qos_policies; - - ConfigureDefaultQOSPolices(&dummy_qos_policies); - - std::vector created_topics; - std::vector dummy_type_supports; - for (size_t i = 0; i < attempts; i++) { - dummy_type_supports.push_back(dummy_type_support_t()); - ConfigureDummyTypeSupport( - topic_type, - topic_type, - package_name, - id_gen++, - &dummy_type_supports.back()); - - rmw_uxrce_topic_t * created_topic = create_topic( - reinterpret_cast(node->data), - dummy_type_supports.back().topic_name.data(), - &dummy_type_supports.back().callbacks, - &dummy_qos_policies); - - ASSERT_NE((void *)created_topic, (void *)NULL); - // TODO(pablogs9): Topic must be related to publisher in order to be counted - // ASSERT_EQ(topic_count(reinterpret_cast(node->data)), i + 1); - - created_topics.push_back(created_topic); - } - - for (size_t i = 0; i < created_topics.size(); i++) { - // TODO(pablogs9): Topic must be related to publisher in order to be counted - // ASSERT_EQ(topic_count(reinterpret_cast(node->data)), attempts - i); NOLINT - rmw_ret_t ret = destroy_topic(created_topics.at(i)); - ASSERT_EQ(ret, RMW_RET_OK); - } - - // Destroy an already destroyed topic - rmw_ret_t ret = destroy_topic(created_topics.at(0)); - ASSERT_EQ(ret, RMW_RET_ERROR); - - // TODO(pablogs9): Topic must be related to publisher in order to be counted - // ASSERT_EQ(topic_count(reinterpret_cast(node->data)), 0); -}