IJPL-162718 use background on write only if no modality

GitOrigin-RevId: 1ebfd65e16f9ba00743a7fd796d7ce292ae25cd7
This commit is contained in:
Vladimir Krivosheev
2024-10-14 16:48:31 +02:00
committed by intellij-monorepo-bot
parent 27a2f65317
commit 536f549a23
2 changed files with 14 additions and 4 deletions

View File

@@ -194,7 +194,6 @@ com.intellij.openapi.application.Application
- *:isWriteThread():Z
- *:runWriteIntentReadAction(com.intellij.openapi.util.ThrowableComputable):java.lang.Object
f:com.intellij.openapi.application.CoroutinesKt
- *sf:backgroundWriteAction(kotlin.jvm.functions.Function0,kotlin.coroutines.Continuation):java.lang.Object
- *sf:isBackgroundWriteAction(kotlin.coroutines.CoroutineContext):Z
- *sf:writeAction(kotlin.jvm.functions.Function0,kotlin.coroutines.Continuation):java.lang.Object
- *sf:writeIntentReadAction(kotlin.jvm.functions.Function0,kotlin.coroutines.Continuation):java.lang.Object

View File

@@ -15,6 +15,7 @@ import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.ApiStatus.Experimental
import org.jetbrains.annotations.ApiStatus.Internal
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.coroutineContext
/**
* Suspends until it's possible to obtain the read lock and then
@@ -255,6 +256,8 @@ private object RunInBackgroundWriteActionMarker
fun CoroutineContext.isBackgroundWriteAction(): Boolean =
currentThreadContext()[RunInBackgroundWriteActionMarker] != null
private val useBackgroundWriteAction = System.getProperty("idea.background.write.action.enabled", "false").toBoolean()
/**
* Runs given [action] under [write lock][com.intellij.openapi.application.Application.runWriteAction].
*
@@ -273,12 +276,20 @@ fun CoroutineContext.isBackgroundWriteAction(): Boolean =
*/
@Experimental
@ApiStatus.Obsolete
@Internal
suspend fun <T> backgroundWriteAction(action: () -> T): T {
return withContext(Dispatchers.Default + RunInBackgroundWriteActionMarker) {
blockingContext {
ApplicationManager.getApplication().runWriteAction(Computable(action))
if (useBackgroundWriteAction) {
val contextModality = coroutineContext.contextModality()
if (contextModality == null || contextModality == ModalityState.nonModal()) {
return withContext(Dispatchers.Default + RunInBackgroundWriteActionMarker) {
blockingContext {
ApplicationManager.getApplication().runWriteAction(Computable(action))
}
}
}
}
return writeAction(action)
}
/**