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 <erjanalt...@gmail.com> Authored: Tue Apr 17 15:48:18 2018 +0200 Committer: Erjan Altena <erjanalt...@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;