Bug 379791 - SWTException: Graphic is disposed for PlaceholderImpl
Summary: SWTException: Graphic is disposed for PlaceholderImpl
Status: VERIFIED FIXED
Alias: None
Product: Platform
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 4.2   Edit
Hardware: PC Mac OS X - Carbon (unsup.)
: P3 normal (vote)
Target Milestone: 4.2 RC1   Edit
Assignee: Bogdan Gheorghe CLA
QA Contact:
URL:
Whiteboard:
Keywords:
: 378359 379976 (view as bug list)
Depends on:
Blocks:
 
Reported: 2012-05-17 05:47 EDT by Marcel Bruch CLA
Modified: 2012-05-22 11:55 EDT (History)
8 users (show)

See Also:
gheorghe: review+


Attachments
Patch (1.81 KB, patch)
2012-05-18 13:02 EDT, Bogdan Gheorghe CLA
no flags Details | Diff
Ensure that we never return a disposed 'override' image (863 bytes, patch)
2012-05-18 14:47 EDT, Eric Moffatt CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Marcel Bruch CLA 2012-05-17 05:47:08 EDT
In 
Version: 4.2.0
Build id: I20120515-2200

I get frequent exceptions like the one below when closing the workbench.

Ids mentioned: elementId: org.eclipse.jdt.ui.JavadocView & elementId: org.eclipse.jdt.ui.SourceView

!ENTRY org.eclipse.e4.ui.workbench 4 0 2012-05-17 11:39:53.855
!MESSAGE Exception occurred while unrendering: org.eclipse.e4.ui.model.application.ui.advanced.impl.PlaceholderImpl@4dc6bbd3 (elementId: org.eclipse.jdt.ui.SourceView, tags: [], contributorURI: null) (widget: null, renderer: null, toBeRendered: true, onTop: false, visible: true, containerData: null, accessibilityPhrase: null) (closeable: false)
!STACK 0
org.eclipse.swt.SWTException: Graphic is disposed
	at org.eclipse.swt.SWT.error(SWT.java:4361)
	at org.eclipse.swt.SWT.error(SWT.java:4276)
	at org.eclipse.swt.SWT.error(SWT.java:4247)
	at org.eclipse.swt.graphics.Image.getBounds(Image.java:666)
	at org.eclipse.swt.custom.CTabFolderRenderer.computeSize(CTabFolderRenderer.java:246)
	at org.eclipse.e4.ui.workbench.renderers.swt.CTabRendering.computeSize(CTabRendering.java:149)
	at org.eclipse.swt.custom.CTabFolder.setItemSize(CTabFolder.java:2668)
	at org.eclipse.swt.custom.CTabFolder.updateItems(CTabFolder.java:3637)
	at org.eclipse.swt.custom.CTabFolder.updateItems(CTabFolder.java:3574)
	at org.eclipse.swt.custom.CTabFolder.destroyItem(CTabFolder.java:737)
	at org.eclipse.swt.custom.CTabItem.dispose(CTabItem.java:126)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.hideChild(StackRenderer.java:799)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:774)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:789)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:789)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:789)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:796)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:796)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:796)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:796)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:763)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:758)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:743)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.stop(PartRenderingEngine.java:1069)
	at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1115)
	at org.eclipse.ui.internal.Workbench.access$15(Workbench.java:995)
	at org.eclipse.ui.internal.Workbench$16.run(Workbench.java:1176)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1174)
	at org.eclipse.ui.internal.Workbench.close(Workbench.java:1147)
	at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1155)
	at org.eclipse.ui.internal.WorkbenchWindow.access$16(WorkbenchWindow.java:1135)
	at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1184)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1182)
	at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1194)
	at org.eclipse.ui.internal.WorkbenchWindow$6.close(WorkbenchWindow.java:441)
	at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer$10.shellClosed(WBWRenderer.java:562)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:98)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4130)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1457)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1480)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1465)
	at org.eclipse.swt.widgets.Shell.closeWidget(Shell.java:599)
	at org.eclipse.swt.widgets.Shell.windowShouldClose(Shell.java:2284)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:5467)
	at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
	at org.eclipse.swt.widgets.Widget.callSuper(Widget.java:220)
	at org.eclipse.swt.widgets.Widget.windowSendEvent(Widget.java:2101)
	at org.eclipse.swt.widgets.Shell.windowSendEvent(Shell.java:2280)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:5533)
	at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
	at org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:4978)
	at org.eclipse.swt.widgets.Display.applicationProc(Display.java:5127)
	at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
	at org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:128)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3612)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1017)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:911)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86)
	at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:582)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:537)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	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:353)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
	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:629)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
Comment 1 Paul Webster CLA 2012-05-17 07:22:41 EDT
Eric, could this be effected by the fix for the part image disappearing after a DND operation?

PW
Comment 2 Brian de Alwis CLA 2012-05-17 08:57:56 EDT
(In reply to comment #1)
> Eric, could this be effected by the fix for the part image disappearing after a
> DND operation?

The patch for bug 378184 shouldn't have any impact here: it overrides the AbstractPartRenderer#getImage(MUIElement), and the committed code has a guard to prevent returning a disposed image.  And the overridden image returned in that patch was already been in place until the DND (e.g., the test case of the Problems view: the custom icon is already seen when the part is first created).
Comment 3 Paul Webster CLA 2012-05-18 10:31:21 EDT
See also bug 379976

PW
Comment 4 Paul Webster CLA 2012-05-18 11:50:59 EDT
*** Bug 379976 has been marked as a duplicate of this bug. ***
Comment 5 Paul Webster CLA 2012-05-18 11:56:21 EDT
Turns out it's the interaction of bug 378184 with our org.eclipse.ui.internal.e4.compatibility.CompatibilityView.updateImages(MPart) code and the difference of how we treat an uninstantiated view in a non-active perspective when the view instance is closed.

- In the short term, we will revert bug 378184.

- We also need to open a new bug to fix how org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.updateTabImages(MUIElement) works

- Bogdan has agreed to put some protection CTabFolder/CTabRendering/CTabFolderRenderer to turn the exception into a no-op, as hitting this exception can destroy your perspective.

PW
Comment 6 Eric Moffatt CLA 2012-05-18 12:41:33 EDT
I've reverted the changes made to fix Bug 378184 and re-opened it (for 4.2.1).

Since this fixes this issue I'll mark this defect for RC1 and as FIXED...
Comment 7 Bogdan Gheorghe CLA 2012-05-18 13:02:44 EDT
Created attachment 215865 [details]
Patch
Comment 8 Eric Moffatt CLA 2012-05-18 14:45:04 EDT
Re-opening to fix an issue in the TrimStack...
Comment 9 Eric Moffatt CLA 2012-05-18 14:47:09 EDT
Created attachment 215870 [details]
Ensure that we never return a disposed 'override' image
Comment 10 Eric Moffatt CLA 2012-05-18 14:57:52 EDT
commit 40ffef101aae6a9a1b7679c1edb682e2e9462b52

Ensures that we don't return a disposed 'override' image. I was testing essentially the same scenario using a minimized stack (since it's the other consumer of the image stored in the transient data) and encountered a similar issue...
Comment 11 Eric Moffatt CLA 2012-05-19 12:42:40 EDT
Verified in I20120518-2145.
Comment 12 Bogdan Gheorghe CLA 2012-05-22 11:55:10 EDT
*** Bug 378359 has been marked as a duplicate of this bug. ***