| Summary: | [Compatibility] A close with 2 WW open causes NPEs | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Product: | [Eclipse Project] e4 | Reporter: | Paul Webster <pwebster> | ||||||
| Component: | UI | Assignee: | Remy Suen <remy.suen> | ||||||
| Status: | VERIFIED FIXED | QA Contact: | Remy Suen <remy.suen> | ||||||
| Severity: | critical | ||||||||
| Priority: | P3 | CC: | emoffatt, remy.suen | ||||||
| Version: | unspecified | Flags: | pwebster:
review+
|
||||||
| Target Milestone: | 4.1 RC4 | ||||||||
| Hardware: | All | ||||||||
| OS: | All | ||||||||
| Whiteboard: | |||||||||
| Bug Depends on: | |||||||||
| Bug Blocks: | 347858 | ||||||||
| Attachments: |
|
||||||||
|
Description
Paul Webster
I can generate this without any patches. it's a render on close: !ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2011-05-31 16:45:59.085 !MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt". !STACK 0 java.lang.NullPointerException at org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer.createWidget(MenuManagerRenderer.java:312) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:833) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:587) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$6.run(PartRenderingEngine.java:501) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:486) at org.eclipse.ui.internal.WorkbenchWindow.setup(WorkbenchWindow.java:534) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) at java.lang.reflect.Method.invoke(Method.java:611) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56) at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:828) at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:108) at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:78) at org.eclipse.e4.core.contexts.ContextInjectionFactory.inject(ContextInjectionFactory.java:72) at org.eclipse.ui.internal.Workbench.createWorkbenchWindow(Workbench.java:1178) at org.eclipse.ui.internal.Workbench.getActiveWorkbenchWindow(Workbench.java:1152) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.getActiveWindow(WorkbenchSourceProvider.java:438) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.updateActivePart(WorkbenchSourceProvider.java:464) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:302) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:297) at org.eclipse.ui.internal.services.WorkbenchSourceProvider$2.windowClosed(WorkbenchSourceProvider.java:266) at org.eclipse.ui.internal.Workbench$8.run(Workbench.java:895) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.Workbench.fireWindowClosed(Workbench.java:893) at org.eclipse.ui.internal.WorkbenchWindow.fireWindowClosed(WorkbenchWindow.java:1162) at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1357) at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1074) at org.eclipse.ui.internal.WorkbenchWindow.access$9(WorkbenchWindow.java:1053) at org.eclipse.ui.internal.WorkbenchWindow$6.run(WorkbenchWindow.java:1100) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1098) at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1041) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1035) at org.eclipse.ui.internal.Workbench.access$12(Workbench.java:947) at org.eclipse.ui.internal.Workbench$15.run(Workbench.java:1116) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) at org.eclipse.ui.internal.Workbench.close(Workbench.java:1114) at org.eclipse.ui.internal.Workbench.close(Workbench.java:1087) at org.eclipse.ui.internal.handlers.QuitHandler.execute(QuitHandler.java:36) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293) at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) at java.lang.reflect.Method.invoke(Method.java:611) at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56) at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:226) at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:207) at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:122) at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:142) at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:621) at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:533) at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$5(HandledContributionItem.java:517) at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$3.handleEvent(HandledContributionItem.java:481) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1258) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3586) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3207) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:944) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:860) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:87) at org.eclipse.ui.internal.Workbench$3.run(Workbench.java:542) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:522) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) 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:344) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) at java.lang.reflect.Method.invoke(Method.java:611) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) at org.eclipse.equinox.launcher.Main.run(Main.java:1410) at org.eclipse.equinox.launcher.Main.main(Main.java:1386) It took a couple of opens and closes with one editor open in each window, then one window no editors, then open an editor in that window and close. bug 347858 is a side effect of this, as the exceptions kill the close and seem to impair some of the model cleanup. PW I was able to reproduce this once just now in an inner. Some code was added to prevent this before bug 333764...though looking back at the patch now I don't see why that would've fixed that problem. I got it again just now with three workbench windows. I am in the process of closing the third and last (in the list of model windows of the application) workbench window and it's trying to recreate a workbench window for the second window in the last (which also happens to be the selected element). Usually my steps from a clean workspace are: 1) import some code 2) open a few editors 3) New window, and open some editors in window 2 4) exit from window2 5) start again, close editors in window2 6) exit from window2 7) start again, open editors in window2 8) exit from window1 For some reason, the window close kicks the WorkbenchSourceProvider which gets the active window which has a path which creates a new (or recreates the existing) MWindow. PW Created attachment 197142 [details]
One option - move the boolean v01
This fixes the problem ... but means that Workbench.getActiveWW() will return null for the entire shutdown.
This seems potentially dangerous, since a view probably expects at least one WW to survive it.
PW
Created attachment 197144 [details]
Workbench patch v1
If we destroy the selected element last then the getActiveWorkbenchWindow() method shouldn't inadvertently try to create a workbench window because the call will return itself.
I like this patch better. Simply close the selected window last. PW (In reply to comment #8) > I like this patch better. Simply close the selected window last. Thanks, Paul. Attachment 197144 [details] released to CVS HEAD. I can verify that 'File > Exit' closes other windows first before the current window that's on top with I20110604-2201. |