CELIX-240: copy export_registrations to dedicated list to prevent deadlock 
during shutdown


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

Branch: refs/heads/feature/CELIX-237_rsa-ffi
Commit: cabd41a75321afb27b20664250a5fc6cccf9dec6
Parents: bdf8e06
Author: Bjoern Petri <bpe...@apache.org>
Authored: Sat Jun 20 16:03:14 2015 +0200
Committer: Bjoern Petri <bpe...@apache.org>
Committed: Sat Jun 20 16:03:14 2015 +0200

----------------------------------------------------------------------
 .../private/src/remote_service_admin_activator.c    |  3 ++-
 .../private/src/remote_service_admin_impl.c         | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/cabd41a7/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
 
b/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
index e4125fc..1b4c59c 100644
--- 
a/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
+++ 
b/remote_services/remote_service_admin_http/private/src/remote_service_admin_activator.c
@@ -99,10 +99,11 @@ celix_status_t bundleActivator_stop(void * userData, 
bundle_context_pt context)
     celix_status_t status = CELIX_SUCCESS;
     struct activator *activator = userData;
 
-    remoteServiceAdmin_stop(activator->admin);
     serviceRegistration_unregister(activator->registration);
     activator->registration = NULL;
 
+    remoteServiceAdmin_stop(activator->admin);
+
     remoteServiceAdmin_destroy(&activator->admin);
 
     free(activator->adminService);

http://git-wip-us.apache.org/repos/asf/celix/blob/cabd41a7/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git 
a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
 
b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
index 63e5192..319c849 100644
--- 
a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
+++ 
b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
@@ -207,18 +207,32 @@ celix_status_t 
remoteServiceAdmin_stop(remote_service_admin_pt admin) {
 
     celixThreadMutex_lock(&admin->exportedServicesLock);
 
+    array_list_pt exportRegistrationList = NULL;
+
+    arrayList_create(&exportRegistrationList);
+
        hash_map_iterator_pt iter = 
hashMapIterator_create(admin->exportedServices);
        while (hashMapIterator_hasNext(iter)) {
                array_list_pt exports = hashMapIterator_nextValue(iter);
                int i;
+
                for (i = 0; i < arrayList_size(exports); i++) {
                        export_registration_pt export = arrayList_get(exports, 
i);
-                       exportRegistration_stopTracking(export);
+                       arrayList_add(exportRegistrationList, export);
                }
        }
     hashMapIterator_destroy(iter);
     celixThreadMutex_unlock(&admin->exportedServicesLock);
 
+       int i;
+
+       for (i = 0; i < arrayList_size(exportRegistrationList); i++) {
+               export_registration_pt export = 
arrayList_get(exportRegistrationList, i);
+               exportRegistration_stopTracking(export);
+       }
+
+       arrayList_destroy(exportRegistrationList);
+
     celixThreadMutex_lock(&admin->importedServicesLock);
 
     iter = hashMapIterator_create(admin->importedServices);

Reply via email to