Exception during dispose in GlazedListsEventLayer [message #1446425] |
Thu, 16 October 2014 16:54  |
Eclipse User |
|
|
|
After upgrading to 1.1.1, I get an exception when my rcp application (e4.4 with compatibility layer) is trying to shut down:
org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)
at org.eclipse.swt.SWT.error(SWT.java:4441)
at org.eclipse.swt.SWT.error(SWT.java:4356)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:139)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764)
at org.eclipse.swt.widgets.Display.release(Display.java:3817)
at org.eclipse.swt.graphics.Device.dispose(Device.java:295)
at org.ecabia.das.Application.start(Application.java:27)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
Caused by: org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4441)
at org.eclipse.swt.SWT.error(SWT.java:4356)
at org.eclipse.swt.SWT.error(SWT.java:4327)
at org.eclipse.swt.widgets.Widget.error(Widget.java:476)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348)
at org.eclipse.swt.widgets.ScrollBar.getEnabled(ScrollBar.java:237)
at org.eclipse.nebula.widgets.nattable.viewport.ScrollBarScroller.getEnabled(ScrollBarScroller.java:96)
at org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer.recalculateVerticalScrollBar(ViewportLayer.java:1000)
at org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer.setMinimumOriginY(ViewportLayer.java:276)
at org.eclipse.nebula.widgets.nattable.viewport.event.ViewportEventHandler.handleLayerEvent(ViewportEventHandler.java:166)
at org.eclipse.nebula.widgets.nattable.viewport.event.ViewportEventHandler.handleLayerEvent(ViewportEventHandler.java:1)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.handleLayerEvent(AbstractLayer.java:228)
at org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer.handleLayerEvent(ViewportLayer.java:1189)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.fireLayerEvent(AbstractLayer.java:261)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.handleLayerEvent(AbstractLayer.java:234)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.fireLayerEvent(AbstractLayer.java:261)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.handleLayerEvent(AbstractLayer.java:234)
at org.eclipse.nebula.widgets.nattable.hideshow.AbstractColumnHideShowLayer.handleLayerEvent(AbstractColumnHideShowLayer.java:50)
at org.eclipse.nebula.widgets.nattable.hideshow.ColumnHideShowLayer.handleLayerEvent(ColumnHideShowLayer.java:64)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.fireLayerEvent(AbstractLayer.java:261)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.handleLayerEvent(AbstractLayer.java:234)
at org.eclipse.nebula.widgets.nattable.reorder.ColumnReorderLayer.handleLayerEvent(ColumnReorderLayer.java:95)
at org.eclipse.nebula.widgets.nattable.layer.AbstractLayer.fireLayerEvent(AbstractLayer.java:261)
at org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer$2.run(GlazedListsEventLayer.java:131)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136)
... 18 more
GlazedListsEventLayer apparently tries to access an already disposed widget. Any ideas what has changed since 1.0.0 that may be causing this?
|
|
|
|
Re: Exception during dispose in GlazedListsEventLayer [message #1446849 is a reply to message #1446813] |
Fri, 17 October 2014 07:53   |
Eclipse User |
|
|
|
Hello,
we experienced a similar problem with a custom table layer implementation, where we schedule a task for firing a layer event to be executed on the Display thread, quite similar to what the GlazedListsEventLayer does (in line 128).
The problem is IMO that at the time when the scheduled task will actually be executed, the table may have already been disposed. As a consequence, when the table's ViewportLayer tries to handle the emitted event, it'll fail when trying to adjust the related scrollbars. Actually, the ViewportLayer knows that the table has been disposed at that time, it just doesn't consider that when handling the next layer event.
To fix the described problem, we replaced the standard ViewportLayer implementation with a subclass that overrides the "dispose" and "handleLayerEvent" as follows:
public final class SafeViewportLayer extends ViewportLayer {
private final AtomicBoolean disposed;
public SafeViewportLayer(final IUniqueIndexLayer underlyingLayer) {
super(underlyingLayer);
this.disposed = new AtomicBoolean();
}
@Override
public void dispose() {
if (disposed.compareAndSet(false, true)) {
super.dispose();
}
}
@Override
public void handleLayerEvent(final ILayerEvent event) {
if (!disposed.get()) {
super.handleLayerEvent(event);
}
}
}
Regards,
Frank
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.08806 seconds