On 12/20/12 4:10 PM, Jad Naous wrote:
If a bundle undergoes a refresh while ipojo is still initializing
components, a deadlock can happen.  The issue is that if ipojo is
attempting to register a service, it will be doing it while synchronizing
on the InstanceCreator instance. It will then try to register a service
which requires the framework's global lock.

Registering a service doesn't require a global, just a bundle lock. I think this could be related to:

    https://issues.apache.org/jira/browse/FELIX-3761

This avoid grabbing the bundle lock when registering a service, so maybe it will help your situation. You could try to build the framework from trunk and see if it makes a difference.

If you aren't able to build from trunk, let me know and I'll try to publish a snapshot build since I don't think we have a recent one (we should do this no matter what).

-> richard


If a refresh is happening in another thread, the refresh will be holding
the framework's global lock, which will then call IPOJO's extender, which
then attempts to call a method on InstanceCreator, hence leading to the
deadlock.

Here are the stack traces:

Daemon Thread [Thread-1] (Suspended)
Object.wait(long) line: not available [native method]
Object[](Object).wait() line: 485
Felix.acquireBundleLock(BundleImpl, int) line: 4871
Felix.registerService(BundleImpl, String[], Object, Dictionary) line: 3205
BundleContextImpl.registerService(String[], Object, Dictionary) line: 346
IPojoContext.registerService(String[], Object, Dictionary) line: 385
ProvidedService.registerService() line: 362
ProvidedServiceHandler.__M_stateChanged(int) line: 509
ProvidedServiceHandler.stateChanged(int) line: not available
InstanceManager.setState(int) line: 536
InstanceManager.start() line: 418
ComponentFactory.createInstance(Dictionary, IPojoContext, HandlerManager[])
line: 179
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary,
ServiceContext) line: 310
ComponentFactory(IPojoFactory).createComponentInstance(Dictionary) line: 239
InstanceCreator$ManagedInstance.create(IPojoFactory) line: 355
InstanceCreator.addInstance(Dictionary, long) line: 89
Extender.parse(Bundle, String) line: 306
Extender.startManagementFor(Bundle) line: 237
Extender.access$600(Extender, Bundle) line: 52
Extender$CreatorThread.run() line: 769
Thread.run() line: 662

Daemon Thread [FelixFrameworkWiring] (Suspended)
InstanceCreator.removeInstancesFromBundle(long) line: 116
Extender.closeManagementFor(Bundle) line: 171
Extender.bundleChanged(BundleEvent) line: 153
EventDispatcher.invokeBundleListenerCallback(Bundle, EventListener,
EventObject) line: 868
EventDispatcher.fireEventImmediately(EventDispatcher, int, Map,
EventObject, Dictionary) line: 789
EventDispatcher.fireBundleEvent(BundleEvent, Framework) line: 514
Felix.fireBundleEvent(int, Bundle) line: 4244
Felix.stopBundle(BundleImpl, boolean) line: 2351
Felix$RefreshHelper.stop() line: 4629
Felix.refreshPackages(Collection, FrameworkListener[]) line: 3951
FrameworkWiringImpl.run() line: 172
Thread.run() line: 662


Reply via email to