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