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