From e3c5dd260a89663db5c6f085d73fa7b4e8dbe4d7 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Fri, 18 Aug 2023 17:14:52 +0200 Subject: [PATCH] IJPL-210 add `ChildContext.runAsCoroutine` GitOrigin-RevId: d22b6ac9b97c4ea2cc4965b195c748aee0acb0b5 --- .../openapi/progress/impl/ProgressRunner.java | 7 +------ .../ide-core/src/com/intellij/util/Alarm.java | 3 +-- .../src/com/intellij/util/ui/update/Update.java | 8 +------- .../actionSystem/impl/ActionManagerImpl.kt | 11 ++--------- .../openapi/project/MergingTaskQueue.java | 8 +------- .../com/intellij/util/concurrency/propagation.kt | 16 +++++++++++++++- 6 files changed, 21 insertions(+), 32 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/progress/impl/ProgressRunner.java b/platform/core-impl/src/com/intellij/openapi/progress/impl/ProgressRunner.java index d398a05a651c..f00b4f10fb1f 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/impl/ProgressRunner.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/impl/ProgressRunner.java @@ -461,12 +461,7 @@ public final class ProgressRunner { Runnable contextRunnable = context.equals(EmptyCoroutineContext.INSTANCE) ? runnable : (ContextAwareRunnable)() -> { CoroutineContext effectiveContext = context.plus(asContextElement(progressIndicator.getModalityState())); try (AccessToken ignored = ThreadContext.installThreadContext(effectiveContext, false)) { - if (job != null) { - Propagation.runAsCoroutine(job, runnable); - } - else { - runnable.run(); - } + childContext.runAsCoroutine(runnable); } }; switch (myThreadToUse) { diff --git a/platform/ide-core/src/com/intellij/util/Alarm.java b/platform/ide-core/src/com/intellij/util/Alarm.java index 0d2aa332e958..c5523a180132 100644 --- a/platform/ide-core/src/com/intellij/util/Alarm.java +++ b/platform/ide-core/src/com/intellij/util/Alarm.java @@ -366,8 +366,7 @@ public class Alarm implements Disposable { try (AccessToken ignored = ClientId.withClientId(myClientId)) { if (myChildContext != null) { try (AccessToken ignored2 = ThreadContext.installThreadContext(myChildContext.getContext(), true)) { - CompletableJob job = myChildContext.getJob(); - QueueProcessor.runSafely(job == null ? task : () -> Propagation.runAsCoroutine(job, task)); + QueueProcessor.runSafely(() -> myChildContext.runAsCoroutine(task)); } } else { diff --git a/platform/ide-core/src/com/intellij/util/ui/update/Update.java b/platform/ide-core/src/com/intellij/util/ui/update/Update.java index c343794cb184..bb13e4d948a5 100644 --- a/platform/ide-core/src/com/intellij/util/ui/update/Update.java +++ b/platform/ide-core/src/com/intellij/util/ui/update/Update.java @@ -110,13 +110,7 @@ public abstract class Update extends ComparableObject.Impl implements Runnable { } else { try (AccessToken ignored = ThreadContext.installThreadContext(myChildContext.getContext(), true)) { - CompletableJob job = myChildContext.getJob(); - if (job != null) { - Propagation.runAsCoroutine(job, this); - } - else { - run(); - } + myChildContext.runAsCoroutine(this); } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.kt b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.kt index ea0806867cbc..87d0e6552fcc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.kt @@ -60,7 +60,6 @@ import com.intellij.util.childScope import com.intellij.util.concurrency.AppExecutorUtil import com.intellij.util.concurrency.ChildContext import com.intellij.util.concurrency.createChildContext -import com.intellij.util.concurrency.runAsCoroutine import com.intellij.util.containers.ContainerUtil import com.intellij.util.ui.StartupUiUtil.addAwtListener import com.intellij.util.xml.dom.XmlElement @@ -1311,14 +1310,8 @@ open class ActionManagerImpl protected constructor(private val coroutineScope: C override fun run() { installThreadContext(childContext.context).use { - val job = childContext.job - if (job == null) { - timerListener.run() - } - else { - // this is periodic runnable that is invoked on timer; it should not complete a parent job - runAsCoroutine(job = job, completeOnFinish = false, action = timerListener::run) - } + // this is periodic runnable that is invoked on timer; it should not complete a parent job + childContext.runAsCoroutine(completeOnFinish = false, timerListener::run) } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/MergingTaskQueue.java b/platform/platform-impl/src/com/intellij/openapi/project/MergingTaskQueue.java index b71b2ddf0cec..b519d0532cc0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/MergingTaskQueue.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/MergingTaskQueue.java @@ -326,13 +326,7 @@ public class MergingTaskQueue> { beforeTask(); if (AppExecutorUtil.propagateContextOrCancellation() && myChildContext != null) { try (AccessToken ignored = ThreadContext.installThreadContext(myChildContext.getContext(), true)) { - CompletableJob job = myChildContext.getJob(); - if (job != null) { - Propagation.runAsCoroutine(job, () -> myTask.perform(indicator)); - } - else { - myTask.perform(indicator); - } + myChildContext.runAsCoroutine(() -> myTask.perform(indicator)); } } else { diff --git a/platform/util/src/com/intellij/util/concurrency/propagation.kt b/platform/util/src/com/intellij/util/concurrency/propagation.kt index b88da7c82215..e71b1bad6219 100644 --- a/platform/util/src/com/intellij/util/concurrency/propagation.kt +++ b/platform/util/src/com/intellij/util/concurrency/propagation.kt @@ -75,7 +75,21 @@ class BlockingJob(val blockingJob: Job) : AbstractCoroutineContextElement(Blocki data class ChildContext internal constructor( val context: CoroutineContext, val job: CompletableJob?, -) +) { + + fun runAsCoroutine(action: Runnable) { + runAsCoroutine(completeOnFinish = true, action::run) + } + + fun runAsCoroutine(completeOnFinish: Boolean, action: () -> T): T { + return if (job == null) { + action() + } + else { + runAsCoroutine(job, completeOnFinish, action) + } + } +} @Internal fun createChildContext(): ChildContext {