Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 344030 - deadlock loading classes while activating bundles
Summary: deadlock loading classes while activating bundles
Status: RESOLVED WORKSFORME
Alias: None
Product: Equinox
Classification: Eclipse Project
Component: Framework (show other bugs)
Version: 3.7   Edit
Hardware: PC Mac OS X - Carbon (unsup.)
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: equinox.framework-inbox CLA
QA Contact:
URL:
Whiteboard: stalebug
Keywords:
: 352654 (view as bug list)
Depends on:
Blocks:
 
Reported: 2011-04-27 15:29 EDT by Jeff McAffer CLA
Modified: 2019-10-25 09:11 EDT (History)
4 users (show)

See Also:


Attachments
deadlock with lock classname (13.92 KB, application/octet-stream)
2011-05-06 15:42 EDT, Jeff McAffer CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jeff McAffer CLA 2011-04-27 15:29:07 EDT
in M6

Came across a deadlock problem running PDE Build (headless) but using the full Eclipse IDE install and the -application org.eclipse.ant.core.AntRunner application.  Looking at the stack traces it appears that
a) for some reason UI class loading is being trigger eventhough we are running headless
b) the ui.workbench's WorkbenchPlugin class is registering a *synchronous* bundle listener to track which bundles are starting. It maintains this starting list in a sychronize-protected hashset.

Somehow the code in this relatively simple block is causing classloading thus forming the circularity and a deadlock.

The stack trace is attached below.


657 Found one Java-level deadlock:
657 =============================
657 "Worker-0":
657 waiting to lock monitor 0x08a00c84 (object 0xa12e41f8, a org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader),
657 which is held by "main"
657 "main":
657 waiting to lock monitor 0x08a00af4 (object 0x74c5e418, a java.util.HashSet),
657 which is held by "Worker-0"
657 
657 Java stack information for the threads listed above:
657 ===================================================
657 "Worker-0":
657    at org.eclipse.ui.internal.WorkbenchPlugin.bundleChanged(WorkbenchPlugin.java:1250)
657    - locked <0x74c5e418> (a java.util.HashSet)
657    at org.eclipse.ui.internal.WorkbenchPlugin.access$1(WorkbenchPlugin.java:1246)
657    at org.eclipse.ui.internal.WorkbenchPlugin$3.bundleChanged(WorkbenchPlugin.java:1239)
657    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
657    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
658    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
658    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1522)
658    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1458)
658    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1453)
658    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:367)
658    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
658    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)
658    at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268)
658    at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)
658    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:460)
658    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
658    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
660    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
660    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
660    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
660    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
660    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
660    at org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
660    at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)
660    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207)
660    at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174)
660    at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
660    at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
660    at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
660    at org.eclipse.core.internal.resources.Workspace.initializeTeamHook(Workspace.java:1864)
660    at org.eclipse.core.internal.resources.Workspace.getTeamHook(Workspace.java:1782)
661    at org.eclipse.core.internal.resources.Rules.<init>(Rules.java:43)
661    at org.eclipse.core.internal.resources.Workspace.getRuleFactory(Workspace.java:1762)
661    at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:2245)
661    at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2305)
661    at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2292)
661    at org.eclipse.jdt.internal.core.JavaModelManager$19.run(JavaModelManager.java:4849)
661    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
661 "main":
661    at org.eclipse.ui.internal.WorkbenchPlugin.bundleChanged(WorkbenchPlugin.java:1250)
661    - waiting to lock <0x74c5e418> (a java.util.HashSet)
661    at org.eclipse.ui.internal.WorkbenchPlugin.access$1(WorkbenchPlugin.java:1246)
661    at org.eclipse.ui.internal.WorkbenchPlugin$3.bundleChanged(WorkbenchPlugin.java:1239)
661    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
661    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
661    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
661    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1522)
661    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1458)
661    at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1453)
661    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:367)
661    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
661    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)
661    at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268)
661    at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)
661    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:460)
661    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
661    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
661    at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)
661    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:464)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
662    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
662    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
662    at org.eclipse.ui.internal.WorkbenchPlugin.isBidiMessageText(WorkbenchPlugin.java:954)
662    at org.eclipse.ui.internal.WorkbenchPlugin.checkCommandLineLocale(WorkbenchPlugin.java:982)
662    at org.eclipse.ui.internal.WorkbenchPlugin.getDefaultOrientation(WorkbenchPlugin.java:937)
662    at org.eclipse.ui.internal.WorkbenchPlugin.start(WorkbenchPlugin.java:888)
662    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
662    at java.security.AccessController.doPrivileged(Native Method)
662    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
662    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
662    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
662    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
662    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)
662    at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268)
662    at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107)
662    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:460)
662    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
662    at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:473)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
662    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
662    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
662    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
662    at java.lang.ClassLoader.defineClass1(Native Method)
662    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
662    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
662    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
663    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:589)
663    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:557)
663    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:488)
663    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:476)
663    - locked <0x74ca0fd0> (a org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader)
663    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:456)
663    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
663    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
663    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
663    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
663    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
663    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
663    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
663    at org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
663    at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)
663    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:164)
663    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:679)
663    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
663    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
663    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440)
663    at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268)
663    at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:236)
663    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207)
663    at org.eclipse.ant.core.AntCorePreferences$WrappedClassLoader.findClass(AntCorePreferences.java:116)
663    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
663    - locked <0xa132c5d0> (a org.eclipse.ant.core.AntCorePreferences$WrappedClassLoader)
663    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
664    at org.eclipse.ant.internal.core.AntClassLoader.loadClassPlugins(AntClassLoader.java:69)
664    at org.eclipse.ant.internal.core.AntClassLoader.findClass(AntClassLoader.java:47)
664    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
664    - locked <0x74ca1250> (a org.eclipse.ant.internal.core.AntClassLoader)
664    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
664    at org.eclipse.ant.core.AntRunner.run(AntRunner.java:510)
664    at org.eclipse.ant.core.AntRunner.start(AntRunner.java:600)
664    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
664    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
664    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
664    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
664    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
664    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
664    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
664    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
664    at java.lang.reflect.Method.invoke(Method.java:597)
664    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
664    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
664    at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
664    at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Comment 1 Thomas Watson CLA 2011-04-27 16:02:17 EDT
This is very much related to bug212262 and could be considered a duplicate.  Running on Java SE 7 should fix it.  You could try running with the following configuration option on Java SE 6 or 5:

osgi.classloader.type=parallel

If you are running on the Sun/Oracle VM <=6 then you must also run with the following VM options:

   -XX:+UnlockDiagnosticVMOptions
   -XX:+UnsyncloadClass

One thing that concerns me about the "main" stack track is that we are starting bundles in the "main" thread while in the middle of doing a ClassLoader.defineClass call.  It appears the bundle associated with the class loader performing the ClassLoader.defineClass call is active since we do not push it onto the stack of bundles to be activated after successful class definition.  This is behaving as specified.  One thing we could consider doing is delaying the lazy starts until after the successful definition of the initiating class.  Currently we delay until after the first "trigger" class is defined which may happen before returning from the initiating class definition.  This would allow us to release at least one of the class loader locks before starting the lazy start bundles involved in the class definition call.

I am reluctant to make that kind of change in behavior because of the change in start timing this would introduce.
Comment 2 Thomas Watson CLA 2011-05-04 14:02:30 EDT
(In reply to comment #1)
> This is very much related to bug212262 and could be considered a duplicate. 
> Running on Java SE 7 should fix it.  You could try running with the following
> configuration option on Java SE 6 or 5:
> 
> osgi.classloader.type=parallel

Sorry to have mislead you!  This option is set to parallel by default and really only takes effect if running on Java 7.  On pre-java7 you need the following set to prevent the class loader level lock:

osgi.classloader.lock=classname


> 
> If you are running on the Sun/Oracle VM <=6 then you must also run with the
> following VM options:
> 
>    -XX:+UnlockDiagnosticVMOptions
>    -XX:+UnsyncloadClass
>
Comment 3 Jeff McAffer CLA 2011-05-04 14:13:08 EDT
These options don't make any difference.  Deadlock still occurs.

After talking with Tom some, it turns out that on Java <= 6 the parallel option in config.ini is not the thing to try.  Rather is should be
     osgi.classloader.lock=classname

the eclipse.ini (vm) arguments are still needed.

Will try this and report progress...

Note also that I entered bug 344727 against the UI to see about changing the way they do the WorkbenchPlugin bundle listening.  While what they are doing "should" work, it clearly does not in certain situations of stock install.
Comment 4 Jeff McAffer CLA 2011-05-06 15:42:19 EDT
Created attachment 194983 [details]
deadlock with lock classname

The deadlock is still happening even with classname locking.
Comment 5 Thomas Watson CLA 2011-07-20 15:19:08 EDT
*** Bug 352654 has been marked as a duplicate of this bug. ***
Comment 6 Eclipse Genie CLA 2019-10-25 00:05:31 EDT
This bug hasn't had any activity in quite some time. Maybe the problem got resolved, was a duplicate of something else, or became less pressing for some reason - or maybe it's still relevant but just hasn't been looked at yet.

If you have further information on the current state of the bug, please add it. The information can be, for example, that the problem still occurs, that you still want the feature, that more information is needed, or that the bug is (for whatever reason) no longer relevant.

--
The automated Eclipse Genie.
Comment 7 Thomas Watson CLA 2019-10-25 09:11:53 EDT
Things have changed much since this was opened.  Closing as worksforme.