You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2015/11/16 21:17:22 UTC
[08/21] celix git commit: CELIX-272: fix race condition in topology
manager
CELIX-272: 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/e8479259
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/e8479259
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/e8479259
Branch: refs/heads/feature/CELIX-272_synchronization_service_registry
Commit: e84792592e2b83c1149452901a37df822e3b487d
Parents: fa50089
Author: Bjoern Petri <bp...@apache.org>
Authored: Sun Nov 15 22:25:21 2015 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Sun Nov 15 22:25:21 2015 +0100
----------------------------------------------------------------------
.../topology_manager/private/src/topology_manager.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/e8479259/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 acc6941..af650ff 100644
--- a/remote_services/topology_manager/private/src/topology_manager.c
+++ b/remote_services/topology_manager/private/src/topology_manager.c
@@ -279,10 +279,16 @@ celix_status_t topologyManager_rsaRemoved(void * handle, service_reference_pt re
service_reference_pt key = hashMapEntry_getKey(entry);
hash_map_pt exports = hashMapEntry_getValue(entry);
+
+ /*
+ * the problem here is that also the rsa has a a list of
+ * endpoints which is destroyed when closing the exportRegistrtaiom
+ */
array_list_pt exports_list = hashMap_get(exports, rsa);
if (exports_list != NULL) {
- for (exportsIter = 0; exportsIter < arrayList_size(exports_list); exportsIter++) {
+ int exportListSize = arrayList_size(exports_list);
+ for (exportsIter = 0; exports_list != NULL && exportsIter < exportListSize; exportsIter++) {
export_registration_pt export = arrayList_get(exports_list, exportsIter);
topologyManager_notifyListenersEndpointRemoved(manager, rsa, export);
rsa->exportRegistration_close(export);