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

Bug 113155

Summary: [Viewers] Widget is disposed error in AbstractTreeViewer
Product: [Eclipse Project] Platform Reporter: Pawel Piech <pawel.1.piech>
Component: UIAssignee: Boris Bokowski <bokowski>
Status: RESOLVED DUPLICATE QA Contact:
Severity: normal    
Priority: P2 CC: eclipse
Version: 3.1   
Target Milestone: 3.2   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Pawel Piech CLA 2005-10-19 16:35:29 EDT
The error is very intermittent but occurs during a period of frequent updates to
the tree.  

My guess is that the new tree item is disposed somewhere in the call to
StructuredViewer.updateItem, which in turn calls SafeRunnable.run(new
UpdateItemSafeRunnable(widget, element, true)), which ends up calling
TreeViewer.doUpdateItem.  TreeViewer.doUpdateItem itself checks
item.isDisposed() more than once, because the user code within could run the
event loop and dispose the widget.  
It might be enough to reverse the order of calls to updateItem and updatePlus,
or to check if item is disposed before calling updatePlus.

org.eclipse.swt.SWTException: Widget is disposed
	at org.eclipse.swt.SWT.error(SWT.java:2942)
	at org.eclipse.swt.SWT.error(SWT.java:2865)
	at org.eclipse.swt.SWT.error(SWT.java:2836)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:395)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:297)
	at org.eclipse.swt.widgets.TreeItem.getItemCount(TreeItem.java:566)
	at org.eclipse.jface.viewers.TreeViewer.getItemCount(TreeViewer.java:379)
	at
org.eclipse.jface.viewers.AbstractTreeViewer.updatePlus(AbstractTreeViewer.java:1844)
	at
org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:536)
	at
org.eclipse.jface.viewers.AbstractTreeViewer.createAddedElements(AbstractTreeViewer.java:248)
	at
org.eclipse.jface.viewers.AbstractTreeViewer.internalAdd(AbstractTreeViewer.java:181)
	at org.eclipse.jface.viewers.AbstractTreeViewer.add(AbstractTreeViewer.java:124)
	at
org.eclipse.debug.internal.ui.views.RemoteTreeViewer.add(RemoteTreeViewer.java:268)
	at org.eclipse.jface.viewers.AbstractTreeViewer.add(AbstractTreeViewer.java:393)
	at
org.eclipse.debug.internal.ui.views.RemoteTreeViewer.add(RemoteTreeViewer.java:260)
	at
org.eclipse.debug.internal.ui.views.launch.LaunchViewer.add(LaunchViewer.java:39)
	at
org.eclipse.debug.internal.ui.views.AbstractDebugEventHandler.insert(AbstractDebugEventHandler.java:208)
	at
org.eclipse.debug.internal.ui.views.launch.LaunchViewEventHandler.doHandleDebugEvents(LaunchViewEventHandler.java:108)
	at
org.eclipse.debug.internal.ui.views.AbstractDebugEventHandler$EventProcessingJob.runInUIThread(AbstractDebugEventHandler.java:105)
	at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:93)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3057)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2716)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1699)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1663)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:367)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
	at
com.windriver.ide.application.CopyOfIDEApplication.run(CopyOfIDEApplication.java:103)
	at
com.windriver.ide.application.UnifiedSWTSwingApplication.access$101(UnifiedSWTSwingApplication.java:24)
	at
com.windriver.ide.application.UnifiedSWTSwingApplication.run(UnifiedSWTSwingApplication.java:33)
	at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:226)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
	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:324)
	at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
	at org.eclipse.core.launcher.Main.run(Main.java:973)
	at org.eclipse.core.launcher.Main.main(Main.java:948)
Comment 1 Boris Bokowski CLA 2005-10-20 10:03:58 EDT
Does the error occur in the Eclipse SDK (so that I have a chance to reproduce
it)? Do you have an idea how I could turn this into a JUnit test case?
Comment 2 Pawel Piech CLA 2005-10-20 10:23:03 EDT
We've only oberved this bug with our implementation of the debugger, and as it
is, we've only had two recorded cases of it.  
Our debugger implementation is particular in that it's very asynchronous in
nature, and it ends up posting a lot of updates to the tree items, sometimes in
rapid succession.  
Since this is a multi-threaded timing issue I'm not sure if you could reliably
reproduce it in a junit test case.  But if you *really* wanted to force this
error, I suppose you could intentionally remove the tree item from the label
provider that is called by the TreeViewer.doUpdateItem.
Comment 3 Boris Bokowski CLA 2006-05-23 13:58:00 EDT

*** This bug has been marked as a duplicate of 139328 ***