Community
Participate
Working Groups
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)
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.
(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 >
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.
Created attachment 194983 [details] deadlock with lock classname The deadlock is still happening even with classname locking.
*** Bug 352654 has been marked as a duplicate of this bug. ***
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.
Things have changed much since this was opened. Closing as worksforme.