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,