Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 353257

Summary: dependency circle between cdt.core and cdt.managedbuilder.core
Product: [Tools] CDT Reporter: Daniel Friederich <danielfriederich>
Component: cdt-coreAssignee: Project Inbox <cdt-core-inbox>
Status: NEW --- QA Contact: Jonah Graham <jonah>
Severity: normal    
Priority: P3    
Version: 8.0   
Target Milestone: ---   
Hardware: PC   
OS: Windows 7   
Whiteboard:
Attachments:
Description Flags
eclipse .metadata/.log file during the issue none

Description Daniel Friederich CLA 2011-07-27 19:00:01 EDT
Build Identifier: 

The activator classes of the cdt.core, CCorePlugin and the cdt.managedbuilder.core ManagedBuilderCorePlugin do load each other during their start handling.

If one thread is using an class/type from the cdt.core plugin while another one is using a type from the cdt.managedbuilder.core, then the 2 threads end up in a dependency loop. equinox detects this for each class loaded and breaks the loop after 5 seconds.
In the end I see that some simple unit tests I run are timeout due to the accumulated 5 seconds delays. And of course, the failures also break the functionality.

I actually do not see this when starting up eclipse normally, only when using our test runner.

The CCorePlugin.start behavior loading the managed builder was introduced with bug 313038 in order to address a delay loading problem.
The ManagedBuilderCorePlugin class just needs stuff implemented in cdt.core.


Reproducible: Sometimes

Steps to Reproduce:
I can provide the call stacks easily, however the code using cdt.core and cdt.managedbuild.core is custom for both threads.
I hope the call stacks/eclipse .log file shows the problem clearly enough, if needed I can try to create a custom test.

One case:
the Worker-4 is activating org.eclipse.cdt.managedbuilder.core (see ManagedBuilderCorePlugin.start)
the main thread is activating org.eclipse.cdt.core  (see CCorePlugin.start)

Full threads:

Thread [Worker-4] (Suspended)   
    owns: org.eclipse.core.internal.variables.StringVariableManager  (id=50)   
    owns: java.lang.Class<T> (com.freescale.startup.RseInitializer) (id=51)   
    waiting for: java.lang.Object  (id=49)   
    java.lang.Object.wait(long) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).beginStateChange() line: 1085   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 282   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(java.lang.String) line: 33   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 477   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager.startup() line: 146   
    org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin.start(org.osgi.framework.BundleContext) line: 108   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run() line: 783   
    java.security.AccessController.doPrivileged(java.security.PrivilegedExceptionAction<T>) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(org.osgi.framework.BundleActivator) line: 774   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start() line: 755   
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(int) line: 370   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 284   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(java.lang.String) line: 33   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 477   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    java.lang.Class<T>.getDeclaredConstructors0(boolean) line: not available [native method]   
    java.lang.Class<T>.privateGetDeclaredConstructors(boolean) line: 2389   
    java.lang.Class<T>.getConstructor0(java.lang.Class[], int) line: 2699   
    java.lang.Class<T>.newInstance0() line: 326   
    java.lang.Class<T>.newInstance() line: 308   
    org.eclipse.core.internal.registry.osgi.EquinoxRegistryStrategy(org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI).createExecutableExtension(org.eclipse.core.runtime.spi.RegistryContributor, java.lang.String, java.lang.String) line: 184   
    org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(org.eclipse.core.runtime.spi.RegistryContributor, java.lang.String, java.lang.String) line: 904   
    org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(java.lang.String) line: 243   
    org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(java.lang.String) line: 55   
    org.eclipse.core.internal.variables.StringVariableManager.loadVariableProviders() line: 252   
    org.eclipse.core.internal.variables.StringVariableManager.initialize() line: 210   
    org.eclipse.core.internal.variables.StringVariableManager.getDynamicVariable(java.lang.String) line: 452   
    com.freescale.cdt.debug.cw.core.CWPlugin.getRuntimePath() line: 192   
    com.freescale.cdt.debug.cw.core.CWPlugin.inRuntimeWorkbench() line: 175   
    com.freescale.cdt.debug.cw.core.CWPlugin.getCWBinPath() line: 150   
    com.freescale.cdt.debug.cw.core.CWPlugin.start(org.osgi.framework.BundleContext) line: 268   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run() line: 783   
    java.security.AccessController.doPrivileged(java.security.PrivilegedExceptionAction<T>) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(org.osgi.framework.BundleActivator) line: 774   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start() line: 755   
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(int) line: 370   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 284   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(java.lang.String) line: 33   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 477   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    com.freescale.startup.RseInitializer.initRseHooks() line: 71   
    com.freescale.startup.StartupPlugin.start(org.osgi.framework.BundleContext) line: 54   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run() line: 783   
    java.security.AccessController.doPrivileged(java.security.PrivilegedExceptionAction<T>) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(org.osgi.framework.BundleActivator) line: 774   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start() line: 755   
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(int) line: 370   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 284   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 480   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    org.eclipse.osgi.internal.loader.BundleLoader.loadClass(java.lang.String) line: 349   
    org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(java.lang.String, boolean) line: 232   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).loadClass(java.lang.String) line: 1197   
   

Thread [main] (Suspended)   
    owns: org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager  (id=53)   
    owns: java.lang.Class<T> (org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager) (id=54)   
    owns: org.eclipse.swt.widgets.RunnableLock  (id=55)   
    waiting for: java.lang.Object  (id=52)   
    java.lang.Object.wait(long) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).beginStateChange() line: 1085   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 282   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 480   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    java.lang.Class<T>.getDeclaredConstructors0(boolean) line: not available [native method]   
    java.lang.Class<T>.privateGetDeclaredConstructors(boolean) line: 2389   
    java.lang.Class<T>.getConstructor0(java.lang.Class[], int) line: 2699   
    java.lang.Class<T>.newInstance0() line: 326   
    java.lang.Class<T>.newInstance() line: 308   
    org.eclipse.core.internal.registry.osgi.EquinoxRegistryStrategy(org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI).createExecutableExtension(org.eclipse.core.runtime.spi.RegistryContributor, java.lang.String, java.lang.String) line: 184   
    org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(org.eclipse.core.runtime.spi.RegistryContributor, java.lang.String, java.lang.String) line: 904   
    org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(java.lang.String) line: 243   
    org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(java.lang.String) line: 55   
    org.eclipse.cdt.internal.core.settings.model.CConfigurationDataProviderDescriptor.createProvider(org.eclipse.core.runtime.IExtension) line: 101   
    org.eclipse.cdt.internal.core.settings.model.CConfigurationDataProviderDescriptor.<init>(org.eclipse.core.runtime.IExtension) line: 55   
    org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.initProviderInfo() line: 1197   
    org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getInstance() line: 275   
    org.eclipse.cdt.core.CCorePlugin.start(org.osgi.framework.BundleContext) line: 318   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run() line: 783   
    java.security.AccessController.doPrivileged(java.security.PrivilegedExceptionAction<T>) line: not available [native method]   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(org.osgi.framework.BundleActivator) line: 774   
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start() line: 755   
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(int) line: 370   
    org.eclipse.osgi.framework.internal.core.BundleHost(org.eclipse.osgi.framework.internal.core.AbstractBundle).start(int) line: 284   
    org.eclipse.osgi.framework.util.SecureAction.start(org.osgi.framework.Bundle, int) line: 417   
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger() line: 276   
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(java.lang.String, java.lang.Class, org.eclipse.osgi.baseadaptor.loader.ClasspathManager) line: 106   
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(java.lang.String) line: 453   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(java.lang.String) line: 216   
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(java.lang.String) line: 404   
    org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(java.lang.String) line: 33   
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(java.lang.String, boolean, java.lang.ClassLoader) line: 477   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String, boolean) line: 433   
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(java.lang.String) line: 421   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(java.lang.String, boolean) line: 107   
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader(java.lang.ClassLoader).loadClass(java.lang.String) line: 248   
    com.freescale.core.ide.pathMapping.StartupListeners.execute() line: not available [local variables unavailable]   
    com.freescale.core.ide.pathMapping.StartupListeners$1.runInUIThread(org.eclipse.core.runtime.IProgressMonitor) line: not available   
    org.eclipse.ui.progress.UIJob$1.run() line: 96   
    org.eclipse.swt.widgets.RunnableLock.run() line: 35   
    org.eclipse.ui.internal.UISynchronizer(org.eclipse.swt.widgets.Synchronizer).runAsyncMessages(boolean, boolean) line: 154   
    org.eclipse.swt.widgets.Display.runAsyncMessages(boolean, boolean) line: 4056   
    org.eclipse.swt.widgets.Display.readAndDispatch(boolean) line: 3671   
    org.eclipse.ui.internal.Workbench.runEventLoop(org.eclipse.jface.window.Window$IExceptionHandler, org.eclipse.swt.widgets.Display) line: 2640   
    org.eclipse.ui.internal.Workbench.runUI() line: 2604   
    org.eclipse.ui.internal.Workbench.access$4(org.eclipse.ui.internal.Workbench) line: 2438   
    org.eclipse.ui.internal.Workbench$7.run() line: 671   
    org.eclipse.core.databinding.observable.Realm.runWithDefault(org.eclipse.core.databinding.observable.Realm, java.lang.Runnable) line: 332   
    org.eclipse.ui.internal.Workbench.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 664   
    org.eclipse.ui.PlatformUI.createAndRunWorkbench(org.eclipse.swt.widgets.Display, org.eclipse.ui.application.WorkbenchAdvisor) line: 149   
    org.eclipse.ui.internal.ide.application.IDEApplication.start(org.eclipse.equinox.app.IApplicationContext) line: 115   
    com.freescale.morpho.buildtools.unittest.TestRunner.start(org.eclipse.equinox.app.IApplicationContext) line: 217   
    org.eclipse.equinox.internal.app.EclipseAppHandle.run(java.lang.Object) line: 196   
    org.eclipse.equinox.internal.app.MainApplicationLauncher.run(java.lang.Object) line: 32   
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(java.lang.Object) line: 110   
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(java.lang.Object) line: 79   
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.Object) line: 369   
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(java.lang.String[], java.lang.Runnable) line: 179   
    sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) line: not available [native method]   
    sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 39   
    sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25   
    java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 597   
    org.eclipse.equinox.launcher.Main.invokeFramework(java.lang.String[], java.net.URL[]) line: 620   
    org.eclipse.equinox.launcher.Main.basicRun(java.lang.String[]) line: 575   
    org.eclipse.equinox.launcher.Main.run(java.lang.String[]) line: 1408
Comment 1 Daniel Friederich CLA 2011-07-27 19:06:15 EDT
Created attachment 200480 [details]
eclipse .metadata/.log file during the issue