From 040ec7fed084fbb82618dcfc00abef596c9db3a1 Mon Sep 17 00:00:00 2001
From: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
Date: Wed, 2 Oct 2024 16:16:50 +0200
Subject: [PATCH] fix skill memory error, where the skillProvidersMutex was
 unlocked multiple time. Its now relocked in the for loops

clang


Signed-off-by: Fabian Peller-Konrad <fabian.peller-konrad@kit.edu>
---
 .../manager/SkillManagerComponentPlugin.cpp   | 57 ++++++++++---------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
index fbecf04e5..0f53619d6 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
@@ -96,8 +96,6 @@ namespace armarx::plugins
         {
             provderId = getFirstProviderNameThatHasSkill(executionRequest.skillId);
         }
-
-
         if (auto it = skillProviderMap.find(provderId); it != skillProviderMap.end())
         {
             const auto& provider = it->second;
@@ -132,7 +130,7 @@ namespace armarx::plugins
                     skills::SkillStatusUpdate::FromIce(provider_statusUpdate_ice, provderId);
                 return statusUpdate;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -201,7 +199,7 @@ namespace armarx::plugins
                 executionId.skillId.providerId = provderId;
                 return executionId;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -249,7 +247,7 @@ namespace armarx::plugins
                 auto r = provider->end_updateSkillParameters(async);
                 return r.success;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -294,7 +292,7 @@ namespace armarx::plugins
                 auto r = provider->end_abortSkill(async);
                 return r.success;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -337,7 +335,7 @@ namespace armarx::plugins
                 auto r = provider->end_abortSkillAsync(async);
                 return r.success;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -394,7 +392,7 @@ namespace armarx::plugins
                     skills::SkillDescription::FromIce(provider_desc_ice.value(), providerId);
                 return desc;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -431,6 +429,7 @@ namespace armarx::plugins
                 auto async = provider->begin_getSkillDescriptions();
                 l.unlock();
                 auto m = provider->end_getSkillDescriptions(async);
+                l.lock();
 
                 for (const auto& [provider_skillId_ice, skillDescription_ice] : m)
                 {
@@ -441,7 +440,7 @@ namespace armarx::plugins
 
                 ++it;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -497,7 +496,7 @@ namespace armarx::plugins
                     provider_statusUpdate_ice.value(), providerId);
                 return statusUpdate;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 l.lock();
 
@@ -534,6 +533,7 @@ namespace armarx::plugins
                 auto async = provider->begin_getSkillExecutionStatuses();
                 l.unlock(); // allow parallel e.g. stopping. Otherwise the manager would lock himself in nested calls
                 auto m = provider->end_getSkillExecutionStatuses(async);
+                l.lock();
 
                 for (const auto& [provider_executionId_ice, provider_statusUpdate_ice] : m)
                 {
@@ -544,7 +544,7 @@ namespace armarx::plugins
                 }
                 it++;
             }
-            catch (const std::exception &e)
+            catch (const std::exception& e)
             {
                 if (auto _it = handleExceptionNonLocking(__PRETTY_FUNCTION__, e, providerId))
                 {
@@ -555,32 +555,37 @@ namespace armarx::plugins
         return ret;
     }
 
-    std::optional<std::map<skills::ProviderID, skills::provider::dti::SkillProviderInterfacePrx>::iterator>
-    SkillManagerComponentPlugin::handleExceptionNonLocking(
-        const char* funcName, const std::exception& e, skills::ProviderID providerId, bool eraseSkillProvider)
+    std::optional<
+        std::map<skills::ProviderID, skills::provider::dti::SkillProviderInterfacePrx>::iterator>
+    SkillManagerComponentPlugin::handleExceptionNonLocking(const char* funcName,
+                                                           const std::exception& e,
+                                                           skills::ProviderID providerId,
+                                                           bool eraseSkillProvider)
     {
         // NON LOCKING! WE ASSERT THAT THE CALLER HOLDS LOCK
-        if (auto it = skillProviderMap.find(providerId); eraseSkillProvider and it != skillProviderMap.end())
+        if (auto it = skillProviderMap.find(providerId);
+            eraseSkillProvider and it != skillProviderMap.end())
         {
-            ARMARX_WARNING << funcName
-                        << ": Found disconnected or buggy skill provider '" << providerId
-                        << "' during execution. Removing it from skills. "
-                        << "Error: " << e.what();
+            ARMARX_WARNING << funcName << ": Found disconnected or buggy skill provider '"
+                           << providerId << "' during execution. Removing it from skills. "
+                           << "Error: " << e.what();
             return skillProviderMap.erase(it);
         }
         else
         {
-            ARMARX_WARNING << funcName
-                        << ": Found disconnected or buggy skill provider '" << providerId
-                        << "' during execution. However, it already got removed... "
-                        << "Error: " << e.what();
+            ARMARX_WARNING << funcName << ": Found disconnected or buggy skill provider '"
+                           << providerId
+                           << "' during execution. However, it already got removed... "
+                           << "Error: " << e.what();
             return std::nullopt;
         }
     }
 
-    void 
-    SkillManagerComponentPlugin::handleExceptionNonLockingThrow(
-        const char* funcName, const std::exception& e, skills::ProviderID providerId, bool eraseSkillProvider)
+    void
+    SkillManagerComponentPlugin::handleExceptionNonLockingThrow(const char* funcName,
+                                                                const std::exception& e,
+                                                                skills::ProviderID providerId,
+                                                                bool eraseSkillProvider)
     {
         // NON LOCKING! WE ASSERT THAT THE CALLER HOLDS LOCK
         handleExceptionNonLocking(funcName, e, providerId, eraseSkillProvider);
-- 
GitLab