You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2020/10/23 10:16:33 UTC

[felix-dev] branch connect updated: Apply FELIX-6178

This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch connect
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/connect by this push:
     new 5695ff9  Apply FELIX-6178
5695ff9 is described below

commit 5695ff977b3028a3201d42b96c5becd71060e18b
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Fri Oct 23 12:16:18 2020 +0200

    Apply FELIX-6178
---
 .../apache/felix/framework/ServiceRegistry.java    | 16 +++++++--
 .../felix/framework/ServiceRegistryTest.java       | 41 ++++++++++++++++++----
 2 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
index 1522133..83dbea2 100644
--- a/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
+++ b/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java
@@ -280,11 +280,21 @@ public class ServiceRegistry
         if (usages != null)
         {
             final ServiceReference<?>[] refs = new ServiceReference[usages.length];
-            for (int i = 0; i < refs.length; i++)
+            int count = 0;
+            for (int i = 0; i < usages.length; i++)
             {
-                refs[i] = usages[i].m_ref;
+                if (usages[i].m_count.get() > 0) {
+                    refs[count++] = usages[i].m_ref;
+                }
+            }
+            if (count == usages.length) {
+                return refs;
+            } else if (count == 0) {
+                return null;
             }
-            return refs;
+            ServiceReference<?>[] nrefs = new ServiceReference[count];
+            System.arraycopy(refs, 0, nrefs, 0, count);
+            return nrefs;
         }
         return null;
     }
diff --git a/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java b/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
index b83eef4..3c8e478 100644
--- a/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
+++ b/framework/src/test/java/org/apache/felix/framework/ServiceRegistryTest.java
@@ -1237,10 +1237,7 @@ public class ServiceRegistryTest extends TestCase
         ServiceRegistry sr = new ServiceRegistry(null, null);
         Bundle regBundle = Mockito.mock(Bundle.class);
 
-        ServiceRegistration reg = sr.registerService(
-                regBundle, new String [] {String.class.getName()}, "hi", null);
-        @SuppressWarnings("unchecked")
-        ServiceReference<String> ref = reg.getReference();
+        ServiceReference<String> ref = registerService(sr, regBundle, "hi");
 
         final Bundle clientBundle = Mockito.mock(Bundle.class);
         Mockito.when(clientBundle.getBundleId()).thenReturn(42L);
@@ -1250,9 +1247,41 @@ public class ServiceRegistryTest extends TestCase
         Mockito.when(clientBundle.getBundleId()).thenReturn(327L);
         assertThat(sr.getService(clientBundle2, ref, false), is("hi"));
 
-        assertThat(sr.ungetService(clientBundle, reg.getReference(), null), is(true));
+        assertThat(sr.ungetService(clientBundle, ref, null), is(true));
+
+        assertThat(sr.getUsingBundles(ref), is(new Bundle[]{clientBundle2}));
+    }
+
+    public void testServicesInUseWithoutZeroCounts() throws Exception
+    {
+        ServiceRegistry sr = new ServiceRegistry(null, null);
+        Bundle regBundle = Mockito.mock(Bundle.class);
+
+        ServiceReference<String> refHi = registerService(sr, regBundle, "hi");
+        ServiceReference<String> refBye = registerService(sr, regBundle, "bye");
+
+        final Bundle clientBundle = Mockito.mock(Bundle.class);
+        Mockito.when(clientBundle.getBundleId()).thenReturn(42L);
+
+        sr.getService(clientBundle, refHi, false);
+        sr.getService(clientBundle, refBye, false);
+        assertThat(sr.getServicesInUse(clientBundle).length, is(2));
+
+        sr.ungetService(clientBundle, refBye, null);
+        assertThat(sr.getServicesInUse(clientBundle), is(new ServiceReference[]{refHi}));
+
+        sr.ungetService(clientBundle, refHi, null);
+        assertThat(sr.getServicesInUse(clientBundle), nullValue());
+    }
+
+    private ServiceReference<String> registerService(ServiceRegistry sr, Bundle regBundle, String svcObj) {
+        ServiceRegistration reg = sr.registerService(
+                regBundle, new String [] {String.class.getName()}, svcObj, null);
+
+        @SuppressWarnings("unchecked")
+        ServiceReference<String> ref =  reg.getReference();
 
-        assertThat(sr.getUsingBundles(reg.getReference()), is(new Bundle[]{clientBundle2}));
+        return ref;
     }
 
     private Object getPrivateField(Object obj, String fieldName) throws NoSuchFieldException,