diff --git a/ros1_foxglove_bridge/src/service_utils.cpp b/ros1_foxglove_bridge/src/service_utils.cpp index 0403ae0..0cc47ce 100644 --- a/ros1_foxglove_bridge/src/service_utils.cpp +++ b/ros1_foxglove_bridge/src/service_utils.cpp @@ -22,7 +22,7 @@ std::string retrieveServiceType(const std::string& serviceName, std::chrono::mil auto future = promise.get_future(); link->getConnection()->setHeaderReceivedCallback( - [&promise](const ros::ConnectionPtr&, const ros::Header& header) { + [&promise](const ros::ConnectionPtr& conn, const ros::Header& header) { std::string serviceType; if (header.getValue("type", serviceType)) { promise.set_value(serviceType); @@ -30,10 +30,15 @@ std::string retrieveServiceType(const std::string& serviceName, std::chrono::mil promise.set_exception(std::make_exception_ptr( std::runtime_error("Key 'type' not found in service connection header"))); } + // Close connection since we don't need it any more. + conn->drop(ros::Connection::DropReason::Destructing); return true; }); if (future.wait_for(timeout) != std::future_status::ready) { + // Drop connection here, removes the link from the service manager instance and avoids + // that the header-received callback is called after the promise has already been destroyed. + link->getConnection()->drop(ros::Connection::DropReason::Destructing); throw std::runtime_error("Timed out when retrieving service type"); }