From 38c17249b9ef9a47b2e2ad2c3f4ab02def9f254c Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 3 Jul 2018 14:16:04 +0300 Subject: [PATCH] releaseInterceptedContinuation clarified and ref check in impl fixed --- .../kotlin/coroutines/jvm/internal/ContinuationImpl.kt | 2 +- .../src/kotlin/coroutines/ContinuationInterceptor.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/jvm/internal/ContinuationImpl.kt b/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/jvm/internal/ContinuationImpl.kt index c4e5bf67996..faf2c09fe40 100644 --- a/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/jvm/internal/ContinuationImpl.kt +++ b/libraries/stdlib/coroutines/jvm/src/kotlin/coroutines/jvm/internal/ContinuationImpl.kt @@ -101,7 +101,7 @@ internal abstract class ContinuationImpl protected constructor( protected override fun releaseIntercepted() { val intercepted = intercepted - if (intercepted != null && intercepted != this) { + if (intercepted != null && intercepted !== this) { context[ContinuationInterceptor]!!.releaseInterceptedContinuation(intercepted) } this.intercepted = CompletedContinuation // just in case diff --git a/libraries/stdlib/coroutines/src/kotlin/coroutines/ContinuationInterceptor.kt b/libraries/stdlib/coroutines/src/kotlin/coroutines/ContinuationInterceptor.kt index 6ec14f684df..05d7f88db29 100644 --- a/libraries/stdlib/coroutines/src/kotlin/coroutines/ContinuationInterceptor.kt +++ b/libraries/stdlib/coroutines/src/kotlin/coroutines/ContinuationInterceptor.kt @@ -24,14 +24,16 @@ public interface ContinuationInterceptor : CoroutineContext.Element { * * This function may simply return original [continuation] if it does not want to intercept this particular continuation. * - * When the original [continuation] completes coroutine framework invokes [releaseInterceptedContinuation] - * with the resulting continuation if it was intercepted. + * When the original [continuation] completes, coroutine framework invokes [releaseInterceptedContinuation] + * with the resulting continuation if it was intercepted, that is if `interceptContinuation` had previously + * returned a different continuation instance. */ public fun interceptContinuation(continuation: Continuation): Continuation /** * Invoked for the continuation instance returned by [interceptContinuation] when the original - * continuation completes and will not be used anymore. + * continuation completes and will not be used anymore. This function is invoked only if [interceptContinuation] + * had returned a different continuation instance from the one it was invoked with. * * Default implementation does nothing. *