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 2017/03/27 17:34:11 UTC
celix git commit: CELIX-386: Fixes an error in the ServiceDependency
callback handling
Repository: celix
Updated Branches:
refs/heads/develop 544906ff6 -> d14fa9939
CELIX-386: Fixes an error in the ServiceDependency callback handling
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/d14fa993
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/d14fa993
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/d14fa993
Branch: refs/heads/develop
Commit: d14fa993945d0d95bb9df8d7864f992fe4e7f085
Parents: 544906f
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Mon Mar 27 19:33:37 2017 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Mon Mar 27 19:33:37 2017 +0200
----------------------------------------------------------------------
.../include/celix/dm/ServiceDependency_Impl.h | 37 +++++++++++---------
framework/private/src/service_registration.c | 10 +++---
2 files changed, 26 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/d14fa993/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
----------------------------------------------------------------------
diff --git a/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h b/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
index 731800d..85f5504 100644
--- a/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
+++ b/dependency_manager_cxx/include/celix/dm/ServiceDependency_Impl.h
@@ -188,19 +188,22 @@ template<class T, typename I>
int CServiceDependency<T,I>::invokeCallback(std::function<void(const I*, Properties&&)> fp, service_reference_pt ref, const void* service) {
service_registration_pt reg {nullptr};
properties_pt props {nullptr};
- serviceReference_getServiceRegistration(ref, ®);
- serviceRegistration_getProperties(reg, &props);
Properties properties {};
const char* key {nullptr};
const char* value {nullptr};
- hash_map_iterator_t iter = hashMapIterator_construct((hash_map_pt)props);
- while(hashMapIterator_hasNext(&iter)) {
- key = (const char*) hashMapIterator_nextKey(&iter);
- value = properties_get(props, key);
- //std::cout << "got property " << key << "=" << value << "\n";
- properties[key] = value;
+ if (ref != nullptr) {
+ serviceReference_getServiceRegistration(ref, ®);
+ serviceRegistration_getProperties(reg, &props);
+
+ hash_map_iterator_t iter = hashMapIterator_construct((hash_map_pt)props);
+ while(hashMapIterator_hasNext(&iter)) {
+ key = (const char*) hashMapIterator_nextKey(&iter);
+ value = properties_get(props, key);
+ //std::cout << "got property " << key << "=" << value << "\n";
+ properties[key] = value;
+ }
}
const I* srv = (const I*) service;
@@ -389,19 +392,21 @@ int ServiceDependency<T,I>::invokeCallback(std::function<void(I*, Properties&&)>
service_registration_pt reg {nullptr};
properties_pt props {nullptr};
I *svc = (I*)service;
- serviceReference_getServiceRegistration(ref, ®);
- serviceRegistration_getProperties(reg, &props);
Properties properties {};
const char* key {nullptr};
const char* value {nullptr};
- hash_map_iterator_t iter = hashMapIterator_construct((hash_map_pt)props);
- while(hashMapIterator_hasNext(&iter)) {
- key = (const char*) hashMapIterator_nextKey(&iter);
- value = properties_get(props, key);
- //std::cout << "got property " << key << "=" << value << "\n";
- properties[key] = value;
+ if (ref != nullptr) {
+ serviceReference_getServiceRegistration(ref, ®);
+ serviceRegistration_getProperties(reg, &props);
+ hash_map_iterator_t iter = hashMapIterator_construct((hash_map_pt)props);
+ while(hashMapIterator_hasNext(&iter)) {
+ key = (const char*) hashMapIterator_nextKey(&iter);
+ value = properties_get(props, key);
+ //std::cout << "got property " << key << "=" << value << "\n";
+ properties[key] = value;
+ }
}
fp(svc, std::move(properties)); //explicit move of lvalue properties.
http://git-wip-us.apache.org/repos/asf/celix/blob/d14fa993/framework/private/src/service_registration.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_registration.c b/framework/private/src/service_registration.c
index e916457..5d23dbf 100644
--- a/framework/private/src/service_registration.c
+++ b/framework/private/src/service_registration.c
@@ -221,17 +221,17 @@ celix_status_t serviceRegistration_ungetService(service_registration_pt registra
celix_status_t serviceRegistration_getProperties(service_registration_pt registration, properties_pt *properties) {
celix_status_t status = CELIX_SUCCESS;
- if (registration != NULL && *properties == NULL) {
+ if (registration != NULL) {
celixThreadRwlock_readLock(®istration->lock);
*properties = registration->properties;
celixThreadRwlock_unlock(®istration->lock);
- } else {
- status = CELIX_ILLEGAL_ARGUMENT;
- }
+ } else {
+ status = CELIX_ILLEGAL_ARGUMENT;
+ }
framework_logIfError(logger, status, NULL, "Cannot get registration properties");
- return status;
+ return status;
}
celix_status_t serviceRegistration_setProperties(service_registration_pt registration, properties_pt properties) {