Return-Path: X-Original-To: apmail-felix-dev-archive@www.apache.org Delivered-To: apmail-felix-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C9DE2D814 for ; Thu, 27 Sep 2012 21:33:08 +0000 (UTC) Received: (qmail 12761 invoked by uid 500); 27 Sep 2012 21:33:08 -0000 Delivered-To: apmail-felix-dev-archive@felix.apache.org Received: (qmail 12691 invoked by uid 500); 27 Sep 2012 21:33:08 -0000 Mailing-List: contact dev-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list dev@felix.apache.org Received: (qmail 12589 invoked by uid 99); 27 Sep 2012 21:33:08 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Sep 2012 21:33:08 +0000 Date: Fri, 28 Sep 2012 08:33:08 +1100 (NCT) From: "David Jencks (JIRA)" To: dev@felix.apache.org Message-ID: <1503014069.136033.1348781588306.JavaMail.jiratomcat@arcas> Subject: [jira] [Created] (FELIX-3687) Deadlock potential from ServiceRegistry.unregisterService MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 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