You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2015/10/16 12:15:04 UTC

celix git commit: CELIX-276: added handling of importedServices when rsa gets removed.

Repository: celix
Updated Branches:
  refs/heads/develop f60ca0de4 -> 48558e8bc


CELIX-276: added handling of importedServices when rsa gets removed.


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/48558e8b
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/48558e8b
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/48558e8b

Branch: refs/heads/develop
Commit: 48558e8bc090979c7866be0c8ccde5d4d89b88ad
Parents: f60ca0d
Author: Bjoern Petri <bp...@apache.org>
Authored: Fri Oct 16 09:10:31 2015 +0200
Committer: Bjoern Petri <bp...@apache.org>
Committed: Fri Oct 16 09:10:31 2015 +0200

----------------------------------------------------------------------
 .../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(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/48558e8b/remote_services/topology_manager/private/include/topology_manager.h
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/include/topology_manager.h b/remote_services/topology_manager/private/include/topology_manager.h
index f0f9884..ade5a1e 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);

http://git-wip-us.apache.org/repos/asf/celix/blob/48558e8b/remote_services/topology_manager/private/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/src/activator.c b/remote_services/topology_manager/private/src/activator.c
index b83c060..42046b3 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;

http://git-wip-us.apache.org/repos/asf/celix/blob/48558e8b/remote_services/topology_manager/private/src/topology_manager.c
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/src/topology_manager.c b/remote_services/topology_manager/private/src/topology_manager.c
index f78bde5..68be8c8 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;