From 154edc1e992d9f4e3883edef60c160feefa685d6 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 16 Jul 2021 09:08:01 +0200
Subject: [PATCH] Lock core segment mutex in query processing

---
 .../query_proc/base/CoreSegmentQueryProcessorBase.h       | 6 +++---
 .../workingmemory/CoreSegmentQueryProcessor.cpp           | 8 ++++++++
 .../query_proc/workingmemory/CoreSegmentQueryProcessor.h  | 4 ++++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h
index d334019c4..9d7b25182 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/CoreSegmentQueryProcessorBase.h
@@ -31,9 +31,9 @@ namespace armarx::armem::base::query_proc
         using EntitySnapshotT = typename EntityT::EntitySnapshotT;
 
         using Base::process;
-        void process(_CoreSegmentT& result,
-                     const armem::query::data::CoreSegmentQuery& query,
-                     const _CoreSegmentT& coreSegment) const override
+        virtual void process(_CoreSegmentT& result,
+                             const armem::query::data::CoreSegmentQuery& query,
+                             const _CoreSegmentT& coreSegment) const override
         {
             if (auto q = dynamic_cast<const armem::query::data::core::All*>(&query))
             {
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
index 692f15aed..bda9ad04d 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.cpp
@@ -14,6 +14,14 @@ namespace armarx::armem::wm::query_proc
     CoreSegmentQueryProcessor::~CoreSegmentQueryProcessor() = default;
 
 
+    void CoreSegmentQueryProcessor::process(
+        CoreSegment& result, const armem::query::data::CoreSegmentQuery& query, const CoreSegment& coreSegment) const
+    {
+        std::scoped_lock lock(coreSegment.mutex());
+        CoreSegmentQueryProcessorBase::process(result, query, coreSegment);
+    }
+
+
     data::CoreSegment CoreSegmentQueryProcessor::processToIce(const armem::query::data::CoreSegmentQuery& query, const wm::CoreSegment& coreSegment) const
     {
         data::CoreSegment data;
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
index 8fc7e8a37..f9e1d59c9 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/workingmemory/CoreSegmentQueryProcessor.h
@@ -27,6 +27,10 @@ namespace armarx::armem::wm::query_proc
 
         using Base::process;
 
+        /// Locks the core segment, then delegates back to `CoreSegmentQueryProcessorBase`.
+        void process(CoreSegment& result,
+                     const armem::query::data::CoreSegmentQuery& query,
+                     const CoreSegment& coreSegment) const override;
 
         data::CoreSegment processToIce(const armem::query::data::CoreSegmentQuery& query, const wm::CoreSegment& coreSegment) const;
 
-- 
GitLab