From f0e7e884d9dd24c8ccd55c0936b7879ee55fa786 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 1 Mar 2023 16:58:33 +0100 Subject: [PATCH] add `CoroutineSuspender.isPaused` GitOrigin-RevId: 2fb484bf129cca5640aa0bb6629f8effd876b8fb --- .../core-api/src/com/intellij/openapi/progress/suspender.kt | 6 ++++++ .../openapi/progress/impl/CoroutineSuspenderTest.kt | 3 +++ 2 files changed, 9 insertions(+) diff --git a/platform/core-api/src/com/intellij/openapi/progress/suspender.kt b/platform/core-api/src/com/intellij/openapi/progress/suspender.kt index 7a1ee06f445d..54cc17ee85ec 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/suspender.kt +++ b/platform/core-api/src/com/intellij/openapi/progress/suspender.kt @@ -40,6 +40,8 @@ fun coroutineSuspender(active: Boolean = true): CoroutineSuspender = CoroutineSu @ApiStatus.NonExtendable interface CoroutineSuspender : CoroutineContext { + fun isPaused(): Boolean + fun pause() fun resume() @@ -68,6 +70,10 @@ internal class CoroutineSuspenderElement(active: Boolean) if (active) CoroutineSuspenderState.Active else EMPTY_PAUSED_STATE ) + override fun isPaused(): Boolean { + return myState.get() is CoroutineSuspenderState.Paused + } + override fun pause() { myState.compareAndSet(CoroutineSuspenderState.Active, EMPTY_PAUSED_STATE) } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/CoroutineSuspenderTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/CoroutineSuspenderTest.kt index 2296a598e0c3..2d7feef039fc 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/CoroutineSuspenderTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/CoroutineSuspenderTest.kt @@ -13,6 +13,7 @@ class CoroutineSuspenderTest : LightPlatformTestCase() { val count = 10 val started = Semaphore(count, count) val suspender = coroutineSuspender(false) + assertTrue(suspender.isPaused()) val job = launch(Dispatchers.Default + suspender) { repeat(count) { launch { @@ -33,6 +34,7 @@ class CoroutineSuspenderTest : LightPlatformTestCase() { val started = Semaphore(count, count) val paused = Semaphore(count, count) val suspender = coroutineSuspender() + assertFalse(suspender.isPaused()) val result = async(Dispatchers.Default + suspender) { (1..count).map { async { // coroutine context (including CoroutineSuspender) is inherited @@ -46,6 +48,7 @@ class CoroutineSuspenderTest : LightPlatformTestCase() { } started.timeoutAcquire() // all coroutines are started suspender.pause() // pause suspender before next checkCanceled + assertTrue(suspender.isPaused()) repeat(count) { paused.release() // let coroutines pause in next checkCanceled }