diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 35165fb63bd5226bdbb68b809cbb65ec6999de84..f4b2551ae1c5192ed836f1182c129aefda965e13 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -144,7 +144,7 @@ namespace armarx::armem::server MemoryToIceAdapter::commit(const armem::Commit& commit) { std::vector<data::MemoryID> updatedIDs; - const bool publishUpdates = memoryListenerTopic; + const bool publishUpdates = bool(memoryListenerTopic); CommitResult commitResult; for (const EntityUpdate& update : commit.updates) @@ -152,6 +152,7 @@ namespace armarx::armem::server EntityUpdateResult& result = commitResult.results.emplace_back(); try { + // update() will lock core segment mutexes auto updateResult = workingMemory->update(update); result.success = true; @@ -202,29 +203,27 @@ namespace armarx::armem::server { ARMARX_CHECK_NOT_NULL(workingMemory); - armem::wm::query_proc::MemoryQueryProcessor wm_processor( - input.withData ? armem::DataMode::WithData - : armem::DataMode::NoData); - - armem::query::data::Result result; - wm::Memory wm_result = wm_processor.process(input, *workingMemory, /* execute if: */ { query::data::QueryTarget::WM }); - - armem::ltm::query_proc::MemoryQueryProcessor ltm_processor; - ltm::Memory ltm_result = ltm_processor.process(input, *longtermMemory, /* execute if: */ { query::data::QueryTarget::LTM }); + // Core segment processors will aquire the core segment locks. + armem::wm::query_proc::MemoryQueryProcessor wmProcessor( + input.withData ? armem::DataMode::WithData : armem::DataMode::NoData); + wm::Memory wmResult = wmProcessor.process(input, *workingMemory, /* execute if: */ { query::data::QueryTarget::WM }); + armem::ltm::query_proc::MemoryQueryProcessor ltmProcessor; + ltm::Memory ltmResult = ltmProcessor.process(input, *longtermMemory, /* execute if: */ { query::data::QueryTarget::LTM }); - if (ltm_result.hasData()) + armem::query::data::Result result; + if (ltmResult.hasData()) { // ATTENTION: This code block moves data from LTM back into WM. // However, since some segments are constrained, the WM might send data back to LTM. // This may also affect the data returned by the current query. // However, this is expected behavior, since we copy the data in the processor (copyEmpty) we can safely return the copy and // remove the original memory reference from WM here. - wm::Memory ltm_converted = ltm_result.convert(); - wm_result.append(ltm_converted); + wm::Memory ltmConverted = ltmResult.convert(); + wmResult.append(ltmConverted); // query again to limit output size (TODO: Skip if querytype is all) - wm::Memory merged_result = wm_processor.process(input, wm_result); + wm::Memory merged_result = wmProcessor.process(input, wmResult); result.memory = toIce<data::MemoryPtr>(merged_result); // also move results of ltm to wm @@ -235,7 +234,7 @@ namespace armarx::armem::server } else { - result.memory = toIce<data::MemoryPtr>(wm_result); + result.memory = toIce<data::MemoryPtr>(wmResult); } result.success = true; @@ -247,6 +246,13 @@ namespace armarx::armem::server return result; } + + client::QueryResult MemoryToIceAdapter::query(const client::QueryInput& input) + { + return client::QueryResult::fromIce(query(input.toIce())); + } + + // LTM LOADING FROM LTM query::data::Result MemoryToIceAdapter::load(const armem::query::data::Input& query) { @@ -257,6 +263,7 @@ namespace armarx::armem::server return output; } + // LTM STORING data::StoreResult MemoryToIceAdapter::store(const armem::data::StoreInput& input) { @@ -284,9 +291,6 @@ namespace armarx::armem::server return output; } - client::QueryResult MemoryToIceAdapter::query(const client::QueryInput& input) - { - return client::QueryResult::fromIce(query(input.toIce())); - } + }