rmw_ret_t destroy_node(const char * implementation_identifier, rmw_node_t * node) { if (!node) { RMW_SET_ERROR_MSG("node handle is null"); return RMW_RET_ERROR; } RMW_CHECK_TYPE_IDENTIFIERS_MATCH( node handle, node->implementation_identifier, implementation_identifier, return RMW_RET_ERROR) DDSDomainParticipantFactory * dpf_ = DDSDomainParticipantFactory::get_instance(); if (!dpf_) { RMW_SET_ERROR_MSG("failed to get participant factory"); return RMW_RET_ERROR; } auto node_info = static_cast<ConnextNodeInfo *>(node->data); if (!node_info) { RMW_SET_ERROR_MSG("node info handle is null"); return RMW_RET_ERROR; } auto participant = static_cast<DDSDomainParticipant *>(node_info->participant); if (!participant) { RMW_SET_ERROR_MSG("participant handle is null"); } // This unregisters types and destroys topics which were shared between // publishers and subscribers and could not be cleaned up in the delete functions. if (participant->delete_contained_entities() != DDS::RETCODE_OK) { RMW_SET_ERROR_MSG("failed to delete contained entities of participant"); return RMW_RET_ERROR; } DDS_ReturnCode_t ret = dpf_->delete_participant(participant); if (ret != DDS_RETCODE_OK) { RMW_SET_ERROR_MSG("failed to delete participant"); return RMW_RET_ERROR; } if (node_info->publisher_listener) { RMW_TRY_DESTRUCTOR_FROM_WITHIN_FAILURE( node_info->publisher_listener->~CustomPublisherListener(), CustomPublisherListener) rmw_free(node_info->publisher_listener); node_info->publisher_listener = nullptr; } if (node_info->subscriber_listener) { RMW_TRY_DESTRUCTOR_FROM_WITHIN_FAILURE( node_info->subscriber_listener->~CustomSubscriberListener(), CustomSubscriberListener) rmw_free(node_info->subscriber_listener); node_info->subscriber_listener = nullptr; } if (node_info->graph_guard_condition) { rmw_ret_t ret = destroy_guard_condition(implementation_identifier, node_info->graph_guard_condition); if (ret != RMW_RET_OK) { RMW_SET_ERROR_MSG("failed to delete graph guard condition"); return RMW_RET_ERROR; } node_info->graph_guard_condition = nullptr; } rmw_free(node_info); node->data = nullptr; rmw_free(const_cast<char *>(node->name)); node->name = nullptr; rmw_node_free(node); return RMW_RET_OK; }
rmw_ret_t rmw_destroy_node(rmw_node_t * node) { if (!node) { RMW_SET_ERROR_MSG("received null pointer"); return RMW_RET_ERROR; } RMW_CHECK_TYPE_IDENTIFIERS_MATCH( node handle, node->implementation_identifier, opensplice_cpp_identifier, return RMW_RET_ERROR) DDS::DomainParticipantFactory_var dp_factory = DDS::DomainParticipantFactory::get_instance(); if (!dp_factory) { RMW_SET_ERROR_MSG("failed to get domain participant factory"); return RMW_RET_ERROR; } auto node_info = static_cast<OpenSpliceStaticNodeInfo *>(node->data); if (!node_info) { RMW_SET_ERROR_MSG("node info handle is null"); return RMW_RET_ERROR; } auto participant = static_cast<DDS::DomainParticipant *>(node_info->participant); if (!participant) { RMW_SET_ERROR_MSG("participant handle is null"); return RMW_RET_ERROR; } auto result = RMW_RET_OK; // This unregisters types and destroys topics which were shared between // publishers and subscribers and could not be cleaned up in the delete functions. if (participant->delete_contained_entities() != DDS::RETCODE_OK) { RMW_SET_ERROR_MSG("failed to delete contained entities of participant"); result = RMW_RET_ERROR; } if (dp_factory->delete_participant(participant) != DDS::RETCODE_OK) { RMW_SET_ERROR_MSG("failed to delete participant"); result = RMW_RET_ERROR; } if (node_info->publisher_listener) { RMW_TRY_DESTRUCTOR_FROM_WITHIN_FAILURE( node_info->publisher_listener->~CustomPublisherListener(), CustomPublisherListener) rmw_free(node_info->publisher_listener); node_info->publisher_listener = nullptr; } if (node_info->subscriber_listener) { RMW_TRY_DESTRUCTOR_FROM_WITHIN_FAILURE( node_info->subscriber_listener->~CustomSubscriberListener(), CustomSubscriberListener) rmw_free(node_info->subscriber_listener); node_info->subscriber_listener = nullptr; } rmw_free(node_info); node->data = nullptr; rmw_free(const_cast<char *>(node->name)); node->name = nullptr; rmw_node_free(node); return result; }