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


DepMgr-C++: DependencyManager::start starts now only not started components, 
this makes it possible to add and start components when the DependencyManager 
is already started.


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

Branch: refs/heads/develop
Commit: 184497c35658294748e1a230718834f5b2019947
Parents: 0002593
Author: Erjan Altena <erjanalt...@gmail.com>
Authored: Tue Apr 17 11:26:34 2018 +0200
Committer: Erjan Altena <erjanalt...@gmail.com>
Committed: Tue Apr 17 11:26:34 2018 +0200

----------------------------------------------------------------------
 .../include/celix/dm/DependencyManager.h        | 25 ++++++++++++++++----
 .../include/celix/dm/DependencyManager_Impl.h   |  3 ++-
 2 files changed, 22 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/184497c3/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 f079b35..e51a4d7 100644
--- a/dependency_manager_cxx/include/celix/dm/DependencyManager.h
+++ b/dependency_manager_cxx/include/celix/dm/DependencyManager.h
@@ -29,6 +29,7 @@
 #include "dm_dependency_manager.h"
 
 #include <vector>
+#include <mutex>
 
 namespace celix { namespace dm {
 
@@ -44,7 +45,15 @@ namespace celix { namespace dm {
                 this->cDepMan = nullptr;
         }
 
-        DependencyManager(DependencyManager&&) = default;
+        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;
+        }
         DependencyManager& operator=(DependencyManager&&) = default;
 
         DependencyManager(const DependencyManager&) = delete;
@@ -93,9 +102,12 @@ namespace celix { namespace dm {
          * Starts the Dependency Manager
          */
         void start() {
-                for(std::unique_ptr<BaseComponent>& cmp : components)  {
-                        dependencyManager_add(cDepMan, cmp->cComponent());
+                std::lock_guard<std::mutex> lock(componentsMutex);
+                for (auto it = queuedComponents.begin(); it != 
queuedComponents.end(); ++it) {
+                        dependencyManager_add(cDepMan, (*it)->cComponent());
+                        startedComponents.push_back(std::move(*it));
                 }
+                queuedComponents.clear();
         }
 
         /**
@@ -103,12 +115,15 @@ namespace celix { namespace dm {
          */
         void stop() {
                 dependencyManager_removeAllComponents(cDepMan);
-                components.clear();
+                queuedComponents.clear();
+                startedComponents.clear();
         }
     private:
         bundle_context_pt context {nullptr};
-        std::vector<std::unique_ptr<BaseComponent>> components {};
+        std::vector<std::unique_ptr<BaseComponent>> queuedComponents {};
+        std::vector<std::unique_ptr<BaseComponent>> startedComponents {};
         dm_dependency_manager_pt cDepMan {nullptr};
+        std::mutex componentsMutex{};
     };
 
 }}

http://git-wip-us.apache.org/repos/asf/celix/blob/184497c3/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 70cbcca..5714ef0 100644
--- a/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
+++ b/dependency_manager_cxx/include/celix/dm/DependencyManager_Impl.h
@@ -25,7 +25,8 @@ Component<T>& DependencyManager::createComponent(std::string 
name) {
                         Component<T>::create(this->context) :
                         Component<T>::create(this->context, name);
     if (cmp->isValid()) {
-        this->components.push_back(std::unique_ptr<BaseComponent> {cmp});
+        std::lock_guard<std::mutex> lock(componentsMutex);
+        this->queuedComponents.push_back(std::unique_ptr<BaseComponent> {cmp});
     }
     return *cmp;
 }

Reply via email to