From d0d9082afe0fd04efff70b8e76685120a40408cc Mon Sep 17 00:00:00 2001 From: Mirko Waechter <mirko.waechter@kit.edu> Date: Wed, 22 Jun 2016 11:44:57 +0200 Subject: [PATCH] fixed segfault in KinematicUnitObserver --- .../RobotAPI/components/units/KinematicUnitObserver.cpp | 8 +++++++- source/RobotAPI/components/units/KinematicUnitObserver.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.cpp b/source/RobotAPI/components/units/KinematicUnitObserver.cpp index a90f70c0f..6e862edf2 100644 --- a/source/RobotAPI/components/units/KinematicUnitObserver.cpp +++ b/source/RobotAPI/components/units/KinematicUnitObserver.cpp @@ -267,9 +267,15 @@ void KinematicUnitObserver::reportJointStatuses(const NameStatusMap& jointStatus void KinematicUnitObserver::nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp, bool aValueChanged) { // ARMARX_INFO << deactivateSpam(10) << " timestamp is " << (IceUtil::Time::now() - IceUtil::Time::microSeconds(timestamp)).toMicroSecondsDouble() << " µs old"; - if (aValueChanged || initializedChannels.count(channelName) == 0) + bool newChannel; { + ScopedLock lock(initializedChannelsMutex); + newChannel = initializedChannels.count(channelName) == 0; initializedChannels.insert(channelName); + } + if (aValueChanged || newChannel) + { + boost::unordered_map< ::std::string, ::armarx::VariantBasePtr> map; if (timestamp < 0) { diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.h b/source/RobotAPI/components/units/KinematicUnitObserver.h index 31ebe7633..3d7948296 100644 --- a/source/RobotAPI/components/units/KinematicUnitObserver.h +++ b/source/RobotAPI/components/units/KinematicUnitObserver.h @@ -140,6 +140,7 @@ namespace armarx protected: void nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp, bool aValueChanged); std::set<std::string> initializedChannels; + Mutex initializedChannelsMutex; private: std::string robotNodeSetName; }; -- GitLab