From 23f4e131fcac4b9edcd66efab13f40f812622e81 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 6 Nov 2023 16:42:48 +0100
Subject: [PATCH] Remove mutex, make SimpleReaderBase copy-able. Set default
 properties when used without registerPropertyDefinitions().

---
 .../armem/client/util/SimpleReaderBase.cpp    | 34 ++++++++++++-------
 .../armem/client/util/SimpleReaderBase.h      | 13 ++-----
 2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.cpp b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.cpp
index e14ce8848..650eae74f 100644
--- a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.cpp
+++ b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.cpp
@@ -17,21 +17,25 @@ namespace armarx::armem::client::util
 
         const std::string prefix = propertyPrefix();
 
-        props = defaultProperties();
+        if (not props.has_value())
+        {
+            props = defaultProperties();
+        }
 
-        def->optional(props.memoryName, prefix + "Memory");
-        def->optional(props.coreSegmentName, prefix + "CoreSegment");
+        def->optional(props->memoryName, prefix + "Memory");
+        def->optional(props->coreSegmentName, prefix + "CoreSegment");
     }
 
     void
     SimpleReaderBase::connect(armarx::armem::client::MemoryNameSystem& mns)
     {
         // Wait for the memory to become available and add it as dependency.
-        ARMARX_IMPORTANT << "SimpleReaderBase: Waiting for memory '" << props.memoryName << "' ...";
+        ARMARX_IMPORTANT << "SimpleReaderBase: Waiting for memory '" << properties().memoryName
+                         << "' ...";
         try
         {
-            memoryReaderClient = mns.useReader(MemoryID().withMemoryName(props.memoryName));
-            ARMARX_IMPORTANT << "SimpleReaderBase: Connected to memory '" << props.memoryName
+            memoryReaderClient = mns.useReader(MemoryID().withMemoryName(properties().memoryName));
+            ARMARX_IMPORTANT << "SimpleReaderBase: Connected to memory '" << properties().memoryName
                              << "'";
         }
         catch (const armem::error::CouldNotResolveMemoryServer& e)
@@ -41,12 +45,6 @@ namespace armarx::armem::client::util
         }
     }
 
-    std::mutex&
-    SimpleReaderBase::memoryReaderMutex()
-    {
-        return memoryMutex;
-    }
-
     const armem::client::Reader&
     SimpleReaderBase::memoryReader() const
     {
@@ -56,7 +54,17 @@ namespace armarx::armem::client::util
     const SimpleReaderBase::Properties&
     SimpleReaderBase::properties() const
     {
-        return props;
+        if (not props.has_value())
+        {
+            const_cast<std::optional<Properties>&>(props) = defaultProperties();
+        }
+        return props.value();
+    }
+
+    void
+    SimpleReaderBase::setProperties(const Properties& p)
+    {
+        props = p;
     }
 
 } // namespace armarx::armem::client::util
diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
index 2b6371937..3e8395680 100644
--- a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
+++ b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <mutex>
+#include <optional>
 
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 
@@ -53,25 +53,18 @@ namespace armarx::armem::client::util
         virtual void connect(armarx::armem::client::MemoryNameSystem& mns);
 
         const Properties& properties() const;
-
-        void
-        setProperties(const Properties& p)
-        {
-            props = p;
-        }
+        void setProperties(const Properties& p);
 
     protected:
         virtual std::string propertyPrefix() const = 0;
         virtual Properties defaultProperties() const = 0;
 
-        std::mutex& memoryReaderMutex();
         const armem::client::Reader& memoryReader() const;
 
     private:
-        Properties props;
+        std::optional<Properties> props;
 
         armem::client::Reader memoryReaderClient;
-        std::mutex memoryMutex;
     };
 
 } // namespace armarx::armem::client::util
-- 
GitLab