From 62ddeb169ed5f7ec4a2f5a11d686f4705475d411 Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Fri, 20 Oct 2023 08:56:49 +0200
Subject: [PATCH] fix race condition when using callbacks

fix hello world skill parameters type
---
 .../SkillProviderExample/HelloWorld.cpp       |  6 +--
 .../SkillProviderExample/Incomplete.cpp       |  1 -
 .../RobotAPI/libraries/skills/core/Skill.cpp  |  1 -
 .../skills/provider/SimpleSpecializedSkill.h  | 41 ++++++++-----------
 .../provider/SkillProviderComponentPlugin.cpp | 10 ++---
 .../detail/SkillImplementationWrapper.cpp     |  2 +-
 6 files changed, 23 insertions(+), 38 deletions(-)

diff --git a/source/RobotAPI/components/skills/SkillProviderExample/HelloWorld.cpp b/source/RobotAPI/components/skills/SkillProviderExample/HelloWorld.cpp
index 6779f1d6a..d57f66c3a 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/HelloWorld.cpp
+++ b/source/RobotAPI/components/skills/SkillProviderExample/HelloWorld.cpp
@@ -27,7 +27,7 @@ namespace armarx::skills::provider
                                 .description = "This skill logs a message on ARMARX_IMPORTANT",
                                 .rootProfileDefaults = root_profile_params.toAron(),
                                 .timeout = armarx::core::time::Duration::MilliSeconds(1000),
-                                .resultType =
+                                .parametersType =
                                     armarx::skills::Example::HelloWorldAcceptedType::ToAronType()};
     }
 
@@ -40,10 +40,6 @@ namespace armarx::skills::provider
                                 in.parameters.toAron())
                                 .dump(2)
                          << "\n"
-                         << "Type fulfilled? "
-                         << parameters->fullfillsType(
-                                armarx::skills::Example::HelloWorldAcceptedType::ToAronType())
-                         << "\n"
                          << "(executed at: " << IceUtil::Time::now() << ")";
         return {TerminatedSkillStatus::Succeeded, nullptr};
     }
diff --git a/source/RobotAPI/components/skills/SkillProviderExample/Incomplete.cpp b/source/RobotAPI/components/skills/SkillProviderExample/Incomplete.cpp
index 264876a7e..8d6b4f277 100644
--- a/source/RobotAPI/components/skills/SkillProviderExample/Incomplete.cpp
+++ b/source/RobotAPI/components/skills/SkillProviderExample/Incomplete.cpp
@@ -48,7 +48,6 @@ namespace armarx::skills::provider
     IncompleteSkill::main(const MainInput& in)
     {
         auto s = HelloWorldSkill();
-        s.setParameters(in.parameters);
         return s.mainOfSkill();
     }
 } // namespace armarx::skills::provider
diff --git a/source/RobotAPI/libraries/skills/core/Skill.cpp b/source/RobotAPI/libraries/skills/core/Skill.cpp
index 34895c906..907881580 100644
--- a/source/RobotAPI/libraries/skills/core/Skill.cpp
+++ b/source/RobotAPI/libraries/skills/core/Skill.cpp
@@ -70,7 +70,6 @@ namespace armarx
         aron::data::DictPtr
         Skill::getParameters() const
         {
-            std::scoped_lock l(this->parametersMutex);
             return this->parameters;
         }
 
diff --git a/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h
index b14531195..babdb0189 100644
--- a/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h
+++ b/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h
@@ -1,16 +1,16 @@
 #pragma once
 
-#include <RobotAPI/libraries/skills/core/Skill.h>
+#include <RobotAPI/libraries/skills/provider/SpecializedSkill.h>
 
 namespace armarx
 {
     namespace skills
     {
         template <class AronT>
-        class SimpleSpecializedSkill : public Skill
+        class SimpleSpecializedSkill : public SpecializedSkill<AronT>
         {
         public:
-            using Base = Skill;
+            using Base = SpecializedSkill<AronT>;
             using ParamType = AronT;
 
             using Base::Base;
@@ -25,7 +25,7 @@ namespace armarx
             {
                 std::string executorName;
                 AronT parameters;
-                CallbackT callback;
+                Skill::CallbackT callback;
             };
 
             struct SpecializedExitInput
@@ -37,61 +37,52 @@ namespace armarx
 
         protected:
             // legacy methods
-            virtual InitResult
+            virtual Skill::InitResult
             init(const SpecializedInitInput& in)
             {
-                return InitResult{.status = TerminatedSkillStatus::Succeeded};
+                return Skill::InitResult{.status = TerminatedSkillStatus::Succeeded};
             }
 
-            virtual MainResult
+            virtual Skill::MainResult
             main(const SpecializedMainInput& in)
             {
-                ARMARX_IMPORTANT << "Dummy executing skill '" << description.skillId
+                ARMARX_IMPORTANT << "Dummy executing skill '" << this->description.skillId
                                  << "'. Please overwrite this method.";
                 return Skill::MainResult{.status = TerminatedSkillStatus::Succeeded,
                                          .data = nullptr};
             }
 
-            virtual ExitResult
+            virtual Skill::ExitResult
             exit(const SpecializedExitInput& in)
             {
-                return ExitResult{.status = TerminatedSkillStatus::Succeeded};
+                return Skill::ExitResult{.status = TerminatedSkillStatus::Succeeded};
             }
 
-            InitResult
+            Skill::InitResult
             init() final
             {
-                AronT p;
-                p.fromAron(this->parameters);
-
                 SpecializedInitInput i;
                 i.executorName = this->executorName;
-                i.parameters = p;
+                i.parameters = this->parameters;
                 return this->init(i);
             }
 
-            MainResult
+            Skill::MainResult
             main() final
             {
-                AronT p;
-                p.fromAron(this->parameters);
-
                 SpecializedMainInput i;
                 i.executorName = this->executorName;
                 i.callback = this->callback;
-                i.parameters = p;
+                i.parameters = this->parameters;
                 return this->main(i);
             }
 
-            ExitResult
+            Skill::ExitResult
             exit() final
             {
-                AronT p;
-                p.fromAron(this->parameters);
-
                 SpecializedExitInput i;
                 i.executorName = this->executorName;
-                i.parameters = p;
+                i.parameters = this->parameters;
                 return this->exit(i);
             }
         };
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
index e9e86b054..a42d78082 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
@@ -233,11 +233,11 @@ namespace armarx::plugins
             wrapper->execution.join();
 
             // tidy up map of executions
-            const std::unique_lock l2{skillExecutionsMutex};
-            if (auto it = skillExecutions.find(executionId); it != skillExecutions.end())
-            {
-                skillExecutions.erase(it);
-            }
+            //            const std::unique_lock l2{skillExecutionsMutex};
+            //            if (auto it = skillExecutions.find(executionId); it != skillExecutions.end())
+            //            {
+            //                skillExecutions.erase(it);
+            //            }
         }
         return ret;
     }
diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
index b9529ee7f..60db0fa91 100644
--- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
+++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp
@@ -127,7 +127,7 @@ namespace armarx
                                      { updateStatus(s, d); });
 
             // set initial parameters that were attached to the execution request (only add as we are not sure whether some updates already arrived)
-            skill->updateParameters(initial_aron_params);
+            this->updateSkillParameters(initial_aron_params);
 
             auto makeAbortedResult = [&](const std::string& message)
             {
-- 
GitLab