From 515753f9088f8441e0516faedf454a10d1386187 Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Fri, 24 Nov 2023 09:03:33 +0100
Subject: [PATCH] Allow the query processor to lock the core segment when
 querying data from the memory

---
 .../base/MemoryQueryProcessorBase.h           | 82 +++++++++----------
 .../libraries/armem/server/query_proc/wm/wm.h | 10 +++
 2 files changed, 51 insertions(+), 41 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h
index ae8e1ddb8..49445070a 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/base/MemoryQueryProcessorBase.h
@@ -1,12 +1,11 @@
 #pragma once
 
-#include "BaseQueryProcessorBase.h"
+#include <regex>
 
-#include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/interface/armem/query.h>
+#include <RobotAPI/libraries/armem/core/error.h>
 
-#include <regex>
-
+#include "BaseQueryProcessorBase.h"
 
 namespace armarx::armem::server::query_proc::base
 {
@@ -16,11 +15,10 @@ namespace armarx::armem::server::query_proc::base
         public BaseQueryProcessorBase<_MemoryT, _ResultMemoryT, armem::query::data::MemoryQuery>
     {
     protected:
-
-        using Base = BaseQueryProcessorBase<_MemoryT, _ResultMemoryT, armem::query::data::MemoryQuery>;
+        using Base =
+            BaseQueryProcessorBase<_MemoryT, _ResultMemoryT, armem::query::data::MemoryQuery>;
 
     public:
-
         using MemoryT = _MemoryT;
         using CoreSegmentT = typename MemoryT::CoreSegmentT;
 
@@ -31,25 +29,26 @@ namespace armarx::armem::server::query_proc::base
 
 
     public:
-
         MemoryQueryProcessorBase()
         {
         }
-        MemoryQueryProcessorBase(ChildProcessorT&& childProcessor) :
-            childProcessor(childProcessor)
+
+        MemoryQueryProcessorBase(ChildProcessorT&& childProcessor) : childProcessor(childProcessor)
         {
         }
 
-
         using Base::process;
-        ResultMemoryT process(const armem::query::data::Input& input, const MemoryT& memory) const
+
+        ResultMemoryT
+        process(const armem::query::data::Input& input, const MemoryT& memory) const
         {
             return this->process(input.memoryQueries, memory);
         }
 
-        virtual void process(ResultMemoryT& result,
-                             const armem::query::data::MemoryQuery& query,
-                             const MemoryT& memory) const override
+        virtual void
+        process(ResultMemoryT& result,
+                const armem::query::data::MemoryQuery& query,
+                const MemoryT& memory) const override
         {
             if (auto q = dynamic_cast<const armem::query::data::memory::All*>(&query))
             {
@@ -69,19 +68,19 @@ namespace armarx::armem::server::query_proc::base
             }
         }
 
-        virtual void process(ResultMemoryT& result,
-                     const armem::query::data::memory::All& query,
-                     const MemoryT& memory) const
+        virtual void
+        process(ResultMemoryT& result,
+                const armem::query::data::memory::All& query,
+                const MemoryT& memory) const
         {
             memory.forEachCoreSegment([this, &result, &query](const CoreSegmentT& coreSegment)
-            {
-                this->_processResult(result, coreSegment, query);
-            });
+                                      { this->_processResult(result, coreSegment, query); });
         }
 
-        virtual void process(ResultMemoryT& result,
-                     const armem::query::data::memory::Single& query,
-                     const MemoryT& memory) const
+        virtual void
+        process(ResultMemoryT& result,
+                const armem::query::data::memory::Single& query,
+                const MemoryT& memory) const
         {
             if (auto coreSegment = memory.findCoreSegment(query.coreSegmentName))
             {
@@ -89,32 +88,35 @@ namespace armarx::armem::server::query_proc::base
             }
         }
 
-        virtual void process(ResultMemoryT& result,
-                     const armem::query::data::memory::Regex& query,
-                     const MemoryT& memory) const
+        virtual void
+        process(ResultMemoryT& result,
+                const armem::query::data::memory::Regex& query,
+                const MemoryT& memory) const
         {
             const std::regex regex(query.coreSegmentNameRegex);
-            memory.forEachCoreSegment([this, &result, &query, &regex](const CoreSegmentT& coreSegment)
-            {
-                if (std::regex_search(coreSegment.name(), regex))
+            memory.forEachCoreSegment(
+                [this, &result, &query, &regex](const CoreSegmentT& coreSegment)
                 {
-                    this->_processResult(result, coreSegment, query);
-                }
-            });
+                    if (std::regex_search(coreSegment.name(), regex))
+                    {
+                        this->_processResult(result, coreSegment, query);
+                    }
+                });
         }
 
 
     protected:
-
-        virtual bool _processAllowed(const armem::query::data::MemoryQuery& query) const
+        virtual bool
+        _processAllowed(const armem::query::data::MemoryQuery& query) const
         {
             // always execute query. Override if you want to execute the quey only if a special condition is fulfilled (e.g. querytargets)
             return true;
         }
 
-        void _processResult(ResultMemoryT& result,
-                            const CoreSegmentT& coreSegment,
-                            const armem::query::data::MemoryQuery& query) const
+        virtual void
+        _processResult(ResultMemoryT& result,
+                       const CoreSegmentT& coreSegment,
+                       const armem::query::data::MemoryQuery& query) const
         {
             ResultCoreSegmentT* child = result.findCoreSegment(coreSegment.name());
             if (child == nullptr)
@@ -126,8 +128,6 @@ namespace armarx::armem::server::query_proc::base
 
 
     protected:
-
         ChildProcessorT childProcessor;
-
     };
-}
+} // namespace armarx::armem::server::query_proc::base
diff --git a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
index 312a39896..e5b6c3da8 100644
--- a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
+++ b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h
@@ -208,6 +208,16 @@ namespace armarx::armem::server::query_proc::wm_server
 
         using Base::process;
 
+        void
+        _processResult(ResultMemoryT& result,
+                       const CoreSegmentT& coreSegment,
+                       const armem::query::data::MemoryQuery& query) const final
+        {
+            coreSegment.doLocked([&](){
+               Base::_processResult(result, coreSegment, query);
+            });
+        }
+
     };
 
 }
-- 
GitLab