You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2021/01/17 18:16:08 UTC

[celix] branch feature/refactor_c_dep_man_service_trackers updated: Adds mutex usage to C++ dm conponent.

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/refactor_c_dep_man_service_trackers
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/feature/refactor_c_dep_man_service_trackers by this push:
     new 63cd8b7  Adds mutex usage to C++ dm conponent.
63cd8b7 is described below

commit 63cd8b7405980140a2964ea97bf7bc88e066e798
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Sun Jan 17 19:15:55 2021 +0100

    Adds mutex usage to C++ dm conponent.
---
 libs/framework/include/celix/dm/Component.h      | 24 +++++++++++++++++++-----
 libs/framework/include/celix/dm/Component_Impl.h | 24 ++++++++++++++++++++----
 2 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/libs/framework/include/celix/dm/Component.h b/libs/framework/include/celix/dm/Component.h
index 87954a7..6334373 100644
--- a/libs/framework/include/celix/dm/Component.h
+++ b/libs/framework/include/celix/dm/Component.h
@@ -36,6 +36,7 @@ namespace celix { namespace dm {
             this->cCmp = celix_dmComponent_createWithUUID(this->context, name.c_str(), uuid.empty() ? nullptr : uuid.c_str());
             celix_dmComponent_setImplementation(this->cCmp, this);
             cmpUUID = std::string{celix_dmComponent_getUUID(this->cCmp)};
+            cmpName = std::string{celix_dmComponent_getName(this->cCmp)};
         }
         virtual ~BaseComponent() noexcept;
 
@@ -52,11 +53,21 @@ namespace celix { namespace dm {
          */
         celix_bundle_context_t* bundleContext() const { return this->context; }
 
+        /**
+         * Returns the cmp uuid.
+         */
         const std::string& getUUID() const {
             return cmpUUID;
         }
 
         /**
+         * Returns the cmp name.
+         */
+        const std::string& getName() const {
+            return cmpName;
+        }
+
+        /**
          * Wait for an empty Celix event queue.
          * Should not be called on the Celix event queue thread.
          *
@@ -72,14 +83,17 @@ namespace celix { namespace dm {
          */
         void runBuild();
     protected:
-
-        std::vector<std::shared_ptr<BaseServiceDependency>> dependencies{};
-        std::vector<std::shared_ptr<BaseProvidedService>> providedServices{};
-        std::string cmpUUID{};
-        std::atomic<bool> cmpAddedToDepMan{false};
         celix_bundle_context_t* context;
         celix_dependency_manager_t* cDepMan;
         celix_dm_component_t *cCmp;
+        std::string cmpUUID{};
+        std::string cmpName{};
+
+        std::atomic<bool> cmpAddedToDepMan{false};
+
+        std::mutex mutex{}; //protects below
+        std::vector<std::shared_ptr<BaseServiceDependency>> dependencies{};
+        std::vector<std::shared_ptr<BaseProvidedService>> providedServices{};
     };
 
 
diff --git a/libs/framework/include/celix/dm/Component_Impl.h b/libs/framework/include/celix/dm/Component_Impl.h
index c19bf84..619268d 100644
--- a/libs/framework/include/celix/dm/Component_Impl.h
+++ b/libs/framework/include/celix/dm/Component_Impl.h
@@ -37,14 +37,21 @@ inline void BaseComponent::runBuild() {
         return;
     }
 
-    for (auto& provide : providedServices) {
-        provide->runBuild();
+    {
+        std::lock_guard<std::mutex> lck{mutex};
+        for (auto& provide : providedServices) {
+            provide->runBuild();
+        }
     }
 
-    for (auto &dep : dependencies) {
-        dep->runBuild();
+    {
+        std::lock_guard<std::mutex> lck{mutex};
+        for (auto &dep : dependencies) {
+            dep->runBuild();
+        }
     }
 
+
     bool alreadyAdded = cmpAddedToDepMan.exchange(true);
     if (!alreadyAdded) {
         celix_dependencyManager_addAsync(cDepMan, cCmp);
@@ -81,6 +88,7 @@ Component<T>& Component<T>::addInterfaceWithName(const std::string &serviceName,
         auto provide = std::make_shared<ProvidedService<T,I>>(cComponent(), serviceName, intfPtr, true);
         provide->setVersion(version);
         provide->setProperties(properties);
+        std::lock_guard<std::mutex> lck{mutex};
         providedServices.push_back(provide);
     } else {
         std::cerr << "Cannot add interface with a empty name\n";
@@ -108,6 +116,7 @@ Component<T>& Component<T>::addCInterface(I* svc, const std::string &serviceName
     auto provide = std::make_shared<ProvidedService<T,I>>(cComponent(), serviceName, svc, false);
     provide->setVersion(version);
     provide->setProperties(properties);
+    std::lock_guard<std::mutex> lck{mutex};
     providedServices.push_back(provide);
     return *this;
 }
@@ -116,6 +125,7 @@ template<class T>
 template<class I>
 Component<T>& Component<T>::removeCInterface(const I* svc){
     celix_dmComponent_removeInterface(this->cComponent(), svc);
+    std::lock_guard<std::mutex> lck{mutex};
     for (auto it = providedServices.begin(); it != providedServices.end(); ++it) {
         std::shared_ptr<BaseProvidedService> provide = *it;
         if (provide->getService() == static_cast<const void*>(svc)) {
@@ -134,6 +144,7 @@ ServiceDependency<T,I>& Component<T>::createServiceDependency(const std::string
     if (dep == nullptr) {
         return invalidDep;
     }
+    std::lock_guard<std::mutex> lck{mutex};
     dependencies.push_back(dep);
     dep->setComponentInstance(&getInstance());
     return *dep;
@@ -143,6 +154,7 @@ template<class T>
 template<class I>
 Component<T>& Component<T>::remove(ServiceDependency<T,I>& dep) {
     celix_component_removeServiceDependency(cComponent(), dep.cServiceDependency());
+    std::lock_guard<std::mutex> lck{mutex};
     this->dependencies.erase(std::remove(this->dependencies.begin(), this->dependencies.end(), dep));
     return *this;
 }
@@ -155,6 +167,7 @@ CServiceDependency<T,I>& Component<T>::createCServiceDependency(const std::strin
     if (dep == nullptr) {
         return invalidDep;
     }
+    std::lock_guard<std::mutex> lck{mutex};
     dependencies.push_back(dep);
     dep->setComponentInstance(&getInstance());
     return *dep;
@@ -164,6 +177,7 @@ template<class T>
 template<typename I>
 Component<T>& Component<T>::remove(CServiceDependency<T,I>& dep) {
     celix_component_removeServiceDependency(cComponent(), dep.cServiceDependency());
+    std::lock_guard<std::mutex> lck{mutex};
     this->dependencies.erase(std::remove(this->dependencies.begin(), this->dependencies.end(), dep));
     return *this;
 }
@@ -381,6 +395,7 @@ template<class T>
 template<class I>
 ProvidedService<T, I> &Component<T>::createProvidedCService(I *svc, std::string serviceName) {
     auto provide = std::make_shared<ProvidedService<T,I>>(cComponent(), serviceName, svc, false);
+    std::lock_guard<std::mutex> lck{mutex};
     providedServices.push_back(provide);
     return *provide;
 }
@@ -398,6 +413,7 @@ ProvidedService<T, I> &Component<T>::createProvidedService(std::string serviceNa
 
     I* svcPtr = &this->getInstance();
     auto provide = std::make_shared<ProvidedService<T,I>>(cComponent(), serviceName, svcPtr, true);
+    std::lock_guard<std::mutex> lck{mutex};
     providedServices.push_back(provide);
     return *provide;
 }