diff --git a/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.cpp b/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.cpp index 83f8bd2d..1d977cd3 100644 --- a/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.cpp +++ b/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.cpp @@ -53,7 +53,7 @@ NodeletPluginProvider::NodeletPluginProvider( NodeletPluginProvider::~NodeletPluginProvider() { if (ros_spin_thread_ != nullptr) { - ros_spin_thread_->abort = true; + ros_spin_thread_->abort.store(true, std::memory_order_relaxed); ros_spin_thread_->exec_.remove_node(node_); ros_spin_thread_->wait(); ros_spin_thread_->deleteLater(); @@ -69,6 +69,7 @@ void NodeletPluginProvider::unload(void * instance) } qt_gui_cpp::RosPluginlibPluginProvider::unload(instance); + instances_.remove(instance); } void NodeletPluginProvider::init_loader() @@ -95,16 +96,14 @@ void NodeletPluginProvider::init_loader() std::shared_ptr NodeletPluginProvider::create_plugin( const std::string & lookup_name, - qt_gui_cpp::PluginContext * plugin_context) + qt_gui_cpp::PluginContext * /*plugin_context*/) { init_loader(); - std::string nodelet_name = std::format("{}_{}", lookup_name, plugin_context->serialNumber()); - std::shared_ptr instance = qt_gui_cpp::RosPluginlibPluginProvider::create_plugin(lookup_name); instance->passInNode(node_); - instances_[instance.get()] = nodelet_name.c_str(); + instances_.insert(instance.get()); return instance; } @@ -135,7 +134,7 @@ NodeletPluginProvider::RosSpinThread::~RosSpinThread() = default; void NodeletPluginProvider::RosSpinThread::run() { - while (!abort) { + while (!abort.load(std::memory_order_relaxed)) { // Spin the executor exec_.spin_once(); } diff --git a/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.hpp b/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.hpp index 9efab5b0..e709b837 100644 --- a/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.hpp +++ b/rqt_gui_cpp/src/rqt_gui_cpp/nodelet_plugin_provider.hpp @@ -33,7 +33,9 @@ #ifndef RQT_GUI_CPP__NODELET_PLUGIN_PROVIDER_HPP_ #define RQT_GUI_CPP__NODELET_PLUGIN_PROVIDER_HPP_ +#include #include +#include #include #include @@ -68,7 +70,7 @@ class NodeletPluginProvider const QString & plugin_id, qt_gui_cpp::PluginContext * plugin_context, qt_gui_cpp::Plugin * plugin) override; - QMap instances_; + QSet instances_; bool loader_initialized_; @@ -83,7 +85,7 @@ class NodeletPluginProvider explicit RosSpinThread(QObject * parent = nullptr); ~RosSpinThread() override; void run() override; - bool abort; + std::atomic abort; // Create an executor that will be responsible for execution of callbacks for a set of nodes. // With this version, all callbacks will be called from within this thread (the main one). rclcpp::executors::MultiThreadedExecutor exec_;