From 002a601f335282fe41885b3ce21b6c113cbfb1f4 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 15 Jun 2016 20:15:34 +0200 Subject: [PATCH] consider progress modality write-safe when it's created (not started) in a write-safe context (EA-83534 - assert: TransactionGuardImpl.submitTransactionAndWait) --- .../util/AbstractProgressIndicatorBase.java | 5 +++ .../application/TransactionTest.groovy | 31 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java index 76a0ab1fcbe6..5b164f8520fa 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java @@ -17,6 +17,8 @@ package com.intellij.openapi.progress.util; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.TransactionGuard; +import com.intellij.openapi.application.TransactionGuardImpl; import com.intellij.openapi.application.impl.ModalityStateEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; @@ -216,6 +218,9 @@ public class AbstractProgressIndicatorBase extends UserDataHolderBase implements myModalityProgress = modalityProgress; ModalityState currentModality = ApplicationManager.getApplication().getCurrentModalityState(); myModalityState = myModalityProgress != null ? ((ModalityStateEx)currentModality).appendProgress(myModalityProgress) : currentModality; + if (modalityProgress != null) { + ((TransactionGuardImpl)TransactionGuard.getInstance()).enteredModality(myModalityState); + } } @Override diff --git a/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy b/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy index 584b11530347..81ad77a19ddc 100644 --- a/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy +++ b/platform/platform-tests/testSrc/com/intellij/application/TransactionTest.groovy @@ -4,6 +4,7 @@ import com.intellij.ide.IdeEventQueue import com.intellij.openapi.application.* import com.intellij.openapi.application.impl.LaterInvocator import com.intellij.openapi.progress.ProgressManager +import com.intellij.openapi.progress.util.ProgressWindow import com.intellij.openapi.roots.ex.ProjectRootManagerEx import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.EmptyRunnable @@ -82,9 +83,7 @@ class TransactionTest extends LightPlatformTestCase { def disposable = Disposer.newDisposable('assertWritingProhibited') LoggedErrorProcessor.instance.disableStderrDumping(disposable) try { - app.runWriteAction { - ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.instance, false, true) - } + app.runWriteAction { makeRootsChange() } } catch (AssertionError ignore) { writeActionFailed = true @@ -97,6 +96,10 @@ class TransactionTest extends LightPlatformTestCase { } } + private static makeRootsChange() { + ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.instance, false, true) + } + public void "test parent disposable"() { def parent = Disposer.newDisposable() @@ -318,4 +321,26 @@ class TransactionTest extends LightPlatformTestCase { assert log == ['1', '2'] } + public void "test progress created on EDT and run on pooled thread"() { + TransactionGuard.submitTransaction testRootDisposable, { + def progress = new ProgressWindow(true, project) + + def process = { + log << '1' + assert progress.modalityState != ModalityState.NON_MODAL + assert guard.getModalityTransaction(progress.modalityState) + + Runnable writeAction = { + makeRootsChange() + log << '2' + } + app.invokeLater({ app.runWriteAction(writeAction) }, progress.modalityState) + } + + app.executeOnPooledThread { ProgressManager.getInstance().runProcess(process, progress) }.get() + } + UIUtil.dispatchAllInvocationEvents() + assert log == ['1', '2'] + } + }