diff --git a/src/ros_publish.cpp b/src/ros_publish.cpp index 489f5962ec5f0356c7611c8aa901aa5c109bb8c3..cef0afa558f642d92c8d0c98d84d03ff6a6766cd 100644 --- a/src/ros_publish.cpp +++ b/src/ros_publish.cpp @@ -203,7 +203,14 @@ namespace dynamicgraph void RosPublish::rm (const std::string& signal) { + if(bindedSignal_.find(signal) == bindedSignal_.end()) + return; + + //lock the mutex to avoid deleting the signal during a call to trigger + while(! mutex_.try_lock() ){} bindedSignal_.erase (signal); + signalDeregistration(signal); + mutex_.unlock(); } std::string RosPublish::list () const @@ -230,11 +237,13 @@ namespace dynamicgraph if (dt < rate_) return dummy; + while(! mutex_.try_lock() ){} for (iterator_t it = bindedSignal_.begin (); it != bindedSignal_.end (); ++it) { boost::get<1>(it->second) (t); } + mutex_.unlock(); return dummy; } diff --git a/src/ros_publish.hh b/src/ros_publish.hh index 3a6d5d426b1948ed2a8ec25c347dffba7cfa6526..5cb5ce23beb1eae6a4ccf8ee898420fb8c1d6973 100644 --- a/src/ros_publish.hh +++ b/src/ros_publish.hh @@ -5,6 +5,7 @@ # include <boost/shared_ptr.hpp> # include <boost/tuple/tuple.hpp> +# include <boost/interprocess/sync/interprocess_mutex.hpp> # include <dynamic-graph/entity.h> # include <dynamic-graph/signal-time-dependent.h> @@ -94,6 +95,7 @@ namespace dynamicgraph dynamicgraph::SignalTimeDependent<int,int> trigger_; ros::Duration rate_; ros::Time lastPublicated_; + boost::interprocess::interprocess_mutex mutex_; }; } // end of namespace dynamicgraph.