From 20565cd7f969c6dcaabf529d7c1530591fa73ddd Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 8 Mar 2016 20:38:31 +0100 Subject: [PATCH] invoke saveAll under a transaction --- .../compiler/actions/CompileActionBase.java | 3 ++ .../compiler/server/BuildManager.java | 32 +++---------------- .../intellij/ide/SaveAndSyncHandlerImpl.java | 9 ++---- .../intellij/ide/actions/SaveAllAction.java | 2 ++ .../options/ex/SingleConfigurableEditor.java | 3 +- .../options/newEditor/SettingsDialog.java | 3 +- .../actions/AbstractCommonCheckinAction.java | 5 ++- 7 files changed, 18 insertions(+), 39 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/actions/CompileActionBase.java b/java/compiler/impl/src/com/intellij/compiler/actions/CompileActionBase.java index f7f320df8342..1b6ef6c9ad24 100644 --- a/java/compiler/impl/src/com/intellij/compiler/actions/CompileActionBase.java +++ b/java/compiler/impl/src/com/intellij/compiler/actions/CompileActionBase.java @@ -17,6 +17,8 @@ package com.intellij.compiler.actions; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.TransactionKind; +import com.intellij.openapi.application.WrapInTransaction; import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -24,6 +26,7 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbService; import com.intellij.psi.PsiFile; +@WrapInTransaction(TransactionKind.Common.ANY_CHANGE) public abstract class CompileActionBase extends AnAction implements DumbAware { public void actionPerformed(AnActionEvent e) { final DataContext dataContext = e.getDataContext(); diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index e825106a03e2..369ad83d08b7 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -36,10 +36,7 @@ import com.intellij.ide.PowerSaveMode; import com.intellij.ide.file.BatchFileChangeListener; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.application.Application; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.application.*; import com.intellij.openapi.compiler.CompilationStatusListener; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompilerPaths; @@ -77,7 +74,6 @@ import com.intellij.openapi.vfs.newvfs.events.VFileEvent; import com.intellij.openapi.vfs.newvfs.impl.FileNameCache; import com.intellij.openapi.wm.IdeFrame; import com.intellij.util.*; -import com.intellij.util.concurrency.Semaphore; import com.intellij.util.concurrency.SequentialTaskExecutor; import com.intellij.util.containers.IntArrayList; import com.intellij.util.io.storage.HeavyProcessLatch; @@ -105,7 +101,6 @@ import org.jetbrains.jps.cmdline.ClasspathBootstrap; import org.jetbrains.jps.incremental.Utils; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; -import javax.swing.*; import javax.tools.*; import java.awt.*; import java.io.File; @@ -186,25 +181,11 @@ public class BuildManager implements Disposable { return Registry.intValue("compiler.document.save.trigger.delay"); } - private final Semaphore mySemaphore = new Semaphore(); - private final Runnable mySaveDocsRunnable = new Runnable() { - @Override - public void run() { - try { - ((FileDocumentManagerImpl)FileDocumentManager.getInstance()).saveAllDocuments(false); - } - finally { - mySemaphore.up(); - } - } - }; - @Override public void runTask() { if (shouldSaveDocuments()) { - mySemaphore.down(); - ApplicationManager.getApplication().invokeLater(mySaveDocsRunnable, ModalityState.NON_MODAL); - mySemaphore.waitFor(); + TransactionGuard.getInstance().submitTransactionAndWait(TransactionKind.ANY_CHANGE, () -> + ((FileDocumentManagerImpl)FileDocumentManager.getInstance()).saveAllDocuments(false)); } } @@ -772,12 +753,7 @@ public class BuildManager implements Disposable { // ensure project model is saved on disk, so that automake sees the latest model state. // For ordinary make all project, app settings and unsaved docs are always saved before build starts. try { - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - project.save(); - } - }); + TransactionGuard.getInstance().submitTransactionAndWait(TransactionKind.ANY_CHANGE, project::save); } catch (Throwable e) { LOG.info(e); diff --git a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandlerImpl.java b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandlerImpl.java index 40abb126da78..4d24e0aa97f4 100644 --- a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandlerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandlerImpl.java @@ -74,12 +74,9 @@ public class SaveAndSyncHandlerImpl extends SaveAndSyncHandler implements Dispos mySettings = generalSettings; myProgressManager = progressManager; - myIdleListener = new Runnable() { - @Override - public void run() { - if (mySettings.isAutoSaveIfInactive() && canSyncOrSave()) { - ((FileDocumentManagerImpl)fileDocumentManager).saveAllDocuments(false); - } + myIdleListener = () -> { + if (mySettings.isAutoSaveIfInactive() && canSyncOrSave()) { + TransactionGuard.submitTransaction(() -> ((FileDocumentManagerImpl)fileDocumentManager).saveAllDocuments(false)); } }; IdeEventQueue.getInstance().addIdleListener(myIdleListener, mySettings.getInactiveTimeout() * 1000); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java b/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java index 1425b458c288..2a7b35ebc404 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/SaveAllAction.java @@ -18,9 +18,11 @@ package com.intellij.ide.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.WrapInTransaction; import com.intellij.openapi.project.DumbAware; import org.jetbrains.annotations.NotNull; +@WrapInTransaction public class SaveAllAction extends AnAction implements DumbAware { @Override public void actionPerformed(@NotNull AnActionEvent e) { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java index 4987e9164122..d1755b1948a9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java @@ -19,6 +19,7 @@ import com.intellij.CommonBundle; import com.intellij.ide.actions.ShowSettingsUtilImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.BaseConfigurable; @@ -288,7 +289,7 @@ public class SingleConfigurableEditor extends DialogWrapper { myConfigurable = null; if (mySaveAllOnClose) { - ApplicationManager.getApplication().saveAll(); + TransactionGuard.submitTransaction(ApplicationManager.getApplication()::saveAll); } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java index 2d41df1698e5..b01e269a473e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java @@ -18,6 +18,7 @@ package com.intellij.openapi.options.newEditor; import com.intellij.CommonBundle; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableGroup; @@ -156,7 +157,7 @@ public class SettingsDialog extends DialogWrapper implements DataProvider { @Override public void doOKAction() { if (myEditor.apply()) { - ApplicationManager.getApplication().saveAll(); + TransactionGuard.submitTransaction(ApplicationManager.getApplication()::saveAll); SettingsDialog.super.doOKAction(); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractCommonCheckinAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractCommonCheckinAction.java index a99268db1e66..bd59b40c2b80 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractCommonCheckinAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractCommonCheckinAction.java @@ -17,8 +17,7 @@ package com.intellij.openapi.vcs.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.*; @@ -80,7 +79,7 @@ public abstract class AbstractCommonCheckinAction extends AbstractVcsAction { @NotNull protected FilePath[] prepareRootsForCommit(@NotNull FilePath[] roots, @NotNull Project project) { if (ApplicationManager.getApplication().isDispatchThread()) { - ApplicationManager.getApplication().saveAll(); + TransactionGuard.submitTransaction(ApplicationManager.getApplication()::saveAll); } return filterDescindingFiles(roots, project);