mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
IJPL-162718 use background on write only if no modality
GitOrigin-RevId: 1ebfd65e16f9ba00743a7fd796d7ce292ae25cd7
This commit is contained in:
committed by
intellij-monorepo-bot
parent
27a2f65317
commit
536f549a23
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user