IJPL-149317 Disable Write Intent Lock for runnables executed on EDT

Add explicit locks in Performance testing community plugin.

GitOrigin-RevId: caa5abbc927ed464a3728b26111b5c99294bda9f
This commit is contained in:
Lev Serebryakov
2024-08-09 15:51:51 +02:00
committed by intellij-monorepo-bot
parent 4ac8160910
commit 22b79b4cc4
6 changed files with 41 additions and 25 deletions

View File

@@ -2,6 +2,7 @@ package com.jetbrains.performancePlugin.commands
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.ui.playback.PlaybackContext
import com.intellij.openapi.ui.playback.commands.PlaybackCommandCoroutineAdapter
@@ -44,17 +45,19 @@ class CollectAllFilesCommand(text: String, line: Int) : PlaybackCommandCoroutine
}
withContext(Dispatchers.EDT) {
val index = ProjectFileIndex.getInstance(project)
extensions.forEach { extension ->
getAllFilesByExt(project, extension, GlobalSearchScope.projectScope(project))
.forEach { file ->
val searchCondition = when (fromSources) {
true -> index.isInSourceContent(file)
else -> true
writeIntentReadAction {
extensions.forEach { extension ->
getAllFilesByExt(project, extension, GlobalSearchScope.projectScope(project))
.forEach { file ->
val searchCondition = when (fromSources) {
true -> index.isInSourceContent(file)
else -> true
}
if (searchCondition) {
collectedFiles.appendText(file.path + "\n")
}
}
if (searchCondition) {
collectedFiles.appendText(file.path + "\n")
}
}
}
}
}
}

View File

@@ -6,6 +6,7 @@ import com.intellij.internal.performance.LatencyRecord
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.editor.actionSystem.LatencyListener
import com.intellij.openapi.fileEditor.impl.NonProjectFileWritingAccessProvider
import com.intellij.openapi.ui.playback.PlaybackContext
@@ -85,7 +86,9 @@ class DelayTypeCommand(text: String, line: Int) : PlaybackCommandCoroutineAdapte
NonProjectFileWritingAccessProvider.allowWriting(listOf(editor.virtualFile))
}
span.addEvent("Typing ${text[i]}")
typingTarget.type(text[i].toString())
writeIntentReadAction {
typingTarget.type(text[i].toString())
}
}
}
}

View File

@@ -4,6 +4,7 @@ import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.ex.ActionManagerEx.Companion.getInstanceEx
import com.intellij.openapi.actionSystem.ex.ActionUtil
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.ui.playback.PlaybackContext
@@ -41,7 +42,9 @@ class ExecuteEditorActionCommand(text: String, line: Int) : PlaybackCommandCorou
withContext(Dispatchers.EDT) {
spanRef.set(span.startSpan())
val job = DaemonCodeAnalyzerListener.listen(connection, spanRef, expectedOpenedFile = expectedOpenedFile)
executeAction(editor, parameter)
writeIntentReadAction {
executeAction(editor, parameter)
}
job.waitForComplete()
}
}

View File

@@ -8,6 +8,7 @@ import com.intellij.ide.RecentProjectsManager
import com.intellij.ide.impl.OpenProjectTask
import com.intellij.ide.lightEdit.LightEdit
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.progress.EmptyProgressIndicator
import com.intellij.openapi.progress.ProgressIndicator
@@ -83,14 +84,16 @@ class OpenProjectCommand(text: String, line: Int) : PlaybackCommandCoroutineAdap
if (!project.isDefault) {
withContext(Dispatchers.EDT) {
WindowManager.getInstance().updateDefaultFrameInfoOnProjectClose(project)
writeIntentReadAction {
WindowManager.getInstance().updateDefaultFrameInfoOnProjectClose(project)
// for backward compatibility with older code
if (closeProjectBeforeOpening) {
// prevent the script from stopping on project close
context.setProject(null)
// for backward compatibility with older code
if (closeProjectBeforeOpening) {
// prevent the script from stopping on project close
context.setProject(null)
ProjectManager.getInstance().closeAndDispose(project)
ProjectManager.getInstance().closeAndDispose(project)
}
}
}
RecentProjectsManager.getInstance().updateLastProjectPath()

View File

@@ -2,6 +2,7 @@ package com.jetbrains.performancePlugin.commands
import com.intellij.configurationStore.saveProjectsAndApp
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.playback.PlaybackContext
@@ -20,7 +21,7 @@ class SaveDocumentsAndSettingsCommand(text: String, line: Int) : PlaybackCommand
suspend fun save(project: Project) {
withContext(CoroutineName("save docs and project settings")) {
withContext(Dispatchers.EDT) {
FileDocumentManager.getInstance().saveAllDocuments()
writeIntentReadAction { FileDocumentManager.getInstance().saveAllDocuments() }
}
saveProjectsAndApp(forceSavingAllSettings = true, onlyProject = project)
}

View File

@@ -4,6 +4,7 @@ import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl
import com.intellij.codeInsight.daemon.impl.SeverityRegistrar
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.PathManager
import com.intellij.openapi.application.writeIntentReadAction
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.ui.playback.PlaybackContext
import com.intellij.openapi.ui.playback.commands.PlaybackCommandCoroutineAdapter
@@ -33,12 +34,14 @@ class StoreHighlightingResultsCommand(text: String, line: Int) : PlaybackCommand
val editor = FileEditorManager.getInstance(project).selectedTextEditor
require(editor != null)
withContext(Dispatchers.EDT) {
val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.document)
require(psiFile != null)
for (severity in SeverityRegistrar.getSeverityRegistrar(project).allSeverities) {
val highlights = DaemonCodeAnalyzerImpl.getHighlights(editor.document, severity, project)
highlights.forEach { highlight ->
fileForStoringHighlights.appendText("${severity}${highlight.description}${editor.document.getLineNumber(highlight.actualStartOffset)}" + "\n")
writeIntentReadAction {
val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.document)
require(psiFile != null)
for (severity in SeverityRegistrar.getSeverityRegistrar(project).allSeverities) {
val highlights = DaemonCodeAnalyzerImpl.getHighlights(editor.document, severity, project)
highlights.forEach { highlight ->
fileForStoringHighlights.appendText("${severity}${highlight.description}${editor.document.getLineNumber(highlight.actualStartOffset)}" + "\n")
}
}
}
}