David Jencks created FELIX-3687:
-----------------------------------
Summary: Deadlock potential from ServiceRegistry.unregisterService
Key: FELIX-3687
URL: https://issues.apache.org/jira/browse/FELIX-3687
Project: Felix
Issue Type: Bug
Components: Framework
Affects Versions: framework-4.0.3
Reporter: David Jencks
At the end of unregisterService there's this block:
{code}
// Now forcibly unget the service object for all stubborn clients.
synchronized (this)
{
Bundle[] clients = getUsingBundles(reg.getReference());
for (int i = 0; (clients != null) && (i < clients.length); i++)
{
while (ungetService(clients[i], reg.getReference()))
; // Keep removing until it is no longer possible
}
((ServiceRegistrationImpl) reg).invalidate();
}
{code}
Note the call to ungetService from within a synchronized block. ungetService
itself is very careful to release the lock before calling out to the service
factory, however this call from unregisterService negates this care.
This causes problems with DS with thread dumps like:
{code}
ThreadId: 16 : name: SCR Component Actor State: RUNNABLE
LockInfo: null LockOwnerId: -1 LockOwnerName: null
sun.management.ThreadImpl.dumpThreads0(Native Method)
sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:433)
org.apache.felix.scr.impl.manager.AbstractComponentManager.dumpThreads(AbstractComponentManager.java:294)
org.apache.felix.scr.impl.manager.AbstractComponentManager.logLockingInfo(AbstractComponentManager.java:240)
org.apache.felix.scr.impl.manager.AbstractComponentManager.releaseReadLock(AbstractComponentManager.java:222)
org.apache.felix.scr.impl.manager.ImmediateComponentManager.ungetService(ImmediateComponentManager.java:710)
org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:349)
org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:258)
org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:389)
org.apache.felix.framework.Felix.ungetService(Felix.java:3432)
org.apache.felix.framework.BundleContextImpl.ungetService(BundleContextImpl.java:486)
org.apache.felix.scr.impl.manager.DependencyManager.ungetService(DependencyManager.java:900)
org.apache.felix.scr.impl.manager.DependencyManager.unbind(DependencyManager.java:1138)
org.apache.felix.scr.impl.manager.DependencyManager.close(DependencyManager.java:970)
org.apache.felix.scr.impl.manager.ImmediateComponentManager.disposeImplementationObject(ImmediateComponentManager.java:276)
org.apache.felix.scr.impl.manager.ImmediateComponentManager.deleteComponent(ImmediateComponentManager.java:148)
org.apache.felix.scr.impl.manager.AbstractComponentManager$Active.ungetService(AbstractComponentManager.java:1718)
org.apache.felix.scr.impl.manager.ImmediateComponentManager.ungetService(ImmediateComponentManager.java:695)
org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:349)
org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:258)
org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:389)
>>>>>>>>inside the lock
>>>>>>>>org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:158)
org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:127)
org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterComponentService(AbstractComponentManager.java:779)
org.apache.felix.scr.impl.manager.AbstractComponentManager$State.doDeactivate(AbstractComponentManager.java:1387)
org.apache.felix.scr.impl.manager.AbstractComponentManager$Satisfied.deactivate(AbstractComponentManager.java:1665)
org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:635)
org.apache.felix.scr.impl.manager.DependencyManager.serviceRemoved(DependencyManager.java:375)
org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:217)
org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
org.apache.felix.framework.Felix.access$000(Felix.java:74)
org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:390)
org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:148)
org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:127)
org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterComponentService(AbstractComponentManager.java:779)
org.apache.felix.scr.impl.manager.AbstractComponentManager$State.doDeactivate(AbstractComponentManager.java:1387)
org.apache.felix.scr.impl.manager.AbstractComponentManager$Disabled.deactivate(AbstractComponentManager.java:1461)
org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:635)
org.apache.felix.scr.impl.manager.AbstractComponentManager$2.run(AbstractComponentManager.java:435)
org.apache.felix.scr.impl.ComponentActorThread.run(ComponentActorThread.java:98)
java.lang.Thread.run(Thread.java:680)
ThreadId: 67 : name: pool-1-thread-49 State: BLOCKED
LockInfo: org.apache.felix.framework.ServiceRegistry@26d66426 LockOwnerId: 16
LockOwnerName: SCR Component Actor
org.apache.felix.framework.ServiceRegistry.getServiceReferences(ServiceRegistry.java:204)
org.apache.felix.framework.Felix.getServiceReferences(Felix.java:3310)
org.apache.felix.framework.Felix.getAllowedServiceReferences(Felix.java:3383)
org.apache.felix.framework.BundleContextImpl.getServiceReferences(BundleContextImpl.java:432)
org.apache.felix.scr.impl.manager.DependencyManager.getFrameworkServiceReferences(DependencyManager.java:658)
org.apache.felix.scr.impl.manager.DependencyManager.getFrameworkServiceReferences(DependencyManager.java:634)
org.apache.felix.scr.impl.manager.DependencyManager.enable(DependencyManager.java:551)
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableDependencyManagers(AbstractComponentManager.java:1061)
org.apache.felix.scr.impl.manager.AbstractComponentManager.access$600(AbstractComponentManager.java:63)
org.apache.felix.scr.impl.manager.AbstractComponentManager$Disabled.enable(AbstractComponentManager.java:1445)
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:625)
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:358)
org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:384)
org.apache.felix.scr.impl.BundleComponentActivator.enableComponent(BundleComponentActivator.java:395)
org.apache.felix.scr.impl.manager.ComponentContextImpl.enableComponent(ComponentContextImpl.java:101)
test.scr.Main$EnableManager$1.run(Main.java:56)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:680)
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira