You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2014/08/27 15:53:41 UTC
svn commit: r1620899 - /celix/trunk/framework/private/src/service_registry.c
Author: abroekhuis
Date: Wed Aug 27 13:53:41 2014
New Revision: 1620899
URL: http://svn.apache.org/r1620899
Log:
Readded incorrecty removed line for mutex creation.
Modified:
celix/trunk/framework/private/src/service_registry.c
Modified: celix/trunk/framework/private/src/service_registry.c
URL: http://svn.apache.org/viewvc/celix/trunk/framework/private/src/service_registry.c?rev=1620899&r1=1620898&r2=1620899&view=diff
==============================================================================
--- celix/trunk/framework/private/src/service_registry.c (original)
+++ celix/trunk/framework/private/src/service_registry.c Wed Aug 27 13:53:41 2014
@@ -64,6 +64,7 @@ celix_status_t serviceRegistry_create(fr
status = celixThreadMutexAttr_create(&(*registry)->mutexAttr);
status = CELIX_DO_IF(status, celixThreadMutexAttr_settype(&(*registry)->mutexAttr, CELIX_THREAD_MUTEX_RECURSIVE));
+ status = CELIX_DO_IF(status, celixThreadMutex_create(&(*registry)->mutex, &(*registry)->mutexAttr));
status = CELIX_DO_IF(status, celixThreadMutex_create(&(*registry)->referencesMapMutex, NULL));
}
@@ -86,6 +87,7 @@ celix_status_t serviceRegistry_destroy(s
registry->serviceChanged = NULL;
registry->serviceReferences = NULL;
registry->serviceRegistrations = NULL;
+ free(registry);
return CELIX_SUCCESS;
}
@@ -149,6 +151,7 @@ static celix_status_t serviceRegistry_fl
celix_status_t serviceRegistry_getRegisteredServices(service_registry_pt registry, bundle_pt bundle, array_list_pt *services) {
celix_status_t status = CELIX_SUCCESS;
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
array_list_pt regs = (array_list_pt) hashMap_get(registry->serviceRegistrations, bundle);
if (regs != NULL) {
@@ -166,6 +169,7 @@ celix_status_t serviceRegistry_getRegist
}
}
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
framework_logIfError(logger, status, NULL, "Cannot get registered services");
@@ -183,6 +187,7 @@ celix_status_t serviceRegistry_registerS
celix_status_t serviceRegistry_registerServiceInternal(service_registry_pt registry, bundle_pt bundle, char * serviceName, void * serviceObject, properties_pt dictionary, bool isFactory, service_registration_pt *registration) {
array_list_pt regs;
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
if (isFactory) {
@@ -201,6 +206,7 @@ celix_status_t serviceRegistry_registerS
arrayList_add(regs, *registration);
hashMap_put(registry->serviceRegistrations, bundle, regs);
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
if (registry->serviceChanged != NULL) {
@@ -221,6 +227,7 @@ celix_status_t serviceRegistry_unregiste
array_list_pt regs;
array_list_pt references = NULL;
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
serviceRegistry_removeHook(registry, registration);
@@ -231,12 +238,14 @@ celix_status_t serviceRegistry_unregiste
hashMap_put(registry->serviceRegistrations, bundle, regs);
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
if (registry->serviceChanged != NULL) {
registry->serviceChanged(registry->framework, OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING, registration, NULL);
}
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
// unget service
@@ -258,11 +267,14 @@ celix_status_t serviceRegistry_unregiste
serviceReference_invalidate(reference);
}
+ arrayList_destroy(references);
+
//TODO not needed, the registration is destroyed, any reference to the registration is invalid and will result in a segfault
serviceRegistration_invalidate(registration);
serviceRegistration_destroy(registration);
+ printf("Reg Unock\n");
celixThreadMutex_unlock(®istry->mutex);
return CELIX_SUCCESS;
@@ -271,8 +283,10 @@ celix_status_t serviceRegistry_unregiste
celix_status_t serviceRegistry_unregisterServices(service_registry_pt registry, bundle_pt bundle) {
array_list_pt regs = NULL;
unsigned int i;
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
regs = (array_list_pt) hashMap_get(registry->serviceRegistrations, bundle);
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
for (i = 0; (regs != NULL) && i < arrayList_size(regs); i++) {
@@ -290,8 +304,10 @@ celix_status_t serviceRegistry_unregiste
removed = NULL;
}
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
hashMap_remove(registry->serviceRegistrations, bundle);
+ printf("Reg Unock\n");
celixThreadMutex_unlock(®istry->mutex);
return CELIX_SUCCESS;
@@ -307,6 +323,7 @@ celix_status_t serviceRegistry_createSer
serviceReference_create(bundle, registration, reference);
// Lock
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->referencesMapMutex);
array_list_pt references = hashMap_get(registry->serviceReferences, owner);
if (references == NULL) {
@@ -316,6 +333,7 @@ celix_status_t serviceRegistry_createSer
hashMap_put(registry->serviceReferences, owner, references);
// Unlock
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->referencesMapMutex);
framework_logIfError(logger, status, NULL, "Cannot create service reference");
@@ -350,6 +368,9 @@ celix_status_t serviceRegistry_getServic
}
}
}
+ hashMapIterator_destroy(iterator);
+ hashMapValues_destroy(referenceValues);
+
celixThreadMutex_unlock(®istry->referencesMapMutex);
return status;
@@ -361,6 +382,7 @@ celix_status_t serviceRegistry_getServic
hash_map_iterator_pt iterator;
arrayList_create(references);
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
registrations = hashMapValues_create(registry->serviceRegistrations);
iterator = hashMapValues_iterator(registrations);
@@ -403,6 +425,7 @@ celix_status_t serviceRegistry_getServic
}
hashMapIterator_destroy(iterator);
hashMapValues_destroy(registrations);
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
framework_logIfError(logger, status, NULL, "Cannot get service references");
@@ -453,12 +476,14 @@ celix_status_t serviceRegistry_ungetServ
service_reference_pt reference = arrayList_get(referencesClone, refIdx);
serviceRegistry_ungetServiceReference(registry, owner, reference);
}
+ arrayList_destroy(referencesClone);
}
return status;
}
celix_status_t serviceRegistry_getServicesInUse(service_registry_pt registry, bundle_pt bundle, array_list_pt *services) {
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
array_list_pt usages = hashMap_get(registry->inUseMap, bundle);
if (usages != NULL) {
@@ -470,6 +495,7 @@ celix_status_t serviceRegistry_getServic
arrayList_add(*services, usage->reference);
}
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
return CELIX_SUCCESS;
}
@@ -481,6 +507,7 @@ celix_status_t serviceRegistry_getServic
usage_count_pt usage = NULL;
serviceReference_getServiceRegistration(reference, ®istration);
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
if (serviceRegistration_isValid(registration)) {
@@ -491,17 +518,20 @@ celix_status_t serviceRegistry_getServic
usage->count++;
*service = usage->service;
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
if ((usage != NULL) && (*service == NULL)) {
serviceRegistration_getService(registration, bundle, service);
}
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
if ((!serviceRegistration_isValid(registration)) || (*service == NULL)) {
serviceRegistry_flushUsageCount(registry, bundle, reference);
} else {
usage->service = *service;
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
return CELIX_SUCCESS;
@@ -513,10 +543,12 @@ celix_status_t serviceRegistry_ungetServ
usage_count_pt usage = NULL;
serviceReference_getServiceRegistration(reference, ®istration);
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
status = serviceRegistry_getUsageCount(registry, bundle, reference, &usage);
if (usage == NULL) {
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
*result = false;
return CELIX_SUCCESS;
@@ -529,6 +561,7 @@ celix_status_t serviceRegistry_ungetServ
serviceRegistry_flushUsageCount(registry, bundle, reference);
}
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
*result = true;
@@ -541,8 +574,10 @@ void serviceRegistry_ungetServices(servi
array_list_pt usages;
unsigned int i;
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
usages = hashMap_get(registry->inUseMap, bundle);
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
if (usages == NULL || arrayList_isEmpty(usages)) {
@@ -569,6 +604,7 @@ array_list_pt serviceRegistry_getUsingBu
hash_map_iterator_pt iter;
arrayList_create(&bundles);
+ printf("Reg Lock\n");
celixThreadMutex_lock(®istry->mutex);
iter = hashMapIterator_create(registry->inUseMap);
while (hashMapIterator_hasNext(iter)) {
@@ -586,6 +622,7 @@ array_list_pt serviceRegistry_getUsingBu
}
}
hashMapIterator_destroy(iter);
+ printf("Reg Unlock\n");
celixThreadMutex_unlock(®istry->mutex);
return bundles;
}