You appear to be using Java 6 which does not allow the use of parallel
class loaders [1].  The only reliable way to avoid this kind of deadlock is
to use Java 7 so we can avoid the usage of the coarse grained class loader
lock.

Tom

[1]
http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#registerAsParallelCapable
()





From:   Martin Lippert <[email protected]>
To:     Equinox Dev <[email protected]>,
Date:   01/31/2014 05:21 AM
Subject:        [equinox-dev] weaving hook and classloading question
Sent by:        [email protected]



Hey!

From time to time we are facing a classical classloading deadlock situation
when using the Equinox weaving. I know that this is a difficult area and
seems to depend heavily on the underlying JDK that Equinox is running on
top of, but it keeps bothering me and I am trying to find a way to improve
this.

My guess is that the way we do the “additional classloading” in the Equinox
weaving hook implementation (for the AspectJ weaving) is involved in this
and could be handled more elegant to possibly avoid classloading deadlock
situations. We use the “postFindClass” hook to search for the class in
additional bundles (in case this “additional dependency” is defined by the
way the aspects are woven). It walks through a list of bundles and calls
“loadClass”. As you can see below, this is causing the deadlock in the end
(as far as I can see).

I attached a thread dump with a deadlock and put a marker on the
“postFindClass” calls.
Do you have any idea how to implement this differently to avoid this
deadlock situation?

Thanks a lot in advance!
-Martin




"main":
 waiting to lock monitor 0x00007fb32c4ab298 (object 0x00000000d3673308, a
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader),
 which is held by "Worker-1"
"Worker-1":
 waiting to lock monitor 0x00007fb32c035538 (object 0x00000000d34ceaf0, a
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader),
 which is held by "main"


"main":
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLoadedClass
(ClasspathManager.java:483)
                 - waiting to lock <0x00000000d3673308> (a
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass
(ClasspathManager.java:462)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass
(DefaultClassLoader.java:216)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass
(BundleLoader.java:395)
                 at
org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass
(SingleSourcePackage.java:35)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:461)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at org.eclipse.contribution.jdt.IsWovenTester.<clinit>
(IsWovenTester.aj:22)
                 at org.eclipse.contribution.jdt.JDTWeavingPlugin.start
(JDTWeavingPlugin.java:49)
                 at org.eclipse.osgi.framework.internal.core.BundleContextImpl
$1.run(BundleContextImpl.java:711)
                 at java.security.AccessController.doPrivileged(Native Method)
                 at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator
(BundleContextImpl.java:702)
                 at
org.eclipse.osgi.framework.internal.core.BundleContextImpl.start
(BundleContextImpl.java:683)
                 at
org.eclipse.osgi.framework.internal.core.BundleHost.startWorker
(BundleHost.java:381)
                 at
org.eclipse.osgi.framework.internal.core.AbstractBundle.start
(AbstractBundle.java:300)
                 at org.eclipse.osgi.framework.util.SecureAction.start
(SecureAction.java:478)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger
(BundleLoader.java:263)
                 at
org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass
(EclipseLazyStarter.java:109)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass
(ClasspathManager.java:469)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass
(DefaultClassLoader.java:216)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass
(BundleLoader.java:395)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:464)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at org.eclipse.osgi.internal.loader.BundleLoader.loadClass
(BundleLoader.java:340)
                 at
org.eclipse.osgi.framework.internal.core.BundleHost.loadClass
(BundleHost.java:229)
                 at
org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass
(AbstractBundle.java:1212)
                 at
org.eclipse.equinox.weaving.hooks.WeavingLoaderDelegateHook.postFindClass
(Unknown Source)         <======= weaving hook usage of postFindClass
                 at org.eclipse.osgi.internal.loader.BundleLoader.searchHooks
(BundleLoader.java:516)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:481)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at
org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider.computeDescriptor
(JavaElementImageProvider.java:1)
                 at
org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider.getImageLabel
(JavaElementImageProvider.java:97)
                 at
org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider.getImage
(JavaUILabelProvider.java:144)
                 at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerLabelProvider.getImage
(PackageExplorerLabelProvider.java:140)
                 at
org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.getImage
(DelegatingStyledCellLabelProvider.java:184)
                 at
org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider.getImage
(DecoratingStyledCellLabelProvider.java:167)
                 at
org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.update
(DelegatingStyledCellLabelProvider.java:118)
                 at
org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider.update
(DecoratingStyledCellLabelProvider.java:134)
                 at org.eclipse.jface.viewers.ViewerColumn.refresh
(ViewerColumn.java:152)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem
(AbstractTreeViewer.java:953)
                 at org.eclipse.jface.viewers.AbstractTreeViewer
$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:113)
                 at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
                 at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
                 at org.eclipse.jface.util.SafeRunnable.run
(SafeRunnable.java:175)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem
(AbstractTreeViewer.java:1033)
                 at org.eclipse.jface.viewers.StructuredViewer
$UpdateItemSafeRunnable.run(StructuredViewer.java:485)
                 at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
                 at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
                 at org.eclipse.jface.util.SafeRunnable.run
(SafeRunnable.java:175)
                 at org.eclipse.jface.viewers.StructuredViewer.updateItem
(StructuredViewer.java:2167)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem
(AbstractTreeViewer.java:848)
                 at
org.eclipse.jface.viewers.AbstractTreeViewer.createAddedElements
(AbstractTreeViewer.java:346)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.internalAdd
(AbstractTreeViewer.java:280)
                 at org.eclipse.jface.viewers.TreeViewer.internalAdd
(TreeViewer.java:662)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.add
(AbstractTreeViewer.java:155)
                 at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart
$PackageExplorerProblemTreeViewer.add(PackageExplorerPart.java:248)
                 at org.eclipse.jface.viewers.AbstractTreeViewer.add
(AbstractTreeViewer.java:667)
                 at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider
$4.run(PackageExplorerContentProvider.java:977)
                 at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider.runUpdates
(PackageExplorerContentProvider.java:195)
                 at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider.runPendingUpdates
(PackageExplorerContentProvider.java:187)
                 at
org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider
$1.runInUIThread(PackageExplorerContentProvider.java:165)
                 at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:95)
                 at org.eclipse.swt.widgets.RunnableLock.run
(RunnableLock.java:35)
                 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages
(Synchronizer.java:135)
                 - locked <0x00000000d9ecd160> (a
org.eclipse.swt.widgets.RunnableLock)
                 at org.eclipse.swt.widgets.Display.runAsyncMessages
(Display.java:3717)
                 at org.eclipse.swt.widgets.Display.readAndDispatch
(Display.java:3366)
                 at
org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run
(PartRenderingEngine.java:1113)
                 at
org.eclipse.core.databinding.observable.Realm.runWithDefault
(Realm.java:332)
                 at
org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run
(PartRenderingEngine.java:997)
                 at
org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI
(E4Workbench.java:138)
                 at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:610)
                 at
org.eclipse.core.databinding.observable.Realm.runWithDefault
(Realm.java:332)
                 at org.eclipse.ui.internal.Workbench.createAndRunWorkbench
(Workbench.java:567)
                 at org.eclipse.ui.PlatformUI.createAndRunWorkbench
(PlatformUI.java:150)
                 at
org.eclipse.ui.internal.ide.application.IDEApplication.start
(IDEApplication.java:124)
                 at org.eclipse.equinox.internal.app.EclipseAppHandle.run
(EclipseAppHandle.java:196)
                 at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication
(EclipseAppLauncher.java:110)
                 at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start
(EclipseAppLauncher.java:79)
                 at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:354)
                 at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:181)
                 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                 at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
                 at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
                 at java.lang.reflect.Method.invoke(Method.java:597)
                 at org.eclipse.equinox.launcher.Main.invokeFramework
(Main.java:636)
                 at org.eclipse.equinox.launcher.Main.basicRun(Main.java:591)
                 at org.eclipse.equinox.launcher.Main.run(Main.java:1450)
                 at org.eclipse.equinox.launcher.Main.main(Main.java:1426)
"Worker-1":
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLoadedClass
(ClasspathManager.java:483)
                 - waiting to lock <0x00000000d34ceaf0> (a
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass
(ClasspathManager.java:462)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass
(DefaultClassLoader.java:216)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass
(BundleLoader.java:395)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:464)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at org.eclipse.osgi.internal.loader.BundleLoader.loadClass
(BundleLoader.java:340)
                 at
org.eclipse.osgi.framework.internal.core.BundleHost.loadClass
(BundleHost.java:229)
                 at
org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass
(AbstractBundle.java:1212)
                 at
org.eclipse.equinox.weaving.hooks.WeavingLoaderDelegateHook.postFindClass
(Unknown Source)         <======= weaving hook usage of postFindClass
                 at org.eclipse.osgi.internal.loader.BundleLoader.searchHooks
(BundleLoader.java:516)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:481)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at java.lang.ClassLoader.defineClass1(Native Method)
                 at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
                 at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass
(DefaultClassLoader.java:188)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock
(ClasspathManager.java:638)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass
(ClasspathManager.java:620)
                 - locked <0x00000000d3673308> (a
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl
(ClasspathManager.java:574)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl
(ClasspathManager.java:492)
                 at
org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass
(ClasspathManager.java:465)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass
(DefaultClassLoader.java:216)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass
(BundleLoader.java:395)
                 at
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal
(BundleLoader.java:464)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:421)
                 at org.eclipse.osgi.internal.loader.BundleLoader.findClass
(BundleLoader.java:412)
                 at
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass
(DefaultClassLoader.java:107)
                 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
                 at
org.eclipse.jdt.internal.core.search.IndexSelector.initializeIndexLocations
(IndexSelector.java:188)
                 at
org.eclipse.jdt.internal.core.search.IndexSelector.getIndexLocations
(IndexSelector.java:276)
                 at
org.eclipse.jdt.internal.core.search.JavaSearchParticipant.selectIndexURLs
(JavaSearchParticipant.java:121)
                 at
org.eclipse.jdt.internal.core.search.PatternSearchJob.getIndexes
(PatternSearchJob.java:84)
                 at
org.eclipse.jdt.internal.core.search.PatternSearchJob.ensureReadyToRun
(PatternSearchJob.java:52)
                 at
org.eclipse.jdt.internal.core.search.processing.JobManager.performConcurrentJob
(JobManager.java:174)
                 at
org.eclipse.jdt.internal.core.search.BasicSearchEngine.searchAllTypeNames
(BasicSearchEngine.java:1135)
                 at org.eclipse.jdt.core.search.SearchEngine.searchAllTypeNames
(SearchEngine.java:746)
                 at org.eclipse.jdt.core.JavaCore.initializeAfterLoad
(JavaCore.java:4066)
                 at org.eclipse.jdt.internal.ui.InitializeAfterLoadJob
$RealJob.run(InitializeAfterLoadJob.java:36)
                 at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

Found 1 deadlock.
_______________________________________________
equinox-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/equinox-dev

<<inline: graycol.gif>>

_______________________________________________
equinox-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/equinox-dev

Reply via email to