Bug 307405 [CommonNavigator] Deadlock in NavigatorContentServiceContentProvider
We are using an adopting product and one of our users encountered this deadlock when starting up their workspace: 1LKDEADLOCK Deadlock detected !!! NULL --------------------- NULL 2LKDEADLOCKTHR Thread "main" (0x41591300) 3LKDEADLOCKWTR is waiting for: 4LKDEADLOCKMON sys_mon_t:0x43134548 infl_mon_t: 0x43134580: 4LKDEADLOCKOBJ org/eclipse/ui/internal/navigator/NavigatorSaveablesService@0x05DB48A8/0x05DB48B4: 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "Framework Event Dispatcher" (0x42467700) 3LKDEADLOCKWTR which is waiting for: 4LKDEADLOCKMON sys_mon_t:0x43BA6AB8 infl_mon_t: 0x43BA6AF0: 4LKDEADLOCKOBJ org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider@0x0306F6E8/0x0306F6F4: 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "main" (0x41591300) I will attach the stack trace.
bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java
* Query each of <code>theOverridingExtensions</code> for children, and then
	 * pipe them through the Pipeline content provider.
	 * 
	 * @param aParent
	 *            The parent element in the tree
	 * @param theOverridingExtensions
	 *            The set of overriding extensions that should participate in
	 *            the pipeline chain
	 * @param pipelinedChildren
	 *            The current children to return to the viewer (should be
	 *            modifiable)
	 */
	private void pipelineChildren(Object aParent, NavigatorContentExtension[] theOverridingExtensions,
			INavigatorContentDescriptor firstClassDescriptor, ContributorTrackingSet pipelinedChildren, boolean elements) {
		IPipelinedTreeContentProvider pipelinedContentProvider;
		NavigatorContentExtension[] overridingExtensions;
		for (int i = 0; i < theOverridingExtensions.length; i++) {
			if (theOverridingExtensions[i].internalGetContentProvider().isPipelined()) {
				pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i]
						.internalGetContentProvider();
				pipelinedChildren.setContributor(theOverridingExtensions[i]
						.getDescriptor(), firstClassDescriptor);
				if (elements) {
					pipelinedContentProvider.getPipelinedElements(aParent, pipelinedChildren);
				} else {
					pipelinedContentProvider.getPipelinedChildren(aParent, pipelinedChildren);
				}
				overridingExtensions = theOverridingExtensions[i].getOverridingExtensionsForTriggerPoint(aParent);
				if (overridingExtensions.length > 0) {
					pipelineChildren(aParent, overridingExtensions, firstClassDescriptor, pipelinedChildren, elements);