[ https://issues.apache.org/jira/browse/FELIX-5198?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15166938#comment-15166938 ]
Carsten Ziegeler commented on FELIX-5198: ----------------------------------------- Test case which currently fails: Index: src/test/java/org/apache/felix/framework/ServiceRegistryTest.java =================================================================== --- src/test/java/org/apache/felix/framework/ServiceRegistryTest.java (Revision 1732253) +++ src/test/java/org/apache/felix/framework/ServiceRegistryTest.java (Arbeitskopie) @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Dictionary; import java.util.Hashtable; import java.util.List; import java.util.Observable; @@ -31,11 +32,11 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; -import junit.framework.TestCase; - import org.apache.felix.framework.ServiceRegistrationImpl.ServiceReferenceImpl; import org.apache.felix.framework.ServiceRegistry.ServiceHolder; +import org.apache.felix.framework.ServiceRegistry.ServiceRegistryCallbacks; import org.apache.felix.framework.ServiceRegistry.UsageCount; import org.easymock.MockControl; import org.mockito.AdditionalAnswers; @@ -54,6 +55,8 @@ import org.osgi.framework.hooks.service.FindHook; import org.osgi.framework.hooks.service.ListenerHook; +import junit.framework.TestCase; + public class ServiceRegistryTest extends TestCase { public void testRegisterEventHookService() @@ -1228,6 +1231,34 @@ sb.append("Obtained service"); } + public void testGettingServiceWhileUnregistering() throws Exception + { + final Bundle regBundle = Mockito.mock(Bundle.class); + + final AtomicReference<ServiceRegistry> registryRef = new AtomicReference<ServiceRegistry>(); + final AtomicReference<ServiceReference> referenceRef = new AtomicReference<ServiceReference>(); + final ServiceRegistryCallbacks callback = new ServiceRegistryCallbacks() + { + + @Override + public void serviceChanged(ServiceEvent event, Dictionary<?, ?> oldProps) + { + if ( event.getType() == ServiceEvent.UNREGISTERING ) { + final Object obj = registryRef.get().getService(regBundle, referenceRef.get(), false); + assertNull(obj); + } + } + + }; + ServiceRegistry sr = new ServiceRegistry(null, callback); + registryRef.set(sr); + + ServiceRegistration<?> reg1 = sr.registerService( + regBundle, new String [] {String.class.getName()}, "service is unregistering", null); + referenceRef.set(reg1.getReference()); + sr.unregisterService(regBundle, reg1); + } + private Object getPrivateField(Object obj, String fieldName) throws NoSuchFieldException, IllegalAccessException { > Service should not be available while being unregistered > -------------------------------------------------------- > > Key: FELIX-5198 > URL: https://issues.apache.org/jira/browse/FELIX-5198 > Project: Felix > Issue Type: Bug > Components: Framework > Affects Versions: framework-5.4.0 > Reporter: Carsten Ziegeler > Assignee: David Bosschaert > Fix For: framework-5.6.0 > > > Currently it is possible to get a service while it is being unregistered - > if the service is get during processing of the unregistering event. This is > the order of events: > a) a service (factory) is unregistered in the framework > b) the UNREGISTERING event is sent before the service is actually > unregistered (this is as defined in the spec) > c) the above event is handled synchronously, reactivating dependent components > d) during this reactivation, some component looks up the service that is > unregistered in a). as this service is still registered and marked as valid, > it gets it > According to ServiceRegistration.unregister the service should not be > available anymore while the events are sent -- This message was sent by Atlassian JIRA (v6.3.4#6332)