diff --git a/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp b/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp index b02c300..63fc5e5 100644 --- a/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp +++ b/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp @@ -80,29 +80,16 @@ public: /** * @brief Default destructor. */ - ~GraphManager() + ~GraphManager() = default; + + void stop() { - graphCache_.clear_on_change_callback(); - - exit = true; - cv_.notify_one(); - if (microros_graph_publisher_.joinable()) { + exit = true; + cv_.notify_one(); microros_graph_publisher_.join(); } - - subscriber_->delete_datareader(ros_discovery_datareader_); - publisher_->delete_datawriter(ros_to_microros_graph_datawriter_); - - participant_->delete_subscriber(subscriber_); - participant_->delete_publisher(publisher_); - - // Delete topics - participant_->delete_topic(ros_discovery_topic_); - participant_->delete_topic(ros_to_microros_graph_topic_); - - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant_); } /** @@ -302,11 +289,11 @@ private: eprosima::fastdds::dds::DataWriterQos datawriter_qos_; rmw_dds_common::GraphCache graphCache_; - std::unique_ptr participant_listener_; - std::unique_ptr datareader_listener_; + ParticipantListener participant_listener_; + DatareaderListener datareader_listener_; - std::unique_ptr participant_info_typesupport_; - std::unique_ptr microros_graph_info_typesupport_; + eprosima::fastdds::dds::TypeSupport participant_info_typesupport_; + eprosima::fastdds::dds::TypeSupport microros_graph_info_typesupport_; eprosima::fastdds::dds::DomainParticipant* participant_; eprosima::fastdds::dds::Publisher* publisher_; eprosima::fastdds::dds::Subscriber* subscriber_; diff --git a/micro_ros_agent/src/agent/Agent.cpp b/micro_ros_agent/src/agent/Agent.cpp index f8ca3fe..355c797 100644 --- a/micro_ros_agent/src/agent/Agent.cpp +++ b/micro_ros_agent/src/agent/Agent.cpp @@ -35,8 +35,6 @@ bool Agent::create( int argc, char** argv) { - stop(); - bool result = xrce_dds_agent_instance_.create(argc, argv); if (result && !initialized) @@ -190,22 +188,21 @@ void Agent::run() void Agent::stop() { xrce_dds_agent_instance_.stop(); - graph_manager_map_.clear(); + + for (auto & element : graph_manager_map_) + { + element.second.stop(); + } } -std::shared_ptr Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id) +graph_manager::GraphManager* Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id) { auto it = graph_manager_map_.find(domain_id); if (it != graph_manager_map_.end()) { - return it->second; + return &it->second; }else{ - return graph_manager_map_.insert( - std::make_pair( - domain_id, - std::make_shared(domain_id) - ) - ).first->second; + return &graph_manager_map_.emplace(domain_id, domain_id).first->second; } } diff --git a/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp b/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp index b4c82c7..e8c87c2 100644 --- a/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp +++ b/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp @@ -28,14 +28,14 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) , mtx_() , cv_() , graphCache_() - , participant_listener_(std::make_unique(this)) - , datareader_listener_(std::make_unique(this)) - , participant_info_typesupport_(std::make_unique< - eprosima::fastdds::dds::TypeSupport>(new graph_manager::ParticipantEntitiesInfoTypeSupport())) - , microros_graph_info_typesupport_(std::make_unique< - eprosima::fastdds::dds::TypeSupport>(new graph_manager::MicrorosGraphInfoTypeSupport())) + , participant_listener_(this) + , datareader_listener_(this) + , participant_info_typesupport_() + , microros_graph_info_typesupport_() { eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles(); + participant_info_typesupport_ = (eprosima::fastdds::dds::TypeSupport) new graph_manager::ParticipantEntitiesInfoTypeSupport(); + microros_graph_info_typesupport_ = (eprosima::fastdds::dds::TypeSupport) new graph_manager::MicrorosGraphInfoTypeSupport(); // Create DomainParticipant eprosima::fastdds::dds::DomainParticipantQos participant_qos = @@ -55,11 +55,11 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) eprosima::fastdds::dds::StatusMask par_mask = eprosima::fastdds::dds::StatusMask::none(); participant_ = eprosima::fastdds::dds::DomainParticipantFactory::get_instance()-> - create_participant(domain_id_, participant_qos, participant_listener_.get(), par_mask); + create_participant(domain_id_, participant_qos, &participant_listener_, par_mask); // Register participant within typesupport - participant_->register_type(*participant_info_typesupport_); - participant_->register_type(*microros_graph_info_typesupport_); + participant_->register_type(participant_info_typesupport_); + participant_->register_type(microros_graph_info_typesupport_); // Create publisher publisher_ = participant_->create_publisher( @@ -71,11 +71,11 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) // Create topics ros_discovery_topic_ = participant_->create_topic("ros_discovery_info", - participant_info_typesupport_->get_type_name(), + participant_info_typesupport_.get_type_name(), eprosima::fastdds::dds::TOPIC_QOS_DEFAULT); ros_to_microros_graph_topic_ = participant_->create_topic("ros_to_microros_graph", - microros_graph_info_typesupport_->get_type_name(), + microros_graph_info_typesupport_.get_type_name(), eprosima::fastdds::dds::TOPIC_QOS_DEFAULT); // Create datawriters @@ -116,7 +116,7 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) ros_discovery_datareader_ = subscriber_->create_datareader(ros_discovery_topic_, - datareader_qos, datareader_listener_.get()); + datareader_qos, &datareader_listener_); // Set graph cache on change callback function graphCache_.set_on_change_callback([this]()