diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp index a42d7808284d958d965cfba0dd70aa866a47cc17..3d775f587834aa3a62fd42d1be353eb23a8fc0d4 100644 --- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp +++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp @@ -121,7 +121,7 @@ namespace armarx::plugins { ARMARX_CHECK(execId.skillId.isSkillSpecified()); - const std::unique_lock l(skillExecutionsMutex); + const std::shared_lock l(skillExecutionsMutex); if (skillExecutions.find(execId) == skillExecutions.end()) { ARMARX_WARNING << "Skill execution for skill '" + execId.skillId.toString() + @@ -137,7 +137,7 @@ namespace armarx::plugins { std::map<skills::SkillExecutionID, skills::SkillStatusUpdate> skillUpdates; - const std::scoped_lock l(skillExecutionsMutex); + const std::shared_lock l(skillExecutionsMutex); for (const auto& [key, impl] : skillExecutions) { const std::scoped_lock l2(impl.skillStatusesMutex); @@ -151,7 +151,7 @@ namespace armarx::plugins { ARMARX_CHECK(skillId.isFullySpecified()); - const std::unique_lock l(skillFactoriesMutex); + const std::shared_lock l(skillFactoriesMutex); if (skillFactories.find(skillId) == skillFactories.end()) { std::stringstream ss; @@ -175,7 +175,7 @@ namespace armarx::plugins SkillProviderComponentPlugin::getSkillDescriptions() const { std::map<skills::SkillID, skills::SkillDescription> skillDesciptions; - const std::unique_lock l(skillFactoriesMutex); + const std::shared_lock l(skillFactoriesMutex); for (const auto& [key, fac] : skillFactories) { ARMARX_CHECK(key.isFullySpecified()); @@ -215,6 +215,7 @@ namespace armarx::plugins executionRequest.parameters, executionRequest.callbackInterface)); wrapper = &it.first->second; + // ATTENTION NOT DEFINED BEHAVIOR } // async start execution. But we wait for the execution to finish at the end of this method @@ -269,6 +270,7 @@ namespace armarx::plugins executionRequest.parameters, executionRequest.callbackInterface)); wrapper = &it.first->second; + // ATTENTION NOT DEFINED BEHAVIOR } wrapper->execution = std::thread( @@ -303,7 +305,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::scoped_lock l{skillExecutionsMutex}; + std::shared_lock l{skillExecutionsMutex}; auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { @@ -329,7 +331,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::unique_lock l(skillExecutionsMutex); + std::shared_lock l(skillExecutionsMutex); auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { @@ -363,7 +365,7 @@ namespace armarx::plugins { ARMARX_CHECK(executionId.skillId.isFullySpecified()); - const std::unique_lock l(skillExecutionsMutex); + std::shared_lock l(skillExecutionsMutex); auto it = skillExecutions.find(executionId); if (it == skillExecutions.end()) { diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h index 812cc0a8814db843793038ebdd16a3a927c912cf..20ffe1fbdb75ee9f4b5831dbd406180f7acf22fc 100644 --- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.h @@ -104,10 +104,10 @@ namespace armarx::plugins skills::manager::dti::SkillManagerInterfacePrx manager; skills::provider::dti::SkillProviderInterfacePrx myPrx; - mutable std::mutex skillFactoriesMutex; + mutable std::shared_mutex skillFactoriesMutex; std::map<skills::SkillID, std::unique_ptr<skills::SkillBlueprint>> skillFactories; - mutable std::mutex skillExecutionsMutex; + mutable std::shared_mutex skillExecutionsMutex; std::map<skills::SkillExecutionID, skills::detail::SkillRuntime> skillExecutions; friend class armarx::SkillProviderComponentPluginUser;