Invalid Thread Access in MenuManagerRenderer.contextDisposed [message #1182436] |
Tue, 12 November 2013 07:25 |
Matthias Nick Messages: 197 Registered: August 2013 |
Senior Member |
|
|
Hi, when I close my RCP application I get an invalid thread access:
org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:386)
at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:132)
at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76)
at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107)
at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70)
at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160)
at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:100)
at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:131)
at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:892)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:87)
at org.eclipse.osgi.container.Module.publishEvent(Module.java:454)
at org.eclipse.osgi.container.Module.doStop(Module.java:609)
at org.eclipse.osgi.container.Module.stop(Module.java:476)
at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:165)
at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:216)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
org.eclipse.swt.SWT.error(SWT.java:4419)
org.eclipse.swt.SWT.error(SWT.java:4334)
org.eclipse.swt.SWT.error(SWT.java:4305)
org.eclipse.swt.widgets.Display.error(Display.java:1257)
org.eclipse.swt.widgets.Display.checkDevice(Display.java:763)
org.eclipse.swt.widgets.Display.removeFilter(Display.java:4062)
org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.contextDisposed(MenuManagerRenderer.java:254)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:386)
org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:132)
org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76)
org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107)
org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70)
org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160)
org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:100)
org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:131)
org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:902)
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:89)
org.eclipse.osgi.container.Module.publishEvent(Module.java:456)
org.eclipse.osgi.container.Module.doStop(Module.java:611)
org.eclipse.osgi.container.Module.stop(Module.java:478)
org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:169)
org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:158)
java.lang.Thread.run(Thread.java:722)
I looked at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.contextDisposed():
@PreDestroy
public void contextDisposed() {
eventBroker.unsubscribe(itemUpdater);
eventBroker.unsubscribe(selectionUpdater);
eventBroker.unsubscribe(enabledUpdater);
eventBroker.unsubscribe(toBeRenderedUpdater);
ContextInjectionFactory.uninject(MenuManagerEventHelper.showHelper,
context);
MenuManagerEventHelper.showHelper = null;
ContextInjectionFactory.uninject(MenuManagerEventHelper.hideHelper,
context);
MenuManagerEventHelper.hideHelper = null;
context.remove(MenuManagerRendererFilter.class);
Display display = context.get(Display.class);
if (display != null && !display.isDisposed() && rendererFilter != null) {
display.removeFilter(SWT.Show, rendererFilter);
display.removeFilter(SWT.Hide, rendererFilter);
display.removeFilter(SWT.Dispose, rendererFilter);
}
if (rendererFilter != null) {
ContextInjectionFactory.uninject(rendererFilter, context);
rendererFilter = null;
}
context.remove(MenuManagerRenderer.class);
}
and the problem occurs in the line
display.removeFilter(SWT.Show, rendererFilter);
Can you guys help me find a solution?
Thank you very much,
Matthias
|
|
|
Re: Invalid Thread Access in MenuManagerRenderer.contextDisposed [message #1182543 is a reply to message #1182436] |
Tue, 12 November 2013 08:58 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
So when does it happen? It looks like the framework is going down and
then it disposes context on a none-ui thread.
To me this looks like a bug in EclipseContextOSGi.bundleChanged which
should make sure the disposal done on the UI-Thread - problem might be
at this level we don't have such an information because we are in the core.
Tom
On 12.11.13 08:25, Matthias Nick wrote:
> Hi, when I close my RCP application I get an invalid thread access:
>
>
> org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException:
> Invalid thread access
> at
> org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63)
>
> at
> org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
>
> at
> org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:386)
>
> at
> org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:132)
> at
> org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76)
>
> at
> org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107)
>
> at
> org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70)
>
> at
> org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
>
> at
> org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160)
>
> at
> org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:100)
>
> at
> org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:131)
>
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:892)
>
> at
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>
> at
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>
> at
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
>
> at
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
>
> at
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
>
> at
> org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:87)
>
> at org.eclipse.osgi.container.Module.publishEvent(Module.java:454)
> at org.eclipse.osgi.container.Module.doStop(Module.java:609)
> at org.eclipse.osgi.container.Module.stop(Module.java:476)
> at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:165)
> at
> org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:216)
>
> at java.lang.Thread.run(Thread.java:722)
> Caused by: org.eclipse.swt.SWTException: Invalid thread access
> org.eclipse.swt.SWT.error(SWT.java:4419)
> org.eclipse.swt.SWT.error(SWT.java:4334)
> org.eclipse.swt.SWT.error(SWT.java:4305)
> org.eclipse.swt.widgets.Display.error(Display.java:1257)
> org.eclipse.swt.widgets.Display.checkDevice(Display.java:763)
> org.eclipse.swt.widgets.Display.removeFilter(Display.java:4062)
> org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.contextDisposed(MenuManagerRenderer.java:254)
>
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>
> java.lang.reflect.Method.invoke(Method.java:601)
> org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
>
> org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
>
> org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:386)
>
> org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:132)
> org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76)
>
> org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107)
>
> org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70)
>
> org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
>
> org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160)
>
> org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:100)
>
> org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:131)
>
> org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:902)
>
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165)
>
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75)
>
> org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67)
>
> org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:89)
>
> org.eclipse.osgi.container.Module.publishEvent(Module.java:456)
> org.eclipse.osgi.container.Module.doStop(Module.java:611)
> org.eclipse.osgi.container.Module.stop(Module.java:478)
> org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:169)
> org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:158)
>
> java.lang.Thread.run(Thread.java:722)
>
>
> I looked at
> org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.contextDisposed():
>
>
>
> @PreDestroy
> public void contextDisposed() {
> eventBroker.unsubscribe(itemUpdater);
> eventBroker.unsubscribe(selectionUpdater);
> eventBroker.unsubscribe(enabledUpdater);
> eventBroker.unsubscribe(toBeRenderedUpdater);
>
> ContextInjectionFactory.uninject(MenuManagerEventHelper.showHelper,
> context);
> MenuManagerEventHelper.showHelper = null;
> ContextInjectionFactory.uninject(MenuManagerEventHelper.hideHelper,
> context);
> MenuManagerEventHelper.hideHelper = null;
>
> context.remove(MenuManagerRendererFilter.class);
> Display display = context.get(Display.class);
> if (display != null && !display.isDisposed() && rendererFilter
> != null) {
> display.removeFilter(SWT.Show, rendererFilter);
> display.removeFilter(SWT.Hide, rendererFilter);
> display.removeFilter(SWT.Dispose, rendererFilter);
> }
> if (rendererFilter != null) {
> ContextInjectionFactory.uninject(rendererFilter, context);
> rendererFilter = null;
> }
> context.remove(MenuManagerRenderer.class);
> }
>
>
> and the problem occurs in the line
>
>
> display.removeFilter(SWT.Show, rendererFilter);
>
>
> Can you guys help me find a solution?
> Thank you very much,
> Matthias
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03600 seconds