Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 351216 - [GC] Throws unexpected "Graphic is diposed" exception
Summary: [GC] Throws unexpected "Graphic is diposed" exception
Status: RESOLVED FIXED
Alias: None
Product: RAP
Classification: RT
Component: RWT (show other bugs)
Version: 1.3   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 1.5 M1   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-07-05 12:12 EDT by Rüdiger Herrmann CLA
Modified: 2011-07-05 14:55 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Rüdiger Herrmann CLA 2011-07-05 12:12:55 EDT
The snippet below works in SWT but fails in RWT:

canvas.addPaintListener(new PaintListener() {
		public void paintControl(PaintEvent event) {
			Rectangle rect = canvas.getClientArea();
			Color color = new Color( display, 0, 128, 64 );
			event.gc.setForeground( color );
			event.gc.drawOval(0, 0, rect.width - 1, rect.height - 1);
			color.dispose();
		}
	} );

The CanvasLCA accesses properties from the already disposed color object in order to assemble the changes to be sent to the client.
	
Stack trace
-------------
org.eclipse.swt.SWTException: Graphic is disposed
	at org.eclipse.swt.SWT.error(SWT.java:3536)
	at org.eclipse.swt.SWT.error(SWT.java:3459)
	at org.eclipse.swt.SWT.error(SWT.java:3430)
	at org.eclipse.swt.graphics.Color.getRed(Color.java:175)
	at org.eclipse.rwt.lifecycle.JSWriter.getColorValue(JSWriter.java:902)
	at org.eclipse.rwt.lifecycle.JSWriter.createParamList(JSWriter.java:837)
	at org.eclipse.rwt.lifecycle.JSWriter.createParamList(JSWriter.java:805)
	at org.eclipse.rwt.lifecycle.JSWriter.call(JSWriter.java:595)
	at org.eclipse.swt.internal.widgets.canvaskit.GCOperationWriter.setProperty(GCOperationWriter.java:233)
	at org.eclipse.swt.internal.widgets.canvaskit.GCOperationWriter.write(GCOperationWriter.java:72)
	at org.eclipse.swt.internal.widgets.canvaskit.CanvasLCA.writeGCOperations(CanvasLCA.java:62)
	at org.eclipse.swt.internal.widgets.canvaskit.CanvasLCA.renderChanges(CanvasLCA.java:45)
	at org.eclipse.rwt.lifecycle.AbstractWidgetLCA.render(AbstractWidgetLCA.java:36)
	at org.eclipse.swt.internal.widgets.displaykit.DisplayLCA$RenderVisitor.render(DisplayLCA.java:73)
Comment 1 Rüdiger Herrmann CLA 2011-07-05 12:15:47 EDT
Other resources (Font, Image, what else?) are probably also affected.
Comment 2 Rüdiger Herrmann CLA 2011-07-05 14:18:41 EDT
The exception when using a Color during a GC operation and immediately disposing of it is fixed. Instead of storing the Color object for later rendering, only the RGB object that describes the color is stored.
Changes are in CVS HEAD (and will be in 1.5M1)

I will leave this bug open until potential issues with other Resources are fixed or it turns out that they are not affected.
Comment 3 Rüdiger Herrmann CLA 2011-07-05 14:35:59 EDT
Fonts are not affected, added test case to GCOperationWriter_Test to further ensure this. Changes are in CVS HEAD
Comment 4 Rüdiger Herrmann CLA 2011-07-05 14:55:40 EDT
I added a test to ensure that rendering a GC with disposed image does not cause exception.
As Cursor isn't used by GC methods, all Resources that can be used by a GC are now safe.