consider progress modality write-safe when it's created (not started) in a write-safe context (EA-83534 - assert: TransactionGuardImpl.submitTransactionAndWait)

This commit is contained in:
peter
2016-06-15 20:15:34 +02:00
parent 33012c4c70
commit 002a601f33
2 changed files with 33 additions and 3 deletions
@@ -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
@@ -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']
}
}