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 2016/01/07 13:37:53 UTC

celix git commit: CELIX-334: fix race condition in topology manager

Repository: celix
Updated Branches:
  refs/heads/develop a01de9e9d -> 876654fac


CELIX-334: fix race condition in topology manager


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

Branch: refs/heads/develop
Commit: 876654fac032d1686cfbb15758671d7a8e1bc93e
Parents: a01de9e
Author: Bjoern Petri <bp...@apache.org>
Authored: Thu Jan 7 13:37:22 2016 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Thu Jan 7 13:37:22 2016 +0100

----------------------------------------------------------------------
 .../private/src/topology_manager.c              | 67 +++++++-------------
 1 file changed, 23 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/876654fa/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 5e3ca72..a116383 100644
--- a/remote_services/topology_manager/private/src/topology_manager.c
+++ b/remote_services/topology_manager/private/src/topology_manager.c
@@ -362,20 +362,6 @@ celix_status_t topologyManager_rsaRemoved(void * handle, service_reference_pt re
     return status;
 }
 
-celix_status_t topologyManager_getRSAs(topology_manager_pt manager, array_list_pt *rsaList) {
-    celix_status_t status;
-
-    status = arrayList_create(rsaList);
-
-    if (status == CELIX_SUCCESS) {
-        if (celixThreadMutex_lock(&manager->rsaListLock) == CELIX_SUCCESS) {
-            arrayList_addAll(*rsaList, manager->rsaList);
-            celixThreadMutex_unlock(&manager->rsaListLock);
-        }
-    }
-
-    return status;
-}
 
 celix_status_t topologyManager_serviceChanged(void *listener, service_event_pt event) {
     celix_status_t status = CELIX_SUCCESS;
@@ -525,27 +511,23 @@ celix_status_t topologyManager_importScopeChanged(void *handle, char *service_na
 }
 
 celix_status_t topologyManager_addImportedService(void *handle, endpoint_description_pt endpoint, char *matchedFilter) {
-    celix_status_t status;
+    celix_status_t status = CELIX_SUCCESS;
     topology_manager_pt manager = handle;
-    array_list_pt localRSAs = NULL;
 
     logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "TOPOLOGY_MANAGER: Add imported service (%s; %s).", endpoint->service, endpoint->id);
 
-    // Create a local copy of the current list of RSAs, to ensure we do not run into threading issues...
-    status = topologyManager_getRSAs(manager, &localRSAs);
-
-    if (status == CELIX_SUCCESS) {
+    if (celixThreadMutex_lock(&manager->importedServicesLock) == CELIX_SUCCESS) {
 
-        if (celixThreadMutex_lock(&manager->importedServicesLock) == CELIX_SUCCESS) {
+        hash_map_pt imports = hashMap_create(NULL, NULL, NULL, NULL);
+        hashMap_put(manager->importedServices, endpoint, imports);
 
-            hash_map_pt imports = hashMap_create(NULL, NULL, NULL, NULL);
-            hashMap_put(manager->importedServices, endpoint, imports);
+        if (scope_allowImport(manager->scope, endpoint)) {
+            if (celixThreadMutex_lock(&manager->rsaListLock) == CELIX_SUCCESS) {
+                int size = arrayList_size(manager->rsaList);
 
-            if (scope_allowImport(manager->scope, endpoint)) {
-                int size = arrayList_size(localRSAs);
                 for (int iter = 0; iter < size; iter++) {
                     import_registration_pt import = NULL;
-                    remote_service_admin_service_pt rsa = arrayList_get(localRSAs, iter);
+                    remote_service_admin_service_pt rsa = arrayList_get(manager->rsaList, iter);
                     celix_status_t substatus = rsa->importService(rsa->admin, endpoint, &import);
                     if (substatus == CELIX_SUCCESS) {
                         hashMap_put(imports, rsa, import);
@@ -553,14 +535,15 @@ celix_status_t topologyManager_addImportedService(void *handle, endpoint_descrip
                         status = substatus;
                     }
                 }
+                celixThreadMutex_unlock(&manager->rsaListLock);
             }
 
-            celixThreadMutex_unlock(&manager->importedServicesLock);
         }
-        arrayList_destroy(localRSAs);
+
+        celixThreadMutex_unlock(&manager->importedServicesLock);
     }
 
-    status = CELIX_SUCCESS;
+
     return status;
 }
 
@@ -608,28 +591,25 @@ celix_status_t topologyManager_removeImportedService(void *handle, endpoint_desc
 }
 
 celix_status_t topologyManager_addExportedService(topology_manager_pt manager, service_reference_pt reference, char *serviceId) {
-    celix_status_t status;
+    celix_status_t status = CELIX_SUCCESS;
     properties_pt serviceProperties = NULL;
-    array_list_pt localRSAs = NULL;
 
     logHelper_log(manager->loghelper, OSGI_LOGSERVICE_INFO, "TOPOLOGY_MANAGER: Add exported service (%s).", serviceId);
 
-    // Create a local copy of the current list of RSAs, to ensure we do not run into threading issues...
-    status = topologyManager_getRSAs(manager, &localRSAs);
+    if (celixThreadMutex_lock(&manager->exportedServicesLock) == CELIX_SUCCESS) {
+        scope_getExportProperties(manager->scope, reference, &serviceProperties);
+        hash_map_pt exports = hashMap_create(NULL, NULL, NULL, NULL);
+        hashMap_put(manager->exportedServices, reference, exports);
 
-    if (status == CELIX_SUCCESS) {
-        if (celixThreadMutex_lock(&manager->exportedServicesLock) == CELIX_SUCCESS) {
-            scope_getExportProperties(manager->scope, reference, &serviceProperties);
-            hash_map_pt exports = hashMap_create(NULL, NULL, NULL, NULL);
-            hashMap_put(manager->exportedServices, reference, exports);
-            int size = arrayList_size(localRSAs);
+        if (celixThreadMutex_lock(&manager->rsaListLock) == CELIX_SUCCESS) {
+            int size = arrayList_size(manager->rsaList);
 
             if (size == 0) {
                 logHelper_log(manager->loghelper, OSGI_LOGSERVICE_WARNING, "TOPOLOGY_MANAGER: No RSA available yet.");
             }
 
             for (int iter = 0; iter < size; iter++) {
-                remote_service_admin_service_pt rsa = arrayList_get(localRSAs, iter);
+                remote_service_admin_service_pt rsa = arrayList_get(manager->rsaList, iter);
 
                 array_list_pt endpoints = NULL;
                 celix_status_t substatus = rsa->exportService(rsa->admin, serviceId, serviceProperties, &endpoints);
@@ -641,12 +621,11 @@ celix_status_t topologyManager_addExportedService(topology_manager_pt manager, s
                     status = substatus;
                 }
             }
-            celixThreadMutex_unlock(&manager->exportedServicesLock);
+            celixThreadMutex_unlock(&manager->rsaListLock);
         }
-        arrayList_destroy(localRSAs);
-
+        celixThreadMutex_unlock(&manager->exportedServicesLock);
     }
-    //status = CELIX_SUCCESS;
+
     return status;
 }