diff --git a/include/network_bridge/network_bridge.hpp b/include/network_bridge/network_bridge.hpp index 5073c18..91efc82 100644 --- a/include/network_bridge/network_bridge.hpp +++ b/include/network_bridge/network_bridge.hpp @@ -64,6 +64,14 @@ class NetworkBridge : public rclcpp::Node */ virtual void initialize(); + /** + * @brief Destroy the objects created by the bridge + * + * It should be called once spinning is over, and before the shared pointer is reset, to + * make sure the garbage collector can run + */ + virtual void shutdown(); + protected: /** * @brief Loads default parameters and creates subsciption managers for each topic. diff --git a/src/network_bridge.cpp b/src/network_bridge.cpp index f86a406..79d63dc 100644 --- a/src/network_bridge.cpp +++ b/src/network_bridge.cpp @@ -43,13 +43,7 @@ NetworkBridge::NetworkBridge(const std::string & node_name) NetworkBridge::~NetworkBridge() { - network_interface_->close(); - network_interface_.reset(); - - network_check_timer_.reset(); - sub_mgrs_.clear(); - timers_.clear(); - publishers_.clear(); + shutdown(); } void NetworkBridge::initialize() @@ -59,6 +53,19 @@ void NetworkBridge::initialize() network_interface_->open(); } +void NetworkBridge::shutdown() +{ + if (network_interface_) { + network_interface_->close(); + } + network_interface_.reset(); + + network_check_timer_.reset(); + sub_mgrs_.clear(); + timers_.clear(); + publishers_.clear(); +} + void NetworkBridge::load_parameters() { this->declare_parameter( @@ -422,6 +429,7 @@ int main(int argc, char ** argv) node->initialize(); rclcpp::spin(node); + node->shutdown(); node.reset(); rclcpp::shutdown(); diff --git a/src/network_interfaces/tcp_interface.cpp b/src/network_interfaces/tcp_interface.cpp index a77bbbe..ef9d4c8 100644 --- a/src/network_interfaces/tcp_interface.cpp +++ b/src/network_interfaces/tcp_interface.cpp @@ -102,11 +102,13 @@ void TcpInterface::close() try { packet_thread_.join(); } catch (std::system_error &) { + // the thread was not started } io_context_.stop(); try { io_thread_.join(); } catch (std::system_error &) { + // the thread was not started } } diff --git a/src/network_interfaces/udp_interface.cpp b/src/network_interfaces/udp_interface.cpp index 46a4659..9b571d4 100644 --- a/src/network_interfaces/udp_interface.cpp +++ b/src/network_interfaces/udp_interface.cpp @@ -59,7 +59,11 @@ void UdpInterface::open() void UdpInterface::close() { io_context_.stop(); - io_thread_.join(); + try { + io_thread_.join(); + } catch (std::system_error &) { + // the thread was not started + } } void UdpInterface::load_parameters()