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;
}