You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by er...@apache.org on 2018/04/17 13:48:58 UTC

celix git commit: Fixed possible deadlock

Repository: celix
Updated Branches:
  refs/heads/develop 184497c35 -> 2eeadb4cc


Fixed possible deadlock


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/2eeadb4c
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/2eeadb4c
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/2eeadb4c

Branch: refs/heads/develop
Commit: 2eeadb4cc61362b7daba407d1947247e7ddb80c8
Parents: 184497c
Author: Erjan Altena <er...@gmail.com>
Authored: Tue Apr 17 15:48:18 2018 +0200
Committer: Erjan Altena <er...@gmail.com>
Committed: Tue Apr 17 15:48:18 2018 +0200

----------------------------------------------------------------------
 .../include/celix/dm/DependencyManager.h        | 34 +++++++++++++-------
 .../include/celix/dm/DependencyManager_Impl.h   |  2 +-
 2 files changed, 23 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/2eeadb4c/dependency_manager_cxx/include/celix/dm/DependencyManager.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/DependencyManager.h b/dependency_manager_cxx/include/celix/dm/DependencyManager.h
index e51a4d7..afafacc 100644
--- a/dependency_manager_cxx/include/celix/dm/DependencyManager.h
+++ b/dependency_manager_cxx/include/celix/dm/DependencyManager.h
@@ -46,13 +46,13 @@ namespace celix { namespace dm {
         }
 
         DependencyManager(DependencyManager&& mgr) : componentsMutex{} {
-                std::lock_guard<std::mutex> lock(componentsMutex);
-                mgr.context = context;
-                mgr.queuedComponents = std::move(queuedComponents);
-                mgr.startedComponents = std::move(startedComponents);
-                mgr.cDepMan = cDepMan;
-                cDepMan = nullptr;
-                context = nullptr;
+                std::lock_guard<std::recursive_mutex> lock(this->componentsMutex);
+                mgr.context = this->context;
+                mgr.queuedComponents = std::move(this->queuedComponents);
+                mgr.startedComponents = std::move(this->startedComponents);
+                mgr.cDepMan = this->cDepMan;
+                this->cDepMan = nullptr;
+                this->context = nullptr;
         }
         DependencyManager& operator=(DependencyManager&&) = default;
 
@@ -102,12 +102,22 @@ namespace celix { namespace dm {
          * Starts the Dependency Manager
          */
         void start() {
-                std::lock_guard<std::mutex> lock(componentsMutex);
-                for (auto it = queuedComponents.begin(); it != queuedComponents.end(); ++it) {
+                std::vector<std::unique_ptr<BaseComponent>> toBeStartedComponents {};
+                {
+                        std::lock_guard<std::recursive_mutex> lock(componentsMutex);
+                        for (auto it = queuedComponents.begin(); it != queuedComponents.end(); ++it) {
+                                toBeStartedComponents.push_back(std::move(*it));
+                        }
+                        queuedComponents.clear();
+                }
+                for (auto it = toBeStartedComponents.begin(); it != toBeStartedComponents.end(); ++it) {
+
                         dependencyManager_add(cDepMan, (*it)->cComponent());
-                        startedComponents.push_back(std::move(*it));
+                        {
+                                std::lock_guard<std::recursive_mutex> lock(componentsMutex);
+                                startedComponents.push_back(std::move(*it));
+                        }
                 }
-                queuedComponents.clear();
         }
 
         /**
@@ -123,7 +133,7 @@ namespace celix { namespace dm {
         std::vector<std::unique_ptr<BaseComponent>> queuedComponents {};
         std::vector<std::unique_ptr<BaseComponent>> startedComponents {};
         dm_dependency_manager_pt cDepMan {nullptr};
-        std::mutex componentsMutex{};
+        std::recursive_mutex componentsMutex{};
     };
 
 }}

http://git-wip-us.apache.org/repos/asf/celix/blob/2eeadb4c/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h b/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
index 5714ef0..82e0802 100644
--- a/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
+++ b/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
@@ -25,7 +25,7 @@ Component<T>& DependencyManager::createComponent(std::string name) {
                         Component<T>::create(this->context) :
                         Component<T>::create(this->context, name);
     if (cmp->isValid()) {
-        std::lock_guard<std::mutex> lock(componentsMutex);
+        std::lock_guard<std::recursive_mutex> lock(componentsMutex);
         this->queuedComponents.push_back(std::unique_ptr<BaseComponent> {cmp});
     }
     return *cmp;