From 9fdc2b6235e63a479e3aafdba16bda07977e1dd6 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 16 Jul 2021 09:07:47 +0200
Subject: [PATCH] Lock core segment mutex in Memory::update()

---
 .../libraries/armem/core/base/MemoryBase.h    |  2 +-
 .../armem/core/workingmemory/Memory.cpp       | 22 +++++++++++++++++++
 .../armem/core/workingmemory/Memory.h         |  4 ++++
 3 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
index 69cd01fc1..5fe6f875a 100644
--- a/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/MemoryBase.h
@@ -238,7 +238,7 @@ namespace armarx::armem::base
          * @param update The update.
          * @return The resulting entity snapshot's ID.
          */
-        UpdateResult update(const EntityUpdate& update)
+        virtual UpdateResult update(const EntityUpdate& update)
         {
             this->_checkContainerName(update.entityID.memoryName, this->name());
 
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
index 3d2efd224..623858a44 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.cpp
@@ -3,6 +3,28 @@
 
 namespace armarx::armem::wm
 {
+
+    Memory::Base::UpdateResult Memory::update(const EntityUpdate& update)
+    {
+        this->_checkContainerName(update.entityID.memoryName, this->name());
+
+        auto it = this->_container.find(update.entityID.coreSegmentName);
+        if (it != this->_container.end())
+        {
+            Base::UpdateResult ret;
+            {
+                std::scoped_lock lock(it->second.mutex());
+                ret = it->second.update(update);
+            }
+            ret.memoryUpdateType = UpdateType::UpdatedExisting;
+            return ret;
+        }
+        else
+        {
+            throw armem::error::MissingEntry::create<CoreSegment>(update.entityID.coreSegmentName, *this);
+        }
+    }
+
     Commit Memory::toCommit() const
     {
         Commit c;
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
index 3c64c0841..b2db9f7bc 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/Memory.h
@@ -27,6 +27,10 @@ namespace armarx::armem::wm
         Memory& operator=(const Memory& other) = default;
         Memory& operator=(Memory&& other) = default;
 
+
+        virtual Base::UpdateResult update(const EntityUpdate& update) override;
+
+
         /**
          * @brief Convert the content of this memory into a commit
          * @return The resulting commit
-- 
GitLab