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/18 16:39:45 UTC

celix git commit: CELIX-297: Apply fix for ungetServiceReference in service_registry.

Repository: celix
Updated Branches:
  refs/heads/develop f2126e877 -> 11c53f9ca


CELIX-297: Apply fix for ungetServiceReference in service_registry.


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

Branch: refs/heads/develop
Commit: 11c53f9caae30e23a55ef4bdd0020c3a7b26d31e
Parents: f2126e8
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Wed Nov 18 16:29:23 2015 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Wed Nov 18 16:29:23 2015 +0100

----------------------------------------------------------------------
 framework/private/src/service_registry.c        | 40 +++++++++++++++-----
 .../rsa_tst/rsa_tests.cpp                       |  5 ++-
 2 files changed, 35 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/11c53f9c/framework/private/src/service_registry.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_registry.c b/framework/private/src/service_registry.c
index 1c4f725..715c957 100644
--- a/framework/private/src/service_registry.c
+++ b/framework/private/src/service_registry.c
@@ -99,8 +99,9 @@ celix_status_t serviceRegistry_destroy(service_registry_pt registry) {
     hashMap_destroy(registry->serviceRegistrations, false, false);
 
     //destroy service references (double) map);
+    //FIXME. The framework bundle does not (yet) call clearReferences, as result the size could be > 0 for test code.
     //size = hashMap_size(registry->serviceReferences);
-    //assert(size == 0); FIXME This gives a problem in the remote_service_admin_dfi test. seems that the bundleActivator_stop of the calculator is activated twice ??
+    //assert(size == 0);
     hashMap_destroy(registry->serviceReferences, false, false);
 
     //destroy listener hooks
@@ -392,14 +393,12 @@ celix_status_t serviceRegistry_ungetServiceReference(service_registry_pt registr
     celix_status_t status = CELIX_SUCCESS;
     bool destroyed = false;
     size_t count = 0;
-    service_registration_pt reg = NULL;
     reference_status_t refStatus;
 
     celixThreadRwlock_writeLock(&registry->lock);
     serviceRegistry_checkReference(registry, reference, &refStatus);
     if (refStatus == REF_ACTIVE) {
         serviceReference_getUsageCount(reference, &count);
-        serviceReference_getServiceRegistration(reference, &reg);
         serviceReference_release(reference, &destroyed);
         if (destroyed) {
             if (count > 0) {
@@ -408,13 +407,36 @@ celix_status_t serviceRegistry_ungetServiceReference(service_registry_pt registr
 
 
             hash_map_pt refsMap = hashMap_get(registry->serviceReferences, bundle);
-            hashMap_remove(refsMap, reg);
-            int size = hashMap_size(refsMap);
-            if (size == 0) {
-                hashMap_destroy(refsMap, false, false);
-                hashMap_remove(registry->serviceReferences, bundle);
+
+            service_registration_pt reg = NULL;
+            service_reference_pt ref = NULL;
+            hash_map_iterator_pt iter = hashMapIterator_create(refsMap);
+            while (hashMapIterator_hasNext(iter)) {
+                hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+                reg = hashMapEntry_getKey(entry); //note could be invalid e.g. freed
+                ref = hashMapEntry_getValue(entry);
+
+                if (ref == reference) {
+                    break;
+                } else {
+                    ref = NULL;
+                    reg = NULL;
+                }
+            }
+            hashMapIterator_destroy(iter);
+
+            if (ref != NULL) {
+                hashMap_remove(refsMap, reg);
+                int size = hashMap_size(refsMap);
+                if (size == 0) {
+                    hashMap_destroy(refsMap, false, false);
+                    hashMap_remove(registry->serviceReferences, bundle);
+                }
+                serviceRegistry_setReferenceStatus(registry, reference, true);
+            } else {
+                fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR, "Cannot find reference %p in serviceReferences map",
+                       reference);
             }
-            serviceRegistry_setReferenceStatus(registry, reference, true);
         }
     } else {
         serviceRegistry_logIllegalReference(registry, reference, refStatus);

http://git-wip-us.apache.org/repos/asf/celix/blob/11c53f9c/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
index fd764d2..936bd30 100644
--- a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
+++ b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
@@ -161,6 +161,9 @@ extern "C" {
         CHECK_EQUAL(CELIX_SUCCESS, rc);
         CHECK(ref != NULL);
 
+        rc = bundleContext_ungetServiceReference(context, ref);
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
+
         /* Cannot test. uses requesting bundles descriptor
         void *service = NULL;
         rc = bundleContext_getService(context, ref, &service);
@@ -220,4 +223,4 @@ TEST(RsaDfiTests, ImportService) {
 
 TEST(RsaDfiTests, TestBundles) {
     testBundles();
-}
\ No newline at end of file
+}