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;