From 48558e8bc090979c7866be0c8ccde5d4d89b88ad Mon Sep 17 00:00:00 2001 From: Bjoern Petri Date: Fri, 16 Oct 2015 09:10:31 +0200 Subject: [PATCH] CELIX-276: added handling of importedServices when rsa gets removed. --- .../private/include/topology_manager.h | 2 + .../topology_manager/private/src/activator.c | 2 +- .../private/src/topology_manager.c | 47 ++++++++++++------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/remote_services/topology_manager/private/include/topology_manager.h b/remote_services/topology_manager/private/include/topology_manager.h index f0f9884e1..ade5a1e95 100644 --- a/remote_services/topology_manager/private/include/topology_manager.h +++ b/remote_services/topology_manager/private/include/topology_manager.h @@ -32,6 +32,8 @@ #include "bundle_context.h" #include "log_helper.h" +#define OSGI_RSA_REMOTE_SERVICE_ADMIN "remote_service_admin" + typedef struct topology_manager *topology_manager_pt; celix_status_t topologyManager_create(bundle_context_pt context, log_helper_pt logHelper, topology_manager_pt *manager); diff --git a/remote_services/topology_manager/private/src/activator.c b/remote_services/topology_manager/private/src/activator.c index b83c06084..42046b389 100644 --- a/remote_services/topology_manager/private/src/activator.c +++ b/remote_services/topology_manager/private/src/activator.c @@ -124,7 +124,7 @@ static celix_status_t bundleActivator_createRSATracker(struct activator *activat status = serviceTrackerCustomizer_create(activator->manager, topologyManager_rsaAdding, topologyManager_rsaAdded, topologyManager_rsaModified, topologyManager_rsaRemoved, &customizer); if (status == CELIX_SUCCESS) { - status = serviceTracker_create(activator->context, "remote_service_admin", customizer, tracker); + status = serviceTracker_create(activator->context, OSGI_RSA_REMOTE_SERVICE_ADMIN, customizer, tracker); } return status; diff --git a/remote_services/topology_manager/private/src/topology_manager.c b/remote_services/topology_manager/private/src/topology_manager.c index f78bde5b3..68be8c8d5 100644 --- a/remote_services/topology_manager/private/src/topology_manager.c +++ b/remote_services/topology_manager/private/src/topology_manager.c @@ -214,12 +214,7 @@ celix_status_t topologyManager_rsaAdded(void * handle, service_reference_pt refe if (status == CELIX_SUCCESS) { hash_map_pt imports = hashMapEntry_getValue(entry); - - if (imports == NULL) { - imports = hashMap_create(NULL, NULL, NULL, NULL); - } - - hashMap_put(imports, service, import); + hashMap_put(imports, rsa, import); } } @@ -244,10 +239,6 @@ celix_status_t topologyManager_rsaAdded(void * handle, service_reference_pt refe if (status == CELIX_SUCCESS) { hash_map_pt exports = hashMapEntry_getValue(entry); - if (exports == NULL) { - exports = hashMap_create(NULL, NULL, NULL, NULL); - } - hashMap_put(exports, rsa, endpoints); status = topologyManager_notifyListenersEndpointAdded(manager, rsa, endpoints); } @@ -317,6 +308,30 @@ celix_status_t topologyManager_rsaRemoved(void * handle, service_reference_pt re status = celixThreadMutex_unlock(&manager->exportedServicesLock); + status = celixThreadMutex_lock(&manager->importedServicesLock); + + iter = hashMapIterator_create(manager->importedServices); + + while (hashMapIterator_hasNext(iter)) { + hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); + endpoint_description_pt ep = hashMapEntry_getKey(entry); + hash_map_pt imports = hashMapEntry_getValue(entry); + + import_registration_pt import = hashMap_get(imports, rsa); + + if (import != NULL) { + status = rsa->importRegistration_close(rsa->admin, import); + + if (status == CELIX_SUCCESS) { + hashMap_remove(imports, rsa); + } + } + } + + hashMapIterator_destroy(iter); + + status = celixThreadMutex_unlock(&manager->importedServicesLock); + logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "TOPOLOGY_MANAGER: Removed RSA"); status = celixThreadMutex_lock(&manager->rsaListLock); @@ -610,7 +625,7 @@ celix_status_t topologyManager_endpointListenerAdded(void* handle, service_refer } celix_status_t topologyManager_endpointListenerModified(void * handle, service_reference_pt reference, void * service) { - celix_status_t status; + celix_status_t status = CELIX_SUCCESS; status = topologyManager_endpointListenerRemoved(handle, reference, service); if (status == CELIX_SUCCESS) { @@ -621,7 +636,7 @@ celix_status_t topologyManager_endpointListenerModified(void * handle, service_r } celix_status_t topologyManager_endpointListenerRemoved(void * handle, service_reference_pt reference, void * service) { - celix_status_t status; + celix_status_t status = CELIX_SUCCESS; topology_manager_pt manager = handle; celixThreadMutex_lock(&manager->listenerListLock); @@ -638,7 +653,7 @@ celix_status_t topologyManager_endpointListenerRemoved(void * handle, service_re } celix_status_t topologyManager_notifyListenersEndpointAdded(topology_manager_pt manager, remote_service_admin_service_pt rsa, array_list_pt registrations) { - celix_status_t status; + celix_status_t status = CELIX_SUCCESS; celixThreadMutex_lock(&manager->listenerListLock); @@ -705,12 +720,10 @@ celix_status_t topologyManager_notifyListenersEndpointRemoved(topology_manager_p if (status == CELIX_SUCCESS) { status = epl->endpointRemoved(epl->handle, endpoint, NULL); } - - hashMapIterator_destroy(iter); - - } + hashMapIterator_destroy(iter); + celixThreadMutex_unlock(&manager->listenerListLock); return status;