Bug 25955 [Workbench] Exiting while saving can cause problems
This seems to be a problem with either the workbench in general or the editor structure in particular. I have reproduced this with the Java editor but there is no reason why it wouldn't occur with other editors as well. Dirty a Java editor. Press Ctrl+S to save the editor. While it is saving, quickly close the main perspective window, either by clicking the X or by choosing File->Save. When prompted to save dirty resources say Okay. An error dialog appears stating that the save failed, and a stack trace is printed to the log (sorry, I don't have my log anymore, but it's fairly easy to reproduce). The dialog says: "Problems occurred while trying to save the state of the workbench." Details: "Save cannot be called from inside an operation." I guess the real problem is that I'm able to exit while a workspace operation is taking place. Reproduced on both Win2K and Linux.
bundles/org.eclipse.ui.workbench/extensions/org/eclipse/jface/window/ApplicationWindow.java
/**
 * Create an application window instance, whose shell will be created under the
 * given parent shell.
 * Note that the window will have no visual representation (no widgets)
 * until it is told to open. By default, <code>open</code> does not block.
 *
 * @param parentShell the parent shell, or <code>null</code> to create a top-level shell
 */
public ApplicationWindow(Shell parentShell) {
	super(parentShell);
}
/**
 * Configures this window to have a menu bar.
 * Does nothing if it already has one.
 * This method must be called before this window's shell is created.
 */
protected void addMenuBar() {
	if ((getShell() == null) && (menuBarManager == null)) {
		menuBarManager = createMenuManager();
	}
}
/**
 * Configures this window to have a status line.
 * Does nothing if it already has one.
 * This method must be called before this window's shell is created.
 */
protected void addStatusLine() {
	if ((getShell() == null) && (statusLineManager == null)) {
		statusLineManager = createStatusLineManager();
	}