From edd584acb852d4b403173d168ea036510d1e1109 Mon Sep 17 00:00:00 2001 From: Tobias Preuss Date: Tue, 16 Mar 2021 18:40:53 +0100 Subject: [PATCH 001/328] Improve readability. (#2563) - Add articles. - Fix words. - Fix capitalization. --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 08417dd0f5..ff6c545341 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for Kotlin `1.4.30` release. +This is a companion version for the Kotlin `1.4.30` release. ```kotlin suspend fun main() = coroutineScope { @@ -75,7 +75,7 @@ suspend fun main() = coroutineScope { ## Using in your projects -The libraries are published to [kotlinx](https://bintray.com/kotlin/kotlinx/kotlinx.coroutines) bintray repository, +The libraries are published to [kotlinx](https://bintray.com/kotlin/kotlinx/kotlinx.coroutines) Bintray repository, linked to [JCenter](https://bintray.com/bintray/jcenter?filterByPkgName=kotlinx.coroutines) and pushed to [Maven Central](https://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.jetbrains.kotlinx%20a%3Akotlinx-coroutines*). @@ -148,16 +148,16 @@ Make sure that you have `mavenCentral()` in the list of repositories. ### Android Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) -module as dependency when using `kotlinx.coroutines` on Android: +module as a dependency when using `kotlinx.coroutines` on Android: ```groovy implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' ``` -This gives you access to Android [Dispatchers.Main] -coroutine dispatcher and also makes sure that in case of crashed coroutine with unhandled exception this -exception is logged before crashing Android application, similarly to the way uncaught exceptions in -threads are handled by Android runtime. +This gives you access to the Android [Dispatchers.Main] +coroutine dispatcher and also makes sure that in case of a crashed coroutine with an unhandled exception that +this exception is logged before crashing the Android application, similarly to the way uncaught exceptions in +threads are handled by the Android runtime. #### R8 and ProGuard @@ -168,7 +168,7 @@ For more details see ["Optimization" section for Android](ui/kotlinx-coroutines- The `kotlinx-coroutines-core` artifact contains a resource file that is not required for the coroutines to operate normally and is only used by the debugger. To exclude it at no loss of functionality, add the following snippet to the -`android` block in your gradle file for the application subproject: +`android` block in your Gradle file for the application subproject: ```groovy packagingOptions { exclude "DebugProbesKt.bin" @@ -180,7 +180,7 @@ packagingOptions { Core modules of `kotlinx.coroutines` are also available for [Kotlin/JS](https://kotlinlang.org/docs/reference/js-overview.html) and [Kotlin/Native](https://kotlinlang.org/docs/reference/native-overview.html). -In common code that should get compiled for different platforms, you can add dependency to `kotlinx-coroutines-core` right to the `commonMain` source set: +In common code that should get compiled for different platforms, you can add a dependency to `kotlinx-coroutines-core` right to the `commonMain` source set: ```groovy commonMain { dependencies { @@ -189,7 +189,7 @@ commonMain { } ``` -No more additional dependencies is needed, platform-specific artifacts will be resolved automatically via Gradle metadata available since Gradle 5.3. +No more additional dependencies are needed, platform-specific artifacts will be resolved automatically via Gradle metadata available since Gradle 5.3. Platform-specific dependencies are recommended to be used only for non-multiplatform projects that are compiled only for target platform. @@ -207,11 +207,11 @@ the target Kotlin/Native platform. [List of currently supported targets](https:/ Only single-threaded code (JS-style) on Kotlin/Native is supported in stable versions. -Additionally, special `-native-mt` version is released on a regular basis, for the state of multi-threaded coroutines support +Additionally, a special `-native-mt` version is released on a regular basis, for the state of multi-threaded coroutines support please follow the [corresponding issue](https://github.com/Kotlin/kotlinx.coroutines/issues/462) for the additional details. Since Kotlin/Native does not generally provide binary compatibility between versions, -you should use the same version of Kotlin/Native compiler as was used to build `kotlinx.coroutines`. +you should use the same version of the Kotlin/Native compiler as was used to build `kotlinx.coroutines`. ## Building and Contributing From 6f13927ea3835f433ebfd309ed3767386ef420e7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 22 Mar 2021 15:09:30 +0300 Subject: [PATCH 002/328] Do not initialize CoroutineExceptionHandler in Job (#2513) * It slightly cuts down startup time * It simplifies the code in general * It do not serve its purpose, coroutines are already protected from StackOverflowError with nested event-loops where applicable --- kotlinx-coroutines-core/common/src/Job.kt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index c80463f61c..15e8a1bb3e 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -113,16 +113,7 @@ public interface Job : CoroutineContext.Element { /** * Key for [Job] instance in the coroutine context. */ - public companion object Key : CoroutineContext.Key { - init { - /* - * Here we make sure that CoroutineExceptionHandler is always initialized in advance, so - * that if a coroutine fails due to StackOverflowError we don't fail to report this error - * trying to initialize CoroutineExceptionHandler - */ - CoroutineExceptionHandler - } - } + public companion object Key : CoroutineContext.Key // ------------ state query ------------ From f2940d5d6d3177cc74ea1a5fb8b730b11d361181 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 22 Mar 2021 16:11:06 +0300 Subject: [PATCH 003/328] Update Gradle for Kotlin 1.5, add space-dev repository (#2598) * Update Gradle to 4.8.3, add space-dev repository * Update atomicfu and binary compatibility validator --- build.gradle | 1 + buildSrc/build.gradle.kts | 1 + gradle.properties | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 171b16b68c..08d07782a7 100644 --- a/build.gradle +++ b/build.gradle @@ -65,6 +65,7 @@ buildscript { } maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" } maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } } dependencies { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6c373a01f4..c763d424fd 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -19,6 +19,7 @@ repositories { maven("https://plugins.gradle.org/m2") maven("https://dl.bintray.com/kotlin/kotlin-dev") } + maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") if (buildSnapshotTrain) { mavenLocal() diff --git a/gradle.properties b/gradle.properties index 40b1596105..0f3ccc1b55 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ kotlin_version=1.4.30 # Dependencies junit_version=4.12 -atomicfu_version=0.15.1 +atomicfu_version=0.15.2 knit_version=0.2.3 html_version=0.6.8 lincheck_version=2.10 @@ -21,7 +21,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.4.0 +binary_compatibility_validator_version=0.5.0 blockhound_version=1.0.2.RELEASE jna_version=5.5.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3a9638d5b1..d7ae858e5a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -4,6 +4,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 05f7d5df2f6223c9f25027740251ff95a682863a Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 23 Mar 2021 12:22:30 +0300 Subject: [PATCH 004/328] Simplify internal coroutines machinery (#2512) * Merge onStartInternal and onStart to reduce the number of methods and make code a bit simpler * Rework initParentJob * Always establish a parent-child relationship when creating a subclass of AbstractCoroutine. That's our own internal class that we have full control of and it never has a chance to leak to the user-code (so cancellation handlers will be installed etc.). Force implementors of AbstractCoroutine deliberately choose whether parent-child relationship should be established * As a consequence, get rid of parentContext in all our coroutine classes that are not ScopeCoroutine * Remove some dead code * Get rid of an additional parent field from ScopeCoroutine Leverage already presented information in our implementation, just expose it via an already present internal interface --- .../src/ListenableFuture.kt | 2 +- .../test/ListenableFutureTest.kt | 10 ++- .../src/future/Future.kt | 2 +- .../test/future/FutureTest.kt | 10 ++- .../api/kotlinx-coroutines-core.api | 10 +-- .../common/src/AbstractCoroutine.kt | 68 ++++----------- .../common/src/Builders.common.kt | 5 +- .../common/src/CompletableDeferred.kt | 2 +- kotlinx-coroutines-core/common/src/Job.kt | 11 +++ .../common/src/JobSupport.kt | 13 +-- .../common/src/channels/Broadcast.kt | 8 +- .../common/src/channels/ChannelCoroutine.kt | 4 +- .../common/src/channels/Produce.kt | 2 +- .../common/src/internal/Scopes.kt | 7 +- .../common/src/intrinsics/Undispatched.kt | 8 +- .../common/test/AbstractCoroutineTest.kt | 8 +- .../common/test/CancelledParentAttachTest.kt | 85 +++++++++++++++++++ kotlinx-coroutines-core/jvm/src/Builders.kt | 3 +- .../jvm/src/channels/Actor.kt | 6 +- .../{JoinStrTest.kt => JoinStressTest.kt} | 2 +- .../jvm/test/RunBlockingTest.kt | 13 ++- .../jvm/test/channels/ActorLazyTest.kt | 14 ++- .../jvm/test/channels/ActorTest.kt | 17 +++- .../jvm/test/exceptions/SuppressionTests.kt | 8 +- .../native/src/Builders.kt | 2 +- .../src/Publish.kt | 2 +- .../src/ReactiveFlow.kt | 6 +- .../test/CancelledParentAttachTest.kt | 20 +++++ .../kotlinx-coroutines-reactor/src/Mono.kt | 2 +- .../src/RxCompletable.kt | 2 +- .../kotlinx-coroutines-rx2/src/RxMaybe.kt | 2 +- .../src/RxObservable.kt | 4 +- .../kotlinx-coroutines-rx2/src/RxSingle.kt | 2 +- .../src/RxCompletable.kt | 2 +- .../kotlinx-coroutines-rx3/src/RxMaybe.kt | 2 +- .../src/RxObservable.kt | 2 +- .../kotlinx-coroutines-rx3/src/RxSingle.kt | 2 +- 37 files changed, 259 insertions(+), 109 deletions(-) create mode 100644 kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt rename kotlinx-coroutines-core/jvm/test/{JoinStrTest.kt => JoinStressTest.kt} (97%) create mode 100644 reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt diff --git a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt index 53019c4bbe..35e0aeb379 100644 --- a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt +++ b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt @@ -299,7 +299,7 @@ private class ToContinuation( */ private class ListenableFutureCoroutine( context: CoroutineContext -) : AbstractCoroutine(context) { +) : AbstractCoroutine(context, initParentJob = true, active = true) { // JobListenableFuture propagates external cancellation to `this` coroutine. See JobListenableFuture. @JvmField diff --git a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt index 9dca9e9b46..c463174a8d 100644 --- a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt +++ b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.guava @@ -747,4 +747,12 @@ class ListenableFutureTest : TestBase() { latch.countDown() return future } + + @Test + fun testCancelledParent() = runTest({ it is CancellationException }) { + cancel() + future { expectUnreached() } + future(start = CoroutineStart.ATOMIC) { } + future(start = CoroutineStart.UNDISPATCHED) { } + } } diff --git a/integration/kotlinx-coroutines-jdk8/src/future/Future.kt b/integration/kotlinx-coroutines-jdk8/src/future/Future.kt index b3b45e9dbc..7e9c349c66 100644 --- a/integration/kotlinx-coroutines-jdk8/src/future/Future.kt +++ b/integration/kotlinx-coroutines-jdk8/src/future/Future.kt @@ -48,7 +48,7 @@ public fun CoroutineScope.future( private class CompletableFutureCoroutine( context: CoroutineContext, private val future: CompletableFuture -) : AbstractCoroutine(context), BiConsumer { +) : AbstractCoroutine(context, initParentJob = true, active = true), BiConsumer { override fun accept(value: T?, exception: Throwable?) { cancel() } diff --git a/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt b/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt index 998aaa0835..08e5cdad93 100644 --- a/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt +++ b/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.future @@ -567,4 +567,12 @@ class FutureTest : TestBase() { assertFailsWith { stage.await() } finish(4) } + + @Test + fun testCancelledParent() = runTest({ it is java.util.concurrent.CancellationException }) { + cancel() + future { expectUnreached() } + future(start = CoroutineStart.ATOMIC) { } + future(start = CoroutineStart.UNDISPATCHED) { } + } } diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 1d16d31086..8a35d18687 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -1,7 +1,5 @@ public abstract class kotlinx/coroutines/AbstractCoroutine : kotlinx/coroutines/JobSupport, kotlin/coroutines/Continuation, kotlinx/coroutines/CoroutineScope, kotlinx/coroutines/Job { - protected final field parentContext Lkotlin/coroutines/CoroutineContext; - public fun (Lkotlin/coroutines/CoroutineContext;Z)V - public synthetic fun (Lkotlin/coroutines/CoroutineContext;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lkotlin/coroutines/CoroutineContext;ZZ)V protected fun afterResume (Ljava/lang/Object;)V protected fun cancellationExceptionMessage ()Ljava/lang/String; public final fun getContext ()Lkotlin/coroutines/CoroutineContext; @@ -10,10 +8,8 @@ public abstract class kotlinx/coroutines/AbstractCoroutine : kotlinx/coroutines/ protected fun onCancelled (Ljava/lang/Throwable;Z)V protected fun onCompleted (Ljava/lang/Object;)V protected final fun onCompletionInternal (Ljava/lang/Object;)V - protected fun onStart ()V public final fun resumeWith (Ljava/lang/Object;)V public final fun start (Lkotlinx/coroutines/CoroutineStart;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V - public final fun start (Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;)V } public final class kotlinx/coroutines/AwaitKt { @@ -89,6 +85,7 @@ public final class kotlinx/coroutines/CancellableContinuationKt { public abstract interface class kotlinx/coroutines/ChildHandle : kotlinx/coroutines/DisposableHandle { public abstract fun childCancelled (Ljava/lang/Throwable;)Z + public abstract fun getParent ()Lkotlinx/coroutines/Job; } public abstract interface class kotlinx/coroutines/ChildJob : kotlinx/coroutines/Job { @@ -420,6 +417,7 @@ public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlin public final fun getKey ()Lkotlin/coroutines/CoroutineContext$Key; public final fun getOnJoin ()Lkotlinx/coroutines/selects/SelectClause0; protected fun handleJobException (Ljava/lang/Throwable;)Z + protected final fun initParentJob (Lkotlinx/coroutines/Job;)V public final fun invokeOnCompletion (Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; public final fun invokeOnCompletion (ZZLkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; public fun isActive ()Z @@ -431,6 +429,7 @@ public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlin public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; protected fun onCancelling (Ljava/lang/Throwable;)V protected fun onCompletionInternal (Ljava/lang/Object;)V + protected fun onStart ()V public final fun parentCancelled (Lkotlinx/coroutines/ParentJob;)V public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; public fun plus (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; @@ -473,6 +472,7 @@ public final class kotlinx/coroutines/NonDisposableHandle : kotlinx/coroutines/C public static final field INSTANCE Lkotlinx/coroutines/NonDisposableHandle; public fun childCancelled (Ljava/lang/Throwable;)Z public fun dispose ()V + public fun getParent ()Lkotlinx/coroutines/Job; public fun toString ()Ljava/lang/String; } diff --git a/kotlinx-coroutines-core/common/src/AbstractCoroutine.kt b/kotlinx-coroutines-core/common/src/AbstractCoroutine.kt index af392b63f5..439a9ac7a5 100644 --- a/kotlinx-coroutines-core/common/src/AbstractCoroutine.kt +++ b/kotlinx-coroutines-core/common/src/AbstractCoroutine.kt @@ -8,7 +8,6 @@ package kotlinx.coroutines import kotlinx.coroutines.CoroutineStart.* import kotlinx.coroutines.intrinsics.* import kotlin.coroutines.* -import kotlin.jvm.* /** * Abstract base class for implementation of coroutines in coroutine builders. @@ -26,6 +25,9 @@ import kotlin.jvm.* * * [onCancelled] in invoked when the coroutine completes with an exception (cancelled). * * @param parentContext the context of the parent coroutine. + * @param initParentJob specifies whether the parent-child relationship should be instantiated directly + * in `AbstractCoroutine` constructor. If set to `false`, it's the responsibility of the child class + * to invoke [initParentJob] manually. * @param active when `true` (by default), the coroutine is created in the _active_ state, otherwise it is created in the _new_ state. * See [Job] for details. * @@ -33,13 +35,22 @@ import kotlin.jvm.* */ @InternalCoroutinesApi public abstract class AbstractCoroutine( - /** - * The context of the parent coroutine. - */ - @JvmField - protected val parentContext: CoroutineContext, - active: Boolean = true + parentContext: CoroutineContext, + initParentJob: Boolean, + active: Boolean ) : JobSupport(active), Job, Continuation, CoroutineScope { + + init { + /* + * Setup parent-child relationship between the parent in the context and the current coroutine. + * It may cause this coroutine to become _cancelling_ if the parent is already cancelled. + * It is dangerous to install parent-child relationship here if the coroutine class + * operates its state from within onCancelled or onCancelling + * (with exceptions for rx integrations that can't have any parent) + */ + if (initParentJob) initParentJob(parentContext[Job]) + } + /** * The context of this coroutine that includes this coroutine as a [Job]. */ @@ -53,28 +64,6 @@ public abstract class AbstractCoroutine( override val isActive: Boolean get() = super.isActive - /** - * Initializes the parent job from the `parentContext` of this coroutine that was passed to it during construction. - * It shall be invoked at most once after construction after all other initialization. - * - * Invocation of this function may cause this coroutine to become cancelled if the parent is already cancelled, - * in which case it synchronously invokes all the corresponding handlers. - * @suppress **This is unstable API and it is subject to change.** - */ - internal fun initParentJob() { - initParentJobInternal(parentContext[Job]) - } - - /** - * This function is invoked once when a non-active coroutine (constructed with `active` set to `false) - * is [started][start]. - */ - protected open fun onStart() {} - - internal final override fun onStartInternal() { - onStart() - } - /** * This function is invoked once when the job was completed normally with the specified [value], * right before all the waiters for the coroutine's completion are notified. @@ -127,26 +116,6 @@ public abstract class AbstractCoroutine( /** * Starts this coroutine with the given code [block] and [start] strategy. * This function shall be invoked at most once on this coroutine. - * - * First, this function initializes parent job from the `parentContext` of this coroutine that was passed to it - * during construction. Second, it starts the coroutine based on [start] parameter: - * - * * [DEFAULT] uses [startCoroutineCancellable]. - * * [ATOMIC] uses [startCoroutine]. - * * [UNDISPATCHED] uses [startCoroutineUndispatched]. - * * [LAZY] does nothing. - */ - public fun start(start: CoroutineStart, block: suspend () -> T) { - initParentJob() - start(block, this) - } - - /** - * Starts this coroutine with the given code [block] and [start] strategy. - * This function shall be invoked at most once on this coroutine. - * - * First, this function initializes parent job from the `parentContext` of this coroutine that was passed to it - * during construction. Second, it starts the coroutine based on [start] parameter: * * * [DEFAULT] uses [startCoroutineCancellable]. * * [ATOMIC] uses [startCoroutine]. @@ -154,7 +123,6 @@ public abstract class AbstractCoroutine( * * [LAZY] does nothing. */ public fun start(start: CoroutineStart, receiver: R, block: suspend R.() -> T) { - initParentJob() start(block, receiver, this) } } diff --git a/kotlinx-coroutines-core/common/src/Builders.common.kt b/kotlinx-coroutines-core/common/src/Builders.common.kt index 93b3ee4849..09ae9b685d 100644 --- a/kotlinx-coroutines-core/common/src/Builders.common.kt +++ b/kotlinx-coroutines-core/common/src/Builders.common.kt @@ -96,7 +96,7 @@ public fun CoroutineScope.async( private open class DeferredCoroutine( parentContext: CoroutineContext, active: Boolean -) : AbstractCoroutine(parentContext, active), Deferred, SelectClause1 { +) : AbstractCoroutine(parentContext, true, active = active), Deferred, SelectClause1 { override fun getCompleted(): T = getCompletedInternal() as T override suspend fun await(): T = awaitInternal() as T override val onAwait: SelectClause1 get() = this @@ -167,7 +167,6 @@ public suspend fun withContext( } // SLOW PATH -- use new dispatcher val coroutine = DispatchedCoroutine(newContext, uCont) - coroutine.initParentJob() block.startCoroutineCancellable(coroutine, coroutine) coroutine.getResult() } @@ -188,7 +187,7 @@ public suspend inline operator fun CoroutineDispatcher.invoke( private open class StandaloneCoroutine( parentContext: CoroutineContext, active: Boolean -) : AbstractCoroutine(parentContext, active) { +) : AbstractCoroutine(parentContext, initParentJob = true, active = active) { override fun handleJobException(exception: Throwable): Boolean { handleCoroutineException(context, exception) return true diff --git a/kotlinx-coroutines-core/common/src/CompletableDeferred.kt b/kotlinx-coroutines-core/common/src/CompletableDeferred.kt index c80737968e..5e76593df2 100644 --- a/kotlinx-coroutines-core/common/src/CompletableDeferred.kt +++ b/kotlinx-coroutines-core/common/src/CompletableDeferred.kt @@ -80,7 +80,7 @@ public fun CompletableDeferred(value: T): CompletableDeferred = Completab private class CompletableDeferredImpl( parent: Job? ) : JobSupport(true), CompletableDeferred, SelectClause1 { - init { initParentJobInternal(parent) } + init { initParentJob(parent) } override val onCancelComplete get() = true override fun getCompleted(): T = getCompletedInternal() as T override suspend fun await(): T = awaitInternal() as T diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index 15e8a1bb3e..1a98135a24 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -457,6 +457,14 @@ public interface ParentJob : Job { @InternalCoroutinesApi @Deprecated(level = DeprecationLevel.ERROR, message = "This is internal API and may be removed in the future releases") public interface ChildHandle : DisposableHandle { + + /** + * Returns the parent of the current parent-child relationship. + * @suppress **This is unstable API and it is subject to change.** + */ + @InternalCoroutinesApi + public val parent: Job? + /** * Child is cancelling its parent by invoking this method. * This method is invoked by the child twice. The first time child report its root cause as soon as possible, @@ -650,6 +658,9 @@ private fun Throwable?.orCancellation(job: Job): Throwable = this ?: JobCancella */ @InternalCoroutinesApi public object NonDisposableHandle : DisposableHandle, ChildHandle { + + override val parent: Job? get() = null + /** * Does not do anything. * @suppress diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index 5b516ae27f..a7dbbf8b31 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -96,7 +96,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren ~ waits for start >> start / join / await invoked ## ACTIVE: state == EMPTY_ACTIVE | is JobNode | is NodeList - + onStartInternal / onStart (lazy coroutine is started) + + onStart (lazy coroutine is started) ~ active coroutine is working (or scheduled to execution) >> childCancelled / cancelImpl invoked ## CANCELLING: state is Finishing, state.rootCause != null @@ -139,7 +139,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren * Initializes parent job. * It shall be invoked at most once after construction after all other initialization. */ - internal fun initParentJobInternal(parent: Job?) { + protected fun initParentJob(parent: Job?) { assert { parentHandle == null } if (parent == null) { parentHandle = NonDisposableHandle @@ -393,12 +393,12 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren is Empty -> { // EMPTY_X state -- no completion handlers if (state.isActive) return FALSE // already active if (!_state.compareAndSet(state, EMPTY_ACTIVE)) return RETRY - onStartInternal() + onStart() return TRUE } is InactiveNodeList -> { // LIST state -- inactive with a list of completion handlers if (!_state.compareAndSet(state, state.list)) return RETRY - onStartInternal() + onStart() return TRUE } else -> return FALSE // not a new state @@ -409,7 +409,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren * Override to provide the actual [start] action. * This function is invoked exactly once when non-active coroutine is [started][start]. */ - internal open fun onStartInternal() {} + protected open fun onStart() {} public final override fun getCancellationException(): CancellationException = when (val state = this.state) { @@ -1311,7 +1311,7 @@ private class Empty(override val isActive: Boolean) : Incomplete { } internal open class JobImpl(parent: Job?) : JobSupport(true), CompletableJob { - init { initParentJobInternal(parent) } + init { initParentJob(parent) } override val onCancelComplete get() = true /* * Check whether parent is able to handle exceptions as well. @@ -1459,6 +1459,7 @@ private class InvokeOnCancelling( internal class ChildHandleNode( @JvmField val childJob: ChildJob ) : JobCancellingNode(), ChildHandle { + override val parent: Job get() = job override fun invoke(cause: Throwable?) = childJob.parentCancelled(job) override fun childCancelled(cause: Throwable): Boolean = job.childCancelled(cause) } diff --git a/kotlinx-coroutines-core/common/src/channels/Broadcast.kt b/kotlinx-coroutines-core/common/src/channels/Broadcast.kt index 07e7597627..3ed4bc7fff 100644 --- a/kotlinx-coroutines-core/common/src/channels/Broadcast.kt +++ b/kotlinx-coroutines-core/common/src/channels/Broadcast.kt @@ -127,7 +127,13 @@ private open class BroadcastCoroutine( parentContext: CoroutineContext, protected val _channel: BroadcastChannel, active: Boolean -) : AbstractCoroutine(parentContext, active), ProducerScope, BroadcastChannel by _channel { +) : AbstractCoroutine(parentContext, initParentJob = false, active = active), + ProducerScope, BroadcastChannel by _channel { + + init { + initParentJob(parentContext[Job]) + } + override val isActive: Boolean get() = super.isActive override val channel: SendChannel diff --git a/kotlinx-coroutines-core/common/src/channels/ChannelCoroutine.kt b/kotlinx-coroutines-core/common/src/channels/ChannelCoroutine.kt index b2b257def2..57b2797de6 100644 --- a/kotlinx-coroutines-core/common/src/channels/ChannelCoroutine.kt +++ b/kotlinx-coroutines-core/common/src/channels/ChannelCoroutine.kt @@ -11,8 +11,10 @@ import kotlin.coroutines.* internal open class ChannelCoroutine( parentContext: CoroutineContext, protected val _channel: Channel, + initParentJob: Boolean, active: Boolean -) : AbstractCoroutine(parentContext, active), Channel by _channel { +) : AbstractCoroutine(parentContext, initParentJob, active), Channel by _channel { + val channel: Channel get() = this override fun cancel() { diff --git a/kotlinx-coroutines-core/common/src/channels/Produce.kt b/kotlinx-coroutines-core/common/src/channels/Produce.kt index 3c183587f3..3342fb6ec9 100644 --- a/kotlinx-coroutines-core/common/src/channels/Produce.kt +++ b/kotlinx-coroutines-core/common/src/channels/Produce.kt @@ -139,7 +139,7 @@ internal fun CoroutineScope.produce( internal open class ProducerCoroutine( parentContext: CoroutineContext, channel: Channel -) : ChannelCoroutine(parentContext, channel, active = true), ProducerScope { +) : ChannelCoroutine(parentContext, channel, true, active = true), ProducerScope { override val isActive: Boolean get() = super.isActive diff --git a/kotlinx-coroutines-core/common/src/internal/Scopes.kt b/kotlinx-coroutines-core/common/src/internal/Scopes.kt index 98db37de8d..ad8d86ed5a 100644 --- a/kotlinx-coroutines-core/common/src/internal/Scopes.kt +++ b/kotlinx-coroutines-core/common/src/internal/Scopes.kt @@ -15,12 +15,13 @@ import kotlin.jvm.* internal open class ScopeCoroutine( context: CoroutineContext, @JvmField val uCont: Continuation // unintercepted continuation -) : AbstractCoroutine(context, true), CoroutineStackFrame { +) : AbstractCoroutine(context, true, true), CoroutineStackFrame { + final override val callerFrame: CoroutineStackFrame? get() = uCont as? CoroutineStackFrame final override fun getStackTraceElement(): StackTraceElement? = null - final override val isScopedCoroutine: Boolean get() = true - internal val parent: Job? get() = parentContext[Job] + final override val isScopedCoroutine: Boolean get() = true + internal val parent: Job? get() = parentHandle?.parent override fun afterCompletion(state: Any?) { // Resume in a cancellable way by default when resuming from another context diff --git a/kotlinx-coroutines-core/common/src/intrinsics/Undispatched.kt b/kotlinx-coroutines-core/common/src/intrinsics/Undispatched.kt index 1273634efa..38e870ef9c 100644 --- a/kotlinx-coroutines-core/common/src/intrinsics/Undispatched.kt +++ b/kotlinx-coroutines-core/common/src/intrinsics/Undispatched.kt @@ -82,11 +82,9 @@ private inline fun startDirect(completion: Continuation, block: (Continua * This function shall be invoked at most once on this coroutine. * This function checks cancellation of the outer [Job] on fast-path. * - * First, this function initializes the parent job from the `parentContext` of this coroutine that was passed to it - * during construction. Second, it starts the coroutine using [startCoroutineUninterceptedOrReturn]. + * It starts the coroutine using [startCoroutineUninterceptedOrReturn]. */ internal fun ScopeCoroutine.startUndispatchedOrReturn(receiver: R, block: suspend R.() -> T): Any? { - initParentJob() return undispatchedResult({ true }) { block.startCoroutineUninterceptedOrReturn(receiver, this) } @@ -96,8 +94,8 @@ internal fun ScopeCoroutine.startUndispatchedOrReturn(receiver: R, blo * Same as [startUndispatchedOrReturn], but ignores [TimeoutCancellationException] on fast-path. */ internal fun ScopeCoroutine.startUndispatchedOrReturnIgnoreTimeout( - receiver: R, block: suspend R.() -> T): Any? { - initParentJob() + receiver: R, block: suspend R.() -> T +): Any? { return undispatchedResult({ e -> !(e is TimeoutCancellationException && e.coroutine === this) }) { block.startCoroutineUninterceptedOrReturn(receiver, this) } diff --git a/kotlinx-coroutines-core/common/test/AbstractCoroutineTest.kt b/kotlinx-coroutines-core/common/test/AbstractCoroutineTest.kt index ce20837e25..ebe88ce156 100644 --- a/kotlinx-coroutines-core/common/test/AbstractCoroutineTest.kt +++ b/kotlinx-coroutines-core/common/test/AbstractCoroutineTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -13,7 +13,7 @@ class AbstractCoroutineTest : TestBase() { fun testNotifications() = runTest { expect(1) val coroutineContext = coroutineContext // workaround for KT-22984 - val coroutine = object : AbstractCoroutine(coroutineContext, false) { + val coroutine = object : AbstractCoroutine(coroutineContext, true, false) { override fun onStart() { expect(3) } @@ -53,7 +53,7 @@ class AbstractCoroutineTest : TestBase() { fun testNotificationsWithException() = runTest { expect(1) val coroutineContext = coroutineContext // workaround for KT-22984 - val coroutine = object : AbstractCoroutine(coroutineContext + NonCancellable, false) { + val coroutine = object : AbstractCoroutine(coroutineContext + NonCancellable, true, false) { override fun onStart() { expect(3) } @@ -91,4 +91,4 @@ class AbstractCoroutineTest : TestBase() { coroutine.resumeWithException(TestException2()) finish(10) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt b/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt new file mode 100644 index 0000000000..749bbfc921 --- /dev/null +++ b/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.internal.* +import kotlin.test.* + +class CancelledParentAttachTest : TestBase() { + + @Test + fun testAsync() = CoroutineStart.values().forEach(::testAsyncCancelledParent) + + private fun testAsyncCancelledParent(start: CoroutineStart) = + runTest({ it is CancellationException }) { + cancel() + expect(1) + val d = async(start = start) { 42 } + expect(2) + d.invokeOnCompletion { + finish(3) + reset() + } + } + + @Test + fun testLaunch() = CoroutineStart.values().forEach(::testLaunchCancelledParent) + + private fun testLaunchCancelledParent(start: CoroutineStart) = + runTest({ it is CancellationException }) { + cancel() + expect(1) + val d = launch(start = start) { } + expect(2) + d.invokeOnCompletion { + finish(3) + reset() + } + } + + @Test + fun testProduce() = + runTest({ it is CancellationException }) { + cancel() + expect(1) + val d = produce { } + expect(2) + (d as Job).invokeOnCompletion { + finish(3) + reset() + } + } + + @Test + fun testBroadcast() = CoroutineStart.values().forEach(::testBroadcastCancelledParent) + + private fun testBroadcastCancelledParent(start: CoroutineStart) = + runTest({ it is CancellationException }) { + cancel() + expect(1) + val bc = broadcast(start = start) {} + expect(2) + (bc as Job).invokeOnCompletion { + finish(3) + reset() + } + } + + @Test + fun testScopes() { + testScope { coroutineScope { } } + testScope { supervisorScope { } } + testScope { flowScope { } } + testScope { withTimeout(Long.MAX_VALUE) { } } + testScope { withContext(Job()) { } } + testScope { withContext(CoroutineName("")) { } } + } + + private inline fun testScope(crossinline block: suspend () -> Unit) = runTest({ it is CancellationException }) { + cancel() + block() + } +} diff --git a/kotlinx-coroutines-core/jvm/src/Builders.kt b/kotlinx-coroutines-core/jvm/src/Builders.kt index c1b878ce2c..edb4303198 100644 --- a/kotlinx-coroutines-core/jvm/src/Builders.kt +++ b/kotlinx-coroutines-core/jvm/src/Builders.kt @@ -63,7 +63,8 @@ private class BlockingCoroutine( parentContext: CoroutineContext, private val blockedThread: Thread, private val eventLoop: EventLoop? -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, true, true) { + override val isScopedCoroutine: Boolean get() = true override fun afterCompletion(state: Any?) { diff --git a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt index 0212d740bb..3a208c0f70 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt @@ -127,7 +127,11 @@ private open class ActorCoroutine( parentContext: CoroutineContext, channel: Channel, active: Boolean -) : ChannelCoroutine(parentContext, channel, active), ActorScope { +) : ChannelCoroutine(parentContext, channel, initParentJob = false, active = active), ActorScope { + + init { + initParentJob(parentContext[Job]) + } override fun onCancelling(cause: Throwable?) { _channel.cancel(cause?.let { diff --git a/kotlinx-coroutines-core/jvm/test/JoinStrTest.kt b/kotlinx-coroutines-core/jvm/test/JoinStressTest.kt similarity index 97% rename from kotlinx-coroutines-core/jvm/test/JoinStrTest.kt rename to kotlinx-coroutines-core/jvm/test/JoinStressTest.kt index 5090e7c06c..6d47418564 100644 --- a/kotlinx-coroutines-core/jvm/test/JoinStrTest.kt +++ b/kotlinx-coroutines-core/jvm/test/JoinStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines diff --git a/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt b/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt index e20362ff93..de38df6b26 100644 --- a/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt +++ b/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -171,4 +171,15 @@ class RunBlockingTest : TestBase() { } rb.hashCode() // unused } + + @Test + fun testCancelledParent() { + val job = Job() + job.cancel() + assertFailsWith { + runBlocking(job) { + expectUnreached() + } + } + } } diff --git a/kotlinx-coroutines-core/jvm/test/channels/ActorLazyTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ActorLazyTest.kt index ae95e694cd..d3b2ff1265 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ActorLazyTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ActorLazyTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -78,4 +78,14 @@ class ActorLazyTest : TestBase() { job.join() finish(5) } -} \ No newline at end of file + + @Test + fun testCancelledParent() = runTest({ it is CancellationException }) { + cancel() + expect(1) + actor(start = CoroutineStart.LAZY) { + expectUnreached() + } + finish(2) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt index bdca5039d2..1d7613eded 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -173,11 +173,24 @@ class ActorTest(private val capacity: Int) : TestBase() { fun testCloseFreshActor() = runTest { for (start in CoroutineStart.values()) { val job = launch { - val actor = actor(start = start) { for (i in channel) {} } + val actor = actor(start = start) { + for (i in channel) { + } + } actor.close() } job.join() } } + + @Test + fun testCancelledParent() = runTest({ it is CancellationException }) { + cancel() + expect(1) + actor { + expectUnreached() + } + finish(2) + } } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/SuppressionTests.kt b/kotlinx-coroutines-core/jvm/test/exceptions/SuppressionTests.kt index 6034fccbca..edce175d4a 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/SuppressionTests.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/SuppressionTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.exceptions @@ -15,8 +15,8 @@ class SuppressionTests : TestBase() { @Test fun testNotificationsWithException() = runTest { expect(1) - val coroutineContext = kotlin.coroutines.coroutineContext // workaround for KT-22984 - val coroutine = object : AbstractCoroutine(coroutineContext, false) { + val coroutineContext = kotlin.coroutines.coroutineContext + NonCancellable // workaround for KT-22984 + val coroutine = object : AbstractCoroutine(coroutineContext, true, false) { override fun onStart() { expect(3) } @@ -82,4 +82,4 @@ class SuppressionTests : TestBase() { assertTrue(e.cause!!.suppressed.isEmpty()) } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/native/src/Builders.kt b/kotlinx-coroutines-core/native/src/Builders.kt index 7425a05542..30c187fa96 100644 --- a/kotlinx-coroutines-core/native/src/Builders.kt +++ b/kotlinx-coroutines-core/native/src/Builders.kt @@ -53,7 +53,7 @@ public fun runBlocking(context: CoroutineContext = EmptyCoroutineContext, bl private class BlockingCoroutine( parentContext: CoroutineContext, private val eventLoop: EventLoop? -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, true, true) { override val isScopedCoroutine: Boolean get() = true @Suppress("UNCHECKED_CAST") diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 35878b04b2..156205624e 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -80,7 +80,7 @@ public class PublisherCoroutine( parentContext: CoroutineContext, private val subscriber: Subscriber, private val exceptionOnCancelHandler: (Throwable, CoroutineContext) -> Unit -) : AbstractCoroutine(parentContext, true), ProducerScope, Subscription, SelectClause2> { +) : AbstractCoroutine(parentContext, false, true), ProducerScope, Subscription, SelectClause2> { override val channel: SendChannel get() = this // Mutex is locked when either nRequested == 0 or while subscriber.onXXX is being invoked diff --git a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt index 614e9ead1e..1f04ea538c 100644 --- a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt @@ -184,7 +184,11 @@ public class FlowSubscription( @JvmField public val flow: Flow, @JvmField public val subscriber: Subscriber, context: CoroutineContext -) : Subscription, AbstractCoroutine(context, true) { +) : Subscription, AbstractCoroutine(context, initParentJob = false, true) { + /* + * We deliberately set initParentJob to false and do not establish parent-child + * relationship because FlowSubscription doesn't support it + */ private val requested = atomic(0L) private val producer = atomic?>(createInitialContinuation()) diff --git a/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt b/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt new file mode 100644 index 0000000000..f846882ab2 --- /dev/null +++ b/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.reactive + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import org.junit.* + + +class CancelledParentAttachTest : TestBase() { + + @Test + fun testFlow() = runTest { + val f = flowOf(1, 2, 3).cancellable() + val j = Job().also { it.cancel() } + f.asPublisher(j).asFlow().collect() + } +} diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 2d595c961f..e146dca9f6 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -58,7 +58,7 @@ private fun monoInternal( private class MonoCoroutine( parentContext: CoroutineContext, private val sink: MonoSink -) : AbstractCoroutine(parentContext, true), Disposable { +) : AbstractCoroutine(parentContext, false, true), Disposable { @Volatile private var disposed = false diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt index d0a43fb1a4..3400278cb3 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt @@ -53,7 +53,7 @@ private fun rxCompletableInternal( private class RxCompletableCoroutine( parentContext: CoroutineContext, private val subscriber: CompletableEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: Unit) { try { subscriber.onComplete() diff --git a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt index f5ed48b9a9..c4ca54cf48 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt @@ -54,7 +54,7 @@ private fun rxMaybeInternal( private class RxMaybeCoroutine( parentContext: CoroutineContext, private val subscriber: MaybeEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: T) { try { if (value == null) subscriber.onComplete() else subscriber.onSuccess(value) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 6d11cb9c35..4f4706d8ad 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -68,10 +68,10 @@ private const val OPEN = 0 // open channel, still working private const val CLOSED = -1 // closed, but have not signalled onCompleted/onError yet private const val SIGNALLED = -2 // already signalled subscriber onCompleted/onError -private class RxObservableCoroutine( +private class RxObservableCoroutine( parentContext: CoroutineContext, private val subscriber: ObservableEmitter -) : AbstractCoroutine(parentContext, true), ProducerScope, SelectClause2> { +) : AbstractCoroutine(parentContext, false, true), ProducerScope, SelectClause2> { override val channel: SendChannel get() = this // Mutex is locked when while subscriber.onXXX is being invoked diff --git a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt index b8012b6de9..3b81445312 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt @@ -53,7 +53,7 @@ private fun rxSingleInternal( private class RxSingleCoroutine( parentContext: CoroutineContext, private val subscriber: SingleEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: T) { try { subscriber.onSuccess(value) diff --git a/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt index f4c5d7e768..88137675d8 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt @@ -39,7 +39,7 @@ private fun rxCompletableInternal( private class RxCompletableCoroutine( parentContext: CoroutineContext, private val subscriber: CompletableEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: Unit) { try { subscriber.onComplete() diff --git a/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt index ca1d5b59ee..1c10266470 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt @@ -40,7 +40,7 @@ private fun rxMaybeInternal( private class RxMaybeCoroutine( parentContext: CoroutineContext, private val subscriber: MaybeEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: T) { try { if (value == null) subscriber.onComplete() else subscriber.onSuccess(value) diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index 7bd07750fe..bd9239e7db 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -57,7 +57,7 @@ private const val SIGNALLED = -2 // already signalled subscriber onCompleted/on private class RxObservableCoroutine( parentContext: CoroutineContext, private val subscriber: ObservableEmitter -) : AbstractCoroutine(parentContext, true), ProducerScope, SelectClause2> { +) : AbstractCoroutine(parentContext, false, true), ProducerScope, SelectClause2> { override val channel: SendChannel get() = this // Mutex is locked when while subscriber.onXXX is being invoked diff --git a/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt index f4d07fb40f..fb6020eab3 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt @@ -39,7 +39,7 @@ private fun rxSingleInternal( private class RxSingleCoroutine( parentContext: CoroutineContext, private val subscriber: SingleEmitter -) : AbstractCoroutine(parentContext, true) { +) : AbstractCoroutine(parentContext, false, true) { override fun onCompleted(value: T) { try { subscriber.onSuccess(value) From 7c6c72fb1d8bd2991d9956c1a791d8599a02f35f Mon Sep 17 00:00:00 2001 From: Nikita Koval Date: Tue, 23 Mar 2021 18:10:08 +0300 Subject: [PATCH 005/328] Allow extra suspension in Lincheck tests for `Semaphore.acquire()` (#2602) --- .../jvm/test/lincheck/SemaphoreLincheckTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/test/lincheck/SemaphoreLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/lincheck/SemaphoreLincheckTest.kt index 84ce773c15..2b471d7f26 100644 --- a/kotlinx-coroutines-core/jvm/test/lincheck/SemaphoreLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/lincheck/SemaphoreLincheckTest.kt @@ -16,7 +16,7 @@ abstract class SemaphoreLincheckTestBase(permits: Int) : AbstractLincheckTest() @Operation fun tryAcquire() = semaphore.tryAcquire() - @Operation(promptCancellation = true) + @Operation(promptCancellation = true, allowExtraSuspension = true) suspend fun acquire() = semaphore.acquire() @Operation(handleExceptionsAsResult = [IllegalStateException::class]) From 5eca49cfcb25acefaf10ec9b997de537c653b47e Mon Sep 17 00:00:00 2001 From: Vitus Date: Wed, 24 Mar 2021 09:00:58 +0100 Subject: [PATCH 006/328] Fix typo in StateFlow docs (#2508) --- kotlinx-coroutines-core/common/src/flow/StateFlow.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index fc8aa02f20..53764ab74a 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -21,7 +21,7 @@ import kotlin.native.concurrent.* * neither does a coroutine started by the [Flow.launchIn] function. An active collector of a state flow is called a _subscriber_. * * A [mutable state flow][MutableStateFlow] is created using `MutableStateFlow(value)` constructor function with - * the initial value. The value of mutable state flow can be updated by setting its [value] property. + * the initial value. The value of mutable state flow can be updated by setting its [value] property. * Updates to the [value] are always [conflated][Flow.conflate]. So a slow collector skips fast updates, * but always collects the most recently emitted value. * From 5f9e52c5644976dfb9e2e31bde573682c06e6ff9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 24 Mar 2021 11:02:18 +0300 Subject: [PATCH 007/328] Update SharedFlow documentation (#2437) * Update SharedFlow documentation --- kotlinx-coroutines-core/common/src/flow/SharedFlow.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index 048cd8b364..ac9e66b0d5 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -33,7 +33,7 @@ import kotlin.native.concurrent.* * * [SharedFlow] is useful for broadcasting events that happen inside an application to subscribers that can come and go. * For example, the following class encapsulates an event bus that distributes events to all subscribers - * in a _rendezvous_ manner, suspending until all subscribers process each event: + * in a _rendezvous_ manner, suspending until all subscribers receive emitted event: * * ``` * class EventBus { From e608dfbb950831a865da7580b0f9b2b0dcfe7667 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 24 Mar 2021 11:51:12 +0300 Subject: [PATCH 008/328] Rework reusability control in cancellable continuation (#2581) * Rework reusability control in cancellable continuation * Update initCancellability documentation and implementation to be aligned with current invariants * Make parentHandle non-volatile and ensure there are no races around it * Establish new reusability invariants - Reusable continuation can be used _only_ if it states is not REUSABLE_CLAIMED - If it is, spin-loop and wait for release - Now the parent is attached to reusable continuation only if it was suspended at least once. Otherwise, the state machine can return via fast-path and no one will be able to release intercepted continuation (-> detach from parent) - It implies that the parent is attached after trySuspend call and can be concurrently reused, this is where new invariant comes into play * Leverage the fact that it's non-atomic and do not check it for cancellation prematurely. It increases the performance of fast-path, but potentially affects rare cancellation cases Fixes #2564 --- .../common/src/CancellableContinuation.kt | 8 +- .../common/src/CancellableContinuationImpl.kt | 116 +++++++++++------- .../common/src/CoroutineDispatcher.kt | 7 +- .../common/src/JobSupport.kt | 2 + .../src/internal/DispatchedContinuation.kt | 51 ++++++-- .../jvm/test/CancelledAwaitStressTest.kt | 4 +- .../jvm/test/FieldWalker.kt | 4 +- ...leCancellableContinuationLeakStressTest.kt | 41 +++++++ 8 files changed, 167 insertions(+), 66 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationLeakStressTest.kt diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt index 8f589912a0..b133b7935d 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt @@ -104,8 +104,10 @@ public interface CancellableContinuation : Continuation { public fun completeResume(token: Any) /** - * Legacy function that turned on cancellation behavior in [suspendCancellableCoroutine] before kotlinx.coroutines 1.1.0. - * This function does nothing and is left only for binary compatibility with old compiled code. + * Internal function that setups cancellation behavior in [suspendCancellableCoroutine]. + * It's illegal to call this function in any non-`kotlinx.coroutines` code and + * such calls lead to undefined behaviour. + * Exposed in our ABI since 1.0.0 withing `suspendCancellableCoroutine` body. * * @suppress **This is unstable API and it is subject to change.** */ @@ -332,7 +334,7 @@ internal suspend inline fun suspendCancellableCoroutineReusable( internal fun getOrCreateCancellableContinuation(delegate: Continuation): CancellableContinuationImpl { // If used outside of our dispatcher if (delegate !is DispatchedContinuation) { - return CancellableContinuationImpl(delegate, MODE_CANCELLABLE_REUSABLE) + return CancellableContinuationImpl(delegate, MODE_CANCELLABLE) } /* * Attempt to claim reusable instance. diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt index 1a8f35663a..c310623c5d 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt @@ -72,10 +72,7 @@ internal open class CancellableContinuationImpl( */ private val _state = atomic(Active) - private val _parentHandle = atomic(null) - private var parentHandle: DisposableHandle? - get() = _parentHandle.value - set(value) { _parentHandle.value = value } + private var parentHandle: DisposableHandle? = null internal val state: Any? get() = _state.value @@ -93,7 +90,21 @@ internal open class CancellableContinuationImpl( } public override fun initCancellability() { - setupCancellation() + /* + * Invariant: at the moment of invocation, `this` has not yet + * leaked to user code and no one is able to invoke `resume` or `cancel` + * on it yet. Also, this function is not invoked for reusable continuations. + */ + val handle = installParentHandle() + ?: return // fast path -- don't do anything without parent + // now check our state _after_ registering, could have completed while we were registering, + // but only if parent was cancelled. Parent could be in a "cancelling" state for a while, + // so we are helping it and cleaning the node ourselves + if (isCompleted) { + // Can be invoked concurrently in 'parentCancelled', no problems here + handle.dispose() + parentHandle = NonDisposableHandle + } } private fun isReusable(): Boolean = delegate is DispatchedContinuation<*> && delegate.isReusable(this) @@ -118,40 +129,6 @@ internal open class CancellableContinuationImpl( return true } - /** - * Setups parent cancellation and checks for postponed cancellation in the case of reusable continuations. - * It is only invoked from an internal [getResult] function for reusable continuations - * and from [suspendCancellableCoroutine] to establish a cancellation before registering CC anywhere. - */ - private fun setupCancellation() { - if (checkCompleted()) return - if (parentHandle !== null) return // fast path 2 -- was already initialized - val parent = delegate.context[Job] ?: return // fast path 3 -- don't do anything without parent - val handle = parent.invokeOnCompletion( - onCancelling = true, - handler = ChildContinuation(this).asHandler - ) - parentHandle = handle - // now check our state _after_ registering (could have completed while we were registering) - // Also note that we do not dispose parent for reusable continuations, dispatcher will do that for us - if (isCompleted && !isReusable()) { - handle.dispose() // it is Ok to call dispose twice -- here and in disposeParentHandle - parentHandle = NonDisposableHandle // release it just in case, to aid GC - } - } - - private fun checkCompleted(): Boolean { - val completed = isCompleted - if (!resumeMode.isReusableMode) return completed // Do not check postponed cancellation for non-reusable continuations - val dispatched = delegate as? DispatchedContinuation<*> ?: return completed - val cause = dispatched.checkPostponedCancellation(this) ?: return completed - if (!completed) { - // Note: this cancel may fail if one more concurrent cancel is currently being invoked - cancel(cause) - } - return true - } - public override val callerFrame: CoroutineStackFrame? get() = delegate as? CoroutineStackFrame @@ -188,7 +165,9 @@ internal open class CancellableContinuationImpl( */ private fun cancelLater(cause: Throwable): Boolean { if (!resumeMode.isReusableMode) return false - val dispatched = (delegate as? DispatchedContinuation<*>) ?: return false + // Ensure that we are postponing cancellation to the right instance + if (!isReusable()) return false + val dispatched = delegate as DispatchedContinuation<*> return dispatched.postponeCancellation(cause) } @@ -216,7 +195,7 @@ internal open class CancellableContinuationImpl( private inline fun callCancelHandlerSafely(block: () -> Unit) { try { - block() + block() } catch (ex: Throwable) { // Handler should never fail, if it does -- it is an unhandled exception handleCoroutineException( @@ -276,9 +255,33 @@ internal open class CancellableContinuationImpl( @PublishedApi internal fun getResult(): Any? { - setupCancellation() - if (trySuspend()) return COROUTINE_SUSPENDED + val isReusable = isReusable() + // trySuspend may fail either if 'block' has resumed/cancelled a continuation + // or we got async cancellation from parent. + if (trySuspend()) { + /* + * We were neither resumed nor cancelled, time to suspend. + * But first we have to install parent cancellation handle (if we didn't yet), + * so CC could be properly resumed on parent cancellation. + */ + if (parentHandle == null) { + installParentHandle() + } + /* + * Release the continuation after installing the handle (if needed). + * If we were successful, then do nothing, it's ok to reuse the instance now. + * Otherwise, dispose the handle by ourselves. + */ + if (isReusable) { + releaseClaimedReusableContinuation() + } + return COROUTINE_SUSPENDED + } // otherwise, onCompletionInternal was already invoked & invoked tryResume, and the result is in the state + if (isReusable) { + // release claimed reusable continuation for the future reuse + releaseClaimedReusableContinuation() + } val state = this.state if (state is CompletedExceptionally) throw recoverStackTrace(state.cause, this) // if the parent job was already cancelled, then throw the corresponding cancellation exception @@ -296,6 +299,28 @@ internal open class CancellableContinuationImpl( return getSuccessfulResult(state) } + private fun installParentHandle(): DisposableHandle? { + val parent = context[Job] ?: return null // don't do anything without a parent + // Install the handle + val handle = parent.invokeOnCompletion( + onCancelling = true, + handler = ChildContinuation(this).asHandler + ) + parentHandle = handle + return handle + } + + /** + * Tries to release reusable continuation. It can fail is there was an asynchronous cancellation, + * in which case it detaches from the parent and cancels this continuation. + */ + private fun releaseClaimedReusableContinuation() { + // Cannot be casted if e.g. invoked from `installParentHandleReusable` for context without dispatchers, but with Job in it + val cancellationCause = (delegate as? DispatchedContinuation<*>)?.tryReleaseClaimedContinuation(this) ?: return + detachChild() + cancel(cancellationCause) + } + override fun resumeWith(result: Result) = resumeImpl(result.toState(this), resumeMode) @@ -462,11 +487,10 @@ internal open class CancellableContinuationImpl( /** * Detaches from the parent. - * Invariant: used from [CoroutineDispatcher.releaseInterceptedContinuation] iff [isReusable] is `true` */ internal fun detachChild() { - val handle = parentHandle - handle?.dispose() + val handle = parentHandle ?: return + handle.dispose() parentHandle = NonDisposableHandle } diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index b2b887988d..10be4a3d9e 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -101,7 +101,12 @@ public abstract class CoroutineDispatcher : @InternalCoroutinesApi public override fun releaseInterceptedContinuation(continuation: Continuation<*>) { - (continuation as DispatchedContinuation<*>).reusableCancellableContinuation?.detachChild() + /* + * Unconditional cast is safe here: we only return DispatchedContinuation from `interceptContinuation`, + * any ClassCastException can only indicate compiler bug + */ + val dispatched = continuation as DispatchedContinuation<*> + dispatched.release() } /** diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index a7dbbf8b31..438e7f5722 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -1228,6 +1228,8 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren * thrown and not a JobCancellationException. */ val cont = AwaitContinuation(uCont.intercepted(), this) + // we are mimicking suspendCancellableCoroutine here and call initCancellability, too. + cont.initCancellability() cont.disposeOnCancellation(invokeOnCompletion(ResumeAwaitOnCompletion(cont).asHandler)) cont.getResult() } diff --git a/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt b/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt index 2874e7d592..45b9699c84 100644 --- a/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt +++ b/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt @@ -46,17 +46,15 @@ internal class DispatchedContinuation( * 4) [Throwable] continuation was cancelled with this cause while being in [suspendCancellableCoroutineReusable], * [CancellableContinuationImpl.getResult] will check for cancellation later. * - * [REUSABLE_CLAIMED] state is required to prevent the lost resume in the channel. - * AbstractChannel.receive method relies on the fact that the following pattern + * [REUSABLE_CLAIMED] state is required to prevent double-use of the reused continuation. + * In the `getResult`, we have the following code: * ``` - * suspendCancellableCoroutineReusable { cont -> - * val result = pollFastPath() - * if (result != null) cont.resume(result) + * if (trySuspend()) { + * // <- at this moment current continuation can be redispatched and claimed again. + * attachChildToParent() + * releaseClaimedContinuation() * } * ``` - * always succeeds. - * To make it always successful, we actually postpone "reusable" cancellation - * to this phase and set cancellation only at the moment of instantiation. */ private val _reusableCancellableContinuation = atomic(null) @@ -66,9 +64,9 @@ internal class DispatchedContinuation( public fun isReusable(requester: CancellableContinuationImpl<*>): Boolean { /* * Reusability control: - * `null` -> no reusability at all, false + * `null` -> no reusability at all, `false` * If current state is not CCI, then we are within `suspendCancellableCoroutineReusable`, true - * Else, if result is CCI === requester. + * Else, if result is CCI === requester, then it's our reusable continuation * Identity check my fail for the following pattern: * ``` * loop: @@ -82,6 +80,27 @@ internal class DispatchedContinuation( return true } + + /** + * Awaits until previous call to `suspendCancellableCoroutineReusable` will + * stop mutating cached instance + */ + public fun awaitReusability() { + _reusableCancellableContinuation.loop { it -> + if (it !== REUSABLE_CLAIMED) return + } + } + + public fun release() { + /* + * Called from `releaseInterceptedContinuation`, can be concurrent with + * the code in `getResult` right after `trySuspend` returned `true`, so we have + * to wait for a release here. + */ + awaitReusability() + reusableCancellableContinuation?.detachChild() + } + /** * Claims the continuation for [suspendCancellableCoroutineReusable] block, * so all cancellations will be postponed. @@ -103,11 +122,20 @@ internal class DispatchedContinuation( _reusableCancellableContinuation.value = REUSABLE_CLAIMED return null } + // potentially competing with cancel state is CancellableContinuationImpl<*> -> { if (_reusableCancellableContinuation.compareAndSet(state, REUSABLE_CLAIMED)) { return state as CancellableContinuationImpl } } + state === REUSABLE_CLAIMED -> { + // Do nothing, wait until reusable instance will be returned from + // getResult() of a previous `suspendCancellableCoroutineReusable` + } + state is Throwable -> { + // Also do nothing, Throwable can only indicate that the CC + // is in REUSABLE_CLAIMED state, but with postponed cancellation + } else -> error("Inconsistent state $state") } } @@ -127,14 +155,13 @@ internal class DispatchedContinuation( * * See [CancellableContinuationImpl.getResult]. */ - fun checkPostponedCancellation(continuation: CancellableContinuation<*>): Throwable? { + fun tryReleaseClaimedContinuation(continuation: CancellableContinuation<*>): Throwable? { _reusableCancellableContinuation.loop { state -> // not when(state) to avoid Intrinsics.equals call when { state === REUSABLE_CLAIMED -> { if (_reusableCancellableContinuation.compareAndSet(REUSABLE_CLAIMED, continuation)) return null } - state === null -> return null state is Throwable -> { require(_reusableCancellableContinuation.compareAndSet(state, null)) return state diff --git a/kotlinx-coroutines-core/jvm/test/CancelledAwaitStressTest.kt b/kotlinx-coroutines-core/jvm/test/CancelledAwaitStressTest.kt index 55c05c55b0..c7c2c04e59 100644 --- a/kotlinx-coroutines-core/jvm/test/CancelledAwaitStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/CancelledAwaitStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -52,4 +52,4 @@ class CancelledAwaitStressTest : TestBase() { private fun keepMe(a: ByteArray) { // does nothing, makes sure the variable is kept in state-machine } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt index e8079ebdfa..c4232d6e60 100644 --- a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt +++ b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -56,7 +56,7 @@ object FieldWalker { * Reflectively starts to walk through object graph and map to all the reached object to their path * in from root. Use [showPath] do display a path if needed. */ - private fun walkRefs(root: Any?, rootStatics: Boolean): Map { + private fun walkRefs(root: Any?, rootStatics: Boolean): IdentityHashMap { val visited = IdentityHashMap() if (root == null) return visited visited[root] = Ref.RootRef diff --git a/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationLeakStressTest.kt b/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationLeakStressTest.kt new file mode 100644 index 0000000000..8a20e0843f --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationLeakStressTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.channels.* +import org.junit.Test +import kotlin.test.* + +class ReusableCancellableContinuationLeakStressTest : TestBase() { + + @Suppress("UnnecessaryVariable") + private suspend fun ReceiveChannel.receiveBatch(): T { + val r = receive() // DO NOT MERGE LINES, otherwise TCE will kick in + return r + } + + private val iterations = 100_000 * stressTestMultiplier + + class Leak(val i: Int) + + @Test // Simplified version of #2564 + fun testReusableContinuationLeak() = runTest { + val channel = produce(capacity = 1) { // from the main thread + (0 until iterations).forEach { + send(Leak(it)) + } + } + + launch(Dispatchers.Default) { + repeat (iterations) { + val value = channel.receiveBatch() + assertEquals(it, value.i) + } + (channel as Job).join() + + FieldWalker.assertReachableCount(0, coroutineContext.job, false) { it is Leak } + } + } +} From ed8e8d1ae0de54cb684db9e5817f2234ce7e9f90 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 18 Mar 2021 16:58:55 +0300 Subject: [PATCH 009/328] Introduce ChannelResult and receiveCatching/onReceiveCatching * Introduce three-state ChannelResult, a domain-specific Result class counterpart * Introduce receiveCatching/onReceiveCatching, make it public * Get rid of receiveOrClosed/onReceiveOrClosed without migrations, it was @InternalCoroutinesApi anyway Fixes #330 --- .../api/kotlinx-coroutines-core.api | 41 ++--- .../common/src/channels/AbstractChannel.kt | 26 ++-- .../common/src/channels/Channel.kt | 137 ++++++++-------- .../common/src/flow/Channels.kt | 8 +- .../test/channels/BasicOperationsTest.kt | 20 +-- .../channels/ChannelReceiveCatchingTest.kt | 146 ++++++++++++++++++ .../channels/ChannelReceiveOrClosedTest.kt | 135 ---------------- .../ChannelUndeliveredElementFailureTest.kt | 8 +- .../common/test/channels/TestChannelKind.kt | 8 +- .../test/selects/SelectArrayChannelTest.kt | 28 ++-- .../selects/SelectRendezvousChannelTest.kt | 32 ++-- .../ChannelUndeliveredElementStressTest.kt | 4 +- .../test/channels/TickerChannelCommonTest.kt | 6 +- 13 files changed, 299 insertions(+), 300 deletions(-) create mode 100644 kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt delete mode 100644 kotlinx-coroutines-core/common/test/channels/ChannelReceiveOrClosedTest.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 8a35d18687..7d2fa1f447 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -625,6 +625,26 @@ public final class kotlinx/coroutines/channels/ChannelKt { public static synthetic fun Channel$default (ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; } +public final class kotlinx/coroutines/channels/ChannelResult { + public static final field Companion Lkotlinx/coroutines/channels/ChannelResult$Companion; + public static final synthetic fun box-impl (Ljava/lang/Object;)Lkotlinx/coroutines/channels/ChannelResult; + public static synthetic fun constructor-impl (Ljava/lang/Object;Lkotlin/jvm/internal/DefaultConstructorMarker;)Ljava/lang/Object; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Ljava/lang/Object;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Ljava/lang/Object;Ljava/lang/Object;)Z + public static final fun exceptionOrNull-impl (Ljava/lang/Object;)Ljava/lang/Throwable; + public static final fun getOrNull-impl (Ljava/lang/Object;)Ljava/lang/Object; + public static final fun getOrThrow-impl (Ljava/lang/Object;)Ljava/lang/Object; + public fun hashCode ()I + public static fun hashCode-impl (Ljava/lang/Object;)I + public static final fun isClosed-impl (Ljava/lang/Object;)Z + public static final fun isFailure-impl (Ljava/lang/Object;)Z + public static final fun isSuccess-impl (Ljava/lang/Object;)Z + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Ljava/lang/Object;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Ljava/lang/Object; +} + public final class kotlinx/coroutines/channels/ChannelsKt { public static final fun all (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun any (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -789,14 +809,14 @@ public abstract interface class kotlinx/coroutines/channels/ReceiveChannel { public abstract synthetic fun cancel (Ljava/lang/Throwable;)Z public abstract fun cancel (Ljava/util/concurrent/CancellationException;)V public abstract fun getOnReceive ()Lkotlinx/coroutines/selects/SelectClause1; - public abstract fun getOnReceiveOrClosed ()Lkotlinx/coroutines/selects/SelectClause1; + public abstract fun getOnReceiveCatching ()Lkotlinx/coroutines/selects/SelectClause1; public abstract fun getOnReceiveOrNull ()Lkotlinx/coroutines/selects/SelectClause1; public abstract fun isClosedForReceive ()Z public abstract fun isEmpty ()Z public abstract fun iterator ()Lkotlinx/coroutines/channels/ChannelIterator; public abstract fun poll ()Ljava/lang/Object; public abstract fun receive (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun receiveOrClosed-WVj179g (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun receiveCatching-JP2dKIU (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun receiveOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -832,23 +852,6 @@ public final class kotlinx/coroutines/channels/TickerMode : java/lang/Enum { public static fun values ()[Lkotlinx/coroutines/channels/TickerMode; } -public final class kotlinx/coroutines/channels/ValueOrClosed { - public static final field Companion Lkotlinx/coroutines/channels/ValueOrClosed$Companion; - public static final synthetic fun box-impl (Ljava/lang/Object;)Lkotlinx/coroutines/channels/ValueOrClosed; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/Object;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/Object;Ljava/lang/Object;)Z - public static final fun getCloseCause-impl (Ljava/lang/Object;)Ljava/lang/Throwable; - public static final fun getValue-impl (Ljava/lang/Object;)Ljava/lang/Object; - public static final fun getValueOrNull-impl (Ljava/lang/Object;)Ljava/lang/Object; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/Object;)I - public static final fun isClosed-impl (Ljava/lang/Object;)Z - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/Object;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/Object; -} - public final class kotlinx/coroutines/debug/internal/DebugCoroutineInfo { public fun (Lkotlinx/coroutines/debug/internal/DebugCoroutineInfoImpl;Lkotlin/coroutines/CoroutineContext;)V public final fun getContext ()Lkotlin/coroutines/CoroutineContext; diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 9721583e83..180598c94f 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -623,7 +623,7 @@ internal abstract class AbstractChannel( } @Suppress("UNCHECKED_CAST") - public final override suspend fun receiveOrClosed(): ValueOrClosed { + public final override suspend fun receiveCatching(): ChannelResult { // fast path -- try poll non-blocking val result = pollInternal() if (result !== POLL_FAILED) return result.toResult() @@ -742,10 +742,10 @@ internal abstract class AbstractChannel( } } - final override val onReceiveOrClosed: SelectClause1> - get() = object : SelectClause1> { + final override val onReceiveCatching: SelectClause1> + get() = object : SelectClause1> { @Suppress("UNCHECKED_CAST") - override fun registerSelectClause1(select: SelectInstance, block: suspend (ValueOrClosed) -> R) { + override fun registerSelectClause1(select: SelectInstance, block: suspend (ChannelResult) -> R) { registerSelectReceiveMode(select, RECEIVE_RESULT, block as suspend (Any?) -> R) } } @@ -776,7 +776,7 @@ internal abstract class AbstractChannel( } RECEIVE_RESULT -> { if (!select.trySelect()) return - startCoroutineUnintercepted(ValueOrClosed.closed(value.closeCause), select.completion) + startCoroutineUnintercepted(ChannelResult.closed(value.closeCause), select.completion) } RECEIVE_NULL_ON_CLOSE -> { if (value.closeCause == null) { @@ -905,7 +905,7 @@ internal abstract class AbstractChannel( @JvmField val receiveMode: Int ) : Receive() { fun resumeValue(value: E): Any? = when (receiveMode) { - RECEIVE_RESULT -> ValueOrClosed.value(value) + RECEIVE_RESULT -> ChannelResult.value(value) else -> value } @@ -990,7 +990,7 @@ internal abstract class AbstractChannel( @Suppress("UNCHECKED_CAST") override fun completeResumeReceive(value: E) { block.startCoroutineCancellable( - if (receiveMode == RECEIVE_RESULT) ValueOrClosed.value(value) else value, + if (receiveMode == RECEIVE_RESULT) ChannelResult.value(value) else value, select.completion, resumeOnCancellationFun(value) ) @@ -1000,7 +1000,7 @@ internal abstract class AbstractChannel( if (!select.trySelect()) return when (receiveMode) { RECEIVE_THROWS_ON_CLOSE -> select.resumeSelectWithException(closed.receiveException) - RECEIVE_RESULT -> block.startCoroutineCancellable(ValueOrClosed.closed(closed.closeCause), select.completion) + RECEIVE_RESULT -> block.startCoroutineCancellable(ChannelResult.closed(closed.closeCause), select.completion) RECEIVE_NULL_ON_CLOSE -> if (closed.closeCause == null) { block.startCoroutineCancellable(null, select.completion) } else { @@ -1128,9 +1128,9 @@ internal class Closed( override val offerResult get() = this override val pollResult get() = this - override fun tryResumeSend(otherOp: PrepareOp?): Symbol? = RESUME_TOKEN.also { otherOp?.finishPrepare() } + override fun tryResumeSend(otherOp: PrepareOp?): Symbol = RESUME_TOKEN.also { otherOp?.finishPrepare() } override fun completeResumeSend() {} - override fun tryResumeReceive(value: E, otherOp: PrepareOp?): Symbol? = RESUME_TOKEN.also { otherOp?.finishPrepare() } + override fun tryResumeReceive(value: E, otherOp: PrepareOp?): Symbol = RESUME_TOKEN.also { otherOp?.finishPrepare() } override fun completeResumeReceive(value: E) {} override fun resumeSendClosed(closed: Closed<*>) = assert { false } // "Should be never invoked" override fun toString(): String = "Closed@$hexAddress[$closeCause]" @@ -1143,8 +1143,8 @@ internal abstract class Receive : LockFreeLinkedListNode(), ReceiveOrClose } @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") -private inline fun Any?.toResult(): ValueOrClosed = - if (this is Closed<*>) ValueOrClosed.closed(closeCause) else ValueOrClosed.value(this as E) +private inline fun Any?.toResult(): ChannelResult = + if (this is Closed<*>) ChannelResult.closed(closeCause) else ChannelResult.value(this as E) @Suppress("NOTHING_TO_INLINE") -private inline fun Closed<*>.toResult(): ValueOrClosed = ValueOrClosed.closed(closeCause) +private inline fun Closed<*>.toResult(): ChannelResult = ChannelResult.closed(closeCause) diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index b8b81aac53..824a57bfb1 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -244,8 +244,9 @@ public interface ReceiveChannel { /** * Retrieves and removes an element from this channel if it's not empty, or suspends the caller while this channel is empty. - * This method returns [ValueOrClosed] with the value of an element successfully retrieved from the channel - * or the close cause if the channel was closed. + * This method returns [ChannelResult] with the value of an element successfully retrieved from the channel + * or the close cause if the channel was closed. Closed cause may be `null` if the channel was closed normally. + * The result cannot be [failed][ChannelResult.isFailure] without being [closed][ChannelResult.isClosed]. * * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this * function is suspended, this function immediately resumes with a [CancellationException]. @@ -257,25 +258,17 @@ public interface ReceiveChannel { * Note that this function does not check for cancellation when it is not suspended. * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. * - * This function can be used in [select] invocations with the [onReceiveOrClosed] clause. + * This function can be used in [select] invocations with the [onReceiveCatching] clause. * Use [poll] to try receiving from this channel without waiting. - * - * @suppress *This is an internal API, do not use*: Inline classes ABI is not stable yet and - * [KT-27524](https://youtrack.jetbrains.com/issue/KT-27524) needs to be fixed. */ - @InternalCoroutinesApi // until https://youtrack.jetbrains.com/issue/KT-27524 is fixed - public suspend fun receiveOrClosed(): ValueOrClosed + public suspend fun receiveCatching(): ChannelResult /** - * Clause for the [select] expression of the [receiveOrClosed] suspending function that selects with the [ValueOrClosed] with a value + * Clause for the [select] expression of the [onReceiveCatching] suspending function that selects with the [ChannelResult] with a value * that is received from the channel or with a close cause if the channel * [is closed for `receive`][isClosedForReceive]. - * - * @suppress *This is an internal API, do not use*: Inline classes ABI is not stable yet and - * [KT-27524](https://youtrack.jetbrains.com/issue/KT-27524) needs to be fixed. */ - @InternalCoroutinesApi // until https://youtrack.jetbrains.com/issue/KT-27524 is fixed - public val onReceiveOrClosed: SelectClause1> + public val onReceiveCatching: SelectClause1> /** * Retrieves and removes an element from this channel if its not empty, or returns `null` if the channel is empty @@ -321,104 +314,96 @@ public interface ReceiveChannel { } /** - * A discriminated union of [ReceiveChannel.receiveOrClosed] result - * that encapsulates either an element of type [T] successfully received from the channel or a close cause. + * A discriminated union of channel operation result. + * It encapsulates successful or failed result of a channel operation, or a failed operation to a closed channel with + * an optional cause. + * + * Successful result represents a successful operation with value of type [T], for example, result of [Channel.receiveCatching] + * operation or a successfully sent element as a result of [Channel.trySend]. * - * :todo: Do not make it public before resolving todos in the code of this class. + * Failed result represents a failed operation attempt to a channel, but it doesn't necessary indicate that the channel is failed. + * E.g. when the channel is full, [Channel.trySend] returns failed result, but the channel itself is not in the failed state. * - * @suppress *This is an internal API, do not use*: Inline classes ABI is not stable yet and - * [KT-27524](https://youtrack.jetbrains.com/issue/KT-27524) needs to be fixed. + * Closed result represents an operation attempt to a closed channel and also implies that the operation was failed. */ -@Suppress("NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS", "EXPERIMENTAL_FEATURE_WARNING") -@InternalCoroutinesApi // until https://youtrack.jetbrains.com/issue/KT-27524 is fixed -public inline class ValueOrClosed +@Suppress("UNCHECKED_CAST") +public inline class ChannelResult internal constructor(private val holder: Any?) { /** - * Returns `true` if this instance represents a received element. - * In this case [isClosed] returns `false`. - * todo: it is commented for now, because it is not used + * Returns `true` if this instance represents a successful + * operation outcome. + * + * In this case [isFailure] and [isClosed] return false. */ - //public val isValue: Boolean get() = holder !is Closed + public val isSuccess: Boolean get() = holder !is Closed /** - * Returns `true` if this instance represents a close cause. - * In this case [isValue] returns `false`. + * Returns true if this instance represents unsuccessful operation. + * + * In this case [isSuccess] returns false, but it does not imply + * that the channel is failed or closed. + * + * Example of failed operation without an exception and channel being closed + * is [Channel.trySend] attempt to a channel that is full. */ - public val isClosed: Boolean get() = holder is Closed + public val isFailure: Boolean get() = holder is Failed /** - * Returns the received value if this instance represents a received value, or throws an [IllegalStateException] otherwise. + * Returns `true` if this instance represents unsuccessful operation + * to a closed or cancelled channel. * - * :todo: Decide, if it is needed, how it shall be named with relation to [valueOrThrow]: + * In this case [isSuccess] returns false, [isFailure] returns `true`, but it does not imply + * that [exceptionOrNull] returns non-null value. * - * So we have the following methods on `ValueOrClosed`: `value`, `valueOrNull`, `valueOrThrow`. - * On the other hand, the channel has the following `receive` variants: - * * `receive` which corresponds to `receiveOrClosed().valueOrThrow`... huh? - * * `receiveOrNull` which corresponds to `receiveOrClosed().valueOrNull` - * * `receiveOrClosed` - * For the sake of simplicity consider dropping this version of `value` and rename [valueOrThrow] to simply `value`. + * It can happen if the channel was [closed][Channel.close] normally without an exception. */ - @Suppress("UNCHECKED_CAST") - public val value: T - get() = if (holder is Closed) error(DEFAULT_CLOSE_MESSAGE) else holder as T + public val isClosed: Boolean get() = holder is Closed /** - * Returns the received value if this element represents a received value, or `null` otherwise. - * :todo: Decide if it shall be made into extension that is available only for non-null T. - * Note: it might become inconsistent with kotlin.Result + * Returns the encapsulated value if this instance represents success or `null` if it represents failed result. */ - @Suppress("UNCHECKED_CAST") - public val valueOrNull: T? - get() = if (holder is Closed) null else holder as T + public fun getOrNull(): T? = if (holder !is Failed) holder as T else null /** - * :todo: Decide, if it is needed, how it shall be named with relation to [value]. - * Note that `valueOrThrow` rethrows the cause adding no meaningful information about the call site, - * so if one is sure that `ValueOrClosed` always holds a value, this very property should be used. - * Otherwise, it could be very hard to locate the source of the exception. - * todo: it is commented for now, because it is not used + * Returns the encapsulated value if this instance represents success or throws an exception if it is closed or failed. */ - //@Suppress("UNCHECKED_CAST") - //public val valueOrThrow: T - // get() = if (holder is Closed) throw holder.exception else holder as T + public fun getOrThrow(): T { + if (holder !is Failed) return holder as T + if (holder is Closed && holder.cause != null) throw holder.cause + error("Trying to call 'getOrThrow' on a failed channel result: $holder") + } /** - * Returns the close cause of the channel if this instance represents a close cause, or throws - * an [IllegalStateException] otherwise. + * Returns the encapsulated exception if this instance represents failure or null if it is success + * or unsuccessful operation to closed channel. */ - @Suppress("UNCHECKED_CAST") - public val closeCause: Throwable? get() = - if (holder is Closed) holder.cause else error("Channel was not closed") + public fun exceptionOrNull(): Throwable? = (holder as? Closed)?.cause - /** - * @suppress - */ - public override fun toString(): String = - when (holder) { - is Closed -> holder.toString() - else -> "Value($holder)" + internal open class Failed { + override fun toString(): String = "Failed" } - internal class Closed(@JvmField val cause: Throwable?) { - // todo: it is commented for now, because it is not used - //val exception: Throwable get() = cause ?: ClosedReceiveChannelException(DEFAULT_CLOSE_MESSAGE) + internal class Closed(@JvmField val cause: Throwable?): Failed() { override fun equals(other: Any?): Boolean = other is Closed && cause == other.cause override fun hashCode(): Int = cause.hashCode() override fun toString(): String = "Closed($cause)" } - /** - * todo: consider making value/closed constructors public in the future. - */ internal companion object { @Suppress("NOTHING_TO_INLINE") - internal inline fun value(value: E): ValueOrClosed = - ValueOrClosed(value) + internal inline fun value(value: E): ChannelResult = + ChannelResult(value) @Suppress("NOTHING_TO_INLINE") - internal inline fun closed(cause: Throwable?): ValueOrClosed = - ValueOrClosed(Closed(cause)) + internal inline fun closed(cause: Throwable?): ChannelResult = + ChannelResult(Closed(cause)) } + + public override fun toString(): String = + when (holder) { + is Closed -> holder.toString() + else -> "Value($holder)" + } } /** diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index e883c3b468..5b126f0ed7 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -30,7 +30,7 @@ public suspend fun FlowCollector.emitAll(channel: ReceiveChannel): Uni emitAllImpl(channel, consume = true) private suspend fun FlowCollector.emitAllImpl(channel: ReceiveChannel, consume: Boolean) { - // Manually inlined "consumeEach" implementation that does not use iterator but works via "receiveOrClosed". + // Manually inlined "consumeEach" implementation that does not use iterator but works via "receiveCatching". // It has smaller and more efficient spilled state which also allows to implement a manual kludge to // fix retention of the last emitted value. // See https://youtrack.jetbrains.com/issue/KT-16222 @@ -47,9 +47,9 @@ private suspend fun FlowCollector.emitAllImpl(channel: ReceiveChannel, // L$1 <- channel // L$2 <- cause // L$3 <- this$run (actually equal to this) - val result = run { channel.receiveOrClosed() } + val result = run { channel.receiveCatching() } if (result.isClosed) { - result.closeCause?.let { throw it } + result.exceptionOrNull()?.let { throw it } break // returns normally when result.closeCause == null } // result is spilled here to the coroutine state and retained after the call, even though @@ -58,7 +58,7 @@ private suspend fun FlowCollector.emitAllImpl(channel: ReceiveChannel, // L$1 <- channel // L$2 <- cause // L$3 <- result - emit(result.value) + emit(result.getOrThrow()) } } catch (e: Throwable) { cause = e diff --git a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt index 91d941b32c..e178f124a7 100644 --- a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -35,7 +35,7 @@ class BasicOperationsTest : TestBase() { } @Test - fun testReceiveOrClosed() = runTest { + fun testReceiveCatching() = runTest { TestChannelKind.values().forEach { kind -> testReceiveOrClosed(kind) } } @@ -139,22 +139,22 @@ class BasicOperationsTest : TestBase() { } expect(1) - val result = channel.receiveOrClosed() - assertEquals(1, result.value) - assertEquals(1, result.valueOrNull) - assertTrue(ValueOrClosed.value(1) == result) + val result = channel.receiveCatching() + assertEquals(1, result.getOrThrow()) + assertEquals(1, result.getOrNull()) + assertTrue(ChannelResult.value(1) == result) expect(3) launch { expect(4) channel.close() } - val closed = channel.receiveOrClosed() + val closed = channel.receiveCatching() expect(5) - assertNull(closed.valueOrNull) + assertNull(closed.getOrNull()) assertTrue(closed.isClosed) - assertNull(closed.closeCause) - assertTrue(ValueOrClosed.closed(closed.closeCause) == closed) + assertNull(closed.exceptionOrNull()) + assertTrue(ChannelResult.closed(closed.exceptionOrNull()) == closed) finish(6) } diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt new file mode 100644 index 0000000000..4344b1055d --- /dev/null +++ b/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt @@ -0,0 +1,146 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.channels + +import kotlinx.coroutines.* +import kotlin.test.* + +class ChannelReceiveCatchingTest : TestBase() { + @Test + fun testChannelOfThrowables() = runTest { + val channel = Channel() + launch { + channel.send(TestException1()) + channel.close(TestException2()) + } + + val element = channel.receiveCatching() + assertTrue(element.getOrThrow() is TestException1) + assertTrue(element.getOrNull() is TestException1) + + val closed = channel.receiveCatching() + assertTrue(closed.isClosed) + assertTrue(closed.isFailure) + assertTrue(closed.exceptionOrNull() is TestException2) + } + + @Test + @Suppress("ReplaceAssertBooleanWithAssertEquality") // inline classes test + fun testNullableIntChanel() = runTest { + val channel = Channel() + launch { + expect(2) + channel.send(1) + expect(3) + channel.send(null) + + expect(6) + channel.close() + } + + expect(1) + val element = channel.receiveCatching() + assertEquals(1, element.getOrThrow()) + assertEquals(1, element.getOrNull()) + assertEquals("Value(1)", element.toString()) + assertTrue(ChannelResult.value(1) == element) // Don't box + assertFalse(element.isFailure) + assertFalse(element.isClosed) + + expect(4) + val nullElement = channel.receiveCatching() + assertNull(nullElement.getOrThrow()) + assertNull(nullElement.getOrNull()) + assertEquals("Value(null)", nullElement.toString()) + assertTrue(ChannelResult.value(null) == nullElement) // Don't box + assertFalse(element.isFailure) + assertFalse(element.isClosed) + + expect(5) + val closed = channel.receiveCatching() + assertTrue(closed.isClosed) + assertTrue(closed.isFailure) + + val closed2 = channel.receiveCatching() + assertTrue(closed2.isClosed) + assertTrue(closed.isFailure) + assertNull(closed2.exceptionOrNull()) + finish(7) + } + + @Test + @ExperimentalUnsignedTypes + fun testUIntChannel() = runTest { + val channel = Channel() + launch { + expect(2) + channel.send(1u) + yield() + expect(4) + channel.send((Long.MAX_VALUE - 1).toUInt()) + expect(5) + } + + expect(1) + val element = channel.receiveCatching() + assertEquals(1u, element.getOrThrow()) + + expect(3) + val element2 = channel.receiveCatching() + assertEquals((Long.MAX_VALUE - 1).toUInt(), element2.getOrThrow()) + finish(6) + } + + @Test + fun testCancelChannel() = runTest { + val channel = Channel() + launch { + expect(2) + channel.cancel() + } + + expect(1) + val closed = channel.receiveCatching() + assertTrue(closed.isClosed) + assertTrue(closed.isFailure) + finish(3) + } + + @Test + @ExperimentalUnsignedTypes + fun testReceiveResultChannel() = runTest { + val channel = Channel>() + launch { + channel.send(ChannelResult.value(1u)) + channel.send(ChannelResult.closed(TestException1())) + channel.close(TestException2()) + } + + val intResult = channel.receiveCatching() + assertEquals(1u, intResult.getOrThrow().getOrThrow()) + assertFalse(intResult.isFailure) + assertFalse(intResult.isClosed) + + val closeCauseResult = channel.receiveCatching() + assertTrue(closeCauseResult.getOrThrow().exceptionOrNull() is TestException1) + + val closeCause = channel.receiveCatching() + assertTrue(closeCause.isClosed) + assertTrue(closeCause.isFailure) + assertTrue(closeCause.exceptionOrNull() is TestException2) + } + + @Test + fun testToString() = runTest { + val channel = Channel(1) + channel.send("message") + channel.close(TestException1("OK")) + assertEquals("Value(message)", channel.receiveCatching().toString()) + // toString implementation for exception differs on every platform + val str = channel.receiveCatching().toString() + if (!str.matches("Closed\\(.*TestException1: OK\\)".toRegex())) + error("Unexpected string: '$str'") + } +} diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelReceiveOrClosedTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelReceiveOrClosedTest.kt deleted file mode 100644 index e58b0deed5..0000000000 --- a/kotlinx-coroutines-core/common/test/channels/ChannelReceiveOrClosedTest.kt +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.channels - -import kotlinx.coroutines.* -import kotlin.test.* - -class ChannelReceiveOrClosedTest : TestBase() { - @Test - fun testChannelOfThrowables() = runTest { - val channel = Channel() - launch { - channel.send(TestException1()) - channel.close(TestException2()) - } - - val element = channel.receiveOrClosed() - assertTrue(element.value is TestException1) - assertTrue(element.valueOrNull is TestException1) - - val closed = channel.receiveOrClosed() - assertTrue(closed.isClosed) - assertTrue(closed.closeCause is TestException2) - } - - @Test - @Suppress("ReplaceAssertBooleanWithAssertEquality") // inline classes test - fun testNullableIntChanel() = runTest { - val channel = Channel() - launch { - expect(2) - channel.send(1) - expect(3) - channel.send(null) - - expect(6) - channel.close() - } - - expect(1) - val element = channel.receiveOrClosed() - assertEquals(1, element.value) - assertEquals(1, element.valueOrNull) - assertEquals("Value(1)", element.toString()) - assertTrue(ValueOrClosed.value(1) == element) // Don't box - - expect(4) - val nullElement = channel.receiveOrClosed() - assertNull(nullElement.value) - assertNull(nullElement.valueOrNull) - assertEquals("Value(null)", nullElement.toString()) - assertTrue(ValueOrClosed.value(null) == nullElement) // Don't box - - expect(5) - val closed = channel.receiveOrClosed() - assertTrue(closed.isClosed) - - val closed2 = channel.receiveOrClosed() - assertTrue(closed2.isClosed) - assertNull(closed2.closeCause) - finish(7) - } - - @Test - @ExperimentalUnsignedTypes - fun testUIntChannel() = runTest { - val channel = Channel() - launch { - expect(2) - channel.send(1u) - yield() - expect(4) - channel.send((Long.MAX_VALUE - 1).toUInt()) - expect(5) - } - - expect(1) - val element = channel.receiveOrClosed() - assertEquals(1u, element.value) - - expect(3) - val element2 = channel.receiveOrClosed() - assertEquals((Long.MAX_VALUE - 1).toUInt(), element2.value) - finish(6) - } - - @Test - fun testCancelChannel() = runTest { - val channel = Channel() - launch { - expect(2) - channel.cancel() - } - - expect(1) - val closed = channel.receiveOrClosed() - assertTrue(closed.isClosed) - finish(3) - } - - @Test - @ExperimentalUnsignedTypes - fun testReceiveResultChannel() = runTest { - val channel = Channel>() - launch { - channel.send(ValueOrClosed.value(1u)) - channel.send(ValueOrClosed.closed(TestException1())) - channel.close(TestException2()) - } - - val intResult = channel.receiveOrClosed() - assertEquals(1u, intResult.value.value) - - val closeCauseResult = channel.receiveOrClosed() - assertTrue(closeCauseResult.value.closeCause is TestException1) - - val closeCause = channel.receiveOrClosed() - assertTrue(closeCause.isClosed) - assertTrue(closeCause.closeCause is TestException2) - } - - @Test - fun testToString() = runTest { - val channel = Channel(1) - channel.send("message") - channel.close(TestException1("OK")) - assertEquals("Value(message)", channel.receiveOrClosed().toString()) - // toString implementation for exception differs on every platform - val str = channel.receiveOrClosed().toString() - if (!str.matches("Closed\\(.*TestException1: OK\\)".toRegex())) - error("Unexpected string: '$str'") - } -} diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt index d2ef3d2691..37db7e4526 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -99,7 +99,7 @@ class ChannelUndeliveredElementFailureTest : TestBase() { fun testReceiveOrClosedCancelledFail() = runTest(unhandled = shouldBeUnhandled) { val channel = Channel(onUndeliveredElement = onCancelFail) val job = launch(start = CoroutineStart.UNDISPATCHED) { - channel.receiveOrClosed() + channel.receiveCatching() expectUnreached() // will be cancelled before it dispatches } channel.send(item) @@ -111,7 +111,7 @@ class ChannelUndeliveredElementFailureTest : TestBase() { val channel = Channel(onUndeliveredElement = onCancelFail) val job = launch(start = CoroutineStart.UNDISPATCHED) { select { - channel.onReceiveOrClosed { + channel.onReceiveCatching { expectUnreached() } } @@ -140,4 +140,4 @@ class ChannelUndeliveredElementFailureTest : TestBase() { expectUnreached() } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt index 993be78e17..d28d912d17 100644 --- a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt +++ b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -43,7 +43,7 @@ private class ChannelViaBroadcast( override suspend fun receive(): E = sub.receive() override suspend fun receiveOrNull(): E? = sub.receiveOrNull() - override suspend fun receiveOrClosed(): ValueOrClosed = sub.receiveOrClosed() + override suspend fun receiveCatching(): ChannelResult = sub.receiveCatching() override fun poll(): E? = sub.poll() override fun iterator(): ChannelIterator = sub.iterator() @@ -57,6 +57,6 @@ private class ChannelViaBroadcast( get() = sub.onReceive override val onReceiveOrNull: SelectClause1 get() = sub.onReceiveOrNull - override val onReceiveOrClosed: SelectClause1> - get() = sub.onReceiveOrClosed + override val onReceiveCatching: SelectClause1> + get() = sub.onReceiveCatching } diff --git a/kotlinx-coroutines-core/common/test/selects/SelectArrayChannelTest.kt b/kotlinx-coroutines-core/common/test/selects/SelectArrayChannelTest.kt index a4f8c3ba2a..0158c84307 100644 --- a/kotlinx-coroutines-core/common/test/selects/SelectArrayChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/selects/SelectArrayChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.selects @@ -295,10 +295,10 @@ class SelectArrayChannelTest : TestBase() { } expect(2) select { - channel.onReceiveOrClosed { + channel.onReceiveCatching { expect(5) assertTrue(it.isClosed) - assertNull(it.closeCause) + assertNull(it.exceptionOrNull()) } } @@ -316,10 +316,10 @@ class SelectArrayChannelTest : TestBase() { } expect(2) select { - channel.onReceiveOrClosed { + channel.onReceiveCatching { expect(5) assertTrue(it.isClosed) - assertTrue(it.closeCause is TestException) + assertTrue(it.exceptionOrNull() is TestException) } } @@ -327,16 +327,16 @@ class SelectArrayChannelTest : TestBase() { } @Test - fun testSelectReceiveOrClosed() = runTest { + fun testSelectReceiveCatching() = runTest { val c = Channel(1) val iterations = 10 expect(1) val job = launch { repeat(iterations) { select { - c.onReceiveOrClosed { v -> + c.onReceiveCatching { v -> expect(4 + it * 2) - assertEquals(it, v.value) + assertEquals(it, v.getOrNull()) } } } @@ -360,9 +360,9 @@ class SelectArrayChannelTest : TestBase() { launch { expect(3) val res = select { - c.onReceiveOrClosed { v -> + c.onReceiveCatching { v -> expect(6) - assertEquals(42, v.value) + assertEquals(42, v.getOrNull()) yield() // back to main expect(8) "OK" @@ -396,9 +396,9 @@ class SelectArrayChannelTest : TestBase() { expect(1) select { expect(2) - channel.onReceiveOrClosed { + channel.onReceiveCatching { assertTrue(it.isClosed) - assertNull(it.closeCause) + assertNull(it.exceptionOrNull()) finish(3) } } @@ -412,9 +412,9 @@ class SelectArrayChannelTest : TestBase() { expect(1) select { expect(2) - channel.onReceiveOrClosed { + channel.onReceiveCatching { assertFalse(it.isClosed) - assertEquals(42, it.value) + assertEquals(42, it.getOrNull()) finish(3) } } diff --git a/kotlinx-coroutines-core/common/test/selects/SelectRendezvousChannelTest.kt b/kotlinx-coroutines-core/common/test/selects/SelectRendezvousChannelTest.kt index 2027630f20..6a1576761a 100644 --- a/kotlinx-coroutines-core/common/test/selects/SelectRendezvousChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/selects/SelectRendezvousChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:Suppress("NAMED_ARGUMENTS_NOT_ALLOWED") // KT-21913 @@ -306,7 +306,7 @@ class SelectRendezvousChannelTest : TestBase() { } @Test - fun testSelectReceiveOrClosedWaitClosed() = runTest { + fun testSelectReceiveCatchingWaitClosed() = runTest { expect(1) val channel = Channel(Channel.RENDEZVOUS) launch { @@ -316,10 +316,10 @@ class SelectRendezvousChannelTest : TestBase() { } expect(2) select { - channel.onReceiveOrClosed { + channel.onReceiveCatching { expect(5) assertTrue(it.isClosed) - assertNull(it.closeCause) + assertNull(it.exceptionOrNull()) } } @@ -327,7 +327,7 @@ class SelectRendezvousChannelTest : TestBase() { } @Test - fun testSelectReceiveOrClosedWaitClosedWithCause() = runTest { + fun testSelectReceiveCatchingWaitClosedWithCause() = runTest { expect(1) val channel = Channel(Channel.RENDEZVOUS) launch { @@ -337,10 +337,10 @@ class SelectRendezvousChannelTest : TestBase() { } expect(2) select { - channel.onReceiveOrClosed { + channel.onReceiveCatching { expect(5) assertTrue(it.isClosed) - assertTrue(it.closeCause is TestException) + assertTrue(it.exceptionOrNull() is TestException) } } @@ -348,31 +348,31 @@ class SelectRendezvousChannelTest : TestBase() { } @Test - fun testSelectReceiveOrClosedForClosedChannel() = runTest { + fun testSelectReceiveCatchingForClosedChannel() = runTest { val channel = Channel() channel.close() expect(1) select { expect(2) - channel.onReceiveOrClosed { + channel.onReceiveCatching { assertTrue(it.isClosed) - assertNull(it.closeCause) + assertNull(it.exceptionOrNull()) finish(3) } } } @Test - fun testSelectReceiveOrClosed() = runTest { + fun testSelectReceiveCatching() = runTest { val channel = Channel(Channel.RENDEZVOUS) val iterations = 10 expect(1) val job = launch { repeat(iterations) { select { - channel.onReceiveOrClosed { v -> + channel.onReceiveCatching { v -> expect(4 + it * 2) - assertEquals(it, v.value) + assertEquals(it, v.getOrThrow()) } } } @@ -390,15 +390,15 @@ class SelectRendezvousChannelTest : TestBase() { } @Test - fun testSelectReceiveOrClosedDispatch() = runTest { + fun testSelectReceiveCatchingDispatch() = runTest { val c = Channel(Channel.RENDEZVOUS) expect(1) launch { expect(3) val res = select { - c.onReceiveOrClosed { v -> + c.onReceiveCatching { v -> expect(6) - assertEquals(42, v.value) + assertEquals(42, v.getOrThrow()) yield() // back to main expect(8) "OK" diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt index 1188329a4c..3f502ba9fb 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -190,7 +190,7 @@ class ChannelUndeliveredElementStressTest(private val kind: TestChannelKind) : T 2 -> select { channel.onReceive { it } } 3 -> channel.receiveOrNull() ?: error("Should not be closed") 4 -> select { channel.onReceiveOrNull { it ?: error("Should not be closed") } } - 5 -> channel.receiveOrClosed().value + 5 -> channel.receiveCatching().getOrThrow() 6 -> { val iterator = channel.iterator() check(iterator.hasNext()) { "Should not be closed" } diff --git a/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt b/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt index 5178907875..6ce2f20d5a 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -112,13 +112,13 @@ class TickerChannelCommonTest(private val channelFactory: Channel) : TestBase() var sum = 0 var n = 0 whileSelect { - this@averageInTimeWindow.onReceiveOrClosed { + this@averageInTimeWindow.onReceiveCatching { if (it.isClosed) { // Send leftovers and bail out if (n != 0) send(sum / n.toDouble()) false } else { - sum += it.value + sum += it.getOrThrow() ++n true } From a67fd8e222628916e678d34915c14c6bab161808 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 22 Mar 2021 21:06:45 +0300 Subject: [PATCH 010/328] Introduce trySend and tryReceive channel operations as a future replacement for error-prone offer, poll and receiveOrNull Fixes #974 --- .../api/kotlinx-coroutines-core.api | 21 ++++- .../common/src/channels/AbstractChannel.kt | 43 +++++++--- .../common/src/channels/Channel.kt | 82 +++++++++++++------ .../src/channels/ConflatedBroadcastChannel.kt | 10 +-- .../common/src/flow/operators/Delay.kt | 2 +- .../test/channels/BasicOperationsTest.kt | 2 +- .../channels/ChannelReceiveCatchingTest.kt | 6 +- .../common/test/channels/TestChannelKind.kt | 4 +- .../jvm/src/channels/Actor.kt | 5 ++ ...annelCancelUndeliveredElementStressTest.kt | 4 +- .../api/kotlinx-coroutines-reactive.api | 1 + .../src/Publish.kt | 8 +- .../src/RxObservable.kt | 6 ++ .../src/RxObservable.kt | 6 +- 14 files changed, 143 insertions(+), 57 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 7d2fa1f447..062e466e04 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -555,6 +555,7 @@ public abstract interface class kotlinx/coroutines/channels/ActorScope : kotlinx public final class kotlinx/coroutines/channels/ActorScope$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/ActorScope;)V + public static fun poll (Lkotlinx/coroutines/channels/ActorScope;)Ljava/lang/Object; } public abstract interface class kotlinx/coroutines/channels/BroadcastChannel : kotlinx/coroutines/channels/SendChannel { @@ -566,6 +567,7 @@ public abstract interface class kotlinx/coroutines/channels/BroadcastChannel : k public final class kotlinx/coroutines/channels/BroadcastChannel$DefaultImpls { public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/BroadcastChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/BroadcastChannel;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V + public static fun offer (Lkotlinx/coroutines/channels/BroadcastChannel;Ljava/lang/Object;)Z } public final class kotlinx/coroutines/channels/BroadcastChannelKt { @@ -598,6 +600,8 @@ public abstract interface class kotlinx/coroutines/channels/Channel : kotlinx/co public final class kotlinx/coroutines/channels/Channel$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/Channel;)V + public static fun offer (Lkotlinx/coroutines/channels/Channel;Ljava/lang/Object;)Z + public static fun poll (Lkotlinx/coroutines/channels/Channel;)Ljava/lang/Object; } public final class kotlinx/coroutines/channels/Channel$Factory { @@ -628,7 +632,7 @@ public final class kotlinx/coroutines/channels/ChannelKt { public final class kotlinx/coroutines/channels/ChannelResult { public static final field Companion Lkotlinx/coroutines/channels/ChannelResult$Companion; public static final synthetic fun box-impl (Ljava/lang/Object;)Lkotlinx/coroutines/channels/ChannelResult; - public static synthetic fun constructor-impl (Ljava/lang/Object;Lkotlin/jvm/internal/DefaultConstructorMarker;)Ljava/lang/Object; + public static fun constructor-impl (Ljava/lang/Object;)Ljava/lang/Object; public fun equals (Ljava/lang/Object;)Z public static fun equals-impl (Ljava/lang/Object;Ljava/lang/Object;)Z public static final fun equals-impl0 (Ljava/lang/Object;Ljava/lang/Object;)Z @@ -645,6 +649,12 @@ public final class kotlinx/coroutines/channels/ChannelResult { public final synthetic fun unbox-impl ()Ljava/lang/Object; } +public final class kotlinx/coroutines/channels/ChannelResult$Companion { + public final fun closed-JP2dKIU (Ljava/lang/Throwable;)Ljava/lang/Object; + public final fun failure-PtdJZtk ()Ljava/lang/Object; + public final fun success-JP2dKIU (Ljava/lang/Object;)Ljava/lang/Object; +} + public final class kotlinx/coroutines/channels/ChannelsKt { public static final fun all (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun any (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -789,6 +799,7 @@ public final class kotlinx/coroutines/channels/ConflatedBroadcastChannel : kotli public fun offer (Ljava/lang/Object;)Z public fun openSubscription ()Lkotlinx/coroutines/channels/ReceiveChannel; public fun send (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun trySend-JP2dKIU (Ljava/lang/Object;)Ljava/lang/Object; } public final class kotlinx/coroutines/channels/ProduceKt { @@ -804,6 +815,10 @@ public abstract interface class kotlinx/coroutines/channels/ProducerScope : kotl public abstract fun getChannel ()Lkotlinx/coroutines/channels/SendChannel; } +public final class kotlinx/coroutines/channels/ProducerScope$DefaultImpls { + public static fun offer (Lkotlinx/coroutines/channels/ProducerScope;Ljava/lang/Object;)Z +} + public abstract interface class kotlinx/coroutines/channels/ReceiveChannel { public abstract synthetic fun cancel ()V public abstract synthetic fun cancel (Ljava/lang/Throwable;)Z @@ -818,12 +833,14 @@ public abstract interface class kotlinx/coroutines/channels/ReceiveChannel { public abstract fun receive (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun receiveCatching-JP2dKIU (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun receiveOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun tryReceive-PtdJZtk ()Ljava/lang/Object; } public final class kotlinx/coroutines/channels/ReceiveChannel$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/ReceiveChannel;)V public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V + public static fun poll (Lkotlinx/coroutines/channels/ReceiveChannel;)Ljava/lang/Object; } public abstract interface class kotlinx/coroutines/channels/SendChannel { @@ -834,10 +851,12 @@ public abstract interface class kotlinx/coroutines/channels/SendChannel { public abstract fun isFull ()Z public abstract fun offer (Ljava/lang/Object;)Z public abstract fun send (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun trySend-JP2dKIU (Ljava/lang/Object;)Ljava/lang/Object; } public final class kotlinx/coroutines/channels/SendChannel$DefaultImpls { public static synthetic fun close$default (Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z + public static fun offer (Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Object;)Z } public final class kotlinx/coroutines/channels/TickerChannelsKt { diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 180598c94f..82143b03a1 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -137,23 +137,42 @@ internal abstract class AbstractSendChannel( return sendSuspend(element) } - public final override fun offer(element: E): Boolean { + override fun offer(element: E): Boolean { + try { + return super.offer(element) + } catch (e: Throwable) { + onUndeliveredElement?.callUndeliveredElementCatchingException(element)?.let { + // If it crashes, add send exception as suppressed for better diagnostics + it.addSuppressed(e) + throw it + } + throw e + } + } + + public final override fun trySend(element: E): ChannelResult { val result = offerInternal(element) return when { - result === OFFER_SUCCESS -> true + result === OFFER_SUCCESS -> ChannelResult.success(Unit) result === OFFER_FAILED -> { - // We should check for closed token on offer as well, otherwise offer won't be linearizable + // We should check for closed token on trySend as well, otherwise trySend won't be linearizable // in the face of concurrent close() // See https://github.com/Kotlin/kotlinx.coroutines/issues/359 - throw recoverStackTrace(helpCloseAndGetSendException(element, closedForSend ?: return false)) + val closedForSend = closedForSend ?: return ChannelResult.failure() + ChannelResult.closed(helpCloseAndGetSendException(closedForSend)) } result is Closed<*> -> { - throw recoverStackTrace(helpCloseAndGetSendException(element, result)) + ChannelResult.closed(helpCloseAndGetSendException(result)) } - else -> error("offerInternal returned $result") + else -> error("trySend returned $result") } } + private fun helpCloseAndGetSendException(closed: Closed<*>): Throwable { + helpClose(closed) + return closed.sendException + } + private fun helpCloseAndGetSendException(element: E, closed: Closed<*>): Throwable { // To ensure linearizablity we must ALWAYS help close the channel when we observe that it was closed // See https://github.com/Kotlin/kotlinx.coroutines/issues/1419 @@ -632,9 +651,11 @@ internal abstract class AbstractChannel( } @Suppress("UNCHECKED_CAST") - public final override fun poll(): E? { + public final override fun tryReceive(): ChannelResult { val result = pollInternal() - return if (result === POLL_FAILED) null else receiveOrNullResult(result) + if (result === POLL_FAILED) return ChannelResult.failure() + if (result is Closed<*>) return ChannelResult.closed(result.closeCause) + return ChannelResult.success(result as E) } @Deprecated(level = DeprecationLevel.HIDDEN, message = "Since 1.2.0, binary compatibility with versions <= 1.1.x") @@ -905,7 +926,7 @@ internal abstract class AbstractChannel( @JvmField val receiveMode: Int ) : Receive() { fun resumeValue(value: E): Any? = when (receiveMode) { - RECEIVE_RESULT -> ChannelResult.value(value) + RECEIVE_RESULT -> ChannelResult.success(value) else -> value } @@ -990,7 +1011,7 @@ internal abstract class AbstractChannel( @Suppress("UNCHECKED_CAST") override fun completeResumeReceive(value: E) { block.startCoroutineCancellable( - if (receiveMode == RECEIVE_RESULT) ChannelResult.value(value) else value, + if (receiveMode == RECEIVE_RESULT) ChannelResult.success(value) else value, select.completion, resumeOnCancellationFun(value) ) @@ -1144,7 +1165,7 @@ internal abstract class Receive : LockFreeLinkedListNode(), ReceiveOrClose @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") private inline fun Any?.toResult(): ChannelResult = - if (this is Closed<*>) ChannelResult.closed(closeCause) else ChannelResult.value(this as E) + if (this is Closed<*>) ChannelResult.closed(closeCause) else ChannelResult.success(this as E) @Suppress("NOTHING_TO_INLINE") private inline fun Closed<*>.toResult(): ChannelResult = ChannelResult.closed(closeCause) diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 824a57bfb1..61d06d83d2 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -85,7 +85,22 @@ public interface SendChannel { * then it calls `onUndeliveredElement` before throwing an exception. * See "Undelivered elements" section in [Channel] documentation for details on handling undelivered elements. */ - public fun offer(element: E): Boolean + public fun offer(element: E): Boolean { + val result = trySend(element) + if (result.isSuccess) return true + throw recoverStackTrace(result.exceptionOrNull() ?: return false) + } + + /** + * Immediately adds the specified [element] to this channel, if this doesn't violate its capacity restrictions, + * and returns the successful result. Otherwise, returns failed or closed result. + * This is synchronous variant of [send], which backs off in situations when `send` suspends or throws. + * + * When `trySend` call returns a non-successful result, it guarantees that the element was not delivered to the consumer, and + * it does not call `onUndeliveredElement` that was installed for this channel. + * See "Undelivered elements" section in [Channel] documentation for details on handling undelivered elements. + */ + public fun trySend(element: E): ChannelResult /** * Closes this channel. @@ -218,7 +233,7 @@ public interface ReceiveChannel { @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @LowPriorityInOverloadResolution @Deprecated( - message = "Deprecated in favor of receiveOrClosed and receiveOrNull extension", + message = "Deprecated in favor of receiveCatching and receiveOrNull extension", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("receiveOrNull", "kotlinx.coroutines.channels.receiveOrNull") ) @@ -230,13 +245,13 @@ public interface ReceiveChannel { * [closed for `receive`][isClosedForReceive] without a cause. The [select] invocation fails with * the original [close][SendChannel.close] cause exception if the channel has _failed_. * - * @suppress **Deprecated**: in favor of onReceiveOrClosed and onReceiveOrNull extension. + * @suppress **Deprecated**: in favor of receiveCatching and onReceiveOrNull extension. */ @ObsoleteCoroutinesApi @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @LowPriorityInOverloadResolution @Deprecated( - message = "Deprecated in favor of onReceiveOrClosed and onReceiveOrNull extension", + message = "Deprecated in favor of receiveCatching and onReceiveOrNull extension", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("onReceiveOrNull", "kotlinx.coroutines.channels.onReceiveOrNull") ) @@ -251,7 +266,7 @@ public interface ReceiveChannel { * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this * function is suspended, this function immediately resumes with a [CancellationException]. * There is a **prompt cancellation guarantee**. If the job was cancelled while this function was - * suspended, it will not resume successfully. The `receiveOrClosed` call can retrieve the element from the channel, + * suspended, it will not resume successfully. The `receiveCatching` call can retrieve the element from the channel, * but then throw [CancellationException], thus failing to deliver the element. * See "Undelivered elements" section in [Channel] documentation for details on handling undelivered elements. * @@ -271,11 +286,22 @@ public interface ReceiveChannel { public val onReceiveCatching: SelectClause1> /** - * Retrieves and removes an element from this channel if its not empty, or returns `null` if the channel is empty + * Retrieves and removes an element from this channel if it's not empty or returns `null` if the channel is empty * or is [is closed for `receive`][isClosedForReceive] without a cause. * It throws the original [close][SendChannel.close] cause exception if the channel has _failed_. */ - public fun poll(): E? + public fun poll(): E? { + val result = tryReceive() + if (result.isSuccess) return result.getOrThrow() + throw recoverStackTrace(result.exceptionOrNull() ?: return null) + } + + /** + * Retrieves and removes an element from this channel if it's not empty, returning a [successful][ChannelResult.success] + * result, returns [failed][ChannelResult.failed] result if the channel is empty, and [closed][ChannelResult.closed] + * result if the channel is closed. + */ + public fun tryReceive(): ChannelResult /** * Returns a new iterator to receive elements from this channel using a `for` loop. @@ -315,35 +341,35 @@ public interface ReceiveChannel { /** * A discriminated union of channel operation result. - * It encapsulates successful or failed result of a channel operation, or a failed operation to a closed channel with + * It encapsulates the successful or failed result of a channel operation or a failed operation to a closed channel with * an optional cause. * - * Successful result represents a successful operation with value of type [T], for example, result of [Channel.receiveCatching] - * operation or a successfully sent element as a result of [Channel.trySend]. + * The successful result represents a successful operation with a value of type [T], for example, + * the result of [Channel.receiveCatching] operation or a successfully sent element as a result of [Channel.trySend]. * - * Failed result represents a failed operation attempt to a channel, but it doesn't necessary indicate that the channel is failed. + * The failed result represents a failed operation attempt to a channel, but it doesn't necessary indicate that the channel is failed. * E.g. when the channel is full, [Channel.trySend] returns failed result, but the channel itself is not in the failed state. * - * Closed result represents an operation attempt to a closed channel and also implies that the operation was failed. + * The closed result represents an operation attempt to a closed channel and also implies that the operation has failed. */ @Suppress("UNCHECKED_CAST") public inline class ChannelResult -internal constructor(private val holder: Any?) { +@PublishedApi internal constructor(private val holder: Any?) { /** * Returns `true` if this instance represents a successful * operation outcome. * - * In this case [isFailure] and [isClosed] return false. + * In this case [isFailure] and [isClosed] return `false`. */ - public val isSuccess: Boolean get() = holder !is Closed + public val isSuccess: Boolean get() = holder !is Failed /** - * Returns true if this instance represents unsuccessful operation. + * Returns `true` if this instance represents unsuccessful operation. * * In this case [isSuccess] returns false, but it does not imply * that the channel is failed or closed. * - * Example of failed operation without an exception and channel being closed + * Example of a failed operation without an exception and channel being closed * is [Channel.trySend] attempt to a channel that is full. */ public val isFailure: Boolean get() = holder is Failed @@ -352,7 +378,7 @@ internal constructor(private val holder: Any?) { * Returns `true` if this instance represents unsuccessful operation * to a closed or cancelled channel. * - * In this case [isSuccess] returns false, [isFailure] returns `true`, but it does not imply + * In this case [isSuccess] returns `false`, [isFailure] returns `true`, but it does not imply * that [exceptionOrNull] returns non-null value. * * It can happen if the channel was [closed][Channel.close] normally without an exception. @@ -374,7 +400,7 @@ internal constructor(private val holder: Any?) { } /** - * Returns the encapsulated exception if this instance represents failure or null if it is success + * Returns the encapsulated exception if this instance represents failure or `null` if it is success * or unsuccessful operation to closed channel. */ public fun exceptionOrNull(): Throwable? = (holder as? Closed)?.cause @@ -389,13 +415,21 @@ internal constructor(private val holder: Any?) { override fun toString(): String = "Closed($cause)" } - internal companion object { - @Suppress("NOTHING_TO_INLINE") - internal inline fun value(value: E): ChannelResult = + @Suppress("NOTHING_TO_INLINE") + @InternalCoroutinesApi + public companion object { + private val failed = Failed() + + @InternalCoroutinesApi + public fun success(value: E): ChannelResult = ChannelResult(value) - @Suppress("NOTHING_TO_INLINE") - internal inline fun closed(cause: Throwable?): ChannelResult = + @InternalCoroutinesApi + public fun failure(): ChannelResult = + ChannelResult(failed) + + @InternalCoroutinesApi + public fun closed(cause: Throwable?): ChannelResult = ChannelResult(Closed(cause)) } diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt index f1d092e34b..75524f214f 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt @@ -229,12 +229,12 @@ public class ConflatedBroadcastChannel() : BroadcastChannel { /** * Sends the value to all subscribed receives and stores this value as the most recent state for - * future subscribers. This implementation always returns `true`. - * It throws exception if the channel [isClosedForSend] (see [close] for details). + * future subscribers. This implementation always returns either successful result + * or closed with an exception. */ - public override fun offer(element: E): Boolean { - offerInternal(element)?.let { throw it.sendException } - return true + public override fun trySend(element: E): ChannelResult { + offerInternal(element)?.let { return ChannelResult.closed(it.sendException) } + return ChannelResult.success(Unit) } @Suppress("UNCHECKED_CAST") diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index 6381c467a4..0f6ee3aca8 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -237,7 +237,7 @@ private fun Flow.debounceInternal(timeoutMillisSelector: (T) -> Long) : F lastValue = null // Consume the value } } - // Should be receiveOrClosed when boxing issues are fixed + // Should be receiveCatching when boxing issues are fixed values.onReceiveOrNull { value -> if (value == null) { if (lastValue != null) downstream.emit(NULL.unbox(lastValue)) diff --git a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt index e178f124a7..f1658cfa84 100644 --- a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt @@ -142,7 +142,7 @@ class BasicOperationsTest : TestBase() { val result = channel.receiveCatching() assertEquals(1, result.getOrThrow()) assertEquals(1, result.getOrNull()) - assertTrue(ChannelResult.value(1) == result) + assertTrue(ChannelResult.success(1) == result) expect(3) launch { diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt index 4344b1055d..2341c62ebe 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelReceiveCatchingTest.kt @@ -45,7 +45,7 @@ class ChannelReceiveCatchingTest : TestBase() { assertEquals(1, element.getOrThrow()) assertEquals(1, element.getOrNull()) assertEquals("Value(1)", element.toString()) - assertTrue(ChannelResult.value(1) == element) // Don't box + assertTrue(ChannelResult.success(1) == element) // Don't box assertFalse(element.isFailure) assertFalse(element.isClosed) @@ -54,7 +54,7 @@ class ChannelReceiveCatchingTest : TestBase() { assertNull(nullElement.getOrThrow()) assertNull(nullElement.getOrNull()) assertEquals("Value(null)", nullElement.toString()) - assertTrue(ChannelResult.value(null) == nullElement) // Don't box + assertTrue(ChannelResult.success(null) == nullElement) // Don't box assertFalse(element.isFailure) assertFalse(element.isClosed) @@ -113,7 +113,7 @@ class ChannelReceiveCatchingTest : TestBase() { fun testReceiveResultChannel() = runTest { val channel = Channel>() launch { - channel.send(ChannelResult.value(1u)) + channel.send(ChannelResult.success(1u)) channel.send(ChannelResult.closed(TestException1())) channel.close(TestException2()) } diff --git a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt index d28d912d17..3e70007a6e 100644 --- a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt +++ b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt @@ -44,9 +44,9 @@ private class ChannelViaBroadcast( override suspend fun receive(): E = sub.receive() override suspend fun receiveOrNull(): E? = sub.receiveOrNull() override suspend fun receiveCatching(): ChannelResult = sub.receiveCatching() - override fun poll(): E? = sub.poll() override fun iterator(): ChannelIterator = sub.iterator() - + override fun tryReceive(): ChannelResult = sub.tryReceive() + override fun cancel(cause: CancellationException?) = sub.cancel(cause) // implementing hidden method anyway, so can cast to an internal class diff --git a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt index 3a208c0f70..5153cb47f1 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt @@ -168,6 +168,11 @@ private class LazyActorCoroutine( return super.offer(element) } + override fun trySend(element: E): ChannelResult { + start() + return super.trySend(element) + } + override fun close(cause: Throwable?): Boolean { // close the channel _first_ val closed = super.close(cause) diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt index 76713aa173..9f7ce497fa 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -99,4 +99,4 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { dReceivedCnt++ lastReceived = received } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api index 961fdbe238..6798625179 100644 --- a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api +++ b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api @@ -63,6 +63,7 @@ public final class kotlinx/coroutines/reactive/PublisherCoroutine : kotlinx/coro public fun registerSelectClause2 (Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V public fun request (J)V public fun send (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun trySend-JP2dKIU (Ljava/lang/Object;)Ljava/lang/Object; } public final class kotlinx/coroutines/reactive/ReactiveFlowKt { diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 156205624e..6bb02ef192 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import org.reactivestreams.* import kotlin.coroutines.* -import kotlin.internal.LowPriorityInOverloadResolution +import kotlin.internal.* /** * Creates cold reactive [Publisher] that runs a given [block] in a coroutine. @@ -96,10 +96,10 @@ public class PublisherCoroutine( override fun invokeOnClose(handler: (Throwable?) -> Unit): Nothing = throw UnsupportedOperationException("PublisherCoroutine doesn't support invokeOnClose") - override fun offer(element: T): Boolean { - if (!mutex.tryLock()) return false + override fun trySend(element: T): ChannelResult { + if (!mutex.tryLock()) return ChannelResult.failure() doLockedNext(element) - return true + return ChannelResult.success(Unit) } public override suspend fun send(element: T) { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 4f4706d8ad..7813bc7548 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -91,6 +91,12 @@ private class RxObservableCoroutine( return true } + override fun trySend(element: T): ChannelResult { + if (!mutex.tryLock()) return ChannelResult.failure() + doLockedNext(element) + return ChannelResult.success(Unit) + } + public override suspend fun send(element: T) { // fast-path -- try send without suspension if (offer(element)) return diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index bd9239e7db..fed89c328e 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -71,10 +71,10 @@ private class RxObservableCoroutine( override fun invokeOnClose(handler: (Throwable?) -> Unit) = throw UnsupportedOperationException("RxObservableCoroutine doesn't support invokeOnClose") - override fun offer(element: T): Boolean { - if (!mutex.tryLock()) return false + override fun trySend(element: T): ChannelResult { + if (!mutex.tryLock()) return ChannelResult.failure() doLockedNext(element) - return true + return ChannelResult.success(Unit) } public override suspend fun send(element: T) { From 2021b5aee1ad93f48bd6e54915ad4e09f11300c7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 25 Mar 2021 16:43:25 +0300 Subject: [PATCH 011/328] Update contribution guide (#2608) --- CONTRIBUTING.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7737062fa3..4628eade47 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -52,6 +52,10 @@ so do familiarize yourself with the following guidelines. * Follow the style of writing tests that is used in this project: name test functions as `testXxx`. Don't use backticks in test names. * If you introduce any new public APIs: + * Comment on the existing issue if you want to work on it or create one beforehand. + Ensure that the issue not only describes a problem, but also describes a solution that had received a positive feedback. Propose a solution if there isn't any. + PRs with new API, but without a corresponding issue with a positive feedback about the proposed implementation are unlikely to + be approved or reviewed. * All new APIs must come with documentation and tests. * All new APIs are initially released with `@ExperimentalCoroutineApi` annotation and are graduated later. * [Update the public API dumps](#updating-the-public-api-dump) and commit the resulting changes as well. @@ -59,8 +63,6 @@ so do familiarize yourself with the following guidelines. * If you plan large API additions, then please start by submitting an issue with the proposed API design to gather community feedback. * [Contact the maintainers](#contacting-maintainers) to coordinate any big piece of work in advance. -* Comment on the existing issue if you want to work on it. Ensure that the issue not only describes a problem, - but also describes a solution that had received a positive feedback. Propose a solution if there isn't any. * Steps for contributing new integration modules are explained [here](integration/README.md#Contributing). ## Building From ea039ea004ae6f533889fdef9af23151d76e916e Mon Sep 17 00:00:00 2001 From: koshachy Date: Tue, 6 Apr 2021 12:06:40 +0300 Subject: [PATCH 012/328] update: delete -Xcoroutines flag since it will be removed in Kotlin 1.5.0 (#2620) --- docs/topics/coroutines-basic-jvm.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/topics/coroutines-basic-jvm.md b/docs/topics/coroutines-basic-jvm.md index 3b067ea86b..a6ca3ba5f3 100644 --- a/docs/topics/coroutines-basic-jvm.md +++ b/docs/topics/coroutines-basic-jvm.md @@ -56,11 +56,6 @@ Make sure it's configured for Kotlin 1.3 or higher. org.jetbrains.kotlin kotlin-maven-plugin ... - - - -Xcoroutines=enable - - ``` From 7ae273c6860b81914108ea890064f29f1802139f Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 6 Apr 2021 13:23:06 +0300 Subject: [PATCH 013/328] Fix wrong docs on Job.join (#2616) * Fix wrong docs on Job.join and Job.cancelAndJoin Fixes #2615 --- kotlinx-coroutines-core/common/src/Job.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index 1a98135a24..be58213288 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -252,9 +252,9 @@ public interface Job : CoroutineContext.Element { * suspending function is invoked or while it is suspended, this function * throws [CancellationException]. * - * In particular, it means that a parent coroutine invoking `join` on a child coroutine that was started using - * `launch(coroutineContext) { ... }` builder throws [CancellationException] if the child - * had crashed, unless a non-standard [CoroutineExceptionHandler] is installed in the context. + * In particular, it means that a parent coroutine invoking `join` on a child coroutine throws + * [CancellationException] if the child had failed, since a failure of a child coroutine cancels parent by default, + * unless the child was launched from within [supervisorScope]. * * This function can be used in [select] invocation with [onJoin] clause. * Use [isCompleted] to check for a completion of this job without waiting. @@ -498,9 +498,9 @@ internal fun Job.disposeOnCompletion(handle: DisposableHandle): DisposableHandle * suspending function is invoked or while it is suspended, this function * throws [CancellationException]. * - * In particular, it means that a parent coroutine invoking `cancelAndJoin` on a child coroutine that was started using - * `launch(coroutineContext) { ... }` builder throws [CancellationException] if the child - * had crashed, unless a non-standard [CoroutineExceptionHandler] is installed in the context. + * In particular, it means that a parent coroutine invoking `cancelAndJoin` on a child coroutine throws + * [CancellationException] if the child had failed, since a failure of a child coroutine cancels parent by default, + * unless the child was launched from within [supervisorScope]. * * This is a shortcut for the invocation of [cancel][Job.cancel] followed by [join][Job.join]. */ From 98532c9f1e81feac232357c94a24db795d6576e5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 6 Apr 2021 17:25:50 +0300 Subject: [PATCH 014/328] Deprecation and migration of receiveOrNull and onReceiveOrNull. (#2612) * Deprecation and migration of receiveOrNull and onReceiveOrNull. * Raise deprecation level for members, introduce deprecation for extensions * Explain rationale behind deprecation * Provide default implementation for deprecated members in Channel interface * Get rid of the internal implementation, leverage receiveCatching * Introduce new extensions for ChannelResult and use them as a replacement in our own operators Fixes #1676 --- docs/topics/select-expression.md | 69 ++++++----- .../test/time/FlowSampleTest.kt | 5 +- kotlinx-coroutines-core/README.md | 14 +-- .../api/kotlinx-coroutines-core.api | 9 ++ kotlinx-coroutines-core/common/README.md | 6 +- .../common/src/channels/AbstractChannel.kt | 43 +------ .../common/src/channels/Channel.kt | 112 ++++++++++++------ .../common/src/channels/Channels.common.kt | 42 +++---- .../common/src/flow/internal/Combine.kt | 6 +- .../common/src/flow/operators/Delay.kt | 38 +++--- .../common/src/selects/Select.kt | 20 ++-- .../channels/ArrayBroadcastChannelTest.kt | 16 +-- .../common/test/channels/ArrayChannelTest.kt | 14 +-- .../test/channels/BasicOperationsTest.kt | 37 +----- .../ChannelUndeliveredElementFailureTest.kt | 28 +---- .../channels/ConflatedBroadcastChannelTest.kt | 4 +- .../test/channels/ConflatedChannelTest.kt | 10 +- .../test/channels/LinkedListChannelTest.kt | 10 +- .../common/test/channels/ProduceTest.kt | 6 +- .../test/channels/RendezvousChannelTest.kt | 16 +-- .../common/test/channels/TestChannelKind.kt | 3 - .../common/test/selects/SelectLoopTest.kt | 6 +- .../testReceiveOrNullFromClosedChannel.txt | 8 -- .../jvm/test/channels/ActorTest.kt | 14 +-- .../BroadcastChannelMultiReceiveStressTest.kt | 16 +-- ...annelCancelUndeliveredElementStressTest.kt | 2 +- .../channels/ChannelSendReceiveStressTest.kt | 16 +-- .../ChannelUndeliveredElementStressTest.kt | 4 +- .../ConflatedChannelCloseStressTest.kt | 8 +- .../StackTraceRecoveryChannelsTest.kt | 13 +- .../jvm/test/guide/example-select-02.kt | 20 ++-- .../jvm/test/guide/example-select-05.kt | 8 +- .../src/ReactiveFlow.kt | 10 +- .../test/CancelledParentAttachTest.kt | 3 +- .../test/PublisherAsFlowTest.kt | 12 +- .../test/PublisherSubscriptionSelectTest.kt | 21 ++-- .../test/ObservableSubscriptionSelectTest.kt | 22 ++-- .../test/ObservableSubscriptionSelectTest.kt | 20 ++-- 38 files changed, 339 insertions(+), 372 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveOrNullFromClosedChannel.txt diff --git a/docs/topics/select-expression.md b/docs/topics/select-expression.md index 082a50d65b..3d20ff39d4 100644 --- a/docs/topics/select-expression.md +++ b/docs/topics/select-expression.md @@ -120,31 +120,32 @@ buzz -> 'Buzz!' ## Selecting on close The [onReceive][ReceiveChannel.onReceive] clause in `select` fails when the channel is closed causing the corresponding -`select` to throw an exception. We can use [onReceiveOrNull][onReceiveOrNull] clause to perform a +`select` to throw an exception. We can use [onReceiveCatching][ReceiveChannel.onReceiveCatching] clause to perform a specific action when the channel is closed. The following example also shows that `select` is an expression that returns the result of its selected clause: ```kotlin suspend fun selectAorB(a: ReceiveChannel, b: ReceiveChannel): String = select { - a.onReceiveOrNull { value -> - if (value == null) - "Channel 'a' is closed" - else + a.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "a -> '$value'" + } else { + "Channel 'a' is closed" + } } - b.onReceiveOrNull { value -> - if (value == null) - "Channel 'b' is closed" - else + b.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "b -> '$value'" + } else { + "Channel 'b' is closed" + } } } ``` -Note that [onReceiveOrNull][onReceiveOrNull] is an extension function defined only -for channels with non-nullable elements so that there is no accidental confusion between a closed channel -and a null value. Let's use it with channel `a` that produces "Hello" string four times and channel `b` that produces "World" four times: @@ -158,17 +159,21 @@ import kotlinx.coroutines.selects.* suspend fun selectAorB(a: ReceiveChannel, b: ReceiveChannel): String = select { - a.onReceiveOrNull { value -> - if (value == null) - "Channel 'a' is closed" - else + a.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "a -> '$value'" + } else { + "Channel 'a' is closed" + } } - b.onReceiveOrNull { value -> - if (value == null) - "Channel 'b' is closed" - else + b.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "b -> '$value'" + } else { + "Channel 'b' is closed" + } } } @@ -215,7 +220,7 @@ the first one among them gets selected. Here, both channels are constantly produ being the first clause in select, wins. However, because we are using unbuffered channel, the `a` gets suspended from time to time on its [send][SendChannel.send] invocation and gives a chance for `b` to send, too. -The second observation, is that [onReceiveOrNull][onReceiveOrNull] gets immediately selected when the +The second observation, is that [onReceiveCatching][ReceiveChannel.onReceiveCatching] gets immediately selected when the channel is already closed. ## Selecting to send @@ -375,19 +380,19 @@ Deferred 4 produced answer 'Waited for 128 ms' Let us write a channel producer function that consumes a channel of deferred string values, waits for each received deferred value, but only until the next deferred value comes over or the channel is closed. This example puts together -[onReceiveOrNull][onReceiveOrNull] and [onAwait][Deferred.onAwait] clauses in the same `select`: +[onReceiveCatching][ReceiveChannel.onReceiveCatching] and [onAwait][Deferred.onAwait] clauses in the same `select`: ```kotlin fun CoroutineScope.switchMapDeferreds(input: ReceiveChannel>) = produce { var current = input.receive() // start with first received deferred value while (isActive) { // loop while not cancelled/closed val next = select?> { // return next deferred value from this select or null - input.onReceiveOrNull { update -> - update // replaces next value to wait + input.onReceiveCatching { update -> + update.getOrNull() } - current.onAwait { value -> + current.onAwait { value -> send(value) // send value that current deferred has produced - input.receiveOrNull() // and use the next deferred from the input channel + input.receiveCatching().getOrNull() // and use the next deferred from the input channel } } if (next == null) { @@ -423,12 +428,12 @@ fun CoroutineScope.switchMapDeferreds(input: ReceiveChannel>) = var current = input.receive() // start with first received deferred value while (isActive) { // loop while not cancelled/closed val next = select?> { // return next deferred value from this select or null - input.onReceiveOrNull { update -> - update // replaces next value to wait + input.onReceiveCatching { update -> + update.getOrNull() } - current.onAwait { value -> + current.onAwait { value -> send(value) // send value that current deferred has produced - input.receiveOrNull() // and use the next deferred from the input channel + input.receiveCatching().getOrNull() // and use the next deferred from the input channel } } if (next == null) { @@ -491,7 +496,7 @@ Channel was closed [ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html [ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[onReceiveOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/on-receive-or-null.html +[ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html [SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html [SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html @@ -499,4 +504,4 @@ Channel was closed [select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html - \ No newline at end of file + diff --git a/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt b/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt index 11ceb1a831..d35ee72de0 100644 --- a/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt +++ b/integration/kotlinx-coroutines-jdk8/test/time/FlowSampleTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.time @@ -12,8 +12,7 @@ import org.junit.Test import java.time.Duration import kotlin.test.assertEquals - -class SampleTest : TestBase() { +class FlowSampleTest : TestBase() { @Test public fun testBasic() = withVirtualTime { expect(1) diff --git a/kotlinx-coroutines-core/README.md b/kotlinx-coroutines-core/README.md index bc5587623a..9fdf418233 100644 --- a/kotlinx-coroutines-core/README.md +++ b/kotlinx-coroutines-core/README.md @@ -54,9 +54,9 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio | ---------------- | --------------------------------------------- | ------------------------------------------------ | -------------------------- | [Job] | [join][Job.join] | [onJoin][Job.onJoin] | [isCompleted][Job.isCompleted] | [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] | [isCompleted][Job.isCompleted] -| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [offer][kotlinx.coroutines.channels.SendChannel.offer] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveOrNull][kotlinx.coroutines.channels.receiveOrNull] | [onReceiveOrNull][kotlinx.coroutines.channels.onReceiveOrNull] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] +| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] | [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] | none | [delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none @@ -133,11 +133,11 @@ Obsolete and deprecated module to test coroutines. Replaced with `kotlinx-corout [kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html [kotlinx.coroutines.channels.SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html [kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html -[kotlinx.coroutines.channels.SendChannel.offer]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/offer.html +[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html [kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.poll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/poll.html -[kotlinx.coroutines.channels.receiveOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/receive-or-null.html -[kotlinx.coroutines.channels.onReceiveOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/on-receive-or-null.html +[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html +[kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html +[kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 062e466e04..2f2b8d54ab 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -555,7 +555,9 @@ public abstract interface class kotlinx/coroutines/channels/ActorScope : kotlinx public final class kotlinx/coroutines/channels/ActorScope$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/ActorScope;)V + public static fun getOnReceiveOrNull (Lkotlinx/coroutines/channels/ActorScope;)Lkotlinx/coroutines/selects/SelectClause1; public static fun poll (Lkotlinx/coroutines/channels/ActorScope;)Ljava/lang/Object; + public static fun receiveOrNull (Lkotlinx/coroutines/channels/ActorScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public abstract interface class kotlinx/coroutines/channels/BroadcastChannel : kotlinx/coroutines/channels/SendChannel { @@ -600,8 +602,10 @@ public abstract interface class kotlinx/coroutines/channels/Channel : kotlinx/co public final class kotlinx/coroutines/channels/Channel$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/Channel;)V + public static fun getOnReceiveOrNull (Lkotlinx/coroutines/channels/Channel;)Lkotlinx/coroutines/selects/SelectClause1; public static fun offer (Lkotlinx/coroutines/channels/Channel;Ljava/lang/Object;)Z public static fun poll (Lkotlinx/coroutines/channels/Channel;)Ljava/lang/Object; + public static fun receiveOrNull (Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class kotlinx/coroutines/channels/Channel$Factory { @@ -627,6 +631,9 @@ public final class kotlinx/coroutines/channels/ChannelKt { public static final fun Channel (ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/channels/Channel; public static synthetic fun Channel$default (IILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; public static synthetic fun Channel$default (ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; + public static final fun getOrElse-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun onFailure-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun onSuccess-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; } public final class kotlinx/coroutines/channels/ChannelResult { @@ -840,7 +847,9 @@ public final class kotlinx/coroutines/channels/ReceiveChannel$DefaultImpls { public static synthetic fun cancel (Lkotlinx/coroutines/channels/ReceiveChannel;)V public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z public static synthetic fun cancel$default (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V + public static fun getOnReceiveOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/selects/SelectClause1; public static fun poll (Lkotlinx/coroutines/channels/ReceiveChannel;)Ljava/lang/Object; + public static fun receiveOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public abstract interface class kotlinx/coroutines/channels/SendChannel { diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index 6712648ae8..e8503d0d16 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -59,7 +59,7 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio | [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] | [isCompleted][Job.isCompleted] | [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [offer][kotlinx.coroutines.channels.SendChannel.offer] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveOrNull][kotlinx.coroutines.channels.receiveOrNull] | [onReceiveOrNull][kotlinx.coroutines.channels.onReceiveOrNull] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] | [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] | none | [delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none @@ -149,8 +149,8 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.channels.SendChannel.offer]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/offer.html [kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html [kotlinx.coroutines.channels.ReceiveChannel.poll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/poll.html -[kotlinx.coroutines.channels.receiveOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/receive-or-null.html -[kotlinx.coroutines.channels.onReceiveOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/on-receive-or-null.html +[kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html +[kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 82143b03a1..04a9d1a64a 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -623,24 +623,6 @@ internal abstract class AbstractChannel( if (result) onReceiveEnqueued() } - public final override suspend fun receiveOrNull(): E? { - // fast path -- try poll non-blocking - val result = pollInternal() - @Suppress("UNCHECKED_CAST") - if (result !== POLL_FAILED && result !is Closed<*>) return result as E - // slow-path does suspend - return receiveSuspend(RECEIVE_NULL_ON_CLOSE) - } - - @Suppress("UNCHECKED_CAST") - private fun receiveOrNullResult(result: Any?): E? { - if (result is Closed<*>) { - if (result.closeCause != null) throw recoverStackTrace(result.closeCause) - return null - } - return result as E - } - @Suppress("UNCHECKED_CAST") public final override suspend fun receiveCatching(): ChannelResult { // fast path -- try poll non-blocking @@ -755,14 +737,6 @@ internal abstract class AbstractChannel( } } - final override val onReceiveOrNull: SelectClause1 - get() = object : SelectClause1 { - @Suppress("UNCHECKED_CAST") - override fun registerSelectClause1(select: SelectInstance, block: suspend (E?) -> R) { - registerSelectReceiveMode(select, RECEIVE_NULL_ON_CLOSE, block as suspend (Any?) -> R) - } - } - final override val onReceiveCatching: SelectClause1> get() = object : SelectClause1> { @Suppress("UNCHECKED_CAST") @@ -799,14 +773,6 @@ internal abstract class AbstractChannel( if (!select.trySelect()) return startCoroutineUnintercepted(ChannelResult.closed(value.closeCause), select.completion) } - RECEIVE_NULL_ON_CLOSE -> { - if (value.closeCause == null) { - if (!select.trySelect()) return - startCoroutineUnintercepted(null, select.completion) - } else { - throw recoverStackTrace(value.receiveException) - } - } } } else -> { @@ -942,7 +908,6 @@ internal abstract class AbstractChannel( override fun resumeReceiveClosed(closed: Closed<*>) { when { - receiveMode == RECEIVE_NULL_ON_CLOSE && closed.closeCause == null -> cont.resume(null) receiveMode == RECEIVE_RESULT -> cont.resume(closed.toResult()) else -> cont.resumeWithException(closed.receiveException) } @@ -1022,11 +987,6 @@ internal abstract class AbstractChannel( when (receiveMode) { RECEIVE_THROWS_ON_CLOSE -> select.resumeSelectWithException(closed.receiveException) RECEIVE_RESULT -> block.startCoroutineCancellable(ChannelResult.closed(closed.closeCause), select.completion) - RECEIVE_NULL_ON_CLOSE -> if (closed.closeCause == null) { - block.startCoroutineCancellable(null, select.completion) - } else { - select.resumeSelectWithException(closed.receiveException) - } } } @@ -1044,8 +1004,7 @@ internal abstract class AbstractChannel( // receiveMode values internal const val RECEIVE_THROWS_ON_CLOSE = 0 -internal const val RECEIVE_NULL_ON_CLOSE = 1 -internal const val RECEIVE_RESULT = 2 +internal const val RECEIVE_RESULT = 1 @JvmField @SharedImmutable diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 61d06d83d2..8aad264d2c 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -14,6 +14,7 @@ import kotlinx.coroutines.channels.Channel.Factory.RENDEZVOUS import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED import kotlinx.coroutines.internal.* import kotlinx.coroutines.selects.* +import kotlin.contracts.* import kotlin.internal.* import kotlin.jvm.* @@ -210,52 +211,49 @@ public interface ReceiveChannel { public val onReceive: SelectClause1 /** - * Retrieves and removes an element from this channel if it's not empty, or suspends the caller while the channel is empty, - * or returns `null` if the channel is [closed for `receive`][isClosedForReceive] without cause, - * or throws the original [close][SendChannel.close] cause exception if the channel has _failed_. - * - * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this - * function is suspended, this function immediately resumes with a [CancellationException]. - * There is a **prompt cancellation guarantee**. If the job was cancelled while this function was - * suspended, it will not resume successfully. The `receiveOrNull` call can retrieve the element from the channel, - * but then throw [CancellationException], thus failing to deliver the element. - * See "Undelivered elements" section in [Channel] documentation for details on handling undelivered elements. - * - * Note that this function does not check for cancellation when it is not suspended. - * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. + * This function was deprecated since 1.3.0 and is no longer recommended to use + * or to implement in subclasses. * - * This function can be used in [select] invocations with the [onReceiveOrNull] clause. - * Use [poll] to try receiving from this channel without waiting. + * It had the following pitfalls: + * - Didn't allow to distinguish 'null' as "closed channel" from "null as a value" + * - Was throwing if the channel has failed even though its signature may suggest it returns 'null' + * - It didn't really belong to core channel API and can be exposed as an extension instead. * - * @suppress **Deprecated**: in favor of receiveOrClosed and receiveOrNull extension. + * @suppress doc */ - @ObsoleteCoroutinesApi @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @LowPriorityInOverloadResolution @Deprecated( - message = "Deprecated in favor of receiveCatching and receiveOrNull extension", - level = DeprecationLevel.WARNING, - replaceWith = ReplaceWith("receiveOrNull", "kotlinx.coroutines.channels.receiveOrNull") - ) - public suspend fun receiveOrNull(): E? + message = "Deprecated in favor of receiveCatching", + level = DeprecationLevel.ERROR, + replaceWith = ReplaceWith("receiveCatching().getOrNull()") + ) // Warning since 1.3.0, error in 1.5.0, will be hidden in 1.6.0 + public suspend fun receiveOrNull(): E? = receiveCatching().getOrNull() /** - * Clause for the [select] expression of the [receiveOrNull] suspending function that selects with the element - * received from the channel or `null` if the channel is - * [closed for `receive`][isClosedForReceive] without a cause. The [select] invocation fails with - * the original [close][SendChannel.close] cause exception if the channel has _failed_. + * This function was deprecated since 1.3.0 and is no longer recommended to use + * or to implement in subclasses. + * See [receiveOrNull] documentation. * - * @suppress **Deprecated**: in favor of receiveCatching and onReceiveOrNull extension. + * @suppress **Deprecated**: in favor of onReceiveCatching extension. */ - @ObsoleteCoroutinesApi - @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - @LowPriorityInOverloadResolution @Deprecated( - message = "Deprecated in favor of receiveCatching and onReceiveOrNull extension", - level = DeprecationLevel.WARNING, - replaceWith = ReplaceWith("onReceiveOrNull", "kotlinx.coroutines.channels.onReceiveOrNull") - ) + message = "Deprecated in favor of onReceiveCatching extension", + level = DeprecationLevel.ERROR, + replaceWith = ReplaceWith("onReceiveCatching") + ) // Warning since 1.3.0, error in 1.5.0, will be hidden or removed in 1.6.0 public val onReceiveOrNull: SelectClause1 + get() { + return object : SelectClause1 { + @InternalCoroutinesApi + override fun registerSelectClause1(select: SelectInstance, block: suspend (E?) -> R) { + onReceiveCatching.registerSelectClause1(select) { + it.exceptionOrNull()?.let { throw it } + block(it.getOrNull()) + } + } + } + } /** * Retrieves and removes an element from this channel if it's not empty, or suspends the caller while this channel is empty. @@ -354,7 +352,7 @@ public interface ReceiveChannel { */ @Suppress("UNCHECKED_CAST") public inline class ChannelResult -@PublishedApi internal constructor(private val holder: Any?) { +@PublishedApi internal constructor(@PublishedApi internal val holder: Any?) { /** * Returns `true` if this instance represents a successful * operation outcome. @@ -440,6 +438,50 @@ public inline class ChannelResult } } +/** + * Returns the encapsulated value if this instance represents [success][ChannelResult.isSuccess] or the + * result of [onFailure] function for the encapsulated [Throwable] exception if it is failed or closed + * result. + */ +@OptIn(ExperimentalContracts::class) +public inline fun ChannelResult.getOrElse(onFailure: (exception: Throwable?) -> T): T { + contract { + callsInPlace(onFailure, InvocationKind.AT_MOST_ONCE) + } + @Suppress("UNCHECKED_CAST") + return if (holder is ChannelResult.Failed) onFailure(exceptionOrNull()) else holder as T +} + +/** + * Performs the given [action] on the encapsulated value if this instance represents [success][ChannelResult.isSuccess]. + * Returns the original `ChannelResult` unchanged. + */ +@OptIn(ExperimentalContracts::class) +public inline fun ChannelResult.onSuccess(action: (value: T) -> Unit): ChannelResult { + contract { + callsInPlace(action, InvocationKind.AT_MOST_ONCE) + } + @Suppress("UNCHECKED_CAST") + if (holder !is ChannelResult.Failed) action(holder as T) + return this +} + +/** + * Performs the given [action] on the encapsulated [Throwable] exception if this instance represents [failure][ChannelResult.isFailure]. + * The result of [ChannelResult.exceptionOrNull] is passed to the [action] parameter. + * + * Returns the original `ChannelResult` unchanged. + */ +@OptIn(ExperimentalContracts::class) +public inline fun ChannelResult.onFailure(action: (exception: Throwable?) -> Unit): ChannelResult { + contract { + callsInPlace(action, InvocationKind.AT_MOST_ONCE) + } + @Suppress("UNCHECKED_CAST") + if (holder is ChannelResult.Failed) action(exceptionOrNull()) + return this +} + /** * Iterator for [ReceiveChannel]. Instances of this interface are *not thread-safe* and shall not be used * from concurrent coroutines. diff --git a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt index e3567e3107..6bf6f88123 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt @@ -37,40 +37,34 @@ public inline fun BroadcastChannel.consume(block: ReceiveChannel.() } /** - * Retrieves and removes the element from this channel suspending the caller while this channel [isEmpty] - * or returns `null` if the channel is [closed][Channel.isClosedForReceive]. + * This function is deprecated in the favour of [ReceiveChannel.receiveCatching]. * - * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this - * function is suspended, this function immediately resumes with [CancellationException]. - * There is a **prompt cancellation guarantee**. If the job was cancelled while this function was - * suspended, it will not resume successfully. If the `receiveOrNull` call threw [CancellationException] there is no way - * to tell if some element was already received from the channel or not. See [Channel] documentation for details. + * This function is considered error-prone for the following reasons; + * * Is throwing if the channel has failed even though its signature may suggest it returns 'null' + * * It is easy to forget that exception handling still have to be explicit + * * During code reviews and code reading, intentions of the code are frequently unclear: + * are potential exceptions ignored deliberately or not? * - * Note, that this function does not check for cancellation when it is not suspended. - * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. - * - * This extension is defined only for channels on non-null types, so that generic functions defined using - * these extensions do not accidentally confuse `null` value and a normally closed channel, leading to hard - * to find bugs. + * @suppress doc */ +@Deprecated( + "Deprecated in the favour of 'receiveCatching'", + ReplaceWith("receiveCatching().getOrNull()"), + DeprecationLevel.WARNING +) // Warning since 1.5.0, ERROR in 1.6.0, HIDDEN in 1.7.0 @Suppress("EXTENSION_SHADOWED_BY_MEMBER") -@ExperimentalCoroutinesApi // since 1.3.0, tentatively stable in 1.4.x public suspend fun ReceiveChannel.receiveOrNull(): E? { @Suppress("DEPRECATION", "UNCHECKED_CAST") return (this as ReceiveChannel).receiveOrNull() } /** - * Clause for [select] expression of [receiveOrNull] suspending function that selects with the element that - * is received from the channel or selects with `null` if the channel - * [isClosedForReceive][ReceiveChannel.isClosedForReceive] without cause. The [select] invocation fails with - * the original [close][SendChannel.close] cause exception if the channel has _failed_. - * - * This extension is defined only for channels on non-null types, so that generic functions defined using - * these extensions do not accidentally confuse `null` value and a normally closed channel, leading to hard - * to find bugs. - **/ -@ExperimentalCoroutinesApi // since 1.3.0, tentatively stable in 1.4.x + * This function is deprecated in the favour of [ReceiveChannel.onReceiveCatching] + */ +@Deprecated( + "Deprecated in the favour of 'onReceiveCatching'", + level = DeprecationLevel.WARNING +) // Warning since 1.5.0, ERROR in 1.6.0, HIDDEN in 1.7.0 public fun ReceiveChannel.onReceiveOrNull(): SelectClause1 { @Suppress("DEPRECATION", "UNCHECKED_CAST") return (this as ReceiveChannel).onReceiveOrNull diff --git a/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt b/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt index 7fde06362a..6e5f3f11aa 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt @@ -54,7 +54,7 @@ internal suspend fun FlowCollector.combineInternal( ++currentEpoch // Start batch // The very first receive in epoch should be suspending - var element = resultChannel.receiveOrNull() ?: break // Channel is closed, nothing to do here + var element = resultChannel.receiveCatching().getOrNull() ?: break // Channel is closed, nothing to do here while (true) { val index = element.index // Update values @@ -129,7 +129,9 @@ internal fun zipImpl(flow: Flow, flow2: Flow, transform: sus withContextUndispatched(coroutineContext + collectJob, Unit) { flow.collect { value -> withContextUndispatched(scopeContext, Unit, cnt) { - val otherValue = second.receiveOrNull() ?: throw AbortFlowException(this@unsafeFlow) + val otherValue = second.receiveCatching().getOrElse { + throw it ?:AbortFlowException(this@unsafeFlow) + } emit(transform(value, NULL.unbox(otherValue))) } } diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index 0f6ee3aca8..fed5962bd5 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -209,8 +209,7 @@ public fun Flow.debounce(timeout: (T) -> Duration): Flow = private fun Flow.debounceInternal(timeoutMillisSelector: (T) -> Long) : Flow = scopedFlow { downstream -> // Produce the values using the default (rendezvous) channel - // Note: the actual type is Any, KT-30796 - val values = produce { + val values = produce { collect { value -> send(value ?: NULL) } } // Now consume the values @@ -237,14 +236,15 @@ private fun Flow.debounceInternal(timeoutMillisSelector: (T) -> Long) : F lastValue = null // Consume the value } } - // Should be receiveCatching when boxing issues are fixed - values.onReceiveOrNull { value -> - if (value == null) { - if (lastValue != null) downstream.emit(NULL.unbox(lastValue)) - lastValue = DONE - } else { - lastValue = value - } + values.onReceiveCatching { value -> + value + .onSuccess { lastValue = it } + .onFailure { + it?.let { throw it } + // If closed normally, emit the latest value + if (lastValue != null) downstream.emit(NULL.unbox(lastValue)) + lastValue = DONE + } } } } @@ -278,21 +278,21 @@ private fun Flow.debounceInternal(timeoutMillisSelector: (T) -> Long) : F public fun Flow.sample(periodMillis: Long): Flow { require(periodMillis > 0) { "Sample period should be positive" } return scopedFlow { downstream -> - val values = produce(capacity = Channel.CONFLATED) { - // Actually Any, KT-30796 + val values = produce(capacity = Channel.CONFLATED) { collect { value -> send(value ?: NULL) } } var lastValue: Any? = null val ticker = fixedPeriodTicker(periodMillis) while (lastValue !== DONE) { select { - values.onReceiveOrNull { - if (it == null) { - ticker.cancel(ChildCancelledException()) - lastValue = DONE - } else { - lastValue = it - } + values.onReceiveCatching { result -> + result + .onSuccess { lastValue = it } + .onFailure { + it?.let { throw it } + ticker.cancel(ChildCancelledException()) + lastValue = DONE + } } // todo: shall be start sampling only when an element arrives or sample aways as here? diff --git a/kotlinx-coroutines-core/common/src/selects/Select.kt b/kotlinx-coroutines-core/common/src/selects/Select.kt index 0d97400717..a7172707e2 100644 --- a/kotlinx-coroutines-core/common/src/selects/Select.kt +++ b/kotlinx-coroutines-core/common/src/selects/Select.kt @@ -177,15 +177,17 @@ public interface SelectInstance { * corresponding non-suspending version that can be used with a regular `when` expression to select one * of the alternatives or to perform the default (`else`) action if none of them can be immediately selected. * - * | **Receiver** | **Suspending function** | **Select clause** | **Non-suspending version** - * | ---------------- | --------------------------------------------- | ------------------------------------------------ | -------------------------- - * | [Job] | [join][Job.join] | [onJoin][Job.onJoin] | [isCompleted][Job.isCompleted] - * | [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] | [isCompleted][Job.isCompleted] - * | [SendChannel] | [send][SendChannel.send] | [onSend][SendChannel.onSend] | [offer][SendChannel.offer] - * | [ReceiveChannel] | [receive][ReceiveChannel.receive] | [onReceive][ReceiveChannel.onReceive] | [poll][ReceiveChannel.poll] - * | [ReceiveChannel] | [receiveOrNull][ReceiveChannel.receiveOrNull] | [onReceiveOrNull][ReceiveChannel.onReceiveOrNull]| [poll][ReceiveChannel.poll] - * | [Mutex] | [lock][Mutex.lock] | [onLock][Mutex.onLock] | [tryLock][Mutex.tryLock] - * | none | [delay] | [onTimeout][SelectBuilder.onTimeout] | none + * ### List of supported select methods + * + * | **Receiver** | **Suspending function** | **Select clause** + * | ---------------- | --------------------------------------------- | ----------------------------------------------------- + * | [Job] | [join][Job.join] | [onJoin][Job.onJoin] + * | [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] + * | [SendChannel] | [send][SendChannel.send] | [onSend][SendChannel.onSend] + * | [ReceiveChannel] | [receive][ReceiveChannel.receive] | [onReceive][ReceiveChannel.onReceive] + * | [ReceiveChannel] | [receiveCatching][ReceiveChannel.receiveCatching] | [onReceiveCatching][ReceiveChannel.onReceiveCatching] + * | [Mutex] | [lock][Mutex.lock] | [onLock][Mutex.onLock] + * | none | [delay] | [onTimeout][SelectBuilder.onTimeout] * * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this * function is suspended, this function immediately resumes with [CancellationException]. diff --git a/kotlinx-coroutines-core/common/test/channels/ArrayBroadcastChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ArrayBroadcastChannelTest.kt index a7084296bb..2d71cc94ed 100644 --- a/kotlinx-coroutines-core/common/test/channels/ArrayBroadcastChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ArrayBroadcastChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -46,7 +46,7 @@ class ArrayBroadcastChannelTest : TestBase() { assertEquals(2, first.receive()) // suspends assertFalse(first.isClosedForReceive) expect(10) - assertNull(first.receiveOrNull()) // suspends + assertTrue(first.receiveCatching().isClosed) // suspends assertTrue(first.isClosedForReceive) expect(14) } @@ -62,7 +62,7 @@ class ArrayBroadcastChannelTest : TestBase() { assertEquals(2, second.receive()) // suspends assertFalse(second.isClosedForReceive) expect(11) - assertNull(second.receiveOrNull()) // suspends + assertNull(second.receiveCatching().getOrNull()) // suspends assertTrue(second.isClosedForReceive) expect(15) } @@ -116,9 +116,9 @@ class ArrayBroadcastChannelTest : TestBase() { expect(6) assertFalse(sub.isClosedForReceive) for (x in 1..3) - assertEquals(x, sub.receiveOrNull()) + assertEquals(x, sub.receiveCatching().getOrNull()) // and receive close signal - assertNull(sub.receiveOrNull()) + assertNull(sub.receiveCatching().getOrNull()) assertTrue(sub.isClosedForReceive) finish(7) } @@ -153,7 +153,7 @@ class ArrayBroadcastChannelTest : TestBase() { // make sure all of them are consumed check(!sub.isClosedForReceive) for (x in 1..5) check(sub.receive() == x) - check(sub.receiveOrNull() == null) + check(sub.receiveCatching().getOrNull() == null) check(sub.isClosedForReceive) } @@ -196,7 +196,7 @@ class ArrayBroadcastChannelTest : TestBase() { val channel = BroadcastChannel(1) val subscription = channel.openSubscription() subscription.cancel(TestCancellationException()) - subscription.receiveOrNull() + subscription.receive() } @Test @@ -208,6 +208,6 @@ class ArrayBroadcastChannelTest : TestBase() { channel.cancel() assertTrue(channel.isClosedForSend) assertTrue(sub.isClosedForReceive) - check(sub.receiveOrNull() == null) + check(sub.receiveCatching().getOrNull() == null) } } diff --git a/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt index a57b519f61..3900c2db90 100644 --- a/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -38,17 +38,17 @@ class ArrayChannelTest : TestBase() { } @Test - fun testClosedBufferedReceiveOrNull() = runTest { + fun testClosedBufferedReceiveCatching() = runTest { val q = Channel(1) check(q.isEmpty && !q.isClosedForSend && !q.isClosedForReceive) expect(1) launch { expect(5) check(!q.isEmpty && q.isClosedForSend && !q.isClosedForReceive) - assertEquals(42, q.receiveOrNull()) + assertEquals(42, q.receiveCatching().getOrNull()) expect(6) check(!q.isEmpty && q.isClosedForSend && q.isClosedForReceive) - assertNull(q.receiveOrNull()) + assertNull(q.receiveCatching().getOrNull()) expect(7) } expect(2) @@ -134,7 +134,7 @@ class ArrayChannelTest : TestBase() { q.cancel() check(q.isClosedForSend) check(q.isClosedForReceive) - assertFailsWith { q.receiveOrNull() } + assertFailsWith { q.receiveCatching().getOrThrow() } finish(12) } @@ -142,7 +142,7 @@ class ArrayChannelTest : TestBase() { fun testCancelWithCause() = runTest({ it is TestCancellationException }) { val channel = Channel(5) channel.cancel(TestCancellationException()) - channel.receiveOrNull() + channel.receive() } @Test @@ -160,7 +160,7 @@ class ArrayChannelTest : TestBase() { channel.offer(-1) } repeat(4) { - channel.receiveOrNull() + channel.receiveCatching().getOrNull() } checkBufferChannel(channel, capacity) } diff --git a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt index f1658cfa84..a64284aec1 100644 --- a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt @@ -24,19 +24,9 @@ class BasicOperationsTest : TestBase() { TestChannelKind.values().forEach { kind -> testSendAfterClose(kind) } } - @Test - fun testReceiveOrNullAfterClose() = runTest { - TestChannelKind.values().forEach { kind -> testReceiveOrNull(kind) } - } - - @Test - fun testReceiveOrNullAfterCloseWithException() = runTest { - TestChannelKind.values().forEach { kind -> testReceiveOrNullException(kind) } - } - @Test fun testReceiveCatching() = runTest { - TestChannelKind.values().forEach { kind -> testReceiveOrClosed(kind) } + TestChannelKind.values().forEach { kind -> testReceiveCatching(kind) } } @Test @@ -90,24 +80,7 @@ class BasicOperationsTest : TestBase() { } } - private suspend fun testReceiveOrNull(kind: TestChannelKind) = coroutineScope { - val channel = kind.create() - val d = async(NonCancellable) { - channel.receive() - } - - yield() - channel.close() - assertTrue(channel.isClosedForReceive) - - assertNull(channel.receiveOrNull()) - assertNull(channel.poll()) - - d.join() - assertTrue(d.getCancellationException().cause is ClosedReceiveChannelException) - } - - private suspend fun testReceiveOrNullException(kind: TestChannelKind) = coroutineScope { + private suspend fun testReceiveCatchingException(kind: TestChannelKind) = coroutineScope { val channel = kind.create() val d = async(NonCancellable) { channel.receive() @@ -119,8 +92,8 @@ class BasicOperationsTest : TestBase() { assertFailsWith { channel.poll() } try { - channel.receiveOrNull() - fail() + channel.receiveCatching().getOrThrow() + expectUnreached() } catch (e: TestException) { // Expected } @@ -130,7 +103,7 @@ class BasicOperationsTest : TestBase() { } @Suppress("ReplaceAssertBooleanWithAssertEquality") - private suspend fun testReceiveOrClosed(kind: TestChannelKind) = coroutineScope { + private suspend fun testReceiveCatching(kind: TestChannelKind) = coroutineScope { reset() val channel = kind.create() launch { diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt index 37db7e4526..ae05fb8d74 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementFailureTest.kt @@ -70,33 +70,7 @@ class ChannelUndeliveredElementFailureTest : TestBase() { } @Test - fun testReceiveOrNullCancelledFail() = runTest(unhandled = shouldBeUnhandled) { - val channel = Channel(onUndeliveredElement = onCancelFail) - val job = launch(start = CoroutineStart.UNDISPATCHED) { - channel.receiveOrNull() - expectUnreached() // will be cancelled before it dispatches - } - channel.send(item) - job.cancel() - } - - @Test - fun testReceiveOrNullSelectCancelledFail() = runTest(unhandled = shouldBeUnhandled) { - val channel = Channel(onUndeliveredElement = onCancelFail) - val job = launch(start = CoroutineStart.UNDISPATCHED) { - select { - channel.onReceiveOrNull { - expectUnreached() - } - } - expectUnreached() // will be cancelled before it dispatches - } - channel.send(item) - job.cancel() - } - - @Test - fun testReceiveOrClosedCancelledFail() = runTest(unhandled = shouldBeUnhandled) { + fun testReceiveCatchingCancelledFail() = runTest(unhandled = shouldBeUnhandled) { val channel = Channel(onUndeliveredElement = onCancelFail) val job = launch(start = CoroutineStart.UNDISPATCHED) { channel.receiveCatching() diff --git a/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt index 7dd232f2d7..856a66fbd2 100644 --- a/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -68,7 +68,7 @@ class ConflatedBroadcastChannelTest : TestBase() { expect(14) assertEquals("three", sub.receive()) // suspends expect(17) - assertNull(sub.receiveOrNull()) // suspends until closed + assertNull(sub.receiveCatching().getOrNull()) // suspends until closed expect(20) sub.cancel() expect(21) diff --git a/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt index 18f2843868..87194f72f9 100644 --- a/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -27,7 +27,7 @@ open class ConflatedChannelTest : TestBase() { val q = createConflatedChannel() q.send(1) q.send(2) // shall conflated previously sent - assertEquals(2, q.receiveOrNull()) + assertEquals(2, q.receiveCatching().getOrNull()) } @Test @@ -41,7 +41,7 @@ open class ConflatedChannelTest : TestBase() { // not it is closed for receive, too assertTrue(q.isClosedForSend) assertTrue(q.isClosedForReceive) - assertNull(q.receiveOrNull()) + assertNull(q.receiveCatching().getOrNull()) } @Test @@ -82,7 +82,7 @@ open class ConflatedChannelTest : TestBase() { q.cancel() check(q.isClosedForSend) check(q.isClosedForReceive) - assertFailsWith { q.receiveOrNull() } + assertFailsWith { q.receiveCatching().getOrThrow() } finish(2) } @@ -90,6 +90,6 @@ open class ConflatedChannelTest : TestBase() { fun testCancelWithCause() = runTest({ it is TestCancellationException }) { val channel = createConflatedChannel() channel.cancel(TestCancellationException()) - channel.receiveOrNull() + channel.receive() } } diff --git a/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt index 4233a35084..cdec8a776e 100644 --- a/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -18,8 +18,8 @@ class LinkedListChannelTest : TestBase() { check(!c.close()) assertEquals(1, c.receive()) assertEquals(2, c.poll()) - assertEquals(3, c.receiveOrNull()) - assertNull(c.receiveOrNull()) + assertEquals(3, c.receiveCatching().getOrNull()) + assertNull(c.receiveCatching().getOrNull()) } @Test @@ -31,13 +31,13 @@ class LinkedListChannelTest : TestBase() { q.cancel() check(q.isClosedForSend) check(q.isClosedForReceive) - assertFailsWith { q.receiveOrNull() } + assertFailsWith { q.receive() } } @Test fun testCancelWithCause() = runTest({ it is TestCancellationException }) { val channel = Channel(Channel.UNLIMITED) channel.cancel(TestCancellationException()) - channel.receiveOrNull() + channel.receive() } } diff --git a/kotlinx-coroutines-core/common/test/channels/ProduceTest.kt b/kotlinx-coroutines-core/common/test/channels/ProduceTest.kt index 194504e713..61ef072622 100644 --- a/kotlinx-coroutines-core/common/test/channels/ProduceTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ProduceTest.kt @@ -24,7 +24,7 @@ class ProduceTest : TestBase() { expect(4) check(c.receive() == 2) expect(5) - check(c.receiveOrNull() == null) + assertNull(c.receiveCatching().getOrNull()) finish(7) } @@ -49,7 +49,7 @@ class ProduceTest : TestBase() { expect(4) c.cancel() expect(5) - assertFailsWith { c.receiveOrNull() } + assertFailsWith { c.receiveCatching().getOrThrow() } expect(6) yield() // to produce finish(8) @@ -76,7 +76,7 @@ class ProduceTest : TestBase() { expect(4) c.cancel(TestCancellationException()) try { - assertNull(c.receiveOrNull()) + c.receive() expectUnreached() } catch (e: TestCancellationException) { expect(5) diff --git a/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt index 4d20d71596..ab0292a831 100644 --- a/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -36,15 +36,15 @@ class RendezvousChannelTest : TestBase() { } @Test - fun testClosedReceiveOrNull() = runTest { + fun testClosedReceiveCatching() = runTest { val q = Channel(Channel.RENDEZVOUS) check(q.isEmpty && !q.isClosedForSend && !q.isClosedForReceive) expect(1) launch { expect(3) - assertEquals(42, q.receiveOrNull()) + assertEquals(42, q.receiveCatching().getOrNull()) expect(4) - assertNull(q.receiveOrNull()) + assertNull(q.receiveCatching().getOrNull()) expect(6) } expect(2) @@ -233,9 +233,9 @@ class RendezvousChannelTest : TestBase() { expect(7) yield() // try to resume sender (it will not resume despite the close!) expect(8) - assertEquals(42, q.receiveOrNull()) + assertEquals(42, q.receiveCatching().getOrNull()) expect(9) - assertNull(q.receiveOrNull()) + assertNull(q.receiveCatching().getOrNull()) expect(10) yield() // to sender, it was resumed! finish(12) @@ -266,7 +266,7 @@ class RendezvousChannelTest : TestBase() { q.cancel() check(q.isClosedForSend) check(q.isClosedForReceive) - assertFailsWith { q.receiveOrNull() } + assertFailsWith { q.receiveCatching().getOrThrow() } finish(12) } @@ -274,6 +274,6 @@ class RendezvousChannelTest : TestBase() { fun testCancelWithCause() = runTest({ it is TestCancellationException }) { val channel = Channel(Channel.RENDEZVOUS) channel.cancel(TestCancellationException()) - channel.receiveOrNull() + channel.receiveCatching().getOrThrow() } } diff --git a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt index 3e70007a6e..f234e141fe 100644 --- a/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt +++ b/kotlinx-coroutines-core/common/test/channels/TestChannelKind.kt @@ -42,7 +42,6 @@ private class ChannelViaBroadcast( override val isEmpty: Boolean get() = sub.isEmpty override suspend fun receive(): E = sub.receive() - override suspend fun receiveOrNull(): E? = sub.receiveOrNull() override suspend fun receiveCatching(): ChannelResult = sub.receiveCatching() override fun iterator(): ChannelIterator = sub.iterator() override fun tryReceive(): ChannelResult = sub.tryReceive() @@ -55,8 +54,6 @@ private class ChannelViaBroadcast( override val onReceive: SelectClause1 get() = sub.onReceive - override val onReceiveOrNull: SelectClause1 - get() = sub.onReceiveOrNull override val onReceiveCatching: SelectClause1> get() = sub.onReceiveCatching } diff --git a/kotlinx-coroutines-core/common/test/selects/SelectLoopTest.kt b/kotlinx-coroutines-core/common/test/selects/SelectLoopTest.kt index e31ccfc16d..ba8f56ad4c 100644 --- a/kotlinx-coroutines-core/common/test/selects/SelectLoopTest.kt +++ b/kotlinx-coroutines-core/common/test/selects/SelectLoopTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:Suppress("NAMED_ARGUMENTS_NOT_ALLOWED") // KT-21913 @@ -27,7 +27,7 @@ class SelectLoopTest : TestBase() { try { while (true) { select { - channel.onReceiveOrNull { + channel.onReceiveCatching { expectUnreached() } job.onJoin { @@ -40,4 +40,4 @@ class SelectLoopTest : TestBase() { finish(4) } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveOrNullFromClosedChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveOrNullFromClosedChannel.txt deleted file mode 100644 index ac8f5f4ee6..0000000000 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveOrNullFromClosedChannel.txt +++ /dev/null @@ -1,8 +0,0 @@ -kotlinx.coroutines.RecoverableTestException - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveOrNullFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - (Coroutine boundary) - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelReceiveOrNull(StackTraceRecoveryChannelsTest.kt:70) - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveOrNullFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:44) -Caused by: kotlinx.coroutines.RecoverableTestException - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveOrNullFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt index 1d7613eded..5a2778d507 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ActorTest.kt @@ -69,11 +69,11 @@ class ActorTest(private val capacity: Int) : TestBase() { @Test fun testCloseWithoutCause() = runTest { val actor = actor(capacity = capacity) { - val element = channel.receiveOrNull() + val element = channel.receive() expect(2) assertEquals(42, element) - val next = channel.receiveOrNull() - assertNull(next) + val next = channel.receiveCatching() + assertNull(next.exceptionOrNull()) expect(3) } @@ -88,11 +88,11 @@ class ActorTest(private val capacity: Int) : TestBase() { @Test fun testCloseWithCause() = runTest { val actor = actor(capacity = capacity) { - val element = channel.receiveOrNull() + val element = channel.receive() expect(2) - require(element!! == 42) + require(element == 42) try { - channel.receiveOrNull() + channel.receive() } catch (e: IOException) { expect(3) } @@ -111,7 +111,7 @@ class ActorTest(private val capacity: Int) : TestBase() { val job = async { actor(capacity = capacity) { expect(1) - channel.receiveOrNull() + channel.receive() expectUnreached() } } diff --git a/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelMultiReceiveStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelMultiReceiveStressTest.kt index 2e73b2432a..8c9777b4af 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelMultiReceiveStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelMultiReceiveStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -67,10 +67,10 @@ class BroadcastChannelMultiReceiveStressTest( val channel = broadcast.openSubscription() when (receiverIndex % 5) { 0 -> doReceive(channel, receiverIndex) - 1 -> doReceiveOrNull(channel, receiverIndex) + 1 -> doReceiveCatching(channel, receiverIndex) 2 -> doIterator(channel, receiverIndex) 3 -> doReceiveSelect(channel, receiverIndex) - 4 -> doReceiveSelectOrNull(channel, receiverIndex) + 4 -> doReceiveCatchingSelect(channel, receiverIndex) } channel.cancel() } @@ -124,9 +124,9 @@ class BroadcastChannelMultiReceiveStressTest( } } - private suspend fun doReceiveOrNull(channel: ReceiveChannel, receiverIndex: Int) { + private suspend fun doReceiveCatching(channel: ReceiveChannel, receiverIndex: Int) { while (true) { - val stop = doReceived(receiverIndex, channel.receiveOrNull() ?: break) + val stop = doReceived(receiverIndex, channel.receiveCatching().getOrNull() ?: break) if (stop) break } } @@ -148,11 +148,11 @@ class BroadcastChannelMultiReceiveStressTest( } } - private suspend fun doReceiveSelectOrNull(channel: ReceiveChannel, receiverIndex: Int) { + private suspend fun doReceiveCatchingSelect(channel: ReceiveChannel, receiverIndex: Int) { while (true) { - val event = select { channel.onReceiveOrNull { it } } ?: break + val event = select { channel.onReceiveCatching { it.getOrNull() } } ?: break val stop = doReceived(receiverIndex, event) if (stop) break } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt index 9f7ce497fa..a6a5340389 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt @@ -89,7 +89,7 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { private suspend fun receiveOne(channel: Channel) { val received = when (Random.nextInt(3)) { 0 -> channel.receive() - 1 -> channel.receiveOrNull() ?: error("Cannot be closed yet") + 1 -> channel.receiveCatching().getOrElse { error("Cannot be closed yet") } 2 -> select { channel.onReceive { it } } diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt index f414c33338..a6345cc55b 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -60,10 +60,10 @@ class ChannelSendReceiveStressTest( launch(pool + CoroutineName("receiver$receiverIndex")) { when (receiverIndex % 5) { 0 -> doReceive(receiverIndex) - 1 -> doReceiveOrNull(receiverIndex) + 1 -> doReceiveCatching(receiverIndex) 2 -> doIterator(receiverIndex) 3 -> doReceiveSelect(receiverIndex) - 4 -> doReceiveSelectOrNull(receiverIndex) + 4 -> doReceiveCatchingSelect(receiverIndex) } receiversCompleted.incrementAndGet() } @@ -152,9 +152,9 @@ class ChannelSendReceiveStressTest( } } - private suspend fun doReceiveOrNull(receiverIndex: Int) { + private suspend fun doReceiveCatching(receiverIndex: Int) { while (true) { - doReceived(receiverIndex, channel.receiveOrNull() ?: break) + doReceived(receiverIndex, channel.receiveCatching().getOrNull() ?: break) } } @@ -173,10 +173,10 @@ class ChannelSendReceiveStressTest( } } - private suspend fun doReceiveSelectOrNull(receiverIndex: Int) { + private suspend fun doReceiveCatchingSelect(receiverIndex: Int) { while (true) { - val event = select { channel.onReceiveOrNull { it } } ?: break + val event = select { channel.onReceiveCatching { it.getOrNull() } } ?: break doReceived(receiverIndex, event) } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt index 3f502ba9fb..8f5224db79 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt @@ -188,8 +188,8 @@ class ChannelUndeliveredElementStressTest(private val kind: TestChannelKind) : T val receivedData = when (receiveMode) { 1 -> channel.receive() 2 -> select { channel.onReceive { it } } - 3 -> channel.receiveOrNull() ?: error("Should not be closed") - 4 -> select { channel.onReceiveOrNull { it ?: error("Should not be closed") } } + 3 -> channel.receiveCatching().getOrElse { error("Should not be closed") } + 4 -> select { channel.onReceiveCatching { it.getOrElse { error("Should not be closed") } } } 5 -> channel.receiveCatching().getOrThrow() 6 -> { val iterator = channel.iterator() diff --git a/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt index 316b378508..fd26144faf 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels @@ -64,7 +64,9 @@ class ConflatedChannelCloseStressTest : TestBase() { } val receiver = async(pool + NonCancellable) { while (isActive) { - curChannel.get().receiveOrNull() + curChannel.get().receiveCatching().getOrElse { + it?.let { throw it } + } received.incrementAndGet() } } @@ -110,4 +112,4 @@ class ConflatedChannelCloseStressTest : TestBase() { } class StopException : Exception() -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt index f52f8b5bcf..555d99fc94 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.exceptions @@ -37,13 +37,6 @@ class StackTraceRecoveryChannelsTest : TestBase() { channelReceive(channel) } - @Test - fun testReceiveOrNullFromClosedChannel() = runTest { - val channel = Channel() - channel.close(RecoverableTestException()) - channelReceiveOrNull(channel) - } - @Test fun testSendToClosedChannel() = runTest { val channel = Channel() @@ -67,7 +60,6 @@ class StackTraceRecoveryChannelsTest : TestBase() { } private suspend fun channelReceive(channel: Channel) = channelOp { channel.receive() } - private suspend fun channelReceiveOrNull(channel: Channel) = channelOp { channel.receiveOrNull() } private suspend inline fun channelOp(block: () -> Unit) { try { @@ -75,6 +67,7 @@ class StackTraceRecoveryChannelsTest : TestBase() { block() expectUnreached() } catch (e: RecoverableTestException) { + e.printStackTrace() verifyStackTrace("channels/${name.methodName}", e) } } @@ -177,4 +170,4 @@ class StackTraceRecoveryChannelsTest : TestBase() { private suspend fun Channel.sendFromScope() = coroutineScope { sendWithContext(wrapperDispatcher(coroutineContext)) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-select-02.kt b/kotlinx-coroutines-core/jvm/test/guide/example-select-02.kt index 57fe638297..22380d3af5 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-select-02.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-select-02.kt @@ -11,17 +11,21 @@ import kotlinx.coroutines.selects.* suspend fun selectAorB(a: ReceiveChannel, b: ReceiveChannel): String = select { - a.onReceiveOrNull { value -> - if (value == null) - "Channel 'a' is closed" - else + a.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "a -> '$value'" + } else { + "Channel 'a' is closed" + } } - b.onReceiveOrNull { value -> - if (value == null) - "Channel 'b' is closed" - else + b.onReceiveCatching { it -> + val value = it.getOrNull() + if (value != null) { "b -> '$value'" + } else { + "Channel 'b' is closed" + } } } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-select-05.kt b/kotlinx-coroutines-core/jvm/test/guide/example-select-05.kt index 464e9b20f3..68b4456454 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-select-05.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-select-05.kt @@ -13,12 +13,12 @@ fun CoroutineScope.switchMapDeferreds(input: ReceiveChannel>) = var current = input.receive() // start with first received deferred value while (isActive) { // loop while not cancelled/closed val next = select?> { // return next deferred value from this select or null - input.onReceiveOrNull { update -> - update // replaces next value to wait + input.onReceiveCatching { update -> + update.getOrNull() } - current.onAwait { value -> + current.onAwait { value -> send(value) // send value that current deferred has produced - input.receiveOrNull() // and use the next deferred from the input channel + input.receiveCatching().getOrNull() // and use the next deferred from the input channel } } if (next == null) { diff --git a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt index 1f04ea538c..cb8de7a636 100644 --- a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt @@ -112,7 +112,7 @@ private class PublisherAsFlow( collectImpl(scope.coroutineContext, SendingCollector(scope.channel)) } -@Suppress("SubscriberImplementation") +@Suppress("ReactiveStreamsSubscriberImplementation") private class ReactiveSubscriber( capacity: Int, onBufferOverflow: BufferOverflow, @@ -124,7 +124,11 @@ private class ReactiveSubscriber( // be reliable with rendezvous channel, so a rendezvous channel is replaced with buffer=1 channel private val channel = Channel(if (capacity == Channel.RENDEZVOUS) 1 else capacity, onBufferOverflow) - suspend fun takeNextOrNull(): T? = channel.receiveOrNull() + suspend fun takeNextOrNull(): T? { + val result = channel.receiveCatching() + result.exceptionOrNull()?.let { throw it } + return result.getOrElse { null } // Closed channel + } override fun onNext(value: T) { // Controlled by requestSize @@ -247,7 +251,7 @@ public class FlowSubscription( if (old <= 0L) { assert(old == 0L) // Emitter is not started yet or has suspended -- spin on race with suspendCancellableCoroutine - while(true) { + while (true) { val producer = producer.getAndSet(null) ?: continue // spin if not set yet producer.resume(Unit) break diff --git a/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt b/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt index f846882ab2..1db10b278d 100644 --- a/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/CancelledParentAttachTest.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.* import org.junit.* -class CancelledParentAttachTest : TestBase() { +class CancelledParentAttachTest : TestBase() {; @Test fun testFlow() = runTest { @@ -17,4 +17,5 @@ class CancelledParentAttachTest : TestBase() { val j = Job().also { it.cancel() } f.asPublisher(j).asFlow().collect() } + } diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt index 04833e9814..e2c86c97ff 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.reactive @@ -263,4 +263,14 @@ class PublisherAsFlowTest : TestBase() { } assertEquals(expected, list) } + + @Test + fun testException() = runTest { + expect(1) + val p = publish { throw TestException() }.asFlow() + p.catch { + assertTrue { it is TestException } + finish(2) + }.collect() + } } diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt index 110718ac55..790cf7ec7c 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt @@ -1,10 +1,11 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.selects.* import org.junit.Test import org.junit.runner.* @@ -31,23 +32,23 @@ class PublisherSubscriptionSelectTest(private val request: Int) : TestBase() { val channelB = source.openSubscription(request) loop@ while (true) { val done: Int = select { - channelA.onReceiveOrNull { - if (it != null) assertEquals(a++, it) - if (it == null) 0 else 1 + channelA.onReceiveCatching { result -> + result.onSuccess { assertEquals(a++, it) } + if (result.isSuccess) 1 else 0 } - channelB.onReceiveOrNull { - if (it != null) assertEquals(b++, it) - if (it == null) 0 else 2 + channelB.onReceiveCatching { result -> + result.onSuccess { assertEquals(b++, it) } + if (result.isSuccess) 2 else 0 } } when (done) { 0 -> break@loop 1 -> { - val r = channelB.receiveOrNull() + val r = channelB.receiveCatching().getOrNull() if (r != null) assertEquals(b++, r) } 2 -> { - val r = channelA.receiveOrNull() + val r = channelA.receiveCatching().getOrNull() if (r != null) assertEquals(a++, r) } } @@ -58,4 +59,4 @@ class PublisherSubscriptionSelectTest(private val request: Int) : TestBase() { // should receive one of them fully assertTrue(a == n || b == n) } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt index 3cd3bbffff..396d19d159 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt @@ -1,12 +1,14 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.rx2 import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.selects.* import org.junit.Test +import kotlin.onSuccess import kotlin.test.* class ObservableSubscriptionSelectTest : TestBase() { @@ -22,23 +24,23 @@ class ObservableSubscriptionSelectTest : TestBase() { val channelB = source.openSubscription() loop@ while (true) { val done: Int = select { - channelA.onReceiveOrNull { - if (it != null) assertEquals(a++, it) - if (it == null) 0 else 1 + channelA.onReceiveCatching { result -> + result.onSuccess { assertEquals(a++, it) } + if (result.isSuccess) 1 else 0 } - channelB.onReceiveOrNull { - if (it != null) assertEquals(b++, it) - if (it == null) 0 else 2 + channelB.onReceiveCatching { result -> + result.onSuccess { assertEquals(b++, it) } + if (result.isSuccess) 2 else 0 } } when (done) { 0 -> break@loop 1 -> { - val r = channelB.receiveOrNull() + val r = channelB.receiveCatching().getOrNull() if (r != null) assertEquals(b++, r) } 2 -> { - val r = channelA.receiveOrNull() + val r = channelA.receiveCatching().getOrNull() if (r != null) assertEquals(a++, r) } } @@ -48,4 +50,4 @@ class ObservableSubscriptionSelectTest : TestBase() { // should receive one of them fully assertTrue(a == n || b == n) } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableSubscriptionSelectTest.kt index 2f04316159..58a54616f6 100644 --- a/reactive/kotlinx-coroutines-rx3/test/ObservableSubscriptionSelectTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableSubscriptionSelectTest.kt @@ -1,12 +1,14 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.rx3 import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.selects.* import org.junit.Test +import kotlin.onSuccess import kotlin.test.* class ObservableSubscriptionSelectTest : TestBase() { @@ -22,23 +24,23 @@ class ObservableSubscriptionSelectTest : TestBase() { val channelB = source.openSubscription() loop@ while (true) { val done: Int = select { - channelA.onReceiveOrNull { - if (it != null) assertEquals(a++, it) - if (it == null) 0 else 1 + channelA.onReceiveCatching { result -> + result.onSuccess { assertEquals(a++, it) } + if (result.isSuccess) 1 else 0 } - channelB.onReceiveOrNull { - if (it != null) assertEquals(b++, it) - if (it == null) 0 else 2 + channelB.onReceiveCatching { result -> + result.onSuccess { assertEquals(b++, it) } + if (result.isSuccess) 2 else 0 } } when (done) { 0 -> break@loop 1 -> { - val r = channelB.receiveOrNull() + val r = channelB.receiveCatching().getOrNull() if (r != null) assertEquals(b++, r) } 2 -> { - val r = channelA.receiveOrNull() + val r = channelA.receiveCatching().getOrNull() if (r != null) assertEquals(a++, r) } } From eb963e84dad1b358d801eb408b89f50c5307fdc3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 6 Apr 2021 19:19:14 +0300 Subject: [PATCH 015/328] Remove deprecated SendChannel.isFull (#2613) --- .../api/kotlinx-coroutines-core.api | 2 -- .../common/src/channels/AbstractChannel.kt | 3 +-- .../common/src/channels/ArrayChannel.kt | 1 - kotlinx-coroutines-core/common/src/channels/Channel.kt | 10 ---------- .../common/src/channels/ConflatedBroadcastChannel.kt | 1 - kotlinx-coroutines-core/jvm/src/channels/Channels.kt | 2 +- .../api/kotlinx-coroutines-reactive.api | 1 - reactive/kotlinx-coroutines-reactive/src/Publish.kt | 1 - reactive/kotlinx-coroutines-rx2/src/RxObservable.kt | 1 - reactive/kotlinx-coroutines-rx3/src/RxObservable.kt | 1 - 10 files changed, 2 insertions(+), 21 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 2f2b8d54ab..611ebd8650 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -802,7 +802,6 @@ public final class kotlinx/coroutines/channels/ConflatedBroadcastChannel : kotli public final fun getValueOrNull ()Ljava/lang/Object; public fun invokeOnClose (Lkotlin/jvm/functions/Function1;)V public fun isClosedForSend ()Z - public fun isFull ()Z public fun offer (Ljava/lang/Object;)Z public fun openSubscription ()Lkotlinx/coroutines/channels/ReceiveChannel; public fun send (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -857,7 +856,6 @@ public abstract interface class kotlinx/coroutines/channels/SendChannel { public abstract fun getOnSend ()Lkotlinx/coroutines/selects/SelectClause2; public abstract fun invokeOnClose (Lkotlin/jvm/functions/Function1;)V public abstract fun isClosedForSend ()Z - public abstract fun isFull ()Z public abstract fun offer (Ljava/lang/Object;)Z public abstract fun send (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun trySend-JP2dKIU (Ljava/lang/Object;)Ljava/lang/Object; diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 04a9d1a64a..52e47227ad 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -127,8 +127,7 @@ internal abstract class AbstractSendChannel( // ------ SendChannel ------ public final override val isClosedForSend: Boolean get() = closedForSend != null - public override val isFull: Boolean get() = isFullImpl - protected val isFullImpl: Boolean get() = queue.nextNode !is ReceiveOrClosed<*> && isBufferFull + private val isFullImpl: Boolean get() = queue.nextNode !is ReceiveOrClosed<*> && isBufferFull public final override suspend fun send(element: E) { // fast path -- try offer non-blocking diff --git a/kotlinx-coroutines-core/common/src/channels/ArrayChannel.kt b/kotlinx-coroutines-core/common/src/channels/ArrayChannel.kt index 4569ec72fa..7e6c0e68c5 100644 --- a/kotlinx-coroutines-core/common/src/channels/ArrayChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ArrayChannel.kt @@ -49,7 +49,6 @@ internal open class ArrayChannel( protected final override val isBufferAlwaysFull: Boolean get() = false protected final override val isBufferFull: Boolean get() = size.value == capacity && onBufferOverflow == BufferOverflow.SUSPEND - override val isFull: Boolean get() = lock.withLock { isFullImpl } override val isEmpty: Boolean get() = lock.withLock { isEmptyImpl } override val isClosedForReceive: Boolean get() = lock.withLock { super.isClosedForReceive } diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 8aad264d2c..7b6cc0ad9d 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -31,16 +31,6 @@ public interface SendChannel { @ExperimentalCoroutinesApi public val isClosedForSend: Boolean - /** - * Returns `true` if the channel is full (out of capacity), which means that an attempt to [send] will suspend. - * This function returns `false` if the channel [is closed for `send`][isClosedForSend]. - * - * @suppress **Will be removed in next releases, no replacement.** - */ - @ExperimentalCoroutinesApi - @Deprecated(level = DeprecationLevel.ERROR, message = "Will be removed in next releases without replacement") - public val isFull: Boolean - /** * Sends the specified [element] to this channel, suspending the caller while the buffer of this channel is full * or if it does not exist, or throws an exception if the channel [is closed for `send`][isClosedForSend] (see [close] for details). diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt index 75524f214f..c84afb2fe0 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt @@ -94,7 +94,6 @@ public class ConflatedBroadcastChannel() : BroadcastChannel { } public override val isClosedForSend: Boolean get() = _state.value is Closed - public override val isFull: Boolean get() = false @Suppress("UNCHECKED_CAST") public override fun openSubscription(): ReceiveChannel { diff --git a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt index 081a0583d1..52adfea276 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt @@ -10,7 +10,7 @@ package kotlinx.coroutines.channels import kotlinx.coroutines.* /** - * Adds [element] into to this channel, **blocking** the caller while this channel [Channel.isFull], + * Adds [element] into to this channel, **blocking** the caller while this channel is full, * or throws exception if the channel [Channel.isClosedForSend] (see [Channel.close] for details). * * This is a way to call [Channel.send] method inside a blocking code using [runBlocking], diff --git a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api index 6798625179..06ef048407 100644 --- a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api +++ b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api @@ -57,7 +57,6 @@ public final class kotlinx/coroutines/reactive/PublisherCoroutine : kotlinx/coro public fun invokeOnClose (Lkotlin/jvm/functions/Function1;)Ljava/lang/Void; public synthetic fun invokeOnClose (Lkotlin/jvm/functions/Function1;)V public fun isClosedForSend ()Z - public fun isFull ()Z public fun offer (Ljava/lang/Object;)Z public synthetic fun onCompleted (Ljava/lang/Object;)V public fun registerSelectClause2 (Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 6bb02ef192..f66b1c3bae 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -91,7 +91,6 @@ public class PublisherCoroutine( private var cancelled = false // true when Subscription.cancel() is invoked override val isClosedForSend: Boolean get() = isCompleted - override val isFull: Boolean = mutex.isLocked override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit): Nothing = throw UnsupportedOperationException("PublisherCoroutine doesn't support invokeOnClose") diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 7813bc7548..edbb106253 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -80,7 +80,6 @@ private class RxObservableCoroutine( private val _signal = atomic(OPEN) override val isClosedForSend: Boolean get() = isCompleted - override val isFull: Boolean = mutex.isLocked override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit) = throw UnsupportedOperationException("RxObservableCoroutine doesn't support invokeOnClose") diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index fed89c328e..a17e32dd31 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -66,7 +66,6 @@ private class RxObservableCoroutine( private val _signal = atomic(OPEN) override val isClosedForSend: Boolean get() = isCompleted - override val isFull: Boolean = mutex.isLocked override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit) = throw UnsupportedOperationException("RxObservableCoroutine doesn't support invokeOnClose") From f2f49b09db471179a8861a77840c47706e668b9d Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 7 Apr 2021 11:44:14 +0300 Subject: [PATCH 016/328] Complete mono { } on cancellation (#2606) Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2262 --- .../kotlinx-coroutines-reactor/src/Mono.kt | 27 +++--- .../test/MonoTest.kt | 93 +++++++++++++++++++ 2 files changed, 107 insertions(+), 13 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index e146dca9f6..6786f1abab 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -7,21 +7,23 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.* +import kotlinx.coroutines.reactive.* +import org.reactivestreams.* import reactor.core.* import reactor.core.publisher.* import kotlin.coroutines.* import kotlin.internal.* /** - * Creates cold [mono][Mono] that will run a given [block] in a coroutine and emits its result. + * Creates a cold [mono][Mono] that runs a given [block] in a coroutine and emits its result. * Every time the returned mono is subscribed, it starts a new coroutine. - * If [block] result is `null`, [MonoSink.success] is invoked without a value. - * Unsubscribing cancels running coroutine. + * If the result of [block] is `null`, [MonoSink.success] is invoked without a value. + * Unsubscribing cancels the running coroutine. * * Coroutine context can be specified with [context] argument. * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is used. * - * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. + * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ public fun mono( context: CoroutineContext = EmptyCoroutineContext, @@ -67,17 +69,16 @@ private class MonoCoroutine( } override fun onCancelled(cause: Throwable, handled: Boolean) { - try { - /* - * sink.error handles exceptions on its own and, by default, handling of undeliverable exceptions is a no-op. - * Guard potentially non-empty handlers against meaningless cancellation exceptions - */ - if (getCancellationException() !== cause) { + /** Cancellation exceptions that were caused by [dispose], that is, came from downstream, are not errors. */ + if (getCancellationException() !== cause || !disposed) { + try { + /** If [sink] turns out to already be in a terminal state, this exception will be passed through the + * [Hooks.onOperatorError] hook, which is the way to signal undeliverable exceptions in Reactor. */ sink.error(cause) + } catch (e: Throwable) { + // In case of improper error implementation or fatal exceptions + handleCoroutineException(context, cause) } - } catch (e: Throwable) { - // In case of improper error implementation or fatal exceptions - handleCoroutineException(context, cause) } } diff --git a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt index 0271483fc1..97b195c517 100644 --- a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.* import kotlinx.coroutines.reactive.* import org.junit.* @@ -21,6 +22,7 @@ class MonoTest : TestBase() { @Before fun setup() { ignoreLostThreads("timer-", "parallel-") + Hooks.onErrorDropped { expectUnreached() } } @Test @@ -285,4 +287,95 @@ class MonoTest : TestBase() { .collect { } } } + + /** Test that cancelling a [mono] due to a timeout does throw an exception. */ + @Test + fun testTimeout() { + val mono = mono { + withTimeout(1) { delay(100) } + } + try { + mono.doOnSubscribe { expect(1) } + .doOnNext { expectUnreached() } + .doOnSuccess { expectUnreached() } + .doOnError { expect(2) } + .doOnCancel { expectUnreached() } + .block() + } catch (e: CancellationException) { + expect(3) + } + finish(4) + } + + /** Test that when the reason for cancellation of a [mono] is that the downstream doesn't want its results anymore, + * this is considered normal behavior and exceptions are not propagated. */ + @Test + fun testDownstreamCancellationDoesNotThrow() = runTest { + /** Attach a hook that handles exceptions from publishers that are known to be disposed of. We don't expect it + * to be fired in this case, as the reason for the publisher in this test to accept an exception is simply + * cancellation from the downstream. */ + Hooks.onOperatorError("testDownstreamCancellationDoesNotThrow") { t, a -> + expectUnreached() + t + } + /** A Mono that doesn't emit a value and instead waits indefinitely. */ + val mono = mono { expect(3); delay(Long.MAX_VALUE) } + .doOnSubscribe { expect(2) } + .doOnNext { expectUnreached() } + .doOnSuccess { expectUnreached() } + .doOnError { expectUnreached() } + .doOnCancel { expect(4) } + expect(1) + mono.awaitCancelAndJoin() + finish(5) + Hooks.resetOnOperatorError("testDownstreamCancellationDoesNotThrow") + } + + /** Test that, when [Mono] is cancelled by the downstream and throws during handling the cancellation, the resulting + * error is propagated to [Hooks.onOperatorError]. */ + @Test + fun testRethrowingDownstreamCancellation() = runTest { + /** Attach a hook that handles exceptions from publishers that are known to be disposed of. We expect it + * to be fired in this case. */ + Hooks.onOperatorError("testDownstreamCancellationDoesNotThrow") { t, a -> + expect(5) + t + } + /** A Mono that doesn't emit a value and instead waits indefinitely, and, when cancelled, throws. */ + val mono = mono { + expect(3); + try { + delay(Long.MAX_VALUE) + } catch (e: CancellationException) { + throw TestException() + } + } + .doOnSubscribe { expect(2) } + .doOnNext { expectUnreached() } + .doOnSuccess { expectUnreached() } + .doOnError { expectUnreached() } + .doOnCancel { expect(4) } + expect(1) + mono.awaitCancelAndJoin() + finish(6) /** if this line fails, see the comment for [awaitCancelAndJoin] */ + Hooks.resetOnOperatorError("testDownstreamCancellationDoesNotThrow") + } + + /** Run the given [Mono], cancel it, wait for the cancellation handler to finish, and *return only then*. + * + * There are no guarantees about the execution context in which the cancellation handler will run, but we have + * to wait for it to finish to check its behavior. The contraption below seems to ensure that everything works out. + * If it stops giving that guarantee, then [testRethrowingDownstreamCancellation] should fail more or less + * consistently because the hook won't have enough time to fire before a call to [finish]. + */ + private suspend fun Mono.awaitCancelAndJoin() = coroutineScope { + val job = async(start = CoroutineStart.UNDISPATCHED) { + awaitFirstOrNull() + } + newSingleThreadContext("monoCancellationCleanup").use { pool -> + launch(pool) { + job.cancelAndJoin() + } + }.join() + } } From b7e08b8f4aac30227e30d7101600443de86d9832 Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Wed, 7 Apr 2021 16:49:39 +0800 Subject: [PATCH 017/328] Fix bad link in debug-coroutines-with-idea.md (#2634) Fix invalid link to api doc for `println()` function. --- docs/topics/debug-coroutines-with-idea.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/debug-coroutines-with-idea.md b/docs/topics/debug-coroutines-with-idea.md index c44bafc18f..e59075e071 100644 --- a/docs/topics/debug-coroutines-with-idea.md +++ b/docs/topics/debug-coroutines-with-idea.md @@ -21,7 +21,7 @@ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-gui * Use the [`runBlocking()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. * Use the [`async()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html) function to create coroutines that compute deferred values `a` and `b`. * Use the [`await()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html) function to await the computation result. - * Use the [`println()`](https://kotlinlang.org//api/latest/jvm/stdlib/stdlib/kotlin.io/println.html) function to print computing status and the result of multiplication to the output. + * Use the [`println()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/println.html) function to print computing status and the result of multiplication to the output. ```kotlin import kotlinx.coroutines.* @@ -79,4 +79,4 @@ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-gui * The second coroutine has computed its value and disappeared. * The third coroutine is calculating the value of `b` – it has the **RUNNING** status. -Using IntelliJ IDEA debugger, you can dig deeper into each coroutine to debug your code. \ No newline at end of file +Using IntelliJ IDEA debugger, you can dig deeper into each coroutine to debug your code. From 86a0658af37d149c4e3a866f9aebf1c537a48238 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 7 Apr 2021 13:34:27 +0300 Subject: [PATCH 018/328] Make the subscriber in awaitOne less permissive (#2586) The implementation of Reactive Streams' Subscriber used for `await*` operations was assuming that the publisher is correct. Now, the implementation detects some instances of problematic behavior for publishers and reports them. Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2079 --- .../kotlinx-coroutines-reactive/src/Await.kt | 92 ++++++++++-- .../test/IntegrationTest.kt | 132 ++++++++++++++++++ 2 files changed, 211 insertions(+), 13 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactive/src/Await.kt b/reactive/kotlinx-coroutines-reactive/src/Await.kt index e9f6955085..9af134cb94 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Await.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Await.kt @@ -4,12 +4,11 @@ package kotlinx.coroutines.reactive -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Job -import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.* import org.reactivestreams.Publisher import org.reactivestreams.Subscriber import org.reactivestreams.Subscription +import java.lang.IllegalStateException import java.util.* import kotlin.coroutines.* @@ -134,31 +133,61 @@ private suspend fun Publisher.awaitOne( mode: Mode, default: T? = null ): T = suspendCancellableCoroutine { cont -> + /* This implementation must obey + https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2-subscriber-code + The numbers of rules are taken from there. */ injectCoroutineContext(cont.context).subscribe(object : Subscriber { - private lateinit var subscription: Subscription + // It is unclear whether 2.13 implies (T: Any), but if so, it seems that we don't break anything by not adhering + private var subscription: Subscription? = null private var value: T? = null private var seenValue = false + private var inTerminalState = false override fun onSubscribe(sub: Subscription) { + /** cancelling the new subscription due to rule 2.5, though the publisher would either have to + * subscribe more than once, which would break 2.12, or leak this [Subscriber]. */ + if (subscription != null) { + sub.cancel() + return + } subscription = sub cont.invokeOnCancellation { sub.cancel() } - sub.request(if (mode == Mode.FIRST) 1 else Long.MAX_VALUE) + sub.request(if (mode == Mode.FIRST || mode == Mode.FIRST_OR_DEFAULT) 1 else Long.MAX_VALUE) } override fun onNext(t: T) { + val sub = subscription.let { + if (it == null) { + /** Enforce rule 1.9: expect [Subscriber.onSubscribe] before any other signals. */ + handleCoroutineException(cont.context, + IllegalStateException("'onNext' was called before 'onSubscribe'")) + return + } else { + it + } + } + if (inTerminalState) { + gotSignalInTerminalStateException(cont.context, "onNext") + return + } when (mode) { Mode.FIRST, Mode.FIRST_OR_DEFAULT -> { - if (!seenValue) { - seenValue = true - subscription.cancel() - cont.resume(t) + if (seenValue) { + moreThanOneValueProvidedException(cont.context, mode) + return } + seenValue = true + sub.cancel() + cont.resume(t) } Mode.LAST, Mode.SINGLE, Mode.SINGLE_OR_DEFAULT -> { if ((mode == Mode.SINGLE || mode == Mode.SINGLE_OR_DEFAULT) && seenValue) { - subscription.cancel() - if (cont.isActive) + sub.cancel() + /* the check for `cont.isActive` is needed in case `sub.cancel() above calls `onComplete` or + `onError` on its own. */ + if (cont.isActive) { cont.resumeWithException(IllegalArgumentException("More than one onNext value for $mode")) + } } else { value = t seenValue = true @@ -169,8 +198,16 @@ private suspend fun Publisher.awaitOne( @Suppress("UNCHECKED_CAST") override fun onComplete() { + if (!tryEnterTerminalState("onComplete")) { + return + } if (seenValue) { - if (cont.isActive) cont.resume(value as T) + /* the check for `cont.isActive` is needed because, otherwise, if the publisher doesn't acknowledge the + call to `cancel` for modes `SINGLE*` when more than one value was seen, it may call `onComplete`, and + here `cont.resume` would fail. */ + if (mode != Mode.FIRST_OR_DEFAULT && mode != Mode.FIRST && cont.isActive) { + cont.resume(value as T) + } return } when { @@ -178,14 +215,43 @@ private suspend fun Publisher.awaitOne( cont.resume(default as T) } cont.isActive -> { + // the check for `cont.isActive` is just a slight optimization and doesn't affect correctness cont.resumeWithException(NoSuchElementException("No value received via onNext for $mode")) } } } override fun onError(e: Throwable) { - cont.resumeWithException(e) + if (tryEnterTerminalState("onError")) { + cont.resumeWithException(e) + } + } + + /** + * Enforce rule 2.4: assume that the [Publisher] is in a terminal state after [onError] or [onComplete]. + */ + private fun tryEnterTerminalState(signalName: String): Boolean { + if (inTerminalState) { + gotSignalInTerminalStateException(cont.context, signalName) + return false + } + inTerminalState = true + return true } }) } +/** + * Enforce rule 2.4 (detect publishers that don't respect rule 1.7): don't process anything after a terminal + * state was reached. + */ +private fun gotSignalInTerminalStateException(context: CoroutineContext, signalName: String) = + handleCoroutineException(context, + IllegalStateException("'$signalName' was called after the publisher already signalled being in a terminal state")) + +/** + * Enforce rule 1.1: it is invalid for a publisher to provide more values than requested. + */ +private fun moreThanOneValueProvidedException(context: CoroutineContext, mode: Mode) = + handleCoroutineException(context, + IllegalStateException("Only a single value was requested in '$mode', but the publisher provided more")) \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt index 18cd012d16..a1467080ac 100644 --- a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt @@ -9,6 +9,8 @@ import org.junit.Test import org.junit.runner.* import org.junit.runners.* import org.reactivestreams.* +import java.lang.IllegalStateException +import java.lang.RuntimeException import kotlin.coroutines.* import kotlin.test.* @@ -130,6 +132,136 @@ class IntegrationTest( finish(3) } + /** + * Test that the continuation is not being resumed after it has already failed due to there having been too many + * values passed. + */ + @Test + fun testNotCompletingFailedAwait() = runTest { + try { + expect(1) + Publisher { sub -> + sub.onSubscribe(object: Subscription { + override fun request(n: Long) { + expect(2) + sub.onNext(1) + sub.onNext(2) + expect(4) + sub.onComplete() + } + + override fun cancel() { + expect(3) + } + }) + }.awaitSingle() + } catch (e: java.lang.IllegalArgumentException) { + expect(5) + } + finish(6) + } + + /** + * Test the behavior of [awaitOne] on unconforming publishers. + */ + @Test + fun testAwaitOnNonconformingPublishers() = runTest { + fun publisher(block: Subscriber.(n: Long) -> Unit) = + Publisher { subscriber -> + subscriber.onSubscribe(object: Subscription { + override fun request(n: Long) { + subscriber.block(n) + } + + override fun cancel() { + } + }) + } + val dummyMessage = "dummy" + val dummyThrowable = RuntimeException(dummyMessage) + suspend fun assertDetectsBadPublisher( + operation: suspend Publisher.() -> T, + message: String, + block: Subscriber.(n: Long) -> Unit, + ) { + assertCallsExceptionHandlerWith { + try { + publisher(block).operation() + } catch (e: Throwable) { + if (e.message != dummyMessage) + throw e + } + }.let { + assertTrue("Expected the message to contain '$message', got '${it.message}'") { + it.message?.contains(message) ?: false + } + } + } + + // Rule 1.1 broken: the publisher produces more values than requested. + assertDetectsBadPublisher({ awaitFirst() }, "provided more") { + onNext(1) + onNext(2) + onComplete() + } + + // Rule 1.7 broken: the publisher calls a method on a subscriber after reaching the terminal state. + assertDetectsBadPublisher({ awaitSingle() }, "terminal state") { + onNext(1) + onError(dummyThrowable) + onComplete() + } + assertDetectsBadPublisher({ awaitSingleOrDefault(2) }, "terminal state") { + onComplete() + onError(dummyThrowable) + } + assertDetectsBadPublisher({ awaitFirst() }, "terminal state") { + onNext(0) + onComplete() + onComplete() + } + assertDetectsBadPublisher({ awaitFirstOrDefault(1) }, "terminal state") { + onComplete() + onNext(3) + } + assertDetectsBadPublisher({ awaitSingle() }, "terminal state") { + onError(dummyThrowable) + onNext(3) + } + + // Rule 1.9 broken (the first signal to the subscriber was not 'onSubscribe') + assertCallsExceptionHandlerWith { + try { + Publisher { subscriber -> + subscriber.onNext(3) + subscriber.onComplete() + }.awaitFirst() + } catch (e: NoSuchElementException) { + // intentionally blank + } + }.let { assertTrue(it.message?.contains("onSubscribe") ?: false) } + } + + private suspend inline fun assertCallsExceptionHandlerWith( + crossinline operation: suspend () -> Unit): E + { + val caughtExceptions = mutableListOf() + val exceptionHandler = object: AbstractCoroutineContextElement(CoroutineExceptionHandler), + CoroutineExceptionHandler + { + override fun handleException(context: CoroutineContext, exception: Throwable) { + caughtExceptions += exception + } + } + return withContext(exceptionHandler) { + operation() + caughtExceptions.single().let { + assertTrue(it is E) + it + } + } + } + private suspend fun checkNumbers(n: Int, pub: Publisher) { var last = 0 pub.collect { From d23dd3d7e8cf120bf51271043c496888accc92b2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 7 Apr 2021 16:03:44 +0300 Subject: [PATCH 019/328] Remove internal 'checkCompletion' function and replace it with the identical 'ensureActive' extension to reduce code duplication (#2467) --- kotlinx-coroutines-core/common/src/Builders.common.kt | 2 +- kotlinx-coroutines-core/common/src/JobSupport.kt | 2 +- kotlinx-coroutines-core/common/src/Yield.kt | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Builders.common.kt b/kotlinx-coroutines-core/common/src/Builders.common.kt index 09ae9b685d..a11ffe9eb4 100644 --- a/kotlinx-coroutines-core/common/src/Builders.common.kt +++ b/kotlinx-coroutines-core/common/src/Builders.common.kt @@ -150,7 +150,7 @@ public suspend fun withContext( val oldContext = uCont.context val newContext = oldContext + context // always check for cancellation of new context - newContext.checkCompletion() + newContext.ensureActive() // FAST PATH #1 -- new context is the same as the old one if (newContext === oldContext) { val coroutine = ScopeCoroutine(newContext, uCont) diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index 438e7f5722..0a3dd23472 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -541,7 +541,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren public final override suspend fun join() { if (!joinInternal()) { // fast-path no wait - coroutineContext.checkCompletion() + coroutineContext.ensureActive() return // do not suspend } return joinSuspend() // slow-path wait diff --git a/kotlinx-coroutines-core/common/src/Yield.kt b/kotlinx-coroutines-core/common/src/Yield.kt index 975a48935c..98e210412b 100644 --- a/kotlinx-coroutines-core/common/src/Yield.kt +++ b/kotlinx-coroutines-core/common/src/Yield.kt @@ -30,7 +30,7 @@ import kotlin.coroutines.intrinsics.* */ public suspend fun yield(): Unit = suspendCoroutineUninterceptedOrReturn sc@ { uCont -> val context = uCont.context - context.checkCompletion() + context.ensureActive() val cont = uCont.intercepted() as? DispatchedContinuation ?: return@sc Unit if (cont.dispatcher.isDispatchNeeded(context)) { // this is a regular dispatcher -- do simple dispatchYield @@ -50,8 +50,3 @@ public suspend fun yield(): Unit = suspendCoroutineUninterceptedOrReturn sc@ { u } COROUTINE_SUSPENDED } - -internal fun CoroutineContext.checkCompletion() { - val job = get(Job) - if (job != null && !job.isActive) throw job.getCancellationException() -} From b61a66c7a565d8ca635a38e178564adbbbfaabd2 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 7 Apr 2021 17:11:19 +0300 Subject: [PATCH 020/328] Display artificial stack frames as calls to functions instead of text (#2461) Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2291 --- docs/images/after.png | Bin 297058 -> 160118 bytes docs/images/before.png | Bin 161429 -> 98194 bytes .../jvm/src/debug/CoroutineDebugging.kt | 65 ++++++++++++++++++ .../jvm/src/debug/internal/DebugProbesImpl.kt | 34 +++++---- .../jvm/src/internal/StackTraceRecovery.kt | 17 +++-- .../channels/testCancelledOffer.txt | 2 +- .../channels/testOfferFromScope.txt | 4 +- .../channels/testOfferWithContextWrapped.txt | 2 +- .../channels/testOfferWithCurrentContext.txt | 2 +- .../channels/testReceiveFromChannel.txt | 4 +- .../channels/testReceiveFromClosedChannel.txt | 4 +- .../channels/testSendFromScope.txt | 4 +- .../channels/testSendToChannel.txt | 4 +- .../channels/testSendToClosedChannel.txt | 4 +- .../resume-mode/testEventLoopDispatcher.txt | 4 +- .../testEventLoopDispatcherSuspending.txt | 4 +- .../testNestedEventLoopChangedContext.txt | 2 +- ...estedEventLoopChangedContextSuspending.txt | 4 +- .../testNestedEventLoopDispatcher.txt | 2 +- ...estNestedEventLoopDispatcherSuspending.txt | 4 +- .../resume-mode/testNestedUnconfined.txt | 4 +- .../testNestedUnconfinedChangedContext.txt | 2 +- ...stedUnconfinedChangedContextSuspending.txt | 4 +- .../testNestedUnconfinedSuspending.txt | 4 +- .../resume-mode/testUnconfined.txt | 4 +- .../resume-mode/testUnconfinedSuspending.txt | 4 +- .../select/testSelectCompletedAwait.txt | 2 +- .../stacktraces/select/testSelectJoin.txt | 4 +- ...edFromLexicalBlockWhenTriggeredByChild.txt | 4 +- ...acktraceIsRecoveredFromSuspensionPoint.txt | 4 +- ...sRecoveredFromSuspensionPointWithChild.txt | 4 +- .../StackTraceRecoveryNestedScopesTest.kt | 4 +- .../test/exceptions/StackTraceRecoveryTest.kt | 12 ++-- .../jvm/test/exceptions/Stacktraces.kt | 17 +---- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-debug/src/DebugProbes.kt | 2 +- .../test/CoroutinesDumpTest.kt | 6 +- .../test/DebugProbesTest.kt | 10 +-- .../test/RunningThreadStackMergeTest.kt | 8 +-- .../test/SanitizedProbesTest.kt | 12 ++-- .../test/ScopedBuildersTest.kt | 4 +- .../test/StacktraceUtils.kt | 39 ++++------- .../CoroutinesTimeoutDisabledTracesTest.kt | 2 +- 43 files changed, 179 insertions(+), 145 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/src/debug/CoroutineDebugging.kt diff --git a/docs/images/after.png b/docs/images/after.png index 4ce15e8b4e635e033bca77ae40e66ae1f840c1ef..b1e138c68279eee31d03a286d6faa7cb6025773c 100644 GIT binary patch literal 160118 zcmb^3Wl$Z@x+r`cg1fuBOK^90hu{vugS)%CI|~V}3wO7LOM*MW9p3!+-lxuc?>Qgu zr=FgwnV#wD?q}wiUrm&Xk~9)LK0Fv07?P}vgc=waR1_E(_&glM-#sQ={_KAXNLMjg z4LCTsjo-?@z`#hsWF}FO-0G^-2*sFIf zD=%+N7grP&jxg|VLvUaa|7XD@7r0!!9^@hdh6)A+1};)K4p*p5Fl^eOKn~o@;~k9fS)gcTvd=vc+e&@ zWrhil2GdLqY6*d?BELQ(z|@lO=+9*}ymc`;V&g|ACMV0(YyiZWWRfgO_WU2+mAaiZ z)R^&@z+Rtw4~3o@(RoqvKo|%lX+XSWh=Cnem|o-6AnY7p?Lb?Gz(Ma3TE{G@^dyGL zR1Vod2&Ct9FNJCwtYuqoCWj+uQ<+2Rq0uIG%Fd{(7K@>x@{YMGY#j^ySovMqeb>(P z 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 l@NAi`fft@| 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

)Oe348*>)O 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° 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 literal 297058 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\%9r~F@xR0pxIlbm#|}R&!7K# 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 z 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 k?8iUU9@mwxaPGn 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%0DlLDMhm2@vI1ZvbZ*FP+F%Eg+ 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

q%G$yP|- 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�XAwN(TSRPot&c73QtDj#|u0(x^eD& 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
uH$Bd{GLxDUX@S)$zc>BU{6 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 diff --git a/kotlinx-coroutines-core/jvm/src/debug/CoroutineDebugging.kt b/kotlinx-coroutines-core/jvm/src/debug/CoroutineDebugging.kt new file mode 100644 index 0000000000..49a794e046 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/src/debug/CoroutineDebugging.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +/* This package name is like this so that +1) the artificial stack frames look pretty, and +2) the IDE reliably navigates to this file. */ +package _COROUTINE + +/** + * A collection of artificial stack trace elements to be included in stack traces by the coroutines machinery. + * + * There are typically two ways in which one can encounter an artificial stack frame: + * 1. By using the debug mode, via the stacktrace recovery mechanism; see + * [stacktrace recovery](https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/topics/debugging.md#stacktrace-recovery) + * documentation. The usual way to enable the debug mode is with the [kotlinx.coroutines.DEBUG_PROPERTY_NAME] system + * property. + * 2. By looking at the output of DebugProbes; see the + * [kotlinx-coroutines-debug](https://github.com/Kotlin/kotlinx.coroutines/tree/master/kotlinx-coroutines-debug) module. + */ +internal class ArtificialStackFrames { + /** + * Returns an artificial stack trace element denoting the boundary between coroutine creation and its execution. + * + * Appearance of this function in stack traces does not mean that it was called. Instead, it is used as a marker + * that separates the part of the stack trace with the code executed in a coroutine from the stack trace of the code + * that launched the coroutine. + * + * In earlier versions of kotlinx-coroutines, this was displayed as "(Coroutine creation stacktrace)", which caused + * problems for tooling that processes stack traces: https://github.com/Kotlin/kotlinx.coroutines/issues/2291 + * + * Note that presence of this marker in a stack trace implies that coroutine creation stack traces were enabled. + */ + fun coroutineCreation(): StackTraceElement = Exception().artificialFrame(_CREATION::class.java.simpleName) + + /** + * Returns an artificial stack trace element denoting a coroutine boundary. + * + * Appearance of this function in stack traces does not mean that it was called. Instead, when one coroutine invokes + * another, this is used as a marker in the stack trace to denote where the execution of one coroutine ends and that + * of another begins. + * + * In earlier versions of kotlinx-coroutines, this was displayed as "(Coroutine boundary)", which caused + * problems for tooling that processes stack traces: https://github.com/Kotlin/kotlinx.coroutines/issues/2291 + */ + fun coroutineBoundary(): StackTraceElement = Exception().artificialFrame(_BOUNDARY::class.java.simpleName) +} + +// These are needed for the IDE navigation to detect that this file does contain the definition. +private class _CREATION +private class _BOUNDARY + +internal val ARTIFICIAL_FRAME_PACKAGE_NAME = "_COROUTINE" + +/** + * Forms an artificial stack frame with the given class name. + * + * It consists of the following parts: + * 1. The package name, it seems, is needed for the IDE to detect stack trace elements reliably. It is `_COROUTINE` since + * this is a valid identifier. + * 2. Class names represents what type of artificial frame this is. + * 3. The method name is `_`. The methods not being present in class definitions does not seem to affect navigation. + */ +private fun Throwable.artificialFrame(name: String): StackTraceElement = + with(stackTrace[0]) { StackTraceElement(ARTIFICIAL_FRAME_PACKAGE_NAME + "." + name, "_", fileName, lineNumber) } diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index 4c88cc976a..49294d73e1 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -7,7 +7,6 @@ package kotlinx.coroutines.debug.internal import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.debug.* -import kotlinx.coroutines.internal.* import kotlinx.coroutines.internal.ScopeCoroutine import java.io.* import java.lang.StackTraceElement @@ -18,10 +17,10 @@ import kotlin.concurrent.* import kotlin.coroutines.* import kotlin.coroutines.jvm.internal.CoroutineStackFrame import kotlin.synchronized -import kotlinx.coroutines.internal.artificialFrame as createArtificialFrame // IDEA bug workaround +import _COROUTINE.ArtificialStackFrames internal object DebugProbesImpl { - private const val ARTIFICIAL_FRAME_MESSAGE = "Coroutine creation stacktrace" + private val ARTIFICIAL_FRAME = ArtificialStackFrames().coroutineCreation() private val dateFormat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss") private var weakRefCleanerThread: Thread? = null @@ -219,7 +218,7 @@ internal object DebugProbesImpl { info.state out.print("\n\nCoroutine ${owner.delegate}, state: $state") if (observedStackTrace.isEmpty()) { - out.print("\n\tat ${createArtificialFrame(ARTIFICIAL_FRAME_MESSAGE)}") + out.print("\n\tat $ARTIFICIAL_FRAME") printStackTrace(out, info.creationStackTrace) } else { printStackTrace(out, enhancedStackTrace) @@ -416,15 +415,17 @@ internal object DebugProbesImpl { return createOwner(completion, frame) } - private fun List.toStackTraceFrame(): StackTraceFrame? = - foldRight(null) { frame, acc -> - StackTraceFrame(acc, frame) - } + private fun List.toStackTraceFrame(): StackTraceFrame = + StackTraceFrame( + foldRight(null) { frame, acc -> + StackTraceFrame(acc, frame) + }, ARTIFICIAL_FRAME + ) private fun createOwner(completion: Continuation, frame: StackTraceFrame?): Continuation { if (!isInstalled) return completion val info = DebugCoroutineInfoImpl(completion.context, frame, sequenceNumber.incrementAndGet()) - val owner = CoroutineOwner(completion, info, frame) + val owner = CoroutineOwner(completion, info) capturedCoroutinesMap[owner] = true if (!isInstalled) capturedCoroutinesMap.clear() return owner @@ -447,9 +448,9 @@ internal object DebugProbesImpl { */ private class CoroutineOwner( @JvmField val delegate: Continuation, - @JvmField val info: DebugCoroutineInfoImpl, - private val frame: CoroutineStackFrame? + @JvmField val info: DebugCoroutineInfoImpl ) : Continuation by delegate, CoroutineStackFrame { + private val frame get() = info.creationStackBottom override val callerFrame: CoroutineStackFrame? get() = frame?.callerFrame @@ -467,12 +468,10 @@ internal object DebugProbesImpl { private fun sanitizeStackTrace(throwable: T): List { val stackTrace = throwable.stackTrace val size = stackTrace.size - val probeIndex = stackTrace.indexOfLast { it.className == "kotlin.coroutines.jvm.internal.DebugProbesKt" } + val traceStart = 1 + stackTrace.indexOfLast { it.className == "kotlin.coroutines.jvm.internal.DebugProbesKt" } if (!sanitizeStackTraces) { - return List(size - probeIndex) { - if (it == 0) createArtificialFrame(ARTIFICIAL_FRAME_MESSAGE) else stackTrace[it + probeIndex] - } + return List(size - traceStart) { stackTrace[it + traceStart] } } /* @@ -483,9 +482,8 @@ internal object DebugProbesImpl { * If an interval of internal methods ends in a synthetic method, the outermost non-synthetic method in that * interval will also be included. */ - val result = ArrayList(size - probeIndex + 1) - result += createArtificialFrame(ARTIFICIAL_FRAME_MESSAGE) - var i = probeIndex + 1 + val result = ArrayList(size - traceStart + 1) + var i = traceStart while (i < size) { if (stackTrace[i].isInternalMethod) { result += stackTrace[i] // we include the boundary of the span in any case diff --git a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt index 48e8790cd1..cf6506ef06 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt @@ -7,6 +7,8 @@ package kotlinx.coroutines.internal import kotlinx.coroutines.* +import _COROUTINE.ARTIFICIAL_FRAME_PACKAGE_NAME +import _COROUTINE.ArtificialStackFrames import java.util.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* @@ -18,6 +20,8 @@ import kotlin.coroutines.intrinsics.* private const val baseContinuationImplClass = "kotlin.coroutines.jvm.internal.BaseContinuationImpl" private const val stackTraceRecoveryClass = "kotlinx.coroutines.internal.StackTraceRecoveryKt" +private val ARTIFICIAL_FRAME = ArtificialStackFrames().coroutineBoundary() + private val baseContinuationImplClassName = runCatching { Class.forName(baseContinuationImplClass).canonicalName }.getOrElse { baseContinuationImplClass } @@ -42,7 +46,7 @@ private fun E.sanitizeStackTrace(): E { val adjustment = if (endIndex == -1) 0 else size - endIndex val trace = Array(size - lastIntrinsic - adjustment) { if (it == 0) { - artificialFrame("Coroutine boundary") + ARTIFICIAL_FRAME } else { stackTrace[startIndex + it - 1] } @@ -91,13 +95,13 @@ private fun recoverFromStackFrame(exception: E, continuation: Co * IllegalStateException * at foo * at kotlin.coroutines.resumeWith - * (Coroutine boundary) + * at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) * at bar * ...real stackTrace... * caused by "IllegalStateException" (original one) */ private fun createFinalException(cause: E, result: E, resultStackTrace: ArrayDeque): E { - resultStackTrace.addFirst(artificialFrame("Coroutine boundary")) + resultStackTrace.addFirst(ARTIFICIAL_FRAME) val causeTrace = cause.stackTrace val size = causeTrace.frameIndex(baseContinuationImplClassName) if (size == -1) { @@ -187,12 +191,7 @@ private fun createStackTrace(continuation: CoroutineStackFrame): ArrayDeque.frameIndex(methodName: String) = indexOfFirst { methodName == it.className } private fun StackTraceElement.elementWiseEquals(e: StackTraceElement): Boolean { diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt index cfed5af47c..010dab389d 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt @@ -1,5 +1,5 @@ kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@2a06d350 - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.channels.AbstractSendChannel.offer(AbstractChannel.kt:170) at kotlinx.coroutines.channels.ChannelCoroutine.offer(ChannelCoroutine.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testCancelledOffer$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:153) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt index bf3fd3a3ca..aa5a6a17e1 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt @@ -1,10 +1,10 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:109) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:167) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:162) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendFromScope$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:172) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:112) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:109) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt index 612d00de06..4908d3be38 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithContextWrapped$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:98) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:199) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:194) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithContextWrapped$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:100) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt index 833afbf8aa..1eb464c71b 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithCurrentContext$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:86) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:210) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:205) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithCurrentContext$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:89) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt index 66bb5e5e2e..af8c1fd389 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:97) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelReceive(StackTraceRecoveryChannelsTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:101) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:97) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt index 76c0b1a8fa..3f392cd31d 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:110) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelReceive(StackTraceRecoveryChannelsTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:111) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:110) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt index 9f932032bd..49c3628bb2 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt @@ -1,10 +1,10 @@ kotlinx.coroutines.RecoverableTestCancellationException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:136) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:167) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:162) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendFromScope$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:172) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1$deferred$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:126) Caused by: kotlinx.coroutines.RecoverableTestCancellationException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:136) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt index dab728fa79..4a8e320e2d 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt @@ -2,11 +2,11 @@ java.util.concurrent.CancellationException: RendezvousChannel was cancelled at kotlinx.coroutines.channels.AbstractChannel.cancel(AbstractChannel.kt:630) at kotlinx.coroutines.channels.ReceiveChannel$DefaultImpls.cancel$default(Channel.kt:311) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:52) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelSend(StackTraceRecoveryChannelsTest.kt:73) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:56) Caused by: java.util.concurrent.CancellationException: RendezvousChannel was cancelled at kotlinx.coroutines.channels.AbstractChannel.cancel(AbstractChannel.kt:630) at kotlinx.coroutines.channels.ReceiveChannel$DefaultImpls.cancel$default(Channel.kt:311) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:52) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt index 54fdbb3295..f2609594f3 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelSend(StackTraceRecoveryChannelsTest.kt:74) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:44) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt index 6b40ec8308..0e75e64511 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcher$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -9,4 +9,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcher$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt index 5afc559fe0..0792646ed4 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt @@ -1,10 +1,10 @@ otlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:99) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:110) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:101) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcherSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:89) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:99) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt index 406b2d1c9c..f3ca1fc4e0 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopChangedContext$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:54) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt index 86ec5e4bb2..dbb574fead 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:124) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:115) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopChangedContextSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:102) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt index d9098bbaad..e17e2db685 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopDispatcher$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:47) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt index 8caed7ac0c..26e035992c 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:124) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:115) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopDispatcherSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:95) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt index a2cd009dc8..f247920ee5 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfined$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:27) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -10,4 +10,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfined$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:27) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt index a786682b7e..b7ae52c9d3 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedChangedContext$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:34) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt index 8c937a7c6b..241a3b2342 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:148) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedChangedContextSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:94) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt index b6eef47911..4484c66432 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:148) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:87) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt index 9b9cba3eb4..4f0103ecc8 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfined$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -9,4 +9,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfined$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt index ca0bbe7fb8..fb742a3076 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt @@ -1,9 +1,9 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfinedSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:82) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt index dbc39ccc55..2e86a7ad18 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:40) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:41) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:40) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt index 2d48086150..3f404cd937 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$$inlined$select$lambda$1.invokeSuspend(StackTraceRecoverySelectTest.kt:33) - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectJoin$1.invokeSuspend(StackTraceRecoverySelectTest.kt:20) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$$inlined$select$lambda$1.invokeSuspend(StackTraceRecoverySelectTest.kt:33) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt index ab23c9a369..ac40dc152b 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerChildWithTimeout(StackTraceRecoveryWithTimeoutTest.kt:48) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild$1.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:40) Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) - at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) \ No newline at end of file + at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt index d3497face6..9d5ddb6621 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt @@ -1,5 +1,5 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.suspendForever(StackTraceRecoveryWithTimeoutTest.kt:42) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$outerWithTimeout$2.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:32) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerWithTimeout(StackTraceRecoveryWithTimeoutTest.kt:31) @@ -7,4 +7,4 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) - at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:492) \ No newline at end of file + at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:492) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt index 8ec7691e50..6f21cc6b30 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt @@ -1,9 +1,9 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - (Coroutine boundary) + at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.suspendForever(StackTraceRecoveryWithTimeoutTest.kt:92) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$outerChild$2.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:78) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerChild(StackTraceRecoveryWithTimeoutTest.kt:74) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$testStacktraceIsRecoveredFromSuspensionPointWithChild$1.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:66) Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) - at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) \ No newline at end of file + at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt index bea18a431e..bc9d056668 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt @@ -12,7 +12,7 @@ class StackTraceRecoveryNestedScopesTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.failure(StackTraceRecoveryNestedScopesTest.kt:9)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.access\$failure(StackTraceRecoveryNestedScopesTest.kt:7)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$createFailingAsync\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:12)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callWithTimeout\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:23)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callCoroutineScope\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:29)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$$TEST_MACROS\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:36)\n" + @@ -82,7 +82,7 @@ class StackTraceRecoveryNestedScopesTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.failure(StackTraceRecoveryNestedScopesTest.kt:23)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.access\$failure(StackTraceRecoveryNestedScopesTest.kt:7)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$createFailingAsync\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:26)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callWithTimeout\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:37)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callCoroutineScope\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:43)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$testAwaitNestedScopes\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:68)\n" + diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt index dbbd77c4b7..1a381547ba 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt @@ -35,7 +35,7 @@ class StackTraceRecoveryTest : TestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$1\$1.invokeSuspend(StackTraceRecoveryTest.kt:99)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:49)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:44)\n" + @@ -58,7 +58,7 @@ class StackTraceRecoveryTest : TestBase() { val stacktrace = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCompletedAsync\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:44)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:81)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:75)\n" + @@ -93,7 +93,7 @@ class StackTraceRecoveryTest : TestBase() { outerMethod(deferred, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testWithContext\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerMethod\$2.invokeSuspend(StackTraceRecoveryTest.kt:151)\n" + @@ -131,7 +131,7 @@ class StackTraceRecoveryTest : TestBase() { outerScopedMethod(deferred, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCoroutineScope\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerScopedMethod\$2\$1.invokeSuspend(StackTraceRecoveryTest.kt:193)\n" + @@ -230,7 +230,7 @@ class StackTraceRecoveryTest : TestBase() { verifyStackTrace(e, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.throws(StackTraceRecoveryTest.kt:280)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$throws\$1.invokeSuspend(StackTraceRecoveryTest.kt)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaiter(StackTraceRecoveryTest.kt:285)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testNonDispatchedRecovery\$await\$1.invokeSuspend(StackTraceRecoveryTest.kt:291)\n" + @@ -248,7 +248,7 @@ class StackTraceRecoveryTest : TestBase() { } catch (e: Throwable) { verifyStackTrace(e, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCancellableContinuation\$1.invokeSuspend(StackTraceRecoveryTest.kt:329)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaitCallback(StackTraceRecoveryTest.kt:348)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCancellableContinuation\$1\$1.invokeSuspend(StackTraceRecoveryTest.kt:322)\n" + "Caused by: kotlinx.coroutines.RecoverableTestException\n" + diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt b/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt index f79ad4ba74..5d85c9c9f2 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt @@ -33,25 +33,10 @@ public fun toStackTrace(t: Throwable): String { } public fun String.normalizeStackTrace(): String = - applyBackspace() - .replace(Regex(":[0-9]+"), "") // remove line numbers + replace(Regex(":[0-9]+"), "") // remove line numbers .replace("kotlinx_coroutines_core_main", "") // yay source sets .replace("kotlinx_coroutines_core", "") .replace(Regex("@[0-9a-f]+"), "") // remove hex addresses in debug toStrings .lines().joinToString("\n") // normalize line separators -public fun String.applyBackspace(): String { - val array = toCharArray() - val stack = CharArray(array.size) - var stackSize = -1 - for (c in array) { - if (c != '\b') { - stack[++stackSize] = c - } else { - --stackSize - } - } - return String(stack, 0, stackSize) -} - public fun String.count(substring: String): Int = split(substring).size - 1 \ No newline at end of file diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index f048040bba..04dfa8a9fb 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -123,7 +123,7 @@ Coroutine "coroutine#2":DeferredCoroutine{Active}@289d1c02, state: SUSPENDED at ExampleKt.combineResults(Example.kt:11) at ExampleKt$computeValue$2.invokeSuspend(Example.kt:7) at ExampleKt$main$1$deferred$1.invokeSuspend(Example.kt:25) - (Coroutine creation stacktrace) + at _COROUTINE._CREATION._(CoroutineDebugging.kt) at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25) at kotlinx.coroutines.BuildersKt.async$default(Unknown Source) diff --git a/kotlinx-coroutines-debug/src/DebugProbes.kt b/kotlinx-coroutines-debug/src/DebugProbes.kt index 373864adb8..be5c4557e2 100644 --- a/kotlinx-coroutines-debug/src/DebugProbes.kt +++ b/kotlinx-coroutines-debug/src/DebugProbes.kt @@ -134,7 +134,7 @@ public object DebugProbes { * * Coroutine "coroutine#42":StandaloneCoroutine{Active}@58fdd99, state: SUSPENDED * at MyClass$awaitData.invokeSuspend(MyClass.kt:37) - * (Coroutine creation stacktrace) + * at _COROUTINE._CREATION._(CoroutineDebugging.kt) * at MyClass.createIoRequest(MyClass.kt:142) * at MyClass.fetchData(MyClass.kt:154) * at MyClass.showData(MyClass.kt:31) diff --git a/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt b/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt index fd0279123f..4fecb83e47 100644 --- a/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt +++ b/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt @@ -25,7 +25,7 @@ class CoroutinesDumpTest : DebugTestBase() { "Coroutine \"coroutine#1\":DeferredCoroutine{Active}@1e4a7dd4, state: SUSPENDED\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.sleepingNestedMethod(CoroutinesDumpTest.kt:95)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.sleepingOuterMethod(CoroutinesDumpTest.kt:88)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n", @@ -51,7 +51,7 @@ class CoroutinesDumpTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.nestedActiveMethod(CoroutinesDumpTest.kt:141)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.activeMethod(CoroutinesDumpTest.kt:133)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest\$testRunningCoroutine\$1$deferred\$1.invokeSuspend(CoroutinesDumpTest.kt:41)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n" + @@ -81,7 +81,7 @@ class CoroutinesDumpTest : DebugTestBase() { "\tat java.lang.Thread.sleep(Native Method)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.nestedActiveMethod(CoroutinesDumpTest.kt:111)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.activeMethod(CoroutinesDumpTest.kt:106)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n" + diff --git a/kotlinx-coroutines-debug/test/DebugProbesTest.kt b/kotlinx-coroutines-debug/test/DebugProbesTest.kt index 01b2da0006..1acaee2b62 100644 --- a/kotlinx-coroutines-debug/test/DebugProbesTest.kt +++ b/kotlinx-coroutines-debug/test/DebugProbesTest.kt @@ -20,7 +20,7 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:14)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:49)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:44)\n" + @@ -41,12 +41,12 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:62)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable\$default(Cancellable.kt)\n" + @@ -73,12 +73,12 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:16)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:71)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:66)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithSanitizedProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:87)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.testAsyncWithSanitizedProbes(DebugProbesTest.kt:38)", diff --git a/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt b/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt index e7fdeede79..8b5724219e 100644 --- a/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt +++ b/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt @@ -32,7 +32,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$suspendingFunction\$2.invokeSuspend(RunningThreadStackMergeTest.kt:77)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunction(RunningThreadStackMergeTest.kt:75)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchCoroutine\$1.invokeSuspend(RunningThreadStackMergeTest.kt:68)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -87,7 +87,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$suspendingFunctionWithContext\$2.invokeSuspend(RunningThreadStackMergeTest.kt:124)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunctionWithContext(RunningThreadStackMergeTest.kt:122)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchEscapingCoroutine\$1.invokeSuspend(RunningThreadStackMergeTest.kt:116)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -126,7 +126,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.nonSuspendingFun(RunningThreadStackMergeTest.kt:83)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunctionWithoutContext(RunningThreadStackMergeTest.kt:160)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchEscapingCoroutineWithoutContext\$1.invokeSuspend(RunningThreadStackMergeTest.kt:153)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -158,7 +158,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump(StacktraceUtils.kt)\n" + "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump\$default(StacktraceUtils.kt)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$testRunBlocking\$1.invokeSuspend(RunningThreadStackMergeTest.kt)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt)\n") } diff --git a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt index 67a283d00a..a329be7bcd 100644 --- a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt +++ b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt @@ -27,12 +27,12 @@ class SanitizedProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$createDeferredNested\$1.invokeSuspend(SanitizedProbesTest.kt:97)\n" + - "\t(Coroutine boundary)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.oneMoreNestedMethod(SanitizedProbesTest.kt:67)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.nestedMethod(SanitizedProbesTest.kt:61)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$testRecoveredStackTrace\$1.invokeSuspend(SanitizedProbesTest.kt:50)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.TestBase.runTest\$default(TestBase.kt:141)\n" + @@ -52,7 +52,7 @@ class SanitizedProbesTest : DebugTestBase() { verifyDump( "Coroutine \"coroutine#3\":BlockingCoroutine{Active}@7d68ef40, state: RUNNING\n" + "\tat java.lang.Thread.getStackTrace(Thread.java)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.TestBase.runTest\$default(TestBase.kt:141)\n" + @@ -60,7 +60,7 @@ class SanitizedProbesTest : DebugTestBase() { "Coroutine \"coroutine#4\":DeferredCoroutine{Active}@75c072cb, state: SUSPENDED\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$createActiveDeferred\$1.invokeSuspend(SanitizedProbesTest.kt:63)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.BuildersKt__Builders_commonKt.async\$default(Builders.common.kt)\n" + @@ -84,12 +84,12 @@ class SanitizedProbesTest : DebugTestBase() { expect(3) verifyDump("Coroutine \"coroutine#1\":BlockingCoroutine{Active}@35fc6dc4, state: RUNNING\n" + "\tat java.lang.Thread.getStackTrace(Thread.java:1552)\n" + // Skip the rest - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", "Coroutine \"coroutine#2\":StandaloneCoroutine{Active}@1b68b9a4, state: SUSPENDED\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$launchSelector\$1\$1\$1.invokeSuspend(SanitizedProbesTest.kt)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25)\n" + "\tat kotlinx.coroutines.BuildersKt__Builders_commonKt.launch\$default(Builders.common.kt)\n" + diff --git a/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt b/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt index c762725569..801b74b1aa 100644 --- a/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt +++ b/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt @@ -17,7 +17,7 @@ class ScopedBuildersTest : DebugTestBase() { yield() verifyDump( "Coroutine \"coroutine#1\":BlockingCoroutine{Active}@16612a51, state: RUNNING\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n", "Coroutine \"coroutine#2\":StandaloneCoroutine{Active}@6b53e23f, state: SUSPENDED\n" + @@ -25,7 +25,7 @@ class ScopedBuildersTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.ScopedBuildersTest.doWithContext(ScopedBuildersTest.kt:47)\n" + "\tat kotlinx.coroutines.debug.ScopedBuildersTest\$doInScope\$2.invokeSuspend(ScopedBuildersTest.kt:41)\n" + "\tat kotlinx.coroutines.debug.ScopedBuildersTest\$testNestedScopes\$1\$job\$1.invokeSuspend(ScopedBuildersTest.kt:30)\n" + - "\t(Coroutine creation stacktrace)\n" + + "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)") job.cancelAndJoin() finish(4) diff --git a/kotlinx-coroutines-debug/test/StacktraceUtils.kt b/kotlinx-coroutines-debug/test/StacktraceUtils.kt index 8c591ebd44..64af7e2681 100644 --- a/kotlinx-coroutines-debug/test/StacktraceUtils.kt +++ b/kotlinx-coroutines-debug/test/StacktraceUtils.kt @@ -7,6 +7,9 @@ package kotlinx.coroutines.debug import java.io.* import kotlin.test.* +private val coroutineCreationFrameRegex = + Regex("\n\tat _COROUTINE._CREATION._[^\n]*\n") + public fun String.trimStackTrace(): String = trimIndent() .replace(Regex(":[0-9]+"), "") @@ -14,22 +17,6 @@ public fun String.trimStackTrace(): String = .replace(Regex("(?<=\tat )[^\n]*/"), "") .replace(Regex("\t"), "") .replace("sun.misc.Unsafe.", "jdk.internal.misc.Unsafe.") // JDK8->JDK11 - .applyBackspace() - -public fun String.applyBackspace(): String { - val array = toCharArray() - val stack = CharArray(array.size) - var stackSize = -1 - for (c in array) { - if (c != '\b') { - stack[++stackSize] = c - } else { - --stackSize - } - } - - return String(stack, 0, stackSize + 1) -} public fun verifyStackTrace(e: Throwable, traces: List) { val stacktrace = toStackTrace(e) @@ -74,7 +61,7 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null, f * `$$BlockHound$$_` prepended at the last component. */ private fun cleanBlockHoundTraces(frames: List): List { - var result = mutableListOf() + val result = mutableListOf() val blockHoundSubstr = "\$\$BlockHound\$\$_" var i = 0 while (i < frames.size) { @@ -97,21 +84,21 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null) { assertTrue(filtered[0].startsWith("Coroutines dump")) return } - // Drop "Coroutine dump" line - trace.withIndex().drop(1).forEach { (index, value) -> + // The first line, "Coroutine dump", is dropped. This is not `zip` because not having enough dumps is an error. + trace.drop(1).withIndex().forEach { (index, value) -> if (ignoredCoroutine != null && value.contains(ignoredCoroutine)) { return@forEach } - val expected = traces[index - 1].applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) - val actual = value.applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) + val expected = traces[index].split(coroutineCreationFrameRegex, limit = 2) + val actual = value.split(coroutineCreationFrameRegex, limit = 2) assertEquals(expected.size, actual.size, "Creation stacktrace should be part of the expected input") - expected.withIndex().forEach { (index, trace) -> - val actualTrace = actual[index].trimStackTrace().sanitizeAddresses() - val expectedTrace = trace.trimStackTrace().sanitizeAddresses() - val actualLines = cleanBlockHoundTraces(actualTrace.split("\n")) - val expectedLines = expectedTrace.split("\n") + actual.zip(expected).forEach { (actualTrace, expectedTrace) -> + val sanitizedActualTrace = actualTrace.trimStackTrace().sanitizeAddresses() + val sanitizedExpectedTrace = expectedTrace.trimStackTrace().sanitizeAddresses() + val actualLines = cleanBlockHoundTraces(sanitizedActualTrace.split("\n")) + val expectedLines = sanitizedExpectedTrace.split("\n") for (i in expectedLines.indices) { assertEquals(expectedLines[i], actualLines[i]) } diff --git a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt index 886007c3e8..d6a42be528 100644 --- a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt +++ b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt @@ -22,7 +22,7 @@ class CoroutinesTimeoutDisabledTracesTest : TestBase() { "at kotlinx.coroutines.debug.junit4.CoroutinesTimeoutDisabledTracesTest.hangForever", "at kotlinx.coroutines.debug.junit4.CoroutinesTimeoutDisabledTracesTest.waitForHangJob" ), - notExpectedOutParts = listOf("Coroutine creation stacktrace"), + notExpectedOutParts = listOf("coroutineCreation"), error = TestTimedOutException::class.java ) ) From 4c90fd4a31dcb84d2c49a8d450c98d1bdc724e18 Mon Sep 17 00:00:00 2001 From: LepilkinaElena Date: Thu, 8 Apr 2021 12:11:20 +0300 Subject: [PATCH 021/328] Fix minBy/maxBy usages (#2636) --- kotlinx-coroutines-core/common/test/flow/VirtualTime.kt | 2 +- kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt b/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt index ddb1d88ae2..b2d957be46 100644 --- a/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt +++ b/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt @@ -26,7 +26,7 @@ internal class VirtualTimeDispatcher(enclosingScope: CoroutineScope) : Coroutine ?: error("Event loop is missing, virtual time source works only as part of event loop") if (delayNanos <= 0) continue if (delayNanos > 0 && delayNanos != Long.MAX_VALUE) error("Unexpected external delay: $delayNanos") - val nextTask = heap.minBy { it.deadline } ?: return@launch + val nextTask = heap.minByOrNull { it.deadline } ?: return@launch heap.remove(nextTask) currentTime = nextTask.deadline nextTask.run() diff --git a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt b/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt index af1eee42c4..9953756f70 100644 --- a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt +++ b/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt @@ -64,7 +64,7 @@ internal class TestMainDispatcherFactory : MainDispatcherFactory { override fun createDispatcher(allFactories: List): MainCoroutineDispatcher { val originalFactory = allFactories.asSequence() .filter { it !== this } - .maxBy { it.loadPriority } ?: MissingMainCoroutineDispatcherFactory + .maxByOrNull { it.loadPriority } ?: MissingMainCoroutineDispatcherFactory return TestMainDispatcher(originalFactory) } From 43df03282fed38f3dcdbb3644032059000afe691 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 9 Dec 2020 18:02:52 +0300 Subject: [PATCH 022/328] Hide obsolete Channels API in a backwards-compatible manner * Remove all deprecated inline methods * Move the rest to the Deprecated.kt * Apply Deprecated.HIDDEN where possible, otherwise use internal + published API --- .../api/kotlinx-coroutines-core.api | 120 +- .../common/src/channels/Channels.common.kt | 2080 +---------------- .../common/src/channels/Deprecated.kt | 406 ++++ 3 files changed, 452 insertions(+), 2154 deletions(-) create mode 100644 kotlinx-coroutines-core/common/src/channels/Deprecated.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 611ebd8650..f279d5509a 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -663,124 +663,70 @@ public final class kotlinx/coroutines/channels/ChannelResult$Companion { } public final class kotlinx/coroutines/channels/ChannelsKt { - public static final fun all (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun any (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun any (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associate (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associateBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associateBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associateByTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associateByTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun associateTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun any (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun cancelConsumed (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V public static final fun consume (Lkotlinx/coroutines/channels/BroadcastChannel;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun consume (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun consumeEach (Lkotlinx/coroutines/channels/BroadcastChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun consumeEach (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun consumeEachIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun consumes (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlin/jvm/functions/Function1; public static final fun consumesAll ([Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlin/jvm/functions/Function1; - public static final fun count (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun count (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun distinct (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun count (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun distinct (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun distinctBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static synthetic fun distinctBy$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun drop (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun drop (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun drop$default (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun dropWhile (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun dropWhile (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun dropWhile$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun elementAt (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun elementAtOrElse (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun elementAtOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun elementAt (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun elementAtOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun filter (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static synthetic fun filter$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun filterIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun filterIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun filterIndexed$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun filterIndexedTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterIndexedTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterNot (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun filterNot (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun filterNot$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun filterNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun filterNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterNotTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterNotTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun filterTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun find (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun findLast (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun first (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun first (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun firstOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun firstOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun flatMap (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun filterNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun filterNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun first (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun firstOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun flatMap (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun flatMap$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun fold (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun foldIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun groupBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun groupBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun groupByTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun groupByTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun indexOf (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun indexOfFirst (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun indexOfLast (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun last (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun last (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun lastIndexOf (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun lastOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun lastOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun indexOf (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun last (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun lastIndexOf (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun lastOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun map (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static synthetic fun map$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun mapIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static synthetic fun mapIndexed$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun mapIndexedNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun mapIndexedNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun mapIndexedNotNull$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun mapIndexedNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapIndexedNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapIndexedTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapIndexedTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun mapNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun mapNotNull$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun mapNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapNotNullTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapTo (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapTo (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun maxBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun maxWith (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Comparator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun minBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun minWith (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Comparator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun none (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun none (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun maxWith (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Comparator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun minWith (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Comparator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun none (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun onReceiveOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/selects/SelectClause1; - public static final fun partition (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun receiveOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun reduce (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun reduceIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun requireNoNulls (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun requireNoNulls (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun sendBlocking (Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Object;)V - public static final fun single (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun single (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun singleOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun singleOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun sumBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun sumByDouble (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun take (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun single (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun singleOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun take (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun take$default (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun takeWhile (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun takeWhile (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun takeWhile$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun toChannel (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/SendChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toCollection (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toList (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toMap (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun toMap (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun toMutableList (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun toMap (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun toMutableList (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toMutableSet (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun toSet (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun withIndex (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun toSet (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final synthetic fun withIndex (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun withIndex$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static synthetic fun zip$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; } public final class kotlinx/coroutines/channels/ClosedReceiveChannelException : java/util/NoSuchElementException { diff --git a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt index 6bf6f88123..e0b4f9d2a5 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt @@ -70,89 +70,6 @@ public fun ReceiveChannel.onReceiveOrNull(): SelectClause1 { return (this as ReceiveChannel).onReceiveOrNull } -/** - * Subscribes to this [BroadcastChannel] and performs the specified action for each received element. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@ObsoleteCoroutinesApi -public suspend inline fun BroadcastChannel.consumeEach(action: (E) -> Unit): Unit = - consume { - for (element in this) action(element) - } - -// -------- Operations on ReceiveChannel -------- - -/** - * Returns a [List] containing all elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - */ -@OptIn(ExperimentalStdlibApi::class) -public suspend fun ReceiveChannel.toList(): List = buildList { - consumeEach { - add(it) - } -} - -/** - * Returns a [CompletionHandler] that invokes [cancel][ReceiveChannel.cancel] on the [ReceiveChannel] - * with the corresponding cause. See also [ReceiveChannel.consume]. - * - * **WARNING**: It is planned that in the future a second invocation of this method - * on an channel that is already being consumed is going to fail fast, that it - * immediately throws an [IllegalStateException]. - * See [this issue](https://github.com/Kotlin/kotlinx.coroutines/issues/167) - * for details. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel<*>.consumes(): CompletionHandler = { cause: Throwable? -> - cancelConsumed(cause) -} - -@PublishedApi -internal fun ReceiveChannel<*>.cancelConsumed(cause: Throwable?) { - cancel(cause?.let { - it as? CancellationException ?: CancellationException("Channel was consumed, consumer had failed", it) - }) -} - -/** - * Returns a [CompletionHandler] that invokes [cancel][ReceiveChannel.cancel] on all the - * specified [ReceiveChannel] instances with the corresponding cause. - * See also [ReceiveChannel.consumes()] for a version on one channel. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun consumesAll(vararg channels: ReceiveChannel<*>): CompletionHandler = - { cause: Throwable? -> - var exception: Throwable? = null - for (channel in channels) - try { - channel.cancelConsumed(cause) - } catch (e: Throwable) { - if (exception == null) { - exception = e - } else { - exception.addSuppressedThrowable(e) - } - } - exception?.let { throw it } - } - /** * Makes sure that the given [block] consumes all elements from the given channel * by always invoking [cancel][ReceiveChannel.cancel] after the execution of the block. @@ -188,2006 +105,35 @@ public suspend inline fun ReceiveChannel.consumeEach(action: (E) -> Unit) } /** - * Performs the given [action] for each received element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.consumeEachIndexed(action: (IndexedValue) -> Unit) { - var index = 0 - consumeEach { - action(IndexedValue(index++, it)) - } -} - -/** - * Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.elementAt(index: Int): E = - elementAtOrElse(index) { throw IndexOutOfBoundsException("ReceiveChannel doesn't contain element at index $index.") } - -/** - * Returns an element at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.elementAtOrElse(index: Int, defaultValue: (Int) -> E): E = - consume { - if (index < 0) - return defaultValue(index) - var count = 0 - for (element in this) { - if (index == count++) - return element - } - return defaultValue(index) - } - -/** - * Returns an element at the given [index] or `null` if the [index] is out of bounds of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.elementAtOrNull(index: Int): E? = - consume { - if (index < 0) - return null - var count = 0 - for (element in this) { - if (index == count++) - return element - } - return null - } - -/** - * Returns the first element matching the given [predicate], or `null` if no such element was found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.find(predicate: (E) -> Boolean): E? = - firstOrNull(predicate) - -/** - * Returns the last element matching the given [predicate], or `null` if no such element was found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.findLast(predicate: (E) -> Boolean): E? = - lastOrNull(predicate) - -/** - * Returns first element. - * @throws [NoSuchElementException] if the channel is empty. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.first(): E = - consume { - val iterator = iterator() - if (!iterator.hasNext()) - throw NoSuchElementException("ReceiveChannel is empty.") - return iterator.next() - } - -/** - * Returns the first element matching the given [predicate]. - * @throws [NoSuchElementException] if no such element is found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.first(predicate: (E) -> Boolean): E { - consumeEach { - if (predicate(it)) return it - } - throw NoSuchElementException("ReceiveChannel contains no element matching the predicate.") -} - -/** - * Returns the first element, or `null` if the channel is empty. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.firstOrNull(): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) - return null - return iterator.next() - } - -/** - * Returns the first element matching the given [predicate], or `null` if element was not found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.firstOrNull(predicate: (E) -> Boolean): E? { - consumeEach { - if (predicate(it)) return it - } - return null -} - -/** - * Returns first index of [element], or -1 if the channel does not contain element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.indexOf(element: E): Int { - var index = 0 - consumeEach { - if (element == it) - return index - index++ - } - return -1 -} - -/** - * Returns index of the first element matching the given [predicate], or -1 if the channel does not contain such element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.indexOfFirst(predicate: (E) -> Boolean): Int { - var index = 0 - consumeEach { - if (predicate(it)) - return index - index++ - } - return -1 -} - -/** - * Returns index of the last element matching the given [predicate], or -1 if the channel does not contain such element. + * Returns a [List] containing all elements. * * The operation is _terminal_. * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.indexOfLast(predicate: (E) -> Boolean): Int { - var lastIndex = -1 - var index = 0 +@OptIn(ExperimentalStdlibApi::class) +public suspend fun ReceiveChannel.toList(): List = buildList { consumeEach { - if (predicate(it)) - lastIndex = index - index++ + add(it) } - return lastIndex } /** - * Returns the last element. - * @throws [NoSuchElementException] if the channel is empty. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. + * Subscribes to this [BroadcastChannel] and performs the specified action for each received element. * * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.last(): E = +@ObsoleteCoroutinesApi +public suspend inline fun BroadcastChannel.consumeEach(action: (E) -> Unit): Unit = consume { - val iterator = iterator() - if (!iterator.hasNext()) - throw NoSuchElementException("ReceiveChannel is empty.") - var last = iterator.next() - while (iterator.hasNext()) - last = iterator.next() - return last + for (element in this) action(element) } -/** - * Returns the last element matching the given [predicate]. - * @throws [NoSuchElementException] if no such element is found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.last(predicate: (E) -> Boolean): E { - var last: E? = null - var found = false - consumeEach { - if (predicate(it)) { - last = it - found = true - } - } - if (!found) throw NoSuchElementException("ReceiveChannel contains no element matching the predicate.") - @Suppress("UNCHECKED_CAST") - return last as E -} -/** - * Returns last index of [element], or -1 if the channel does not contain element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.lastIndexOf(element: E): Int { - var lastIndex = -1 - var index = 0 - consumeEach { - if (element == it) - lastIndex = index - index++ - } - return lastIndex +@PublishedApi +internal fun ReceiveChannel<*>.cancelConsumed(cause: Throwable?) { + cancel(cause?.let { + it as? CancellationException ?: CancellationException("Channel was consumed, consumer had failed", it) + }) } -/** - * Returns the last element, or `null` if the channel is empty. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.lastOrNull(): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) - return null - var last = iterator.next() - while (iterator.hasNext()) - last = iterator.next() - return last - } - -/** - * Returns the last element matching the given [predicate], or `null` if no such element was found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.lastOrNull(predicate: (E) -> Boolean): E? { - var last: E? = null - consumeEach { - if (predicate(it)) { - last = it - } - } - return last -} - -/** - * Returns the single element, or throws an exception if the channel is empty or has more than one element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.single(): E = - consume { - val iterator = iterator() - if (!iterator.hasNext()) - throw NoSuchElementException("ReceiveChannel is empty.") - val single = iterator.next() - if (iterator.hasNext()) - throw IllegalArgumentException("ReceiveChannel has more than one element.") - return single - } - -/** - * Returns the single element matching the given [predicate], or throws exception if there is no or more than one matching element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.single(predicate: (E) -> Boolean): E { - var single: E? = null - var found = false - consumeEach { - if (predicate(it)) { - if (found) throw IllegalArgumentException("ReceiveChannel contains more than one matching element.") - single = it - found = true - } - } - if (!found) throw NoSuchElementException("ReceiveChannel contains no element matching the predicate.") - @Suppress("UNCHECKED_CAST") - return single as E -} - -/** - * Returns single element, or `null` if the channel is empty or has more than one element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.singleOrNull(): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) - return null - val single = iterator.next() - if (iterator.hasNext()) - return null - return single - } - -/** - * Returns the single element matching the given [predicate], or `null` if element was not found or more than one element was found. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.singleOrNull(predicate: (E) -> Boolean): E? { - var single: E? = null - var found = false - consumeEach { - if (predicate(it)) { - if (found) return null - single = it - found = true - } - } - if (!found) return null - return single -} - -/** - * Returns a channel containing all elements except first [n] elements. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.drop(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - require(n >= 0) { "Requested element count $n is less than zero." } - var remaining: Int = n - if (remaining > 0) - for (e in this@drop) { - remaining-- - if (remaining == 0) - break - } - for (e in this@drop) { - send(e) - } - } - -/** - * Returns a channel containing all elements except first elements that satisfy the given [predicate]. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.dropWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - for (e in this@dropWhile) { - if (!predicate(e)) { - send(e) - break - } - } - for (e in this@dropWhile) { - send(e) - } - } - -/** - * Returns a channel containing only elements matching the given [predicate]. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.filter(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - for (e in this@filter) { - if (predicate(e)) send(e) - } - } - -/** - * Returns a channel containing only elements matching the given [predicate]. - * @param [predicate] function that takes the index of an element and the element itself - * and returns the result of predicate evaluation on the element. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.filterIndexed(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (index: Int, E) -> Boolean): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - var index = 0 - for (e in this@filterIndexed) { - if (predicate(index++, e)) send(e) - } - } - -/** - * Appends all elements matching the given [predicate] to the given [destination]. - * @param [predicate] function that takes the index of an element and the element itself - * and returns the result of predicate evaluation on the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterIndexedTo(destination: C, predicate: (index: Int, E) -> Boolean): C { - consumeEachIndexed { (index, element) -> - if (predicate(index, element)) destination.add(element) - } - return destination -} - -/** - * Appends all elements matching the given [predicate] to the given [destination]. - * @param [predicate] function that takes the index of an element and the element itself - * and returns the result of predicate evaluation on the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterIndexedTo(destination: C, predicate: (index: Int, E) -> Boolean): C { - consumeEachIndexed { (index, element) -> - if (predicate(index, element)) destination.send(element) - } - return destination -} - -/** - * Returns a channel containing all elements not matching the given [predicate]. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.filterNot(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = - filter(context) { !predicate(it) } - -/** - * Returns a channel containing all elements that are not `null`. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -@Suppress("UNCHECKED_CAST") -public fun ReceiveChannel.filterNotNull(): ReceiveChannel = - filter { it != null } as ReceiveChannel - -/** - * Appends all elements that are not `null` to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { - consumeEach { - if (it != null) destination.add(it) - } - return destination -} - -/** - * Appends all elements that are not `null` to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { - consumeEach { - if (it != null) destination.send(it) - } - return destination -} - -/** - * Appends all elements not matching the given [predicate] to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterNotTo(destination: C, predicate: (E) -> Boolean): C { - consumeEach { - if (!predicate(it)) destination.add(it) - } - return destination -} - -/** - * Appends all elements not matching the given [predicate] to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterNotTo(destination: C, predicate: (E) -> Boolean): C { - consumeEach { - if (!predicate(it)) destination.send(it) - } - return destination -} - -/** - * Appends all elements matching the given [predicate] to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterTo(destination: C, predicate: (E) -> Boolean): C { - consumeEach { - if (predicate(it)) destination.add(it) - } - return destination -} - -/** - * Appends all elements matching the given [predicate] to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.filterTo(destination: C, predicate: (E) -> Boolean): C { - consumeEach { - if (predicate(it)) destination.send(it) - } - return destination -} - -/** - * Returns a channel containing first [n] elements. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.take(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - if (n == 0) return@produce - require(n >= 0) { "Requested element count $n is less than zero." } - var remaining: Int = n - for (e in this@take) { - send(e) - remaining-- - if (remaining == 0) - return@produce - } - } - -/** - * Returns a channel containing first elements satisfying the given [predicate]. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.takeWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - for (e in this@takeWhile) { - if (!predicate(e)) return@produce - send(e) - } - } - -/** - * Returns a [Map] containing key-value pairs provided by [transform] function - * applied to elements of the given channel. - * - * If any of two pairs would have the same key the last one gets added to the map. - * - * The returned map preserves the entry iteration order of the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.associate(transform: (E) -> Pair): Map = - associateTo(LinkedHashMap(), transform) - -/** - * Returns a [Map] containing the elements from the given channel indexed by the key - * returned from [keySelector] function applied to each element. - * - * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. - * - * The returned map preserves the entry iteration order of the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.associateBy(keySelector: (E) -> K): Map = - associateByTo(LinkedHashMap(), keySelector) - -/** - * Returns a [Map] containing the values provided by [valueTransform] and indexed by [keySelector] functions applied to elements of the given channel. - * - * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. - * - * The returned map preserves the entry iteration order of the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.associateBy(keySelector: (E) -> K, valueTransform: (E) -> V): Map = - associateByTo(LinkedHashMap(), keySelector, valueTransform) - -/** - * Populates and returns the [destination] mutable map with key-value pairs, - * where key is provided by the [keySelector] function applied to each element of the given channel - * and value is the element itself. - * - * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.associateByTo(destination: M, keySelector: (E) -> K): M { - consumeEach { - destination.put(keySelector(it), it) - } - return destination -} - -/** - * Populates and returns the [destination] mutable map with key-value pairs, - * where key is provided by the [keySelector] function and - * and value is provided by the [valueTransform] function applied to elements of the given channel. - * - * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.associateByTo(destination: M, keySelector: (E) -> K, valueTransform: (E) -> V): M { - consumeEach { - destination.put(keySelector(it), valueTransform(it)) - } - return destination -} - -/** - * Populates and returns the [destination] mutable map with key-value pairs - * provided by [transform] function applied to each element of the given channel. - * - * If any of two pairs would have the same key the last one gets added to the map. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.associateTo(destination: M, transform: (E) -> Pair): M { - consumeEach { - destination += transform(it) - } - return destination -} - -/** - * Send each element of the original channel - * and appends the results to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun > ReceiveChannel.toChannel(destination: C): C { - consumeEach { - destination.send(it) - } - return destination -} - -/** - * Appends all elements to the given [destination] collection. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun > ReceiveChannel.toCollection(destination: C): C { - consumeEach { - destination.add(it) - } - return destination -} - -/** - * Returns a [Map] filled with all elements of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel>.toMap(): Map = - toMap(LinkedHashMap()) - -/** - * Returns a [MutableMap] filled with all elements of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun > ReceiveChannel>.toMap(destination: M): M { - consumeEach { - destination += it - } - return destination -} - -/** - * Returns a [MutableList] filled with all elements of this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.toMutableList(): MutableList = - toCollection(ArrayList()) - -/** - * Returns a [Set] of all elements. - * - * The returned set preserves the element iteration order of the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.toSet(): Set = - this.toMutableSet() - -/** - * Returns a single channel of all elements from results of [transform] function being invoked on each element of original channel. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.flatMap(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> ReceiveChannel): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - for (e in this@flatMap) { - transform(e).toChannel(this) - } - } - -/** - * Groups elements of the original channel by the key returned by the given [keySelector] function - * applied to each element and returns a map where each group key is associated with a list of corresponding elements. - * - * The returned map preserves the entry iteration order of the keys produced from the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.groupBy(keySelector: (E) -> K): Map> = - groupByTo(LinkedHashMap(), keySelector) - -/** - * Groups values returned by the [valueTransform] function applied to each element of the original channel - * by the key returned by the given [keySelector] function applied to the element - * and returns a map where each group key is associated with a list of corresponding values. - * - * The returned map preserves the entry iteration order of the keys produced from the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.groupBy(keySelector: (E) -> K, valueTransform: (E) -> V): Map> = - groupByTo(LinkedHashMap(), keySelector, valueTransform) - -/** - * Groups elements of the original channel by the key returned by the given [keySelector] function - * applied to each element and puts to the [destination] map each group key associated with a list of corresponding elements. - * - * @return The [destination] map. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun >> ReceiveChannel.groupByTo(destination: M, keySelector: (E) -> K): M { - consumeEach { - val key = keySelector(it) - val list = destination.getOrPut(key) { ArrayList() } - list.add(it) - } - return destination -} - -/** - * Groups values returned by the [valueTransform] function applied to each element of the original channel - * by the key returned by the given [keySelector] function applied to the element - * and puts to the [destination] map each group key associated with a list of corresponding values. - * - * @return The [destination] map. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun >> ReceiveChannel.groupByTo(destination: M, keySelector: (E) -> K, valueTransform: (E) -> V): M { - consumeEach { - val key = keySelector(it) - val list = destination.getOrPut(key) { ArrayList() } - list.add(valueTransform(it)) - } - return destination -} - -/** - * Returns a channel containing the results of applying the given [transform] function - * to each element in the original channel. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.map(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - consumeEach { - send(transform(it)) - } - } - -/** - * Returns a channel containing the results of applying the given [transform] function - * to each element and its index in the original channel. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.mapIndexed(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - var index = 0 - for (e in this@mapIndexed) { - send(transform(index++, e)) - } - } - -/** - * Returns a channel containing only the non-null results of applying the given [transform] function - * to each element and its index in the original channel. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.mapIndexedNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R?): ReceiveChannel = - mapIndexed(context, transform).filterNotNull() - -/** - * Applies the given [transform] function to each element and its index in the original channel - * and appends only the non-null results to the given [destination]. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapIndexedNotNullTo(destination: C, transform: (index: Int, E) -> R?): C { - consumeEachIndexed { (index, element) -> - transform(index, element)?.let { destination.add(it) } - } - return destination -} - -/** - * Applies the given [transform] function to each element and its index in the original channel - * and appends only the non-null results to the given [destination]. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapIndexedNotNullTo(destination: C, transform: (index: Int, E) -> R?): C { - consumeEachIndexed { (index, element) -> - transform(index, element)?.let { destination.send(it) } - } - return destination -} - -/** - * Applies the given [transform] function to each element and its index in the original channel - * and appends the results to the given [destination]. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapIndexedTo(destination: C, transform: (index: Int, E) -> R): C { - var index = 0 - consumeEach { - destination.add(transform(index++, it)) - } - return destination -} - -/** - * Applies the given [transform] function to each element and its index in the original channel - * and appends the results to the given [destination]. - * @param [transform] function that takes the index of an element and the element itself - * and returns the result of the transform applied to the element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapIndexedTo(destination: C, transform: (index: Int, E) -> R): C { - var index = 0 - consumeEach { - destination.send(transform(index++, it)) - } - return destination -} - -/** - * Returns a channel containing only the non-null results of applying the given [transform] function - * to each element in the original channel. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.mapNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R?): ReceiveChannel = - map(context, transform).filterNotNull() - -/** - * Applies the given [transform] function to each element in the original channel - * and appends only the non-null results to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapNotNullTo(destination: C, transform: (E) -> R?): C { - consumeEach { - transform(it)?.let { destination.add(it) } - } - return destination -} - -/** - * Applies the given [transform] function to each element in the original channel - * and appends only the non-null results to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapNotNullTo(destination: C, transform: (E) -> R?): C { - consumeEach { - transform(it)?.let { destination.send(it) } - } - return destination -} - -/** - * Applies the given [transform] function to each element of the original channel - * and appends the results to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapTo(destination: C, transform: (E) -> R): C { - consumeEach { - destination.add(transform(it)) - } - return destination -} - -/** - * Applies the given [transform] function to each element of the original channel - * and appends the results to the given [destination]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.mapTo(destination: C, transform: (E) -> R): C { - consumeEach { - destination.send(transform(it)) - } - return destination -} - -/** - * Returns a channel of [IndexedValue] for each element of the original channel. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.withIndex(context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel> = - GlobalScope.produce(context, onCompletion = consumes()) { - var index = 0 - for (e in this@withIndex) { - send(IndexedValue(index++, e)) - } - } - -/** - * Returns a channel containing only distinct elements from the given channel. - * - * The elements in the resulting channel are in the same order as they were in the source channel. - * - * The operation is _intermediate_ and _stateful_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.distinct(): ReceiveChannel = - this.distinctBy { it } - -/** - * Returns a channel containing only elements from the given channel - * having distinct keys returned by the given [selector] function. - * - * The elements in the resulting channel are in the same order as they were in the source channel. - * - * The operation is _intermediate_ and _stateful_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.distinctBy(context: CoroutineContext = Dispatchers.Unconfined, selector: suspend (E) -> K): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumes()) { - val keys = HashSet() - for (e in this@distinctBy) { - val k = selector(e) - if (k !in keys) { - send(e) - keys += k - } - } - } - -/** - * Returns a mutable set containing all distinct elements from the given channel. - * - * The returned set preserves the element iteration order of the original channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.toMutableSet(): MutableSet = - toCollection(LinkedHashSet()) - -/** - * Returns `true` if all elements match the given [predicate]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.all(predicate: (E) -> Boolean): Boolean { - consumeEach { - if (!predicate(it)) return false - } - return true -} - -/** - * Returns `true` if channel has at least one element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.any(): Boolean = - consume { - return iterator().hasNext() - } - -/** - * Returns `true` if at least one element matches the given [predicate]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.any(predicate: (E) -> Boolean): Boolean { - consumeEach { - if (predicate(it)) return true - } - return false -} - -/** - * Returns the number of elements in this channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.count(): Int { - var count = 0 - consumeEach { count++ } - return count -} - -/** - * Returns the number of elements matching the given [predicate]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.count(predicate: (E) -> Boolean): Int { - var count = 0 - consumeEach { - if (predicate(it)) count++ - } - return count -} - -/** - * Accumulates value starting with [initial] value and applying [operation] from left to right to current accumulator value and each element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.fold(initial: R, operation: (acc: R, E) -> R): R { - var accumulator = initial - consumeEach { - accumulator = operation(accumulator, it) - } - return accumulator -} - -/** - * Accumulates value starting with [initial] value and applying [operation] from left to right - * to current accumulator value and each element with its index in the original channel. - * @param [operation] function that takes the index of an element, current accumulator value - * and the element itself, and calculates the next accumulator value. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.foldIndexed(initial: R, operation: (index: Int, acc: R, E) -> R): R { - var index = 0 - var accumulator = initial - consumeEach { - accumulator = operation(index++, accumulator, it) - } - return accumulator -} - -/** - * Returns the first element yielding the largest value of the given function or `null` if there are no elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.maxBy(selector: (E) -> R): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) return null - var maxElem = iterator.next() - var maxValue = selector(maxElem) - while (iterator.hasNext()) { - val e = iterator.next() - val v = selector(e) - if (maxValue < v) { - maxElem = e - maxValue = v - } - } - return maxElem - } - -/** - * Returns the first element having the largest value according to the provided [comparator] or `null` if there are no elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.maxWith(comparator: Comparator): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) return null - var max = iterator.next() - while (iterator.hasNext()) { - val e = iterator.next() - if (comparator.compare(max, e) < 0) max = e - } - return max - } - -/** - * Returns the first element yielding the smallest value of the given function or `null` if there are no elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun > ReceiveChannel.minBy(selector: (E) -> R): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) return null - var minElem = iterator.next() - var minValue = selector(minElem) - while (iterator.hasNext()) { - val e = iterator.next() - val v = selector(e) - if (minValue > v) { - minElem = e - minValue = v - } - } - return minElem - } - -/** - * Returns the first element having the smallest value according to the provided [comparator] or `null` if there are no elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.minWith(comparator: Comparator): E? = - consume { - val iterator = iterator() - if (!iterator.hasNext()) return null - var min = iterator.next() - while (iterator.hasNext()) { - val e = iterator.next() - if (comparator.compare(min, e) > 0) min = e - } - return min - } - -/** - * Returns `true` if the channel has no elements. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend fun ReceiveChannel.none(): Boolean = - consume { - return !iterator().hasNext() - } - -/** - * Returns `true` if no elements match the given [predicate]. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.none(predicate: (E) -> Boolean): Boolean { - consumeEach { - if (predicate(it)) return false - } - return true -} - -/** - * Accumulates value starting with the first element and applying [operation] from left to right to current accumulator value and each element. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.reduce(operation: (acc: S, E) -> S): S = - consume { - val iterator = this.iterator() - if (!iterator.hasNext()) throw UnsupportedOperationException("Empty channel can't be reduced.") - var accumulator: S = iterator.next() - while (iterator.hasNext()) { - accumulator = operation(accumulator, iterator.next()) - } - return accumulator - } - -/** - * Accumulates value starting with the first element and applying [operation] from left to right - * to current accumulator value and each element with its index in the original channel. - * @param [operation] function that takes the index of an element, current accumulator value - * and the element itself and calculates the next accumulator value. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.reduceIndexed(operation: (index: Int, acc: S, E) -> S): S = - consume { - val iterator = this.iterator() - if (!iterator.hasNext()) throw UnsupportedOperationException("Empty channel can't be reduced.") - var index = 1 - var accumulator: S = iterator.next() - while (iterator.hasNext()) { - accumulator = operation(index++, accumulator, iterator.next()) - } - return accumulator - } - -/** - * Returns the sum of all values produced by [selector] function applied to each element in the channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.sumBy(selector: (E) -> Int): Int { - var sum = 0 - consumeEach { - sum += selector(it) - } - return sum -} - -/** - * Returns the sum of all values produced by [selector] function applied to each element in the channel. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.sumByDouble(selector: (E) -> Double): Double { - var sum = 0.0 - consumeEach { - sum += selector(it) - } - return sum -} - -/** - * Returns an original collection containing all the non-`null` elements, throwing an [IllegalArgumentException] if there are any `null` elements. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.requireNoNulls(): ReceiveChannel = - map { it ?: throw IllegalArgumentException("null element found in $this.") } - -/** - * Splits the original channel into pair of lists, - * where *first* list contains elements for which [predicate] yielded `true`, - * while *second* list contains elements for which [predicate] yielded `false`. - * - * The operation is _terminal_. - * This function [consumes][ReceiveChannel.consume] all elements of the original [ReceiveChannel]. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public suspend inline fun ReceiveChannel.partition(predicate: (E) -> Boolean): Pair, List> { - val first = ArrayList() - val second = ArrayList() - consumeEach { - if (predicate(it)) { - first.add(it) - } else { - second.add(it) - } - } - return Pair(first, second) -} - -/** - * Returns a channel of pairs built from elements of both channels with same indexes. - * Resulting channel has length of shortest input channel. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][ReceiveChannel.consume] all elements of both the original [ReceiveChannel] and the `other` one. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public infix fun ReceiveChannel.zip(other: ReceiveChannel): ReceiveChannel> = - zip(other) { t1, t2 -> t1 to t2 } - -/** - * Returns a channel of values built from elements of both collections with same indexes using provided [transform]. Resulting channel has length of shortest input channels. - * - * The operation is _intermediate_ and _stateless_. - * This function [consumes][consume] all elements of both the original [ReceiveChannel] and the `other` one. - * - * **Note: This API will become obsolete in future updates with introduction of lazy asynchronous streams.** - * See [issue #254](https://github.com/Kotlin/kotlinx.coroutines/issues/254). - */ -@Deprecated( - message = "Channel operators are deprecated in favour of Flow and will be removed in 1.4.x", - level = DeprecationLevel.ERROR -) -public fun ReceiveChannel.zip(other: ReceiveChannel, context: CoroutineContext = Dispatchers.Unconfined, transform: (a: E, b: R) -> V): ReceiveChannel = - GlobalScope.produce(context, onCompletion = consumesAll(this, other)) { - val otherIterator = other.iterator() - this@zip.consumeEach { element1 -> - if (!otherIterator.hasNext()) return@consumeEach - val element2 = otherIterator.next() - send(transform(element1, element2)) - } - } diff --git a/kotlinx-coroutines-core/common/src/channels/Deprecated.kt b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt new file mode 100644 index 0000000000..963c168c7b --- /dev/null +++ b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt @@ -0,0 +1,406 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:JvmMultifileClass +@file:JvmName("ChannelsKt") +@file:Suppress("unused") + +package kotlinx.coroutines.channels + +import kotlinx.coroutines.* +import kotlin.coroutines.* +import kotlin.jvm.* + +@PublishedApi // Binary compatibility +internal fun consumesAll(vararg channels: ReceiveChannel<*>): CompletionHandler = + { cause: Throwable? -> + var exception: Throwable? = null + for (channel in channels) + try { + channel.cancelConsumed(cause) + } catch (e: Throwable) { + if (exception == null) { + exception = e + } else { + exception.addSuppressedThrowable(e) + } + } + exception?.let { throw it } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.elementAt(index: Int): E = consume { + if (index < 0) + throw IndexOutOfBoundsException("ReceiveChannel doesn't contain element at index $index.") + var count = 0 + for (element in this) { + if (index == count++) + return element + } + throw IndexOutOfBoundsException("ReceiveChannel doesn't contain element at index $index.") +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.elementAtOrNull(index: Int): E? = + consume { + if (index < 0) + return null + var count = 0 + for (element in this) { + if (index == count++) + return element + } + return null + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.first(): E = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + throw NoSuchElementException("ReceiveChannel is empty.") + return iterator.next() + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.firstOrNull(): E? = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + return null + return iterator.next() + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.indexOf(element: E): Int { + var index = 0 + consumeEach { + if (element == it) + return index + index++ + } + return -1 +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.last(): E = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + throw NoSuchElementException("ReceiveChannel is empty.") + var last = iterator.next() + while (iterator.hasNext()) + last = iterator.next() + return last + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.lastIndexOf(element: E): Int { + var lastIndex = -1 + var index = 0 + consumeEach { + if (element == it) + lastIndex = index + index++ + } + return lastIndex +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.lastOrNull(): E? = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + return null + var last = iterator.next() + while (iterator.hasNext()) + last = iterator.next() + return last + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.single(): E = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + throw NoSuchElementException("ReceiveChannel is empty.") + val single = iterator.next() + if (iterator.hasNext()) + throw IllegalArgumentException("ReceiveChannel has more than one element.") + return single + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.singleOrNull(): E? = + consume { + val iterator = iterator() + if (!iterator.hasNext()) + return null + val single = iterator.next() + if (iterator.hasNext()) + return null + return single + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.drop(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + require(n >= 0) { "Requested element count $n is less than zero." } + var remaining: Int = n + if (remaining > 0) + for (e in this@drop) { + remaining-- + if (remaining == 0) + break + } + for (e in this@drop) { + send(e) + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.dropWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + for (e in this@dropWhile) { + if (!predicate(e)) { + send(e) + break + } + } + for (e in this@dropWhile) { + send(e) + } + } + +@PublishedApi +internal fun ReceiveChannel.filter(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + for (e in this@filter) { + if (predicate(e)) send(e) + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.filterIndexed(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (index: Int, E) -> Boolean): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + var index = 0 + for (e in this@filterIndexed) { + if (predicate(index++, e)) send(e) + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.filterNot(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = + filter(context) { !predicate(it) } + +@PublishedApi +@Suppress("UNCHECKED_CAST") +internal fun ReceiveChannel.filterNotNull(): ReceiveChannel = + filter { it != null } as ReceiveChannel + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { + consumeEach { + if (it != null) destination.add(it) + } + return destination +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { + consumeEach { + if (it != null) destination.send(it) + } + return destination +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.take(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + if (n == 0) return@produce + require(n >= 0) { "Requested element count $n is less than zero." } + var remaining: Int = n + for (e in this@take) { + send(e) + remaining-- + if (remaining == 0) + return@produce + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.takeWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + for (e in this@takeWhile) { + if (!predicate(e)) return@produce + send(e) + } + } + +@PublishedApi +internal suspend fun > ReceiveChannel.toChannel(destination: C): C { + consumeEach { + destination.send(it) + } + return destination +} + +@PublishedApi +internal suspend fun > ReceiveChannel.toCollection(destination: C): C { + consumeEach { + destination.add(it) + } + return destination +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel>.toMap(): Map = + toMap(LinkedHashMap()) + +@PublishedApi +internal suspend fun > ReceiveChannel>.toMap(destination: M): M { + consumeEach { + destination += it + } + return destination +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.toMutableList(): MutableList = + toCollection(ArrayList()) + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.toSet(): Set = + this.toMutableSet() + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.flatMap(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> ReceiveChannel): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + for (e in this@flatMap) { + transform(e).toChannel(this) + } + } + +@PublishedApi +internal fun ReceiveChannel.map(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + consumeEach { + send(transform(it)) + } + } + +@PublishedApi +internal fun ReceiveChannel.mapIndexed(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + var index = 0 + for (e in this@mapIndexed) { + send(transform(index++, e)) + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.mapIndexedNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R?): ReceiveChannel = + mapIndexed(context, transform).filterNotNull() + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.mapNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R?): ReceiveChannel = + map(context, transform).filterNotNull() + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.withIndex(context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel> = + GlobalScope.produce(context, onCompletion = consumes()) { + var index = 0 + for (e in this@withIndex) { + send(IndexedValue(index++, e)) + } + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.distinct(): ReceiveChannel = + this.distinctBy { it } + +@PublishedApi +internal fun ReceiveChannel.distinctBy(context: CoroutineContext = Dispatchers.Unconfined, selector: suspend (E) -> K): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumes()) { + val keys = HashSet() + for (e in this@distinctBy) { + val k = selector(e) + if (k !in keys) { + send(e) + keys += k + } + } + } + +@PublishedApi +internal suspend fun ReceiveChannel.toMutableSet(): MutableSet = + toCollection(LinkedHashSet()) + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.any(): Boolean = + consume { + return iterator().hasNext() + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.count(): Int { + var count = 0 + consumeEach { count++ } + return count +} + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.maxWith(comparator: Comparator): E? = + consume { + val iterator = iterator() + if (!iterator.hasNext()) return null + var max = iterator.next() + while (iterator.hasNext()) { + val e = iterator.next() + if (comparator.compare(max, e) < 0) max = e + } + return max + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.minWith(comparator: Comparator): E? = + consume { + val iterator = iterator() + if (!iterator.hasNext()) return null + var min = iterator.next() + while (iterator.hasNext()) { + val e = iterator.next() + if (comparator.compare(min, e) > 0) min = e + } + return min + } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public suspend fun ReceiveChannel.none(): Boolean = + consume { + return !iterator().hasNext() + } + +@Deprecated(message = "Left for binary compatibility", level = DeprecationLevel.HIDDEN) +public fun ReceiveChannel.requireNoNulls(): ReceiveChannel = + map { it ?: throw IllegalArgumentException("null element found in $this.") } + +@Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) +public infix fun ReceiveChannel.zip(other: ReceiveChannel): ReceiveChannel> = + zip(other) { t1, t2 -> t1 to t2 } + +@PublishedApi // Binary compatibility +internal fun ReceiveChannel.zip(other: ReceiveChannel, context: CoroutineContext = Dispatchers.Unconfined, transform: (a: E, b: R) -> V): ReceiveChannel = + GlobalScope.produce(context, onCompletion = consumesAll(this, other)) { + val otherIterator = other.iterator() + this@zip.consumeEach { element1 -> + if (!otherIterator.hasNext()) return@consumeEach + val element2 = otherIterator.next() + send(transform(element1, element2)) + } + } + +@PublishedApi // Binary compatibility +internal fun ReceiveChannel<*>.consumes(): CompletionHandler = { cause: Throwable? -> + cancelConsumed(cause) +} From 6a6b34cf820d491700eeb7bc0e0e7ce01af66ae2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 9 Dec 2020 18:52:46 +0300 Subject: [PATCH 023/328] Adjust deprecations in reactive integrations * Remove all deprecated inline methods * Promote ERROR to HIDDEN where applicable * Promote WARNING to ERROR where applicable --- .../api/kotlinx-coroutines-core.api | 5 +++ .../api/kotlinx-coroutines-reactive.api | 10 +++--- .../src/Channel.kt | 16 +++++---- .../src/Convert.kt | 4 +-- .../src/Migration.kt | 6 ++-- .../src/Publish.kt | 24 ++++++-------- .../test/IntegrationTest.kt | 28 ++-------------- .../test/PublisherSubscriptionSelectTest.kt | 4 +-- .../api/kotlinx-coroutines-reactor.api | 6 ++-- .../kotlinx-coroutines-reactor/src/Convert.kt | 4 +-- .../kotlinx-coroutines-reactor/src/Flux.kt | 27 +++++++-------- .../src/Migration.kt | 4 +-- .../kotlinx-coroutines-reactor/src/Mono.kt | 22 ++++++------- .../test/ConvertTest.kt | 7 ++-- .../api/kotlinx-coroutines-rx2.api | 14 ++++---- .../kotlinx-coroutines-rx2/src/RxChannel.kt | 33 +++++++++++-------- .../src/RxCompletable.kt | 24 ++++++-------- .../kotlinx-coroutines-rx2/src/RxFlowable.kt | 2 +- .../kotlinx-coroutines-rx2/src/RxMaybe.kt | 24 ++++++-------- .../src/RxObservable.kt | 24 ++++++-------- .../kotlinx-coroutines-rx2/src/RxSingle.kt | 24 ++++++-------- .../test/IntegrationTest.kt | 2 +- .../test/ObservableSubscriptionSelectTest.kt | 4 +-- 23 files changed, 141 insertions(+), 177 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index f279d5509a..cf9906fc5a 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -674,6 +674,7 @@ public final class kotlinx/coroutines/channels/ChannelsKt { public static final synthetic fun count (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final synthetic fun distinct (Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun distinctBy (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun distinctBy$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun drop (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun drop$default (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun dropWhile (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; @@ -681,6 +682,7 @@ public final class kotlinx/coroutines/channels/ChannelsKt { public static final synthetic fun elementAt (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final synthetic fun elementAtOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun filter (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun filter$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun filterIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun filterIndexed$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun filterNot (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; @@ -697,7 +699,9 @@ public final class kotlinx/coroutines/channels/ChannelsKt { public static final synthetic fun lastIndexOf (Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final synthetic fun lastOrNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun map (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun map$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun mapIndexed (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun mapIndexed$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun mapIndexedNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun mapIndexedNotNull$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun mapNotNull (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; @@ -727,6 +731,7 @@ public final class kotlinx/coroutines/channels/ChannelsKt { public static synthetic fun withIndex$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun zip$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; } public final class kotlinx/coroutines/channels/ClosedReceiveChannelException : java/util/NoSuchElementException { diff --git a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api index 06ef048407..75f1b306d3 100644 --- a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api +++ b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api @@ -12,9 +12,9 @@ public final class kotlinx/coroutines/reactive/AwaitKt { public final class kotlinx/coroutines/reactive/ChannelKt { public static final fun collect (Lorg/reactivestreams/Publisher;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun consumeEach (Lorg/reactivestreams/Publisher;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun openSubscription (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun openSubscription$default (Lorg/reactivestreams/Publisher;IILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final fun toChannel (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; } public abstract interface class kotlinx/coroutines/reactive/ContextInjector { @@ -27,9 +27,9 @@ public final class kotlinx/coroutines/reactive/ConvertKt { } public final class kotlinx/coroutines/reactive/FlowKt { - public static final fun asFlow (Lorg/reactivestreams/Publisher;)Lkotlinx/coroutines/flow/Flow; - public static final fun asFlow (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/flow/Flow; - public static final fun asPublisher (Lkotlinx/coroutines/flow/Flow;)Lorg/reactivestreams/Publisher; + public static final synthetic fun asFlow (Lorg/reactivestreams/Publisher;)Lkotlinx/coroutines/flow/Flow; + public static final synthetic fun asFlow (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/flow/Flow; + public static final synthetic fun asPublisher (Lkotlinx/coroutines/flow/Flow;)Lorg/reactivestreams/Publisher; } public final class kotlinx/coroutines/reactive/FlowSubscription : kotlinx/coroutines/AbstractCoroutine, org/reactivestreams/Subscription { @@ -42,7 +42,7 @@ public final class kotlinx/coroutines/reactive/FlowSubscription : kotlinx/corout public final class kotlinx/coroutines/reactive/PublishKt { public static final fun publish (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lorg/reactivestreams/Publisher; - public static final fun publish (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lorg/reactivestreams/Publisher; + public static final synthetic fun publish (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lorg/reactivestreams/Publisher; public static synthetic fun publish$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/reactivestreams/Publisher; public static synthetic fun publish$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/reactivestreams/Publisher; public static final fun publishInternal (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Lorg/reactivestreams/Publisher; diff --git a/reactive/kotlinx-coroutines-reactive/src/Channel.kt b/reactive/kotlinx-coroutines-reactive/src/Channel.kt index 352a505a5f..854a8829fc 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Channel.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Channel.kt @@ -26,24 +26,26 @@ import org.reactivestreams.* */ @Deprecated( message = "Transforming publisher to channel is deprecated, use asFlow() instead", - level = DeprecationLevel.WARNING) // Will be error in 1.4 + level = DeprecationLevel.ERROR) // Will be error in 1.4 public fun Publisher.openSubscription(request: Int = 1): ReceiveChannel { val channel = SubscriptionChannel(request) subscribe(channel) return channel } -// Will be promoted to error in 1.3.0, removed in 1.4.0 -@Deprecated(message = "Use collect instead", level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.collect(action)")) -public suspend inline fun Publisher.consumeEach(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) - /** * Subscribes to this [Publisher] and performs the specified action for each received element. * Cancels subscription if any exception happens during collect. */ public suspend inline fun Publisher.collect(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) + toChannel().consumeEach(action) + +@PublishedApi +internal fun Publisher.toChannel(request: Int = 1): ReceiveChannel { + val channel = SubscriptionChannel(request) + subscribe(channel) + return channel +} @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "SubscriberImplementation") private class SubscriptionChannel( diff --git a/reactive/kotlinx-coroutines-reactive/src/Convert.kt b/reactive/kotlinx-coroutines-reactive/src/Convert.kt index 8f4b26d377..3cb05b60fd 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Convert.kt @@ -16,8 +16,8 @@ import kotlin.coroutines.* * @param context -- the coroutine context from which the resulting observable is going to be signalled */ @Deprecated(message = "Deprecated in the favour of consumeAsFlow()", - level = DeprecationLevel.WARNING, // Error in 1.4 - replaceWith = ReplaceWith("this.consumeAsFlow().asPublisher()")) + level = DeprecationLevel.ERROR, // Error in 1.4 + replaceWith = ReplaceWith("this.consumeAsFlow().asPublisher(context)", imports = ["kotlinx.coroutines.flow.consumeAsFlow"])) public fun ReceiveChannel.asPublisher(context: CoroutineContext = EmptyCoroutineContext): Publisher = publish(context) { for (t in this@asPublisher) send(t) diff --git a/reactive/kotlinx-coroutines-reactive/src/Migration.kt b/reactive/kotlinx-coroutines-reactive/src/Migration.kt index 1bba746c03..b949f22665 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Migration.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Migration.kt @@ -14,7 +14,7 @@ import org.reactivestreams.* // Binary compatibility with Spring 5.2 RC @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactive.* instead of kotlinx.coroutines.reactive.FlowKt", - level = DeprecationLevel.ERROR + level = DeprecationLevel.HIDDEN ) @JvmName("asFlow") public fun Publisher.asFlowDeprecated(): Flow = asFlow() @@ -22,7 +22,7 @@ public fun Publisher.asFlowDeprecated(): Flow = asFlow() // Binary compatibility with Spring 5.2 RC @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactive.* instead of kotlinx.coroutines.reactive.FlowKt", - level = DeprecationLevel.ERROR + level = DeprecationLevel.HIDDEN ) @JvmName("asPublisher") public fun Flow.asPublisherDeprecated(): Publisher = asPublisher() @@ -30,7 +30,7 @@ public fun Flow.asPublisherDeprecated(): Publisher = asPublisher @FlowPreview @Deprecated( message = "batchSize parameter is deprecated, use .buffer() instead to control the backpressure", - level = DeprecationLevel.ERROR, + level = DeprecationLevel.HIDDEN, replaceWith = ReplaceWith("asFlow().buffer(batchSize)", imports = ["kotlinx.coroutines.flow.*"]) ) public fun Publisher.asFlow(batchSize: Int): Flow = asFlow().buffer(batchSize) diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index f66b1c3bae..d2cdbab881 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -1,9 +1,6 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ - -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.reactive import kotlinx.atomicfu.* @@ -43,17 +40,6 @@ public fun publish( return publishInternal(GlobalScope, context, DEFAULT_HANDLER, block) } -@Deprecated( - message = "CoroutineScope.publish is deprecated in favour of top-level publish", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("publish(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0. Binary compatibility with Spring -@LowPriorityInOverloadResolution -public fun CoroutineScope.publish( - context: CoroutineContext = EmptyCoroutineContext, - @BuilderInference block: suspend ProducerScope.() -> Unit -): Publisher = publishInternal(this, context, DEFAULT_HANDLER ,block) - /** @suppress For internal use from other reactive integration modules only */ @InternalCoroutinesApi public fun publishInternal( @@ -288,3 +274,13 @@ public class PublisherCoroutine( private fun Throwable.isFatal() = this is VirtualMachineError || this is ThreadDeath || this is LinkageError } + +@Deprecated( + message = "CoroutineScope.publish is deprecated in favour of top-level publish", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("publish(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0. Binary compatibility with Spring +public fun CoroutineScope.publish( + context: CoroutineContext = EmptyCoroutineContext, + @BuilderInference block: suspend ProducerScope.() -> Unit +): Publisher = publishInternal(this, context, DEFAULT_HANDLER, block) diff --git a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt index a1467080ac..72479b5c6a 100644 --- a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt @@ -81,30 +81,6 @@ class IntegrationTest( assertEquals(1, cnt) } - @Test - fun testNumbers() = runBlocking { - val n = 100 * stressTestMultiplier - val pub = publish(ctx(coroutineContext)) { - for (i in 1..n) { - send(i) - if (delay) delay(1) - } - } - assertEquals(1, pub.awaitFirst()) - assertEquals(1, pub.awaitFirstOrDefault(0)) - assertEquals(1, pub.awaitFirstOrNull()) - assertEquals(1, pub.awaitFirstOrElse { 0 }) - assertEquals(n, pub.awaitLast()) - assertFailsWith { pub.awaitSingle() } - assertFailsWith { pub.awaitSingleOrDefault(0) } - assertFailsWith { pub.awaitSingleOrNull() } - assertFailsWith { pub.awaitSingleOrElse { 0 } } - checkNumbers(n, pub) - val channel = pub.openSubscription() - checkNumbers(n, channel.asPublisher(ctx(coroutineContext))) - channel.cancel() - } - @Test fun testCancelWithoutValue() = runTest { val job = launch(Job(), start = CoroutineStart.UNDISPATCHED) { @@ -118,7 +94,7 @@ class IntegrationTest( } @Test - fun testEmptySingle() = runTest(unhandled = listOf({e -> e is NoSuchElementException})) { + fun testEmptySingle() = runTest(unhandled = listOf { e -> e is NoSuchElementException }) { expect(1) val job = launch(Job(), start = CoroutineStart.UNDISPATCHED) { publish { @@ -270,4 +246,4 @@ class IntegrationTest( assertEquals(n, last) } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt index 790cf7ec7c..740fd86ae4 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt @@ -28,8 +28,8 @@ class PublisherSubscriptionSelectTest(private val request: Int) : TestBase() { var a = 0 var b = 0 // open two subs - val channelA = source.openSubscription(request) - val channelB = source.openSubscription(request) + val channelA = source.toChannel(request) + val channelB = source.toChannel(request) loop@ while (true) { val done: Int = select { channelA.onReceiveCatching { result -> diff --git a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api index b46fe338e5..3a1c8b7d31 100644 --- a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api +++ b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api @@ -6,19 +6,19 @@ public final class kotlinx/coroutines/reactor/ConvertKt { } public final class kotlinx/coroutines/reactor/FlowKt { - public static final fun asFlux (Lkotlinx/coroutines/flow/Flow;)Lreactor/core/publisher/Flux; + public static final synthetic fun asFlux (Lkotlinx/coroutines/flow/Flow;)Lreactor/core/publisher/Flux; } public final class kotlinx/coroutines/reactor/FluxKt { public static final fun flux (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Flux; - public static final fun flux (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Flux; + public static final synthetic fun flux (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Flux; public static synthetic fun flux$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lreactor/core/publisher/Flux; public static synthetic fun flux$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lreactor/core/publisher/Flux; } public final class kotlinx/coroutines/reactor/MonoKt { public static final fun mono (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Mono; - public static final fun mono (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Mono; + public static final synthetic fun mono (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Mono; public static synthetic fun mono$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lreactor/core/publisher/Mono; public static synthetic fun mono$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lreactor/core/publisher/Mono; } diff --git a/reactive/kotlinx-coroutines-reactor/src/Convert.kt b/reactive/kotlinx-coroutines-reactor/src/Convert.kt index 7807549ce1..3b08bd6639 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Convert.kt @@ -46,8 +46,8 @@ public fun Deferred.asMono(context: CoroutineContext): Mono = mono(co * @param context -- the coroutine context from which the resulting flux is going to be signalled */ @Deprecated(message = "Deprecated in the favour of consumeAsFlow()", - level = DeprecationLevel.WARNING, - replaceWith = ReplaceWith("this.consumeAsFlow().asFlux()")) + level = DeprecationLevel.ERROR, + replaceWith = ReplaceWith("this.consumeAsFlow().asFlux(context)", imports = ["kotlinx.coroutines.flow.consumeAsFlow"])) public fun ReceiveChannel.asFlux(context: CoroutineContext = EmptyCoroutineContext): Flux = flux(context) { for (t in this@asFlux) send(t) diff --git a/reactive/kotlinx-coroutines-reactor/src/Flux.kt b/reactive/kotlinx-coroutines-reactor/src/Flux.kt index 8d4f9cc969..b7143288ee 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Flux.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Flux.kt @@ -1,10 +1,7 @@ - /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.reactor import kotlinx.coroutines.* @@ -15,7 +12,6 @@ import reactor.core.* import reactor.core.publisher.* import reactor.util.context.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold reactive [Flux] that runs a given [block] in a coroutine. @@ -43,18 +39,6 @@ public fun flux( return Flux.from(reactorPublish(GlobalScope, context, block)) } -@Deprecated( - message = "CoroutineScope.flux is deprecated in favour of top-level flux", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("flux(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0. Binary compatibility with Spring -@LowPriorityInOverloadResolution -public fun CoroutineScope.flux( - context: CoroutineContext = EmptyCoroutineContext, - @BuilderInference block: suspend ProducerScope.() -> Unit -): Flux = - Flux.from(reactorPublish(this, context, block)) - private fun reactorPublish( scope: CoroutineScope, context: CoroutineContext = EmptyCoroutineContext, @@ -80,3 +64,14 @@ private val REACTOR_HANDLER: (Throwable, CoroutineContext) -> Unit = { e, ctx -> } } } + +@Deprecated( + message = "CoroutineScope.flux is deprecated in favour of top-level flux", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("flux(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0. Binary compatibility with Spring +public fun CoroutineScope.flux( + context: CoroutineContext = EmptyCoroutineContext, + @BuilderInference block: suspend ProducerScope.() -> Unit +): Flux = + Flux.from(reactorPublish(this, context, block)) diff --git a/reactive/kotlinx-coroutines-reactor/src/Migration.kt b/reactive/kotlinx-coroutines-reactor/src/Migration.kt index ec5674d932..d5d84f5c2a 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Migration.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Migration.kt @@ -11,7 +11,7 @@ import reactor.core.publisher.* @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactor.* instead of kotlinx.coroutines.reactor.FlowKt", - level = DeprecationLevel.ERROR -) + level = DeprecationLevel.HIDDEN +) // Compatibility with Spring 5.2-RC @JvmName("asFlux") public fun Flow.asFluxDeprecated(): Flux = asFlux() diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 6786f1abab..307ec2278c 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -34,17 +34,6 @@ public fun mono( return monoInternal(GlobalScope, context, block) } -@Deprecated( - message = "CoroutineScope.mono is deprecated in favour of top-level mono", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("mono(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 -@LowPriorityInOverloadResolution -public fun CoroutineScope.mono( - context: CoroutineContext = EmptyCoroutineContext, - block: suspend CoroutineScope.() -> T? -): Mono = monoInternal(this, context, block) - private fun monoInternal( scope: CoroutineScope, // support for legacy mono in scope context: CoroutineContext, @@ -89,3 +78,14 @@ private class MonoCoroutine( override fun isDisposed(): Boolean = disposed } + +@Deprecated( + message = "CoroutineScope.mono is deprecated in favour of top-level mono", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("mono(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 +public fun CoroutineScope.mono( + context: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> T? +): Mono = monoInternal(this, context, block) + diff --git a/reactive/kotlinx-coroutines-reactor/test/ConvertTest.kt b/reactive/kotlinx-coroutines-reactor/test/ConvertTest.kt index 82664a2dee..8af6d3c455 100644 --- a/reactive/kotlinx-coroutines-reactor/test/ConvertTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/ConvertTest.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* import kotlinx.coroutines.reactive.* import org.junit.* import org.junit.Test @@ -96,7 +97,7 @@ class ConvertTest : TestBase() { delay(50) send("K") } - val flux = c.asFlux(Dispatchers.Unconfined) + val flux = c.consumeAsFlow().asFlux(Dispatchers.Unconfined) checkMonoValue(flux.reduce { t1, t2 -> t1 + t2 }) { assertEquals("OK", it) } @@ -110,7 +111,7 @@ class ConvertTest : TestBase() { delay(50) throw TestException("K") } - val flux = c.asFlux(Dispatchers.Unconfined) + val flux = c.consumeAsFlow().asFlux(Dispatchers.Unconfined) val mono = mono(Dispatchers.Unconfined) { var result = "" try { @@ -125,4 +126,4 @@ class ConvertTest : TestBase() { assertEquals("OK", it) } } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api index 4370325f58..eb5e2fb4ad 100644 --- a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api +++ b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api @@ -14,15 +14,15 @@ public final class kotlinx/coroutines/rx2/RxAwaitKt { public final class kotlinx/coroutines/rx2/RxChannelKt { public static final fun collect (Lio/reactivex/MaybeSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun collect (Lio/reactivex/ObservableSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun consumeEach (Lio/reactivex/MaybeSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun consumeEach (Lio/reactivex/ObservableSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun openSubscription (Lio/reactivex/MaybeSource;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun openSubscription (Lio/reactivex/ObservableSource;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final fun toChannel (Lio/reactivex/MaybeSource;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final fun toChannel (Lio/reactivex/ObservableSource;)Lkotlinx/coroutines/channels/ReceiveChannel; } public final class kotlinx/coroutines/rx2/RxCompletableKt { public static final fun rxCompletable (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Completable; - public static final fun rxCompletable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Completable; + public static final synthetic fun rxCompletable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Completable; public static synthetic fun rxCompletable$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Completable; public static synthetic fun rxCompletable$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Completable; } @@ -47,21 +47,21 @@ public final class kotlinx/coroutines/rx2/RxConvertKt { public final class kotlinx/coroutines/rx2/RxFlowableKt { public static final fun rxFlowable (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Flowable; - public static final fun rxFlowable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Flowable; + public static final synthetic fun rxFlowable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Flowable; public static synthetic fun rxFlowable$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Flowable; public static synthetic fun rxFlowable$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Flowable; } public final class kotlinx/coroutines/rx2/RxMaybeKt { public static final fun rxMaybe (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Maybe; - public static final fun rxMaybe (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Maybe; + public static final synthetic fun rxMaybe (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Maybe; public static synthetic fun rxMaybe$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Maybe; public static synthetic fun rxMaybe$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Maybe; } public final class kotlinx/coroutines/rx2/RxObservableKt { public static final fun rxObservable (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Observable; - public static final fun rxObservable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Observable; + public static final synthetic fun rxObservable (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Observable; public static synthetic fun rxObservable$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Observable; public static synthetic fun rxObservable$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Observable; } @@ -72,7 +72,7 @@ public final class kotlinx/coroutines/rx2/RxSchedulerKt { public final class kotlinx/coroutines/rx2/RxSingleKt { public static final fun rxSingle (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Single; - public static final fun rxSingle (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Single; + public static final synthetic fun rxSingle (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lio/reactivex/Single; public static synthetic fun rxSingle$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Single; public static synthetic fun rxSingle$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/reactivex/Single; } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt index a129196a13..35f3391eb1 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt @@ -9,6 +9,7 @@ import io.reactivex.disposables.* import kotlinx.atomicfu.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.internal.* +import kotlinx.coroutines.flow.* /** * Subscribes to this [MaybeSource] and returns a channel to receive elements emitted by it. @@ -17,7 +18,7 @@ import kotlinx.coroutines.internal.* * This API is deprecated in the favour of [Flow]. * [MaybeSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. */ -@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.WARNING) // Will be hidden in 1.4 +@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 public fun MaybeSource.openSubscription(): ReceiveChannel { val channel = SubscriptionChannel() subscribe(channel) @@ -31,36 +32,40 @@ public fun MaybeSource.openSubscription(): ReceiveChannel { * This API is deprecated in the favour of [Flow]. * [ObservableSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. */ -@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.WARNING) // Will be hidden in 1.4 +@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 public fun ObservableSource.openSubscription(): ReceiveChannel { val channel = SubscriptionChannel() subscribe(channel) return channel } -// Will be promoted to error in 1.3.0, removed in 1.4.0 -@Deprecated(message = "Use collect instead", level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.collect(action)")) -public suspend inline fun MaybeSource.consumeEach(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) - -// Will be promoted to error in 1.3.0, removed in 1.4.0 -@Deprecated(message = "Use collect instead", level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.collect(action)")) -public suspend inline fun ObservableSource.consumeEach(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) - /** * Subscribes to this [MaybeSource] and performs the specified action for each received element. * Cancels subscription if any exception happens during collect. */ public suspend inline fun MaybeSource.collect(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) + toChannel().consumeEach(action) /** * Subscribes to this [ObservableSource] and performs the specified action for each received element. * Cancels subscription if any exception happens during collect. */ public suspend inline fun ObservableSource.collect(action: (T) -> Unit): Unit = - openSubscription().consumeEach(action) + toChannel().consumeEach(action) + +@PublishedApi +internal fun MaybeSource.toChannel(): ReceiveChannel { + val channel = SubscriptionChannel() + subscribe(channel) + return channel +} + +@PublishedApi +internal fun ObservableSource.toChannel(): ReceiveChannel { + val channel = SubscriptionChannel() + subscribe(channel) + return channel +} @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") private class SubscriptionChannel : diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt index 3400278cb3..eee84b1bb6 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt @@ -2,14 +2,11 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.rx2 import io.reactivex.* import kotlinx.coroutines.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold [Completable] that runs a given [block] in a coroutine and emits its result. @@ -28,17 +25,6 @@ public fun rxCompletable( return rxCompletableInternal(GlobalScope, context, block) } -@Deprecated( - message = "CoroutineScope.rxCompletable is deprecated in favour of top-level rxCompletable", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("rxCompletable(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 -@LowPriorityInOverloadResolution -public fun CoroutineScope.rxCompletable( - context: CoroutineContext = EmptyCoroutineContext, - block: suspend CoroutineScope.() -> Unit -): Completable = rxCompletableInternal(this, context, block) - private fun rxCompletableInternal( scope: CoroutineScope, // support for legacy rxCompletable in scope context: CoroutineContext, @@ -72,3 +58,13 @@ private class RxCompletableCoroutine( } } } + +@Deprecated( + message = "CoroutineScope.rxCompletable is deprecated in favour of top-level rxCompletable", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("rxCompletable(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 +public fun CoroutineScope.rxCompletable( + context: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> Unit +): Completable = rxCompletableInternal(this, context, block) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt index 8dfe95762e..6b299437aa 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt @@ -43,7 +43,7 @@ public fun rxFlowable( @Deprecated( message = "CoroutineScope.rxFlowable is deprecated in favour of top-level rxFlowable", - level = DeprecationLevel.ERROR, + level = DeprecationLevel.HIDDEN, replaceWith = ReplaceWith("rxFlowable(context, block)") ) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 @LowPriorityInOverloadResolution diff --git a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt index c4ca54cf48..9682373a79 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt @@ -2,14 +2,11 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.rx2 import io.reactivex.* import kotlinx.coroutines.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold [maybe][Maybe] that will run a given [block] in a coroutine and emits its result. @@ -29,17 +26,6 @@ public fun rxMaybe( return rxMaybeInternal(GlobalScope, context, block) } -@Deprecated( - message = "CoroutineScope.rxMaybe is deprecated in favour of top-level rxMaybe", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("rxMaybe(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 -@LowPriorityInOverloadResolution -public fun CoroutineScope.rxMaybe( - context: CoroutineContext = EmptyCoroutineContext, - block: suspend CoroutineScope.() -> T? -): Maybe = rxMaybeInternal(this, context, block) - private fun rxMaybeInternal( scope: CoroutineScope, // support for legacy rxMaybe in scope context: CoroutineContext, @@ -73,3 +59,13 @@ private class RxMaybeCoroutine( } } } + +@Deprecated( + message = "CoroutineScope.rxMaybe is deprecated in favour of top-level rxMaybe", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("rxMaybe(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 +public fun CoroutineScope.rxMaybe( + context: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> T? +): Maybe = rxMaybeInternal(this, context, block) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index edbb106253..56ce30c370 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -2,8 +2,6 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.rx2 import io.reactivex.* @@ -14,7 +12,6 @@ import kotlinx.coroutines.channels.* import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold [observable][Observable] that will run a given [block] in a coroutine. @@ -42,17 +39,6 @@ public fun rxObservable( return rxObservableInternal(GlobalScope, context, block) } -@Deprecated( - message = "CoroutineScope.rxObservable is deprecated in favour of top-level rxObservable", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("rxObservable(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 -@LowPriorityInOverloadResolution -public fun CoroutineScope.rxObservable( - context: CoroutineContext = EmptyCoroutineContext, - @BuilderInference block: suspend ProducerScope.() -> Unit -): Observable = rxObservableInternal(this, context, block) - private fun rxObservableInternal( scope: CoroutineScope, // support for legacy rxObservable in scope context: CoroutineContext, @@ -212,3 +198,13 @@ internal fun Throwable.isFatal() = try { } catch (e: Throwable) { true } + +@Deprecated( + message = "CoroutineScope.rxObservable is deprecated in favour of top-level rxObservable", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("rxObservable(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 +public fun CoroutineScope.rxObservable( + context: CoroutineContext = EmptyCoroutineContext, + @BuilderInference block: suspend ProducerScope.() -> Unit +): Observable = rxObservableInternal(this, context, block) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt index 3b81445312..49a9bb8dd6 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt @@ -2,14 +2,11 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - package kotlinx.coroutines.rx2 import io.reactivex.* import kotlinx.coroutines.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold [single][Single] that will run a given [block] in a coroutine and emits its result. @@ -28,17 +25,6 @@ public fun rxSingle( return rxSingleInternal(GlobalScope, context, block) } -@Deprecated( - message = "CoroutineScope.rxSingle is deprecated in favour of top-level rxSingle", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("rxSingle(context, block)") -) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 -@LowPriorityInOverloadResolution -public fun CoroutineScope.rxSingle( - context: CoroutineContext = EmptyCoroutineContext, - block: suspend CoroutineScope.() -> T -): Single = rxSingleInternal(this, context, block) - private fun rxSingleInternal( scope: CoroutineScope, // support for legacy rxSingle in scope context: CoroutineContext, @@ -72,3 +58,13 @@ private class RxSingleCoroutine( } } } + +@Deprecated( + message = "CoroutineScope.rxSingle is deprecated in favour of top-level rxSingle", + level = DeprecationLevel.HIDDEN, + replaceWith = ReplaceWith("rxSingle(context, block)") +) // Since 1.3.0, will be error in 1.3.1 and hidden in 1.4.0 +public fun CoroutineScope.rxSingle( + context: CoroutineContext = EmptyCoroutineContext, + block: suspend CoroutineScope.() -> T +): Single = rxSingleInternal(this, context, block) diff --git a/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt index 540fa76b7e..4bf3e4536e 100644 --- a/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt @@ -92,7 +92,7 @@ class IntegrationTest( assertEquals(n, observable.awaitLast()) assertFailsWith { observable.awaitSingle() } checkNumbers(n, observable) - val channel = observable.openSubscription() + val channel = observable.toChannel() checkNumbers(n, channel.consumeAsFlow().asObservable(ctx(coroutineContext))) channel.cancel() } diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt index 396d19d159..2c22cbf035 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableSubscriptionSelectTest.kt @@ -20,8 +20,8 @@ class ObservableSubscriptionSelectTest : TestBase() { var a = 0 var b = 0 // open two subs - val channelA = source.openSubscription() - val channelB = source.openSubscription() + val channelA = source.toChannel() + val channelB = source.toChannel() loop@ while (true) { val done: Int = select { channelA.onReceiveCatching { result -> From 80862a5ac63c1d7d43d3a2f7c83048b3512f98c5 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 8 Apr 2021 15:34:11 +0300 Subject: [PATCH 024/328] Fix a flaky test in MonoTest (#2635) --- .../test/MonoTest.kt | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt index 97b195c517..a98c514f19 100644 --- a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt @@ -311,6 +311,7 @@ class MonoTest : TestBase() { * this is considered normal behavior and exceptions are not propagated. */ @Test fun testDownstreamCancellationDoesNotThrow() = runTest { + var i = 0 /** Attach a hook that handles exceptions from publishers that are known to be disposed of. We don't expect it * to be fired in this case, as the reason for the publisher in this test to accept an exception is simply * cancellation from the downstream. */ @@ -319,15 +320,20 @@ class MonoTest : TestBase() { t } /** A Mono that doesn't emit a value and instead waits indefinitely. */ - val mono = mono { expect(3); delay(Long.MAX_VALUE) } - .doOnSubscribe { expect(2) } + val mono = mono(Dispatchers.Unconfined) { expect(5 * i + 3); delay(Long.MAX_VALUE) } + .doOnSubscribe { expect(5 * i + 2) } .doOnNext { expectUnreached() } .doOnSuccess { expectUnreached() } .doOnError { expectUnreached() } - .doOnCancel { expect(4) } - expect(1) - mono.awaitCancelAndJoin() - finish(5) + .doOnCancel { expect(5 * i + 4) } + val n = 1000 + repeat(n) { + i = it + expect(5 * i + 1) + mono.awaitCancelAndJoin() + expect(5 * i + 5) + } + finish(5 * n + 1) Hooks.resetOnOperatorError("testDownstreamCancellationDoesNotThrow") } @@ -335,47 +341,45 @@ class MonoTest : TestBase() { * error is propagated to [Hooks.onOperatorError]. */ @Test fun testRethrowingDownstreamCancellation() = runTest { + var i = 0 /** Attach a hook that handles exceptions from publishers that are known to be disposed of. We expect it * to be fired in this case. */ Hooks.onOperatorError("testDownstreamCancellationDoesNotThrow") { t, a -> - expect(5) + expect(i * 6 + 5) t } /** A Mono that doesn't emit a value and instead waits indefinitely, and, when cancelled, throws. */ - val mono = mono { - expect(3); + val mono = mono(Dispatchers.Unconfined) { + expect(i * 6 + 3) try { delay(Long.MAX_VALUE) } catch (e: CancellationException) { throw TestException() } } - .doOnSubscribe { expect(2) } + .doOnSubscribe { expect(i * 6 + 2) } .doOnNext { expectUnreached() } .doOnSuccess { expectUnreached() } .doOnError { expectUnreached() } - .doOnCancel { expect(4) } - expect(1) - mono.awaitCancelAndJoin() - finish(6) /** if this line fails, see the comment for [awaitCancelAndJoin] */ + .doOnCancel { expect(i * 6 + 4) } + val n = 1000 + repeat(n) { + i = it + expect(i * 6 + 1) + mono.awaitCancelAndJoin() + expect(i * 6 + 6) + } + finish(n * 6 + 1) Hooks.resetOnOperatorError("testDownstreamCancellationDoesNotThrow") } - /** Run the given [Mono], cancel it, wait for the cancellation handler to finish, and *return only then*. + /** Run the given [Publisher], cancel it, wait for the cancellation handler to finish, and return only then. * - * There are no guarantees about the execution context in which the cancellation handler will run, but we have - * to wait for it to finish to check its behavior. The contraption below seems to ensure that everything works out. - * If it stops giving that guarantee, then [testRethrowingDownstreamCancellation] should fail more or less - * consistently because the hook won't have enough time to fire before a call to [finish]. - */ - private suspend fun Mono.awaitCancelAndJoin() = coroutineScope { - val job = async(start = CoroutineStart.UNDISPATCHED) { + * Will not work in the general case, but here, when the publisher uses [Dispatchers.Unconfined], this seems to + * ensure that the cancellation handler will have nowhere to execute but serially with the cancellation. */ + private suspend fun Publisher.awaitCancelAndJoin() = coroutineScope { + async(start = CoroutineStart.UNDISPATCHED) { awaitFirstOrNull() - } - newSingleThreadContext("monoCancellationCleanup").use { pool -> - launch(pool) { - job.cancelAndJoin() - } - }.join() + }.cancelAndJoin() } } From 12f4dbc9acfdb3e8d117e6eff21a455afcf1746c Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 8 Apr 2021 19:17:09 +0300 Subject: [PATCH 025/328] Remove debug output from test --- .../jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt index 555d99fc94..ae2554ad4a 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt @@ -67,7 +67,6 @@ class StackTraceRecoveryChannelsTest : TestBase() { block() expectUnreached() } catch (e: RecoverableTestException) { - e.printStackTrace() verifyStackTrace("channels/${name.methodName}", e) } } From d905e82162b9a05cae5b8d6801a2eadbdcb1a3aa Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 13 Apr 2021 13:05:08 +0300 Subject: [PATCH 026/328] Embrace new channel API, stabilize callbackFlow (#2643) * Embrace new channel API * Introduce trySendBlocking and deprecate sendBlocking * Use it in callbackFlow example * Stabilize callbackFlow and channelFlow as they finally have error-safe API * Irrelevant: migrate from deprecated stdlib API to be able to build with Kotlin 1.5 Co-authored-by: Roman Elizarov --- .../api/kotlinx-coroutines-core.api | 1 + .../common/src/flow/Builders.kt | 11 +-- .../jvm/src/channels/Channels.kt | 77 ++++++++++++++++++- .../jvm/test/VirtualTimeSource.kt | 2 +- .../jvm/test/channels/ChannelsJvmTest.kt | 33 +++++++- .../jvm/test/flow/StateFlowStressTest.kt | 4 +- .../jvm/test/scheduling/SchedulerTestBase.kt | 4 +- .../kotlinx-coroutines-rx2/src/RxConvert.kt | 10 ++- .../kotlinx-coroutines-rx3/src/RxConvert.kt | 10 ++- 9 files changed, 128 insertions(+), 24 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index cf9906fc5a..48df9648aa 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -727,6 +727,7 @@ public final class kotlinx/coroutines/channels/ChannelsKt { public static final synthetic fun toMutableList (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toMutableSet (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final synthetic fun toSet (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun trySendBlocking (Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Object;)Ljava/lang/Object; public static final synthetic fun withIndex (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun withIndex$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final synthetic fun zip (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/channels/ReceiveChannel; diff --git a/kotlinx-coroutines-core/common/src/flow/Builders.kt b/kotlinx-coroutines-core/common/src/flow/Builders.kt index 3a43ccb7e0..83ae9136eb 100644 --- a/kotlinx-coroutines-core/common/src/flow/Builders.kt +++ b/kotlinx-coroutines-core/common/src/flow/Builders.kt @@ -261,7 +261,6 @@ public fun flowViaChannel( * } * ``` */ -@ExperimentalCoroutinesApi public fun channelFlow(@BuilderInference block: suspend ProducerScope.() -> Unit): Flow = ChannelFlowBuilder(block) @@ -302,11 +301,10 @@ public fun channelFlow(@BuilderInference block: suspend ProducerScope.() * override fun onNextValue(value: T) { * // To avoid blocking you can configure channel capacity using * // either buffer(Channel.CONFLATED) or buffer(Channel.UNLIMITED) to avoid overfill - * try { - * sendBlocking(value) - * } catch (e: Exception) { - * // Handle exception from the channel: failure in flow or premature closing - * } + * trySendBlocking(value) + * .onFailure { throwable -> + * // Downstream has been cancelled or failed, can log here + * } * } * override fun onApiError(cause: Throwable) { * cancel(CancellationException("API Error", cause)) @@ -327,7 +325,6 @@ public fun channelFlow(@BuilderInference block: suspend ProducerScope.() * > `awaitClose` block can be called at any time due to asynchronous nature of cancellation, even * > concurrently with the call of the callback. */ -@ExperimentalCoroutinesApi public fun callbackFlow(@BuilderInference block: suspend ProducerScope.() -> Unit): Flow = CallbackFlowBuilder(block) // ChannelFlow implementation that is the first in the chain of flow operations and introduces (builds) a flow diff --git a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt index 52adfea276..ea0b639e90 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt @@ -10,12 +10,44 @@ package kotlinx.coroutines.channels import kotlinx.coroutines.* /** - * Adds [element] into to this channel, **blocking** the caller while this channel is full, - * or throws exception if the channel [Channel.isClosedForSend] (see [Channel.close] for details). + * **Deprecated** blocking variant of send. + * This method is deprecated in the favour of [trySendBlocking]. * - * This is a way to call [Channel.send] method inside a blocking code using [runBlocking], - * so this function should not be used from coroutine. + * `sendBlocking` is a dangerous primitive — it throws an exception + * if the channel was closed or, more commonly, cancelled. + * Cancellation exceptions in non-blocking code are unexpected and frequently + * trigger internal failures. + * + * These bugs are hard-to-spot during code review and they forced users to write + * their own wrappers around `sendBlocking`. + * So this function is deprecated and replaced with a more explicit primitive. + * + * The real-world example of broken usage with Firebase: + * + * ```kotlin + * callbackFlow { + * val listener = object : ValueEventListener { + * override fun onDataChange(snapshot: DataSnapshot) { + * // This line may fail and crash the app when the downstream flow is cancelled + * sendBlocking(DataSnapshot(snapshot)) + * } + * + * override fun onCancelled(error: DatabaseError) { + * close(error.toException()) + * } + * } + * + * firebaseQuery.addValueEventListener(listener) + * awaitClose { firebaseQuery.removeEventListener(listener) } + * } + * ``` */ +@Deprecated( + level = DeprecationLevel.WARNING, + message = "Deprecated in the favour of 'trySendBlocking'. " + + "Consider handling the result of 'trySendBlocking' explicitly and rethrow exception if necessary", + replaceWith = ReplaceWith("trySendBlocking(element)") +) public fun SendChannel.sendBlocking(element: E) { // fast path if (offer(element)) @@ -25,3 +57,40 @@ public fun SendChannel.sendBlocking(element: E) { send(element) } } + +/** + * Adds [element] into to this channel, **blocking** the caller while this channel is full, + * and returning either [successful][ChannelResult.isSuccess] result when the element was added, or + * failed result representing closed channel with a corresponding exception. + * + * This is a way to call [Channel.send] method in a safe manner inside a blocking code using [runBlocking] and catching, + * so this function should not be used from coroutine. + * + * Example of usage: + * + * ``` + * // From callback API + * channel.trySendBlocking(element) + * .onSuccess { /* request next element or debug log */ } + * .onFailure { t: Throwable? -> /* throw or log */ } + * ``` + * + * For this operation it is guaranteed that [failure][ChannelResult.failed] always contains an exception in it. + * + * @throws [InterruptedException] if the current thread is interrupted during the blocking send operation. + */ +@Throws(InterruptedException::class) +public fun SendChannel.trySendBlocking(element: E): ChannelResult { + /* + * Sent successfully -- bail out. + * But failure may indicate either that the channel it full or that + * it is close. Go to slow path on failure to simplify the successful path and + * to materialize default exception. + */ + trySend(element).onSuccess { return ChannelResult.success(Unit) } + return runBlocking { + val r = runCatching { send(element) } + if (r.isSuccess) ChannelResult.success(Unit) + else ChannelResult.closed(r.exceptionOrNull()) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt index ca399f5325..d2dcfd2f89 100644 --- a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt +++ b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt @@ -142,7 +142,7 @@ internal class VirtualTimeSource( } private fun minParkedTill(): Long = - threads.values.map { if (it.permit) NOT_PARKED else it.parkedTill }.min() ?: NOT_PARKED + threads.values.map { if (it.permit) NOT_PARKED else it.parkedTill }.minOrNull() ?: NOT_PARKED @Synchronized fun shutdown() { diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt index da20f0c5ee..2e4ba9ac0e 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt @@ -11,7 +11,7 @@ import kotlin.test.* class ChannelsJvmTest : TestBase() { @Test - fun testBlocking() { + fun testTrySendBlocking() { val ch = Channel() val sum = GlobalScope.async { var sum = 0 @@ -19,9 +19,38 @@ class ChannelsJvmTest : TestBase() { sum } repeat(10) { - ch.sendBlocking(it) + assertTrue(ch.trySendBlocking(it).isSuccess) } ch.close() assertEquals(45, runBlocking { sum.await() }) } + + // Uncomment lines when migrated to 1.5, these are bugs in inline classes codegen + @Test + fun testTrySendBlockingClosedChannel() { + run { + val channel = Channel().also { it.close() } + channel.trySendBlocking(Unit) + .onSuccess { expectUnreached() } + .onFailure { assertTrue(it is ClosedSendChannelException) } +// .also { assertTrue { it.isClosed } } + } + + run { + val channel = Channel().also { it.close(TestException()) } + channel.trySendBlocking(Unit) + .onSuccess { expectUnreached() } + .onFailure { assertTrue(it is TestException) } +// .also { assertTrue { it.isClosed } } + } + + run { + val channel = Channel().also { it.cancel(TestCancellationException()) } + channel.trySendBlocking(Unit) + .onSuccess { expectUnreached() } + .onFailure { assertTrue(it is TestCancellationException) } +// .also { assertTrue { it.isClosed } } + } + } + } diff --git a/kotlinx-coroutines-core/jvm/test/flow/StateFlowStressTest.kt b/kotlinx-coroutines-core/jvm/test/flow/StateFlowStressTest.kt index dc3cd43c93..e55eaad127 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/StateFlowStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/flow/StateFlowStressTest.kt @@ -62,7 +62,7 @@ class StateFlowStressTest : TestBase() { for (second in 1..nSeconds) { delay(1000) val cs = collected.map { it.sum() } - println("$second: emitted=${emitted.sum()}, collected=${cs.min()}..${cs.max()}") + println("$second: emitted=${emitted.sum()}, collected=${cs.minOrNull()}..${cs.maxOrNull()}") } emitters.cancelAndJoin() collectors.cancelAndJoin() @@ -77,4 +77,4 @@ class StateFlowStressTest : TestBase() { @Test fun testTenEmittersAndCollectors() = stress(10, 10) -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt index bfabf5b2f3..72d7c90882 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt @@ -49,7 +49,7 @@ abstract class SchedulerTestBase : TestBase() { private fun maxSequenceNumber(): Int? { return Thread.getAllStackTraces().keys.asSequence().filter { it is CoroutineScheduler.Worker } - .map { sequenceNumber(it.name) }.max() + .map { sequenceNumber(it.name) }.maxOrNull() } private fun sequenceNumber(threadName: String): Int { @@ -105,4 +105,4 @@ abstract class SchedulerTestBase : TestBase() { } } } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt index 14c24942ac..a64e6d02ed 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt @@ -82,10 +82,14 @@ public fun ObservableSource.asFlow(): Flow = callbackFlow { override fun onComplete() { close() } override fun onSubscribe(d: Disposable) { if (!disposableRef.compareAndSet(null, d)) d.dispose() } override fun onNext(t: T) { + /* + * Channel was closed by the downstream, so the exception (if any) + * also was handled by the same downstream + */ try { - sendBlocking(t) - } catch (ignored: Throwable) { // TODO: Replace when this issue is fixed: https://github.com/Kotlin/kotlinx.coroutines/issues/974 - // Is handled by the downstream flow + trySendBlocking(t) + } catch (e: InterruptedException) { + // RxJava interrupts the source } } override fun onError(e: Throwable) { close(e) } diff --git a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt index 63e30f2617..b0ba4ab2e0 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt @@ -82,10 +82,14 @@ public fun ObservableSource.asFlow(): Flow = callbackFlow { override fun onComplete() { close() } override fun onSubscribe(d: Disposable) { if (!disposableRef.compareAndSet(null, d)) d.dispose() } override fun onNext(t: T) { + /* + * Channel was closed by the downstream, so the exception (if any) + * also was handled by the same downstream + */ try { - sendBlocking(t) - } catch (ignored: Throwable) { // TODO: Replace when this issue is fixed: https://github.com/Kotlin/kotlinx.coroutines/issues/974 - // Is handled by the downstream flow + trySendBlocking(t) + } catch (e: InterruptedException) { + // RxJava interrupts the source } } override fun onError(e: Throwable) { close(e) } From df16bbf8d6dd3031a6a402b39ef06d0d27d6cdec Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 13 Apr 2021 15:00:58 +0300 Subject: [PATCH 027/328] Better NonCancellable docs (#2633) --- kotlinx-coroutines-core/common/src/NonCancellable.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kotlinx-coroutines-core/common/src/NonCancellable.kt b/kotlinx-coroutines-core/common/src/NonCancellable.kt index a9c68f090a..5d3644ba91 100644 --- a/kotlinx-coroutines-core/common/src/NonCancellable.kt +++ b/kotlinx-coroutines-core/common/src/NonCancellable.kt @@ -18,6 +18,11 @@ import kotlin.coroutines.* * // this code will not be cancelled * } * ``` + * + * **WARNING**: This object is not designed to be used with [launch], [async], and other coroutine builders. + * if you write `launch(NonCancellable) { ... }` then not only the newly launched job will not be cancelled + * when the parent is cancelled, the whole parent-child relation between parent and child is severed. + * The parent will not wait for the child's completion, nor will be cancelled when the child crashed. */ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { /** From 7b1f3b379f1863521a26a7d3086b943d7fe3b58e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 13 Apr 2021 16:39:26 +0300 Subject: [PATCH 028/328] Introduce runningFold operator, make scan alias to runningFold (#2645) * Otherwise Kotlin users with non-reactive background get confused by flow/stdlib inconsistency * Make it experimental to delay the final decision about the name Fixes #2641 --- .../api/kotlinx-coroutines-core.api | 1 + .../common/src/flow/operators/Transform.kt | 18 ++++++++++++++++-- .../common/test/flow/operators/ScanTest.kt | 7 +++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 48df9648aa..23f29b02a3 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -994,6 +994,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static synthetic fun retry$default (Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static synthetic fun retry$default (Lkotlinx/coroutines/flow/Flow;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun retryWhen (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; + public static final fun runningFold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun runningReduce (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun sample (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun sample-HG0u8IE (Lkotlinx/coroutines/flow/Flow;D)Lkotlinx/coroutines/flow/Flow; diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt index 80a2cf27d4..5929886495 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt @@ -74,6 +74,20 @@ public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform return@transform emit(value) } +/** + * Folds the given flow with [operation], emitting every intermediate result, including [initial] value. + * Note that initial value should be immutable (or should not be mutated) as it is shared between different collectors. + * For example: + * ``` + * flowOf(1, 2, 3).scan(emptyList()) { acc, value -> acc + value }.toList() + * ``` + * will produce `[], [1], [1, 2], [1, 2, 3]]`. + * + * This function is an alias to [runningFold] operator. + */ +@ExperimentalCoroutinesApi +public fun Flow.scan(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = runningFold(initial, operation) + /** * Folds the given flow with [operation], emitting every intermediate result, including [initial] value. * Note that initial value should be immutable (or should not be mutated) as it is shared between different collectors. @@ -84,7 +98,7 @@ public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform * will produce `[], [1], [1, 2], [1, 2, 3]]`. */ @ExperimentalCoroutinesApi -public fun Flow.scan(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = flow { +public fun Flow.runningFold(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = flow { var accumulator: R = initial emit(accumulator) collect { value -> @@ -100,7 +114,7 @@ public fun Flow.scan(initial: R, @BuilderInference operation: suspend * * For example: * ``` - * flowOf(1, 2, 3, 4).runningReduce { (v1, v2) -> v1 + v2 }.toList() + * flowOf(1, 2, 3, 4).runningReduce { acc, value -> acc + value }.toList() * ``` * will produce `[1, 3, 6, 10]` */ diff --git a/kotlinx-coroutines-core/common/test/flow/operators/ScanTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/ScanTest.kt index 20e07873bb..c6be36d01e 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/ScanTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/ScanTest.kt @@ -23,6 +23,13 @@ class ScanTest : TestBase() { assertEquals(listOf(emptyList(), listOf(1), listOf(1, 2), listOf(1, 2, 3)), result) } + @Test + fun testFoldWithInitial() = runTest { + val flow = flowOf(1, 2, 3) + val result = flow.runningFold(emptyList()) { acc, value -> acc + value }.toList() + assertEquals(listOf(emptyList(), listOf(1), listOf(1, 2), listOf(1, 2, 3)), result) + } + @Test fun testNulls() = runTest { val flow = flowOf(null, 2, null, null, null, 5) From 3c83c0cfea619f68f1eb323773d1f057f294023f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 13 Apr 2021 16:47:55 +0300 Subject: [PATCH 029/328] Deprecate SendChannel.offer and ReceiveChannel.poll, replace their usages along the codebase (#2644) * Deprecate SendChannel.offer and replace its usages along the codebase * Deprecate ReceiveChannel.poll and replace its usages along the codebase Co-authored-by: Roman Elizarov Addresses #974 --- .../common/src/channels/AbstractChannel.kt | 1 + .../common/src/channels/Channel.kt | 191 ++++++++++-------- .../src/channels/ConflatedBroadcastChannel.kt | 2 +- .../common/src/channels/ConflatedChannel.kt | 4 +- .../common/src/channels/LinkedListChannel.kt | 2 +- .../common/src/flow/SharedFlow.kt | 2 +- .../common/src/flow/StateFlow.kt | 2 +- .../common/src/flow/internal/Combine.kt | 2 +- .../common/test/channels/ArrayChannelTest.kt | 20 +- .../test/channels/BasicOperationsTest.kt | 45 +---- .../channels/ChannelBufferOverflowTest.kt | 26 +-- .../channels/ConflatedBroadcastChannelTest.kt | 2 +- .../test/channels/ConflatedChannelTest.kt | 14 +- .../test/channels/LinkedListChannelTest.kt | 4 +- .../test/channels/RendezvousChannelTest.kt | 12 +- .../flow/channels/ChannelBuildersFlowTest.kt | 12 +- .../test/flow/channels/ChannelFlowTest.kt | 22 +- .../test/flow/sharing/ShareInFusionTest.kt | 4 +- .../common/test/flow/sharing/ShareInTest.kt | 6 +- .../jvm/src/channels/Channels.kt | 2 +- .../jvm/src/channels/TickerChannels.kt | 8 +- .../channels/testCancelledOffer.txt | 10 - .../ReusableCancellableContinuationTest.kt | 2 +- .../jvm/test/RunInterruptibleTest.kt | 2 +- ...annelCancelUndeliveredElementStressTest.kt | 30 +-- .../ChannelUndeliveredElementStressTest.kt | 2 +- ...nflatedBroadcastChannelNotifyStressTest.kt | 6 +- .../ConflatedChannelCloseStressTest.kt | 12 +- .../test/channels/TickerChannelCommonTest.kt | 8 +- .../StackTraceRecoveryChannelsTest.kt | 19 -- .../test/exceptions/StackTraceRecoveryTest.kt | 2 +- .../jvm/test/flow/CallbackFlowTest.kt | 6 +- .../jvm/test/lincheck/ChannelsLincheckTest.kt | 30 +-- .../test/PublisherAsFlowTest.kt | 2 +- .../src/Channel.kt | 2 +- .../src/Publish.kt | 2 +- .../src/ReactiveFlow.kt | 2 +- .../test/PublisherAsFlowTest.kt | 2 +- .../kotlinx-coroutines-rx2/src/RxChannel.kt | 4 +- .../src/RxObservable.kt | 2 +- .../test/ObservableSourceAsFlowStressTest.kt | 2 +- .../kotlinx-coroutines-rx3/src/RxChannel.kt | 4 +- .../src/RxObservable.kt | 2 +- .../test/ObservableSourceAsFlowStressTest.kt | 2 +- ui/coroutines-guide-ui.md | 18 +- .../src/JavaFxConvert.kt | 15 +- .../test/JavaFxObservableAsFlowTest.kt | 16 ++ .../test/guide/example-ui-actor-02.kt | 2 +- .../test/guide/example-ui-actor-03.kt | 4 +- .../test/guide/example-ui-blocking-01.kt | 2 +- .../test/guide/example-ui-blocking-02.kt | 2 +- .../test/guide/example-ui-blocking-03.kt | 2 +- 52 files changed, 289 insertions(+), 310 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 52e47227ad..bcf1921594 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -137,6 +137,7 @@ internal abstract class AbstractSendChannel( } override fun offer(element: E): Boolean { + // Temporary migration for offer users who rely on onUndeliveredElement try { return super.offer(element) } catch (e: Throwable) { diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 7b6cc0ad9d..f006efc720 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -24,7 +24,7 @@ import kotlin.jvm.* public interface SendChannel { /** * Returns `true` if this channel was closed by an invocation of [close]. This means that - * calling [send] or [offer] will result in an exception. + * calling [send] will result in an exception. * * **Note: This is an experimental api.** This property may change its semantics and/or name in the future. */ @@ -51,7 +51,7 @@ public interface SendChannel { * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. * * This function can be used in [select] invocations with the [onSend] clause. - * Use [offer] to try sending to this channel without waiting. + * Use [trySend] to try sending to this channel without waiting. */ public suspend fun send(element: E) @@ -64,23 +64,6 @@ public interface SendChannel { */ public val onSend: SelectClause2> - /** - * Immediately adds the specified [element] to this channel, if this doesn't violate its capacity restrictions, - * and returns `true`. Otherwise, just returns `false`. This is a synchronous variant of [send] which backs off - * in situations when `send` suspends. - * - * Throws an exception if the channel [is closed for `send`][isClosedForSend] (see [close] for details). - * - * When `offer` call returns `false` it guarantees that the element was not delivered to the consumer and it - * it does not call `onUndeliveredElement` that was installed for this channel. If the channel was closed, - * then it calls `onUndeliveredElement` before throwing an exception. - * See "Undelivered elements" section in [Channel] documentation for details on handling undelivered elements. - */ - public fun offer(element: E): Boolean { - val result = trySend(element) - if (result.isSuccess) return true - throw recoverStackTrace(result.exceptionOrNull() ?: return false) - } /** * Immediately adds the specified [element] to this channel, if this doesn't violate its capacity restrictions, @@ -103,7 +86,7 @@ public interface SendChannel { * on the side of [ReceiveChannel] starts returning `true` only after all previously sent elements * are received. * - * A channel that was closed without a [cause] throws a [ClosedSendChannelException] on attempts to [send] or [offer] + * A channel that was closed without a [cause] throws a [ClosedSendChannelException] on attempts to [send] * and [ClosedReceiveChannelException] on attempts to [receive][ReceiveChannel.receive]. * A channel that was closed with non-null [cause] is called a _failed_ channel. Attempts to send or * receive on a failed channel throw the specified [cause] exception. @@ -122,10 +105,11 @@ public interface SendChannel { * * the cause of `close` or `cancel` otherwise. * * Example of usage (exception handling is omitted): + * * ``` * val events = Channel(UNLIMITED) * callbackBasedApi.registerCallback { event -> - * events.offer(event) + * events.trySend(event) * } * * val uiUpdater = launch(Dispatchers.Main, parent = UILifecycle) { @@ -134,7 +118,6 @@ public interface SendChannel { * } * * events.invokeOnClose { callbackBasedApi.stop() } - * * ``` * * **Note: This is an experimental api.** This function may change its semantics, parameters or return type in the future. @@ -146,6 +129,33 @@ public interface SendChannel { */ @ExperimentalCoroutinesApi public fun invokeOnClose(handler: (cause: Throwable?) -> Unit) + + /** + * **Deprecated** offer method. + * + * This method was deprecated in the favour of [trySend]. + * It has proven itself as the most error-prone method in Channel API: + * + * * `Boolean` return type creates the false sense of security, implying that `false` + * is returned instead of throwing an exception. + * * It was used mostly from non-suspending APIs where CancellationException triggered + * internal failures in the application (the most common source of bugs). + * * Due to signature and explicit `if (ch.offer(...))` checks it was easy to + * oversee such error during code review. + * * Its name was not aligned with the rest of the API and tried to mimic Java's queue instead. + * + * See https://github.com/Kotlin/kotlinx.coroutines/issues/974 for more context. + */ + @Deprecated( + level = DeprecationLevel.WARNING, + message = "Deprecated in the favour of 'trySend' method", + replaceWith = ReplaceWith("trySend(element).isSuccess") + ) // Since 1.5.0 + public fun offer(element: E): Boolean { + val result = trySend(element) + if (result.isSuccess) return true + throw recoverStackTrace(result.exceptionOrNull() ?: return false) + } } /** @@ -188,7 +198,7 @@ public interface ReceiveChannel { * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. * * This function can be used in [select] invocations with the [onReceive] clause. - * Use [poll] to try receiving from this channel without waiting. + * Use [tryReceive] to try receiving from this channel without waiting. */ public suspend fun receive(): E @@ -200,51 +210,6 @@ public interface ReceiveChannel { */ public val onReceive: SelectClause1 - /** - * This function was deprecated since 1.3.0 and is no longer recommended to use - * or to implement in subclasses. - * - * It had the following pitfalls: - * - Didn't allow to distinguish 'null' as "closed channel" from "null as a value" - * - Was throwing if the channel has failed even though its signature may suggest it returns 'null' - * - It didn't really belong to core channel API and can be exposed as an extension instead. - * - * @suppress doc - */ - @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - @LowPriorityInOverloadResolution - @Deprecated( - message = "Deprecated in favor of receiveCatching", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("receiveCatching().getOrNull()") - ) // Warning since 1.3.0, error in 1.5.0, will be hidden in 1.6.0 - public suspend fun receiveOrNull(): E? = receiveCatching().getOrNull() - - /** - * This function was deprecated since 1.3.0 and is no longer recommended to use - * or to implement in subclasses. - * See [receiveOrNull] documentation. - * - * @suppress **Deprecated**: in favor of onReceiveCatching extension. - */ - @Deprecated( - message = "Deprecated in favor of onReceiveCatching extension", - level = DeprecationLevel.ERROR, - replaceWith = ReplaceWith("onReceiveCatching") - ) // Warning since 1.3.0, error in 1.5.0, will be hidden or removed in 1.6.0 - public val onReceiveOrNull: SelectClause1 - get() { - return object : SelectClause1 { - @InternalCoroutinesApi - override fun registerSelectClause1(select: SelectInstance, block: suspend (E?) -> R) { - onReceiveCatching.registerSelectClause1(select) { - it.exceptionOrNull()?.let { throw it } - block(it.getOrNull()) - } - } - } - } - /** * Retrieves and removes an element from this channel if it's not empty, or suspends the caller while this channel is empty. * This method returns [ChannelResult] with the value of an element successfully retrieved from the channel @@ -262,7 +227,7 @@ public interface ReceiveChannel { * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. * * This function can be used in [select] invocations with the [onReceiveCatching] clause. - * Use [poll] to try receiving from this channel without waiting. + * Use [tryReceive] to try receiving from this channel without waiting. */ public suspend fun receiveCatching(): ChannelResult @@ -273,17 +238,6 @@ public interface ReceiveChannel { */ public val onReceiveCatching: SelectClause1> - /** - * Retrieves and removes an element from this channel if it's not empty or returns `null` if the channel is empty - * or is [is closed for `receive`][isClosedForReceive] without a cause. - * It throws the original [close][SendChannel.close] cause exception if the channel has _failed_. - */ - public fun poll(): E? { - val result = tryReceive() - if (result.isSuccess) return result.getOrThrow() - throw recoverStackTrace(result.exceptionOrNull() ?: return null) - } - /** * Retrieves and removes an element from this channel if it's not empty, returning a [successful][ChannelResult.success] * result, returns [failed][ChannelResult.failed] result if the channel is empty, and [closed][ChannelResult.closed] @@ -325,6 +279,75 @@ public interface ReceiveChannel { */ @Deprecated(level = DeprecationLevel.HIDDEN, message = "Since 1.2.0, binary compatibility with versions <= 1.1.x") public fun cancel(cause: Throwable? = null): Boolean + + /** + * **Deprecated** poll method. + * + * This method was deprecated in the favour of [tryReceive]. + * It has proven itself as error-prone method in Channel API: + * + * * Nullable return type creates the false sense of security, implying that `null` + * is returned instead of throwing an exception. + * * It was used mostly from non-suspending APIs where CancellationException triggered + * internal failures in the application (the most common source of bugs). + * * Its name was not aligned with the rest of the API and tried to mimic Java's queue instead. + * + * See https://github.com/Kotlin/kotlinx.coroutines/issues/974 for more context. + */ + @Deprecated(level = DeprecationLevel.WARNING, + message = "Deprecated in the favour of 'tryReceive'", + replaceWith = ReplaceWith("tryReceive().getOrNull()") + ) // Since 1.5.0 + public fun poll(): E? { + val result = tryReceive() + if (result.isSuccess) return result.getOrThrow() + throw recoverStackTrace(result.exceptionOrNull() ?: return null) + } + + /** + * This function was deprecated since 1.3.0 and is no longer recommended to use + * or to implement in subclasses. + * + * It had the following pitfalls: + * - Didn't allow to distinguish 'null' as "closed channel" from "null as a value" + * - Was throwing if the channel has failed even though its signature may suggest it returns 'null' + * - It didn't really belong to core channel API and can be exposed as an extension instead. + * + * @suppress doc + */ + @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") + @LowPriorityInOverloadResolution + @Deprecated( + message = "Deprecated in favor of receiveCatching", + level = DeprecationLevel.ERROR, + replaceWith = ReplaceWith("receiveCatching().getOrNull()") + ) // Warning since 1.3.0, error in 1.5.0, will be hidden in 1.6.0 + public suspend fun receiveOrNull(): E? = receiveCatching().getOrNull() + + /** + * This function was deprecated since 1.3.0 and is no longer recommended to use + * or to implement in subclasses. + * See [receiveOrNull] documentation. + * + * @suppress **Deprecated**: in favor of onReceiveCatching extension. + */ + @Deprecated( + message = "Deprecated in favor of onReceiveCatching extension", + level = DeprecationLevel.ERROR, + replaceWith = ReplaceWith("onReceiveCatching") + ) // Warning since 1.3.0, error in 1.5.0, will be hidden or removed in 1.6.0 + public val onReceiveOrNull: SelectClause1 + get() { + return object : SelectClause1 { + @InternalCoroutinesApi + override fun registerSelectClause1(select: SelectInstance, block: suspend (E?) -> R) { + onReceiveCatching.registerSelectClause1(select) { + it.exceptionOrNull()?.let { throw it } + block(it.getOrNull()) + } + } + } + } } /** @@ -544,14 +567,14 @@ public interface ChannelIterator { * * * When `capacity` is [Channel.UNLIMITED] — it creates a channel with effectively unlimited buffer. * This channel has a linked-list buffer of unlimited capacity (limited only by available memory). - * [Sending][send] to this channel never suspends, and [offer] always returns `true`. + * [Sending][send] to this channel never suspends, and [trySend] always succeeds. * * * When `capacity` is [Channel.CONFLATED] — it creates a _conflated_ channel - * This channel buffers at most one element and conflates all subsequent `send` and `offer` invocations, + * This channel buffers at most one element and conflates all subsequent `send` and `trySend` invocations, * so that the receiver always gets the last element sent. * Back-to-back sent elements are conflated — only the last sent element is received, * while previously sent elements **are lost**. - * [Sending][send] to this channel never suspends, and [offer] always returns `true`. + * [Sending][send] to this channel never suspends, and [trySend] always succeeds. * * * When `capacity` is positive but less than [UNLIMITED] — it creates an array-based channel with the specified capacity. * This channel has an array buffer of a fixed `capacity`. @@ -598,8 +621,6 @@ public interface ChannelIterator { * * * When [send][SendChannel.send] operation throws an exception because it was cancelled before it had a chance to actually * send the element or because the channel was [closed][SendChannel.close] or [cancelled][ReceiveChannel.cancel]. - * * When [offer][SendChannel.offer] operation throws an exception when - * the channel was [closed][SendChannel.close] or [cancelled][ReceiveChannel.cancel]. * * When [receive][ReceiveChannel.receive], [receiveOrNull][ReceiveChannel.receiveOrNull], or [hasNext][ChannelIterator.hasNext] * operation throws an exception when it had retrieved the element from the * channel but was cancelled before the code following the receive call resumed. diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt index c84afb2fe0..8283bcb166 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt @@ -17,7 +17,7 @@ import kotlin.jvm.* * Back-to-send sent elements are _conflated_ -- only the the most recently sent value is received, * while previously sent elements **are lost**. * Every subscriber immediately receives the most recently sent element. - * Sender to this broadcast channel never suspends and [offer] always returns `true`. + * Sender to this broadcast channel never suspends and [trySend] always succeeds. * * A secondary constructor can be used to create an instance of this class that already holds a value. * This channel is also created by `BroadcastChannel(Channel.CONFLATED)` factory function invocation. diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt index 0e686447c1..e1e2b140f5 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt @@ -9,11 +9,11 @@ import kotlinx.coroutines.internal.* import kotlinx.coroutines.selects.* /** - * Channel that buffers at most one element and conflates all subsequent `send` and `offer` invocations, + * Channel that buffers at most one element and conflates all subsequent `send` and `trySend` invocations, * so that the receiver always gets the most recently sent element. * Back-to-send sent elements are _conflated_ -- only the most recently sent element is received, * while previously sent elements **are lost**. - * Sender to this channel never suspends and [offer] always returns `true`. + * Sender to this channel never suspends and [trySend] always succeeds. * * This channel is created by `Channel(Channel.CONFLATED)` factory function invocation. */ diff --git a/kotlinx-coroutines-core/common/src/channels/LinkedListChannel.kt b/kotlinx-coroutines-core/common/src/channels/LinkedListChannel.kt index 831752739c..b5f607b230 100644 --- a/kotlinx-coroutines-core/common/src/channels/LinkedListChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/LinkedListChannel.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.selects.* /** * Channel with linked-list buffer of a unlimited capacity (limited only by available memory). - * Sender to this channel never suspends and [offer] always returns `true`. + * Sender to this channel never suspends and [trySend] always succeeds. * * This channel is created by `Channel(Channel.UNLIMITED)` factory function invocation. * diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index ac9e66b0d5..490b221b58 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -92,7 +92,7 @@ import kotlin.native.concurrent.* * * To migrate [BroadcastChannel] usage to [SharedFlow], start by replacing usages of the `BroadcastChannel(capacity)` * constructor with `MutableSharedFlow(0, extraBufferCapacity=capacity)` (broadcast channel does not replay - * values to new subscribers). Replace [send][BroadcastChannel.send] and [offer][BroadcastChannel.offer] calls + * values to new subscribers). Replace [send][BroadcastChannel.send] and [trySend][BroadcastChannel.trySend] calls * with [emit][MutableStateFlow.emit] and [tryEmit][MutableStateFlow.tryEmit], and convert subscribers' code to flow operators. * * ### Concurrency diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index fc8aa02f20..74d3314075 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -107,7 +107,7 @@ import kotlin.native.concurrent.* * * To migrate [ConflatedBroadcastChannel] usage to [StateFlow], start by replacing usages of the `ConflatedBroadcastChannel()` * constructor with `MutableStateFlow(initialValue)`, using `null` as an initial value if you don't have one. - * Replace [send][ConflatedBroadcastChannel.send] and [offer][ConflatedBroadcastChannel.offer] calls + * Replace [send][ConflatedBroadcastChannel.send] and [trySend][ConflatedBroadcastChannel.trySend] calls * with updates to the state flow's [MutableStateFlow.value], and convert subscribers' code to flow operators. * You can use the [filterNotNull] operator to mimic behavior of a `ConflatedBroadcastChannel` without initial value. * diff --git a/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt b/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt index 6e5f3f11aa..c924c09025 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/Combine.kt @@ -65,7 +65,7 @@ internal suspend fun FlowCollector.combineInternal( // Received the second value from the same flow in the same epoch -- bail out if (lastReceivedEpoch[index] == currentEpoch) break lastReceivedEpoch[index] = currentEpoch - element = resultChannel.poll() ?: break + element = resultChannel.tryReceive().getOrNull() ?: break } // Process batch result if there is enough data diff --git a/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt index 3900c2db90..632fd2928b 100644 --- a/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ArrayChannelTest.kt @@ -86,31 +86,31 @@ class ArrayChannelTest : TestBase() { } @Test - fun testOfferAndPoll() = runTest { + fun testTryOp() = runTest { val q = Channel(1) - assertTrue(q.offer(1)) + assertTrue(q.trySend(1).isSuccess) expect(1) launch { expect(3) - assertEquals(1, q.poll()) + assertEquals(1, q.tryReceive().getOrNull()) expect(4) - assertNull(q.poll()) + assertNull(q.tryReceive().getOrNull()) expect(5) assertEquals(2, q.receive()) // suspends expect(9) - assertEquals(3, q.poll()) + assertEquals(3, q.tryReceive().getOrNull()) expect(10) - assertNull(q.poll()) + assertNull(q.tryReceive().getOrNull()) expect(11) } expect(2) yield() expect(6) - assertTrue(q.offer(2)) + assertTrue(q.trySend(2).isSuccess) expect(7) - assertTrue(q.offer(3)) + assertTrue(q.trySend(3).isSuccess) expect(8) - assertFalse(q.offer(4)) + assertFalse(q.trySend(4).isSuccess) yield() finish(12) } @@ -157,7 +157,7 @@ class ArrayChannelTest : TestBase() { val capacity = 42 val channel = Channel(capacity) repeat(4) { - channel.offer(-1) + channel.trySend(-1) } repeat(4) { channel.receiveCatching().getOrNull() diff --git a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt index a64284aec1..8962acc3dc 100644 --- a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt @@ -15,8 +15,8 @@ class BasicOperationsTest : TestBase() { } @Test - fun testOfferAfterClose() = runTest { - TestChannelKind.values().forEach { kind -> testOffer(kind) } + fun testTrySendAfterClose() = runTest { + TestChannelKind.values().forEach { kind -> testTrySend(kind) } } @Test @@ -39,7 +39,7 @@ class BasicOperationsTest : TestBase() { } } expect(1) - channel.offer(42) + channel.trySend(42) expect(2) channel.close(AssertionError()) finish(4) @@ -80,28 +80,6 @@ class BasicOperationsTest : TestBase() { } } - private suspend fun testReceiveCatchingException(kind: TestChannelKind) = coroutineScope { - val channel = kind.create() - val d = async(NonCancellable) { - channel.receive() - } - - yield() - channel.close(TestException()) - assertTrue(channel.isClosedForReceive) - - assertFailsWith { channel.poll() } - try { - channel.receiveCatching().getOrThrow() - expectUnreached() - } catch (e: TestException) { - // Expected - } - - d.join() - assertTrue(d.getCancellationException().cause is TestException) - } - @Suppress("ReplaceAssertBooleanWithAssertEquality") private suspend fun testReceiveCatching(kind: TestChannelKind) = coroutineScope { reset() @@ -131,22 +109,21 @@ class BasicOperationsTest : TestBase() { finish(6) } - private suspend fun testOffer(kind: TestChannelKind) = coroutineScope { + private suspend fun testTrySend(kind: TestChannelKind) = coroutineScope { val channel = kind.create() val d = async { channel.send(42) } yield() channel.close() assertTrue(channel.isClosedForSend) - try { - channel.offer(2) - fail() - } catch (e: ClosedSendChannelException) { - if (!kind.isConflated) { - assertEquals(42, channel.receive()) + channel.trySend(2) + .onSuccess { expectUnreached() } + .onFailure { + assertTrue { it is ClosedSendChannelException} + if (!kind.isConflated) { + assertEquals(42, channel.receive()) + } } - } - d.await() } diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelBufferOverflowTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelBufferOverflowTest.kt index 41f60479f2..0b9a0fdbe4 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelBufferOverflowTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelBufferOverflowTest.kt @@ -11,30 +11,30 @@ class ChannelBufferOverflowTest : TestBase() { @Test fun testDropLatest() = runTest { val c = Channel(2, BufferOverflow.DROP_LATEST) - assertTrue(c.offer(1)) - assertTrue(c.offer(2)) - assertTrue(c.offer(3)) // overflows, dropped + assertTrue(c.trySend(1).isSuccess) + assertTrue(c.trySend(2).isSuccess) + assertTrue(c.trySend(3).isSuccess) // overflows, dropped c.send(4) // overflows dropped assertEquals(1, c.receive()) - assertTrue(c.offer(5)) - assertTrue(c.offer(6)) // overflows, dropped + assertTrue(c.trySend(5).isSuccess) + assertTrue(c.trySend(6).isSuccess) // overflows, dropped assertEquals(2, c.receive()) assertEquals(5, c.receive()) - assertEquals(null, c.poll()) + assertEquals(null, c.tryReceive().getOrNull()) } @Test fun testDropOldest() = runTest { val c = Channel(2, BufferOverflow.DROP_OLDEST) - assertTrue(c.offer(1)) - assertTrue(c.offer(2)) - assertTrue(c.offer(3)) // overflows, keeps 2, 3 + assertTrue(c.trySend(1).isSuccess) + assertTrue(c.trySend(2).isSuccess) + assertTrue(c.trySend(3).isSuccess) // overflows, keeps 2, 3 c.send(4) // overflows, keeps 3, 4 assertEquals(3, c.receive()) - assertTrue(c.offer(5)) - assertTrue(c.offer(6)) // overflows, keeps 5, 6 + assertTrue(c.trySend(5).isSuccess) + assertTrue(c.trySend(6).isSuccess) // overflows, keeps 5, 6 assertEquals(5, c.receive()) assertEquals(6, c.receive()) - assertEquals(null, c.poll()) + assertEquals(null, c.tryReceive().getOrNull()) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt index 856a66fbd2..a8c2a29c1b 100644 --- a/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ConflatedBroadcastChannelTest.kt @@ -42,7 +42,7 @@ class ConflatedBroadcastChannelTest : TestBase() { launch(start = CoroutineStart.UNDISPATCHED) { expect(2) val sub = broadcast.openSubscription() - assertNull(sub.poll()) + assertNull(sub.tryReceive().getOrNull()) expect(3) assertEquals("one", sub.receive()) // suspends expect(6) diff --git a/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt index 87194f72f9..370fd5b9a2 100644 --- a/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ConflatedChannelTest.kt @@ -12,14 +12,14 @@ open class ConflatedChannelTest : TestBase() { Channel(Channel.CONFLATED) @Test - fun testBasicConflationOfferPoll() { + fun testBasicConflationOfferTryReceive() { val q = createConflatedChannel() - assertNull(q.poll()) - assertTrue(q.offer(1)) - assertTrue(q.offer(2)) - assertTrue(q.offer(3)) - assertEquals(3, q.poll()) - assertNull(q.poll()) + assertNull(q.tryReceive().getOrNull()) + assertTrue(q.trySend(1).isSuccess) + assertTrue(q.trySend(2).isSuccess) + assertTrue(q.trySend(3).isSuccess) + assertEquals(3, q.tryReceive().getOrNull()) + assertNull(q.tryReceive().getOrNull()) } @Test diff --git a/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt index cdec8a776e..501affb4d9 100644 --- a/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/LinkedListChannelTest.kt @@ -12,12 +12,12 @@ class LinkedListChannelTest : TestBase() { fun testBasic() = runTest { val c = Channel(Channel.UNLIMITED) c.send(1) - check(c.offer(2)) + assertTrue(c.trySend(2).isSuccess) c.send(3) check(c.close()) check(!c.close()) assertEquals(1, c.receive()) - assertEquals(2, c.poll()) + assertEquals(2, c.tryReceive().getOrNull()) assertEquals(3, c.receiveCatching().getOrNull()) assertNull(c.receiveCatching().getOrNull()) } diff --git a/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt b/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt index ab0292a831..c83813e40e 100644 --- a/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/RendezvousChannelTest.kt @@ -80,26 +80,26 @@ class RendezvousChannelTest : TestBase() { } @Test - fun testOfferAndPool() = runTest { + fun testTrySendTryReceive() = runTest { val q = Channel(Channel.RENDEZVOUS) - assertFalse(q.offer(1)) + assertFalse(q.trySend(1).isSuccess) expect(1) launch { expect(3) - assertNull(q.poll()) + assertNull(q.tryReceive().getOrNull()) expect(4) assertEquals(2, q.receive()) expect(7) - assertNull(q.poll()) + assertNull(q.tryReceive().getOrNull()) yield() expect(9) - assertEquals(3, q.poll()) + assertEquals(3, q.tryReceive().getOrNull()) expect(10) } expect(2) yield() expect(5) - assertTrue(q.offer(2)) + assertTrue(q.trySend(2).isSuccess) expect(6) yield() expect(8) diff --git a/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt index f93d039933..4763d13b05 100644 --- a/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt @@ -166,15 +166,15 @@ class ChannelBuildersFlowTest : TestBase() { var expected = 0 launch { - assertTrue(channel.offer(1)) // Handed to the coroutine - assertTrue(channel.offer(2)) // Buffered - assertFalse(channel.offer(3)) // Failed to offer + assertTrue(channel.trySend(1).isSuccess) // Handed to the coroutine + assertTrue(channel.trySend(2).isSuccess) // Buffered + assertFalse(channel.trySend(3).isSuccess) // Failed to offer channel.send(3) yield() assertEquals(1, expected) - assertTrue(channel.offer(4)) // Handed to the coroutine - assertTrue(channel.offer(5)) // Buffered - assertFalse(channel.offer(6)) // Failed to offer + assertTrue(channel.trySend(4).isSuccess) // Handed to the coroutine + assertTrue(channel.trySend(5).isSuccess) // Buffered + assertFalse(channel.trySend(6).isSuccess) // Failed to offer channel.send(6) assertEquals(2, expected) } diff --git a/kotlinx-coroutines-core/common/test/flow/channels/ChannelFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/channels/ChannelFlowTest.kt index 31a929b2d8..f197a214f5 100644 --- a/kotlinx-coroutines-core/common/test/flow/channels/ChannelFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/channels/ChannelFlowTest.kt @@ -12,9 +12,9 @@ class ChannelFlowTest : TestBase() { @Test fun testRegular() = runTest { val flow = channelFlow { - assertTrue(offer(1)) - assertTrue(offer(2)) - assertTrue(offer(3)) + assertTrue(trySend(1).isSuccess) + assertTrue(trySend(2).isSuccess) + assertTrue(trySend(3).isSuccess) } assertEquals(listOf(1, 2, 3), flow.toList()) } @@ -22,9 +22,9 @@ class ChannelFlowTest : TestBase() { @Test fun testBuffer() = runTest { val flow = channelFlow { - assertTrue(offer(1)) - assertTrue(offer(2)) - assertFalse(offer(3)) + assertTrue(trySend(1).isSuccess) + assertTrue(trySend(2).isSuccess) + assertFalse(trySend(3).isSuccess) }.buffer(1) assertEquals(listOf(1, 2), flow.toList()) } @@ -32,10 +32,10 @@ class ChannelFlowTest : TestBase() { @Test fun testConflated() = runTest { val flow = channelFlow { - assertTrue(offer(1)) - assertTrue(offer(2)) - assertTrue(offer(3)) - assertTrue(offer(4)) + assertTrue(trySend(1).isSuccess) + assertTrue(trySend(2).isSuccess) + assertTrue(trySend(3).isSuccess) + assertTrue(trySend(4).isSuccess) }.buffer(Channel.CONFLATED) assertEquals(listOf(1, 4), flow.toList()) // two elements in the middle got conflated } @@ -43,7 +43,7 @@ class ChannelFlowTest : TestBase() { @Test fun testFailureCancelsChannel() = runTest { val flow = channelFlow { - offer(1) + trySend(1) invokeOnClose { expect(2) } diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInFusionTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInFusionTest.kt index 371d01472e..85a17ba0fe 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInFusionTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInFusionTest.kt @@ -42,7 +42,7 @@ class ShareInFusionTest : TestBase() { val flow = channelFlow { // send a batch of 10 elements using [offer] for (i in 1..10) { - assertTrue(offer(i)) // offer must succeed, because buffer + assertTrue(trySend(i).isSuccess) // offer must succeed, because buffer } send(0) // done }.buffer(10) // request a buffer of 10 @@ -53,4 +53,4 @@ class ShareInFusionTest : TestBase() { .collect { i -> expect(i + 1) } finish(12) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt index 42cdb1e19f..db69e2bc06 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt @@ -167,11 +167,11 @@ class ShareInTest : TestBase() { subs += shared .onEach { value -> // only the first threshold subscribers get the value when (i) { - in 1..threshold -> log.offer("sub$i: $value") + in 1..threshold -> log.trySend("sub$i: $value") else -> expectUnreached() } } - .onCompletion { log.offer("sub$i: completion") } + .onCompletion { log.trySend("sub$i: completion") } .launchIn(this) checkStartTransition(i) } @@ -210,4 +210,4 @@ class ShareInTest : TestBase() { stop() } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt index ea0b639e90..0df8278b77 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.* ) public fun SendChannel.sendBlocking(element: E) { // fast path - if (offer(element)) + if (trySend(element).isSuccess) return // slow path runBlocking { diff --git a/kotlinx-coroutines-core/jvm/src/channels/TickerChannels.kt b/kotlinx-coroutines-core/jvm/src/channels/TickerChannels.kt index 099e70b3b9..6c23982ee7 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/TickerChannels.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/TickerChannels.kt @@ -21,13 +21,13 @@ public enum class TickerMode { * ``` * val channel = ticker(delay = 100) * delay(350) // 250 ms late - * println(channel.poll()) // prints Unit - * println(channel.poll()) // prints null + * println(channel.tryReceive().getOrNull()) // prints Unit + * println(channel.tryReceive().getOrNull()) // prints null * * delay(50) - * println(channel.poll()) // prints Unit, delay was adjusted + * println(channel.tryReceive().getOrNull()) // prints Unit, delay was adjusted * delay(50) - * println(channel.poll()) // prints null, we'are not late relatively to previous element + * println(channel.tryReceive().getOrNull()) // prints null, we're not late relatively to previous element * ``` */ FIXED_PERIOD, diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt deleted file mode 100644 index 010dab389d..0000000000 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testCancelledOffer.txt +++ /dev/null @@ -1,10 +0,0 @@ -kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@2a06d350 - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) - at kotlinx.coroutines.channels.AbstractSendChannel.offer(AbstractChannel.kt:170) - at kotlinx.coroutines.channels.ChannelCoroutine.offer(ChannelCoroutine.kt) - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testCancelledOffer$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:153) -Caused by: kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@2a06d350 - at kotlinx.coroutines.JobSupport.cancel(JobSupport.kt:599) - at kotlinx.coroutines.Job$DefaultImpls.cancel$default(Job.kt:164) - at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testCancelledOffer$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:151) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) diff --git a/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationTest.kt b/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationTest.kt index 56f1e28313..06839f4a04 100644 --- a/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationTest.kt +++ b/kotlinx-coroutines-core/jvm/test/ReusableCancellableContinuationTest.kt @@ -39,7 +39,7 @@ class ReusableCancellableContinuationTest : TestBase() { repeat(iterations) { suspender { - assertTrue(channel.offer(it)) + assertTrue(channel.trySend(it).isSuccess) } } channel.close() diff --git a/kotlinx-coroutines-core/jvm/test/RunInterruptibleTest.kt b/kotlinx-coroutines-core/jvm/test/RunInterruptibleTest.kt index e755b17d91..49c93c7fe2 100644 --- a/kotlinx-coroutines-core/jvm/test/RunInterruptibleTest.kt +++ b/kotlinx-coroutines-core/jvm/test/RunInterruptibleTest.kt @@ -41,7 +41,7 @@ class RunInterruptibleTest : TestBase() { val job = launch { runInterruptible(Dispatchers.IO) { expect(2) - latch.offer(Unit) + latch.trySend(Unit) try { Thread.sleep(10_000L) expectUnreached() diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt index a6a5340389..86adfee049 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt @@ -15,7 +15,7 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { // total counters private var sendCnt = 0 - private var offerFailedCnt = 0 + private var trySendFailedCnt = 0 private var receivedCnt = 0 private var undeliveredCnt = 0 @@ -23,7 +23,7 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { private var lastReceived = 0 private var dSendCnt = 0 private var dSendExceptionCnt = 0 - private var dOfferFailedCnt = 0 + private var dTrySendFailedCnt = 0 private var dReceivedCnt = 0 private val dUndeliveredCnt = AtomicInteger() @@ -43,30 +43,30 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { joinAll(j1, j2) // All elements must be either received or undelivered (IN every run) - if (dSendCnt - dOfferFailedCnt != dReceivedCnt + dUndeliveredCnt.get()) { + if (dSendCnt - dTrySendFailedCnt != dReceivedCnt + dUndeliveredCnt.get()) { println(" Send: $dSendCnt") - println("Send Exception: $dSendExceptionCnt") - println(" Offer failed: $dOfferFailedCnt") + println("Send exception: $dSendExceptionCnt") + println("trySend failed: $dTrySendFailedCnt") println(" Received: $dReceivedCnt") println(" Undelivered: ${dUndeliveredCnt.get()}") error("Failed") } - offerFailedCnt += dOfferFailedCnt + trySendFailedCnt += dTrySendFailedCnt receivedCnt += dReceivedCnt undeliveredCnt += dUndeliveredCnt.get() // clear for next run dSendCnt = 0 dSendExceptionCnt = 0 - dOfferFailedCnt = 0 + dTrySendFailedCnt = 0 dReceivedCnt = 0 dUndeliveredCnt.set(0) } // Stats - println(" Send: $sendCnt") - println(" Offer failed: $offerFailedCnt") - println(" Received: $receivedCnt") - println(" Undelivered: $undeliveredCnt") - assertEquals(sendCnt - offerFailedCnt, receivedCnt + undeliveredCnt) + println(" Send: $sendCnt") + println("trySend failed: $trySendFailedCnt") + println(" Received: $receivedCnt") + println(" Undelivered: $undeliveredCnt") + assertEquals(sendCnt - trySendFailedCnt, receivedCnt + undeliveredCnt) } private suspend fun sendOne(channel: Channel) { @@ -75,11 +75,11 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { try { when (Random.nextInt(2)) { 0 -> channel.send(i) - 1 -> if (!channel.offer(i)) { - dOfferFailedCnt++ + 1 -> if (!channel.trySend(i).isSuccess) { + dTrySendFailedCnt++ } } - } catch(e: Throwable) { + } catch (e: Throwable) { assertTrue(e is CancellationException) // the only exception possible in this test dSendExceptionCnt++ throw e diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt index 8f5224db79..1233432615 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelUndeliveredElementStressTest.kt @@ -68,7 +68,7 @@ class ChannelUndeliveredElementStressTest(private val kind: TestChannelKind) : T try { block() } finally { - if (!done.offer(true)) + if (!done.trySend(true).isSuccess) error(IllegalStateException("failed to offer to done channel")) } } diff --git a/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt index eb7be57500..2b3c05bcc6 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt @@ -29,7 +29,7 @@ class ConflatedBroadcastChannelNotifyStressTest : TestBase() { launch(Dispatchers.Default + CoroutineName("Sender$senderId")) { repeat(nEvents) { i -> if (i % nSenders == senderId) { - broadcast.offer(i) + broadcast.trySend(i) sentTotal.incrementAndGet() yield() } @@ -63,7 +63,7 @@ class ConflatedBroadcastChannelNotifyStressTest : TestBase() { try { withTimeout(timeLimit) { senders.forEach { it.join() } - broadcast.offer(nEvents) // last event to signal receivers termination + broadcast.trySend(nEvents) // last event to signal receivers termination receivers.forEach { it.join() } } } catch (e: CancellationException) { @@ -86,4 +86,4 @@ class ConflatedBroadcastChannelNotifyStressTest : TestBase() { cancel() value } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt index fd26144faf..793d7e44f5 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ConflatedChannelCloseStressTest.kt @@ -5,11 +5,8 @@ package kotlinx.coroutines.channels import kotlinx.coroutines.* -import org.junit.After -import org.junit.Test -import java.util.concurrent.atomic.AtomicInteger -import java.util.concurrent.atomic.AtomicReference -import kotlin.coroutines.* +import org.junit.* +import java.util.concurrent.atomic.* class ConflatedChannelCloseStressTest : TestBase() { @@ -37,12 +34,9 @@ class ConflatedChannelCloseStressTest : TestBase() { var x = senderId try { while (isActive) { - try { - curChannel.get().offer(x) + curChannel.get().trySend(x).onSuccess { x += nSenders sent.incrementAndGet() - } catch (e: ClosedSendChannelException) { - // ignore } } } finally { diff --git a/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt b/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt index 6ce2f20d5a..fbc28a1855 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/TickerChannelCommonTest.kt @@ -48,7 +48,7 @@ class TickerChannelCommonTest(private val channelFactory: Channel) : TestBase() delayChannel.cancel() delay(5100) - assertFailsWith { delayChannel.poll() } + assertFailsWith { delayChannel.tryReceive().getOrThrow() } } } @@ -159,9 +159,9 @@ class TickerChannelCommonTest(private val channelFactory: Channel) : TestBase() } } -fun ReceiveChannel.checkEmpty() = assertNull(poll()) +fun ReceiveChannel.checkEmpty() = assertNull(tryReceive().getOrNull()) fun ReceiveChannel.checkNotEmpty() { - assertNotNull(poll()) - assertNull(poll()) + assertNotNull(tryReceive().getOrNull()) + assertNull(tryReceive().getOrNull()) } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt index ae2554ad4a..2d8c0ebc75 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryChannelsTest.kt @@ -137,25 +137,6 @@ class StackTraceRecoveryChannelsTest : TestBase() { deferred.await() } - // See https://github.com/Kotlin/kotlinx.coroutines/issues/950 - @Test - fun testCancelledOffer() = runTest { - expect(1) - val job = Job() - val actor = actor(job, Channel.UNLIMITED) { - consumeEach { - expectUnreached() // is cancelled before offer - } - } - job.cancel() - try { - actor.offer(1) - } catch (e: Exception) { - verifyStackTrace("channels/${name.methodName}", e) - finish(2) - } - } - private suspend fun Channel.sendWithContext(ctx: CoroutineContext) = withContext(ctx) { sendInChannel() yield() // TCE diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt index 1a381547ba..9afcab537d 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt @@ -261,7 +261,7 @@ class StackTraceRecoveryTest : TestBase() { private suspend fun awaitCallback(channel: Channel) { suspendCancellableCoroutine { cont -> - channel.offer(Callback(cont)) + channel.trySend(Callback(cont)) } yield() // nop to make sure it is not a tail call } diff --git a/kotlinx-coroutines-core/jvm/test/flow/CallbackFlowTest.kt b/kotlinx-coroutines-core/jvm/test/flow/CallbackFlowTest.kt index e3db2626ce..f1be284cae 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/CallbackFlowTest.kt +++ b/kotlinx-coroutines-core/jvm/test/flow/CallbackFlowTest.kt @@ -36,7 +36,7 @@ class CallbackFlowTest : TestBase() { fun testThrowingConsumer() = runTest { var i = 0 val api = CallbackApi { - runCatching { it.offer(++i) } + it.trySend(++i) } val flow = callbackFlow { @@ -77,13 +77,13 @@ class CallbackFlowTest : TestBase() { var i = 0 val api = CallbackApi { if (i < 5) { - it.offer(++i) + it.trySend(++i) } else { it.close(RuntimeException()) } } - val flow = callbackFlow() { + val flow = callbackFlow { api.start(channel) awaitClose { api.stop() diff --git a/kotlinx-coroutines-core/jvm/test/lincheck/ChannelsLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/lincheck/ChannelsLincheckTest.kt index fbd5c0d8f3..74cc17836b 100644 --- a/kotlinx-coroutines-core/jvm/test/lincheck/ChannelsLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/lincheck/ChannelsLincheckTest.kt @@ -63,11 +63,12 @@ abstract class ChannelLincheckTestBase( } @Operation - fun offer(@Param(name = "value") value: Int): Any = try { - c.offer(value) - } catch (e: NumberedCancellationException) { - e.testResult - } + fun trySend(@Param(name = "value") value: Int): Any = c.trySend(value) + .onSuccess { return true } + .onFailure { + return if (it is NumberedCancellationException) it.testResult + else false + } // TODO: this operation should be (and can be!) linearizable, but is not // @Operation @@ -85,11 +86,10 @@ abstract class ChannelLincheckTestBase( } @Operation - fun poll(): Any? = try { - c.poll() - } catch (e: NumberedCancellationException) { - e.testResult - } + fun tryReceive(): Any? = + c.tryReceive() + .onSuccess { return it } + .onFailure { return if (it is NumberedCancellationException) it.testResult else null } // TODO: this operation should be (and can be!) linearizable, but is not // @Operation @@ -131,7 +131,7 @@ abstract class SequentialIntChannelBase(private val capacity: Int) : VerifierSta private val buffer = ArrayList() private var closedMessage: String? = null - suspend fun send(x: Int): Any = when (val offerRes = offer(x)) { + suspend fun send(x: Int): Any = when (val offerRes = trySend(x)) { true -> Unit false -> suspendCancellableCoroutine { cont -> senders.add(cont to x) @@ -139,7 +139,7 @@ abstract class SequentialIntChannelBase(private val capacity: Int) : VerifierSta else -> offerRes } - fun offer(element: Int): Any { + fun trySend(element: Int): Any { if (closedMessage !== null) return closedMessage!! if (capacity == CONFLATED) { if (resumeFirstReceiver(element)) return true @@ -163,11 +163,11 @@ abstract class SequentialIntChannelBase(private val capacity: Int) : VerifierSta return false } - suspend fun receive(): Any = poll() ?: suspendCancellableCoroutine { cont -> + suspend fun receive(): Any = tryReceive() ?: suspendCancellableCoroutine { cont -> receivers.add(cont) } - fun poll(): Any? { + fun tryReceive(): Any? { if (buffer.isNotEmpty()) { val el = buffer.removeAt(0) resumeFirstSender().also { @@ -221,4 +221,4 @@ private fun CancellableContinuation.resume(res: T): Boolean { val token = tryResume(res) ?: return false completeResume(token) return true -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-jdk9/test/PublisherAsFlowTest.kt b/reactive/kotlinx-coroutines-jdk9/test/PublisherAsFlowTest.kt index 97f106b3c5..b5b2a0a2b8 100644 --- a/reactive/kotlinx-coroutines-jdk9/test/PublisherAsFlowTest.kt +++ b/reactive/kotlinx-coroutines-jdk9/test/PublisherAsFlowTest.kt @@ -70,7 +70,7 @@ class PublisherAsFlowTest : TestBase() { send(it + 1) expect(it + 1) } - assertFalse { offer(-1) } + assertFalse { trySend(-1).isSuccess } } publisher.asFlow().collect { diff --git a/reactive/kotlinx-coroutines-reactive/src/Channel.kt b/reactive/kotlinx-coroutines-reactive/src/Channel.kt index 854a8829fc..d9c9b91a2c 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Channel.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Channel.kt @@ -109,7 +109,7 @@ private class SubscriptionChannel( override fun onNext(t: T) { _requested.decrementAndGet() - offer(t) + trySend(t) // Safe to ignore return value here, expectedly racing with cancellation } override fun onComplete() { diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index d2cdbab881..383a17d836 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -89,7 +89,7 @@ public class PublisherCoroutine( public override suspend fun send(element: T) { // fast-path -- try send without suspension - if (offer(element)) return + if (trySend(element).isSuccess) return // slow-path does suspend return sendSuspend(element) } diff --git a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt index cb8de7a636..f0245388bf 100644 --- a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt @@ -132,7 +132,7 @@ private class ReactiveSubscriber( override fun onNext(value: T) { // Controlled by requestSize - require(channel.offer(value)) { "Element $value was not added to channel because it was full, $channel" } + require(channel.trySend(value).isSuccess) { "Element $value was not added to channel because it was full, $channel" } } override fun onComplete() { diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt index e2c86c97ff..7a0e0fac38 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherAsFlowTest.kt @@ -71,7 +71,7 @@ class PublisherAsFlowTest : TestBase() { send(it + 1) expect(it + 1) } - assertFalse { offer(-1) } + assertFalse { trySend(-1).isSuccess } } publisher.asFlow().collect { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt index 35f3391eb1..3bc50c8d57 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt @@ -84,11 +84,11 @@ private class SubscriptionChannel : } override fun onSuccess(t: T) { - offer(t) + trySend(t) // Safe to ignore return value here, expectedly racing with cancellation } override fun onNext(t: T) { - offer(t) + trySend(t) // Safe to ignore return value here, expectedly racing with cancellation } override fun onComplete() { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 56ce30c370..09c5dc1d9f 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -84,7 +84,7 @@ private class RxObservableCoroutine( public override suspend fun send(element: T) { // fast-path -- try send without suspension - if (offer(element)) return + if (trySend(element).isSuccess) return // slow-path does suspend return sendSuspend(element) } diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableSourceAsFlowStressTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableSourceAsFlowStressTest.kt index 159f3729c8..0253fcedd8 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableSourceAsFlowStressTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableSourceAsFlowStressTest.kt @@ -26,7 +26,7 @@ class ObservableSourceAsFlowStressTest : TestBase() { val latch = Channel(1) var i = 0 val observable = Observable.interval(100L, TimeUnit.MICROSECONDS) - .doOnNext { if (++i > 100) latch.offer(Unit) } + .doOnNext { if (++i > 100) latch.trySend(Unit) } val job = observable.asFlow().launchIn(CoroutineScope(Dispatchers.Default)) latch.receive() job.cancelAndJoin() diff --git a/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt index 76333f2eb8..ad780f7504 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt @@ -69,11 +69,11 @@ private class SubscriptionChannel : } override fun onSuccess(t: T) { - offer(t) + trySend(t) // Safe to ignore return value here, expectedly racing with cancellation } override fun onNext(t: T) { - offer(t) + trySend(t) // Safe to ignore return value here, expectedly racing with cancellation } override fun onComplete() { diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index a17e32dd31..55794f9adf 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -78,7 +78,7 @@ private class RxObservableCoroutine( public override suspend fun send(element: T) { // fast-path -- try send without suspension - if (offer(element)) return + if (trySend(element).isSuccess) return // slow-path does suspend return sendSuspend(element) } diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableSourceAsFlowStressTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableSourceAsFlowStressTest.kt index 431a7a789e..01d6a20e36 100644 --- a/reactive/kotlinx-coroutines-rx3/test/ObservableSourceAsFlowStressTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableSourceAsFlowStressTest.kt @@ -27,7 +27,7 @@ class ObservableSourceAsFlowStressTest : TestBase() { val latch = Channel(1) var i = 0 val observable = Observable.interval(100L, TimeUnit.MICROSECONDS) - .doOnNext { if (++i > 100) latch.offer(Unit) } + .doOnNext { if (++i > 100) latch.trySend(Unit) } val job = observable.asFlow().launchIn(CoroutineScope(Dispatchers.Default)) latch.receive() job.cancelAndJoin() diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index 7673c8f2b9..d5bd2320b7 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -268,7 +268,7 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { } // install a listener to offer events to this actor onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } ``` @@ -276,12 +276,12 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { > You can get the full code [here](kotlinx-coroutines-javafx/test/guide/example-ui-actor-02.kt). The key idea that underlies an integration of an actor coroutine and a regular event handler is that -there is an [offer][SendChannel.offer] function on [SendChannel] that does not wait. It sends an element to the actor immediately, -if it is possible, or discards an element otherwise. An `offer` actually returns a `Boolean` result which we ignore here. +there is an [trySend][SendChannel.trySend] function on [SendChannel] that does not wait. It sends an element to the actor immediately, +if it is possible, or discards an element otherwise. A `trySend` actually returns a `ChanneResult` instance which we ignore here. Try clicking repeatedly on a circle in this version of the code. The clicks are just ignored while the countdown animation is running. This happens because the actor is busy with an animation and does not receive from its channel. -By default, an actor's mailbox is backed by `RendezvousChannel`, whose `offer` operation succeeds only when +By default, an actor's mailbox is backed by `RendezvousChannel`, whose `trySend` operation succeeds only when the `receive` is active. > On Android, there is `View` sent in OnClickListener, so we send the `View` to the actor as a signal. @@ -295,7 +295,7 @@ fun View.onClick(action: suspend (View) -> Unit) { } // install a listener to activate this actor setOnClickListener { - eventActor.offer(it) + eventActor.trySend(it) } } ``` @@ -319,9 +319,9 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { val eventActor = GlobalScope.actor(Dispatchers.Main, capacity = Channel.CONFLATED) { // <--- Changed here for (event in channel) action(event) // pass event to action } - // install a listener to offer events to this actor + // install a listener to send events to this actor onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } ``` @@ -359,7 +359,7 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { for (event in channel) action(event) // pass event to action } onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } --> @@ -623,7 +623,7 @@ After delay [actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html -[SendChannel.offer]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/offer.html +[SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html [SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html [Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html [Channel.CONFLATED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/-c-o-n-f-l-a-t-e-d.html diff --git a/ui/kotlinx-coroutines-javafx/src/JavaFxConvert.kt b/ui/kotlinx-coroutines-javafx/src/JavaFxConvert.kt index 1cbf9b6fe9..ebeaa3b84b 100644 --- a/ui/kotlinx-coroutines-javafx/src/JavaFxConvert.kt +++ b/ui/kotlinx-coroutines-javafx/src/JavaFxConvert.kt @@ -4,10 +4,9 @@ package kotlinx.coroutines.javafx -import javafx.beans.value.ChangeListener -import javafx.beans.value.ObservableValue +import javafx.beans.value.* import kotlinx.coroutines.* -import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.* /** @@ -27,11 +26,11 @@ import kotlinx.coroutines.flow.* @ExperimentalCoroutinesApi // Since 1.3.x public fun ObservableValue.asFlow(): Flow = callbackFlow { val listener = ChangeListener { _, _, newValue -> - try { - offer(newValue) - } catch (e: CancellationException) { - // In case the event fires after the channel is closed - } + /* + * Do not propagate the exception to the ObservableValue, it + * already should've been handled by the downstream + */ + trySend(newValue) } addListener(listener) send(value) diff --git a/ui/kotlinx-coroutines-javafx/test/JavaFxObservableAsFlowTest.kt b/ui/kotlinx-coroutines-javafx/test/JavaFxObservableAsFlowTest.kt index 6964050102..bc40b0fdfb 100644 --- a/ui/kotlinx-coroutines-javafx/test/JavaFxObservableAsFlowTest.kt +++ b/ui/kotlinx-coroutines-javafx/test/JavaFxObservableAsFlowTest.kt @@ -83,4 +83,20 @@ class JavaFxObservableAsFlowTest : TestBase() { } } + @Test + fun testIntermediateCrash() = runTest { + if (!initPlatform()) { + println("Skipping JavaFxTest in headless environment") + return@runTest // ignore test in headless environments + } + + val property = SimpleIntegerProperty(0) + + assertFailsWith { + property.asFlow().onEach { + yield() + throw TestException() + }.collect() + } + } } diff --git a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-02.kt b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-02.kt index 51e94779e7..ec8a09f9bd 100644 --- a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-02.kt +++ b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-02.kt @@ -67,6 +67,6 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { } // install a listener to offer events to this actor onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } diff --git a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-03.kt b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-03.kt index 81371678a9..aa152b7937 100644 --- a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-03.kt +++ b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-actor-03.kt @@ -65,8 +65,8 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { val eventActor = GlobalScope.actor(Dispatchers.Main, capacity = Channel.CONFLATED) { // <--- Changed here for (event in channel) action(event) // pass event to action } - // install a listener to offer events to this actor + // install a listener to send events to this actor onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } diff --git a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-01.kt b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-01.kt index ea5ac90a4b..0c89ea70f7 100644 --- a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-01.kt +++ b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-01.kt @@ -55,7 +55,7 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { for (event in channel) action(event) // pass event to action } onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } diff --git a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-02.kt b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-02.kt index 504f2ee6c7..6e8b984a20 100644 --- a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-02.kt +++ b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-02.kt @@ -55,7 +55,7 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { for (event in channel) action(event) // pass event to action } onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } diff --git a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-03.kt b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-03.kt index 0e1153673a..3ff5d7d5d0 100644 --- a/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-03.kt +++ b/ui/kotlinx-coroutines-javafx/test/guide/example-ui-blocking-03.kt @@ -55,7 +55,7 @@ fun Node.onClick(action: suspend (MouseEvent) -> Unit) { for (event in channel) action(event) // pass event to action } onMouseClicked = EventHandler { event -> - eventActor.offer(event) + eventActor.trySend(event) } } From 7872f8fcdf972b4146a9d9b51816e9acc90ce7ea Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 15 Apr 2021 20:13:26 +0300 Subject: [PATCH 030/328] =?UTF-8?q?Mark=20BroadcastChannel,=20ConflatedBro?= =?UTF-8?q?adcastChannel=20and=20all=20related=20oper=E2=80=A6=20(#2647)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Mark BroadcastChannel, ConflatedBroadcastChannel and all related operators as obsolete API replaced with SharedFlow and StateFlow * Remove operator fusion with deprecated broadcastIn in order to simplify further Flow maintenance --- .../api/kotlinx-coroutines-core.api | 1 - .../common/src/channels/Broadcast.kt | 13 +- .../common/src/channels/BroadcastChannel.kt | 12 +- .../src/channels/ConflatedBroadcastChannel.kt | 6 +- .../common/src/flow/Builders.kt | 4 +- .../common/src/flow/Channels.kt | 44 +++--- .../common/src/flow/SharedFlow.kt | 2 +- .../common/src/flow/StateFlow.kt | 2 +- .../common/src/flow/internal/ChannelFlow.kt | 18 +-- .../common/src/flow/operators/Context.kt | 6 +- .../common/src/flow/operators/Merge.kt | 8 +- .../flow/channels/ChannelBuildersFlowTest.kt | 139 ------------------ 12 files changed, 56 insertions(+), 199 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 23f29b02a3..0d684b4454 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -1102,7 +1102,6 @@ public abstract class kotlinx/coroutines/flow/internal/ChannelFlow : kotlinx/cor public final field onBufferOverflow Lkotlinx/coroutines/channels/BufferOverflow; public fun (Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V protected fun additionalToStringProps ()Ljava/lang/String; - public fun broadcastImpl (Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineStart;)Lkotlinx/coroutines/channels/BroadcastChannel; public fun collect (Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; protected abstract fun collectTo (Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; protected abstract fun create (Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; diff --git a/kotlinx-coroutines-core/common/src/channels/Broadcast.kt b/kotlinx-coroutines-core/common/src/channels/Broadcast.kt index 3ed4bc7fff..b1c24b456d 100644 --- a/kotlinx-coroutines-core/common/src/channels/Broadcast.kt +++ b/kotlinx-coroutines-core/common/src/channels/Broadcast.kt @@ -35,11 +35,13 @@ import kotlin.coroutines.intrinsics.* * [send][BroadcastChannel.send] and [close][BroadcastChannel.close] operations that interfere with * the broadcasting coroutine in hard-to-specify ways. * - * **Note: This API is obsolete.** It will be deprecated and replaced with the - * [Flow.shareIn][kotlinx.coroutines.flow.shareIn] operator when it becomes stable. + * **Note: This API is obsolete since 1.5.0.** It will be deprecated with warning in 1.6.0 + * and with error in 1.7.0. It is replaced with [Flow.shareIn][kotlinx.coroutines.flow.shareIn] + * operator. * * @param start coroutine start option. The default value is [CoroutineStart.LAZY]. */ +@ObsoleteCoroutinesApi public fun ReceiveChannel.broadcast( capacity: Int = 1, start: CoroutineStart = CoroutineStart.LAZY @@ -95,10 +97,12 @@ public fun ReceiveChannel.broadcast( * * ### Future replacement * + * This API is obsolete since 1.5.0. * This function has an inappropriate result type of [BroadcastChannel] which provides * [send][BroadcastChannel.send] and [close][BroadcastChannel.close] operations that interfere with - * the broadcasting coroutine in hard-to-specify ways. It will be replaced with - * sharing operators on [Flow][kotlinx.coroutines.flow.Flow] in the future. + * the broadcasting coroutine in hard-to-specify ways. It will be deprecated with warning in 1.6.0 + * and with error in 1.7.0. It is replaced with [Flow.shareIn][kotlinx.coroutines.flow.shareIn] + * operator. * * @param context additional to [CoroutineScope.coroutineContext] context of the coroutine. * @param capacity capacity of the channel's buffer (1 by default). @@ -106,6 +110,7 @@ public fun ReceiveChannel.broadcast( * @param onCompletion optional completion handler for the producer coroutine (see [Job.invokeOnCompletion]). * @param block the coroutine code. */ +@ObsoleteCoroutinesApi public fun CoroutineScope.broadcast( context: CoroutineContext = EmptyCoroutineContext, capacity: Int = 1, diff --git a/kotlinx-coroutines-core/common/src/channels/BroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/BroadcastChannel.kt index 6cd79373b2..c82b8dbd63 100644 --- a/kotlinx-coroutines-core/common/src/channels/BroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/BroadcastChannel.kt @@ -20,10 +20,10 @@ import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED * See `BroadcastChannel()` factory function for the description of available * broadcast channel implementations. * - * **Note: This API is obsolete.** It will be deprecated and replaced by [SharedFlow][kotlinx.coroutines.flow.SharedFlow] - * when it becomes stable. + * **Note: This API is obsolete since 1.5.0.** It will be deprecated with warning in 1.6.0 + * and with error in 1.7.0. It is replaced with [SharedFlow][kotlinx.coroutines.flow.SharedFlow]. */ -@ExperimentalCoroutinesApi // not @ObsoleteCoroutinesApi to reduce burden for people who are still using it +@ObsoleteCoroutinesApi public interface BroadcastChannel : SendChannel { /** * Subscribes to this [BroadcastChannel] and returns a channel to receive elements from it. @@ -60,9 +60,11 @@ public interface BroadcastChannel : SendChannel { * * when `capacity` is [BUFFERED] -- creates `ArrayBroadcastChannel` with a default capacity. * * otherwise -- throws [IllegalArgumentException]. * - * **Note: This is an experimental api.** It may be changed in the future updates. + * **Note: This API is obsolete since 1.5.0.** It will be deprecated with warning in 1.6.0 + * and with error in 1.7.0. It is replaced with [StateFlow][kotlinx.coroutines.flow.StateFlow] + * and [SharedFlow][kotlinx.coroutines.flow.SharedFlow]. */ -@ExperimentalCoroutinesApi +@ObsoleteCoroutinesApi public fun BroadcastChannel(capacity: Int): BroadcastChannel = when (capacity) { 0 -> throw IllegalArgumentException("Unsupported 0 capacity for BroadcastChannel") diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt index 8283bcb166..b768d7c38c 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedBroadcastChannel.kt @@ -26,10 +26,10 @@ import kotlin.jvm.* * [opening][openSubscription] and [closing][ReceiveChannel.cancel] subscription takes O(N) time, where N is the * number of subscribers. * - * **Note: This API is obsolete.** It will be deprecated and replaced by [StateFlow][kotlinx.coroutines.flow.StateFlow] - * when it becomes stable. + * **Note: This API is obsolete since 1.5.0.** It will be deprecated with warning in 1.6.0 + * and with error in 1.7.0. It is replaced with [StateFlow][kotlinx.coroutines.flow.StateFlow]. */ -@ExperimentalCoroutinesApi // not @ObsoleteCoroutinesApi to reduce burden for people who are still using it +@ObsoleteCoroutinesApi public class ConflatedBroadcastChannel() : BroadcastChannel { /** * Creates an instance of this class that already holds a value. diff --git a/kotlinx-coroutines-core/common/src/flow/Builders.kt b/kotlinx-coroutines-core/common/src/flow/Builders.kt index 83ae9136eb..66b55a90c0 100644 --- a/kotlinx-coroutines-core/common/src/flow/Builders.kt +++ b/kotlinx-coroutines-core/common/src/flow/Builders.kt @@ -234,7 +234,7 @@ public fun flowViaChannel( * resulting flow to specify a user-defined value and to control what happens when data is produced faster * than consumed, i.e. to control the back-pressure behavior. * - * Adjacent applications of [channelFlow], [flowOn], [buffer], [produceIn], and [broadcastIn] are + * Adjacent applications of [channelFlow], [flowOn], [buffer], and [produceIn] are * always fused so that only one properly configured channel is used for execution. * * Examples of usage: @@ -289,7 +289,7 @@ public fun channelFlow(@BuilderInference block: suspend ProducerScope.() * resulting flow to specify a user-defined value and to control what happens when data is produced faster * than consumed, i.e. to control the back-pressure behavior. * - * Adjacent applications of [callbackFlow], [flowOn], [buffer], [produceIn], and [broadcastIn] are + * Adjacent applications of [callbackFlow], [flowOn], [buffer], and [produceIn] are * always fused so that only one properly configured channel is used for execution. * * Example of usage that converts a multi-shot callback API to a flow. diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 5b126f0ed7..4b50ad3108 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -133,17 +133,12 @@ private class ChannelAsFlow( override fun create(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow): ChannelFlow = ChannelAsFlow(channel, consume, context, capacity, onBufferOverflow) - override fun dropChannelOperators(): Flow? = + override fun dropChannelOperators(): Flow = ChannelAsFlow(channel, consume) override suspend fun collectTo(scope: ProducerScope) = SendingCollector(scope).emitAllImpl(channel, consume) // use efficient channel receiving code from emitAll - override fun broadcastImpl(scope: CoroutineScope, start: CoroutineStart): BroadcastChannel { - markConsumed() // fail fast on repeated attempt to collect it - return super.broadcastImpl(scope, start) - } - override fun produceImpl(scope: CoroutineScope): ReceiveChannel { markConsumed() // fail fast on repeated attempt to collect it return if (capacity == Channel.OPTIONAL_CHANNEL) { @@ -173,22 +168,16 @@ private class ChannelAsFlow( * 2) Flow consumer completes normally when the original channel completes (~is closed) normally. * 3) If the flow consumer fails with an exception, subscription is cancelled. */ -@FlowPreview +@Deprecated( + level = DeprecationLevel.WARNING, + message = "'BroadcastChannel' is obsolete and all coreresponding operators are deprecated " + + "in the favour of StateFlow and SharedFlow" +) // Since 1.5.0, was @FlowPreview, safe to remove in 1.7.0 public fun BroadcastChannel.asFlow(): Flow = flow { emitAll(openSubscription()) } /** - * Creates a [broadcast] coroutine that collects the given flow. - * - * This transformation is **stateful**, it launches a [broadcast] coroutine - * that collects the given flow and thus resulting channel should be properly closed or cancelled. - * - * A channel with [default][Channel.Factory.BUFFERED] buffer size is created. - * Use [buffer] operator on the flow before calling `broadcastIn` to specify a value other than - * default and to control what happens when data is produced faster than it is consumed, - * that is to control backpressure behavior. - * * ### Deprecated * * **This API is deprecated.** The [BroadcastChannel] provides a complex channel-like API for hot flows. @@ -202,13 +191,26 @@ public fun BroadcastChannel.asFlow(): Flow = flow { @Deprecated( message = "Use shareIn operator and the resulting SharedFlow as a replacement for BroadcastChannel", replaceWith = ReplaceWith("this.shareIn(scope, SharingStarted.Lazily, 0)"), - level = DeprecationLevel.WARNING -) + level = DeprecationLevel.ERROR +) // WARNING in 1.4.0, error in 1.5.0, removed in 1.6.0 (was @FlowPreview) public fun Flow.broadcastIn( scope: CoroutineScope, start: CoroutineStart = CoroutineStart.LAZY -): BroadcastChannel = - asChannelFlow().broadcastImpl(scope, start) +): BroadcastChannel { + // Backwards compatibility with operator fusing + val channelFlow = asChannelFlow() + val capacity = when (channelFlow.onBufferOverflow) { + BufferOverflow.SUSPEND -> channelFlow.produceCapacity + BufferOverflow.DROP_OLDEST -> Channel.CONFLATED + BufferOverflow.DROP_LATEST -> + throw IllegalArgumentException("Broadcast channel does not support BufferOverflow.DROP_LATEST") + } + return scope.broadcast(channelFlow.context, capacity = capacity, start = start) { + collect { value -> + send(value) + } + } +} /** * Creates a [produce] coroutine that collects the given flow. diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index 490b221b58..25118d75a1 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -80,7 +80,7 @@ import kotlin.native.concurrent.* * ### SharedFlow vs BroadcastChannel * * Conceptually shared flow is similar to [BroadcastChannel][BroadcastChannel] - * and is designed to completely replace `BroadcastChannel` in the future. + * and is designed to completely replace it. * It has the following important differences: * * * `SharedFlow` is simpler, because it does not have to implement all the [Channel] APIs, which allows diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index 74d3314075..49407e27b4 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -88,7 +88,7 @@ import kotlin.native.concurrent.* * ### StateFlow vs ConflatedBroadcastChannel * * Conceptually, state flow is similar to [ConflatedBroadcastChannel] - * and is designed to completely replace `ConflatedBroadcastChannel` in the future. + * and is designed to completely replace it. * It has the following important differences: * * * `StateFlow` is simpler, because it does not have to implement all the [Channel] APIs, which allows diff --git a/kotlinx-coroutines-core/common/src/flow/internal/ChannelFlow.kt b/kotlinx-coroutines-core/common/src/flow/internal/ChannelFlow.kt index bf82cf9ae9..0efe5f86db 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/ChannelFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/ChannelFlow.kt @@ -37,7 +37,7 @@ public interface FusibleFlow : Flow { /** * Operators that use channels as their "output" extend this `ChannelFlow` and are always fused with each other. * This class servers as a skeleton implementation of [FusibleFlow] and provides other cross-cutting - * methods like ability to [produceIn] and [broadcastIn] the corresponding flow, thus making it + * methods like ability to [produceIn] the corresponding flow, thus making it * possible to directly use the backing channel if it exists (hence the `ChannelFlow` name). * * @suppress **This an internal API and should not be used from general code.** @@ -59,7 +59,7 @@ public abstract class ChannelFlow( internal val collectToFun: suspend (ProducerScope) -> Unit get() = { collectTo(it) } - private val produceCapacity: Int + internal val produceCapacity: Int get() = if (capacity == Channel.OPTIONAL_CHANNEL) Channel.BUFFERED else capacity /** @@ -107,18 +107,6 @@ public abstract class ChannelFlow( protected abstract suspend fun collectTo(scope: ProducerScope) - // broadcastImpl is used in broadcastIn operator which is obsolete and replaced by SharedFlow. - // BroadcastChannel does not support onBufferOverflow beyond simple conflation - public open fun broadcastImpl(scope: CoroutineScope, start: CoroutineStart): BroadcastChannel { - val broadcastCapacity = when (onBufferOverflow) { - BufferOverflow.SUSPEND -> produceCapacity - BufferOverflow.DROP_OLDEST -> Channel.CONFLATED - BufferOverflow.DROP_LATEST -> - throw IllegalArgumentException("Broadcast channel does not support BufferOverflow.DROP_LATEST") - } - return scope.broadcast(context, broadcastCapacity, start, block = collectToFun) - } - /** * Here we use ATOMIC start for a reason (#1825). * NB: [produceImpl] is used for [flowOn]. @@ -201,7 +189,7 @@ internal class ChannelFlowOperatorImpl( override fun create(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow): ChannelFlow = ChannelFlowOperatorImpl(flow, context, capacity, onBufferOverflow) - override fun dropChannelOperators(): Flow? = flow + override fun dropChannelOperators(): Flow = flow override suspend fun flowCollect(collector: FlowCollector) = flow.collect(collector) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt index cbbb4196d5..6686896766 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt @@ -79,7 +79,7 @@ import kotlin.jvm.* * * ### Operator fusion * - * Adjacent applications of [channelFlow], [flowOn], [buffer], [produceIn], and [broadcastIn] are + * Adjacent applications of [channelFlow], [flowOn], [buffer], and [produceIn] are * always fused so that only one properly configured channel is used for execution. * * Explicitly specified buffer capacity takes precedence over `buffer()` or `buffer(Channel.BUFFERED)` calls, @@ -176,7 +176,7 @@ public fun Flow.buffer(capacity: Int = BUFFERED): Flow = buffer(capaci * * ### Operator fusion * - * Adjacent applications of `conflate`/[buffer], [channelFlow], [flowOn], [produceIn], and [broadcastIn] are + * Adjacent applications of `conflate`/[buffer], [channelFlow], [flowOn] and [produceIn] are * always fused so that only one properly configured channel is used for execution. * **Conflation takes precedence over `buffer()` calls with any other capacity.** * @@ -219,7 +219,7 @@ public fun Flow.conflate(): Flow = buffer(CONFLATED) * * ### Operator fusion * - * Adjacent applications of [channelFlow], [flowOn], [buffer], [produceIn], and [broadcastIn] are + * Adjacent applications of [channelFlow], [flowOn], [buffer], and [produceIn] are * always fused so that only one properly configured channel is used for execution. * * Multiple `flowOn` operators fuse to a single `flowOn` with a combined context. The elements of the context of diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt index d1cbe72b5b..432160f340 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt @@ -57,7 +57,7 @@ public fun Flow.flatMapConcat(transform: suspend (value: T) -> Flow * * ### Operator fusion * - * Applications of [flowOn], [buffer], [produceIn], and [broadcastIn] _after_ this operator are fused with + * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. * * @param concurrency controls the number of in-flight flows, at most [concurrency] flows are collected @@ -87,7 +87,7 @@ public fun Flow>.flattenConcat(): Flow = flow { * * ### Operator fusion * - * Applications of [flowOn], [buffer], [produceIn], and [broadcastIn] _after_ this operator are fused with + * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. */ @ExperimentalCoroutinesApi @@ -111,7 +111,7 @@ public fun Iterable>.merge(): Flow { * * ### Operator fusion * - * Applications of [flowOn], [buffer], [produceIn], and [broadcastIn] _after_ this operator are fused with + * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. */ @ExperimentalCoroutinesApi @@ -126,7 +126,7 @@ public fun merge(vararg flows: Flow): Flow = flows.asIterable().merge( * * ### Operator fusion * - * Applications of [flowOn], [buffer], [produceIn], and [broadcastIn] _after_ this operator are fused with + * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. * * When [concurrency] is greater than 1, this operator is [buffered][buffer] by default diff --git a/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt index 4763d13b05..410955ce4d 100644 --- a/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/channels/ChannelBuildersFlowTest.kt @@ -127,145 +127,6 @@ class ChannelBuildersFlowTest : TestBase() { finish(6) } - @Test - fun testBroadcastChannelAsFlow() = runTest { - val channel = broadcast { - repeat(10) { - send(it + 1) - } - } - - val sum = channel.asFlow().sum() - assertEquals(55, sum) - } - - @Test - fun testExceptionInBroadcast() = runTest { - expect(1) - val channel = broadcast(NonCancellable) { // otherwise failure will cancel scope as well - repeat(10) { - send(it + 1) - } - throw TestException() - } - assertEquals(15, channel.asFlow().take(5).sum()) - - // Workaround for JS bug - try { - channel.asFlow().collect { /* Do nothing */ } - expectUnreached() - } catch (e: TestException) { - finish(2) - } - } - - @Test - fun testBroadcastChannelAsFlowLimits() = runTest { - val channel = BroadcastChannel(1) - val flow = channel.asFlow().map { it * it }.drop(1).take(2) - - var expected = 0 - launch { - assertTrue(channel.trySend(1).isSuccess) // Handed to the coroutine - assertTrue(channel.trySend(2).isSuccess) // Buffered - assertFalse(channel.trySend(3).isSuccess) // Failed to offer - channel.send(3) - yield() - assertEquals(1, expected) - assertTrue(channel.trySend(4).isSuccess) // Handed to the coroutine - assertTrue(channel.trySend(5).isSuccess) // Buffered - assertFalse(channel.trySend(6).isSuccess) // Failed to offer - channel.send(6) - assertEquals(2, expected) - } - - val sum = flow.sum() - assertEquals(13, sum) - ++expected - val sum2 = flow.sum() - assertEquals(61, sum2) - ++expected - } - - @Test - fun flowAsBroadcast() = runTest { - val flow = flow { - repeat(10) { - emit(it) - } - } - - val channel = flow.broadcastIn(this) - assertEquals((0..9).toList(), channel.openSubscription().toList()) - } - - @Test - fun flowAsBroadcastMultipleSubscription() = runTest { - val flow = flow { - repeat(10) { - emit(it) - } - } - - val broadcast = flow.broadcastIn(this) - val channel = broadcast.openSubscription() - val channel2 = broadcast.openSubscription() - - assertEquals(0, channel.receive()) - assertEquals(0, channel2.receive()) - yield() - assertEquals(1, channel.receive()) - assertEquals(1, channel2.receive()) - - channel.cancel() - channel2.cancel() - yield() - ensureActive() - } - - @Test - fun flowAsBroadcastException() = runTest { - val flow = flow { - repeat(10) { - emit(it) - } - - throw TestException() - } - - val channel = flow.broadcastIn(this + NonCancellable) - assertFailsWith { channel.openSubscription().toList() } - assertTrue(channel.isClosedForSend) // Failure in the flow fails the channel - } - - // Semantics of these tests puzzle me, we should figure out the way to prohibit such chains - @Test - fun testFlowAsBroadcastAsFlow() = runTest { - val flow = flow { - emit(1) - emit(2) - emit(3) - }.broadcastIn(this).asFlow() - - assertEquals(6, flow.sum()) - assertEquals(0, flow.sum()) // Well suddenly flow is no longer idempotent and cold - } - - @Test - fun testBroadcastAsFlowAsBroadcast() = runTest { - val channel = broadcast { - send(1) - }.asFlow().broadcastIn(this) - - channel.openSubscription().consumeEach { - assertEquals(1, it) - } - - channel.openSubscription().consumeEach { - fail() - } - } - @Test fun testProduceInAtomicity() = runTest { val flow = flowOf(1).onCompletion { expect(2) } From e62f8f712ce98517d63dfe7aa40b2689ebd584c5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 15 Apr 2021 22:57:35 +0300 Subject: [PATCH 031/328] Migration to Kotlin 1.5.0-RC (#2653) * Migrate inline classes to value classes * Adjust debugger/state recovery for new codegen * Temporarily disable R8 tests * Update webpack for new K/JS --- gradle.properties | 2 +- .../api/kotlinx-coroutines-slf4j.api | 4 -- js/example-frontend-js/build.gradle.kts | 2 +- .../api/kotlinx-coroutines-core.api | 16 ++++---- .../common/src/channels/Channel.kt | 4 +- .../jvm/resources/DebugProbesKt.bin | Bin 1728 -> 1714 bytes .../jvm/src/debug/internal/DebugProbesImpl.kt | 19 +++++---- .../stacktraces/select/testSelectJoin.txt | 8 ++-- .../StackTraceRecoveryNestedScopesTest.kt | 1 - .../StackTraceRecoveryNestedTest.kt | 2 +- .../StackTraceRecoverySelectTest.kt | 4 +- .../test/exceptions/StackTraceRecoveryTest.kt | 22 +++++----- .../test/DebugProbesTest.kt | 3 -- .../test/SanitizedProbesTest.kt | 1 - .../build.gradle.kts | 38 +++++++++--------- .../test/R8ServiceLoaderOptimizationTest.kt | 1 + 16 files changed, 59 insertions(+), 68 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0f3ccc1b55..a27edd12f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ # Kotlin version=1.4.3-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.4.30 +kotlin_version=1.5.0-RC # Dependencies junit_version=4.12 diff --git a/integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api b/integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api index a8bf271ba4..6b565d4c1a 100644 --- a/integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api +++ b/integration/kotlinx-coroutines-slf4j/api/kotlinx-coroutines-slf4j.api @@ -3,11 +3,7 @@ public final class kotlinx/coroutines/slf4j/MDCContext : kotlin/coroutines/Abstr public fun ()V public fun (Ljava/util/Map;)V public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; public final fun getContextMap ()Ljava/util/Map; - public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; - public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; public synthetic fun restoreThreadContext (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V public fun restoreThreadContext (Lkotlin/coroutines/CoroutineContext;Ljava/util/Map;)V public synthetic fun updateThreadContext (Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; diff --git a/js/example-frontend-js/build.gradle.kts b/js/example-frontend-js/build.gradle.kts index 5b18966fcd..e5e7a3e2a5 100644 --- a/js/example-frontend-js/build.gradle.kts +++ b/js/example-frontend-js/build.gradle.kts @@ -23,5 +23,5 @@ kotlin { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-html-js:${version("html")}") - implementation(devNpm("html-webpack-plugin", "3.2.0")) + implementation(devNpm("html-webpack-plugin", "5.3.1")) } diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 0d684b4454..dcbf62b565 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -267,7 +267,7 @@ public final class kotlinx/coroutines/Delay$DefaultImpls { public final class kotlinx/coroutines/DelayKt { public static final fun awaitCancellation (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun delay (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun delay-VtjQ1oo (DLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun delay-VtjQ1oo (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class kotlinx/coroutines/Dispatchers { @@ -535,9 +535,9 @@ public final class kotlinx/coroutines/TimeoutCancellationException : java/util/c public final class kotlinx/coroutines/TimeoutKt { public static final fun withTimeout (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun withTimeout-KLykuaI (DLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun withTimeout-KLykuaI (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun withTimeoutOrNull (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun withTimeoutOrNull-KLykuaI (DLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun withTimeoutOrNull-KLykuaI (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class kotlinx/coroutines/YieldKt { @@ -920,7 +920,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun count (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun debounce (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun debounce (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; - public static final fun debounce-HG0u8IE (Lkotlinx/coroutines/flow/Flow;D)Lkotlinx/coroutines/flow/Flow; + public static final fun debounce-HG0u8IE (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun debounceDuration (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; public static final fun delayEach (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun delayFlow (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; @@ -997,7 +997,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun runningFold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun runningReduce (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun sample (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; - public static final fun sample-HG0u8IE (Lkotlinx/coroutines/flow/Flow;D)Lkotlinx/coroutines/flow/Flow; + public static final fun sample-HG0u8IE (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun scan (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun scanFold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun scanReduce (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; @@ -1084,8 +1084,8 @@ public final class kotlinx/coroutines/flow/SharingStarted$Companion { } public final class kotlinx/coroutines/flow/SharingStartedKt { - public static final fun WhileSubscribed-5qebJ5I (Lkotlinx/coroutines/flow/SharingStarted$Companion;DD)Lkotlinx/coroutines/flow/SharingStarted; - public static synthetic fun WhileSubscribed-5qebJ5I$default (Lkotlinx/coroutines/flow/SharingStarted$Companion;DDILjava/lang/Object;)Lkotlinx/coroutines/flow/SharingStarted; + public static final fun WhileSubscribed-5qebJ5I (Lkotlinx/coroutines/flow/SharingStarted$Companion;JJ)Lkotlinx/coroutines/flow/SharingStarted; + public static synthetic fun WhileSubscribed-5qebJ5I$default (Lkotlinx/coroutines/flow/SharingStarted$Companion;JJILjava/lang/Object;)Lkotlinx/coroutines/flow/SharingStarted; } public abstract interface class kotlinx/coroutines/flow/StateFlow : kotlinx/coroutines/flow/SharedFlow { @@ -1215,7 +1215,7 @@ public abstract interface class kotlinx/coroutines/selects/SelectInstance { } public final class kotlinx/coroutines/selects/SelectKt { - public static final fun onTimeout-8Mi8wO0 (Lkotlinx/coroutines/selects/SelectBuilder;DLkotlin/jvm/functions/Function1;)V + public static final fun onTimeout-8Mi8wO0 (Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V public static final fun select (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index f006efc720..1812bddfa7 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -363,8 +363,8 @@ public interface ReceiveChannel { * * The closed result represents an operation attempt to a closed channel and also implies that the operation has failed. */ -@Suppress("UNCHECKED_CAST") -public inline class ChannelResult +@JvmInline +public value class ChannelResult @PublishedApi internal constructor(@PublishedApi internal val holder: Any?) { /** * Returns `true` if this instance represents a successful diff --git a/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin b/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin index ea8c9da4c2f57926d3a26ab4a34e82832fde3d51..397aaf67ac52cdf6b99d39da8ddf1065bc098293 100644 GIT binary patch delta 305 zcmX@WyNQ?U)W2Q(7#J8#80_G6Vd zHU|o@F)#u#7lQ?m%>!gJFz_*OGDrbwOCV-qU}vxb(jZkFK-zlp0#*^AZUHul$!A&F zZ4f5#pqLH+vGwv zVPj1OZBGUr23=1EJqG<~2F79r0|vur2F_vz)?x;!Vg{pP5L>#K!MK<~u9!i&n85@9 D7akyi delta 352 zcma)$y-or_6otRpaYZ&j?SeutG8GT79WCWeXn6=;M8wL%P+R&yhC7=m zYGrZeoO3hxn|aP}^U?d~>l@H#ypCRMd|u5S!jx)}`THDc~>qi#}M(EK`$O>^N6opIir6gPl JWuYou?*MEiB5?o! diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index 49294d73e1..88be35e328 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -281,7 +281,7 @@ internal object DebugProbesImpl { it.fileName == "ContinuationImpl.kt" } - val (continuationStartFrame, frameSkipped) = findContinuationStartIndex( + val (continuationStartFrame, delta) = findContinuationStartIndex( indexOfResumeWith, actualTrace, coroutineTrace @@ -289,7 +289,6 @@ internal object DebugProbesImpl { if (continuationStartFrame == -1) return coroutineTrace - val delta = if (frameSkipped) 1 else 0 val expectedSize = indexOfResumeWith + coroutineTrace.size - continuationStartFrame - 1 - delta val result = ArrayList(expectedSize) for (index in 0 until indexOfResumeWith - delta) { @@ -311,16 +310,22 @@ internal object DebugProbesImpl { * If method above `resumeWith` has no line number (thus it is `stateMachine.invokeSuspend`), * it's skipped and attempt to match next one is made because state machine could have been missing in the original coroutine stacktrace. * - * Returns index of such frame (or -1) and flag indicating whether frame with state machine was skipped + * Returns index of such frame (or -1) and number of skipped frames (up to 2, for state machine and for access$). */ private fun findContinuationStartIndex( indexOfResumeWith: Int, actualTrace: Array, coroutineTrace: List - ): Pair { - val result = findIndexOfFrame(indexOfResumeWith - 1, actualTrace, coroutineTrace) - if (result == -1) return findIndexOfFrame(indexOfResumeWith - 2, actualTrace, coroutineTrace) to true - return result to false + ): Pair { + /* + * Since Kotlin 1.5.0 we have these access$ methods that we have to skip. + * So we have to test next frame for invokeSuspend, for $access and for actual suspending call. + */ + repeat(3) { + val result = findIndexOfFrame(indexOfResumeWith - 1 - it, actualTrace, coroutineTrace) + if (result != -1) return result to it + } + return -1 to 0 } private fun findIndexOfFrame( diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt index 3f404cd937..5a9a65e400 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException - at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$$inlined$select$lambda$1.invokeSuspend(StackTraceRecoverySelectTest.kt:33) + at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$2$1.invokeSuspend(StackTraceRecoverySelectTest.kt) at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) - at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectJoin$1.invokeSuspend(StackTraceRecoverySelectTest.kt:20) + at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectJoin$1.invokeSuspend(StackTraceRecoverySelectTest.kt) Caused by: kotlinx.coroutines.RecoverableTestException - at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$$inlined$select$lambda$1.invokeSuspend(StackTraceRecoverySelectTest.kt:33) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$2$1.invokeSuspend(StackTraceRecoverySelectTest.kt) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt) diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt index bc9d056668..dbb1ead568 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt @@ -86,7 +86,6 @@ class StackTraceRecoveryNestedScopesTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callWithTimeout\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:37)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callCoroutineScope\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:43)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$testAwaitNestedScopes\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:68)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.verifyAwait(StackTraceRecoveryNestedScopesTest.kt:76)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$testAwaitNestedScopes\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:71)\n" + "Caused by: kotlinx.coroutines.RecoverableTestException\n" + diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedTest.kt index 5073b7fdfa..02607c0308 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedTest.kt @@ -58,7 +58,7 @@ class StackTraceRecoveryNestedTest : TestBase() { try { rootAsync.awaitRootLevel() } catch (e: RecoverableTestException) { - e.verifyException("await\$suspendImpl", "awaitRootLevel") + e.verifyException("awaitRootLevel") finish(8) } } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoverySelectTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoverySelectTest.kt index 290420e49a..0d7648c54d 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoverySelectTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoverySelectTest.kt @@ -45,9 +45,9 @@ class StackTraceRecoverySelectTest : TestBase() { private suspend fun doSelectAwait(deferred: Deferred): Int { return select { deferred.onAwait { - yield() // Hide the stackstrace + yield() // Hide the frame 42 } } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt index 9afcab537d..574b27a815 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt @@ -34,14 +34,13 @@ class StackTraceRecoveryTest : TestBase() { val deferred = createDeferred(3) val traces = listOf( "java.util.concurrent.ExecutionException\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$1\$1.invokeSuspend(StackTraceRecoveryTest.kt:99)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$createDeferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:99)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:49)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:44)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1.invokeSuspend(StackTraceRecoveryTest.kt:17)\n", "Caused by: java.util.concurrent.ExecutionException\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$1\$1.invokeSuspend(StackTraceRecoveryTest.kt:21)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$createDeferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:21)\n" + "\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)\n" ) nestedMethod(deferred, *traces.toTypedArray()) @@ -59,7 +58,6 @@ class StackTraceRecoveryTest : TestBase() { "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCompletedAsync\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:44)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:81)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:75)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCompletedAsync\$1.invokeSuspend(StackTraceRecoveryTest.kt:71)", @@ -94,7 +92,6 @@ class StackTraceRecoveryTest : TestBase() { "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testWithContext\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerMethod\$2.invokeSuspend(StackTraceRecoveryTest.kt:151)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.outerMethod(StackTraceRecoveryTest.kt:150)\n" + @@ -132,7 +129,6 @@ class StackTraceRecoveryTest : TestBase() { "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCoroutineScope\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerScopedMethod\$2\$1.invokeSuspend(StackTraceRecoveryTest.kt:193)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerScopedMethod\$2.invokeSuspend(StackTraceRecoveryTest.kt:151)\n" + @@ -228,13 +224,13 @@ class StackTraceRecoveryTest : TestBase() { val e = exception assertNotNull(e) verifyStackTrace(e, "kotlinx.coroutines.RecoverableTestException\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.throws(StackTraceRecoveryTest.kt:280)\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$throws\$1.invokeSuspend(StackTraceRecoveryTest.kt)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaiter(StackTraceRecoveryTest.kt:285)\n" + - "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testNonDispatchedRecovery\$await\$1.invokeSuspend(StackTraceRecoveryTest.kt:291)\n" + - "Caused by: kotlinx.coroutines.RecoverableTestException") + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.throws(StackTraceRecoveryTest.kt:280)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.access\$throws(StackTraceRecoveryTest.kt:20)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$throws\$1.invokeSuspend(StackTraceRecoveryTest.kt)\n" + + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaiter(StackTraceRecoveryTest.kt:285)\n" + + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testNonDispatchedRecovery\$await\$1.invokeSuspend(StackTraceRecoveryTest.kt:291)\n" + + "Caused by: kotlinx.coroutines.RecoverableTestException") } private class Callback(val cont: CancellableContinuation<*>) diff --git a/kotlinx-coroutines-debug/test/DebugProbesTest.kt b/kotlinx-coroutines-debug/test/DebugProbesTest.kt index 1acaee2b62..bc0c1e3f24 100644 --- a/kotlinx-coroutines-debug/test/DebugProbesTest.kt +++ b/kotlinx-coroutines-debug/test/DebugProbesTest.kt @@ -21,7 +21,6 @@ class DebugProbesTest : DebugTestBase() { "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:14)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:49)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:44)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsync\$1.invokeSuspend(DebugProbesTest.kt:17)\n", @@ -42,7 +41,6 @@ class DebugProbesTest : DebugTestBase() { "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:62)\n" + @@ -74,7 +72,6 @@ class DebugProbesTest : DebugTestBase() { "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:16)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:71)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:66)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithSanitizedProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:87)\n" + diff --git a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt index a329be7bcd..779c624533 100644 --- a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt +++ b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt @@ -28,7 +28,6 @@ class SanitizedProbesTest : DebugTestBase() { "java.util.concurrent.ExecutionException\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$createDeferredNested\$1.invokeSuspend(SanitizedProbesTest.kt:97)\n" + "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + - "\tat kotlinx.coroutines.DeferredCoroutine.await\$suspendImpl(Builders.common.kt:99)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.oneMoreNestedMethod(SanitizedProbesTest.kt:67)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.nestedMethod(SanitizedProbesTest.kt:61)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$testRecoveredStackTrace\$1.invokeSuspend(SanitizedProbesTest.kt:50)\n" + diff --git a/ui/kotlinx-coroutines-android/build.gradle.kts b/ui/kotlinx-coroutines-android/build.gradle.kts index 08d45ffe71..2af2d4f3a9 100644 --- a/ui/kotlinx-coroutines-android/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/build.gradle.kts @@ -2,10 +2,6 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -import org.jetbrains.dokka.DokkaConfiguration.ExternalDocumentationLink -import org.jetbrains.dokka.gradle.DokkaTask -import java.net.URL - configurations { create("r8") } @@ -22,7 +18,7 @@ dependencies { testImplementation("org.robolectric:robolectric:${version("robolectric")}") testImplementation("org.smali:baksmali:${version("baksmali")}") - "r8"("com.android.tools.build:builder:4.0.0-alpha06") // Contains r8-2.0.4-dev + "r8"("com.android.tools.build:builder:7.0.0-alpha14") } val optimizedDexDir = File(buildDir, "dex-optim/") @@ -45,21 +41,23 @@ val runR8NoOptim by tasks.registering(RunR8::class) { dependsOn("jar") } -tasks.test { - // Ensure the R8-processed dex is built and supply its path as a property to the test. - dependsOn(runR8) - dependsOn(runR8NoOptim) - - inputs.files(optimizedDexFile, unOptimizedDexFile) - - systemProperty("dexPath", optimizedDexFile.absolutePath) - systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath) - - // Output custom metric with the size of the optimized dex - doLast { - println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']") - } -} +// TODO: Disable the test until we have published version of R8 that supports Kotlin 1.5.0 metadata + +//tasks.test { +// // Ensure the R8-processed dex is built and supply its path as a property to the test. +// dependsOn(runR8) +// dependsOn(runR8NoOptim) +// +// inputs.files(optimizedDexFile, unOptimizedDexFile) +// +// systemProperty("dexPath", optimizedDexFile.absolutePath) +// systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath) +// +// // Output custom metric with the size of the optimized dex +// doLast { +// println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']") +// } +//} externalDocumentationLink( url = "https://developer.android.com/reference/" diff --git a/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt b/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt index 47beb85bbf..5d60d641aa 100644 --- a/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt +++ b/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt @@ -11,6 +11,7 @@ import java.io.* import java.util.stream.* import kotlin.test.* +@Ignore class R8ServiceLoaderOptimizationTest : TestBase() { private val r8Dex = File(System.getProperty("dexPath")!!).asDexFile() private val r8DexNoOptim = File(System.getProperty("noOptimDexPath")!!).asDexFile() From 95ad4449e56fec0c3b800d6b0a44218a6822c1e6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 19 Apr 2021 16:30:09 +0300 Subject: [PATCH 032/328] Fix missing indent in @InternalCoroutinesApi warning message --- kotlinx-coroutines-core/common/src/Annotations.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/Annotations.kt b/kotlinx-coroutines-core/common/src/Annotations.kt index 70adad9b97..1ade389d37 100644 --- a/kotlinx-coroutines-core/common/src/Annotations.kt +++ b/kotlinx-coroutines-core/common/src/Annotations.kt @@ -59,7 +59,7 @@ public annotation class ObsoleteCoroutinesApi @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPEALIAS, AnnotationTarget.PROPERTY) @RequiresOptIn( level = RequiresOptIn.Level.ERROR, message = "This is an internal kotlinx.coroutines API that " + - "should not be used from outside of kotlinx.coroutines. No compatibility guarantees are provided." + + "should not be used from outside of kotlinx.coroutines. No compatibility guarantees are provided. " + "It is recommended to report your use-case of internal API to kotlinx.coroutines issue tracker, " + "so stable API could be provided instead" ) From 8bb5210c2825c7d248eb172d06975c5628aa6671 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Tue, 20 Apr 2021 11:21:32 +0300 Subject: [PATCH 033/328] Consistently handle exceptions in reactive streams (#2646) * Fixed `PublisherCoroutine`, `rxObservable`, and `Flow.toPublisher` ignoring cancellations. * Fatal exceptions are not treated in a special manner by us anymore. Instead, we follow the requirement in the reactive streams specification that, in case some method of `Subscriber` throws, that subscriber MUST be considered canceled, and the exception MUST be reported in someplace other than `onError`. * Fixed `trySend` sometimes throwing in `PublisherCoroutine` and `rxObservable`. * When an exception happens inside a cancellation handler, we now consistently throw the original exception passed to the handler, with the new exception added as suppressed. * Fixed `PublisherCoroutine` and `rxObservable` claiming that the channel is not closed for send for some time after `close()` has finished. * Fixed publishers sometimes signalling `onComplete()` after cancellation even though their streams are not finite. Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2173 --- .../test/FlowAsPublisherTest.kt | 21 ++- .../test/IntegrationTest.kt | 20 ++- .../test/PublishTest.kt | 158 ++++++++++++++---- .../src/Publish.kt | 155 ++++++++++------- .../src/ReactiveFlow.kt | 31 ++-- .../test/FlowAsPublisherTest.kt | 24 ++- .../test/IntegrationTest.kt | 51 +++--- .../test/PublishTest.kt | 158 ++++++++++++++---- .../test/PublisherRequestStressTest.kt | 14 +- .../kotlinx-coroutines-reactor/src/Flux.kt | 9 +- .../kotlinx-coroutines-reactor/src/Mono.kt | 5 +- .../test/FluxTest.kt | 37 +++- reactive/kotlinx-coroutines-rx2/README.md | 4 - .../src/RxCancellable.kt | 1 + .../src/RxCompletable.kt | 7 +- .../kotlinx-coroutines-rx2/src/RxMaybe.kt | 7 +- .../src/RxObservable.kt | 117 ++++++------- .../kotlinx-coroutines-rx2/src/RxSingle.kt | 7 +- .../test/FlowableExceptionHandlingTest.kt | 16 +- .../test/IntegrationTest.kt | 16 ++ .../test/ObservableExceptionHandlingTest.kt | 37 ++-- .../src/RxCancellable.kt | 1 + .../src/RxCompletable.kt | 7 +- .../kotlinx-coroutines-rx3/src/RxMaybe.kt | 7 +- .../src/RxObservable.kt | 112 ++++++------- .../kotlinx-coroutines-rx3/src/RxSingle.kt | 7 +- .../test/FlowableExceptionHandlingTest.kt | 16 +- .../test/IntegrationTest.kt | 15 ++ .../test/ObservableExceptionHandlingTest.kt | 37 ++-- 29 files changed, 740 insertions(+), 357 deletions(-) diff --git a/reactive/kotlinx-coroutines-jdk9/test/FlowAsPublisherTest.kt b/reactive/kotlinx-coroutines-jdk9/test/FlowAsPublisherTest.kt index 488695dea2..b860e16209 100644 --- a/reactive/kotlinx-coroutines-jdk9/test/FlowAsPublisherTest.kt +++ b/reactive/kotlinx-coroutines-jdk9/test/FlowAsPublisherTest.kt @@ -15,7 +15,7 @@ class FlowAsPublisherTest : TestBase() { @Test fun testErrorOnCancellationIsReported() { expect(1) - flow { + flow { try { emit(2) } finally { @@ -50,13 +50,13 @@ class FlowAsPublisherTest : TestBase() { @Test fun testCancellationIsNotReported() { expect(1) - flow { + flow { emit(2) }.asPublisher().subscribe(object : JFlow.Subscriber { private lateinit var subscription: JFlow.Subscription override fun onComplete() { - expect(3) + expectUnreached() } override fun onSubscribe(s: JFlow.Subscription?) { @@ -73,6 +73,21 @@ class FlowAsPublisherTest : TestBase() { expectUnreached() } }) + finish(3) + } + + @Test + fun testFlowWithTimeout() = runTest { + val publisher = flow { + expect(2) + withTimeout(1) { delay(Long.MAX_VALUE) } + }.asPublisher() + try { + expect(1) + publisher.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(3) + } finish(4) } } diff --git a/reactive/kotlinx-coroutines-jdk9/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-jdk9/test/IntegrationTest.kt index 5bfddfee17..5b3542ad89 100644 --- a/reactive/kotlinx-coroutines-jdk9/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-jdk9/test/IntegrationTest.kt @@ -5,10 +5,12 @@ package kotlinx.coroutines.jdk9 import kotlinx.coroutines.* +import kotlinx.coroutines.exceptions.* import org.junit.Test import kotlinx.coroutines.flow.flowOn import org.junit.runner.* import org.junit.runners.* +import kotlin.contracts.* import java.util.concurrent.Flow as JFlow import kotlin.coroutines.* import kotlin.test.* @@ -129,4 +131,20 @@ class IntegrationTest( assertEquals(n, last) } -} \ No newline at end of file +} + +@OptIn(ExperimentalContracts::class) +internal suspend inline fun assertCallsExceptionHandlerWith( + crossinline operation: suspend (CoroutineExceptionHandler) -> Unit): E { + contract { + callsInPlace(operation, InvocationKind.EXACTLY_ONCE) + } + val handler = CapturingHandler() + return withContext(handler) { + operation(handler) + handler.getException().let { + assertTrue(it is E, it.toString()) + it + } + } +} diff --git a/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt b/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt index 1a36a389fa..3682d5e318 100644 --- a/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt +++ b/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.jdk9 import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import org.junit.Test import java.util.concurrent.Flow as JFlow import kotlin.test.* @@ -121,44 +122,110 @@ class PublishTest : TestBase() { finish(7) } + /** Tests that, as soon as `ProducerScope.close` is called, `isClosedForSend` starts returning `true`. */ @Test - fun testOnNextError() = runTest { + fun testChannelClosing() = runTest { expect(1) - val publisher = flowPublish(currentDispatcher()) { + val publisher = flowPublish(Dispatchers.Unconfined) { + expect(3) + close() + assert(isClosedForSend) expect(4) - try { - send("OK") - } catch(e: Throwable) { - expect(6) - assert(e is TestException) - } } - expect(2) + try { + expect(2) + publisher.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(5) + } + finish(6) + } + + @Test + fun testOnNextError() = runTest { val latch = CompletableDeferred() - publisher.subscribe(object : JFlow.Subscriber { - override fun onComplete() { - expectUnreached() + expect(1) + assertCallsExceptionHandlerWith { exceptionHandler -> + val publisher = flowPublish(currentDispatcher() + exceptionHandler) { + expect(4) + try { + send("OK") + } catch (e: Throwable) { + expect(6) + assert(e is TestException) + assert(isClosedForSend) + latch.complete(Unit) + } } + expect(2) + publisher.subscribe(object : JFlow.Subscriber { + override fun onComplete() { + expectUnreached() + } - override fun onSubscribe(s: JFlow.Subscription) { - expect(3) - s.request(1) - } + override fun onSubscribe(s: JFlow.Subscription) { + expect(3) + s.request(1) + } - override fun onNext(t: String) { - expect(5) - assertEquals("OK", t) - throw TestException() - } + override fun onNext(t: String) { + expect(5) + assertEquals("OK", t) + throw TestException() + } - override fun onError(t: Throwable) { - expect(7) - assert(t is TestException) - latch.complete(Unit) + override fun onError(t: Throwable) { + expectUnreached() + } + }) + latch.await() + } + finish(7) + } + + /** Tests the behavior when a call to `onNext` fails after the channel is already closed. */ + @Test + fun testOnNextErrorAfterCancellation() = runTest { + assertCallsExceptionHandlerWith { handler -> + var producerScope: ProducerScope? = null + CompletableDeferred() + expect(1) + var job: Job? = null + val publisher = flowPublish(handler + Dispatchers.Unconfined) { + producerScope = this + expect(4) + job = launch { + delay(Long.MAX_VALUE) + } } - }) - latch.await() - finish(8) + expect(2) + publisher.subscribe(object: JFlow.Subscriber { + override fun onSubscribe(s: JFlow.Subscription) { + expect(3) + s.request(Long.MAX_VALUE) + } + override fun onNext(t: Int) { + expect(6) + assertEquals(1, t) + job!!.cancel() + throw TestException() + } + override fun onError(t: Throwable?) { + /* Correct changes to the implementation could lead to us entering or not entering this method, but + it only matters that if we do, it is the "correct" exception that was validly used to cancel the + coroutine that gets passed here and not `TestException`. */ + assertTrue(t is CancellationException) + } + override fun onComplete() { expectUnreached() } + }) + expect(5) + val result: ChannelResult = producerScope!!.trySend(1) + val e = result.exceptionOrNull()!! + assertTrue(e is CancellationException, "The actual error: $e") + assertTrue(producerScope!!.isClosedForSend) + assertTrue(result.isFailure) + } + finish(7) } @Test @@ -182,4 +249,39 @@ class PublishTest : TestBase() { fun testIllegalArgumentException() { assertFailsWith { flowPublish(Job()) { } } } + + /** Tests that `trySend` doesn't throw in `flowPublish`. */ + @Test + fun testTrySendNotThrowing() = runTest { + var producerScope: ProducerScope? = null + expect(1) + val publisher = flowPublish(Dispatchers.Unconfined) { + producerScope = this + expect(3) + delay(Long.MAX_VALUE) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + expect(2) + publisher.awaitFirstOrNull() + expectUnreached() + } + job.cancel() + expect(4) + val result = producerScope!!.trySend(1) + assertTrue(result.isFailure) + finish(5) + } + + /** Tests that all methods on `flowPublish` fail without closing the channel when attempting to emit `null`. */ + @Test + fun testEmittingNull() = runTest { + val publisher = flowPublish { + assertFailsWith { send(null) } + assertFailsWith { trySend(null) } + @Suppress("DEPRECATION") + assertFailsWith { offer(null) } + send("OK") + } + assertEquals("OK", publisher.awaitFirstOrNull()) + } } \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 383a17d836..37113849ab 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import org.reactivestreams.* import kotlin.coroutines.* -import kotlin.internal.* /** * Creates cold reactive [Publisher] that runs a given [block] in a coroutine. @@ -74,29 +73,26 @@ public class PublisherCoroutine( private val _nRequested = atomic(0L) // < 0 when closed (CLOSED or SIGNALLED) @Volatile - private var cancelled = false // true when Subscription.cancel() is invoked + private var cancelled = false // true after Subscription.cancel() is invoked - override val isClosedForSend: Boolean get() = isCompleted + override val isClosedForSend: Boolean get() = !isActive override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit): Nothing = throw UnsupportedOperationException("PublisherCoroutine doesn't support invokeOnClose") - override fun trySend(element: T): ChannelResult { - if (!mutex.tryLock()) return ChannelResult.failure() - doLockedNext(element) - return ChannelResult.success(Unit) - } + override fun trySend(element: T): ChannelResult = + if (!mutex.tryLock()) { + ChannelResult.failure() + } else { + when (val throwable = doLockedNext(element)) { + null -> ChannelResult.success(Unit) + else -> ChannelResult.closed(throwable) + } + } public override suspend fun send(element: T) { - // fast-path -- try send without suspension - if (trySend(element).isSuccess) return - // slow-path does suspend - return sendSuspend(element) - } - - private suspend fun sendSuspend(element: T) { mutex.lock() - doLockedNext(element) + doLockedNext(element)?.let { throw it } } override val onSend: SelectClause2> @@ -106,13 +102,13 @@ public class PublisherCoroutine( @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") override fun registerSelectClause2(select: SelectInstance, element: T, block: suspend (SendChannel) -> R) { mutex.onLock.registerSelectClause2(select, null) { - doLockedNext(element) + doLockedNext(element)?.let { throw it } block(this) } } /* - * This code is not trivial because of the two properties: + * This code is not trivial because of the following properties: * 1. It ensures conformance to the reactive specification that mandates that onXXX invocations should not * be concurrent. It uses Mutex to protect all onXXX invocation and ensure conformance even when multiple * coroutines are invoking `send` function. @@ -121,27 +117,61 @@ public class PublisherCoroutine( * globally-scoped coroutine that is invoking `send` outside of this context. Without extra precaution this may * lead to `onNext` that is concurrent with `onComplete/onError`, so that is why signalling for * `onComplete/onError` is also done under the same mutex. + * 3. The reactive specification forbids emitting more elements than requested, so `onNext` is forbidden until the + * subscriber actually requests some elements. This is implemented by the mutex being locked when emitting + * elements is not permitted (`_nRequested.value == 0`). */ - // assert: mutex.isLocked() - private fun doLockedNext(elem: T) { - // check if already closed for send, note that isActive becomes false as soon as cancel() is invoked, - // because the job is cancelled, so this check also ensure conformance to the reactive specification's - // requirement that after cancellation requested we don't call onXXX + /** + * Attempts to emit a value to the subscriber and, if back-pressure permits this, unlock the mutex. + * + * Requires that the caller has locked the mutex before this invocation. + * + * If the channel is closed, returns the corresponding [Throwable]; otherwise, returns `null` to denote success. + * + * @throws NullPointerException if the passed element is `null` + */ + private fun doLockedNext(elem: T): Throwable? { + if (elem == null) { + unlockAndCheckCompleted() + throw NullPointerException("Attempted to emit `null` inside a reactive publisher") + } + /** This guards against the case when the caller of this function managed to lock the mutex not because some + * elements were requested--and thus it is permitted to call `onNext`--but because the channel was closed. + * + * It may look like there is a race condition here between `isActive` and a concurrent cancellation, but it's + * okay for a cancellation to happen during `onNext`, as the reactive spec only requires that we *eventually* + * stop signalling the subscriber. */ if (!isActive) { unlockAndCheckCompleted() - throw getCancellationException() + return getCancellationException() } - // notify subscriber + // notify the subscriber try { subscriber.onNext(elem) - } catch (e: Throwable) { - // If onNext fails with exception, then we cancel coroutine (with this exception) and then rethrow it - // to abort the corresponding send/offer invocation. From the standpoint of coroutines machinery, - // this failure is essentially equivalent to a failure of a child coroutine. - cancelCoroutine(e) + } catch (cause: Throwable) { + /** The reactive streams spec forbids the subscribers from throwing from [Subscriber.onNext] unless the + * element is `null`, which we check not to be the case. Therefore, we report this exception to the handler + * for uncaught exceptions and consider the subscription cancelled, as mandated by + * https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2.13. + * + * Some reactive implementations, like RxJava or Reactor, are known to throw from [Subscriber.onNext] if the + * execution encounters an exception they consider to be "fatal", like [VirtualMachineError] or + * [ThreadDeath]. Us using the handler for the undeliverable exceptions to signal "fatal" exceptions is + * inconsistent with RxJava and Reactor, which attempt to bubble the exception up the call chain as soon as + * possible. However, we can't do much better here, as simply throwing from all methods indiscriminately + * would violate the contracts we place on them. */ + cancelled = true + val causeDelivered = close(cause) unlockAndCheckCompleted() - throw e + return if (causeDelivered) { + // `cause` is the reason this channel is closed + cause + } else { + // Someone else closed the channel during `onNext`. We report `cause` as an undeliverable exception. + exceptionOnCancelHandler(cause, context) + getCancellationException() + } } // now update nRequested while (true) { // lock-free loop on nRequested @@ -152,12 +182,13 @@ public class PublisherCoroutine( if (_nRequested.compareAndSet(current, updated)) { if (updated == 0L) { // return to keep locked due to back-pressure - return + return null } break // unlock if updated > 0 } } unlockAndCheckCompleted() + return null } private fun unlockAndCheckCompleted() { @@ -177,38 +208,31 @@ public class PublisherCoroutine( // assert: mutex.isLocked() & isCompleted private fun doLockedSignalCompleted(cause: Throwable?, handled: Boolean) { try { - if (_nRequested.value >= CLOSED) { - _nRequested.value = SIGNALLED // we'll signal onError/onCompleted (that the final state -- no CAS needed) - // Specification requires that after cancellation requested we don't call onXXX - if (cancelled) { - // If the parent had failed to handle our exception, then we must not lose this exception - if (cause != null && !handled) exceptionOnCancelHandler(cause, context) - return - } - + if (_nRequested.value == SIGNALLED) + return + _nRequested.value = SIGNALLED // we'll signal onError/onCompleted (the final state, so no CAS needed) + // Specification requires that after the cancellation is requested we eventually stop calling onXXX + if (cancelled) { + // If the parent failed to handle this exception, then we must not lose the exception + if (cause != null && !handled) exceptionOnCancelHandler(cause, context) + return + } + if (cause == null) { try { - if (cause != null && cause !is CancellationException) { - /* - * Reactive frameworks have two types of exceptions: regular and fatal. - * Regular are passed to onError. - * Fatal can be passed to onError, but even the standard implementations **can just swallow it** (e.g. see #1297). - * Such behaviour is inconsistent, leads to silent failures and we can't possibly know whether - * the cause will be handled by onError (and moreover, it depends on whether a fatal exception was - * thrown by subscriber or upstream). - * To make behaviour consistent and least surprising, we always handle fatal exceptions - * by coroutines machinery, anyway, they should not be present in regular program flow, - * thus our goal here is just to expose it as soon as possible. - */ - subscriber.onError(cause) - if (!handled && cause.isFatal()) { - exceptionOnCancelHandler(cause, context) - } - } else { - subscriber.onComplete() - } + subscriber.onComplete() } catch (e: Throwable) { handleCoroutineException(context, e) } + } else { + try { + // This can't be the cancellation exception from `cancel`, as then `cancelled` would be `true`. + subscriber.onError(cause) + } catch (e: Throwable) { + if (e !== cause) { + cause.addSuppressed(e) + } + handleCoroutineException(context, cause) + } } } finally { mutex.unlock() @@ -217,13 +241,13 @@ public class PublisherCoroutine( override fun request(n: Long) { if (n <= 0) { - // Specification requires IAE for n <= 0 + // Specification requires to call onError with IAE for n <= 0 cancelCoroutine(IllegalArgumentException("non-positive subscription request $n")) return } while (true) { // lock-free loop for nRequested val cur = _nRequested.value - if (cur < 0) return // already closed for send, ignore requests + if (cur < 0) return // already closed for send, ignore requests, as mandated by the reactive streams spec var upd = cur + n if (upd < 0 || n == Long.MAX_VALUE) upd = Long.MAX_VALUE @@ -231,6 +255,11 @@ public class PublisherCoroutine( if (_nRequested.compareAndSet(cur, upd)) { // unlock the mutex when we don't have back-pressure anymore if (cur == 0L) { + /** In a sense, after a successful CAS, it is this invocation, not the coroutine itself, that owns + * the lock, given that `upd` is necessarily strictly positive. Thus, no other operation has the + * right to lower the value on [_nRequested], it can only grow or become [CLOSED]. Therefore, it is + * impossible for any other operations to assume that they own the lock without actually acquiring + * it. */ unlockAndCheckCompleted() } return @@ -271,8 +300,6 @@ public class PublisherCoroutine( cancelled = true super.cancel(null) } - - private fun Throwable.isFatal() = this is VirtualMachineError || this is ThreadDeath || this is LinkageError } @Deprecated( diff --git a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt index f0245388bf..1f197f94ed 100644 --- a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.intrinsics.* import org.reactivestreams.* import java.util.* import kotlin.coroutines.* +import kotlinx.coroutines.internal.* /** * Transforms the given reactive [Publisher] into [Flow]. @@ -195,6 +196,8 @@ public class FlowSubscription( */ private val requested = atomic(0L) private val producer = atomic?>(createInitialContinuation()) + @Volatile + private var cancellationRequested = false // This code wraps startCoroutineCancellable into continuation private fun createInitialContinuation(): Continuation = Continuation(coroutineContext) { @@ -204,18 +207,25 @@ public class FlowSubscription( private suspend fun flowProcessing() { try { consumeFlow() - subscriber.onComplete() - } catch (e: Throwable) { - try { - if (e is CancellationException) { - subscriber.onComplete() - } else { - subscriber.onError(e) + } catch (cause: Throwable) { + @Suppress("INVISIBLE_MEMBER") + val unwrappedCause = unwrap(cause) + if (!cancellationRequested || isActive || unwrappedCause !== getCancellationException()) { + try { + subscriber.onError(cause) + } catch (e: Throwable) { + // Last ditch report + cause.addSuppressed(e) + handleCoroutineException(coroutineContext, cause) } - } catch (e: Throwable) { - // Last ditch report - handleCoroutineException(coroutineContext, e) } + return + } + // We only call this if `consumeFlow()` finished successfully + try { + subscriber.onComplete() + } catch (e: Throwable) { + handleCoroutineException(coroutineContext, e) } } @@ -239,6 +249,7 @@ public class FlowSubscription( } override fun cancel() { + cancellationRequested = true cancel(null) } diff --git a/reactive/kotlinx-coroutines-reactive/test/FlowAsPublisherTest.kt b/reactive/kotlinx-coroutines-reactive/test/FlowAsPublisherTest.kt index e7b8cb17ae..02c9e242e9 100644 --- a/reactive/kotlinx-coroutines-reactive/test/FlowAsPublisherTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/FlowAsPublisherTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.flow.* import org.junit.Test import org.reactivestreams.* @@ -15,7 +16,7 @@ class FlowAsPublisherTest : TestBase() { @Test fun testErrorOnCancellationIsReported() { expect(1) - flow { + flow { try { emit(2) } finally { @@ -50,13 +51,13 @@ class FlowAsPublisherTest : TestBase() { @Test fun testCancellationIsNotReported() { expect(1) - flow { + flow { emit(2) }.asPublisher().subscribe(object : Subscriber { private lateinit var subscription: Subscription override fun onComplete() { - expect(3) + expectUnreached() } override fun onSubscribe(s: Subscription?) { @@ -73,7 +74,7 @@ class FlowAsPublisherTest : TestBase() { expectUnreached() } }) - finish(4) + finish(3) } @Test @@ -149,4 +150,19 @@ class FlowAsPublisherTest : TestBase() { } finish(5) } + + @Test + fun testFlowWithTimeout() = runTest { + val publisher = flow { + expect(2) + withTimeout(1) { delay(Long.MAX_VALUE) } + }.asPublisher() + try { + expect(1) + publisher.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(3) + } + finish(4) + } } diff --git a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt index 72479b5c6a..efe7ec7e45 100644 --- a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt @@ -5,12 +5,14 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.exceptions.* import org.junit.Test import org.junit.runner.* import org.junit.runners.* import org.reactivestreams.* import java.lang.IllegalStateException import java.lang.RuntimeException +import kotlin.contracts.* import kotlin.coroutines.* import kotlin.test.* @@ -218,32 +220,35 @@ class IntegrationTest( }.let { assertTrue(it.message?.contains("onSubscribe") ?: false) } } - private suspend inline fun assertCallsExceptionHandlerWith( - crossinline operation: suspend () -> Unit): E - { - val caughtExceptions = mutableListOf() - val exceptionHandler = object: AbstractCoroutineContextElement(CoroutineExceptionHandler), - CoroutineExceptionHandler - { - override fun handleException(context: CoroutineContext, exception: Throwable) { - caughtExceptions += exception - } + @Test + fun testPublishWithTimeout() = runTest { + val publisher = publish { + expect(2) + withTimeout(1) { delay(100) } } - return withContext(exceptionHandler) { - operation() - caughtExceptions.single().let { - assertTrue(it is E) - it - } + try { + expect(1) + publisher.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(3) } + finish(4) } - private suspend fun checkNumbers(n: Int, pub: Publisher) { - var last = 0 - pub.collect { - assertEquals(++last, it) +} + +@OptIn(ExperimentalContracts::class) +internal suspend inline fun assertCallsExceptionHandlerWith( + crossinline operation: suspend (CoroutineExceptionHandler) -> Unit): E { + contract { + callsInPlace(operation, InvocationKind.EXACTLY_ONCE) + } + val handler = CapturingHandler() + return withContext(handler) { + operation(handler) + handler.getException().let { + assertTrue(it is E, it.toString()) + it } - assertEquals(n, last) } - -} +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt index 9e3c07b6b7..095b724d40 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import org.junit.Test import org.reactivestreams.* import kotlin.test.* @@ -121,44 +122,110 @@ class PublishTest : TestBase() { finish(7) } + /** Tests that, as soon as `ProducerScope.close` is called, `isClosedForSend` starts returning `true`. */ @Test - fun testOnNextError() = runTest { + fun testChannelClosing() = runTest { expect(1) - val publisher = publish(currentDispatcher()) { + val publisher = publish(Dispatchers.Unconfined) { + expect(3) + close() + assert(isClosedForSend) expect(4) - try { - send("OK") - } catch(e: Throwable) { - expect(6) - assert(e is TestException) - } } - expect(2) + try { + expect(2) + publisher.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(5) + } + finish(6) + } + + @Test + fun testOnNextError() = runTest { val latch = CompletableDeferred() - publisher.subscribe(object : Subscriber { - override fun onComplete() { - expectUnreached() + expect(1) + assertCallsExceptionHandlerWith { exceptionHandler -> + val publisher = publish(currentDispatcher() + exceptionHandler) { + expect(4) + try { + send("OK") + } catch (e: Throwable) { + expect(6) + assert(e is TestException) + assert(isClosedForSend) + latch.complete(Unit) + } } + expect(2) + publisher.subscribe(object : Subscriber { + override fun onComplete() { + expectUnreached() + } - override fun onSubscribe(s: Subscription) { - expect(3) - s.request(1) - } + override fun onSubscribe(s: Subscription) { + expect(3) + s.request(1) + } - override fun onNext(t: String) { - expect(5) - assertEquals("OK", t) - throw TestException() - } + override fun onNext(t: String) { + expect(5) + assertEquals("OK", t) + throw TestException() + } - override fun onError(t: Throwable) { - expect(7) - assert(t is TestException) - latch.complete(Unit) + override fun onError(t: Throwable) { + expectUnreached() + } + }) + latch.await() + } + finish(7) + } + + /** Tests the behavior when a call to `onNext` fails after the channel is already closed. */ + @Test + fun testOnNextErrorAfterCancellation() = runTest { + assertCallsExceptionHandlerWith { handler -> + var producerScope: ProducerScope? = null + CompletableDeferred() + expect(1) + var job: Job? = null + val publisher = publish(handler + Dispatchers.Unconfined) { + producerScope = this + expect(4) + job = launch { + delay(Long.MAX_VALUE) + } } - }) - latch.await() - finish(8) + expect(2) + publisher.subscribe(object: Subscriber { + override fun onSubscribe(s: Subscription) { + expect(3) + s.request(Long.MAX_VALUE) + } + override fun onNext(t: Int) { + expect(6) + assertEquals(1, t) + job!!.cancel() + throw TestException() + } + override fun onError(t: Throwable?) { + /* Correct changes to the implementation could lead to us entering or not entering this method, but + it only matters that if we do, it is the "correct" exception that was validly used to cancel the + coroutine that gets passed here and not `TestException`. */ + assertTrue(t is CancellationException) + } + override fun onComplete() { expectUnreached() } + }) + expect(5) + val result: ChannelResult = producerScope!!.trySend(1) + val e = result.exceptionOrNull()!! + assertTrue(e is CancellationException, "The actual error: $e") + assertTrue(producerScope!!.isClosedForSend) + assertTrue(result.isFailure) + } + finish(7) } @Test @@ -182,4 +249,39 @@ class PublishTest : TestBase() { fun testIllegalArgumentException() { assertFailsWith { publish(Job()) { } } } + + /** Tests that `trySend` doesn't throw in `publish`. */ + @Test + fun testTrySendNotThrowing() = runTest { + var producerScope: ProducerScope? = null + expect(1) + val publisher = publish(Dispatchers.Unconfined) { + producerScope = this + expect(3) + delay(Long.MAX_VALUE) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + expect(2) + publisher.awaitFirstOrNull() + expectUnreached() + } + job.cancel() + expect(4) + val result = producerScope!!.trySend(1) + assertTrue(result.isFailure) + finish(5) + } + + /** Tests that all methods on `publish` fail without closing the channel when attempting to emit `null`. */ + @Test + fun testEmittingNull() = runTest { + val publisher = publish { + assertFailsWith { send(null) } + assertFailsWith { trySend(null) } + @Suppress("DEPRECATION") + assertFailsWith { offer(null) } + send("OK") + } + assertEquals("OK", publisher.awaitFirstOrNull()) + } } \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt index 736a66404f..9b069dcaec 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt @@ -29,13 +29,14 @@ import kotlin.random.* */ @Suppress("ReactiveStreamsSubscriberImplementation") class PublisherRequestStressTest : TestBase() { + private val testDurationSec = 3 * stressTestMultiplier // Original code in Amazon SDK uses 4 and 16 as low/high watermarks. - // There constants were chosen so that problem reproduces asap with particular this code. + // These constants were chosen so that problem reproduces asap with particular this code. private val minDemand = 8L private val maxDemand = 16L - + private val nEmitThreads = 4 private val emitThreadNo = AtomicInteger() @@ -47,7 +48,7 @@ class PublisherRequestStressTest : TestBase() { private val reqPool = Executors.newSingleThreadExecutor { r -> Thread(r, "PublisherRequestStressTest-req") } - + private val nextValue = AtomicLong(0) @After @@ -64,7 +65,6 @@ class PublisherRequestStressTest : TestBase() { fun testRequestStress() { val expectedValue = AtomicLong(0) val requestedTill = AtomicLong(0) - val completionLatch = CountDownLatch(1) val callingOnNext = AtomicInteger() val publisher = mtFlow().asPublisher() @@ -74,7 +74,7 @@ class PublisherRequestStressTest : TestBase() { private var demand = 0L // only updated from reqPool override fun onComplete() { - completionLatch.countDown() + expectUnreached() } override fun onSubscribe(sub: Subscription) { @@ -123,7 +123,9 @@ class PublisherRequestStressTest : TestBase() { } if (!error) { subscription.cancel() - completionLatch.await() + runBlocking { + (subscription as AbstractCoroutine<*>).join() + } } } diff --git a/reactive/kotlinx-coroutines-reactor/src/Flux.kt b/reactive/kotlinx-coroutines-reactor/src/Flux.kt index b7143288ee..806f5bd5bc 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Flux.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Flux.kt @@ -55,12 +55,13 @@ private fun reactorPublish( coroutine.start(CoroutineStart.DEFAULT, coroutine, block) } -private val REACTOR_HANDLER: (Throwable, CoroutineContext) -> Unit = { e, ctx -> - if (e !is CancellationException) { +private val REACTOR_HANDLER: (Throwable, CoroutineContext) -> Unit = { cause, ctx -> + if (cause !is CancellationException) { try { - Operators.onOperatorError(e, ctx[ReactorContext]?.context ?: Context.empty()) + Operators.onOperatorError(cause, ctx[ReactorContext]?.context ?: Context.empty()) } catch (e: Throwable) { - handleCoroutineException(ctx, e) + cause.addSuppressed(e) + handleCoroutineException(ctx, cause) } } } diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 307ec2278c..6e7b95ba6e 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -13,6 +13,7 @@ import reactor.core.* import reactor.core.publisher.* import kotlin.coroutines.* import kotlin.internal.* +import kotlinx.coroutines.internal.* /** * Creates a cold [mono][Mono] that runs a given [block] in a coroutine and emits its result. @@ -59,13 +60,15 @@ private class MonoCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { /** Cancellation exceptions that were caused by [dispose], that is, came from downstream, are not errors. */ - if (getCancellationException() !== cause || !disposed) { + val unwrappedCause = unwrap(cause) + if (getCancellationException() !== unwrappedCause || !disposed) { try { /** If [sink] turns out to already be in a terminal state, this exception will be passed through the * [Hooks.onOperatorError] hook, which is the way to signal undeliverable exceptions in Reactor. */ sink.error(cause) } catch (e: Throwable) { // In case of improper error implementation or fatal exceptions + cause.addSuppressed(e) handleCoroutineException(context, cause) } } diff --git a/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt b/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt index 31f5f5d979..d059eb6622 100644 --- a/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt @@ -5,9 +5,9 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.* import kotlinx.coroutines.reactive.* -import org.junit.* import org.junit.Test import kotlin.test.* @@ -141,4 +141,39 @@ class FluxTest : TestBase() { .collect { } } } + + /** Tests that `trySend` doesn't throw in `flux`. */ + @Test + fun testTrySendNotThrowing() = runTest { + var producerScope: ProducerScope? = null + expect(1) + val flux = flux(Dispatchers.Unconfined) { + producerScope = this + expect(3) + delay(Long.MAX_VALUE) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + expect(2) + flux.awaitFirstOrNull() + expectUnreached() + } + job.cancel() + expect(4) + val result = producerScope!!.trySend(1) + assertTrue(result.isFailure) + finish(5) + } + + /** Tests that all methods on `flux` fail without closing the channel when attempting to emit `null`. */ + @Test + fun testEmittingNull() = runTest { + val flux = flux { + assertFailsWith { send(null) } + assertFailsWith { trySend(null) } + @Suppress("DEPRECATION") + assertFailsWith { offer(null) } + send("OK") + } + assertEquals("OK", flux.awaitFirstOrNull()) + } } \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx2/README.md b/reactive/kotlinx-coroutines-rx2/README.md index 40fe122f89..1ae2c8a04c 100644 --- a/reactive/kotlinx-coroutines-rx2/README.md +++ b/reactive/kotlinx-coroutines-rx2/README.md @@ -35,7 +35,6 @@ Suspending extension functions and suspending iteration: | [ObservableSource.awaitFirstOrNull][io.reactivex.ObservableSource.awaitFirstOrNull] | Awaits for the first value from the given observable or null | [ObservableSource.awaitLast][io.reactivex.ObservableSource.awaitFirst] | Awaits for the last value from the given observable | [ObservableSource.awaitSingle][io.reactivex.ObservableSource.awaitSingle] | Awaits for the single value from the given observable -| [ObservableSource.openSubscription][io.reactivex.ObservableSource.openSubscription] | Subscribes to observable and returns [ReceiveChannel] Note that `Flowable` is a subclass of [Reactive Streams](https://www.reactive-streams.org) `Publisher` and extensions for it are covered by @@ -47,7 +46,6 @@ Conversion functions: | -------- | --------------- | [Job.asCompletable][kotlinx.coroutines.Job.asCompletable] | Converts job to hot completable | [Deferred.asSingle][kotlinx.coroutines.Deferred.asSingle] | Converts deferred value to hot single -| [ReceiveChannel.asObservable][kotlinx.coroutines.channels.ReceiveChannel.asObservable] | Converts streaming channel to hot observable | [Scheduler.asCoroutineDispatcher][io.reactivex.Scheduler.asCoroutineDispatcher] | Converts scheduler to [CoroutineDispatcher] @@ -86,10 +84,8 @@ Conversion functions: [io.reactivex.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first-or-else.html [io.reactivex.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first-or-null.html [io.reactivex.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-single.html -[io.reactivex.ObservableSource.openSubscription]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/open-subscription.html [kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.-job/as-completable.html [kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.-deferred/as-single.html -[kotlinx.coroutines.channels.ReceiveChannel.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.channels.-receive-channel/as-observable.html [io.reactivex.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-scheduler/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCancellable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCancellable.kt index 0fe43f1cee..3e39033ed7 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCancellable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCancellable.kt @@ -20,6 +20,7 @@ internal fun handleUndeliverableException(cause: Throwable, context: CoroutineCo try { RxJavaPlugins.onError(cause) } catch (e: Throwable) { + cause.addSuppressed(e) handleCoroutineException(context, cause) } } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt index eee84b1bb6..3f6c27a693 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt @@ -50,12 +50,13 @@ private class RxCompletableCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt index 9682373a79..aa531c6ecf 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt @@ -51,12 +51,13 @@ private class RxMaybeCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 09c5dc1d9f..c096c0d254 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -9,6 +9,7 @@ import io.reactivex.exceptions.* import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +import kotlinx.coroutines.internal.* import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import kotlin.coroutines.* @@ -60,38 +61,29 @@ private class RxObservableCoroutine( ) : AbstractCoroutine(parentContext, false, true), ProducerScope, SelectClause2> { override val channel: SendChannel get() = this - // Mutex is locked when while subscriber.onXXX is being invoked + // Mutex is locked while subscriber.onXXX is being invoked private val mutex = Mutex() private val _signal = atomic(OPEN) - override val isClosedForSend: Boolean get() = isCompleted + override val isClosedForSend: Boolean get() = !isActive override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit) = throw UnsupportedOperationException("RxObservableCoroutine doesn't support invokeOnClose") - override fun offer(element: T): Boolean { - if (!mutex.tryLock()) return false - doLockedNext(element) - return true - } - - override fun trySend(element: T): ChannelResult { - if (!mutex.tryLock()) return ChannelResult.failure() - doLockedNext(element) - return ChannelResult.success(Unit) - } + override fun trySend(element: T): ChannelResult = + if (!mutex.tryLock()) { + ChannelResult.failure() + } else { + when (val throwable = doLockedNext(element)) { + null -> ChannelResult.success(Unit) + else -> ChannelResult.closed(throwable) + } + } public override suspend fun send(element: T) { - // fast-path -- try send without suspension - if (trySend(element).isSuccess) return - // slow-path does suspend - return sendSuspend(element) - } - - private suspend fun sendSuspend(element: T) { mutex.lock() - doLockedNext(element) + doLockedNext(element)?.let { throw it } } override val onSend: SelectClause2> @@ -99,30 +91,39 @@ private class RxObservableCoroutine( // registerSelectSend @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") - override fun registerSelectClause2(select: SelectInstance, element: T, block: suspend (SendChannel) -> R) { + override fun registerSelectClause2( + select: SelectInstance, + element: T, + block: suspend (SendChannel) -> R + ) { mutex.onLock.registerSelectClause2(select, null) { - doLockedNext(element) + doLockedNext(element)?.let { throw it } block(this) } } // assert: mutex.isLocked() - private fun doLockedNext(elem: T) { + private fun doLockedNext(elem: T): Throwable? { // check if already closed for send if (!isActive) { doLockedSignalCompleted(completionCause, completionCauseHandled) - throw getCancellationException() + return getCancellationException() } // notify subscriber try { subscriber.onNext(elem) } catch (e: Throwable) { - // If onNext fails with exception, then we cancel coroutine (with this exception) and then rethrow it - // to abort the corresponding send/offer invocation. From the standpoint of coroutines machinery, - // this failure is essentially equivalent to a failure of a child coroutine. - cancelCoroutine(e) - mutex.unlock() - throw e + val cause = UndeliverableException(e) + val causeDelivered = close(cause) + unlockAndCheckCompleted() + return if (causeDelivered) { + // `cause` is the reason this channel is closed + cause + } else { + // Someone else closed the channel during `onNext`. We report `cause` as an undeliverable exception. + handleUndeliverableException(cause, context) + getCancellationException() + } } /* * There is no sense to check for `isActive` before doing `unlock`, because cancellation/completion might @@ -131,6 +132,7 @@ private class RxObservableCoroutine( * We have to recheck `isCompleted` after `unlock` anyway. */ unlockAndCheckCompleted() + return null } private fun unlockAndCheckCompleted() { @@ -144,33 +146,31 @@ private class RxObservableCoroutine( private fun doLockedSignalCompleted(cause: Throwable?, handled: Boolean) { // cancellation failures try { - if (_signal.value >= CLOSED) { - _signal.value = SIGNALLED // we'll signal onError/onCompleted (that the final state -- no CAS needed) + if (_signal.value == SIGNALLED) + return + _signal.value = SIGNALLED // we'll signal onError/onCompleted (that the final state -- no CAS needed) + @Suppress("INVISIBLE_MEMBER") + val unwrappedCause = cause?.let { unwrap(it) } + if (unwrappedCause == null) { try { - if (cause != null && cause !is CancellationException) { - /* - * Reactive frameworks have two types of exceptions: regular and fatal. - * Regular are passed to onError. - * Fatal can be passed to onError, but even the standard implementations **can just swallow it** (e.g. see #1297). - * Such behaviour is inconsistent, leads to silent failures and we can't possibly know whether - * the cause will be handled by onError (and moreover, it depends on whether a fatal exception was - * thrown by subscriber or upstream). - * To make behaviour consistent and least surprising, we always handle fatal exceptions - * by coroutines machinery, anyway, they should not be present in regular program flow, - * thus our goal here is just to expose it as soon as possible. - */ - subscriber.tryOnError(cause) - if (!handled && cause.isFatal()) { - handleUndeliverableException(cause, context) - } - } - else { - subscriber.onComplete() - } - } catch (e: Throwable) { - // Unhandled exception (cannot handle in other way, since we are already complete) + subscriber.onComplete() + } catch (e: Exception) { handleUndeliverableException(e, context) } + } else if (unwrappedCause is UndeliverableException && !handled) { + /** Such exceptions are not reported to `onError`, as, according to the reactive specifications, + * exceptions thrown from the Subscriber methods must be treated as if the Subscriber was already + * cancelled. */ + handleUndeliverableException(cause, context) + } else if (unwrappedCause !== getCancellationException() || !subscriber.isDisposed) { + try { + /** If the subscriber is already in a terminal state, the error will be signalled to + * `RxJavaPlugins.onError`. */ + subscriber.onError(cause) + } catch (e: Exception) { + cause.addSuppressed(e) + handleUndeliverableException(cause, context) + } } } finally { mutex.unlock() @@ -192,13 +192,6 @@ private class RxObservableCoroutine( } } -internal fun Throwable.isFatal() = try { - Exceptions.throwIfFatal(this) // Rx-consistent behaviour without hardcode - false -} catch (e: Throwable) { - true -} - @Deprecated( message = "CoroutineScope.rxObservable is deprecated in favour of top-level rxObservable", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt index 49a9bb8dd6..c7ad606eb6 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt @@ -50,12 +50,13 @@ private class RxSingleCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx2/test/FlowableExceptionHandlingTest.kt b/reactive/kotlinx-coroutines-rx2/test/FlowableExceptionHandlingTest.kt index 05b7ee92b6..316439293f 100644 --- a/reactive/kotlinx-coroutines-rx2/test/FlowableExceptionHandlingTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/FlowableExceptionHandlingTest.kt @@ -38,16 +38,16 @@ class FlowableExceptionHandlingTest : TestBase() { } @Test - fun testFatalException() = withExceptionHandler(handler(3)) { + fun testFatalException() = withExceptionHandler({ expectUnreached() }) { rxFlowable(Dispatchers.Unconfined) { expect(1) throw LinkageError() }.subscribe({ expectUnreached() }, { - expect(2) // Fatal exception is reported to both onError and CEH + expect(2) // Fatal exceptions are not treated as special }) - finish(4) + finish(3) } @Test @@ -66,7 +66,7 @@ class FlowableExceptionHandlingTest : TestBase() { } @Test - fun testFatalExceptionAsynchronous() = withExceptionHandler(handler(3)) { + fun testFatalExceptionAsynchronous() = withExceptionHandler({ expectUnreached() }) { rxFlowable(Dispatchers.Unconfined) { expect(1) throw LinkageError() @@ -77,19 +77,19 @@ class FlowableExceptionHandlingTest : TestBase() { }, { expect(2) }) - finish(4) + finish(3) } @Test - fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { rxFlowable(Dispatchers.Unconfined) { expect(1) send(Unit) }.subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) // Fatal exception is reported to both onError and CEH - finish(5) + }, { expectUnreached() }) // Fatal exception is rethrown from `onNext` => the subscription is thought to be cancelled + finish(4) } @Test diff --git a/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt index 4bf3e4536e..8a6362ad99 100644 --- a/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/IntegrationTest.kt @@ -7,6 +7,7 @@ package kotlinx.coroutines.rx2 import io.reactivex.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* +import kotlinx.coroutines.reactive.* import org.junit.Test import org.junit.runner.* import org.junit.runners.* @@ -124,6 +125,21 @@ class IntegrationTest( finish(3) } + @Test + fun testObservableWithTimeout() = runTest { + val observable = rxObservable { + expect(2) + withTimeout(1) { delay(100) } + } + try { + expect(1) + observable.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(3) + } + finish(4) + } + private suspend fun checkNumbers(n: Int, observable: Observable) { var last = 0 observable.collect { diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableExceptionHandlingTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableExceptionHandlingTest.kt index d6cdd3ca24..fb3d0f69fc 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableExceptionHandlingTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableExceptionHandlingTest.kt @@ -8,6 +8,7 @@ import io.reactivex.exceptions.* import kotlinx.coroutines.* import org.junit.* import org.junit.Test +import java.util.concurrent.* import kotlin.test.* class ObservableExceptionHandlingTest : TestBase() { @@ -18,7 +19,7 @@ class ObservableExceptionHandlingTest : TestBase() { } private inline fun handler(expect: Int) = { t: Throwable -> - assertTrue(t is UndeliverableException && t.cause is T) + assertTrue(t is UndeliverableException && t.cause is T, "$t") expect(expect) } @@ -38,8 +39,8 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testFatalException() = withExceptionHandler(handler(3)) { - rxObservable(Dispatchers.Unconfined) { + fun testFatalException() = withExceptionHandler({ expectUnreached() }) { + rxObservable(Dispatchers.Unconfined + cehUnreached()) { expect(1) throw LinkageError() }.subscribe({ @@ -47,7 +48,7 @@ class ObservableExceptionHandlingTest : TestBase() { }, { expect(2) }) - finish(4) + finish(3) } @Test @@ -66,7 +67,7 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testFatalExceptionAsynchronous() = withExceptionHandler(handler(3)) { + fun testFatalExceptionAsynchronous() = withExceptionHandler({ expectUnreached() }) { rxObservable(Dispatchers.Unconfined) { expect(1) throw LinkageError() @@ -75,20 +76,28 @@ class ObservableExceptionHandlingTest : TestBase() { .subscribe({ expectUnreached() }, { - expect(2) // Fatal exception is not reported in onError + expect(2) // Fatal exceptions are not treated in a special manner }) - finish(4) + finish(3) } @Test - fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { + val latch = CountDownLatch(1) rxObservable(Dispatchers.Unconfined) { expect(1) - send(Unit) + val result = trySend(Unit) + val exception = result.exceptionOrNull() + assertTrue(exception is UndeliverableException) + assertTrue(exception.cause is LinkageError) + assertTrue(isClosedForSend) + expect(4) + latch.countDown() }.subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) // Unreached because fatal errors are rethrown + }, { expectUnreached() }) // Unreached because RxJava bubbles up fatal exceptions, causing `onNext` to throw. + latch.await() finish(5) } @@ -100,7 +109,7 @@ class ObservableExceptionHandlingTest : TestBase() { }.subscribe({ expect(2) throw TestException() - }, { expect(3) }) // not reported to onError because came from the subscribe itself + }, { expect(3) }) finish(4) } @@ -119,7 +128,7 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testAsynchronousFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testAsynchronousFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { rxObservable(Dispatchers.Unconfined) { expect(1) send(Unit) @@ -128,7 +137,7 @@ class ObservableExceptionHandlingTest : TestBase() { .subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) - finish(5) + }, { expectUnreached() }) // Unreached because RxJava bubbles up fatal exceptions, causing `onNext` to throw. + finish(4) } } diff --git a/reactive/kotlinx-coroutines-rx3/src/RxCancellable.kt b/reactive/kotlinx-coroutines-rx3/src/RxCancellable.kt index 2995159850..1017b112f1 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxCancellable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxCancellable.kt @@ -20,6 +20,7 @@ internal fun handleUndeliverableException(cause: Throwable, context: CoroutineCo try { RxJavaPlugins.onError(cause) } catch (e: Throwable) { + cause.addSuppressed(e) handleCoroutineException(context, cause) } } diff --git a/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt index 88137675d8..47cc6ad3ab 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxCompletable.kt @@ -50,11 +50,12 @@ private class RxCompletableCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt index 1c10266470..12d0197bf2 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxMaybe.kt @@ -51,11 +51,12 @@ private class RxMaybeCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index 55794f9adf..5c810c498d 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.channels.* import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import kotlin.coroutines.* +import kotlinx.coroutines.internal.* /** * Creates cold [observable][Observable] that will run a given [block] in a coroutine. @@ -54,38 +55,35 @@ private const val OPEN = 0 // open channel, still working private const val CLOSED = -1 // closed, but have not signalled onCompleted/onError yet private const val SIGNALLED = -2 // already signalled subscriber onCompleted/onError -private class RxObservableCoroutine( +private class RxObservableCoroutine( parentContext: CoroutineContext, private val subscriber: ObservableEmitter ) : AbstractCoroutine(parentContext, false, true), ProducerScope, SelectClause2> { override val channel: SendChannel get() = this - // Mutex is locked when while subscriber.onXXX is being invoked + // Mutex is locked while subscriber.onXXX is being invoked private val mutex = Mutex() private val _signal = atomic(OPEN) - override val isClosedForSend: Boolean get() = isCompleted + override val isClosedForSend: Boolean get() = !isActive override fun close(cause: Throwable?): Boolean = cancelCoroutine(cause) override fun invokeOnClose(handler: (Throwable?) -> Unit) = throw UnsupportedOperationException("RxObservableCoroutine doesn't support invokeOnClose") - override fun trySend(element: T): ChannelResult { - if (!mutex.tryLock()) return ChannelResult.failure() - doLockedNext(element) - return ChannelResult.success(Unit) - } + override fun trySend(element: T): ChannelResult = + if (!mutex.tryLock()) { + ChannelResult.failure() + } else { + when (val throwable = doLockedNext(element)) { + null -> ChannelResult.success(Unit) + else -> ChannelResult.closed(throwable) + } + } public override suspend fun send(element: T) { - // fast-path -- try send without suspension - if (trySend(element).isSuccess) return - // slow-path does suspend - return sendSuspend(element) - } - - private suspend fun sendSuspend(element: T) { mutex.lock() - doLockedNext(element) + doLockedNext(element)?.let { throw it } } override val onSend: SelectClause2> @@ -93,30 +91,39 @@ private class RxObservableCoroutine( // registerSelectSend @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") - override fun registerSelectClause2(select: SelectInstance, element: T, block: suspend (SendChannel) -> R) { + override fun registerSelectClause2( + select: SelectInstance, + element: T, + block: suspend (SendChannel) -> R + ) { mutex.onLock.registerSelectClause2(select, null) { - doLockedNext(element) + doLockedNext(element)?.let { throw it } block(this) } } // assert: mutex.isLocked() - private fun doLockedNext(elem: T) { + private fun doLockedNext(elem: T): Throwable? { // check if already closed for send if (!isActive) { doLockedSignalCompleted(completionCause, completionCauseHandled) - throw getCancellationException() + return getCancellationException() } // notify subscriber try { subscriber.onNext(elem) } catch (e: Throwable) { - // If onNext fails with exception, then we cancel coroutine (with this exception) and then rethrow it - // to abort the corresponding send/offer invocation. From the standpoint of coroutines machinery, - // this failure is essentially equivalent to a failure of a child coroutine. - cancelCoroutine(e) - mutex.unlock() - throw e + val cause = UndeliverableException(e) + val causeDelivered = close(cause) + unlockAndCheckCompleted() + return if (causeDelivered) { + // `cause` is the reason this channel is closed + cause + } else { + // Someone else closed the channel during `onNext`. We report `cause` as an undeliverable exception. + handleUndeliverableException(cause, context) + getCancellationException() + } } /* * There is no sense to check for `isActive` before doing `unlock`, because cancellation/completion might @@ -125,6 +132,7 @@ private class RxObservableCoroutine( * We have to recheck `isCompleted` after `unlock` anyway. */ unlockAndCheckCompleted() + return null } private fun unlockAndCheckCompleted() { @@ -138,33 +146,31 @@ private class RxObservableCoroutine( private fun doLockedSignalCompleted(cause: Throwable?, handled: Boolean) { // cancellation failures try { - if (_signal.value >= CLOSED) { - _signal.value = SIGNALLED // we'll signal onError/onCompleted (that the final state -- no CAS needed) + if (_signal.value == SIGNALLED) + return + _signal.value = SIGNALLED // we'll signal onError/onCompleted (that the final state -- no CAS needed) + @Suppress("INVISIBLE_MEMBER") + val unwrappedCause = cause?.let { unwrap(it) } + if (unwrappedCause == null) { try { - if (cause != null && cause !is CancellationException) { - /* - * Reactive frameworks have two types of exceptions: regular and fatal. - * Regular are passed to onError. - * Fatal can be passed to onError, but even the standard implementations **can just swallow it** (e.g. see #1297). - * Such behaviour is inconsistent, leads to silent failures and we can't possibly know whether - * the cause will be handled by onError (and moreover, it depends on whether a fatal exception was - * thrown by subscriber or upstream). - * To make behaviour consistent and least surprising, we always handle fatal exceptions - * by coroutines machinery, anyway, they should not be present in regular program flow, - * thus our goal here is just to expose it as soon as possible. - */ - subscriber.tryOnError(cause) - if (!handled && cause.isFatal()) { - handleUndeliverableException(cause, context) - } - } - else { - subscriber.onComplete() - } - } catch (e: Throwable) { - // Unhandled exception (cannot handle in other way, since we are already complete) + subscriber.onComplete() + } catch (e: Exception) { handleUndeliverableException(e, context) } + } else if (unwrappedCause is UndeliverableException && !handled) { + /** Such exceptions are not reported to `onError`, as, according to the reactive specifications, + * exceptions thrown from the Subscriber methods must be treated as if the Subscriber was already + * cancelled. */ + handleUndeliverableException(cause, context) + } else if (unwrappedCause !== getCancellationException() || !subscriber.isDisposed) { + try { + /** If the subscriber is already in a terminal state, the error will be signalled to + * `RxJavaPlugins.onError`. */ + subscriber.onError(cause) + } catch (e: Exception) { + cause.addSuppressed(e) + handleUndeliverableException(cause, context) + } } } finally { mutex.unlock() @@ -186,9 +192,3 @@ private class RxObservableCoroutine( } } -internal fun Throwable.isFatal() = try { - Exceptions.throwIfFatal(this) // Rx-consistent behaviour without hardcode - false -} catch (e: Throwable) { - true -} diff --git a/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt index fb6020eab3..e7678f0d10 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxSingle.kt @@ -50,11 +50,12 @@ private class RxSingleCoroutine( override fun onCancelled(cause: Throwable, handled: Boolean) { try { - if (!subscriber.tryOnError(cause)) { - handleUndeliverableException(cause, context) + if (subscriber.tryOnError(cause)) { + return } } catch (e: Throwable) { - handleUndeliverableException(e, context) + cause.addSuppressed(e) } + handleUndeliverableException(cause, context) } } diff --git a/reactive/kotlinx-coroutines-rx3/test/FlowableExceptionHandlingTest.kt b/reactive/kotlinx-coroutines-rx3/test/FlowableExceptionHandlingTest.kt index 8cbd7ee89f..126cb81826 100644 --- a/reactive/kotlinx-coroutines-rx3/test/FlowableExceptionHandlingTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/FlowableExceptionHandlingTest.kt @@ -38,16 +38,16 @@ class FlowableExceptionHandlingTest : TestBase() { } @Test - fun testFatalException() = withExceptionHandler(handler(3)) { + fun testFatalException() = withExceptionHandler({ expectUnreached() }) { rxFlowable(Dispatchers.Unconfined) { expect(1) throw LinkageError() }.subscribe({ expectUnreached() }, { - expect(2) // Fatal exception is reported to both onError and CEH + expect(2) // Fatal exceptions are not treated as special }) - finish(4) + finish(3) } @Test @@ -66,7 +66,7 @@ class FlowableExceptionHandlingTest : TestBase() { } @Test - fun testFatalExceptionAsynchronous() = withExceptionHandler(handler(3)) { + fun testFatalExceptionAsynchronous() = withExceptionHandler({ expectUnreached() }) { rxFlowable(Dispatchers.Unconfined) { expect(1) throw LinkageError() @@ -77,19 +77,19 @@ class FlowableExceptionHandlingTest : TestBase() { }, { expect(2) }) - finish(4) + finish(3) } @Test - fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { rxFlowable(Dispatchers.Unconfined) { expect(1) send(Unit) }.subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) // Fatal exception is reported to both onError and CEH - finish(5) + }, { expectUnreached() }) // Fatal exception is rethrown from `onNext` => the subscription is thought to be cancelled + finish(4) } @Test diff --git a/reactive/kotlinx-coroutines-rx3/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-rx3/test/IntegrationTest.kt index 395672cee9..1302124f50 100644 --- a/reactive/kotlinx-coroutines-rx3/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/IntegrationTest.kt @@ -125,6 +125,21 @@ class IntegrationTest( finish(3) } + @Test + fun testObservableWithTimeout() = runTest { + val observable = rxObservable { + expect(2) + withTimeout(1) { delay(100) } + } + try { + expect(1) + observable.awaitFirstOrNull() + } catch (e: CancellationException) { + expect(3) + } + finish(4) + } + private suspend fun checkNumbers(n: Int, observable: Observable) { var last = 0 observable.collect { diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableExceptionHandlingTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableExceptionHandlingTest.kt index 1183b2ae21..5ddb36ed07 100644 --- a/reactive/kotlinx-coroutines-rx3/test/ObservableExceptionHandlingTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableExceptionHandlingTest.kt @@ -8,6 +8,7 @@ import io.reactivex.rxjava3.exceptions.* import kotlinx.coroutines.* import org.junit.* import org.junit.Test +import java.util.concurrent.* import kotlin.test.* class ObservableExceptionHandlingTest : TestBase() { @@ -18,7 +19,7 @@ class ObservableExceptionHandlingTest : TestBase() { } private inline fun handler(expect: Int) = { t: Throwable -> - assertTrue(t is UndeliverableException && t.cause is T) + assertTrue(t is UndeliverableException && t.cause is T, "$t") expect(expect) } @@ -38,8 +39,8 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testFatalException() = withExceptionHandler(handler(3)) { - rxObservable(Dispatchers.Unconfined) { + fun testFatalException() = withExceptionHandler({ expectUnreached() }) { + rxObservable(Dispatchers.Unconfined + cehUnreached()) { expect(1) throw LinkageError() }.subscribe({ @@ -47,7 +48,7 @@ class ObservableExceptionHandlingTest : TestBase() { }, { expect(2) }) - finish(4) + finish(3) } @Test @@ -66,7 +67,7 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testFatalExceptionAsynchronous() = withExceptionHandler(handler(3)) { + fun testFatalExceptionAsynchronous() = withExceptionHandler({ expectUnreached() }) { rxObservable(Dispatchers.Unconfined) { expect(1) throw LinkageError() @@ -75,20 +76,28 @@ class ObservableExceptionHandlingTest : TestBase() { .subscribe({ expectUnreached() }, { - expect(2) // Fatal exception is not reported in onError + expect(2) // Fatal exceptions are not treated in a special manner }) - finish(4) + finish(3) } @Test - fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { + val latch = CountDownLatch(1) rxObservable(Dispatchers.Unconfined) { expect(1) - send(Unit) + val result = trySend(Unit) + val exception = result.exceptionOrNull() + assertTrue(exception is UndeliverableException) + assertTrue(exception.cause is LinkageError) + assertTrue(isClosedForSend) + expect(4) + latch.countDown() }.subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) // Unreached because fatal errors are rethrown + }, { expectUnreached() }) // Unreached because RxJava bubbles up fatal exceptions, causing `onNext` to throw. + latch.await() finish(5) } @@ -100,7 +109,7 @@ class ObservableExceptionHandlingTest : TestBase() { }.subscribe({ expect(2) throw TestException() - }, { expect(3) }) // not reported to onError because came from the subscribe itself + }, { expect(3) }) finish(4) } @@ -119,7 +128,7 @@ class ObservableExceptionHandlingTest : TestBase() { } @Test - fun testAsynchronousFatalExceptionFromSubscribe() = withExceptionHandler(handler(4)) { + fun testAsynchronousFatalExceptionFromSubscribe() = withExceptionHandler(handler(3)) { rxObservable(Dispatchers.Unconfined) { expect(1) send(Unit) @@ -128,7 +137,7 @@ class ObservableExceptionHandlingTest : TestBase() { .subscribe({ expect(2) throw LinkageError() - }, { expect(3) }) - finish(5) + }, { expectUnreached() }) // Unreached because RxJava bubbles up fatal exceptions, causing `onNext` to throw. + finish(4) } } From 6a42a77090c75545ef8e47e717283d447624b5c0 Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 20 Apr 2021 13:52:02 +0300 Subject: [PATCH 034/328] Mark GlobalScope as delicate API and rewrite coroutine basics doc without it (#2637) Also, remove the tutorial variant of the basic coroutine introduction as it essentially duplicates the content of the basic coroutine introduction, albeit with "how to create a project" additional information, which does not seem to be appropriate in this section at all. Fixes #2122 Co-authored-by: Vsevolod Tolstopyatov Co-authored-by: Andrey Polyakov --- docs/images/new-mvn-project-jvm.png | Bin 378558 -> 0 bytes docs/topics/composing-suspending-functions.md | 22 +- .../coroutine-context-and-dispatchers.md | 26 +- docs/topics/coroutines-basic-jvm.md | 262 ------------- docs/topics/coroutines-basics.md | 369 +++++++----------- docs/topics/coroutines-guide.md | 1 - docs/topics/exception-handling.md | 13 +- .../api/kotlinx-coroutines-core.api | 3 + .../common/src/Annotations.kt | 16 + .../common/src/CoroutineScope.kt | 96 ++++- .../jvm/test/guide/example-basic-01.kt | 7 +- .../jvm/test/guide/example-basic-02.kt | 18 +- .../jvm/test/guide/example-basic-03.kt | 11 +- .../jvm/test/guide/example-basic-04.kt | 18 +- .../jvm/test/guide/example-basic-05.kt | 8 +- .../jvm/test/guide/example-basic-06.kt | 18 +- .../jvm/test/guide/example-basic-07.kt | 19 - .../jvm/test/guide/example-basic-08.kt | 17 - .../jvm/test/guide/example-basic-09.kt | 18 - .../jvm/test/guide/example-compose-04.kt | 2 + .../jvm/test/guide/example-context-06.kt | 6 +- .../jvm/test/guide/example-exceptions-01.kt | 1 + .../jvm/test/guide/example-exceptions-02.kt | 1 + .../jvm/test/guide/example-exceptions-04.kt | 1 + .../jvm/test/guide/example-exceptions-05.kt | 1 + .../jvm/test/guide/example-exceptions-06.kt | 1 + .../jvm/test/guide/test/BasicsGuideTest.kt | 46 +-- .../test/guide/test/DispatcherGuideTest.kt | 2 +- 28 files changed, 347 insertions(+), 656 deletions(-) delete mode 100644 docs/images/new-mvn-project-jvm.png delete mode 100644 docs/topics/coroutines-basic-jvm.md delete mode 100644 kotlinx-coroutines-core/jvm/test/guide/example-basic-07.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/guide/example-basic-08.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/guide/example-basic-09.kt diff --git a/docs/images/new-mvn-project-jvm.png b/docs/images/new-mvn-project-jvm.png deleted file mode 100644 index 2154a3df3d6d8271c1bfddb4b2195b3f79b39c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378558 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 YfQXVl;} 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

{s_iKxJ4RX9_#-ujd;4N); z#q0Q6R~2g3`-OdNQu0_kE$y}!Xw+J9*^~O4sNIkM>2>_;%H2Wqg*iuzhN<@NC!6M9 zVf2)qW4JfjM#{oN71{g+Ze^I^6-C9Q5?{Jn3U+1o_s5L^n{D{

=o2p@Lqf2%63^ ztbbvhDfY>*wra$^$j}b<+L7vt-E39Bp>Oak{@VSEP;9&7)-(&S?Vi&Z|Td%yV!{y@ms0U&|{1HZkVv{ zB?qW+6=SKka{CoYMY4&ab&T1JR=)}yb&HazkCuK4YI$L7Pb875tE|Z+EktnB9}A*v zxL{3tl1QTbe7$TYi`e^#z#ClJ__&viukvX4TP(a-sjb%FvO^3ripdv7yhl4&#?AK2 zgY$t_Pyua2{Bx^c)|VEHs{dal=U*THhhf1lM4+>Y?SjpMlCgcchaHXurCyBBo<_|% zY@IJgs_6dmmr8818T@Hp{1mi-Ev}JrA1&GxmT!20P*d_O9Kezehd2*gJ^MIICxK(~ z%edu)+vL{~oocxAurnhu$RdyKbLY%-fBl7nOJ7cTcC~DmR<-E!{y4fV9mmz8fQTKf z)$@C{NvTtP1T#&Qp+UTrc>`U;GRoW&D%|`U3r zaef#8fVr-&guVm)2pAiZOo~w3LPFd?-0lgO|ItCO;K}Hli)Q{IPCi_w;i$dvGl2YH z8Jb^`!tDKA2^Yk-cCT@!`x5$4moFFi`00YY-Fe5{)~=eB%IPweu2Op<)Ldxjlq?bIk!=T+Mpx8St744 zL4R^xBXD0=)T9&R#(Q!-OGgU5Xy4J*`0#d>f`W2SlbIM}q|q1q`wr^+;hzSaIlDjn zgWW=g5ut|RI=a0|ZH>W^e|NQ@e*dc0BUVDj$G@IC%lP27D`nKc`2S^zFINV?>kHUK zZ5j<1Yq#fH_4?p&sCr?xgk*4y+{COw&}-CF|^Xj<|};O71Iayot*xS~wSkh(Sh{7y3?)Z^I@Gc3CQ; zFIUq005)lr49o0}SM*s-S}0BP8Bj_1VYroitZ~Nw6$bg=?%lrvBwymi4vM-(NQ-EW zxr|77@QgNvgg%8LJvow~9Jwy$@Rx5`sbpP^cl_%vm0^Hhu)qm_Gbw*aEL@Z^zFSYB zzX8Q-t%lSi>fcGq_AQv?+baw#H#mgcUPhBVq>B1?qyPW79t9)N#6CjWZ&l({eQ!@t z1FaJl8Kl83PE&_t6Pb?2pb|SuKcUV7OFvV?66evwShBR

trrX$qd)u|6}lq%YBm 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%0DHv? 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 J74J;G{2#V#Td4p5 diff --git a/docs/topics/composing-suspending-functions.md b/docs/topics/composing-suspending-functions.md index 0af60d00a9..9c1a26a910 100644 --- a/docs/topics/composing-suspending-functions.md +++ b/docs/topics/composing-suspending-functions.md @@ -24,7 +24,7 @@ suspend fun doSomethingUsefulTwo(): Int { What do we do if we need them to be invoked _sequentially_ — first `doSomethingUsefulOne` _and then_ `doSomethingUsefulTwo`, and compute the sum of their results? -In practice we do this if we use the result of the first function to make a decision on whether we need +In practice, we do this if we use the result of the first function to make a decision on whether we need to invoke the second one or to decide on how to invoke it. We use a normal sequential invocation, because the code in the coroutine, just like in the regular @@ -190,18 +190,26 @@ standard `lazy` function in cases when computation of the value involves suspend ## Async-style functions We can define async-style functions that invoke `doSomethingUsefulOne` and `doSomethingUsefulTwo` -_asynchronously_ using the [async] coroutine builder with an explicit [GlobalScope] reference. +_asynchronously_ using the [async] coroutine builder using a [GlobalScope] reference to +opt-out of the structured concurrency. We name such functions with the "...Async" suffix to highlight the fact that they only start asynchronous computation and one needs to use the resulting deferred value to get the result. +> [GlobalScope] is a delicate API that can backfire in non-trivial ways, one of which will be explained +> below, so you must explicitly opt-in into using `GlobalScope` with `@OptIn(DelicateCoroutinesApi::class)`. +> +{type="note"} + ```kotlin // The result type of somethingUsefulOneAsync is Deferred +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulOneAsync() = GlobalScope.async { doSomethingUsefulOne() } // The result type of somethingUsefulTwoAsync is Deferred +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulTwoAsync() = GlobalScope.async { doSomethingUsefulTwo() } @@ -236,10 +244,12 @@ fun main() { } //sampleEnd +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulOneAsync() = GlobalScope.async { doSomethingUsefulOne() } +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulTwoAsync() = GlobalScope.async { doSomethingUsefulTwo() } @@ -272,9 +282,9 @@ Completed in 1085 ms {type="note"} Consider what happens if between the `val one = somethingUsefulOneAsync()` line and `one.await()` expression there is some logic -error in the code and the program throws an exception and the operation that was being performed by the program aborts. +error in the code, and the program throws an exception, and the operation that was being performed by the program aborts. Normally, a global error-handler could catch this exception, log and report the error for developers, but the program -could otherwise continue doing other operations. But here we have `somethingUsefulOneAsync` still running in the background, +could otherwise continue doing other operations. However, here we have `somethingUsefulOneAsync` still running in the background, even though the operation that initiated it was aborted. This problem does not happen with structured concurrency, as shown in the section below. @@ -293,7 +303,7 @@ suspend fun concurrentSum(): Int = coroutineScope { } ``` -This way, if something goes wrong inside the code of the `concurrentSum` function and it throws an exception, +This way, if something goes wrong inside the code of the `concurrentSum` function, and it throws an exception, all the coroutines that were launched in its scope will be cancelled. @@ -403,4 +413,4 @@ Computation failed with ArithmeticException [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html - \ No newline at end of file + diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index 9aae1a7a4b..402db103b4 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -65,9 +65,8 @@ context of the main `runBlocking` coroutine which runs in the `main` thread. [Dispatchers.Unconfined] is a special dispatcher that also appears to run in the `main` thread, but it is, in fact, a different mechanism that is explained later. -The default dispatcher that is used when coroutines are launched in [GlobalScope] -is represented by [Dispatchers.Default] and uses a shared background pool of threads, -so `launch(Dispatchers.Default) { ... }` uses the same dispatcher as `GlobalScope.launch { ... }`. +The default dispatcher that is used when no other dispatcher is explicitly specified in the scope. +It is represented by [Dispatchers.Default] and uses a shared background pool of threads. [newSingleThreadContext] creates a thread for the coroutine to run. A dedicated thread is a very expensive resource. @@ -303,8 +302,14 @@ the [Job] of the new coroutine becomes a _child_ of the parent coroutine's job. When the parent coroutine is cancelled, all its children are recursively cancelled, too. -However, when [GlobalScope] is used to launch a coroutine, there is no parent for the job of the new coroutine. -It is therefore not tied to the scope it was launched from and operates independently. +However, this parent-child relation can be explicitly overriden in one of two ways: + +1. When a different scope is explicitly specified when launching a coroutine (for example, `GlobalScope.launch`), + then it does not inherit a `Job` from the parent scope. +2. When a different `Job` object is passed as the context for the new coroutine (as show in the example below), + then it overrides the `Job` of the parent scope. + +In both cases, the launched coroutine is not tied to the scope it was launched from and operates independently. ```kotlin import kotlinx.coroutines.* @@ -313,9 +318,9 @@ fun main() = runBlocking { //sampleStart // launch a coroutine to process some kind of incoming request val request = launch { - // it spawns two other jobs, one with GlobalScope - GlobalScope.launch { - println("job1: I run in GlobalScope and execute independently!") + // it spawns two other jobs + launch(Job()) { + println("job1: I run in my own Job and execute independently!") delay(1000) println("job1: I am not affected by cancellation of the request") } @@ -343,7 +348,7 @@ fun main() = runBlocking { The output of this code is: ```text -job1: I run in GlobalScope and execute independently! +job1: I run in my own Job and execute independently! job2: I am a child of the request coroutine job1: I am not affected by cancellation of the request main: Who has survived request cancellation? @@ -659,7 +664,6 @@ that should be implemented. [async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[GlobalScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html [Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html [newSingleThreadContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html [ExecutorCoroutineDispatcher.close]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-executor-coroutine-dispatcher/close.html @@ -678,4 +682,4 @@ that should be implemented. [ensurePresent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/java.lang.-thread-local/ensure-present.html [ThreadContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/index.html - \ No newline at end of file + diff --git a/docs/topics/coroutines-basic-jvm.md b/docs/topics/coroutines-basic-jvm.md deleted file mode 100644 index a6ca3ba5f3..0000000000 --- a/docs/topics/coroutines-basic-jvm.md +++ /dev/null @@ -1,262 +0,0 @@ -[//]: # (title: Create a basic coroutine – tutorial) - -Kotlin 1.1 introduced coroutines, a new way of writing asynchronous, non-blocking code (and much more). In this tutorial you will go through some basics of using Kotlin coroutines with the help of the `kotlinx.coroutines` library, which is a collection of helpers and wrappers for existing Java libraries. - -## Set up a project - -### Gradle - -In IntelliJ IDEA go to **File** \| **New** \| **Project**.: - -![Create a new project](new-gradle-project-jvm.png) - -Then follow the wizard steps. You'll have a `build.gradle` file created with Kotlin configured according to [this document](gradle.md). -Make sure it's configured for Kotlin 1.3 or higher. - -Since we'll be using the [`kotlinx.coroutines`](https://github.com/Kotlin/kotlinx.coroutines), let's add its recent version to our dependencies: - - - -```groovy -dependencies { - ... - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%' -} -``` - -```kotlin -dependencies { - ... - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%") -} -``` - - -This library is published to the [Maven Central repository](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core), so add the following: - -```groovy -repositories { - mavenCentral() -} -``` - -That's it, we are good to go and write code under `src/main/kotlin`. - -### Maven - -In IntelliJ IDEA go to **File** \| **New** \| **Project** and check the **Create from archetype** box: - -![Create a new project](new-mvn-project-jvm.png) - -Then follow the wizard steps. You'll have a `pom.xml` file created with Kotlin configured according to [this document](maven.md). -Make sure it's configured for Kotlin 1.3 or higher. - -```xml - - org.jetbrains.kotlin - kotlin-maven-plugin - ... - -``` - -Since we'll be using the [`kotlinx.coroutines`](https://github.com/Kotlin/kotlinx.coroutines), let's add its recent version to our dependencies: - -```xml - - ... - - org.jetbrains.kotlinx - kotlinx-coroutines-core - %coroutinesVersion% - - -``` - -This library is published to the [Maven Central repository](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core), which Maven will download from by default. - -That's it, we are good to go and write code under `src/main/kotlin`. - -## My first coroutine - -One can think of a coroutine as a light-weight thread. Like threads, coroutines can run in parallel, wait for each other and communicate. -The biggest difference is that coroutines are very cheap, almost free: we can create thousands of them, and pay very little in terms of performance. -True threads, on the other hand, are expensive to start and keep around. A thousand threads can be a serious challenge for a modern machine. - -So, how do we start a coroutine? Let's use the `launch {}` function: - -```kotlin -launch { - ... -} -``` - -This starts a new coroutine. By default, coroutines are run on a shared pool of threads. -Threads still exist in a program based on coroutines, but one thread can run many coroutines, so there's no need for -too many threads. - -Let's look at a full program that uses `launch`: - -```kotlin -import kotlinx.coroutines.* - -fun main(args: Array) { -//sampleStart - println("Start") - - // Start a coroutine - GlobalScope.launch { - delay(1000) - println("Hello") - } - - Thread.sleep(2000) // wait for 2 seconds - println("Stop") -//sampleEnd -} -``` -{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} - -Here we start a coroutine that waits for 1 second and prints `Hello`. - -We are using the `delay()` function that's like `Thread.sleep()`, but better: it _doesn't block a thread_, but only suspends the coroutine itself. -The thread is returned to the pool while the coroutine is waiting, and when the waiting is done, the coroutine resumes on a free thread in the pool. - -The main thread (that runs the `main()` function) must wait until our coroutine completes, otherwise the program ends before `Hello` is printed. - -_Exercise: try removing the `sleep()` from the program above and see the result._ - - If we try to use the same non-blocking `delay()` function directly inside `main()`, we'll get a compiler error: - -> Suspend functions are only allowed to be called from a coroutine or another suspend function. -> -{type="note"} - -This is because we are not inside any coroutine. We can use delay if we wrap it into `runBlocking {}` that starts a coroutine and waits until it's done: - -```kotlin -runBlocking { - delay(2000) -} -``` - -So, first the resulting program prints `Start`, then it runs a coroutine through `launch {}`, then it runs another one through `runBlocking {}` and blocks until it's done, then prints `Stop`. Meanwhile the first coroutine completes and prints `Hello`. Just like threads, we told you :) - -## Let's run a lot of them - -Now, let's make sure that coroutines are really cheaper than threads. How about starting a million of them? Let's try starting a million threads first: - -```kotlin -val c = AtomicLong() - -for (i in 1..1_000_000L) - thread(start = true) { - c.addAndGet(i) - } - -println(c.get()) -``` - -This runs a 1'000'000 threads each of which adds to a common counter. My patience runs out before this program completes on my machine (definitely over a minute). - -Let's try the same with coroutines: - -```kotlin -val c = AtomicLong() - -for (i in 1..1_000_000L) - GlobalScope.launch { - c.addAndGet(i) - } - -println(c.get()) -``` - -This example completes in less than a second for me, but it prints some arbitrary number, because some coroutines don't finish before `main()` prints the result. Let's fix that. - -We could use the same means of synchronization that are applicable to threads (a `CountDownLatch` is what crosses my mind in this case), but let's take a safer and cleaner path. - -## Async: returning a value from a coroutine - -Another way of starting a coroutine is `async {}`. It is like `launch {}`, but returns an instance of `Deferred`, which has an `await()` function that returns the result of the coroutine. `Deferred` is a very basic [future](https://en.wikipedia.org/wiki/Futures_and_promises) (fully-fledged JDK futures are also supported, but here we'll confine ourselves to `Deferred` for now). - -Let's create a million coroutines again, keeping their `Deferred` objects. Now there's no need in the atomic counter, as we can just return the numbers to be added from our coroutines: - -```kotlin -val deferred = (1..1_000_000).map { n -> - GlobalScope.async { - n - } -} -``` - -All these have already started, all we need is collect the results: - -```kotlin -val sum = deferred.sumOf { it.await().toLong() } -``` - -We simply take every coroutine and await its result here, then all results are added together by the standard library function `sumOf()`. But the compiler rightfully complains: - -> Suspend functions are only allowed to be called from a coroutine or another suspend function. -> -{type="note"} - -`await()` can not be called outside a coroutine, because it needs to suspend until the computation finishes, and only coroutines can suspend in a non-blocking way. So, let's put this inside a coroutine: - -```kotlin -runBlocking { - val sum = deferred.sumOf { it.await().toLong() } - println("Sum: $sum") -} -``` - -Now it prints something sensible: `500000500000`, because all coroutines complete. - -Let's also make sure that our coroutines actually run in parallel. If we add a 1-second `delay()` to each of the `async`'s, the resulting program won't run for 1'000'000 seconds (over 11,5 days): - -```kotlin -val deferred = (1..1_000_000).map { n -> - GlobalScope.async { - delay(1000) - n - } -} -``` - -This takes about 10 seconds on my machine, so yes, coroutines do run in parallel. - -## Suspending functions - -Now, let's say we want to extract our _workload_ (which is "wait 1 second and return a number") into a separate function: - -```kotlin -fun workload(n: Int): Int { - delay(1000) - return n -} -``` - -A familiar error pops up: - -> Suspend functions are only allowed to be called from a coroutine or another suspend function. -> -{type="note"} - -Let's dig a little into what it means. The biggest merit of coroutines is that they can _suspend_ without blocking a thread. The compiler has to emit some special code to make this possible, so we have to mark functions that _may suspend_ explicitly in the code. We use the `suspend` modifier for it: - -```kotlin -suspend fun workload(n: Int): Int { - delay(1000) - return n -} -``` - -Now when we call `workload()` from a coroutine, the compiler knows that it may suspend and will prepare accordingly: - -```kotlin -GlobalScope.async { - workload(n) -} -``` - -Our `workload()` function can be called from a coroutine (or another suspending function), but _cannot_ be called from outside a coroutine. Naturally, `delay()` and `await()` that we used above are themselves declared as `suspend`, and this is why we had to put them inside `runBlocking {}`, `launch {}` or `async {}`. diff --git a/docs/topics/coroutines-basics.md b/docs/topics/coroutines-basics.md index c1c17581c0..ab8b427685 100644 --- a/docs/topics/coroutines-basics.md +++ b/docs/topics/coroutines-basics.md @@ -6,19 +6,27 @@ This section covers basic coroutine concepts. ## Your first coroutine -Run the following code: +A _coroutine_ is an instance of suspendable computation. It is conceptually similar to a thread, in the sense that it +takes a block of code to run that works concurrently with the rest of the code. +However, a coroutine is not bound to any particular thread. It may suspend its execution in one thread and resume in another one. + +Coroutines can be thought of as light-weight threads, but there is a number +of important differences that make their real-life usage very different from threads. + +Run the following code to get to your first working coroutine: ```kotlin import kotlinx.coroutines.* -fun main() { - GlobalScope.launch { // launch a new coroutine in background and continue +//sampleStart +fun main() = runBlocking { // this: CoroutineScope + launch { // launch a new coroutine and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!") // print after delay } - println("Hello,") // main thread continues while coroutine is delayed - Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive + println("Hello") // main coroutine continues while a previous one is delayed } +//sampleEnd ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} @@ -29,49 +37,71 @@ fun main() { You will see the following result: ```text -Hello, +Hello World! ``` -Essentially, coroutines are light-weight threads. -They are launched with [launch] _coroutine builder_ in a context of some [CoroutineScope]. -Here we are launching a new coroutine in the [GlobalScope], meaning that the lifetime of the new -coroutine is limited only by the lifetime of the whole application. +Let's dissect what this code does. -You can achieve the same result by replacing -`GlobalScope.launch { ... }` with `thread { ... }`, and `delay(...)` with `Thread.sleep(...)`. -Try it (don't forget to import `kotlin.concurrent.thread`). +[launch] is a _coroutine builder_. It launches a new coroutine concurrently with +the rest of the code, which continues to work independently. That's why `Hello` has been printed first. -If you start by replacing `GlobalScope.launch` with `thread`, the compiler produces the following error: +[delay] is a special _suspending function_. It _suspends_ the coroutine for a specific time. Suspending a coroutine +does not _block_ the underlying thread, but allows other coroutines to run and use the underlying thread for +their code. + +[runBlocking] is also a coroutine builder that bridges the non-coroutine world of a regular `fun main()` and +the code with coroutines inside of `runBlocking { ... }` curly braces. This is highlighted in an IDE by +`this: CoroutineScope` hint right after the `runBlocking` opening curly brace. + +If you remove or forget `runBlocking` in this code, you'll get an error on the [launch] call, since `launch` +is declared only in the [CoroutineScope]: ```Plain Text -Error: Kotlin: Suspend functions are only allowed to be called from a coroutine or another suspend function +Unresolved reference: launch ``` -That is because [delay] is a special _suspending function_ that does not block a thread, but _suspends_ the -coroutine, and it can be only used from a coroutine. +The name of `runBlocking` means that the thread that runs it (in this case — the main thread) gets _blocked_ for +the duration of the call, until all the coroutines inside `runBlocking { ... }` complete their execution. You will +often see `runBlocking` used like that at the very top-level of the application and quite rarely inside the real code, +as threads are expensive resources and blocking them is inefficient and is often not desired. + +### Structured concurrency + +Coroutines follow a principle of +**structured concurrency** which means that new coroutines can be only launched in a specific [CoroutineScope] +which delimits the lifetime of the coroutine. The above example shows that [runBlocking] establishes the corresponding +scope and that is why the previous example waits until `World!` is printed after a second's delay and only then exits. + +In the real application, you will be launching a lot of coroutines. Structured concurrency ensures that they are not +lost and do not leak. An outer scope cannot complete until all its children coroutines complete. +Structured concurrency also ensures that any errors in the code are properly reported and are never lost. -## Bridging blocking and non-blocking worlds +## Extract function refactoring -The first example mixes _non-blocking_ `delay(...)` and _blocking_ `Thread.sleep(...)` in the same code. -It is easy to lose track of which one is blocking and which one is not. -Let's be explicit about blocking using the [runBlocking] coroutine builder: +Let's extract the block of code inside `launch { ... }` into a separate function. When you +perform "Extract function" refactoring on this code, you get a new function with the `suspend` modifier. +This is your first _suspending function_. Suspending functions can be used inside coroutines +just like regular functions, but their additional feature is that they can, in turn, +use other suspending functions (like `delay` in this example) to _suspend_ execution of a coroutine. ```kotlin import kotlinx.coroutines.* -fun main() { - GlobalScope.launch { // launch a new coroutine in background and continue - delay(1000L) - println("World!") - } - println("Hello,") // main thread continues here immediately - runBlocking { // but this expression blocks the main thread - delay(2000L) // ... while we delay for 2 seconds to keep JVM alive - } +//sampleStart +fun main() = runBlocking { // this: CoroutineScope + launch { doWorld() } + println("Hello") } + +// this is your first suspending function +suspend fun doWorld() { + delay(1000L) + println("World!") +} +//sampleEnd ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} @@ -80,27 +110,39 @@ fun main() { {type="note"} -The result is the same, but this code uses only non-blocking [delay]. -The main thread invoking `runBlocking` _blocks_ until the coroutine inside `runBlocking` completes. +## Scope builder + +In addition to the coroutine scope provided by different builders, it is possible to declare your own scope using the +[coroutineScope][_coroutineScope] builder. It creates a coroutine scope and does not complete until all launched children complete. + +[runBlocking] and [coroutineScope][_coroutineScope] builders may look similar because they both wait for their body and all its children to complete. +The main difference is that the [runBlocking] method _blocks_ the current thread for waiting, +while [coroutineScope][_coroutineScope] just suspends, releasing the underlying thread for other usages. +Because of that difference, [runBlocking] is a regular function and [coroutineScope][_coroutineScope] is a suspending function. -This example can be also rewritten in a more idiomatic way, using `runBlocking` to wrap -the execution of the main function: +You can use `coroutineScope` from any suspending function. +For example, you can move the concurrent printing of `Hello` and `World` into a `suspend fun doWorld()` function: ```kotlin import kotlinx.coroutines.* -fun main() = runBlocking { // start main coroutine - GlobalScope.launch { // launch a new coroutine in background and continue +//sampleStart +fun main() = runBlocking { + doWorld() +} + +suspend fun doWorld() = coroutineScope { // this: CoroutineScope + launch { delay(1000L) println("World!") } - println("Hello,") // main coroutine continues here immediately - delay(2000L) // delaying for 2 seconds to keep JVM alive + println("Hello") } +//sampleEnd ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} @@ -108,49 +150,41 @@ fun main() = runBlocking { // start main coroutine > {type="note"} +This code also prints: + -Here `runBlocking { ... }` works as an adaptor that is used to start the top-level main coroutine. -We explicitly specify its `Unit` return type, because a well-formed `main` function in Kotlin has to return `Unit`. - -This is also a way to write unit tests for suspending functions: - - - -```kotlin -class MyTest { - @Test - fun testMySuspendingFunction() = runBlocking { - // here we can use suspending functions using any assertion style that we like - } -} -``` - - +## Scope builder and concurrency -## Waiting for a job - -Delaying for a time while another coroutine is working is not a good approach. Let's explicitly -wait (in a non-blocking way) until the background [Job] that we have launched is complete: +A [coroutineScope][_coroutineScope] builder can be used inside any suspending function to perform multiple concurrent operations. +Let's launch two concurrent coroutines inside a `doWorld` suspending function: ```kotlin import kotlinx.coroutines.* -fun main() = runBlocking { //sampleStart - val job = GlobalScope.launch { // launch a new coroutine and keep a reference to its Job +// Sequentially executes doWorld followed by "Hello" +fun main() = runBlocking { + doWorld() + println("Done") +} + +// Concurrently executes both sections +suspend fun doWorld() = coroutineScope { // this: CoroutineScope + launch { + delay(2000L) + println("World 2") + } + launch { delay(1000L) - println("World!") + println("World 1") } - println("Hello,") - job.join() // wait until child coroutine completes -//sampleEnd + println("Hello") } +//sampleEnd ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} @@ -158,42 +192,39 @@ fun main() = runBlocking { > {type="note"} - - -Now the result is still the same, but the code of the main coroutine is not tied to the duration of -the background job in any way. Much better. +Both pieces of code inside `launch { ... }` blocks execute _concurrently_, with +`World 1` printed first, after a second from start, and `World 2` printed next, after two seconds from start. +A [coroutineScope][_coroutineScope] in `doWorld` completes only after both are complete, so `doWorld` returns and +allows `Done` string to be printed only after that: -## Structured concurrency +```text +Hello +World 1 +World 2 +Done +``` -There is still something to be desired for practical usage of coroutines. -When we use `GlobalScope.launch`, we create a top-level coroutine. Even though it is light-weight, it still -consumes some memory resources while it runs. If we forget to keep a reference to the newly launched -coroutine, it still runs. What if the code in the coroutine hangs (for example, we erroneously -delay for too long), what if we launched too many coroutines and ran out of memory? -Having to manually keep references to all the launched coroutines and [join][Job.join] them is error-prone. + -There is a better solution. We can use structured concurrency in our code. -Instead of launching coroutines in the [GlobalScope], just like we usually do with threads (threads are always global), -we can launch coroutines in the specific scope of the operation we are performing. +## An explicit job -In our example, we have a `main` function that is turned into a coroutine using the [runBlocking] coroutine builder. -Every coroutine builder, including `runBlocking`, adds an instance of [CoroutineScope] to the scope of its code block. -We can launch coroutines in this scope without having to `join` them explicitly, because -an outer coroutine (`runBlocking` in our example) does not complete until all the coroutines launched -in its scope complete. Thus, we can make our example simpler: +A [launch] coroutine builder returns a [Job] object that is a handle to the launched coroutine and can be +used to explicitly wait for its completion. For example, you can wait for completion of the child coroutine +and then print "Done" string: ```kotlin import kotlinx.coroutines.* -fun main() = runBlocking { // this: CoroutineScope - launch { // launch a new coroutine in the scope of runBlocking +fun main() = runBlocking { +//sampleStart + val job = launch { // launch a new coroutine and keep a reference to its Job delay(1000L) println("World!") } - println("Hello,") + println("Hello") + job.join() // wait until child coroutine completes + println("Done") +//sampleEnd } ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} @@ -202,101 +233,15 @@ fun main() = runBlocking { // this: CoroutineScope > {type="note"} - - -## Scope builder - -In addition to the coroutine scope provided by different builders, it is possible to declare your own scope using the -[coroutineScope][_coroutineScope] builder. It creates a coroutine scope and does not complete until all launched children complete. - -[runBlocking] and [coroutineScope][_coroutineScope] may look similar because they both wait for their body and all its children to complete. -The main difference is that the [runBlocking] method _blocks_ the current thread for waiting, -while [coroutineScope][_coroutineScope] just suspends, releasing the underlying thread for other usages. -Because of that difference, [runBlocking] is a regular function and [coroutineScope][_coroutineScope] is a suspending function. - -It can be demonstrated by the following example: - -```kotlin -import kotlinx.coroutines.* - -fun main() = runBlocking { // this: CoroutineScope - launch { - delay(200L) - println("Task from runBlocking") - } - - coroutineScope { // Creates a coroutine scope - launch { - delay(500L) - println("Task from nested launch") - } - - delay(100L) - println("Task from coroutine scope") // This line will be printed before the nested launch - } - - println("Coroutine scope is over") // This line is not printed until the nested launch completes -} -``` -{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} - -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt). -> -{type="note"} - - - -Note that right after the "Task from coroutine scope" message (while waiting for nested launch) - "Task from runBlocking" is executed and printed — even though the [coroutineScope][_coroutineScope] is not completed yet. - -## Extract function refactoring - -Let's extract the block of code inside `launch { ... }` into a separate function. When you -perform "Extract function" refactoring on this code, you get a new function with the `suspend` modifier. -This is your first _suspending function_. Suspending functions can be used inside coroutines -just like regular functions, but their additional feature is that they can, in turn, -use other suspending functions (like `delay` in this example) to _suspend_ execution of a coroutine. - -```kotlin -import kotlinx.coroutines.* - -fun main() = runBlocking { - launch { doWorld() } - println("Hello,") -} - -// this is your first suspending function -suspend fun doWorld() { - delay(1000L) - println("World!") -} -``` -{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} - -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-07.kt). -> -{type="note"} +This code produces: - +Done +``` -But what if the extracted function contains a coroutine builder which is invoked on the current scope? -In this case, the `suspend` modifier on the extracted function is not enough. Making `doWorld` an extension -method on `CoroutineScope` is one of the solutions, but it may not always be applicable as it does not make the API clearer. -The idiomatic solution is to have either an explicit `CoroutineScope` as a field in a class containing the target function -or an implicit one when the outer class implements `CoroutineScope`. -As a last resort, [CoroutineScope(coroutineContext)][CoroutineScope()] can be used, but such an approach is structurally unsafe -because you no longer have control on the scope of execution of this method. Only private APIs can use this builder. + ## Coroutines ARE light-weight @@ -305,6 +250,7 @@ Run the following code: ```kotlin import kotlinx.coroutines.* +//sampleStart fun main() = runBlocking { repeat(100_000) { // launch a lot of coroutines launch { @@ -313,9 +259,10 @@ fun main() = runBlocking { } } } +//sampleEnd ``` -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-08.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt). > {type="note"} @@ -323,57 +270,17 @@ fun main() = runBlocking { It launches 100K coroutines and, after 5 seconds, each coroutine prints a dot. -Now, try that with threads. What would happen? (Most likely your code will produce some sort of out-of-memory error) - -## Global coroutines are like daemon threads - -The following code launches a long-running coroutine in [GlobalScope] that prints "I'm sleeping" twice a second and then -returns from the main function after some delay: - -```kotlin -import kotlinx.coroutines.* - -fun main() = runBlocking { -//sampleStart - GlobalScope.launch { - repeat(1000) { i -> - println("I'm sleeping $i ...") - delay(500L) - } - } - delay(1300L) // just quit after delay -//sampleEnd -} -``` -{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} - -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-09.kt). -> -{type="note"} - -You can run and see that it prints three lines and terminates: - -```text -I'm sleeping 0 ... -I'm sleeping 1 ... -I'm sleeping 2 ... -``` - - - -Active coroutines that were launched in [GlobalScope] do not keep the process alive. They are like daemon threads. +Now, try that with threads (remove `runBlocking`, replace `launch` with `thread`, and replace `delay` with `Thread.sleep`). +What would happen? (Most likely your code will produce some sort of out-of-memory error) [launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[GlobalScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html [delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html [runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html -[CoroutineScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope.html +[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html diff --git a/docs/topics/coroutines-guide.md b/docs/topics/coroutines-guide.md index 3e9fa90490..050376ce1b 100644 --- a/docs/topics/coroutines-guide.md +++ b/docs/topics/coroutines-guide.md @@ -17,7 +17,6 @@ In order to use coroutines as well as follow the examples in this guide, you nee ## Table of contents * [Coroutines basics](coroutines-basics.md) -* [Tutorial: Create a basic coroutine](coroutines-basic-jvm.md) * [Hands-on: Intro to coroutines and channels](https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels) * [Cancellation and timeouts](cancellation-and-timeouts.md) * [Composing suspending functions](composing-suspending-functions.md) diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index fbd11313cc..4cff42f357 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -19,9 +19,16 @@ exception, for example via [await][Deferred.await] or [receive][ReceiveChannel.r It can be demonstrated by a simple example that creates root coroutines using the [GlobalScope]: +> [GlobalScope] is a delicate API that can backfire in non-trivial ways. Creating a root coroutine for the +> whole application is one of the rare legitimate uses for `GlobalScope`, so you must explicitly opt-in into +> using `GlobalScope` with `@OptIn(DelicateCoroutinesApi::class)`. +> +{type="note"} + ```kotlin import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val job = GlobalScope.launch { // root coroutine with launch println("Throwing exception from launch") @@ -90,6 +97,7 @@ so its `CoroutineExceptionHandler` has no effect either. ```kotlin import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { //sampleStart val handler = CoroutineExceptionHandler { _, exception -> @@ -184,6 +192,7 @@ which is demonstrated by the following example. ```kotlin import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { //sampleStart val handler = CoroutineExceptionHandler { _, exception -> @@ -242,6 +251,7 @@ import kotlinx.coroutines.exceptions.* import kotlinx.coroutines.* import java.io.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception with suppressed ${exception.suppressed.contentToString()}") @@ -292,6 +302,7 @@ Cancellation exceptions are transparent and are unwrapped by default: import kotlinx.coroutines.* import java.io.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { //sampleStart val handler = CoroutineExceptionHandler { _, exception -> @@ -510,4 +521,4 @@ The scope is completed [produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html [ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html - \ No newline at end of file + diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index dcbf62b565..fdb70200f4 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -270,6 +270,9 @@ public final class kotlinx/coroutines/DelayKt { public static final fun delay-VtjQ1oo (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; } +public abstract interface annotation class kotlinx/coroutines/DelicateCoroutinesApi : java/lang/annotation/Annotation { +} + public final class kotlinx/coroutines/Dispatchers { public static final field INSTANCE Lkotlinx/coroutines/Dispatchers; public static final fun getDefault ()Lkotlinx/coroutines/CoroutineDispatcher; diff --git a/kotlinx-coroutines-core/common/src/Annotations.kt b/kotlinx-coroutines-core/common/src/Annotations.kt index 1ade389d37..724cc8cb87 100644 --- a/kotlinx-coroutines-core/common/src/Annotations.kt +++ b/kotlinx-coroutines-core/common/src/Annotations.kt @@ -6,6 +6,22 @@ package kotlinx.coroutines import kotlinx.coroutines.flow.* +/** + * Marks declarations in the coroutines that are **delicate** — + * they have limited use-case and shall be used with care in general code. + * Any use of a delicate declaration has to be carefully reviewed to make sure it is + * properly used and does not create problems like memory and resource leaks. + * Carefully read documentation of any declaration marked as `DelicateCoroutinesApi`. + */ +@MustBeDocumented +@Retention(value = AnnotationRetention.BINARY) +@RequiresOptIn( + level = RequiresOptIn.Level.WARNING, + message = "This is a delicate API and its use requires care." + + " Make sure you fully read and understand documentation of the declaration that is marked as a delicate API." +) +public annotation class DelicateCoroutinesApi + /** * Marks declarations that are still **experimental** in coroutines API, which means that the design of the * corresponding declarations has open issues which may (or may not) lead to their changes in the future. diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index e7c243a42d..df2ee615dc 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -16,7 +16,10 @@ import kotlin.coroutines.intrinsics.* * is an extension on [CoroutineScope] and inherits its [coroutineContext][CoroutineScope.coroutineContext] * to automatically propagate all its elements and cancellation. * - * The best ways to obtain a standalone instance of the scope are [CoroutineScope()] and [MainScope()] factory functions. + * The best ways to obtain a standalone instance of the scope are [CoroutineScope()] and [MainScope()] factory functions, + * taking care to cancel these coroutine scopes when they are no longer needed (see section on custom usage below for + * explanation and example). + * * Additional context elements can be appended to the scope using the [plus][CoroutineScope.plus] operator. * * ### Convention for structured concurrency @@ -38,12 +41,23 @@ import kotlin.coroutines.intrinsics.* * * ### Custom usage * - * [CoroutineScope] should be implemented or declared as a property on entities with a well-defined lifecycle that are - * responsible for launching children coroutines, for example: + * `CoroutineScope` should be declared as a property on entities with a well-defined lifecycle that are + * responsible for launching children coroutines. The corresponding instance of `CoroutineScope` shall be created + * with either `CoroutineScope()` or `MainScope()` functions. The difference between them is only in the + * [CoroutineDispatcher]: + * + * * `CoroutineScope()` uses [Dispatchers.Default] for its coroutines. + * * `MainScope()` uses [Dispatchers.Main] for its coroutines. + * + * **The key part of custom usage of `CustomScope` is cancelling it and the end of the lifecycle.** + * The [CoroutineScope.cancel] extension function shall be used when the entity that was launching coroutines + * is no longer needed. It cancels all the coroutines that might still be running on behalf of it. + * + * For example: * * ``` * class MyUIClass { - * val scope = MainScope() // the scope of MyUIClass + * val scope = MainScope() // the scope of MyUIClass, uses Dispatchers.Main * * fun destroy() { // destroys an instance of MyUIClass * scope.cancel() // cancels all coroutines launched in this scope @@ -124,25 +138,81 @@ public val CoroutineScope.isActive: Boolean /** * A global [CoroutineScope] not bound to any job. - * * Global scope is used to launch top-level coroutines which are operating on the whole application lifetime * and are not cancelled prematurely. - * Another use of the global scope is operators running in [Dispatchers.Unconfined], which don't have any job associated with them. * - * Application code usually should use an application-defined [CoroutineScope]. Using - * [async][CoroutineScope.async] or [launch][CoroutineScope.launch] - * on the instance of [GlobalScope] is highly discouraged. + * Active coroutines launched in `GlobalScope` do not keep the process alive. They are like daemon threads. + * + * This is a **delicate** API. It is easy to accidentally create resource or memory leaks when + * `GlobalScope` is used. A coroutine launched in `GlobalScope` is not subject to the principle of structured + * concurrency, so if it hangs or gets delayed due to a problem (e.g. due to a slow network), it will stay working + * and consuming resources. For example, consider the following code: + * + * ``` + * fun loadConfiguration() { + * GlobalScope.launch { + * val config = fetchConfigFromServer() // network request + * updateConfiguration(config) + * } + * } + * ``` + * + * A call to `loadConfiguration` creates a coroutine in the `GlobalScope` that works in background without any + * provision to cancel it or to wait for its completion. If a network is slow, it keeps waiting in background, + * consuming resources. Repeated calls to `loadConfiguration` will consume more and more resources. + * + * ### Possible replacements + * + * In may cases uses of `GlobalScope` should be removed, marking the containing operation with `suspend`, for example: + * + * ``` + * suspend fun loadConfiguration() { + * val config = fetchConfigFromServer() // network request + * updateConfiguration(config) + * } + * ``` + * + * In cases when `GlobalScope.launch` was used to launch multiple concurrent operations, the corresponding + * operations shall be grouped with [coroutineScope] instead: + * + * ``` + * // concurrently load configuration and data + * suspend fun loadConfigurationAndData() { + * coroutinesScope { + * launch { loadConfiguration() } + * launch { loadData() } + * } + * } + * ``` + * + * In top-level code, when launching a concurrent operation operation from a non-suspending context, an appropriately + * confined instance of [CoroutineScope] shall be used instead of a `GlobalScope`. See docs on [CoroutineScope] for + * details. + * + * ### GlobalScope vs custom scope + * + * Do not replace `GlobalScope.launch { ... }` with `CoroutineScope().launch { ... }` constructor function call. + * The latter has the same pitfalls as `GlobalScope`. See [CoroutineScope] documentation on the intended usage of + * `CoroutineScope()` constructor function. + * + * ### Legitimate use-cases * - * Usage of this interface may look like this: + * There are limited circumstances under which `GlobalScope` can be legitimately and safely used, such as top-level background + * processes that must stay active for the whole duration of the application's lifetime. Because of that, any use + * of `GlobalScope` requires an explicit opt-in with `@OptIn(DelicateCoroutinesApi::class)`, like this: * * ``` - * fun ReceiveChannel.sqrt(): ReceiveChannel = GlobalScope.produce(Dispatchers.Unconfined) { - * for (number in this) { - * send(Math.sqrt(number)) + * // A global coroutine to log statistics every second, must be always active + * @OptIn(DelicateCoroutinesApi::class) + * val globalScopeReporter = GlobalScope.launch { + * while (true) { + * delay(1000) + * logStatistics() * } * } * ``` */ +@DelicateCoroutinesApi public object GlobalScope : CoroutineScope { /** * Returns [EmptyCoroutineContext]. diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-01.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-01.kt index f04b100a8a..529f881730 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-01.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-01.kt @@ -7,11 +7,10 @@ package kotlinx.coroutines.guide.exampleBasic01 import kotlinx.coroutines.* -fun main() { - GlobalScope.launch { // launch a new coroutine in background and continue +fun main() = runBlocking { // this: CoroutineScope + launch { // launch a new coroutine and continue delay(1000L) // non-blocking delay for 1 second (default time unit is ms) println("World!") // print after delay } - println("Hello,") // main thread continues while coroutine is delayed - Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive + println("Hello") // main coroutine continues while a previous one is delayed } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-02.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-02.kt index bfece26bc9..6bf2af4c31 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-02.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-02.kt @@ -7,13 +7,13 @@ package kotlinx.coroutines.guide.exampleBasic02 import kotlinx.coroutines.* -fun main() { - GlobalScope.launch { // launch a new coroutine in background and continue - delay(1000L) - println("World!") - } - println("Hello,") // main thread continues here immediately - runBlocking { // but this expression blocks the main thread - delay(2000L) // ... while we delay for 2 seconds to keep JVM alive - } +fun main() = runBlocking { // this: CoroutineScope + launch { doWorld() } + println("Hello") +} + +// this is your first suspending function +suspend fun doWorld() { + delay(1000L) + println("World!") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-03.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-03.kt index 8541f60472..67b6894ada 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-03.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-03.kt @@ -7,11 +7,14 @@ package kotlinx.coroutines.guide.exampleBasic03 import kotlinx.coroutines.* -fun main() = runBlocking { // start main coroutine - GlobalScope.launch { // launch a new coroutine in background and continue +fun main() = runBlocking { + doWorld() +} + +suspend fun doWorld() = coroutineScope { // this: CoroutineScope + launch { delay(1000L) println("World!") } - println("Hello,") // main coroutine continues here immediately - delay(2000L) // delaying for 2 seconds to keep JVM alive + println("Hello") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt index 69f827715d..3531b22083 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt @@ -7,11 +7,21 @@ package kotlinx.coroutines.guide.exampleBasic04 import kotlinx.coroutines.* +// Sequentially executes doWorld followed by "Hello" fun main() = runBlocking { - val job = GlobalScope.launch { // launch a new coroutine and keep a reference to its Job + doWorld() + println("Done") +} + +// Concurrently executes both sections +suspend fun doWorld() = coroutineScope { // this: CoroutineScope + launch { + delay(2000L) + println("World 2") + } + launch { delay(1000L) - println("World!") + println("World 1") } - println("Hello,") - job.join() // wait until child coroutine completes + println("Hello") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-05.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-05.kt index 9d530b5f2b..193f2cc3aa 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-05.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-05.kt @@ -7,10 +7,12 @@ package kotlinx.coroutines.guide.exampleBasic05 import kotlinx.coroutines.* -fun main() = runBlocking { // this: CoroutineScope - launch { // launch a new coroutine in the scope of runBlocking +fun main() = runBlocking { + val job = launch { // launch a new coroutine and keep a reference to its Job delay(1000L) println("World!") } - println("Hello,") + println("Hello") + job.join() // wait until child coroutine completes + println("Done") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt index b53d3b8962..24b890a0ad 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt @@ -7,21 +7,11 @@ package kotlinx.coroutines.guide.exampleBasic06 import kotlinx.coroutines.* -fun main() = runBlocking { // this: CoroutineScope - launch { - delay(200L) - println("Task from runBlocking") - } - - coroutineScope { // Creates a coroutine scope +fun main() = runBlocking { + repeat(100_000) { // launch a lot of coroutines launch { - delay(500L) - println("Task from nested launch") + delay(5000L) + print(".") } - - delay(100L) - println("Task from coroutine scope") // This line will be printed before the nested launch } - - println("Coroutine scope is over") // This line is not printed until the nested launch completes } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-07.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-07.kt deleted file mode 100644 index cd854ce89a..0000000000 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-07.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -// This file was automatically generated from coroutines-basics.md by Knit tool. Do not edit. -package kotlinx.coroutines.guide.exampleBasic07 - -import kotlinx.coroutines.* - -fun main() = runBlocking { - launch { doWorld() } - println("Hello,") -} - -// this is your first suspending function -suspend fun doWorld() { - delay(1000L) - println("World!") -} diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-08.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-08.kt deleted file mode 100644 index 0a346e0be8..0000000000 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-08.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -// This file was automatically generated from coroutines-basics.md by Knit tool. Do not edit. -package kotlinx.coroutines.guide.exampleBasic08 - -import kotlinx.coroutines.* - -fun main() = runBlocking { - repeat(100_000) { // launch a lot of coroutines - launch { - delay(5000L) - print(".") - } - } -} diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-09.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-09.kt deleted file mode 100644 index c9783ee50f..0000000000 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-09.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -// This file was automatically generated from coroutines-basics.md by Knit tool. Do not edit. -package kotlinx.coroutines.guide.exampleBasic09 - -import kotlinx.coroutines.* - -fun main() = runBlocking { - GlobalScope.launch { - repeat(1000) { i -> - println("I'm sleeping $i ...") - delay(500L) - } - } - delay(1300L) // just quit after delay -} diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-compose-04.kt b/kotlinx-coroutines-core/jvm/test/guide/example-compose-04.kt index 312dc72b55..35536a7d14 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-compose-04.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-compose-04.kt @@ -23,10 +23,12 @@ fun main() { println("Completed in $time ms") } +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulOneAsync() = GlobalScope.async { doSomethingUsefulOne() } +@OptIn(DelicateCoroutinesApi::class) fun somethingUsefulTwoAsync() = GlobalScope.async { doSomethingUsefulTwo() } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt b/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt index e23eaf2542..c6ad4516da 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt @@ -10,9 +10,9 @@ import kotlinx.coroutines.* fun main() = runBlocking { // launch a coroutine to process some kind of incoming request val request = launch { - // it spawns two other jobs, one with GlobalScope - GlobalScope.launch { - println("job1: I run in GlobalScope and execute independently!") + // it spawns two other jobs + launch(Job()) { + println("job1: I run in my own Job and execute independently!") delay(1000) println("job1: I am not affected by cancellation of the request") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-01.kt b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-01.kt index e08ddd0811..24cbabe094 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-01.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-01.kt @@ -7,6 +7,7 @@ package kotlinx.coroutines.guide.exampleExceptions01 import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val job = GlobalScope.launch { // root coroutine with launch println("Throwing exception from launch") diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-02.kt b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-02.kt index 67fdaa7177..c3ab68a53a 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-02.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-02.kt @@ -7,6 +7,7 @@ package kotlinx.coroutines.guide.exampleExceptions02 import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception") diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-04.kt b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-04.kt index 9c9b43d22e..b966c1eab4 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-04.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-04.kt @@ -7,6 +7,7 @@ package kotlinx.coroutines.guide.exampleExceptions04 import kotlinx.coroutines.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception") diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-05.kt b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-05.kt index 04f9385f06..5f1f3d89a9 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-05.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-05.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.exceptions.* import kotlinx.coroutines.* import java.io.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception with suppressed ${exception.suppressed.contentToString()}") diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-06.kt b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-06.kt index 5a5b276bc3..bc9f77b936 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-06.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-exceptions-06.kt @@ -8,6 +8,7 @@ package kotlinx.coroutines.guide.exampleExceptions06 import kotlinx.coroutines.* import java.io.* +@OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception") diff --git a/kotlinx-coroutines-core/jvm/test/guide/test/BasicsGuideTest.kt b/kotlinx-coroutines-core/jvm/test/guide/test/BasicsGuideTest.kt index 765cd0b9df..7e54fb1d26 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/test/BasicsGuideTest.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/test/BasicsGuideTest.kt @@ -12,7 +12,7 @@ class BasicsGuideTest { @Test fun testExampleBasic01() { test("ExampleBasic01") { kotlinx.coroutines.guide.exampleBasic01.main() }.verifyLines( - "Hello,", + "Hello", "World!" ) } @@ -20,7 +20,7 @@ class BasicsGuideTest { @Test fun testExampleBasic02() { test("ExampleBasic02") { kotlinx.coroutines.guide.exampleBasic02.main() }.verifyLines( - "Hello,", + "Hello", "World!" ) } @@ -28,7 +28,7 @@ class BasicsGuideTest { @Test fun testExampleBasic03() { test("ExampleBasic03") { kotlinx.coroutines.guide.exampleBasic03.main() }.verifyLines( - "Hello,", + "Hello", "World!" ) } @@ -36,50 +36,26 @@ class BasicsGuideTest { @Test fun testExampleBasic04() { test("ExampleBasic04") { kotlinx.coroutines.guide.exampleBasic04.main() }.verifyLines( - "Hello,", - "World!" + "Hello", + "World 1", + "World 2", + "Done" ) } @Test fun testExampleBasic05() { test("ExampleBasic05") { kotlinx.coroutines.guide.exampleBasic05.main() }.verifyLines( - "Hello,", - "World!" + "Hello", + "World!", + "Done" ) } @Test fun testExampleBasic06() { - test("ExampleBasic06") { kotlinx.coroutines.guide.exampleBasic06.main() }.verifyLines( - "Task from coroutine scope", - "Task from runBlocking", - "Task from nested launch", - "Coroutine scope is over" - ) - } - - @Test - fun testExampleBasic07() { - test("ExampleBasic07") { kotlinx.coroutines.guide.exampleBasic07.main() }.verifyLines( - "Hello,", - "World!" - ) - } - - @Test - fun testExampleBasic08() { - test("ExampleBasic08") { kotlinx.coroutines.guide.exampleBasic08.main() }.also { lines -> + test("ExampleBasic06") { kotlinx.coroutines.guide.exampleBasic06.main() }.also { lines -> check(lines.size == 1 && lines[0] == ".".repeat(100_000)) } } - - @Test - fun testExampleBasic09() { - test("ExampleBasic09") { kotlinx.coroutines.guide.exampleBasic09.main() }.verifyLines( - "I'm sleeping 0 ...", - "I'm sleeping 1 ...", - "I'm sleeping 2 ..." - ) - } } diff --git a/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt b/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt index d6f1c21dc0..1a84fb9427 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt @@ -57,7 +57,7 @@ class DispatcherGuideTest { @Test fun testExampleContext06() { test("ExampleContext06") { kotlinx.coroutines.guide.exampleContext06.main() }.verifyLines( - "job1: I run in GlobalScope and execute independently!", + "job1: I run in my own Job and execute independently!", "job2: I am a child of the request coroutine", "job1: I am not affected by cancellation of the request", "main: Who has survived request cancellation?" From 998f67bac740ed27e32658d9d8a6f05ab7396c4b Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 20 Apr 2021 16:47:40 +0300 Subject: [PATCH 035/328] Properly implement replacement for Flow.concatWith(flow) to avoid deadlocks when the downstream throws, but other flow has no elements in it (#2659) Fixes KT-46013 --- kotlinx-coroutines-core/common/src/flow/Migration.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/Migration.kt b/kotlinx-coroutines-core/common/src/flow/Migration.kt index 57749523d4..6278081a5d 100644 --- a/kotlinx-coroutines-core/common/src/flow/Migration.kt +++ b/kotlinx-coroutines-core/common/src/flow/Migration.kt @@ -344,13 +344,13 @@ public fun Flow.concatWith(value: T): Flow = noImpl() /** * Flow analogue of `concatWith` is [onCompletion]. - * Use `onCompletion { emitAll(other) }`. + * Use `onCompletion { if (it == null) emitAll(other) }`. * @suppress */ @Deprecated( level = DeprecationLevel.ERROR, - message = "Flow analogue of 'concatWith' is 'onCompletion'. Use 'onCompletion { emitAll(other) }'", - replaceWith = ReplaceWith("onCompletion { emitAll(other) }") + message = "Flow analogue of 'concatWith' is 'onCompletion'. Use 'onCompletion { if (it == null) emitAll(other) }'", + replaceWith = ReplaceWith("onCompletion { if (it == null) emitAll(other) }") ) public fun Flow.concatWith(other: Flow): Flow = noImpl() @@ -404,7 +404,7 @@ public fun Flow.combineLatest( * @suppress */ @Deprecated( - level = DeprecationLevel.WARNING, // since 1.3.0, error in 1.4.0 + level = DeprecationLevel.ERROR, // since 1.3.0, error in 1.5.0 message = "Use 'onStart { delay(timeMillis) }'", replaceWith = ReplaceWith("onStart { delay(timeMillis) }") ) @@ -416,7 +416,7 @@ public fun Flow.delayFlow(timeMillis: Long): Flow = onStart { delay(ti * @suppress */ @Deprecated( - level = DeprecationLevel.WARNING, // since 1.3.0, error in 1.4.0 + level = DeprecationLevel.ERROR, // since 1.3.0, error in 1.5.0 message = "Use 'onEach { delay(timeMillis) }'", replaceWith = ReplaceWith("onEach { delay(timeMillis) }") ) @@ -430,7 +430,7 @@ public fun Flow.delayEach(timeMillis: Long): Flow = onEach { delay(tim public fun Flow.switchMap(transform: suspend (value: T) -> Flow): Flow = flatMapLatest(transform) @Deprecated( - level = DeprecationLevel.WARNING, // Since 1.3.8, was experimental when deprecated + level = DeprecationLevel.ERROR, // Warning since 1.3.8, was experimental when deprecated, ERROR since 1.5.0 message = "'scanReduce' was renamed to 'runningReduce' to be consistent with Kotlin standard library", replaceWith = ReplaceWith("runningReduce(operation)") ) From c752d64ca8a69dfb544abc761376e7253755e92f Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 20 Apr 2021 16:53:46 +0300 Subject: [PATCH 036/328] Shared overflow doc (#2560) * Clarify docs about the restriction on MutableSharedFlow function's onBufferOverflow parameter. * Clarify docs about MutableSharedFlow function without subscribers but with onBufferOverflow Co-authored-by: Zach Klippenstein --- .../common/src/flow/SharedFlow.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index 25118d75a1..9bcf088e95 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -68,6 +68,13 @@ import kotlin.native.concurrent.* * the `onBufferOverflow` parameter, which is equal to one of the entries of the [BufferOverflow] enum. When a strategy other * than [SUSPENDED][BufferOverflow.SUSPEND] is configured, emissions to the shared flow never suspend. * + * **Buffer overflow condition can happen only when there is at least one subscriber that is not ready to accept + * the new value.** In the absence of subscribers only the most recent `replay` values are stored and the buffer + * overflow behavior is never triggered and has no effect. In particular, in the absence of subscribers emitter never + * suspends despite [BufferOverflow.SUSPEND] option and [BufferOverflow.DROP_LATEST] option does not have effect either. + * Essentially, the behavior in the absence of subscribers is always similar to [BufferOverflow.DROP_OLDEST], + * but the buffer is just of `replay` size (without any `extraBufferCapacity`). + * * ### Unbuffered shared flow * * A default implementation of a shared flow that is created with `MutableSharedFlow()` constructor function @@ -221,9 +228,12 @@ public interface MutableSharedFlow : SharedFlow, FlowCollector { * @param replay the number of values replayed to new subscribers (cannot be negative, defaults to zero). * @param extraBufferCapacity the number of values buffered in addition to `replay`. * [emit][MutableSharedFlow.emit] does not suspend while there is a buffer space remaining (optional, cannot be negative, defaults to zero). - * @param onBufferOverflow configures an action on buffer overflow (optional, defaults to - * [suspending][BufferOverflow.SUSPEND] attempts to [emit][MutableSharedFlow.emit] a value, - * supported only when `replay > 0` or `extraBufferCapacity > 0`). + * @param onBufferOverflow configures an [emit][MutableSharedFlow.emit] action on buffer overflow. Optional, defaults to + * [suspending][BufferOverflow.SUSPEND] attempts to emit a value. + * Values other than [BufferOverflow.SUSPEND] are supported only when `replay > 0` or `extraBufferCapacity > 0`. + * **Buffer overflow can happen only when there is at least one subscriber that is not ready to accept + * the new value.** In the absence of subscribers only the most recent [replay] values are stored and + * the buffer overflow behavior is never triggered and has no effect. */ @Suppress("FunctionName", "UNCHECKED_CAST") public fun MutableSharedFlow( From cefb84f6d5fe9a350f0e2fce90dcd8b81f380618 Mon Sep 17 00:00:00 2001 From: Andrey Polyakov Date: Tue, 20 Apr 2021 19:51:02 +0300 Subject: [PATCH 037/328] Update coroutines-guide.md link (#2661) --- docs/topics/coroutines-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/coroutines-guide.md b/docs/topics/coroutines-guide.md index 050376ce1b..3d857991a1 100644 --- a/docs/topics/coroutines-guide.md +++ b/docs/topics/coroutines-guide.md @@ -32,5 +32,5 @@ In order to use coroutines as well as follow the examples in this guide, you nee ## Additional references * [Guide to UI programming with coroutines](https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md) -* [Coroutines design document (KEEP)](https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md) +* [Coroutines design document (KEEP)](https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md) * [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines) From 71df60e732ff91103af76636b97bcd7705a6df7d Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 21 Apr 2021 10:30:33 +0300 Subject: [PATCH 038/328] Deprecate awaitSingleOr*, specialize some await* functions for Mono and Maybe (#2628) * Deprecated `awaitSingleOr*` on arbitrary Publishers * Added specialized `awaitSingle` and `awaitSingleOrNull` methods on `Maybe` and `Mono` * Deprecated `Maybe.await()` in favor of `Maybe.awaitSingleOrNull()` * Added specializations of most of the `await*` methods for `Mono` and deprecated them, as the only useful methods on `Mono` are `awaitSingle` and `awaitSingleOrNull` * Reworded some documentation for `await*` methods Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2591 Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/1587 --- reactive/kotlinx-coroutines-jdk9/src/Await.kt | 72 ++++---- .../kotlinx-coroutines-jdk9/test/AwaitTest.kt | 43 +++++ .../kotlinx-coroutines-reactive/src/Await.kt | 145 +++++++++++------ .../test/AwaitTest.kt | 43 +++++ .../api/kotlinx-coroutines-reactor.api | 7 + .../kotlinx-coroutines-reactor/src/Mono.kt | 154 +++++++++++++++++- .../src/ReactorContext.kt | 4 +- .../test/FlowAsFluxTest.kt | 4 +- .../test/MonoTest.kt | 59 ++++++- .../test/ReactorContextTest.kt | 12 +- .../api/kotlinx-coroutines-rx2.api | 2 + .../kotlinx-coroutines-rx2/src/RxAwait.kt | 140 ++++++++++------ .../test/CompletableTest.kt | 30 +++- .../kotlinx-coroutines-rx2/test/MaybeTest.kt | 46 ++++-- .../test/ObservableSingleTest.kt | 30 +++- .../kotlinx-coroutines-rx2/test/SingleTest.kt | 28 +++- .../api/kotlinx-coroutines-rx3.api | 2 + .../kotlinx-coroutines-rx3/src/RxAwait.kt | 141 ++++++++++------ .../test/CompletableTest.kt | 30 +++- .../kotlinx-coroutines-rx3/test/MaybeTest.kt | 46 ++++-- .../test/ObservableSingleTest.kt | 30 +++- .../kotlinx-coroutines-rx3/test/SingleTest.kt | 28 +++- 22 files changed, 871 insertions(+), 225 deletions(-) create mode 100644 reactive/kotlinx-coroutines-jdk9/test/AwaitTest.kt create mode 100644 reactive/kotlinx-coroutines-reactive/test/AwaitTest.kt diff --git a/reactive/kotlinx-coroutines-jdk9/src/Await.kt b/reactive/kotlinx-coroutines-jdk9/src/Await.kt index 4febf4079c..dfe6ec52f2 100644 --- a/reactive/kotlinx-coroutines-jdk9/src/Await.kt +++ b/reactive/kotlinx-coroutines-jdk9/src/Await.kt @@ -4,78 +4,82 @@ package kotlinx.coroutines.jdk9 +import kotlinx.coroutines.* import java.util.concurrent.* import org.reactivestreams.FlowAdapters import kotlinx.coroutines.reactive.* /** - * Awaits for the first value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the first value from the given publisher without blocking the thread and returns the resulting value, or, if + * the publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value + * @throws NoSuchElementException if the publisher does not emit any value */ -public suspend fun Flow.Publisher.awaitFirst(): T = FlowAdapters.toPublisher(this).awaitFirst() +public suspend fun Flow.Publisher.awaitFirst(): T = + FlowAdapters.toPublisher(this).awaitFirst() /** - * Awaits for the first value from the given observable or the [default] value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or returns the [default] value if none is emitted, without blocking + * the thread, and returns the resulting value, or, if this publisher has produced an error, throws the corresponding + * exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. */ public suspend fun Flow.Publisher.awaitFirstOrDefault(default: T): T = - FlowAdapters.toPublisher(this).awaitFirstOrDefault(default) + FlowAdapters.toPublisher(this).awaitFirstOrDefault(default) /** - * Awaits for the first value from the given observable or `null` value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or returns `null` if none is emitted, without blocking the thread, + * and returns the resulting value, or, if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. */ public suspend fun Flow.Publisher.awaitFirstOrNull(): T? = - FlowAdapters.toPublisher(this).awaitFirstOrNull() + FlowAdapters.toPublisher(this).awaitFirstOrNull() /** - * Awaits for the first value from the given observable or call [defaultValue] to get a value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or calls [defaultValue] to get a value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this publisher has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. */ public suspend fun Flow.Publisher.awaitFirstOrElse(defaultValue: () -> T): T = - FlowAdapters.toPublisher(this).awaitFirstOrElse(defaultValue) + FlowAdapters.toPublisher(this).awaitFirstOrElse(defaultValue) /** - * Awaits for the last value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the last value from the given publisher without blocking the thread and + * returns the resulting value, or, if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value + * @throws NoSuchElementException if the publisher does not emit any value */ public suspend fun Flow.Publisher.awaitLast(): T = - FlowAdapters.toPublisher(this).awaitLast() + FlowAdapters.toPublisher(this).awaitLast() /** - * Awaits for the single value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the single value from the given publisher without blocking the thread and returns the resulting value, or, + * if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Flow.Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value - * @throws IllegalArgumentException if publisher emits more than one value + * @throws NoSuchElementException if the publisher does not emit any value + * @throws IllegalArgumentException if the publisher emits more than one value */ public suspend fun Flow.Publisher.awaitSingle(): T = - FlowAdapters.toPublisher(this).awaitSingle() + FlowAdapters.toPublisher(this).awaitSingle() diff --git a/reactive/kotlinx-coroutines-jdk9/test/AwaitTest.kt b/reactive/kotlinx-coroutines-jdk9/test/AwaitTest.kt new file mode 100644 index 0000000000..5a95d098fd --- /dev/null +++ b/reactive/kotlinx-coroutines-jdk9/test/AwaitTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.jdk9 + +import kotlinx.coroutines.* +import org.junit.* +import java.util.concurrent.Flow as JFlow + +class AwaitTest: TestBase() { + + /** Tests that calls to [awaitFirst] (and, thus, to the rest of these functions) throw [CancellationException] and + * unsubscribe from the publisher when their [Job] is cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val publisher = JFlow.Publisher { s -> + s.onSubscribe(object : JFlow.Subscription { + override fun request(n: Long) { + expect(3) + } + + override fun cancel() { + expect(5) + } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + publisher.awaitFirst() + } catch (e: CancellationException) { + expect(6) + throw e + } + } + expect(4) + job.cancelAndJoin() + finish(7) + } + +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/src/Await.kt b/reactive/kotlinx-coroutines-reactive/src/Await.kt index 9af134cb94..067f5e8031 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Await.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Await.kt @@ -9,114 +9,161 @@ import org.reactivestreams.Publisher import org.reactivestreams.Subscriber import org.reactivestreams.Subscription import java.lang.IllegalStateException -import java.util.* import kotlin.coroutines.* /** - * Awaits for the first value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the first value from the given publisher without blocking the thread and returns the resulting value, or, if + * the publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value + * @throws NoSuchElementException if the publisher does not emit any value */ public suspend fun Publisher.awaitFirst(): T = awaitOne(Mode.FIRST) /** - * Awaits for the first value from the given observable or the [default] value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or returns the [default] value if none is emitted, without blocking + * the thread, and returns the resulting value, or, if this publisher has produced an error, throws the corresponding + * exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. */ public suspend fun Publisher.awaitFirstOrDefault(default: T): T = awaitOne(Mode.FIRST_OR_DEFAULT, default) /** - * Awaits for the first value from the given observable or `null` value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or returns `null` if none is emitted, without blocking the thread, + * and returns the resulting value, or, if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. */ public suspend fun Publisher.awaitFirstOrNull(): T? = awaitOne(Mode.FIRST_OR_DEFAULT) /** - * Awaits for the first value from the given observable or call [defaultValue] to get a value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given publisher, or calls [defaultValue] to get a value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this publisher has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. */ public suspend fun Publisher.awaitFirstOrElse(defaultValue: () -> T): T = awaitOne(Mode.FIRST_OR_DEFAULT) ?: defaultValue() /** - * Awaits for the last value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the last value from the given publisher without blocking the thread and + * returns the resulting value, or, if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value + * @throws NoSuchElementException if the publisher does not emit any value */ public suspend fun Publisher.awaitLast(): T = awaitOne(Mode.LAST) /** - * Awaits for the single value from the given publisher without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the single value from the given publisher without blocking the thread and returns the resulting value, or, + * if this publisher has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value - * @throws IllegalArgumentException if publisher emits more than one value + * @throws NoSuchElementException if the publisher does not emit any value + * @throws IllegalArgumentException if the publisher emits more than one value */ public suspend fun Publisher.awaitSingle(): T = awaitOne(Mode.SINGLE) /** - * Awaits for the single value from the given publisher or the [default] value if none is emitted without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the single value from the given publisher, or returns the [default] value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this publisher has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. * - * @throws NoSuchElementException if publisher does not emit any value - * @throws IllegalArgumentException if publisher emits more than one value + * ### Deprecation + * + * This method is deprecated because the conventions established in Kotlin mandate that an operation with the name + * `awaitSingleOrDefault` returns the default value instead of throwing in case there is an error; however, this would + * also mean that this method would return the default value if there are *too many* values. This could be confusing to + * those who expect this function to validate that there is a single element or none at all emitted, and cases where + * there are no elements are indistinguishable from those where there are too many, though these cases have different + * meaning. + * + * @throws NoSuchElementException if the publisher does not emit any value + * @throws IllegalArgumentException if the publisher emits more than one value */ +@Deprecated( + message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + + "Please consider using awaitFirstOrDefault().", + level = DeprecationLevel.WARNING +) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun Publisher.awaitSingleOrDefault(default: T): T = awaitOne(Mode.SINGLE_OR_DEFAULT, default) /** - * Awaits for the single value from the given publisher or `null` value if none is emitted without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the single value from the given publisher without blocking the thread and returns the resulting value, or, if + * this publisher has produced an error, throws the corresponding exception. If more than one value or none were + * produced by the publisher, `null` is returned. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. + * + * ### Deprecation * - * @throws NoSuchElementException if publisher does not emit any value - * @throws IllegalArgumentException if publisher emits more than one value + * This method is deprecated because the conventions established in Kotlin mandate that an operation with the name + * `awaitSingleOrNull` returns `null` instead of throwing in case there is an error; however, this would + * also mean that this method would return `null` if there are *too many* values. This could be confusing to + * those who expect this function to validate that there is a single element or none at all emitted, and cases where + * there are no elements are indistinguishable from those where there are too many, though these cases have different + * meaning. + * + * @throws IllegalArgumentException if the publisher emits more than one value */ -public suspend fun Publisher.awaitSingleOrNull(): T = awaitOne(Mode.SINGLE_OR_DEFAULT) +@Deprecated( + message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + + "There is a specialized version for Reactor's Mono, please use that where applicable. " + + "Alternatively, please consider using awaitFirstOrNull().", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull()", "kotlinx.coroutines.reactor") +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun Publisher.awaitSingleOrNull(): T? = awaitOne(Mode.SINGLE_OR_DEFAULT) /** - * Awaits for the single value from the given publisher or call [defaultValue] to get a value if none is emitted without blocking a thread and - * returns the resulting value or throws the corresponding exception if this publisher had produced error. + * Awaits the single value from the given publisher, or calls [defaultValue] to get a value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this publisher has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. + * + * ### Deprecation + * + * This method is deprecated because the conventions established in Kotlin mandate that an operation with the name + * `awaitSingleOrElse` returns the calculated value instead of throwing in case there is an error; however, this would + * also mean that this method would return the calculated value if there are *too many* values. This could be confusing + * to those who expect this function to validate that there is a single element or none at all emitted, and cases where + * there are no elements are indistinguishable from those where there are too many, though these cases have different + * meaning. * - * @throws NoSuchElementException if publisher does not emit any value - * @throws IllegalArgumentException if publisher emits more than one value + * @throws IllegalArgumentException if the publisher emits more than one value */ -public suspend fun Publisher.awaitSingleOrElse(defaultValue: () -> T): T = awaitOne(Mode.SINGLE_OR_DEFAULT) ?: defaultValue() +@Deprecated( + message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + + "Please consider using awaitFirstOrElse().", + level = DeprecationLevel.WARNING +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun Publisher.awaitSingleOrElse(defaultValue: () -> T): T = + awaitOne(Mode.SINGLE_OR_DEFAULT) ?: defaultValue() // ------------------------ private ------------------------ diff --git a/reactive/kotlinx-coroutines-reactive/test/AwaitTest.kt b/reactive/kotlinx-coroutines-reactive/test/AwaitTest.kt new file mode 100644 index 0000000000..6749423f80 --- /dev/null +++ b/reactive/kotlinx-coroutines-reactive/test/AwaitTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.reactive + +import kotlinx.coroutines.* +import org.junit.* +import org.reactivestreams.* + +class AwaitTest: TestBase() { + + /** Tests that calls to [awaitFirst] (and, thus, to the rest of these functions) throw [CancellationException] and + * unsubscribe from the publisher when their [Job] is cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val publisher = Publisher { s -> + s.onSubscribe(object: Subscription { + override fun request(n: Long) { + expect(3) + } + + override fun cancel() { + expect(5) + } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + publisher.awaitFirst() + } catch (e: CancellationException) { + expect(6) + throw e + } + } + expect(4) + job.cancelAndJoin() + finish(7) + } + +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api index 3a1c8b7d31..0a10aa12a9 100644 --- a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api +++ b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api @@ -17,6 +17,13 @@ public final class kotlinx/coroutines/reactor/FluxKt { } public final class kotlinx/coroutines/reactor/MonoKt { + public static final fun awaitFirst (Lreactor/core/publisher/Mono;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitFirstOrDefault (Lreactor/core/publisher/Mono;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitFirstOrElse (Lreactor/core/publisher/Mono;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitFirstOrNull (Lreactor/core/publisher/Mono;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitLast (Lreactor/core/publisher/Mono;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingle (Lreactor/core/publisher/Mono;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingleOrNull (Lreactor/core/publisher/Mono;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun mono (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Mono; public static final synthetic fun mono (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)Lreactor/core/publisher/Mono; public static synthetic fun mono$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lreactor/core/publisher/Mono; diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 6e7b95ba6e..6a4a38f379 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -12,7 +12,6 @@ import org.reactivestreams.* import reactor.core.* import reactor.core.publisher.* import kotlin.coroutines.* -import kotlin.internal.* import kotlinx.coroutines.internal.* /** @@ -35,6 +34,50 @@ public fun mono( return monoInternal(GlobalScope, context, block) } +/** + * Awaits the single value from the given [Mono] without blocking the thread and returns the resulting value, or, if + * this publisher has produced an error, throws the corresponding exception. If the Mono completed without a value, + * `null` is returned. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. + */ +public suspend fun Mono.awaitSingleOrNull(): T? = suspendCancellableCoroutine { cont -> + injectCoroutineContext(cont.context).subscribe(object : Subscriber { + private var seenValue = false + + override fun onSubscribe(s: Subscription) { + cont.invokeOnCancellation { s.cancel() } + s.request(Long.MAX_VALUE) + } + + override fun onComplete() { + if (!seenValue) cont.resume(null) + } + + override fun onNext(t: T) { + seenValue = true + cont.resume(t) + } + + override fun onError(error: Throwable) { cont.resumeWithException(error) } + }) +} + +/** + * Awaits the single value from the given [Mono] without blocking the thread and returns the resulting value, or, + * if this Mono has produced an error, throws the corresponding exception. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately cancels its [Subscription] and resumes with [CancellationException]. + * + * @throws NoSuchElementException if the Mono does not emit any value + */ +// TODO: consider using https://github.com/Kotlin/kotlinx.coroutines/issues/2607 once that lands +public suspend fun Mono.awaitSingle(): T = awaitSingleOrNull() ?: throw NoSuchElementException() + private fun monoInternal( scope: CoroutineScope, // support for legacy mono in scope context: CoroutineContext, @@ -92,3 +135,112 @@ public fun CoroutineScope.mono( block: suspend CoroutineScope.() -> T? ): Mono = monoInternal(this, context, block) +/** + * This is a lint function that was added already deprecated in order to guard against confusing usages on [Mono]. + * On [Publisher] instances other than [Mono], this function is not deprecated. + * + * Both [awaitFirst] and [awaitSingle] await the first value, or throw [NoSuchElementException] if there is none, but + * the name [Mono.awaitSingle] better reflects the semantics of [Mono]. + * + * For example, consider this code: + * ``` + * myDbClient.findById(uniqueId).awaitFirst() // findById returns a `Mono` + * ``` + * It looks like more than one value could be returned from `findById` and [awaitFirst] discards the extra elements, + * when in fact, at most a single value can be present. + */ +@Deprecated( + message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + + "Please use awaitSingle() instead.", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingle()") +) // Warning since 1.5, error in 1.6 +public suspend fun Mono.awaitFirst(): T = awaitSingle() + +/** + * This is a lint function that was added already deprecated in order to guard against confusing usages on [Mono]. + * On [Publisher] instances other than [Mono], this function is not deprecated. + * + * Both [awaitFirstOrDefault] and [awaitSingleOrNull] await the first value, or return some special value if there + * is none, but the name [Mono.awaitSingleOrNull] better reflects the semantics of [Mono]. + * + * For example, consider this code: + * ``` + * myDbClient.findById(uniqueId).awaitFirstOrDefault(default) // findById returns a `Mono` + * ``` + * It looks like more than one value could be returned from `findById` and [awaitFirstOrDefault] discards the extra + * elements, when in fact, at most a single value can be present. + */ +@Deprecated( + message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + + "Please use awaitSingleOrNull() instead.", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") +) // Warning since 1.5, error in 1.6 +public suspend fun Mono.awaitFirstOrDefault(default: T): T = awaitSingleOrNull() ?: default + +/** + * This is a lint function that was added already deprecated in order to guard against confusing usages on [Mono]. + * On [Publisher] instances other than [Mono], this function is not deprecated. + * + * Both [awaitFirstOrNull] and [awaitSingleOrNull] await the first value, or return some special value if there + * is none, but the name [Mono.awaitSingleOrNull] better reflects the semantics of [Mono]. + * + * For example, consider this code: + * ``` + * myDbClient.findById(uniqueId).awaitFirstOrNull() // findById returns a `Mono` + * ``` + * It looks like more than one value could be returned from `findById` and [awaitFirstOrNull] discards the extra + * elements, when in fact, at most a single value can be present. + */ +@Deprecated( + message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + + "Please use awaitSingleOrNull() instead.", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull()") +) // Warning since 1.5, error in 1.6 +public suspend fun Mono.awaitFirstOrNull(): T? = awaitSingleOrNull() + +/** + * This is a lint function that was added already deprecated in order to guard against confusing usages on [Mono]. + * On [Publisher] instances other than [Mono], this function is not deprecated. + * + * Both [awaitFirstOrElse] and [awaitSingleOrNull] await the first value, or return some special value if there + * is none, but the name [Mono.awaitSingleOrNull] better reflects the semantics of [Mono]. + * + * For example, consider this code: + * ``` + * myDbClient.findById(uniqueId).awaitFirstOrElse(defaultValue) // findById returns a `Mono` + * ``` + * It looks like more than one value could be returned from `findById` and [awaitFirstOrElse] discards the extra + * elements, when in fact, at most a single value can be present. + */ +@Deprecated( + message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + + "Please use awaitSingleOrNull() instead.", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: defaultValue()") +) // Warning since 1.5, error in 1.6 +public suspend fun Mono.awaitFirstOrElse(defaultValue: () -> T): T = awaitSingleOrNull() ?: defaultValue() + +/** + * This is a lint function that was added already deprecated in order to guard against confusing usages on [Mono]. + * On [Publisher] instances other than [Mono], this function is not deprecated. + * + * Both [awaitLast] and [awaitSingle] await the single value, or throw [NoSuchElementException] if there is none, but + * the name [Mono.awaitSingle] better reflects the semantics of [Mono]. + * + * For example, consider this code: + * ``` + * myDbClient.findById(uniqueId).awaitLast() // findById returns a `Mono` + * ``` + * It looks like more than one value could be returned from `findById` and [awaitLast] discards the initial elements, + * when in fact, at most a single value can be present. + */ +@Deprecated( + message = "Mono produces at most one value, so the last element is the same as the first. " + + "Please use awaitSingle() instead.", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingle()") +) // Warning since 1.5, error in 1.6 +public suspend fun Mono.awaitLast(): T = awaitSingle() \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index be4b2c7d45..333f056d97 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -16,8 +16,8 @@ import kotlinx.coroutines.reactive.* * * This context element is implicitly propagated through subscriber's context by all Reactive integrations, such as [mono], [flux], * [Publisher.asFlow][asFlow], [Flow.asPublisher][asPublisher] and [Flow.asFlux][asFlux]. - * Functions that subscribe to the reactive stream (e.g. [Publisher.awaitFirst][awaitFirst]) also propagate [ReactorContext] to the - * subscriber's [Context]. + * Functions that subscribe to the reactive stream (e.g. [Publisher.awaitFirst][kotlinx.coroutines.reactive.awaitFirst]) + * also propagate the [ReactorContext] to the subscriber's [Context]. ** * ### Examples of Reactive context integration. * diff --git a/reactive/kotlinx-coroutines-reactor/test/FlowAsFluxTest.kt b/reactive/kotlinx-coroutines-reactor/test/FlowAsFluxTest.kt index dbe97b17d8..d8807385f0 100644 --- a/reactive/kotlinx-coroutines-reactor/test/FlowAsFluxTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/FlowAsFluxTest.kt @@ -14,8 +14,8 @@ import kotlin.test.* class FlowAsFluxTest : TestBase() { @Test fun testFlowAsFluxContextPropagation() { - val flux = flow { - (1..4).forEach { i -> emit(createMono(i).awaitFirst()) } + val flux = flow { + (1..4).forEach { i -> emit(createMono(i).awaitSingle()) } } .asFlux() .contextWrite(Context.of(1, "1")) diff --git a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt index a98c514f19..421295d115 100644 --- a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt @@ -13,7 +13,6 @@ import org.junit.Test import org.reactivestreams.* import reactor.core.publisher.* import reactor.util.context.* -import java.time.* import java.time.Duration.* import java.util.function.* import kotlin.test.* @@ -115,6 +114,52 @@ class MonoTest : TestBase() { @Test fun testMonoAwait() = runBlocking { assertEquals("OK", Mono.just("O").awaitSingle() + "K") + assertEquals("OK", Mono.just("O").awaitSingleOrNull() + "K") + assertFailsWith{ Mono.empty().awaitSingle() } + assertNull(Mono.empty().awaitSingleOrNull()) + } + + /** Tests that the versions of the await methods specialized for Mono for deprecation behave correctly and we don't + * break any code by introducing them. */ + @Test + @Suppress("DEPRECATION") + fun testDeprecatedAwaitMethods() = runBlocking { + val filledMono = mono { "OK" } + assertEquals("OK", filledMono.awaitFirst()) + assertEquals("OK", filledMono.awaitFirstOrDefault("!")) + assertEquals("OK", filledMono.awaitFirstOrNull()) + assertEquals("OK", filledMono.awaitFirstOrElse { "ELSE" }) + assertEquals("OK", filledMono.awaitLast()) + assertEquals("OK", filledMono.awaitSingleOrDefault("!")) + assertEquals("OK", filledMono.awaitSingleOrElse { "ELSE" }) + val emptyMono = mono { null } + assertFailsWith { emptyMono.awaitFirst() } + assertEquals("OK", emptyMono.awaitFirstOrDefault("OK")) + assertNull(emptyMono.awaitFirstOrNull()) + assertEquals("ELSE", emptyMono.awaitFirstOrElse { "ELSE" }) + assertFailsWith { emptyMono.awaitLast() } + assertEquals("OK", emptyMono.awaitSingleOrDefault("OK")) + assertEquals("ELSE", emptyMono.awaitSingleOrElse { "ELSE" }) + } + + /** Tests that calls to [awaitSingleOrNull] (and, thus, to the rest of such functions) throw [CancellationException] + * and unsubscribe from the publisher when their [Job] is cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val mono = mono { delay(Long.MAX_VALUE) }.doOnSubscribe { expect(3) }.doOnCancel { expect(5) } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + mono.awaitSingleOrNull() + } catch (e: CancellationException) { + expect(6) + throw e + } + } + expect(4) + job.cancelAndJoin() + finish(7) } @Test @@ -264,7 +309,7 @@ class MonoTest : TestBase() { .interval(ofMillis(1)) .switchMap { mono(coroutineContext) { - timeBomb().awaitFirst() + timeBomb().awaitSingle() } } .onErrorReturn({ @@ -275,14 +320,14 @@ class MonoTest : TestBase() { finish(2) } - private fun timeBomb() = Mono.delay(Duration.ofMillis(1)).doOnSuccess { throw Exception("something went wrong") } + private fun timeBomb() = Mono.delay(ofMillis(1)).doOnSuccess { throw Exception("something went wrong") } @Test fun testLeakedException() = runBlocking { // Test exception is not reported to global handler val flow = mono { throw TestException() }.toFlux().asFlow() repeat(10000) { - combine(flow, flow) { _, _ -> Unit } + combine(flow, flow) { _, _ -> } .catch {} .collect { } } @@ -373,13 +418,13 @@ class MonoTest : TestBase() { Hooks.resetOnOperatorError("testDownstreamCancellationDoesNotThrow") } - /** Run the given [Publisher], cancel it, wait for the cancellation handler to finish, and return only then. + /** Run the given [Mono], cancel it, wait for the cancellation handler to finish, and return only then. * * Will not work in the general case, but here, when the publisher uses [Dispatchers.Unconfined], this seems to * ensure that the cancellation handler will have nowhere to execute but serially with the cancellation. */ - private suspend fun Publisher.awaitCancelAndJoin() = coroutineScope { + private suspend fun Mono.awaitCancelAndJoin() = coroutineScope { async(start = CoroutineStart.UNDISPATCHED) { - awaitFirstOrNull() + awaitSingleOrNull() }.cancelAndJoin() } } diff --git a/reactive/kotlinx-coroutines-reactor/test/ReactorContextTest.kt b/reactive/kotlinx-coroutines-reactor/test/ReactorContextTest.kt index aff29241c9..577238be1d 100644 --- a/reactive/kotlinx-coroutines-reactor/test/ReactorContextTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/ReactorContextTest.kt @@ -20,7 +20,7 @@ class ReactorContextTest : TestBase() { } } .contextWrite(Context.of(2, "2", 3, "3", 4, "4", 5, "5")) .contextWrite { ctx -> ctx.put(6, "6") } - assertEquals(mono.awaitFirst(), "1234567") + assertEquals(mono.awaitSingle(), "1234567") } @Test @@ -43,22 +43,18 @@ class ReactorContextTest : TestBase() { (1..3).forEach { append(ctx.getOrDefault(it, "noValue")) } } } .contextWrite(Context.of(2, "2")) - .awaitFirst() + .awaitSingle() assertEquals(result, "123") } @Test fun testMonoAwaitContextPropagation() = runBlocking(Context.of(7, "7").asCoroutineContext()) { - assertEquals(createMono().awaitFirst(), "7") - assertEquals(createMono().awaitFirstOrDefault("noValue"), "7") - assertEquals(createMono().awaitFirstOrNull(), "7") - assertEquals(createMono().awaitFirstOrElse { "noValue" }, "7") - assertEquals(createMono().awaitLast(), "7") assertEquals(createMono().awaitSingle(), "7") + assertEquals(createMono().awaitSingleOrNull(), "7") } @Test - fun testFluxAwaitContextPropagation() = runBlocking( + fun testFluxAwaitContextPropagation() = runBlocking( Context.of(1, "1", 2, "2", 3, "3").asCoroutineContext() ) { assertEquals(createFlux().awaitFirst(), "1") diff --git a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api index eb5e2fb4ad..c27ef4d796 100644 --- a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api +++ b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api @@ -8,7 +8,9 @@ public final class kotlinx/coroutines/rx2/RxAwaitKt { public static final fun awaitFirstOrNull (Lio/reactivex/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitLast (Lio/reactivex/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitOrDefault (Lio/reactivex/MaybeSource;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingle (Lio/reactivex/MaybeSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitSingle (Lio/reactivex/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingleOrNull (Lio/reactivex/MaybeSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class kotlinx/coroutines/rx2/RxChannelKt { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt index 6e162c9a4d..d7b8ee26f6 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt @@ -15,11 +15,12 @@ import kotlin.coroutines.* // ------------------------ CompletableSource ------------------------ /** - * Awaits for completion of this completable without blocking a thread. - * Returns `Unit` or throws the corresponding exception if this completable had produced error. + * Awaits for completion of this completable without blocking the thread. + * Returns `Unit`, or throws the corresponding exception if this completable produces an error. * * This suspending function is cancellable. If the [Job] of the invoking coroutine is cancelled or completed while this - * suspending function is suspended, this function immediately resumes with [CancellationException]. + * suspending function is suspended, this function immediately resumes with [CancellationException] and disposes of its + * subscription. */ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine { cont -> subscribe(object : CompletableObserver { @@ -31,6 +32,37 @@ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine // ------------------------ MaybeSource ------------------------ +/** + * Awaits for completion of the [MaybeSource] without blocking the thread. + * Returns the resulting value, or `null` if no value is produced, or throws the corresponding exception if this + * [MaybeSource] produces an error. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this + * function immediately resumes with [CancellationException] and disposes of its subscription. + */ +@Suppress("UNCHECKED_CAST") +public suspend fun MaybeSource.awaitSingleOrNull(): T? = suspendCancellableCoroutine { cont -> + subscribe(object : MaybeObserver { + override fun onSubscribe(d: Disposable) { cont.disposeOnCancellation(d) } + override fun onComplete() { cont.resume(null) } + override fun onSuccess(t: T) { cont.resume(t) } + override fun onError(error: Throwable) { cont.resumeWithException(error) } + }) +} + +/** + * Awaits for completion of the [MaybeSource] without blocking the thread. + * Returns the resulting value, or throws if either no value is produced or this [MaybeSource] produces an error. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this + * function immediately resumes with [CancellationException] and disposes of its subscription. + * + * @throws NoSuchElementException if no elements were produced by this [MaybeSource]. + */ +public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: throw NoSuchElementException() + /** * Awaits for completion of the maybe without blocking a thread. * Returns the resulting value, null if no value was produced or throws the corresponding exception if this @@ -39,9 +71,18 @@ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function * immediately resumes with [CancellationException]. + * + * ### Deprecation + * + * Deprecated in favor of [awaitSingleOrNull] in order to reflect that `null` can be returned to denote the absence of + * a value, as opposed to throwing in such case. */ -@Suppress("UNCHECKED_CAST") -public suspend fun MaybeSource.await(): T? = (this as MaybeSource).awaitOrDefault(null) +@Deprecated( + message = "Deprecated in favor of awaitSingleOrNull()", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull()") +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() /** * Awaits for completion of the maybe without blocking a thread. @@ -51,25 +92,28 @@ public suspend fun MaybeSource.await(): T? = (this as MaybeSource).aw * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function * immediately resumes with [CancellationException]. + * + * ### Deprecation + * + * Deprecated in favor of [awaitSingleOrNull] for naming consistency (see the deprecation of [MaybeSource.await] for + * details). */ -public suspend fun MaybeSource.awaitOrDefault(default: T): T = suspendCancellableCoroutine { cont -> - subscribe(object : MaybeObserver { - override fun onSubscribe(d: Disposable) { cont.disposeOnCancellation(d) } - override fun onComplete() { cont.resume(default) } - override fun onSuccess(t: T) { cont.resume(t) } - override fun onError(error: Throwable) { cont.resumeWithException(error) } - }) -} +@Deprecated( + message = "Deprecated in favor of awaitSingleOrNull()", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun MaybeSource.awaitOrDefault(default: T): T = awaitSingleOrNull() ?: default // ------------------------ SingleSource ------------------------ /** - * Awaits for completion of the single value without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this single had produced error. + * Awaits for completion of the single value response without blocking the thread. + * Returns the resulting value, or throws the corresponding exception if this response produces an error. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun SingleSource.await(): T = suspendCancellableCoroutine { cont -> subscribe(object : SingleObserver { @@ -82,69 +126,73 @@ public suspend fun SingleSource.await(): T = suspendCancellableCoroutine // ------------------------ ObservableSource ------------------------ /** - * Awaits for the first value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable] without blocking the thread and returns the resulting value, or, + * if the observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value + * @throws NoSuchElementException if the observable does not emit any value */ public suspend fun ObservableSource.awaitFirst(): T = awaitOne(Mode.FIRST) /** - * Awaits for the first value from the given observable or the [default] value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or returns the [default] value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this observable has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun ObservableSource.awaitFirstOrDefault(default: T): T = awaitOne(Mode.FIRST_OR_DEFAULT, default) /** - * Awaits for the first value from the given observable or `null` value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or returns `null` if none is emitted, without blocking the + * thread, and returns the resulting value, or, if this observable has produced an error, throws the corresponding + * exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun ObservableSource.awaitFirstOrNull(): T? = awaitOne(Mode.FIRST_OR_DEFAULT) /** - * Awaits for the first value from the given observable or call [defaultValue] to get a value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or calls [defaultValue] to get a value if none is emitted, + * without blocking the thread, and returns the resulting value, or, if this observable has produced an error, throws + * the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ -public suspend fun ObservableSource.awaitFirstOrElse(defaultValue: () -> T): T = awaitOne(Mode.FIRST_OR_DEFAULT) ?: defaultValue() +public suspend fun ObservableSource.awaitFirstOrElse(defaultValue: () -> T): T = + awaitOne(Mode.FIRST_OR_DEFAULT) ?: defaultValue() /** - * Awaits for the last value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the last value from the given [Observable] without blocking the thread and + * returns the resulting value, or, if this observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value + * @throws NoSuchElementException if the observable does not emit any value */ public suspend fun ObservableSource.awaitLast(): T = awaitOne(Mode.LAST) /** - * Awaits for the single value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the single value from the given observable without blocking the thread and returns the resulting value, or, + * if this observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value - * @throws IllegalArgumentException if observable emits more than one value + * @throws NoSuchElementException if the observable does not emit any value + * @throws IllegalArgumentException if the observable emits more than one value */ public suspend fun ObservableSource.awaitSingle(): T = awaitOne(Mode.SINGLE) diff --git a/reactive/kotlinx-coroutines-rx2/test/CompletableTest.kt b/reactive/kotlinx-coroutines-rx2/test/CompletableTest.kt index 298b32bf32..16f0005ba1 100644 --- a/reactive/kotlinx-coroutines-rx2/test/CompletableTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/CompletableTest.kt @@ -98,6 +98,31 @@ class CompletableTest : TestBase() { } } + /** Tests that calls to [await] throw [CancellationException] and dispose of the subscription when their [Job] is + * cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val completable = CompletableSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + completable.await() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + @Test fun testSuppressedException() = runTest { val completable = rxCompletable(currentDispatcher()) { @@ -119,7 +144,7 @@ class CompletableTest : TestBase() { } @Test - fun testUnhandledException() = runTest() { + fun testUnhandledException() = runTest { expect(1) var disposable: Disposable? = null val handler = { e: Throwable -> @@ -165,8 +190,7 @@ class CompletableTest : TestBase() { withExceptionHandler(handler) { rxCompletable(Dispatchers.Unconfined) { expect(1) - 42 - }.subscribe({ throw LinkageError() }) + }.subscribe { throw LinkageError() } finish(3) } } diff --git a/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt b/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt index 08427dcf3d..292f6187fa 100644 --- a/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt @@ -7,13 +7,12 @@ package kotlinx.coroutines.rx2 import io.reactivex.* import io.reactivex.disposables.* import io.reactivex.exceptions.* -import io.reactivex.functions.* import io.reactivex.internal.functions.Functions.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* -import java.util.concurrent.CancellationException import kotlin.test.* class MaybeTest : TestBase() { @@ -47,7 +46,7 @@ class MaybeTest : TestBase() { null } expect(2) - maybe.subscribe (emptyConsumer(), ON_ERROR_MISSING, Action { + maybe.subscribe (emptyConsumer(), ON_ERROR_MISSING, { expect(5) }) expect(3) @@ -112,18 +111,45 @@ class MaybeTest : TestBase() { @Test fun testMaybeAwait() = runBlocking { - assertEquals("OK", Maybe.just("O").await() + "K") + assertEquals("OK", Maybe.just("O").awaitSingleOrNull() + "K") + assertEquals("OK", Maybe.just("O").awaitSingle() + "K") } @Test - fun testMaybeAwaitForNull() = runBlocking { - assertNull(Maybe.empty().await()) + fun testMaybeAwaitForNull(): Unit = runBlocking { + assertNull(Maybe.empty().awaitSingleOrNull()) + assertFailsWith { Maybe.empty().awaitSingle() } + } + + /** Tests that calls to [awaitSingleOrNull] throw [CancellationException] and dispose of the subscription when their + * [Job] is cancelled. */ + @Test + fun testMaybeAwaitCancellation() = runTest { + expect(1) + val maybe = MaybeSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + maybe.awaitSingleOrNull() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) } @Test fun testMaybeEmitAndAwait() { val maybe = rxMaybe { - Maybe.just("O").await() + "K" + Maybe.just("O").awaitSingleOrNull() + "K" } checkMaybeValue(maybe) { @@ -205,7 +231,7 @@ class MaybeTest : TestBase() { @Test fun testCancelledConsumer() = runTest { expect(1) - val maybe = rxMaybe(currentDispatcher()) { + val maybe = rxMaybe(currentDispatcher()) { expect(4) try { delay(Long.MAX_VALUE) @@ -241,7 +267,7 @@ class MaybeTest : TestBase() { } } try { - maybe.await() + maybe.awaitSingleOrNull() expectUnreached() } catch (e: TestException) { assertTrue(e.suppressed[0] is TestException2) @@ -301,7 +327,7 @@ class MaybeTest : TestBase() { rxMaybe(Dispatchers.Unconfined) { expect(1) 42 - }.subscribe({ throw LinkageError() }) + }.subscribe { throw LinkageError() } finish(3) } } diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableSingleTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableSingleTest.kt index 4454190f8f..e246407a17 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableSingleTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableSingleTest.kt @@ -5,7 +5,9 @@ package kotlinx.coroutines.rx2 import io.reactivex.* +import io.reactivex.disposables.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* @@ -101,7 +103,7 @@ class ObservableSingleTest : TestBase() { @Test fun testAwaitFirstOrNull() { - val observable = rxObservable { + val observable = rxObservable { send(Observable.empty().awaitFirstOrNull() ?: "OK") } @@ -154,6 +156,32 @@ class ObservableSingleTest : TestBase() { } } + /** Tests that calls to [awaitFirst] (and, thus, the other methods) throw [CancellationException] and dispose of + * the subscription when their [Job] is cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val observable = ObservableSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + observable.awaitFirst() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + + @Test fun testExceptionFromObservable() { val observable = rxObservable { diff --git a/reactive/kotlinx-coroutines-rx2/test/SingleTest.kt b/reactive/kotlinx-coroutines-rx2/test/SingleTest.kt index c66188a183..b359d963b8 100644 --- a/reactive/kotlinx-coroutines-rx2/test/SingleTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/SingleTest.kt @@ -9,6 +9,7 @@ import io.reactivex.disposables.* import io.reactivex.exceptions.* import io.reactivex.functions.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* @@ -98,6 +99,31 @@ class SingleTest : TestBase() { assertEquals("OK", Single.just("O").await() + "K") } + /** Tests that calls to [await] throw [CancellationException] and dispose of the subscription when their + * [Job] is cancelled. */ + @Test + fun testSingleAwaitCancellation() = runTest { + expect(1) + val single = SingleSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + single.await() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + @Test fun testSingleEmitAndAwait() { val single = rxSingle { @@ -221,7 +247,7 @@ class SingleTest : TestBase() { fun testFatalExceptionInSingle() = runTest { rxSingle(Dispatchers.Unconfined) { throw LinkageError() - }.subscribe({ _, e -> assertTrue(e is LinkageError); expect(1) }) + }.subscribe { _, e -> assertTrue(e is LinkageError); expect(1) } finish(2) } diff --git a/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api b/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api index 6d2dd63d2c..f6f3f1d06d 100644 --- a/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api +++ b/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api @@ -8,7 +8,9 @@ public final class kotlinx/coroutines/rx3/RxAwaitKt { public static final fun awaitFirstOrNull (Lio/reactivex/rxjava3/core/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitLast (Lio/reactivex/rxjava3/core/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitOrDefault (Lio/reactivex/rxjava3/core/MaybeSource;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingle (Lio/reactivex/rxjava3/core/MaybeSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun awaitSingle (Lio/reactivex/rxjava3/core/ObservableSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitSingleOrNull (Lio/reactivex/rxjava3/core/MaybeSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class kotlinx/coroutines/rx3/RxChannelKt { diff --git a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt index 8ac0a10ce7..a4435b88e2 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt @@ -15,11 +15,12 @@ import kotlin.coroutines.* // ------------------------ CompletableSource ------------------------ /** - * Awaits for completion of this completable without blocking a thread. - * Returns `Unit` or throws the corresponding exception if this completable had produced error. + * Awaits for completion of this completable without blocking the thread. + * Returns `Unit`, or throws the corresponding exception if this completable produces an error. * * This suspending function is cancellable. If the [Job] of the invoking coroutine is cancelled or completed while this - * suspending function is suspended, this function immediately resumes with [CancellationException]. + * suspending function is suspended, this function immediately resumes with [CancellationException] and disposes of its + * subscription. */ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine { cont -> subscribe(object : CompletableObserver { @@ -31,6 +32,37 @@ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine // ------------------------ MaybeSource ------------------------ +/** + * Awaits for completion of the [MaybeSource] without blocking the thread. + * Returns the resulting value, or `null` if no value is produced, or throws the corresponding exception if this + * [MaybeSource] produces an error. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this + * function immediately resumes with [CancellationException] and disposes of its subscription. + */ +@Suppress("UNCHECKED_CAST") +public suspend fun MaybeSource.awaitSingleOrNull(): T? = suspendCancellableCoroutine { cont -> + subscribe(object : MaybeObserver { + override fun onSubscribe(d: Disposable) { cont.disposeOnCancellation(d) } + override fun onComplete() { cont.resume(null) } + override fun onSuccess(t: T) { cont.resume(t) } + override fun onError(error: Throwable) { cont.resumeWithException(error) } + }) +} + +/** + * Awaits for completion of the [MaybeSource] without blocking the thread. + * Returns the resulting value, or throws if either no value is produced or this [MaybeSource] produces an error. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this + * function immediately resumes with [CancellationException] and disposes of its subscription. + * + * @throws NoSuchElementException if no elements were produced by this [MaybeSource]. + */ +public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: throw NoSuchElementException() + /** * Awaits for completion of the maybe without blocking a thread. * Returns the resulting value, null if no value was produced or throws the corresponding exception if this @@ -39,9 +71,18 @@ public suspend fun CompletableSource.await(): Unit = suspendCancellableCoroutine * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function * immediately resumes with [CancellationException]. + * + * ### Deprecation + * + * Deprecated in favor of [awaitSingleOrNull] in order to reflect that `null` can be returned to denote the absence of + * a value, as opposed to throwing in such case. */ -@Suppress("UNCHECKED_CAST") -public suspend fun MaybeSource.await(): T? = (this as MaybeSource).awaitOrDefault(null) +@Deprecated( + message = "Deprecated in favor of awaitSingleOrNull()", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull()") +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() /** * Awaits for completion of the maybe without blocking a thread. @@ -51,25 +92,28 @@ public suspend fun MaybeSource.await(): T? = (this as MaybeSource).aw * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function * immediately resumes with [CancellationException]. + * + * ### Deprecation + * + * Deprecated in favor of [awaitSingleOrNull] for naming consistency (see the deprecation of [MaybeSource.await] for + * details). */ -public suspend fun MaybeSource.awaitOrDefault(default: T): T = suspendCancellableCoroutine { cont -> - subscribe(object : MaybeObserver { - override fun onSubscribe(d: Disposable) { cont.disposeOnCancellation(d) } - override fun onComplete() { cont.resume(default) } - override fun onSuccess(t: T) { cont.resume(t) } - override fun onError(error: Throwable) { cont.resumeWithException(error) } - }) -} +@Deprecated( + message = "Deprecated in favor of awaitSingleOrNull()", + level = DeprecationLevel.WARNING, + replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") +) // Warning since 1.5, error in 1.6, hidden in 1.7 +public suspend fun MaybeSource.awaitOrDefault(default: T): T = awaitSingleOrNull() ?: default // ------------------------ SingleSource ------------------------ /** - * Awaits for completion of the single value without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this single had produced error. + * Awaits for completion of the single value response without blocking the thread. + * Returns the resulting value, or throws the corresponding exception if this response produces an error. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun SingleSource.await(): T = suspendCancellableCoroutine { cont -> subscribe(object : SingleObserver { @@ -82,69 +126,73 @@ public suspend fun SingleSource.await(): T = suspendCancellableCoroutine // ------------------------ ObservableSource ------------------------ /** - * Awaits for the first value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable] without blocking the thread and returns the resulting value, or, + * if the observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value + * @throws NoSuchElementException if the observable does not emit any value */ public suspend fun ObservableSource.awaitFirst(): T = awaitOne(Mode.FIRST) /** - * Awaits for the first value from the given observable or the [default] value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or returns the [default] value if none is emitted, without + * blocking the thread, and returns the resulting value, or, if this observable has produced an error, throws the + * corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun ObservableSource.awaitFirstOrDefault(default: T): T = awaitOne(Mode.FIRST_OR_DEFAULT, default) /** - * Awaits for the first value from the given observable or `null` value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or returns `null` if none is emitted, without blocking the + * thread, and returns the resulting value, or, if this observable has produced an error, throws the corresponding + * exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ public suspend fun ObservableSource.awaitFirstOrNull(): T? = awaitOne(Mode.FIRST_OR_DEFAULT) /** - * Awaits for the first value from the given observable or call [defaultValue] to get a value if none is emitted without blocking a - * thread and returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the first value from the given [Observable], or calls [defaultValue] to get a value if none is emitted, + * without blocking the thread, and returns the resulting value, or, if this observable has produced an error, throws + * the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. */ -public suspend fun ObservableSource.awaitFirstOrElse(defaultValue: () -> T): T = awaitOne(Mode.FIRST_OR_DEFAULT) ?: defaultValue() +public suspend fun ObservableSource.awaitFirstOrElse(defaultValue: () -> T): T = + awaitOne(Mode.FIRST_OR_DEFAULT) ?: defaultValue() /** - * Awaits for the last value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the last value from the given [Observable] without blocking the thread and + * returns the resulting value, or, if this observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value + * @throws NoSuchElementException if the observable does not emit any value */ public suspend fun ObservableSource.awaitLast(): T = awaitOne(Mode.LAST) /** - * Awaits for the single value from the given observable without blocking a thread. - * Returns the resulting value or throws the corresponding exception if this observable had produced error. + * Awaits the single value from the given observable without blocking the thread and returns the resulting value, or, + * if this observable has produced an error, throws the corresponding exception. * * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. + * If the [Job] of the current coroutine is cancelled or completed while the suspending function is waiting, this + * function immediately disposes of its subscription and resumes with [CancellationException]. * - * @throws NoSuchElementException if observable does not emit any value - * @throws IllegalArgumentException if observable emits more than one value + * @throws NoSuchElementException if the observable does not emit any value + * @throws IllegalArgumentException if the observable emits more than one value */ public suspend fun ObservableSource.awaitSingle(): T = awaitOne(Mode.SINGLE) @@ -218,3 +266,4 @@ private suspend fun ObservableSource.awaitOne( } }) } + diff --git a/reactive/kotlinx-coroutines-rx3/test/CompletableTest.kt b/reactive/kotlinx-coroutines-rx3/test/CompletableTest.kt index e5399d16d1..cfdb6d4170 100644 --- a/reactive/kotlinx-coroutines-rx3/test/CompletableTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/CompletableTest.kt @@ -98,6 +98,31 @@ class CompletableTest : TestBase() { } } + /** Tests that calls to [await] throw [CancellationException] and dispose of the subscription when their [Job] is + * cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val completable = CompletableSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + completable.await() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + @Test fun testSuppressedException() = runTest { val completable = rxCompletable(currentDispatcher()) { @@ -119,7 +144,7 @@ class CompletableTest : TestBase() { } @Test - fun testUnhandledException() = runTest() { + fun testUnhandledException() = runTest { expect(1) var disposable: Disposable? = null val handler = { e: Throwable -> @@ -165,8 +190,7 @@ class CompletableTest : TestBase() { withExceptionHandler(handler) { rxCompletable(Dispatchers.Unconfined) { expect(1) - 42 - }.subscribe({ throw LinkageError() }) + }.subscribe { throw LinkageError() } finish(3) } } diff --git a/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt b/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt index e0cec748f8..bdb5481d80 100644 --- a/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt @@ -7,13 +7,12 @@ package kotlinx.coroutines.rx3 import io.reactivex.rxjava3.core.* import io.reactivex.rxjava3.disposables.* import io.reactivex.rxjava3.exceptions.* -import io.reactivex.rxjava3.functions.* import io.reactivex.rxjava3.internal.functions.Functions.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* -import java.util.concurrent.CancellationException import kotlin.test.* class MaybeTest : TestBase() { @@ -47,7 +46,7 @@ class MaybeTest : TestBase() { null } expect(2) - maybe.subscribe (emptyConsumer(), ON_ERROR_MISSING, Action { + maybe.subscribe (emptyConsumer(), ON_ERROR_MISSING, { expect(5) }) expect(3) @@ -112,18 +111,45 @@ class MaybeTest : TestBase() { @Test fun testMaybeAwait() = runBlocking { - assertEquals("OK", Maybe.just("O").await() + "K") + assertEquals("OK", Maybe.just("O").awaitSingleOrNull() + "K") + assertEquals("OK", Maybe.just("O").awaitSingle() + "K") } @Test - fun testMaybeAwaitForNull() = runBlocking { - assertNull(Maybe.empty().await()) + fun testMaybeAwaitForNull(): Unit = runBlocking { + assertNull(Maybe.empty().awaitSingleOrNull()) + assertFailsWith { Maybe.empty().awaitSingle() } + } + + /** Tests that calls to [awaitSingleOrNull] throw [CancellationException] and dispose of the subscription when their + * [Job] is cancelled. */ + @Test + fun testMaybeAwaitCancellation() = runTest { + expect(1) + val maybe = MaybeSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + maybe.awaitSingleOrNull() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) } @Test fun testMaybeEmitAndAwait() { val maybe = rxMaybe { - Maybe.just("O").await() + "K" + Maybe.just("O").awaitSingleOrNull() + "K" } checkMaybeValue(maybe) { @@ -205,7 +231,7 @@ class MaybeTest : TestBase() { @Test fun testCancelledConsumer() = runTest { expect(1) - val maybe = rxMaybe(currentDispatcher()) { + val maybe = rxMaybe(currentDispatcher()) { expect(4) try { delay(Long.MAX_VALUE) @@ -241,7 +267,7 @@ class MaybeTest : TestBase() { } } try { - maybe.await() + maybe.awaitSingleOrNull() expectUnreached() } catch (e: TestException) { assertTrue(e.suppressed[0] is TestException2) @@ -301,7 +327,7 @@ class MaybeTest : TestBase() { rxMaybe(Dispatchers.Unconfined) { expect(1) 42 - }.subscribe({ throw LinkageError() }) + }.subscribe { throw LinkageError() } finish(3) } } diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableSingleTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableSingleTest.kt index 2a3ce04638..692f014418 100644 --- a/reactive/kotlinx-coroutines-rx3/test/ObservableSingleTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableSingleTest.kt @@ -5,7 +5,9 @@ package kotlinx.coroutines.rx3 import io.reactivex.rxjava3.core.* +import io.reactivex.rxjava3.disposables.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* @@ -101,7 +103,7 @@ class ObservableSingleTest : TestBase() { @Test fun testAwaitFirstOrNull() { - val observable = rxObservable { + val observable = rxObservable { send(Observable.empty().awaitFirstOrNull() ?: "OK") } @@ -154,6 +156,32 @@ class ObservableSingleTest : TestBase() { } } + /** Tests that calls to [awaitFirst] (and, thus, the other methods) throw [CancellationException] and dispose of + * the subscription when their [Job] is cancelled. */ + @Test + fun testAwaitCancellation() = runTest { + expect(1) + val observable = ObservableSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + observable.awaitFirst() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + + @Test fun testExceptionFromObservable() { val observable = rxObservable { diff --git a/reactive/kotlinx-coroutines-rx3/test/SingleTest.kt b/reactive/kotlinx-coroutines-rx3/test/SingleTest.kt index 46bcaf84dc..3e763aa58c 100644 --- a/reactive/kotlinx-coroutines-rx3/test/SingleTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/SingleTest.kt @@ -9,6 +9,7 @@ import io.reactivex.rxjava3.disposables.* import io.reactivex.rxjava3.exceptions.* import io.reactivex.rxjava3.functions.* import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import org.junit.* import org.junit.Test import java.util.concurrent.* @@ -98,6 +99,31 @@ class SingleTest : TestBase() { assertEquals("OK", Single.just("O").await() + "K") } + /** Tests that calls to [await] throw [CancellationException] and dispose of the subscription when their + * [Job] is cancelled. */ + @Test + fun testSingleAwaitCancellation() = runTest { + expect(1) + val single = SingleSource { s -> + s.onSubscribe(object: Disposable { + override fun dispose() { expect(4) } + override fun isDisposed(): Boolean { expectUnreached(); return false } + }) + } + val job = launch(start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + single.await() + } catch (e: CancellationException) { + expect(5) + throw e + } + } + expect(3) + job.cancelAndJoin() + finish(6) + } + @Test fun testSingleEmitAndAwait() { val single = rxSingle { @@ -221,7 +247,7 @@ class SingleTest : TestBase() { fun testFatalExceptionInSingle() = runTest { rxSingle(Dispatchers.Unconfined) { throw LinkageError() - }.subscribe({ _, e -> assertTrue(e is LinkageError); expect(1) }) + }.subscribe { _, e -> assertTrue(e is LinkageError); expect(1) } finish(2) } From e49cf79679ef742c08588ec572f55289f4474f46 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 14:34:19 +0300 Subject: [PATCH 039/328] Mention benign data-race in getResult (#2663) Addresses #2660 --- .../common/src/CancellableContinuationImpl.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt index c310623c5d..f74155eb8f 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt @@ -260,9 +260,13 @@ internal open class CancellableContinuationImpl( // or we got async cancellation from parent. if (trySuspend()) { /* + * Invariant: parentHandle is `null` *only* for reusable continuations. * We were neither resumed nor cancelled, time to suspend. * But first we have to install parent cancellation handle (if we didn't yet), * so CC could be properly resumed on parent cancellation. + * + * This read has benign data-race with write of 'NonDisposableHandle' + * in 'detachChildIfNotReusable'. */ if (parentHandle == null) { installParentHandle() From b400b027c90675f19b03c08d937b51e518220ca5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 17:42:23 +0300 Subject: [PATCH 040/328] Add debugger-related manifest to root metadata artifact of kotlinx-coroutines-core (#2632) * It fixes IDEA issue that was introduced in coroutines 1.4.3 where we switched to Kotlin 1.4.30 and stopped producing root artifact with JVM classes * It simplifies manual -javaagent specification for end-users who shouldn't even be aware of kotlinx-coroutines-core-jvm.jar Fixes #2619 --- kotlinx-coroutines-core/build.gradle | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index c2a57f9d9e..4ea81d3de3 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -208,8 +208,20 @@ jvmTest { } } -jvmJar { - manifest { +// Setup manifest for kotlinx-coroutines-core-jvm.jar +jvmJar { setupManifest(it) } + +/* + * Setup manifest for kotlinx-coroutines-core.jar + * This is convenient for users that pass -javaagent arg manually and also is a workaround #2619 and KTIJ-5659. + * This manifest contains reference to AgentPremain that belongs to + * kotlinx-coroutines-core-jvm, but our resolving machinery guarantees that + * any JVM project that depends on -core artifact also depends on -core-jvm one. + */ +metadataJar { setupManifest(it) } + +static def setupManifest(Jar jar) { + jar.manifest { attributes "Premain-Class": "kotlinx.coroutines.debug.AgentPremain" attributes "Can-Retransform-Classes": "true" } From 5cd57e7287913dfd32ab0d803f53abbfb56bffcb Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 17:42:44 +0300 Subject: [PATCH 041/328] Add ChannelResult.onClosed (#2665) * Establish clear contract on ChannelResult.isClosed * This method provides a **clear** migration from correct 'offer' usages to 'trySend' --- .../api/kotlinx-coroutines-core.api | 1 + .../common/src/channels/Channel.kt | 36 +++++++++++++++++-- .../test/channels/BasicOperationsTest.kt | 22 +++++++++++- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index fdb70200f4..fa5924fda6 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -635,6 +635,7 @@ public final class kotlinx/coroutines/channels/ChannelKt { public static synthetic fun Channel$default (IILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; public static synthetic fun Channel$default (ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; public static final fun getOrElse-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun onClosed-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun onFailure-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun onSuccess-WpGqRn0 (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; } diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 1812bddfa7..a0dbc6b9b4 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -144,13 +144,22 @@ public interface SendChannel { * oversee such error during code review. * * Its name was not aligned with the rest of the API and tried to mimic Java's queue instead. * + * **NB** Automatic migration provides best-effort for the user experience, but requires removal + * or adjusting of the code that relied on the exception handling. + * The complete replacement has a more verbose form: + * ``` + * channel.trySend(element) + * .onClosed { throw it ?: ClosedSendChannelException("Channel was closed normally") } + * .isSuccess + * ``` + * * See https://github.com/Kotlin/kotlinx.coroutines/issues/974 for more context. */ @Deprecated( level = DeprecationLevel.WARNING, message = "Deprecated in the favour of 'trySend' method", replaceWith = ReplaceWith("trySend(element).isSuccess") - ) // Since 1.5.0 + ) // Warning since 1.5.0 public fun offer(element: E): Boolean { val result = trySend(element) if (result.isSuccess) return true @@ -297,7 +306,7 @@ public interface ReceiveChannel { @Deprecated(level = DeprecationLevel.WARNING, message = "Deprecated in the favour of 'tryReceive'", replaceWith = ReplaceWith("tryReceive().getOrNull()") - ) // Since 1.5.0 + ) // Warning since 1.5.0 public fun poll(): E? { val result = tryReceive() if (result.isSuccess) return result.getOrThrow() @@ -362,6 +371,8 @@ public interface ReceiveChannel { * E.g. when the channel is full, [Channel.trySend] returns failed result, but the channel itself is not in the failed state. * * The closed result represents an operation attempt to a closed channel and also implies that the operation has failed. + * It is guaranteed that if the result is _closed_, then the target channel is either [closed for send][Channel.isClosedForSend] + * or is [closed for receive][Channel.isClosedForReceive] depending on whether the failed operation was sending or receiving. */ @JvmInline public value class ChannelResult @@ -399,12 +410,14 @@ public value class ChannelResult /** * Returns the encapsulated value if this instance represents success or `null` if it represents failed result. */ + @Suppress("UNCHECKED_CAST") public fun getOrNull(): T? = if (holder !is Failed) holder as T else null /** * Returns the encapsulated value if this instance represents success or throws an exception if it is closed or failed. */ public fun getOrThrow(): T { + @Suppress("UNCHECKED_CAST") if (holder !is Failed) return holder as T if (holder is Closed && holder.cause != null) throw holder.cause error("Trying to call 'getOrThrow' on a failed channel result: $holder") @@ -495,6 +508,25 @@ public inline fun ChannelResult.onFailure(action: (exception: Throwable?) return this } +/** + * Performs the given [action] on the encapsulated [Throwable] exception if this instance represents [failure][ChannelResult.isFailure] + * due to channel being [closed][Channel.close]. + * The result of [ChannelResult.exceptionOrNull] is passed to the [action] parameter. + * It is guaranteed that if action is invoked, then the channel is either [closed for send][Channel.isClosedForSend] + * or is [closed for receive][Channel.isClosedForReceive] depending on the failed operation. + * + * Returns the original `ChannelResult` unchanged. + */ +@OptIn(ExperimentalContracts::class) +public inline fun ChannelResult.onClosed(action: (exception: Throwable?) -> Unit): ChannelResult { + contract { + callsInPlace(action, InvocationKind.AT_MOST_ONCE) + } + @Suppress("UNCHECKED_CAST") + if (holder is ChannelResult.Closed) action(exceptionOrNull()) + return this +} + /** * Iterator for [ReceiveChannel]. Instances of this interface are *not thread-safe* and shall not be used * from concurrent coroutines. diff --git a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt index 8962acc3dc..4538f6c680 100644 --- a/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/BasicOperationsTest.kt @@ -14,6 +14,11 @@ class BasicOperationsTest : TestBase() { TestChannelKind.values().forEach { kind -> testSendReceive(kind, 20) } } + @Test + fun testTrySendToFullChannel() = runTest { + TestChannelKind.values().forEach { kind -> testTrySendToFullChannel(kind) } + } + @Test fun testTrySendAfterClose() = runTest { TestChannelKind.values().forEach { kind -> testTrySend(kind) } @@ -118,7 +123,7 @@ class BasicOperationsTest : TestBase() { assertTrue(channel.isClosedForSend) channel.trySend(2) .onSuccess { expectUnreached() } - .onFailure { + .onClosed { assertTrue { it is ClosedSendChannelException} if (!kind.isConflated) { assertEquals(42, channel.receive()) @@ -127,6 +132,21 @@ class BasicOperationsTest : TestBase() { d.await() } + private suspend fun testTrySendToFullChannel(kind: TestChannelKind) = coroutineScope { + if (kind.isConflated || kind.capacity == Int.MAX_VALUE) return@coroutineScope + val channel = kind.create() + // Make it full + repeat(11) { + channel.trySend(42) + } + channel.trySend(1) + .onSuccess { expectUnreached() } + .onFailure { assertNull(it) } + .onClosed { + expectUnreached() + } + } + /** * [ClosedSendChannelException] should not be eaten. * See [https://github.com/Kotlin/kotlinx.coroutines/issues/957] From 40f79ff8b96015e0d0365b69fe686d6558db4a28 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 17:44:06 +0300 Subject: [PATCH 042/328] Introduce Flow.last and Flow.lastOrNull operators (#2662) Fixes #2246 --- .../api/kotlinx-coroutines-core.api | 2 + .../common/src/flow/terminal/Reduce.kt | 25 +++++++++++ .../common/test/flow/terminal/LastTest.kt | 45 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 kotlinx-coroutines-core/common/test/flow/terminal/LastTest.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index fa5924fda6..ec161ce28e 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -965,6 +965,8 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun fold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun forEach (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V public static final fun getDEFAULT_CONCURRENCY ()I + public static final fun last (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun lastOrNull (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun launchIn (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; public static final fun map (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; public static final fun mapLatest (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; diff --git a/kotlinx-coroutines-core/common/src/flow/terminal/Reduce.kt b/kotlinx-coroutines-core/common/src/flow/terminal/Reduce.kt index a937adcc8a..1794c9f41c 100644 --- a/kotlinx-coroutines-core/common/src/flow/terminal/Reduce.kt +++ b/kotlinx-coroutines-core/common/src/flow/terminal/Reduce.kt @@ -144,3 +144,28 @@ public suspend fun Flow.firstOrNull(predicate: suspend (T) -> Boolean): T } return result } + +/** + * The terminal operator that returns the last element emitted by the flow. + * + * Throws [NoSuchElementException] if the flow was empty. + */ +public suspend fun Flow.last(): T { + var result: Any? = NULL + collect { + result = it + } + if (result === NULL) throw NoSuchElementException("Expected at least one element") + return result as T +} + +/** + * The terminal operator that returns the last element emitted by the flow or `null` if the flow was empty. + */ +public suspend fun Flow.lastOrNull(): T? { + var result: T? = null + collect { + result = it + } + return result +} diff --git a/kotlinx-coroutines-core/common/test/flow/terminal/LastTest.kt b/kotlinx-coroutines-core/common/test/flow/terminal/LastTest.kt new file mode 100644 index 0000000000..e7699ccc65 --- /dev/null +++ b/kotlinx-coroutines-core/common/test/flow/terminal/LastTest.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import kotlin.test.* + +class LastTest : TestBase() { + @Test + fun testLast() = runTest { + val flow = flowOf(1, 2, 3) + assertEquals(3, flow.last()) + assertEquals(3, flow.lastOrNull()) + } + + @Test + fun testNulls() = runTest { + val flow = flowOf(1, null) + assertNull(flow.last()) + assertNull(flow.lastOrNull()) + } + + @Test + fun testNullsLastOrNull() = runTest { + val flow = flowOf(null, 1) + assertEquals(1, flow.lastOrNull()) + } + + @Test + fun testEmptyFlow() = runTest { + assertFailsWith { emptyFlow().last() } + assertNull(emptyFlow().lastOrNull()) + } + + @Test + fun testBadClass() = runTest { + val instance = BadClass() + val flow = flowOf(instance) + assertSame(instance, flow.last()) + assertSame(instance, flow.lastOrNull()) + + } +} From 99b475829f97fc98d81fbbec9ed9788cc05a0031 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 18:17:35 +0300 Subject: [PATCH 043/328] Test invariant that IDEA evaluator depends on (#2525) Fixes #2522 --- ...jIdeaDebuggerEvaluatorCompatibilityTest.kt | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 kotlinx-coroutines-core/jvm/test/IntellijIdeaDebuggerEvaluatorCompatibilityTest.kt diff --git a/kotlinx-coroutines-core/jvm/test/IntellijIdeaDebuggerEvaluatorCompatibilityTest.kt b/kotlinx-coroutines-core/jvm/test/IntellijIdeaDebuggerEvaluatorCompatibilityTest.kt new file mode 100644 index 0000000000..6bbfdd1b4b --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/IntellijIdeaDebuggerEvaluatorCompatibilityTest.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import org.junit.Test +import kotlin.coroutines.* +import kotlin.test.* + +class IntellijIdeaDebuggerEvaluatorCompatibilityTest { + + /* + * This test verifies that our CoroutineScope is accessible to IDEA debugger. + * + * Consider the following scenario: + * ``` + * runBlocking { // this: CoroutineScope + * println("runBlocking") + * } + * ``` + * user puts breakpoint to `println` line, opens "Evaluate" window + * and executes `launch { println("launch") }`. They (obviously) expect it to work, but + * it won't: `{}` in `runBlocking` is `SuspendLambda` and `this` is an unused implicit receiver + * that is removed by the compiler (because it's unused). + * + * But we still want to provide consistent user experience for functions with `CoroutineScope` receiver, + * for that IDEA debugger tries to retrieve the scope via `kotlin.coroutines.coroutineContext[Job] as? CoroutineScope` + * and with this test we're fixing this behaviour. + * + * Note that this behaviour is not carved in stone: IDEA fallbacks to `kotlin.coroutines.coroutineContext` for the context if necessary. + */ + + @Test + fun testScopeIsAccessible() = runBlocking { + verify() + + withContext(Job()) { + verify() + } + + coroutineScope { + verify() + } + + supervisorScope { + verify() + } + + } + + private suspend fun verify() { + val ctx = coroutineContext + assertTrue { ctx.job is CoroutineScope } + } +} From f19ae191be2b3afd4569279049d34de38e605be3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 18:18:18 +0300 Subject: [PATCH 044/328] Post-release cleanup (#2562) * Properly handle files with spaces in deploy.sh * Update version shield * Changelog typos --- CHANGES.md | 3 +-- README.md | 2 +- RELEASE.md | 2 +- gradle.properties | 2 +- site/deploy.sh | 7 ++++++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b4c2a7bdd6..089b1991b3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,12 +20,11 @@ * Fixed the problem that prevented implementation via delegation for `Job` interface (#2423) * Fixed incorrect ProGuard rules that allowed shrinking volatile felds (#1564) -* Fixed `await/`asDeferred` for `MinimalState` implementations in jdk8 module (#2456) +* Fixed `await`/`asDeferred` for `MinimalStage` implementations in jdk8 module (#2456) * Fixed bug when `onUndeliveredElement` wasn't called for unlimited channels (#2435) * Fixed a bug when `ListenableFuture.isCancelled` returned from `asListenableFuture` could have thrown an exception, thanks to @vadimsemenov (#2421) * Coroutine in `callbackFlow` and `produce` is properly cancelled when the channel was closed separately (#2506) - ## Version 1.4.2 * Fixed `StackOverflowError` in `Job.toString` when `Job` is observed in its intermediate state (#2371). diff --git a/README.md b/README.md index ff6c545341..506d181fd5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://api.bintray.com/packages/kotlin/kotlinx/kotlinx.coroutines/images/download.svg?version=1.4.3) ](https://bintray.com/kotlin/kotlinx/kotlinx.coroutines/1.4.3) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.4.30-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) diff --git a/RELEASE.md b/RELEASE.md index c9fd83fb8e..edc7726a0a 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -34,7 +34,7 @@ To release new `` of `kotlinx-coroutines`: 7. Commit updated files to a new version branch:
`git commit -a -m "Version "` -8. Push new version into the branch:
+8. Push the new version into the branch:
`git push -u origin version-` 9. Create Pull-Request on GitHub from `version-` branch into `master`: diff --git a/gradle.properties b/gradle.properties index 40b1596105..db1a782ba9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -55,7 +55,7 @@ jekyll_version=4.0 org.gradle.jvmargs=-Xmx2g # Workaround for Bintray treating .sha512 files as artifacts -# https://github.com/gradle/gradle/issues/1.4.3 +# https://github.com/gradle/gradle/issues/11412 systemProp.org.gradle.internal.publish.checksums.insecure=true # todo:KLUDGE: This is commented out, and the property is set conditionally in build.gradle, because IDEA doesn't work with it. diff --git a/site/deploy.sh b/site/deploy.sh index de7cdef281..fd510aae0b 100755 --- a/site/deploy.sh +++ b/site/deploy.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# +# Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. +# + # Abort on first error set -e @@ -47,7 +51,8 @@ git rm `find . -type f -not -name '*.html' -not -name '.git'` > /dev/null echo "Redirecting experimental pages" git_add=() git_rm=() -for file in `find . -type f -name '*.html'` ; do +`find . -type f -name '*.html'` | while read file +do match=nothing_is_found if [[ $file =~ \.experimental ]] ; then match="${file//\.experimental/}" From 44ebdef31eebc47544b447cfcecef0137575f0a1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 21 Apr 2021 19:01:28 +0300 Subject: [PATCH 045/328] Use cancellation exception from standard library in Kotlin/JS and K/N (#2638) * On JVM it uses java.util.concurrent.CancellationException, same as stdlib declaration * Fully backwards compatible for JVM, Native-friendly for Obj-C interop --- .../common/test/flow/internal/FlowScopeTest.kt | 4 ++-- kotlinx-coroutines-core/js/src/Exceptions.kt | 7 +------ kotlinx-coroutines-core/native/src/Exceptions.kt | 7 +------ 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/flow/internal/FlowScopeTest.kt b/kotlinx-coroutines-core/common/test/flow/internal/FlowScopeTest.kt index d41ab8893f..e866647930 100644 --- a/kotlinx-coroutines-core/common/test/flow/internal/FlowScopeTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/internal/FlowScopeTest.kt @@ -68,10 +68,10 @@ class FlowScopeTest : TestBase() { flowScope { flowScope { launch { - throw CancellationException(null) + throw CancellationException("") } } } } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/js/src/Exceptions.kt b/kotlinx-coroutines-core/js/src/Exceptions.kt index 7c76bc6d2c..da9979b603 100644 --- a/kotlinx-coroutines-core/js/src/Exceptions.kt +++ b/kotlinx-coroutines-core/js/src/Exceptions.kt @@ -10,12 +10,7 @@ package kotlinx.coroutines * **It is not printed to console/log by default uncaught exception handler**. * (see [CoroutineExceptionHandler]). */ -public actual open class CancellationException( - message: String?, - cause: Throwable? -) : IllegalStateException(message, cause) { - public actual constructor(message: String?) : this(message, null) -} +public actual typealias CancellationException = kotlin.coroutines.cancellation.CancellationException /** * Thrown by cancellable suspending functions if the [Job] of the coroutine is cancelled or completed diff --git a/kotlinx-coroutines-core/native/src/Exceptions.kt b/kotlinx-coroutines-core/native/src/Exceptions.kt index 7c76bc6d2c..da9979b603 100644 --- a/kotlinx-coroutines-core/native/src/Exceptions.kt +++ b/kotlinx-coroutines-core/native/src/Exceptions.kt @@ -10,12 +10,7 @@ package kotlinx.coroutines * **It is not printed to console/log by default uncaught exception handler**. * (see [CoroutineExceptionHandler]). */ -public actual open class CancellationException( - message: String?, - cause: Throwable? -) : IllegalStateException(message, cause) { - public actual constructor(message: String?) : this(message, null) -} +public actual typealias CancellationException = kotlin.coroutines.cancellation.CancellationException /** * Thrown by cancellable suspending functions if the [Job] of the coroutine is cancelled or completed From 347feedb9900a665db634dd09d929d15a1569c2d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 22 Apr 2021 12:58:39 +0300 Subject: [PATCH 046/328] Remove dev repositories and Bintray usages where applicable (#2587) * Remove dev repositories and Bintray usages where applicable * Update our frontend example * Update lincheck * Temporary ignore MutexLincheckTest.modelCheckingTest --- README.md | 4 ---- build.gradle | 17 +++-------------- buildSrc/build.gradle.kts | 1 + buildSrc/src/main/kotlin/Publishing.kt | 14 -------------- gradle.properties | 10 ++-------- .../{publish-bintray.gradle => publish.gradle} | 14 +++----------- js/example-frontend-js/build.gradle.kts | 5 +++++ .../jvm/test/AbstractLincheckTest.kt | 6 +++--- .../jvm/test/lincheck/MutexLincheckTest.kt | 9 +++++++-- 9 files changed, 24 insertions(+), 56 deletions(-) rename gradle/{publish-bintray.gradle => publish.gradle} (84%) diff --git a/README.md b/README.md index 08417dd0f5..a961e44876 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,6 @@ suspend fun main() = coroutineScope { ## Using in your projects -The libraries are published to [kotlinx](https://bintray.com/kotlin/kotlinx/kotlinx.coroutines) bintray repository, -linked to [JCenter](https://bintray.com/bintray/jcenter?filterByPkgName=kotlinx.coroutines) and -pushed to [Maven Central](https://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.jetbrains.kotlinx%20a%3Akotlinx-coroutines*). - ### Maven Add dependencies (you can also add other modules that you need): diff --git a/build.gradle b/build.gradle index 08d07782a7..fc52d8cc53 100644 --- a/build.gradle +++ b/build.gradle @@ -53,16 +53,8 @@ buildscript { } repositories { - maven {url "https://kotlin.bintray.com/kotlinx"} - // Future replacement for kotlin-dev, with cache redirector - maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } - maven { - url "https://kotlin.bintray.com/kotlin-dev" - credentials { - username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: "" - password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: "" - } - } + // Leftover until we migrated to Dokka 1.4.30 + maven { url "https://kotlin.bintray.com/kotlin-dev" } maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" } maven { url "https://plugins.gradle.org/m2/" } maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } @@ -151,9 +143,6 @@ allprojects { */ google() mavenCentral() - // Future replacement for kotlin-dev, with cache redirector - maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } - maven { url "https://kotlin.bintray.com/kotlinx" } } } @@ -244,7 +233,7 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { if (it.name != 'kotlinx-coroutines-bom') { apply from: rootProject.file('gradle/dokka.gradle') } - apply from: rootProject.file('gradle/publish-bintray.gradle') + apply from: rootProject.file('gradle/publish.gradle') } configure(subprojects.findAll { !unpublished.contains(it.name) }) { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c763d424fd..80214522b8 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -17,6 +17,7 @@ repositories { maven("https://cache-redirector.jetbrains.com/dl.bintray.com/kotlin/kotlin-dev") } else { maven("https://plugins.gradle.org/m2") + // Leftover until we migrated to Dokka 1.4.30 maven("https://dl.bintray.com/kotlin/kotlin-dev") } maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") diff --git a/buildSrc/src/main/kotlin/Publishing.kt b/buildSrc/src/main/kotlin/Publishing.kt index 5b191bfa38..e0124cd966 100644 --- a/buildSrc/src/main/kotlin/Publishing.kt +++ b/buildSrc/src/main/kotlin/Publishing.kt @@ -62,20 +62,6 @@ fun configureMavenPublication(rh: RepositoryHandler, project: Project) { } } -fun configureBintrayPublication(rh: RepositoryHandler, project: Project) { - rh.maven { - val user = "kotlin" - val repo = "kotlinx" - val name = "kotlinx.coroutines" - url = URI("https://api.bintray.com/maven/$user/$repo/$name/;publish=0;override=0") - - credentials { - username = project.findProperty("bintrayUser") as? String ?: System.getenv("BINTRAY_USER") - password = project.findProperty("bintrayApiKey") as? String ?: System.getenv("BINTRAY_API_KEY") - } - } -} - fun signPublicationIfKeyPresent(project: Project, publication: MavenPublication) { val keyId = project.getSensitiveProperty("libs.sign.key.id") val signingKey = project.getSensitiveProperty("libs.sign.key.private") diff --git a/gradle.properties b/gradle.properties index a27edd12f4..97c6af986f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,8 @@ kotlin_version=1.5.0-RC junit_version=4.12 atomicfu_version=0.15.2 knit_version=0.2.3 -html_version=0.6.8 -lincheck_version=2.10 +html_version=0.7.2 +lincheck_version=2.12 dokka_version=0.9.16-rdev-2-mpp-hacks byte_buddy_version=1.10.9 reactor_version=3.4.1 @@ -54,10 +54,4 @@ jekyll_version=4.0 # TODO: Remove once KT-37187 is fixed org.gradle.jvmargs=-Xmx2g -# Workaround for Bintray treating .sha512 files as artifacts -# https://github.com/gradle/gradle/issues/1.4.3 -systemProp.org.gradle.internal.publish.checksums.insecure=true - -# todo:KLUDGE: This is commented out, and the property is set conditionally in build.gradle, because IDEA doesn't work with it. -#kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.mpp.enableCompatibilityMetadataVariant=true diff --git a/gradle/publish-bintray.gradle b/gradle/publish.gradle similarity index 84% rename from gradle/publish-bintray.gradle rename to gradle/publish.gradle index e6f0423451..3a0a4224ab 100644 --- a/gradle/publish-bintray.gradle +++ b/gradle/publish.gradle @@ -4,7 +4,7 @@ import org.gradle.util.VersionNumber -// Configures publishing of Maven artifacts to Bintray +// Configures publishing of Maven artifacts to Maven Central apply plugin: 'maven' apply plugin: 'maven-publish' @@ -37,12 +37,7 @@ if (!isMultiplatform && !isBom) { publishing { repositories { - def bintrayUpload = System.getenv("libs.bintray.upload") != null - if (bintrayUpload) { - PublishingKt.configureBintrayPublication(delegate, project) - } else { - PublishingKt.configureMavenPublication(delegate, project) - } + PublishingKt.configureMavenPublication(delegate, project) } if (!isMultiplatform && !isBom) { @@ -61,10 +56,7 @@ publishing { publications.all { PublishingKt.configureMavenCentralMetadata(pom, project) - def bintrayUpload = System.getenv("libs.bintray.upload") != null - if (!bintrayUpload) { - PublishingKt.signPublicationIfKeyPresent(project, it) - } + PublishingKt.signPublicationIfKeyPresent(project, it) // add empty javadocs if (!isBom && it.name != "kotlinMultiplatform") { it.artifact(javadocJar) diff --git a/js/example-frontend-js/build.gradle.kts b/js/example-frontend-js/build.gradle.kts index e5e7a3e2a5..a78ac3dc6d 100644 --- a/js/example-frontend-js/build.gradle.kts +++ b/js/example-frontend-js/build.gradle.kts @@ -21,6 +21,11 @@ kotlin { } } +// For kotlinx-html +repositories { + maven("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven") +} + dependencies { implementation("org.jetbrains.kotlinx:kotlinx-html-js:${version("html")}") implementation(devNpm("html-webpack-plugin", "5.3.1")) diff --git a/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt index 5ba7acf994..2b4e91c02a 100644 --- a/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -15,7 +15,7 @@ abstract class AbstractLincheckTest : VerifierState() { open fun StressOptions.customize(isStressTest: Boolean): StressOptions = this @Test - fun modelCheckingTest() = ModelCheckingOptions() + open fun modelCheckingTest() = ModelCheckingOptions() .iterations(if (isStressTest) 100 else 20) .invocationsPerIteration(if (isStressTest) 10_000 else 1_000) .commonConfiguration() @@ -38,4 +38,4 @@ abstract class AbstractLincheckTest : VerifierState() { .customize(isStressTest) override fun extractState(): Any = error("Not implemented") -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt index 6e350660ae..f7f59eef5e 100644 --- a/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:Suppress("unused") package kotlinx.coroutines.lincheck @@ -9,10 +9,15 @@ import kotlinx.coroutines.sync.* import org.jetbrains.kotlinx.lincheck.* import org.jetbrains.kotlinx.lincheck.annotations.Operation import org.jetbrains.kotlinx.lincheck.strategy.managed.modelchecking.* +import org.junit.* class MutexLincheckTest : AbstractLincheckTest() { private val mutex = Mutex() + override fun modelCheckingTest() { + // Ignored via empty body as the only way + } + @Operation fun tryLock() = mutex.tryLock() @@ -29,4 +34,4 @@ class MutexLincheckTest : AbstractLincheckTest() { checkObstructionFreedom() override fun extractState() = mutex.isLocked -} \ No newline at end of file +} From 835ee18fb5229f49f31ca4b1a6bcf03141360202 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 22 Apr 2021 14:39:51 +0300 Subject: [PATCH 047/328] Add a way to construct ReactorContext from ContextView (#2622) Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/2575 --- .../api/kotlinx-coroutines-reactor.api | 4 +- .../kotlinx-coroutines-reactor/src/Convert.kt | 4 +- .../kotlinx-coroutines-reactor/src/Flux.kt | 46 +++++++++++++------ .../kotlinx-coroutines-reactor/src/Mono.kt | 2 +- .../src/ReactorContext.kt | 40 ++++++++++++---- 5 files changed, 68 insertions(+), 28 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api index 0a10aa12a9..b69bb334d7 100644 --- a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api +++ b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api @@ -33,6 +33,7 @@ public final class kotlinx/coroutines/reactor/MonoKt { public final class kotlinx/coroutines/reactor/ReactorContext : kotlin/coroutines/AbstractCoroutineContextElement { public static final field Key Lkotlinx/coroutines/reactor/ReactorContext$Key; public fun (Lreactor/util/context/Context;)V + public fun (Lreactor/util/context/ContextView;)V public final fun getContext ()Lreactor/util/context/Context; } @@ -40,7 +41,8 @@ public final class kotlinx/coroutines/reactor/ReactorContext$Key : kotlin/corout } public final class kotlinx/coroutines/reactor/ReactorContextKt { - public static final fun asCoroutineContext (Lreactor/util/context/Context;)Lkotlinx/coroutines/reactor/ReactorContext; + public static final synthetic fun asCoroutineContext (Lreactor/util/context/Context;)Lkotlinx/coroutines/reactor/ReactorContext; + public static final fun asCoroutineContext (Lreactor/util/context/ContextView;)Lkotlinx/coroutines/reactor/ReactorContext; } public final class kotlinx/coroutines/reactor/ReactorFlowKt { diff --git a/reactive/kotlinx-coroutines-reactor/src/Convert.kt b/reactive/kotlinx-coroutines-reactor/src/Convert.kt index 3b08bd6639..002baa6185 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Convert.kt @@ -41,8 +41,8 @@ public fun Deferred.asMono(context: CoroutineContext): Mono = mono(co /** * Converts a stream of elements received from the channel to the hot reactive flux. * - * Every subscriber receives values from this channel in **fan-out** fashion. If the are multiple subscribers, - * they'll receive values in round-robin way. + * Every subscriber receives values from this channel in a **fan-out** fashion. If the are multiple subscribers, + * they'll receive values in a round-robin way. * @param context -- the coroutine context from which the resulting flux is going to be signalled */ @Deprecated(message = "Deprecated in the favour of consumeAsFlow()", diff --git a/reactive/kotlinx-coroutines-reactor/src/Flux.kt b/reactive/kotlinx-coroutines-reactor/src/Flux.kt index 806f5bd5bc..df5f64f262 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Flux.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Flux.kt @@ -14,20 +14,20 @@ import reactor.util.context.* import kotlin.coroutines.* /** - * Creates cold reactive [Flux] that runs a given [block] in a coroutine. + * Creates a cold reactive [Flux] that runs the given [block] in a coroutine. * Every time the returned flux is subscribed, it starts a new coroutine in the specified [context]. - * Coroutine emits ([Subscriber.onNext]) values with `send`, completes ([Subscriber.onComplete]) - * when the coroutine completes or channel is explicitly closed and emits error ([Subscriber.onError]) - * if coroutine throws an exception or closes channel with a cause. - * Unsubscribing cancels running coroutine. + * The coroutine emits ([Subscriber.onNext]) values with [send][ProducerScope.send], completes ([Subscriber.onComplete]) + * when the coroutine completes, or, in case the coroutine throws an exception or the channel is closed, + * emits the error ([Subscriber.onError]) and closes the channel with the cause. + * Unsubscribing cancels the running coroutine. * - * Invocations of `send` are suspended appropriately when subscribers apply back-pressure and to ensure that - * `onNext` is not invoked concurrently. - * - * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. + * Invocations of [send][ProducerScope.send] are suspended appropriately when subscribers apply back-pressure and to + * ensure that [onNext][Subscriber.onNext] is not invoked concurrently. * * **Note: This is an experimental api.** Behaviour of publishers that work as children in a parent scope with respect * to cancellation and error handling may change in the future. + * + * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ @ExperimentalCoroutinesApi public fun flux( @@ -43,12 +43,13 @@ private fun reactorPublish( scope: CoroutineScope, context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit -): Publisher = Publisher { subscriber -> - // specification requires NPE on null subscriber - if (subscriber == null) throw NullPointerException("Subscriber cannot be null") - require(subscriber is CoreSubscriber) { "Subscriber is not an instance of CoreSubscriber, context can not be extracted." } +): Publisher = Publisher onSubscribe@{ subscriber: Subscriber? -> + if (subscriber !is CoreSubscriber) { + subscriber.reject(IllegalArgumentException("Subscriber is not an instance of CoreSubscriber, context can not be extracted.")) + return@onSubscribe + } val currentContext = subscriber.currentContext() - val reactorContext = (context[ReactorContext]?.context?.putAll(currentContext) ?: currentContext).asCoroutineContext() + val reactorContext = context.extendReactorContext(currentContext) val newContext = scope.newCoroutineContext(context + reactorContext) val coroutine = PublisherCoroutine(newContext, subscriber, REACTOR_HANDLER) subscriber.onSubscribe(coroutine) // do it first (before starting coroutine), to avoid unnecessary suspensions @@ -66,6 +67,23 @@ private val REACTOR_HANDLER: (Throwable, CoroutineContext) -> Unit = { cause, ct } } +/** The proper way to reject the subscriber, according to + * [the reactive spec](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#1.9) + */ +private fun Subscriber?.reject(t: Throwable) { + if (this == null) + throw NullPointerException("The subscriber can not be null") + onSubscribe(object: Subscription { + override fun request(n: Long) { + // intentionally left blank + } + override fun cancel() { + // intentionally left blank + } + }) + onError(t) +} + @Deprecated( message = "CoroutineScope.flux is deprecated in favour of top-level flux", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 6a4a38f379..67c1baa02d 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -83,7 +83,7 @@ private fun monoInternal( context: CoroutineContext, block: suspend CoroutineScope.() -> T? ): Mono = Mono.create { sink -> - val reactorContext = (context[ReactorContext]?.context?.putAll(sink.currentContext()) ?: sink.currentContext()).asCoroutineContext() + val reactorContext = context.extendReactorContext(sink.currentContext()) val newContext = scope.newCoroutineContext(context + reactorContext) val coroutine = MonoCoroutine(newContext, sink) sink.onDispose(coroutine) diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index 333f056d97..8969662adc 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -5,19 +5,21 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.ExperimentalCoroutinesApi -import reactor.util.context.Context import kotlin.coroutines.* import kotlinx.coroutines.reactive.* +import reactor.util.context.* /** - * Wraps Reactor's [Context] into [CoroutineContext] element for seamless integration Reactor and kotlinx.coroutines. - * [Context.asCoroutineContext] is defined to add Reactor's [Context] elements as part of [CoroutineContext]. - * Coroutine context element that propagates information about Reactor's [Context] through coroutines. + * Wraps Reactor's [Context] into a [CoroutineContext] element for seamless integration between + * Reactor and kotlinx.coroutines. + * [Context.asCoroutineContext] puts Reactor's [Context] elements into a [CoroutineContext], + * which can be used to propagate the information about Reactor's [Context] through coroutines. * - * This context element is implicitly propagated through subscriber's context by all Reactive integrations, such as [mono], [flux], - * [Publisher.asFlow][asFlow], [Flow.asPublisher][asPublisher] and [Flow.asFlux][asFlux]. - * Functions that subscribe to the reactive stream (e.g. [Publisher.awaitFirst][kotlinx.coroutines.reactive.awaitFirst]) - * also propagate the [ReactorContext] to the subscriber's [Context]. + * This context element is implicitly propagated through subscribers' context by all Reactive integrations, + * such as [mono], [flux], [Publisher.asFlow][asFlow], [Flow.asPublisher][asPublisher] and [Flow.asFlux][asFlux]. + * Functions that subscribe to a reactive stream + * (e.g. [Publisher.awaitFirst][kotlinx.coroutines.reactive.awaitFirst]), too, propagate [ReactorContext] + * to the subscriber's [Context]. ** * ### Examples of Reactive context integration. * @@ -49,12 +51,30 @@ import kotlinx.coroutines.reactive.* */ @ExperimentalCoroutinesApi public class ReactorContext(public val context: Context) : AbstractCoroutineContextElement(ReactorContext) { + + // `Context.of` is zero-cost if the argument is a `Context` + public constructor(contextView: ContextView): this(Context.of(contextView)) + public companion object Key : CoroutineContext.Key } /** - * Wraps the given [Context] into [ReactorContext], so it can be added to coroutine's context + * Wraps the given [ContextView] into [ReactorContext], so it can be added to the coroutine's context + * and later used via `coroutineContext[ReactorContext]`. + */ +@ExperimentalCoroutinesApi +public fun ContextView.asCoroutineContext(): ReactorContext = ReactorContext(this) + +/** + * Wraps the given [Context] into [ReactorContext], so it can be added to the coroutine's context * and later used via `coroutineContext[ReactorContext]`. */ @ExperimentalCoroutinesApi -public fun Context.asCoroutineContext(): ReactorContext = ReactorContext(this) +@Deprecated("The more general version for ContextView should be used instead", level = DeprecationLevel.HIDDEN) +public fun Context.asCoroutineContext(): ReactorContext = readOnly().asCoroutineContext() // `readOnly()` is zero-cost. + +/** + * Updates the Reactor context in this [CoroutineContext], adding (or possibly replacing) some values. + */ +internal fun CoroutineContext.extendReactorContext(extensions: ContextView): CoroutineContext = + (this[ReactorContext]?.context?.putAll(extensions) ?: extensions).asCoroutineContext() \ No newline at end of file From 05d30189b4ff68fb702b711d31f46ade711f9abd Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 22 Apr 2021 14:41:48 +0300 Subject: [PATCH 048/328] Fixes for the reactive integrations (#2617) Reworked the comments, added new tests. Fixed a bug where `Maybe.collect()` would hang on success. --- .../kotlinx-coroutines-jdk9/src/Publish.kt | 29 ++-- .../src/ReactiveFlow.kt | 36 +++-- .../test/PublisherCollectTest.kt | 146 ++++++++++++++++++ .../src/Channel.kt | 14 +- .../src/Publish.kt | 21 +-- .../src/ReactiveFlow.kt | 20 +-- .../test/PublisherCollectTest.kt | 144 +++++++++++++++++ .../kotlinx-coroutines-rx2/src/RxChannel.kt | 12 +- .../kotlinx-coroutines-rx2/test/MaybeTest.kt | 50 ++++++ .../test/ObservableCollectTest.kt | 69 +++++++++ .../kotlinx-coroutines-rx3/src/RxChannel.kt | 12 +- .../kotlinx-coroutines-rx3/test/MaybeTest.kt | 52 ++++++- .../test/ObservableCollectTest.kt | 68 ++++++++ 13 files changed, 610 insertions(+), 63 deletions(-) create mode 100644 reactive/kotlinx-coroutines-jdk9/test/PublisherCollectTest.kt create mode 100644 reactive/kotlinx-coroutines-reactive/test/PublisherCollectTest.kt create mode 100644 reactive/kotlinx-coroutines-rx2/test/ObservableCollectTest.kt create mode 100644 reactive/kotlinx-coroutines-rx3/test/ObservableCollectTest.kt diff --git a/reactive/kotlinx-coroutines-jdk9/src/Publish.kt b/reactive/kotlinx-coroutines-jdk9/src/Publish.kt index 3db0d5da4c..cfd18d2b7a 100644 --- a/reactive/kotlinx-coroutines-jdk9/src/Publish.kt +++ b/reactive/kotlinx-coroutines-jdk9/src/Publish.kt @@ -6,33 +6,34 @@ package kotlinx.coroutines.jdk9 import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +import kotlinx.coroutines.reactive.* import java.util.concurrent.* import kotlin.coroutines.* import org.reactivestreams.FlowAdapters /** - * Creates cold reactive [Flow.Publisher] that runs a given [block] in a coroutine. + * Creates a cold reactive [Flow.Publisher] that runs a given [block] in a coroutine. + * * Every time the returned flux is subscribed, it starts a new coroutine in the specified [context]. - * Coroutine emits ([Subscriber.onNext]) values with `send`, completes ([Subscriber.onComplete]) - * when the coroutine completes or channel is explicitly closed and emits error ([Subscriber.onError]) - * if coroutine throws an exception or closes channel with a cause. - * Unsubscribing cancels running coroutine. + * The coroutine emits (via [Flow.Subscriber.onNext]) values with [send][ProducerScope.send], + * completes (via [Flow.Subscriber.onComplete]) when the coroutine completes or channel is explicitly closed, and emits + * errors (via [Flow.Subscriber.onError]) if the coroutine throws an exception or closes channel with a cause. + * Unsubscribing cancels the running coroutine. * - * Invocations of `send` are suspended appropriately when subscribers apply back-pressure and to ensure that - * `onNext` is not invoked concurrently. + * Invocations of [send][ProducerScope.send] are suspended appropriately when subscribers apply back-pressure and to + * ensure that [onNext][Flow.Subscriber.onNext] is not invoked concurrently. * * Coroutine context can be specified with [context] argument. - * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is used. - * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. + * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is + * used. * * **Note: This is an experimental api.** Behaviour of publishers that work as children in a parent scope with respect * to cancellation and error handling may change in the future. + * + * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi // Since 1.3.x +@ExperimentalCoroutinesApi public fun flowPublish( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit -): Flow.Publisher { - val reactivePublisher : org.reactivestreams.Publisher = kotlinx.coroutines.reactive.publish(context, block) - return FlowAdapters.toFlowPublisher(reactivePublisher) -} +): Flow.Publisher = FlowAdapters.toFlowPublisher(publish(context, block)) diff --git a/reactive/kotlinx-coroutines-jdk9/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-jdk9/src/ReactiveFlow.kt index d3942a1629..6031e0a8ad 100644 --- a/reactive/kotlinx-coroutines-jdk9/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-jdk9/src/ReactiveFlow.kt @@ -7,41 +7,43 @@ package kotlinx.coroutines.jdk9 import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlinx.coroutines.reactive.asFlow -import kotlinx.coroutines.reactive.asPublisher +import kotlinx.coroutines.reactive.asPublisher as asReactivePublisher import kotlinx.coroutines.reactive.collect +import kotlinx.coroutines.channels.* import org.reactivestreams.* import kotlin.coroutines.* import java.util.concurrent.Flow as JFlow /** - * Transforms the given reactive [Publisher] into [Flow]. - * Use [buffer] operator on the resulting flow to specify the size of the backpressure. - * More precisely, it specifies the value of the subscription's [request][Subscription.request]. - * [buffer] default capacity is used by default. + * Transforms the given reactive [Flow Publisher][JFlow.Publisher] into [Flow]. + * Use the [buffer] operator on the resulting flow to specify the size of the back-pressure. + * In effect, it specifies the value of the subscription's [request][JFlow.Subscription.request]. + * The [default buffer capacity][Channel.BUFFERED] for a suspending channel is used by default. * - * If any of the resulting flow transformations fails, subscription is immediately cancelled and all in-flight elements - * are discarded. + * If any of the resulting flow transformations fails, the subscription is immediately cancelled and all the in-flight + * elements are discarded. */ public fun JFlow.Publisher.asFlow(): Flow = - FlowAdapters.toPublisher(this).asFlow() + FlowAdapters.toPublisher(this).asFlow() /** - * Transforms the given flow to a reactive specification compliant [Publisher]. + * Transforms the given flow into a reactive specification compliant [Flow Publisher][JFlow.Publisher]. * - * An optional [context] can be specified to control the execution context of calls to [Subscriber] methods. - * You can set a [CoroutineDispatcher] to confine them to a specific thread and/or various [ThreadContextElement] to + * An optional [context] can be specified to control the execution context of calls to the [Flow Subscriber][Subscriber] + * methods. + * A [CoroutineDispatcher] can be set to confine them to a specific thread; various [ThreadContextElement] can be set to * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ @JvmOverloads // binary compatibility -public fun Flow.asPublisher(context: CoroutineContext = EmptyCoroutineContext): JFlow.Publisher { - val reactivePublisher : org.reactivestreams.Publisher = this.asPublisher(context) - return FlowAdapters.toFlowPublisher(reactivePublisher) -} +public fun Flow.asPublisher(context: CoroutineContext = EmptyCoroutineContext): JFlow.Publisher = + FlowAdapters.toFlowPublisher(asReactivePublisher(context)) /** - * Subscribes to this [Publisher] and performs the specified action for each received element. - * Cancels subscription if any exception happens during collect. + * Subscribes to this [Flow Publisher][JFlow.Publisher] and performs the specified action for each received element. + * + * If [action] throws an exception at some point, the subscription is cancelled, and the exception is rethrown from + * [collect]. Also, if the publisher signals an error, that error is rethrown from [collect]. */ public suspend inline fun JFlow.Publisher.collect(action: (T) -> Unit): Unit = FlowAdapters.toPublisher(this).collect(action) diff --git a/reactive/kotlinx-coroutines-jdk9/test/PublisherCollectTest.kt b/reactive/kotlinx-coroutines-jdk9/test/PublisherCollectTest.kt new file mode 100644 index 0000000000..c2e88483a7 --- /dev/null +++ b/reactive/kotlinx-coroutines-jdk9/test/PublisherCollectTest.kt @@ -0,0 +1,146 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.jdk9 + +import kotlinx.coroutines.* +import kotlinx.coroutines.reactive.* +import org.junit.Test +import org.reactivestreams.* +import kotlin.test.* +import java.util.concurrent.Flow as JFlow + +class PublisherCollectTest: TestBase() { + + /** Tests the simple scenario where the publisher outputs a bounded stream of values to collect. */ + @Test + fun testCollect() = runTest { + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = JFlow.Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: JFlow.Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + if (lastOutput == x) + subscriber.onComplete() + } + + override fun cancel() { + /** According to rule 3.5 of the + * [reactive spec](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#3.5), + * this method can be called by the subscriber at any point, so it's not an error if it's called + * in this scenario. */ + } + + }) + } + var sum = 0 + publisher.collect { + sum += it + } + assertEquals(xSum, sum) + } + + /** Tests the behavior of [collect] when the publisher raises an error. */ + @Test + fun testCollectThrowingPublisher() = runTest { + val errorString = "Too many elements requested" + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + if (lastOutput == x) + subscriber.onError(IllegalArgumentException(errorString)) + } + + override fun cancel() { + /** See the comment for the corresponding part of [testCollect]. */ + } + + }) + } + var sum = 0 + try { + publisher.collect { + sum += it + } + } catch (e: IllegalArgumentException) { + assertEquals(errorString, e.message) + } + assertEquals(xSum, sum) + } + + /** Tests the behavior of [collect] when the action throws. */ + @Test + fun testCollectThrowingAction() = runTest { + val errorString = "Too many elements produced" + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + } + + override fun cancel() { + assertEquals(x, lastOutput) + expect(x + 2) + } + + }) + } + var sum = 0 + try { + expect(1) + var i = 1 + publisher.collect { + sum += it + i += 1 + expect(i) + if (sum >= xSum) { + throw IllegalArgumentException(errorString) + } + } + } catch (e: IllegalArgumentException) { + expect(x + 3) + assertEquals(errorString, e.message) + } + finish(x + 4) + } +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-reactive/src/Channel.kt b/reactive/kotlinx-coroutines-reactive/src/Channel.kt index d9c9b91a2c..b7fbf134c5 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Channel.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Channel.kt @@ -11,10 +11,10 @@ import kotlinx.coroutines.internal.* import org.reactivestreams.* /** - * Subscribes to this [Publisher] and returns a channel to receive elements emitted by it. - * The resulting channel shall be [cancelled][ReceiveChannel.cancel] to unsubscribe from this publisher. + * Subscribes to this [Publisher] and returns a channel to receive the elements emitted by it. + * The resulting channel needs to be [cancelled][ReceiveChannel.cancel] in order to unsubscribe from this publisher. - * @param request how many items to request from publisher in advance (optional, one by default). + * @param request how many items to request from the publisher in advance (optional, a single element by default). * * This method is deprecated in the favor of [Flow]. * Instead of iterating over the resulting channel please use [collect][Flow.collect]: @@ -35,7 +35,9 @@ public fun Publisher.openSubscription(request: Int = 1): ReceiveChannel Publisher.collect(action: (T) -> Unit): Unit = toChannel().consumeEach(action) @@ -61,7 +63,7 @@ private class SubscriptionChannel( // can be negative if we have receivers, but no subscription yet private val _requested = atomic(0) - // AbstractChannel overrides + // --------------------- AbstractChannel overrides ------------------------------- @Suppress("CANNOT_OVERRIDE_INVISIBLE_MEMBER") override fun onReceiveEnqueued() { _requested.loop { wasRequested -> @@ -89,7 +91,7 @@ private class SubscriptionChannel( _subscription.getAndSet(null)?.cancel() // cancel exactly once } - // Subscriber overrides + // --------------------- Subscriber overrides ------------------------------- override fun onSubscribe(s: Subscription) { _subscription.value = s while (true) { // lock-free loop on _requested diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 37113849ab..8b94b95986 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -12,22 +12,25 @@ import org.reactivestreams.* import kotlin.coroutines.* /** - * Creates cold reactive [Publisher] that runs a given [block] in a coroutine. + * Creates a cold reactive [Publisher] that runs a given [block] in a coroutine. + * * Every time the returned flux is subscribed, it starts a new coroutine in the specified [context]. - * Coroutine emits ([Subscriber.onNext]) values with `send`, completes ([Subscriber.onComplete]) - * when the coroutine completes or channel is explicitly closed and emits error ([Subscriber.onError]) - * if coroutine throws an exception or closes channel with a cause. - * Unsubscribing cancels running coroutine. + * The coroutine emits (via [Subscriber.onNext]) values with [send][ProducerScope.send], + * completes (via [Subscriber.onComplete]) when the coroutine completes or channel is explicitly closed, and emits + * errors (via [Subscriber.onError]) if the coroutine throws an exception or closes channel with a cause. + * Unsubscribing cancels the running coroutine. * - * Invocations of `send` are suspended appropriately when subscribers apply back-pressure and to ensure that - * `onNext` is not invoked concurrently. + * Invocations of [send][ProducerScope.send] are suspended appropriately when subscribers apply back-pressure and to + * ensure that [onNext][Subscriber.onNext] is not invoked concurrently. * * Coroutine context can be specified with [context] argument. - * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is used. - * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. + * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is + * used. * * **Note: This is an experimental api.** Behaviour of publishers that work as children in a parent scope with respect * to cancellation and error handling may change in the future. + * + * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ @ExperimentalCoroutinesApi public fun publish( diff --git a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt index 1f197f94ed..1a527a3c2b 100644 --- a/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt +++ b/reactive/kotlinx-coroutines-reactive/src/ReactiveFlow.kt @@ -17,12 +17,12 @@ import kotlinx.coroutines.internal.* /** * Transforms the given reactive [Publisher] into [Flow]. - * Use [buffer] operator on the resulting flow to specify the size of the backpressure. - * More precisely, it specifies the value of the subscription's [request][Subscription.request]. - * [buffer] default capacity is used by default. + * Use the [buffer] operator on the resulting flow to specify the size of the back-pressure. + * In effect, it specifies the value of the subscription's [request][Subscription.request]. + * The [default buffer capacity][Channel.BUFFERED] for a suspending channel is used by default. * - * If any of the resulting flow transformations fails, subscription is immediately cancelled and all in-flight elements - * are discarded. + * If any of the resulting flow transformations fails, the subscription is immediately cancelled and all the in-flight + * elements are discarded. * * This function is integrated with `ReactorContext` from `kotlinx-coroutines-reactor` module, * see its documentation for additional details. @@ -31,13 +31,13 @@ public fun Publisher.asFlow(): Flow = PublisherAsFlow(this) /** - * Transforms the given flow to a reactive specification compliant [Publisher]. + * Transforms the given flow into a reactive specification compliant [Publisher]. * * This function is integrated with `ReactorContext` from `kotlinx-coroutines-reactor` module, * see its documentation for additional details. * - * An optional [context] can be specified to control the execution context of calls to [Subscriber] methods. - * You can set a [CoroutineDispatcher] to confine them to a specific thread and/or various [ThreadContextElement] to + * An optional [context] can be specified to control the execution context of calls to the [Subscriber] methods. + * A [CoroutineDispatcher] can be set to confine them to a specific thread; various [ThreadContextElement] can be set to * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ @@ -55,8 +55,8 @@ private class PublisherAsFlow( PublisherAsFlow(publisher, context, capacity, onBufferOverflow) /* - * Suppress for Channel.CHANNEL_DEFAULT_CAPACITY. - * It's too counter-intuitive to be public and moving it to Flow companion + * The @Suppress is for Channel.CHANNEL_DEFAULT_CAPACITY. + * It's too counter-intuitive to be public, and moving it to Flow companion * will also create undesired effect. */ @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherCollectTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherCollectTest.kt new file mode 100644 index 0000000000..e4753f0467 --- /dev/null +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherCollectTest.kt @@ -0,0 +1,144 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.reactive + +import kotlinx.coroutines.* +import org.junit.Test +import org.reactivestreams.* +import kotlin.test.* + +class PublisherCollectTest: TestBase() { + + /** Tests the simple scenario where the publisher outputs a bounded stream of values to collect. */ + @Test + fun testCollect() = runTest { + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + if (lastOutput == x) + subscriber.onComplete() + } + + override fun cancel() { + /** According to rule 3.5 of the + * [reactive spec](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#3.5), + * this method can be called by the subscriber at any point, so it's not an error if it's called + * in this scenario. */ + } + + }) + } + var sum = 0 + publisher.collect { + sum += it + } + assertEquals(xSum, sum) + } + + /** Tests the behavior of [collect] when the publisher raises an error. */ + @Test + fun testCollectThrowingPublisher() = runTest { + val errorString = "Too many elements requested" + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + if (lastOutput == x) + subscriber.onError(IllegalArgumentException(errorString)) + } + + override fun cancel() { + /** See the comment for the corresponding part of [testCollect]. */ + } + + }) + } + var sum = 0 + try { + publisher.collect { + sum += it + } + } catch (e: IllegalArgumentException) { + assertEquals(errorString, e.message) + } + assertEquals(xSum, sum) + } + + /** Tests the behavior of [collect] when the action throws. */ + @Test + fun testCollectThrowingAction() = runTest { + val errorString = "Too many elements produced" + val x = 100 + val xSum = x * (x + 1) / 2 + val publisher = Publisher { subscriber -> + var requested = 0L + var lastOutput = 0 + subscriber.onSubscribe(object: Subscription { + + override fun request(n: Long) { + requested += n + if (n <= 0) { + subscriber.onError(IllegalArgumentException()) + return + } + while (lastOutput < x && lastOutput < requested) { + lastOutput += 1 + subscriber.onNext(lastOutput) + } + } + + override fun cancel() { + assertEquals(x, lastOutput) + expect(x + 2) + } + + }) + } + var sum = 0 + try { + expect(1) + var i = 1 + publisher.collect { + sum += it + i += 1 + expect(i) + if (sum >= xSum) { + throw IllegalArgumentException(errorString) + } + } + } catch (e: IllegalArgumentException) { + expect(x + 3) + assertEquals(errorString, e.message) + } + finish(x + 4) + } +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt index 3bc50c8d57..51a5d54e1c 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt @@ -10,6 +10,7 @@ import kotlinx.atomicfu.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.internal.* import kotlinx.coroutines.flow.* +import kotlinx.coroutines.reactive.* /** * Subscribes to this [MaybeSource] and returns a channel to receive elements emitted by it. @@ -41,14 +42,18 @@ public fun ObservableSource.openSubscription(): ReceiveChannel { /** * Subscribes to this [MaybeSource] and performs the specified action for each received element. - * Cancels subscription if any exception happens during collect. + * + * If [action] throws an exception at some point or if the [MaybeSource] raises an error, the exception is rethrown from + * [collect]. */ public suspend inline fun MaybeSource.collect(action: (T) -> Unit): Unit = toChannel().consumeEach(action) /** * Subscribes to this [ObservableSource] and performs the specified action for each received element. - * Cancels subscription if any exception happens during collect. + * + * If [action] throws an exception at some point, the subscription is cancelled, and the exception is rethrown from + * [collect]. Also, if the [ObservableSource] signals an error, that error is rethrown from [collect]. */ public suspend inline fun ObservableSource.collect(action: (T) -> Unit): Unit = toChannel().consumeEach(action) @@ -84,7 +89,8 @@ private class SubscriptionChannel : } override fun onSuccess(t: T) { - trySend(t) // Safe to ignore return value here, expectedly racing with cancellation + trySend(t) + close(cause = null) } override fun onNext(t: T) { diff --git a/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt b/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt index 292f6187fa..f5d128d311 100644 --- a/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/MaybeTest.kt @@ -254,6 +254,56 @@ class MaybeTest : TestBase() { finish(7) } + /** Tests the simple scenario where the Maybe doesn't output a value. */ + @Test + fun testMaybeCollectEmpty() = runTest { + expect(1) + Maybe.empty().collect { + expectUnreached() + } + finish(2) + } + + /** Tests the simple scenario where the Maybe doesn't output a value. */ + @Test + fun testMaybeCollectSingle() = runTest { + expect(1) + Maybe.just("OK").collect { + assertEquals("OK", it) + expect(2) + } + finish(3) + } + + /** Tests the behavior of [collect] when the Maybe raises an error. */ + @Test + fun testMaybeCollectThrowingMaybe() = runTest { + expect(1) + try { + Maybe.error(TestException()).collect { + expectUnreached() + } + } catch (e: TestException) { + expect(2) + } + finish(3) + } + + /** Tests the behavior of [collect] when the action throws. */ + @Test + fun testMaybeCollectThrowingAction() = runTest { + expect(1) + try { + Maybe.just("OK").collect { + expect(2) + throw TestException() + } + } catch (e: TestException) { + expect(3) + } + finish(4) + } + @Test fun testSuppressedException() = runTest { val maybe = rxMaybe(currentDispatcher()) { diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableCollectTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableCollectTest.kt new file mode 100644 index 0000000000..508f594ac3 --- /dev/null +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableCollectTest.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.rx2 + +import io.reactivex.* +import io.reactivex.disposables.* +import kotlinx.coroutines.* +import org.junit.Test +import kotlin.test.* + +class ObservableCollectTest: TestBase() { + + /** Tests the behavior of [collect] when the publisher raises an error. */ + @Test + fun testObservableCollectThrowingObservable() = runTest { + expect(1) + var sum = 0 + try { + rxObservable { + for (i in 0..100) { + send(i) + } + throw TestException() + }.collect { + sum += it + } + } catch (e: TestException) { + assertTrue(sum > 0) + finish(2) + } + } + + /** Tests the behavior of [collect] when the action throws. */ + @Test + fun testObservableCollectThrowingAction() = runTest { + expect(1) + var sum = 0 + val expectedSum = 5 + try { + var disposed = false + ObservableSource { observer -> + launch(Dispatchers.Default) { + observer.onSubscribe(object : Disposable { + override fun dispose() { + disposed = true + expect(expectedSum + 2) + } + + override fun isDisposed(): Boolean = disposed + }) + while (!disposed) { + observer.onNext(1) + } + } + }.collect { + expect(sum + 2) + sum += it + if (sum == expectedSum) { + throw TestException() + } + } + } catch (e: TestException) { + assertEquals(expectedSum, sum) + finish(expectedSum + 3) + } + } +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt index ad780f7504..21238d2491 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxChannel.kt @@ -9,6 +9,7 @@ import io.reactivex.rxjava3.disposables.* import kotlinx.atomicfu.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.internal.* +import kotlinx.coroutines.flow.* /** * Subscribes to this [MaybeSource] and returns a channel to receive elements emitted by it. @@ -40,14 +41,18 @@ internal fun ObservableSource.openSubscription(): ReceiveChannel { /** * Subscribes to this [MaybeSource] and performs the specified action for each received element. - * Cancels subscription if any exception happens during collect. + * + * If [action] throws an exception at some point or if the [MaybeSource] raises an error, the exception is rethrown from + * [collect]. */ public suspend inline fun MaybeSource.collect(action: (T) -> Unit): Unit = openSubscription().consumeEach(action) /** * Subscribes to this [ObservableSource] and performs the specified action for each received element. - * Cancels subscription if any exception happens during collect. + * + * If [action] throws an exception at some point, the subscription is cancelled, and the exception is rethrown from + * [collect]. Also, if the [ObservableSource] signals an error, that error is rethrown from [collect]. */ public suspend inline fun ObservableSource.collect(action: (T) -> Unit): Unit = openSubscription().consumeEach(action) @@ -69,7 +74,8 @@ private class SubscriptionChannel : } override fun onSuccess(t: T) { - trySend(t) // Safe to ignore return value here, expectedly racing with cancellation + trySend(t) + close(cause = null) } override fun onNext(t: T) { diff --git a/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt b/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt index bdb5481d80..bea939efde 100644 --- a/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/MaybeTest.kt @@ -84,7 +84,7 @@ class MaybeTest : TestBase() { expectUnreached() } expect(2) - // nothing is called on a disposed rx3 maybe + // nothing is called on a disposed rx2 maybe val sub = maybe.subscribe({ expectUnreached() }, { @@ -254,6 +254,56 @@ class MaybeTest : TestBase() { finish(7) } + /** Tests the simple scenario where the Maybe doesn't output a value. */ + @Test + fun testMaybeCollectEmpty() = runTest { + expect(1) + Maybe.empty().collect { + expectUnreached() + } + finish(2) + } + + /** Tests the simple scenario where the Maybe doesn't output a value. */ + @Test + fun testMaybeCollectSingle() = runTest { + expect(1) + Maybe.just("OK").collect { + assertEquals("OK", it) + expect(2) + } + finish(3) + } + + /** Tests the behavior of [collect] when the Maybe raises an error. */ + @Test + fun testMaybeCollectThrowingMaybe() = runTest { + expect(1) + try { + Maybe.error(TestException()).collect { + expectUnreached() + } + } catch (e: TestException) { + expect(2) + } + finish(3) + } + + /** Tests the behavior of [collect] when the action throws. */ + @Test + fun testMaybeCollectThrowingAction() = runTest { + expect(1) + try { + Maybe.just("OK").collect { + expect(2) + throw TestException() + } + } catch (e: TestException) { + expect(3) + } + finish(4) + } + @Test fun testSuppressedException() = runTest { val maybe = rxMaybe(currentDispatcher()) { diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableCollectTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableCollectTest.kt new file mode 100644 index 0000000000..680786f9b3 --- /dev/null +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableCollectTest.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.rx3 + +import io.reactivex.rxjava3.core.ObservableSource +import io.reactivex.rxjava3.disposables.* +import kotlinx.coroutines.* +import org.junit.Test +import kotlin.test.* + +class ObservableCollectTest: TestBase() { + + /** Tests the behavior of [collect] when the publisher raises an error. */ + @Test + fun testObservableCollectThrowingObservable() = runTest { + expect(1) + var sum = 0 + try { + rxObservable { + for (i in 0..100) { + send(i) + } + throw TestException() + }.collect { + sum += it + } + } catch (e: TestException) { + assertTrue(sum > 0) + finish(2) + } + } + + @Test + fun testObservableCollectThrowingAction() = runTest { + expect(1) + var sum = 0 + val expectedSum = 5 + try { + var disposed = false + ObservableSource { observer -> + launch(Dispatchers.Default) { + observer.onSubscribe(object : Disposable { + override fun dispose() { + disposed = true + expect(expectedSum + 2) + } + + override fun isDisposed(): Boolean = disposed + }) + while (!disposed) { + observer.onNext(1) + } + } + }.collect { + expect(sum + 2) + sum += it + if (sum == expectedSum) { + throw TestException() + } + } + } catch (e: TestException) { + assertEquals(expectedSum, sum) + finish(expectedSum + 3) + } + } +} \ No newline at end of file From 3116b8c8d4100fa7f6deb6e64887d804f7f9804b Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Fri, 23 Apr 2021 12:41:29 +0300 Subject: [PATCH 049/328] CoroutinesTimeout for JUnit5 (#2402) --- gradle.properties | 1 + .../api/kotlinx-coroutines-debug.api | 5 + kotlinx-coroutines-debug/build.gradle | 9 + .../src/junit/CoroutinesTimeoutImpl.kt | 81 +++++ .../{ => junit}/junit4/CoroutinesTimeout.kt | 0 .../junit4/CoroutinesTimeoutStatement.kt | 30 ++ .../src/junit/junit5/CoroutinesTimeout.kt | 63 ++++ .../junit5/CoroutinesTimeoutExtension.kt | 279 ++++++++++++++++++ .../src/junit4/CoroutinesTimeoutStatement.kt | 87 ------ .../junit5/CoroutinesTimeoutExtensionTest.kt | 121 ++++++++ .../CoroutinesTimeoutInheritanceTest.kt | 60 ++++ .../junit5/CoroutinesTimeoutMethodTest.kt | 44 +++ .../junit5/CoroutinesTimeoutNestedTest.kt | 29 ++ .../junit5/CoroutinesTimeoutSimpleTest.kt | 61 ++++ .../test/junit5/CoroutinesTimeoutTest.kt | 170 +++++++++++ .../test/junit5/RegisterExtensionExample.kt | 20 ++ 16 files changed, 973 insertions(+), 87 deletions(-) create mode 100644 kotlinx-coroutines-debug/src/junit/CoroutinesTimeoutImpl.kt rename kotlinx-coroutines-debug/src/{ => junit}/junit4/CoroutinesTimeout.kt (100%) create mode 100644 kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeoutStatement.kt create mode 100644 kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeout.kt create mode 100644 kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt delete mode 100644 kotlinx-coroutines-debug/src/junit4/CoroutinesTimeoutStatement.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutExtensionTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutInheritanceTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutMethodTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutNestedTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutSimpleTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutTest.kt create mode 100644 kotlinx-coroutines-debug/test/junit5/RegisterExtensionExample.kt diff --git a/gradle.properties b/gradle.properties index 97c6af986f..15935ab114 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,7 @@ kotlin_version=1.5.0-RC # Dependencies junit_version=4.12 +junit5_version=5.7.0 atomicfu_version=0.15.2 knit_version=0.2.3 html_version=0.7.2 diff --git a/kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api b/kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api index b6056c410c..5bf70626a4 100644 --- a/kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api +++ b/kotlinx-coroutines-debug/api/kotlinx-coroutines-debug.api @@ -61,3 +61,8 @@ public final class kotlinx/coroutines/debug/junit4/CoroutinesTimeout$Companion { public static synthetic fun seconds$default (Lkotlinx/coroutines/debug/junit4/CoroutinesTimeout$Companion;JZZILjava/lang/Object;)Lkotlinx/coroutines/debug/junit4/CoroutinesTimeout; } +public abstract interface annotation class kotlinx/coroutines/debug/junit5/CoroutinesTimeout : java/lang/annotation/Annotation { + public abstract fun cancelOnTimeout ()Z + public abstract fun testTimeoutMs ()J +} + diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index faaed91206..b2e3f2cf53 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -20,6 +20,9 @@ configurations { dependencies { compileOnly "junit:junit:$junit_version" + compileOnly "org.junit.jupiter:junit-jupiter-api:$junit5_version" + testCompile "org.junit.jupiter:junit-jupiter-engine:$junit5_version" + testCompile "org.junit.platform:junit-platform-testkit:1.7.0" shadowDeps "net.bytebuddy:byte-buddy:$byte_buddy_version" shadowDeps "net.bytebuddy:byte-buddy-agent:$byte_buddy_version" compileOnly "io.projectreactor.tools:blockhound:$blockhound_version" @@ -38,6 +41,12 @@ if (rootProject.ext.jvm_ir_enabled) { } } +java { + /* This is needed to be able to run JUnit5 tests. Otherwise, Gradle complains that it can't find the + JVM1.6-compatible version of the `junit-jupiter-api` artifact. */ + disableAutoTargetJvm() +} + jar { manifest { attributes "Premain-Class": "kotlinx.coroutines.debug.AgentPremain" diff --git a/kotlinx-coroutines-debug/src/junit/CoroutinesTimeoutImpl.kt b/kotlinx-coroutines-debug/src/junit/CoroutinesTimeoutImpl.kt new file mode 100644 index 0000000000..06a84a5bf9 --- /dev/null +++ b/kotlinx-coroutines-debug/src/junit/CoroutinesTimeoutImpl.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug + +import java.util.concurrent.* + +/** + * Run [invocation] in a separate thread with the given timeout in ms, after which the coroutines info is dumped and, if + * [cancelOnTimeout] is set, the execution is interrupted. + * + * Assumes that [DebugProbes] are installed. Does not deinstall them. + */ +internal inline fun runWithTimeoutDumpingCoroutines( + methodName: String, + testTimeoutMs: Long, + cancelOnTimeout: Boolean, + initCancellationException: () -> Throwable, + crossinline invocation: () -> T +): T { + val testStartedLatch = CountDownLatch(1) + val testResult = FutureTask { + testStartedLatch.countDown() + invocation() + } + /* + * We are using hand-rolled thread instead of single thread executor + * in order to be able to safely interrupt thread in the end of a test + */ + val testThread = Thread(testResult, "Timeout test thread").apply { isDaemon = true } + try { + testThread.start() + // Await until test is started to take only test execution time into account + testStartedLatch.await() + return testResult.get(testTimeoutMs, TimeUnit.MILLISECONDS) + } catch (e: TimeoutException) { + handleTimeout(testThread, methodName, testTimeoutMs, cancelOnTimeout, initCancellationException()) + } catch (e: ExecutionException) { + throw e.cause ?: e + } +} + +private fun handleTimeout(testThread: Thread, methodName: String, testTimeoutMs: Long, cancelOnTimeout: Boolean, + cancellationException: Throwable): Nothing { + val units = + if (testTimeoutMs % 1000 == 0L) + "${testTimeoutMs / 1000} seconds" + else "$testTimeoutMs milliseconds" + + System.err.println("\nTest $methodName timed out after $units\n") + System.err.flush() + + DebugProbes.dumpCoroutines() + System.out.flush() // Synchronize serr/sout + + /* + * Order is important: + * 1) Create exception with a stacktrace of hang test + * 2) Cancel all coroutines via debug agent API (changing system state!) + * 3) Throw created exception + */ + cancellationException.attachStacktraceFrom(testThread) + testThread.interrupt() + cancelIfNecessary(cancelOnTimeout) + // If timed out test throws an exception, we can't do much except ignoring it + throw cancellationException +} + +private fun cancelIfNecessary(cancelOnTimeout: Boolean) { + if (cancelOnTimeout) { + DebugProbes.dumpCoroutinesInfo().forEach { + it.job?.cancel() + } + } +} + +private fun Throwable.attachStacktraceFrom(thread: Thread) { + val stackTrace = thread.stackTrace + this.stackTrace = stackTrace +} diff --git a/kotlinx-coroutines-debug/src/junit4/CoroutinesTimeout.kt b/kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeout.kt similarity index 100% rename from kotlinx-coroutines-debug/src/junit4/CoroutinesTimeout.kt rename to kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeout.kt diff --git a/kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeoutStatement.kt b/kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeoutStatement.kt new file mode 100644 index 0000000000..aa6b8df243 --- /dev/null +++ b/kotlinx-coroutines-debug/src/junit/junit4/CoroutinesTimeoutStatement.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit4 + +import kotlinx.coroutines.debug.* +import org.junit.runner.* +import org.junit.runners.model.* +import java.util.concurrent.* + +internal class CoroutinesTimeoutStatement( + private val testStatement: Statement, + private val testDescription: Description, + private val testTimeoutMs: Long, + private val cancelOnTimeout: Boolean = false +) : Statement() { + + override fun evaluate() { + try { + runWithTimeoutDumpingCoroutines(testDescription.methodName, testTimeoutMs, cancelOnTimeout, + { TestTimedOutException(testTimeoutMs, TimeUnit.MILLISECONDS) }) + { + testStatement.evaluate() + } + } finally { + DebugProbes.uninstall() + } + } +} diff --git a/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeout.kt b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeout.kt new file mode 100644 index 0000000000..9a8263fe5e --- /dev/null +++ b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeout.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 +import kotlinx.coroutines.debug.* +import org.junit.jupiter.api.* +import org.junit.jupiter.api.extension.* +import org.junit.jupiter.api.parallel.* +import java.lang.annotation.* + +/** + * Coroutines timeout annotation that is similar to JUnit5's [Timeout] annotation. It allows running test methods in a + * separate thread, failing them after the provided time limit and interrupting the thread. + * + * Additionally, it installs [DebugProbes] and dumps all coroutines at the moment of the timeout. It also cancels + * coroutines on timeout if [cancelOnTimeout] set to `true`. The dump contains the coroutine creation stack traces. + * + * This annotation has an effect on test, test factory, test template, and lifecycle methods and test classes that are + * annotated with it. + * + * Annotating a class is the same as annotating every test, test factory, and test template method (but not lifecycle + * methods) of that class and its inner test classes, unless any of them is annotated with [CoroutinesTimeout], in which + * case their annotation overrides the one on the containing class. + * + * Declaring [CoroutinesTimeout] on a test factory checks that it finishes in the specified time, but does not check + * whether the methods that it produces obey the timeout as well. + * + * Example usage: + * ``` + * @CoroutinesTimeout(100) + * class CoroutinesTimeoutSimpleTest { + * // does not time out, as the annotation on the method overrides the class-level one + * @CoroutinesTimeout(1000) + * @Test + * fun classTimeoutIsOverridden() { + * runBlocking { + * delay(150) + * } + * } + * + * // times out in 100 ms, timeout value is taken from the class-level annotation + * @Test + * fun classTimeoutIsUsed() { + * runBlocking { + * delay(150) + * } + * } + * } + * ``` + * + * @see Timeout + */ +@ExtendWith(CoroutinesTimeoutExtension::class) +@Inherited +@MustBeDocumented +@ResourceLock("coroutines timeout", mode = ResourceAccessMode.READ) +@Retention(value = AnnotationRetention.RUNTIME) +@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +public annotation class CoroutinesTimeout( + val testTimeoutMs: Long, + val cancelOnTimeout: Boolean = false +) diff --git a/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt new file mode 100644 index 0000000000..a3e7713a5c --- /dev/null +++ b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt @@ -0,0 +1,279 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.debug.* +import kotlinx.coroutines.debug.runWithTimeoutDumpingCoroutines +import org.junit.jupiter.api.extension.* +import org.junit.platform.commons.support.AnnotationSupport +import java.lang.reflect.* +import java.util.* +import java.util.concurrent.atomic.* + +internal class CoroutinesTimeoutException(val timeoutMs: Long): Exception("test timed out ofter $timeoutMs ms") + +/** + * This JUnit5 extension allows running test, test factory, test template, and lifecycle methods in a separate thread, + * failing them after the provided time limit and interrupting the thread. + * + * Additionally, it installs [DebugProbes] and dumps all coroutines at the moment of the timeout. It also cancels + * coroutines on timeout if [cancelOnTimeout] set to `true`. + * [enableCoroutineCreationStackTraces] controls the corresponding [DebugProbes.enableCreationStackTraces] property + * and can be optionally disabled to speed-up tests if creation stack traces are not needed. + * + * Beware that if several tests that use this extension set [enableCoroutineCreationStackTraces] to different values and + * execute in parallel, the behavior is ill-defined. In order to avoid conflicts between different instances of this + * extension when using JUnit5 in parallel, use [ResourceLock] with resource name `coroutines timeout` on tests that use + * it. Note that the tests annotated with [CoroutinesTimeout] already use this [ResourceLock], so there is no need to + * annotate them additionally. + * + * Note that while calls to test factories are verified to finish in the specified time, but the methods that they + * produce are not affected by this extension. + * + * Beware that registering the extension via [CoroutinesTimeout] annotation conflicts with manually registering it on + * the same tests via other methods (most notably, [RegisterExtension]) and is prohibited. + * + * Example of usage: + * ``` + * class HangingTest { + * @JvmField + * @RegisterExtension + * val timeout = CoroutinesTimeoutExtension.seconds(5) + * + * @Test + * fun testThatHangs() = runBlocking { + * ... + * delay(Long.MAX_VALUE) // somewhere deep in the stack + * ... + * } + * } + * ``` + * + * @see [CoroutinesTimeout] + * */ +// NB: the constructor is not private so that JUnit is able to call it via reflection. +internal class CoroutinesTimeoutExtension internal constructor( + private val enableCoroutineCreationStackTraces: Boolean = true, + private val timeoutMs: Long? = null, + private val cancelOnTimeout: Boolean? = null): InvocationInterceptor +{ + /** + * Creates the [CoroutinesTimeoutExtension] extension with the given timeout in milliseconds. + */ + public constructor(timeoutMs: Long, cancelOnTimeout: Boolean = false, + enableCoroutineCreationStackTraces: Boolean = true): + this(enableCoroutineCreationStackTraces, timeoutMs, cancelOnTimeout) + + public companion object { + /** + * Creates the [CoroutinesTimeoutExtension] extension with the given timeout in seconds. + */ + @JvmOverloads + public fun seconds(timeout: Int, cancelOnTimeout: Boolean = false, + enableCoroutineCreationStackTraces: Boolean = true): CoroutinesTimeoutExtension = + CoroutinesTimeoutExtension(enableCoroutineCreationStackTraces, timeout.toLong() * 1000, cancelOnTimeout) + } + + /** @see [initialize] */ + private val debugProbesOwnershipPassed = AtomicBoolean(false) + + private fun tryPassDebugProbesOwnership() = debugProbesOwnershipPassed.compareAndSet(false, true) + + /* We install the debug probes early so that the coroutines launched from the test constructor are captured as well. + However, this is not enough as the same extension instance may be reused several times, even cleaning up its + resources from the store. */ + init { + DebugProbes.enableCreationStackTraces = enableCoroutineCreationStackTraces + DebugProbes.install() + } + + // This is needed so that a class with no tests still successfully passes the ownership of DebugProbes to JUnit5. + override fun interceptTestClassConstructor( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext>, + extensionContext: ExtensionContext + ): T { + initialize(extensionContext) + return invocation.proceed() + } + + /** + * Initialize this extension instance and/or the extension value store. + * + * It seems that the only way to reliably have JUnit5 clean up after its extensions is to put an instance of + * [ExtensionContext.Store.CloseableResource] into the value store corresponding to the extension instance, which + * means that [DebugProbes.uninstall] must be placed into the value store. [debugProbesOwnershipPassed] is `true` + * if the call to [DebugProbes.install] performed in the constructor of the extension instance was matched with a + * placing of [DebugProbes.uninstall] into the value store. We call the process of placing the cleanup procedure + * "passing the ownership", as now JUnit5 (and not our code) has to worry about uninstalling the debug probes. + * + * However, extension instances can be reused with different value stores, and value stores can be reused across + * extension instances. This leads to a tricky scheme of performing [DebugProbes.uninstall]: + * + * * If neither the ownership of this instance's [DebugProbes] was yet passed nor there is any cleanup procedure + * stored, it means that we can just store our cleanup procedure, passing the ownership. + * * If the ownership was not yet passed, but a cleanup procedure is already stored, we can't just replace it with + * another one, as this would lead to imbalance between [DebugProbes.install] and [DebugProbes.uninstall]. + * Instead, we know that this extension context will at least outlive this use of this instance, so some debug + * probes other than the ones from our constructor are already installed and won't be uninstalled during our + * operation. We simply uninstall the debug probes that were installed in our constructor. + * * If the ownership was passed, but the store is empty, it means that this test instance is reused and, possibly, + * the debug probes installed in its constructor were already uninstalled. This means that we have to install them + * anew and store an uninstaller. + */ + private fun initialize(extensionContext: ExtensionContext) { + val store: ExtensionContext.Store = extensionContext.getStore( + ExtensionContext.Namespace.create(CoroutinesTimeoutExtension::class, extensionContext.uniqueId)) + /** It seems that the JUnit5 documentation does not specify the relationship between the extension instances and + * the corresponding [ExtensionContext] (in which the value stores are managed), so it is unclear whether it's + * theoretically possible for two extension instances that run concurrently to share an extension context. So, + * just in case this risk exists, we synchronize here. */ + synchronized(store) { + if (store["debugProbes"] == null) { + if (!tryPassDebugProbesOwnership()) { + /** This means that the [DebugProbes.install] call from the constructor of this extensions has + * already been matched with a corresponding cleanup procedure for JUnit5, but then JUnit5 cleaned + * everything up and later reused the same extension instance for other tests. Therefore, we need to + * install the [DebugProbes] anew. */ + DebugProbes.enableCreationStackTraces = enableCoroutineCreationStackTraces + DebugProbes.install() + } + /** put a fake resource into this extensions's store so that JUnit cleans it up, uninstalling the + * [DebugProbes] after this extension instance is no longer needed. **/ + store.put("debugProbes", ExtensionContext.Store.CloseableResource { DebugProbes.uninstall() }) + } else if (!debugProbesOwnershipPassed.get()) { + /** This instance shares its store with other ones. Because of this, there was no need to install + * [DebugProbes], they are already installed, and this fact will outlive this use of this instance of + * the extension. */ + if (tryPassDebugProbesOwnership()) { + // We successfully marked the ownership as passed and now may uninstall the extraneous debug probes. + DebugProbes.uninstall() + } + } + } + } + + override fun interceptTestMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptNormalMethod(invocation, invocationContext, extensionContext) + } + + override fun interceptAfterAllMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptLifecycleMethod(invocation, invocationContext, extensionContext) + } + + override fun interceptAfterEachMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptLifecycleMethod(invocation, invocationContext, extensionContext) + } + + override fun interceptBeforeAllMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptLifecycleMethod(invocation, invocationContext, extensionContext) + } + + override fun interceptBeforeEachMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptLifecycleMethod(invocation, invocationContext, extensionContext) + } + + override fun interceptTestFactoryMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ): T = interceptNormalMethod(invocation, invocationContext, extensionContext) + + override fun interceptTestTemplateMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) { + interceptNormalMethod(invocation, invocationContext, extensionContext) + } + + private fun Class.coroutinesTimeoutAnnotation(): Optional = + AnnotationSupport.findAnnotation(this, CoroutinesTimeout::class.java).or { + enclosingClass?.coroutinesTimeoutAnnotation() ?: Optional.empty() + } + + private fun interceptMethod( + useClassAnnotation: Boolean, + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ): T { + initialize(extensionContext) + val testAnnotationOptional = + AnnotationSupport.findAnnotation(invocationContext.executable, CoroutinesTimeout::class.java) + val classAnnotationOptional = extensionContext.testClass.flatMap { it.coroutinesTimeoutAnnotation() } + if (timeoutMs != null && cancelOnTimeout != null) { + // this means we @RegisterExtension was used in order to register this extension. + if (testAnnotationOptional.isPresent || classAnnotationOptional.isPresent) { + /* Using annotations creates a separate instance of the extension, which composes in a strange way: both + timeouts are applied. This is at odds with the concept that method-level annotations override the outer + rules and may lead to unexpected outcomes, so we prohibit this. */ + throw UnsupportedOperationException("Using CoroutinesTimeout along with instance field-registered CoroutinesTimeout is prohibited; please use either @RegisterExtension or @CoroutinesTimeout, but not both") + } + return interceptInvocation(invocation, invocationContext.executable.name, timeoutMs, cancelOnTimeout) + } + /* The extension was registered via an annotation; check that we succeeded in finding the annotation that led to + the extension being registered and taking its parameters. */ + if (testAnnotationOptional.isEmpty && classAnnotationOptional.isEmpty) { + throw UnsupportedOperationException("Timeout was registered with a CoroutinesTimeout annotation, but we were unable to find it. Please report this.") + } + return when { + testAnnotationOptional.isPresent -> { + val annotation = testAnnotationOptional.get() + interceptInvocation(invocation, invocationContext.executable.name, annotation.testTimeoutMs, + annotation.cancelOnTimeout) + } + useClassAnnotation && classAnnotationOptional.isPresent -> { + val annotation = classAnnotationOptional.get() + interceptInvocation(invocation, invocationContext.executable.name, annotation.testTimeoutMs, + annotation.cancelOnTimeout) + } + else -> { + invocation.proceed() + } + } + } + + private fun interceptNormalMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ): T = interceptMethod(true, invocation, invocationContext, extensionContext) + + private fun interceptLifecycleMethod( + invocation: InvocationInterceptor.Invocation, + invocationContext: ReflectiveInvocationContext, + extensionContext: ExtensionContext + ) = interceptMethod(false, invocation, invocationContext, extensionContext) + + private fun interceptInvocation( + invocation: InvocationInterceptor.Invocation, + methodName: String, + testTimeoutMs: Long, + cancelOnTimeout: Boolean + ): T = + runWithTimeoutDumpingCoroutines(methodName, testTimeoutMs, cancelOnTimeout, + { CoroutinesTimeoutException(testTimeoutMs) }, { invocation.proceed() }) +} \ No newline at end of file diff --git a/kotlinx-coroutines-debug/src/junit4/CoroutinesTimeoutStatement.kt b/kotlinx-coroutines-debug/src/junit4/CoroutinesTimeoutStatement.kt deleted file mode 100644 index 4baf409de8..0000000000 --- a/kotlinx-coroutines-debug/src/junit4/CoroutinesTimeoutStatement.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.debug.junit4 - -import kotlinx.coroutines.debug.* -import org.junit.runner.* -import org.junit.runners.model.* -import java.util.concurrent.* - -internal class CoroutinesTimeoutStatement( - testStatement: Statement, - private val testDescription: Description, - private val testTimeoutMs: Long, - private val cancelOnTimeout: Boolean = false -) : Statement() { - - private val testStartedLatch = CountDownLatch(1) - - private val testResult = FutureTask { - testStartedLatch.countDown() - testStatement.evaluate() - } - - /* - * We are using hand-rolled thread instead of single thread executor - * in order to be able to safely interrupt thread in the end of a test - */ - private val testThread = Thread(testResult, "Timeout test thread").apply { isDaemon = true } - - override fun evaluate() { - try { - testThread.start() - // Await until test is started to take only test execution time into account - testStartedLatch.await() - testResult.get(testTimeoutMs, TimeUnit.MILLISECONDS) - return - } catch (e: TimeoutException) { - handleTimeout(testDescription) - } catch (e: ExecutionException) { - throw e.cause ?: e - } finally { - DebugProbes.uninstall() - } - } - - private fun handleTimeout(description: Description) { - val units = - if (testTimeoutMs % 1000 == 0L) - "${testTimeoutMs / 1000} seconds" - else "$testTimeoutMs milliseconds" - - System.err.println("\nTest ${description.methodName} timed out after $units\n") - System.err.flush() - - DebugProbes.dumpCoroutines() - System.out.flush() // Synchronize serr/sout - - /* - * Order is important: - * 1) Create exception with a stacktrace of hang test - * 2) Cancel all coroutines via debug agent API (changing system state!) - * 3) Throw created exception - */ - val exception = createTimeoutException(testThread) - cancelIfNecessary() - // If timed out test throws an exception, we can't do much except ignoring it - throw exception - } - - private fun cancelIfNecessary() { - if (cancelOnTimeout) { - DebugProbes.dumpCoroutinesInfo().forEach { - it.job?.cancel() - } - } - } - - private fun createTimeoutException(thread: Thread): Exception { - val stackTrace = thread.stackTrace - val exception = TestTimedOutException(testTimeoutMs, TimeUnit.MILLISECONDS) - exception.stackTrace = stackTrace - thread.interrupt() - return exception - } -} diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutExtensionTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutExtensionTest.kt new file mode 100644 index 0000000000..752c6c35cd --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutExtensionTest.kt @@ -0,0 +1,121 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.* +import org.junit.jupiter.api.parallel.* + +class CoroutinesTimeoutExtensionTest { + + /** + * Tests that disabling coroutine creation stacktraces in [CoroutinesTimeoutExtension] does lead to them not being + * created. + * + * Adapted from [CoroutinesTimeoutDisabledTracesTest], an identical test for the JUnit4 rule. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ + class DisabledStackTracesTest { + @JvmField + @RegisterExtension + internal val timeout = CoroutinesTimeoutExtension(500, true, false) + + private val job = GlobalScope.launch(Dispatchers.Unconfined) { hangForever() } + + private suspend fun hangForever() { + suspendCancellableCoroutine { } + expectUnreached() + } + + @Test + fun hangingTest() = runBlocking { + waitForHangJob() + expectUnreached() + } + + private suspend fun waitForHangJob() { + job.join() + expectUnreached() + } + } + + /** + * Tests that [CoroutinesTimeoutExtension] is installed eagerly and detects the coroutines that were launched before + * any test events start happening. + * + * Adapted from [CoroutinesTimeoutEagerTest], an identical test for the JUnit4 rule. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ + class EagerTest { + + @JvmField + @RegisterExtension + internal val timeout = CoroutinesTimeoutExtension(500) + + private val job = GlobalScope.launch(Dispatchers.Unconfined) { hangForever() } + + private suspend fun hangForever() { + suspendCancellableCoroutine { } + expectUnreached() + } + + @Test + fun hangingTest() = runBlocking { + waitForHangJob() + expectUnreached() + } + + private suspend fun waitForHangJob() { + job.join() + expectUnreached() + } + } + + /** + * Tests that [CoroutinesTimeoutExtension] performs sensibly in some simple scenarios. + * + * Adapted from [CoroutinesTimeoutTest], an identical test for the JUnit4 rule. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ + class SimpleTest { + + @JvmField + @RegisterExtension + internal val timeout = CoroutinesTimeoutExtension(1000, false, true) + + @Test + fun hangingTest() = runBlocking { + suspendForever() + expectUnreached() + } + + private suspend fun suspendForever() { + delay(Long.MAX_VALUE) + expectUnreached() + } + + @Test + fun throwingTest() = runBlocking { + throw RuntimeException() + } + + @Test + fun successfulTest() = runBlocking { + val job = launch { + yield() + } + + job.join() + } + } +} + +private fun expectUnreached(): Nothing { + error("Should not be reached") +} \ No newline at end of file diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutInheritanceTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutInheritanceTest.kt new file mode 100644 index 0000000000..7c8de53db7 --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutInheritanceTest.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.* + +/** + * Tests that [CoroutinesTimeout] is inherited. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ +class CoroutinesTimeoutInheritanceTest { + + @CoroutinesTimeout(100) + open class Base + + @TestMethodOrder(MethodOrderer.OrderAnnotation::class) + class InheritedWithNoTimeout: Base() { + + @Test + @Order(1) + fun usesBaseClassTimeout() = runBlocking { + delay(1000) + } + + @CoroutinesTimeout(300) + @Test + @Order(2) + fun methodOverridesBaseClassTimeoutWithGreaterTimeout() = runBlocking { + delay(200) + } + + @CoroutinesTimeout(10) + @Test + @Order(3) + fun methodOverridesBaseClassTimeoutWithLesserTimeout() = runBlocking { + delay(50) + } + + } + + @CoroutinesTimeout(300) + class InheritedWithGreaterTimeout : TestBase() { + + @Test + fun classOverridesBaseClassTimeout1() = runBlocking { + delay(200) + } + + @Test + fun classOverridesBaseClassTimeout2() = runBlocking { + delay(400) + } + + } + +} \ No newline at end of file diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutMethodTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutMethodTest.kt new file mode 100644 index 0000000000..64611b31e4 --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutMethodTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.* + +/** + * Tests usage of [CoroutinesTimeout] on classes and test methods when only methods are annotated. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ +@TestMethodOrder(MethodOrderer.OrderAnnotation::class) +class CoroutinesTimeoutMethodTest { + + @Test + @Order(1) + fun noClassTimeout() { + runBlocking { + delay(150) + } + } + + @CoroutinesTimeout(100) + @Test + @Order(2) + fun usesMethodTimeoutWithNoClassTimeout() { + runBlocking { + delay(1000) + } + } + + @CoroutinesTimeout(1000) + @Test + @Order(3) + fun fitsInMethodTimeout() { + runBlocking { + delay(10) + } + } + +} diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutNestedTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutNestedTest.kt new file mode 100644 index 0000000000..04c933d043 --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutNestedTest.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.* + +/** + * This test checks that nested classes correctly recognize the [CoroutinesTimeout] annotation. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ +@CoroutinesTimeout(200) +class CoroutinesTimeoutNestedTest { + @Nested + inner class NestedInInherited { + @Test + fun usesOuterClassTimeout() = runBlocking { + delay(1000) + } + + @Test + fun fitsInOuterClassTimeout() = runBlocking { + delay(10) + } + } +} diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutSimpleTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutSimpleTest.kt new file mode 100644 index 0000000000..513a884601 --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutSimpleTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.* + +/** + * Tests the basic usage of [CoroutinesTimeout] on classes and test methods. + * + * This test class is not intended to be run manually. Instead, use [CoroutinesTimeoutTest] as the entry point. + */ +@TestMethodOrder(MethodOrderer.OrderAnnotation::class) +@CoroutinesTimeout(100) +class CoroutinesTimeoutSimpleTest { + + @Test + @Order(1) + fun usesClassTimeout1() { + runBlocking { + delay(150) + } + } + + @CoroutinesTimeout(1000) + @Test + @Order(2) + fun ignoresClassTimeout() { + runBlocking { + delay(150) + } + } + + @CoroutinesTimeout(200) + @Test + @Order(3) + fun usesMethodTimeout() { + runBlocking { + delay(300) + } + } + + @Test + @Order(4) + fun fitsInClassTimeout() { + runBlocking { + delay(50) + } + } + + @Test + @Order(5) + fun usesClassTimeout2() { + runBlocking { + delay(150) + } + } + +} diff --git a/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutTest.kt b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutTest.kt new file mode 100644 index 0000000000..1f7b2080cb --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/CoroutinesTimeoutTest.kt @@ -0,0 +1,170 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import org.assertj.core.api.* +import org.junit.Ignore +import org.junit.Assert.* +import org.junit.Test +import org.junit.platform.engine.* +import org.junit.platform.engine.discovery.DiscoverySelectors.* +import org.junit.platform.testkit.engine.* +import org.junit.platform.testkit.engine.EventConditions.* +import java.io.* + +// note that these tests are run using JUnit4 in order not to mix the testing systems. +class CoroutinesTimeoutTest { + + // This test is ignored because it just checks an example. + @Test + @Ignore + fun testRegisterExtensionExample() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(RegisterExtensionExample::class.java), capturedOut) + .testTimedOut("testThatHangs", 5000) + } + + @Test + fun testCoroutinesTimeoutSimple() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutSimpleTest::class.java), capturedOut) + .testFinishedSuccessfully("ignoresClassTimeout") + .testFinishedSuccessfully("fitsInClassTimeout") + .testTimedOut("usesClassTimeout1", 100) + .testTimedOut("usesMethodTimeout", 200) + .testTimedOut("usesClassTimeout2", 100) + assertEquals(capturedOut.toString(), 3, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutMethod() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutMethodTest::class.java), capturedOut) + .testFinishedSuccessfully("fitsInMethodTimeout") + .testFinishedSuccessfully("noClassTimeout") + .testTimedOut("usesMethodTimeoutWithNoClassTimeout", 100) + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutNested() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutNestedTest::class.java), capturedOut) + .testFinishedSuccessfully("fitsInOuterClassTimeout") + .testTimedOut("usesOuterClassTimeout", 200) + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutInheritanceWithNoTimeoutInDerived() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutInheritanceTest.InheritedWithNoTimeout::class.java), capturedOut) + .testFinishedSuccessfully("methodOverridesBaseClassTimeoutWithGreaterTimeout") + .testTimedOut("usesBaseClassTimeout", 100) + .testTimedOut("methodOverridesBaseClassTimeoutWithLesserTimeout", 10) + assertEquals(capturedOut.toString(), 2, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutInheritanceWithGreaterTimeoutInDerived() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector( + selectClass(CoroutinesTimeoutInheritanceTest.InheritedWithGreaterTimeout::class.java), + capturedOut + ) + .testFinishedSuccessfully("classOverridesBaseClassTimeout1") + .testTimedOut("classOverridesBaseClassTimeout2", 300) + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } + + /* Currently there's no ability to replicate [TestFailureValidation] as is for JUnit5: + https://github.com/junit-team/junit5/issues/506. So, the test mechanism is more ad-hoc. */ + + @Test + fun testCoroutinesTimeoutExtensionDisabledTraces() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutExtensionTest.DisabledStackTracesTest::class.java), capturedOut) + .testTimedOut("hangingTest", 500) + assertEquals(false, capturedOut.toString().contains("Coroutine creation stacktrace")) + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutExtensionEager() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutExtensionTest.EagerTest::class.java), capturedOut) + .testTimedOut("hangingTest", 500) + for (expectedPart in listOf("hangForever", "waitForHangJob", "BlockingCoroutine{Active}")) { + assertEquals(expectedPart, true, capturedOut.toString().contains(expectedPart)) + } + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } + + @Test + fun testCoroutinesTimeoutExtensionSimple() { + val capturedOut = ByteArrayOutputStream() + eventsForSelector(selectClass(CoroutinesTimeoutExtensionTest.SimpleTest::class.java), capturedOut) + .testFinishedSuccessfully("successfulTest") + .testTimedOut("hangingTest", 1000) + .haveExactly(1, event( + test("throwingTest"), + finishedWithFailure(Condition({ it is RuntimeException}, "is RuntimeException")) + )) + for (expectedPart in listOf("suspendForever", "invokeSuspend", "BlockingCoroutine{Active}")) { + assertEquals(expectedPart, true, capturedOut.toString().contains(expectedPart)) + } + for (nonExpectedPart in listOf("delay", "throwingTest")) { + assertEquals(nonExpectedPart, false, capturedOut.toString().contains(nonExpectedPart)) + } + assertEquals(capturedOut.toString(), 1, countDumps(capturedOut)) + } +} + +private fun eventsForSelector(selector: DiscoverySelector, capturedOut: OutputStream): ListAssert { + val systemOut: PrintStream = System.out + val systemErr: PrintStream = System.err + return try { + System.setOut(PrintStream(capturedOut)) + System.setErr(PrintStream(capturedOut)) + EngineTestKit.engine("junit-jupiter") + .selectors(selector) + .execute() + .testEvents() + .assertThatEvents() + } finally { + System.setOut(systemOut) + System.setErr(systemErr) + } +} + +private fun ListAssert.testFinishedSuccessfully(testName: String): ListAssert = + haveExactly(1, event( + test(testName), + finishedSuccessfully() + )) + +private fun ListAssert.testTimedOut(testName: String, after: Long): ListAssert = + haveExactly(1, event( + test(testName), + finishedWithFailure(Condition({ it is CoroutinesTimeoutException && it.timeoutMs == after }, + "is CoroutinesTimeoutException($after)")) + )) + +/** Counts the number of occurrences of "Coroutines dump" in [capturedOut] */ +private fun countDumps(capturedOut: ByteArrayOutputStream): Int { + var result = 0 + val outStr = capturedOut.toString() + val header = "Coroutines dump" + var i = 0 + while (i < outStr.length - header.length) { + if (outStr.substring(i, i + header.length) == header) { + result += 1 + i += header.length + } else { + i += 1 + } + } + return result +} \ No newline at end of file diff --git a/kotlinx-coroutines-debug/test/junit5/RegisterExtensionExample.kt b/kotlinx-coroutines-debug/test/junit5/RegisterExtensionExample.kt new file mode 100644 index 0000000000..2de6b5b289 --- /dev/null +++ b/kotlinx-coroutines-debug/test/junit5/RegisterExtensionExample.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.junit5 + +import kotlinx.coroutines.* +import org.junit.jupiter.api.* +import org.junit.jupiter.api.extension.* + +class RegisterExtensionExample { + @JvmField + @RegisterExtension + internal val timeout = CoroutinesTimeoutExtension.seconds(5) + + @Test + fun testThatHangs() = runBlocking { + delay(Long.MAX_VALUE) // somewhere deep in the stack + } +} \ No newline at end of file From 47a063c0987177551bdbdf09a458998a30571ac2 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Fri, 23 Apr 2021 18:24:20 +0300 Subject: [PATCH 050/328] Remove the @ExperimentalCoroutinesApi annotation from reactive integrations (#2670) --- reactive/kotlinx-coroutines-jdk9/src/Publish.kt | 1 - reactive/kotlinx-coroutines-reactive/src/Publish.kt | 1 - reactive/kotlinx-coroutines-reactor/src/Convert.kt | 2 -- reactive/kotlinx-coroutines-reactor/src/Flux.kt | 1 - reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt | 3 --- reactive/kotlinx-coroutines-rx2/src/RxConvert.kt | 6 ------ reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt | 1 - reactive/kotlinx-coroutines-rx2/src/RxObservable.kt | 1 - reactive/kotlinx-coroutines-rx3/src/RxConvert.kt | 6 ------ reactive/kotlinx-coroutines-rx3/src/RxFlowable.kt | 1 - reactive/kotlinx-coroutines-rx3/src/RxObservable.kt | 1 - 11 files changed, 24 deletions(-) diff --git a/reactive/kotlinx-coroutines-jdk9/src/Publish.kt b/reactive/kotlinx-coroutines-jdk9/src/Publish.kt index cfd18d2b7a..529bc12fdc 100644 --- a/reactive/kotlinx-coroutines-jdk9/src/Publish.kt +++ b/reactive/kotlinx-coroutines-jdk9/src/Publish.kt @@ -32,7 +32,6 @@ import org.reactivestreams.FlowAdapters * * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi public fun flowPublish( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 8b94b95986..7ebe269436 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -32,7 +32,6 @@ import kotlin.coroutines.* * * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi public fun publish( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-reactor/src/Convert.kt b/reactive/kotlinx-coroutines-reactor/src/Convert.kt index 002baa6185..73cc336d0d 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Convert.kt @@ -21,7 +21,6 @@ import kotlin.coroutines.* * * @param context -- the coroutine context from which the resulting mono is going to be signalled */ -@ExperimentalCoroutinesApi public fun Job.asMono(context: CoroutineContext): Mono = mono(context) { this@asMono.join() } /** * Converts this deferred value to the hot reactive mono that signals @@ -35,7 +34,6 @@ public fun Job.asMono(context: CoroutineContext): Mono = mono(context) { t * * @param context -- the coroutine context from which the resulting mono is going to be signalled */ -@ExperimentalCoroutinesApi public fun Deferred.asMono(context: CoroutineContext): Mono = mono(context) { this@asMono.await() } /** diff --git a/reactive/kotlinx-coroutines-reactor/src/Flux.kt b/reactive/kotlinx-coroutines-reactor/src/Flux.kt index df5f64f262..63168a443b 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Flux.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Flux.kt @@ -29,7 +29,6 @@ import kotlin.coroutines.* * * @throws IllegalArgumentException if the provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi public fun flux( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index 8969662adc..c4370afa89 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -49,7 +49,6 @@ import reactor.util.context.* * .subscribe() // Will print "Reactor context in Flow: Context{'answer'=42}" * ``` */ -@ExperimentalCoroutinesApi public class ReactorContext(public val context: Context) : AbstractCoroutineContextElement(ReactorContext) { // `Context.of` is zero-cost if the argument is a `Context` @@ -62,14 +61,12 @@ public class ReactorContext(public val context: Context) : AbstractCoroutineCont * Wraps the given [ContextView] into [ReactorContext], so it can be added to the coroutine's context * and later used via `coroutineContext[ReactorContext]`. */ -@ExperimentalCoroutinesApi public fun ContextView.asCoroutineContext(): ReactorContext = ReactorContext(this) /** * Wraps the given [Context] into [ReactorContext], so it can be added to the coroutine's context * and later used via `coroutineContext[ReactorContext]`. */ -@ExperimentalCoroutinesApi @Deprecated("The more general version for ContextView should be used instead", level = DeprecationLevel.HIDDEN) public fun Context.asCoroutineContext(): ReactorContext = readOnly().asCoroutineContext() // `readOnly()` is zero-cost. diff --git a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt index a64e6d02ed..2aeb994de1 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt @@ -26,7 +26,6 @@ import kotlin.coroutines.* * * @param context -- the coroutine context from which the resulting completable is going to be signalled */ -@ExperimentalCoroutinesApi public fun Job.asCompletable(context: CoroutineContext): Completable = rxCompletable(context) { this@asCompletable.join() } @@ -43,7 +42,6 @@ public fun Job.asCompletable(context: CoroutineContext): Completable = rxComplet * * @param context -- the coroutine context from which the resulting maybe is going to be signalled */ -@ExperimentalCoroutinesApi public fun Deferred.asMaybe(context: CoroutineContext): Maybe = rxMaybe(context) { this@asMaybe.await() } @@ -60,7 +58,6 @@ public fun Deferred.asMaybe(context: CoroutineContext): Maybe = rxMay * * @param context -- the coroutine context from which the resulting single is going to be signalled */ -@ExperimentalCoroutinesApi public fun Deferred.asSingle(context: CoroutineContext): Single = rxSingle(context) { this@asSingle.await() } @@ -75,7 +72,6 @@ public fun Deferred.asSingle(context: CoroutineContext): Single * resulting flow to specify a user-defined value and to control what happens when data is produced faster * than consumed, i.e. to control the back-pressure behavior. Check [callbackFlow] for more details. */ -@ExperimentalCoroutinesApi public fun ObservableSource.asFlow(): Flow = callbackFlow { val disposableRef = AtomicReference() val observer = object : Observer { @@ -108,7 +104,6 @@ public fun ObservableSource.asFlow(): Flow = callbackFlow { * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ -@ExperimentalCoroutinesApi public fun Flow.asObservable(context: CoroutineContext = EmptyCoroutineContext) : Observable = Observable.create { emitter -> /* * ATOMIC is used here to provide stable behaviour of subscribe+dispose pair even if @@ -141,7 +136,6 @@ public fun Flow.asObservable(context: CoroutineContext = EmptyCorout * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ -@ExperimentalCoroutinesApi public fun Flow.asFlowable(context: CoroutineContext = EmptyCoroutineContext): Flowable = Flowable.fromPublisher(asPublisher(context)) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt index 6b299437aa..f3ae65aadf 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt @@ -31,7 +31,6 @@ import kotlin.internal.* * * **Note: This is an experimental api.** Behaviour of publishers that work as children in a parent scope with respect */ -@ExperimentalCoroutinesApi public fun rxFlowable( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index c096c0d254..7300b484c9 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -30,7 +30,6 @@ import kotlin.coroutines.* * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is used. * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi public fun rxObservable( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt index b0ba4ab2e0..dfe4c055f8 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt @@ -26,7 +26,6 @@ import kotlin.coroutines.* * * @param context -- the coroutine context from which the resulting completable is going to be signalled */ -@ExperimentalCoroutinesApi public fun Job.asCompletable(context: CoroutineContext): Completable = rxCompletable(context) { this@asCompletable.join() } @@ -43,7 +42,6 @@ public fun Job.asCompletable(context: CoroutineContext): Completable = rxComplet * * @param context -- the coroutine context from which the resulting maybe is going to be signalled */ -@ExperimentalCoroutinesApi public fun Deferred.asMaybe(context: CoroutineContext): Maybe = rxMaybe(context) { this@asMaybe.await() } @@ -60,7 +58,6 @@ public fun Deferred.asMaybe(context: CoroutineContext): Maybe = rxMay * * @param context -- the coroutine context from which the resulting single is going to be signalled */ -@ExperimentalCoroutinesApi public fun Deferred.asSingle(context: CoroutineContext): Single = rxSingle(context) { this@asSingle.await() } @@ -75,7 +72,6 @@ public fun Deferred.asSingle(context: CoroutineContext): Single * resulting flow to specify a user-defined value and to control what happens when data is produced faster * than consumed, i.e. to control the back-pressure behavior. Check [callbackFlow] for more details. */ -@ExperimentalCoroutinesApi public fun ObservableSource.asFlow(): Flow = callbackFlow { val disposableRef = AtomicReference() val observer = object : Observer { @@ -108,7 +104,6 @@ public fun ObservableSource.asFlow(): Flow = callbackFlow { * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ -@ExperimentalCoroutinesApi public fun Flow.asObservable(context: CoroutineContext = EmptyCoroutineContext) : Observable = Observable.create { emitter -> /* * ATOMIC is used here to provide stable behaviour of subscribe+dispose pair even if @@ -141,7 +136,6 @@ public fun Flow.asObservable(context: CoroutineContext = EmptyCorout * inject additional context into the caller thread. By default, the [Unconfined][Dispatchers.Unconfined] dispatcher * is used, so calls are performed from an arbitrary thread. */ -@ExperimentalCoroutinesApi public fun Flow.asFlowable(context: CoroutineContext = EmptyCoroutineContext): Flowable = Flowable.fromPublisher(asPublisher(context)) diff --git a/reactive/kotlinx-coroutines-rx3/src/RxFlowable.kt b/reactive/kotlinx-coroutines-rx3/src/RxFlowable.kt index 445a61401f..9357f2834a 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxFlowable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxFlowable.kt @@ -28,7 +28,6 @@ import kotlin.coroutines.* * * **Note: This is an experimental api.** Behaviour of publishers that work as children in a parent scope with respect */ -@ExperimentalCoroutinesApi public fun rxFlowable( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index 5c810c498d..57007bbdd4 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -30,7 +30,6 @@ import kotlinx.coroutines.internal.* * If the context does not have any dispatcher nor any other [ContinuationInterceptor], then [Dispatchers.Default] is used. * Method throws [IllegalArgumentException] if provided [context] contains a [Job] instance. */ -@ExperimentalCoroutinesApi public fun rxObservable( context: CoroutineContext = EmptyCoroutineContext, @BuilderInference block: suspend ProducerScope.() -> Unit From e61ef4bb731932bb61f3bbbe6781d15bd92deda5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 26 Apr 2021 19:06:33 +0300 Subject: [PATCH 051/328] Update Kotlin to 1.5.0 (#2674) * Update Kotlin to 1.5.0 * Update atomicfu to 0.16.1 Co-authored-by: SokolovaMaria --- README.md | 4 ++-- gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 376b5a68f4..6a38dd4c07 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.4.30-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.5.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.4.30` release. +This is a companion version for the Kotlin `1.5.0` release. ```kotlin suspend fun main() = coroutineScope { diff --git a/gradle.properties b/gradle.properties index 15935ab114..ef7c01ef37 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,12 +5,12 @@ # Kotlin version=1.4.3-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.5.0-RC +kotlin_version=1.5.0 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.15.2 +atomicfu_version=0.16.1 knit_version=0.2.3 html_version=0.7.2 lincheck_version=2.12 From 497312e95a0a28b68f064debc6097a2a3da1dddf Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 26 Apr 2021 19:18:59 +0300 Subject: [PATCH 052/328] Version 1.5.0-RC --- CHANGES.md | 32 ++++++++++++++++++++++++++++++ README.md | 20 +++++++++---------- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 089b1991b3..25769073e7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,37 @@ # Change log for kotlinx.coroutines +## Version 1.5.0-RC + +### Channels API + +* Major channels API rework (#330, #974). Existing `offer`, `poll`, and `sendBlocking` methods are deprecated, internal `receiveCatching` and `onReceiveCatching` removed, `receiveOrNull` and `onReceiveOrNull` are completely deprecated. Previously deprecated `SendChannel.isFull` declaration is removed. Channel operators deprecated with `ERROR` are now `HIDDEN`. +* New methods `receiveCatching`, `onReceiveCatching` `trySend`, `tryReceive`, and `trySendBlocking` along with the new result type `ChannelResult` are introduced. They provide better type safety, are less error-prone, and have a consistent future-proof naming scheme. The full rationale behind this change can be found [here](https://github.com/Kotlin/kotlinx.coroutines/issues/974#issuecomment-806569582). +* `BroadcastChannel` and `ConflatedBroadcastChannel` are marked as `ObsoleteCoroutinesApi` in the favor or `SharedFlow` and `StateFlow`. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release. +* `callbackFlow` and `channelFlow` are promoted to stable API. + +### Reactive integrations + +* All existing API in modules `kotlinx-coroutines-rx2`, `kotlinx-coroutines-rx3`, `kotlinx-coroutines-reactive`, `kotlinx-coroutines-reactor`, and `kotlinx-coroutines-jdk9` were revisited and promoted to stable (#2545). +* `publish` is no longer allowed to emit `null` values (#2646). +* Misleading `awaitSingleOr*` functions on `Publisher` type are deprecated (#2591). +* `MaybeSource.await` is deprecated in the favor of `awaitSingle`, additional lint functions for `Mono` are added in order to prevent ambiguous `Publisher` usages (#2628, #1587). +* `ContextView` support in `kotlinx-coroutines-reactor` (#2575). +* All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646). +* `MaybeSource.collect` and `Maybe.collect` properly finish when they are completed without a value (#2617). +* All exceptions are now consistently handled according to reactive specification, whether they are considered 'fatal' or not by reactive frameworks (#2646). + +### Other improvements + +* `Flow.last` and `Flow.lastOrNull` operators (#2246). +* `Flow.runningFold` operator (#2641). +* `CoroutinesTimeout` rule for JUnit5 (#2197). +* Internals of `Job` and `AbstractCoroutine` was reworked, resulting in smaller code size, less memory footprint, and better performance (#2513, #2512). +* `CancellationException` from Kotlin standard library is used for cancellation on Koltin/JS and Kotlin/Native (#2638). +* Introduced new `DelicateCoroutineApi` annotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now is `GlobalScope` (#2637). +* Fixed bug introduced in `1.4.3` when `kotlinx-coroutines-core.jar` triggered IDEA debugger failure (#2619). +* Fixed memory leak of `ChildHandlerNode` with reusable continuations (#2564). +* Various documentation improvements (#2555, #2589, #2592, #2583, #2437, #2616, #2633, #2560). + ## Version 1.4.3 ### General changes diff --git a/README.md b/README.md index 6a38dd4c07..76adb21241 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.4.3/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0-RC)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0-RC/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.5.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.4.3 + 1.5.0-RC ``` @@ -91,7 +91,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.4.30 + 1.5.0 ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC' } ``` @@ -109,7 +109,7 @@ And make sure that you use the latest Kotlin version: ```groovy buildscript { - ext.kotlin_version = '1.4.30' + ext.kotlin_version = '1.5.0' } ``` @@ -127,7 +127,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC") } ``` @@ -135,7 +135,7 @@ And make sure that you use the latest Kotlin version: ```groovy plugins { - kotlin("jvm") version "1.4.30" + kotlin("jvm") version "1.5.0" } ``` @@ -147,7 +147,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```groovy -implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' +implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC' ``` This gives you access to the Android [Dispatchers.Main] @@ -180,7 +180,7 @@ In common code that should get compiled for different platforms, you can add a d ```groovy commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC") } } ``` @@ -192,7 +192,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.4.3/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.0-RC/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index ef7c01ef37..be8d5fa670 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.4.3-SNAPSHOT +version=1.5.0-RC-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.5.0 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 04dfa8a9fb..6748a2f3df 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.4.3.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.0-RC.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index dd18d96662..385afecc07 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -9,7 +9,7 @@ This package provides testing utilities for effectively testing coroutines. Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.3' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0-RC' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index d5bd2320b7..3fcee41901 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 43c91cc161b91da1d59a4a5ac724708000c52521 Mon Sep 17 00:00:00 2001 From: Pavel Semyonov <42832629+p7nov@users.noreply.github.com> Date: Tue, 27 Apr 2021 15:01:52 +0700 Subject: [PATCH 053/328] fix: remove coroutines-basic-jvm.md from TOC (#2676) --- docs/kc.tree | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/kc.tree b/docs/kc.tree index 9cc0a28c5b..c9d93fbb48 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -10,7 +10,6 @@ - From 5813f28f1f084b7a462017bc1b9c3e65e7a2c71c Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Tue, 27 Apr 2021 11:07:43 +0300 Subject: [PATCH 054/328] Fix typo in GlobalScope docs --- kotlinx-coroutines-core/common/src/CoroutineScope.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index df2ee615dc..627318f676 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -163,7 +163,7 @@ public val CoroutineScope.isActive: Boolean * * ### Possible replacements * - * In may cases uses of `GlobalScope` should be removed, marking the containing operation with `suspend`, for example: + * In many cases uses of `GlobalScope` should be removed, marking the containing operation with `suspend`, for example: * * ``` * suspend fun loadConfiguration() { From 1b1d7896a8a35711eb7c817ee9ff91c3c7727199 Mon Sep 17 00:00:00 2001 From: Andrey Polyakov Date: Tue, 27 Apr 2021 19:56:18 +0300 Subject: [PATCH 055/328] update: update kc.tree (#2666) * update: update kc.tree add a redirect config for the previously renamed file basics.md to coroutines-basics.md * fix: fix the redirect --- docs/kc.tree | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kc.tree b/docs/kc.tree index c9d93fbb48..8626f0c562 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -9,7 +9,7 @@ - + From 32336be8fa90818cff9f2ba3c36b3f7c89e079c4 Mon Sep 17 00:00:00 2001 From: Stefan M Date: Fri, 30 Apr 2021 14:11:25 +0200 Subject: [PATCH 056/328] Replace deprecated UseExperimental annotation (#2684) --- docs/topics/compatibility.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/compatibility.md b/docs/topics/compatibility.md index a9414432ea..974481161c 100644 --- a/docs/topics/compatibility.md +++ b/docs/topics/compatibility.md @@ -80,9 +80,9 @@ It is done in order to produce compilation warning about using experimental or o Warnings can be disabled either programmatically for a specific call site or globally for the whole module. ### Programmatically -For a specific call-site, warning can be disabled by using [UseExperimental](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-use-experimental/index.html) annotation: +For a specific call-site, warning can be disabled by using [OptIn](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-opt-in/) annotation: ```kotlin -@UseExperimental(ExperimentalCoroutinesApi::class) // Disables warning about experimental coroutines API +@OptIn(ExperimentalCoroutinesApi::class) // Disables warning about experimental coroutines API fun experimentalApiUsage() { someKotlinxCoroutinesExperimentalMethod() } From cc6c41d56868fe8bf1e98df8a127aba81318b2bc Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Tue, 11 May 2021 12:17:38 +0300 Subject: [PATCH 057/328] Fix a typo in an exception message (#2693) --- .../src/junit/junit5/CoroutinesTimeoutExtension.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt index a3e7713a5c..442fdf8cdb 100644 --- a/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt +++ b/kotlinx-coroutines-debug/src/junit/junit5/CoroutinesTimeoutExtension.kt @@ -12,7 +12,7 @@ import java.lang.reflect.* import java.util.* import java.util.concurrent.atomic.* -internal class CoroutinesTimeoutException(val timeoutMs: Long): Exception("test timed out ofter $timeoutMs ms") +internal class CoroutinesTimeoutException(val timeoutMs: Long): Exception("test timed out after $timeoutMs ms") /** * This JUnit5 extension allows running test, test factory, test template, and lifecycle methods in a separate thread, From 9d2a7560f8988c942009ca6e108195345cf0d408 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov <1580082+sbogolepov@users.noreply.github.com> Date: Thu, 13 May 2021 15:10:35 +0700 Subject: [PATCH 058/328] Add support for watchosX64 (#2679) --- gradle/compile-native-multiplatform.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/compile-native-multiplatform.gradle b/gradle/compile-native-multiplatform.gradle index 50ddf975f7..73e99e8465 100644 --- a/gradle/compile-native-multiplatform.gradle +++ b/gradle/compile-native-multiplatform.gradle @@ -24,6 +24,7 @@ kotlin { addTarget(presets.watchosArm32) addTarget(presets.watchosArm64) addTarget(presets.watchosX86) + addTarget(presets.watchosX64) } sourceSets { From 0dc50e94b2cb47bde44a49b942bbb83df8b8a852 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 13 May 2021 11:11:27 +0300 Subject: [PATCH 059/328] Rename TimeSource to AbstractTimeSource due to KT-42625 (#2696) * It is the second TimeSource in our codebase * Also make it abstract to let CHA kick in Fixes #2691 --- .../{TimeSource.kt => AbstractTimeSource.kt} | 22 +++++++++---------- .../jvm/test/VirtualTimeSource.kt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) rename kotlinx-coroutines-core/jvm/src/{TimeSource.kt => AbstractTimeSource.kt} (73%) diff --git a/kotlinx-coroutines-core/jvm/src/TimeSource.kt b/kotlinx-coroutines-core/jvm/src/AbstractTimeSource.kt similarity index 73% rename from kotlinx-coroutines-core/jvm/src/TimeSource.kt rename to kotlinx-coroutines-core/jvm/src/AbstractTimeSource.kt index 8d6dea2fb7..3f7ac67537 100644 --- a/kotlinx-coroutines-core/jvm/src/TimeSource.kt +++ b/kotlinx-coroutines-core/jvm/src/AbstractTimeSource.kt @@ -10,21 +10,21 @@ package kotlinx.coroutines import java.util.concurrent.locks.* import kotlin.internal.InlineOnly -internal interface TimeSource { - fun currentTimeMillis(): Long - fun nanoTime(): Long - fun wrapTask(block: Runnable): Runnable - fun trackTask() - fun unTrackTask() - fun registerTimeLoopThread() - fun unregisterTimeLoopThread() - fun parkNanos(blocker: Any, nanos: Long) // should return immediately when nanos <= 0 - fun unpark(thread: Thread) +internal abstract class AbstractTimeSource { + abstract fun currentTimeMillis(): Long + abstract fun nanoTime(): Long + abstract fun wrapTask(block: Runnable): Runnable + abstract fun trackTask() + abstract fun unTrackTask() + abstract fun registerTimeLoopThread() + abstract fun unregisterTimeLoopThread() + abstract fun parkNanos(blocker: Any, nanos: Long) // should return immediately when nanos <= 0 + abstract fun unpark(thread: Thread) } // For tests only // @JvmField: Don't use JvmField here to enable R8 optimizations via "assumenosideeffects" -internal var timeSource: TimeSource? = null +internal var timeSource: AbstractTimeSource? = null @InlineOnly internal inline fun currentTimeMillis(): Long = diff --git a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt index d2dcfd2f89..bd9a185f6a 100644 --- a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt +++ b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -42,7 +42,7 @@ private const val REAL_PARK_NANOS = 10_000_000L // 10 ms -- park for a little to @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") internal class VirtualTimeSource( private val log: PrintStream? -) : TimeSource { +) : AbstractTimeSource() { private val mainThread: Thread = Thread.currentThread() private var checkpointNanos: Long = System.nanoTime() From 0fcd1d8b2c683b9851650f89ab22cc5552579ae0 Mon Sep 17 00:00:00 2001 From: Pavel Semyonov <42832629+p7nov@users.noreply.github.com> Date: Thu, 13 May 2021 16:09:31 +0700 Subject: [PATCH 060/328] update: new URLs for WebHelp XML schemas (#2699) --- docs/kc.tree | 2 +- docs/project.ihp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/kc.tree b/docs/kc.tree index 8626f0c562..bd37d87ff0 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -1,7 +1,7 @@ + SYSTEM "https://resources.jetbrains.com/stardust/product-profile.dtd"> - + From a3b60437d3462d5037f3ac88f5556e1823fb481a Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 13 May 2021 12:16:05 +0300 Subject: [PATCH 061/328] Fail-fast in emitAll implementation from onCompletion (#2700) It is helpful to prevent bugs like KT-46013 and potential deadlocks or delayed cancellations --- .../common/src/flow/Channels.kt | 1 + .../common/src/flow/operators/Emitters.kt | 10 +++++++- .../common/src/flow/terminal/Collect.kt | 6 +++-- .../test/flow/operators/OnCompletionTest.kt | 23 ++++++++++++++++++- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 4b50ad3108..5cc8ad8b35 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -30,6 +30,7 @@ public suspend fun FlowCollector.emitAll(channel: ReceiveChannel): Uni emitAllImpl(channel, consume = true) private suspend fun FlowCollector.emitAllImpl(channel: ReceiveChannel, consume: Boolean) { + ensureActive() // Manually inlined "consumeEach" implementation that does not use iterator but works via "receiveCatching". // It has smaller and more efficient spilled state which also allows to implement a manual kludge to // fix retention of the last emitted value. diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Emitters.kt b/kotlinx-coroutines-core/common/src/flow/operators/Emitters.kt index e0d3aebceb..90879a97f3 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Emitters.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Emitters.kt @@ -194,7 +194,15 @@ public fun Flow.onEmpty( } } -private class ThrowingCollector(private val e: Throwable) : FlowCollector { +/* + * 'emitAll' methods call this to fail-fast before starting to collect + * their sources (that may not have any elements for a long time). + */ +internal fun FlowCollector<*>.ensureActive() { + if (this is ThrowingCollector) throw e +} + +internal class ThrowingCollector(@JvmField val e: Throwable) : FlowCollector { override suspend fun emit(value: Any?) { throw e } diff --git a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt index 42c662962b..d26839f9ea 100644 --- a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt +++ b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt @@ -127,5 +127,7 @@ public suspend fun Flow.collectLatest(action: suspend (value: T) -> Unit) * Collects all the values from the given [flow] and emits them to the collector. * It is a shorthand for `flow.collect { value -> emit(value) }`. */ -@BuilderInference -public suspend inline fun FlowCollector.emitAll(flow: Flow): Unit = flow.collect(this) +public suspend fun FlowCollector.emitAll(flow: Flow) { + ensureActive() + flow.collect(this) +} diff --git a/kotlinx-coroutines-core/common/test/flow/operators/OnCompletionTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/OnCompletionTest.kt index f55e8beeb2..0ff2e0b836 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/OnCompletionTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/OnCompletionTest.kt @@ -1,10 +1,11 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.flow import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.internal.* import kotlin.test.* @@ -290,4 +291,24 @@ class OnCompletionTest : TestBase() { val expected = (1..5).toList() + (-1) assertEquals(expected, result) } + + @Test + fun testCancelledEmitAllFlow() = runTest { + // emitAll does not call 'collect' on onCompletion collector + // if the target flow is empty + flowOf(1, 2, 3) + .onCompletion { emitAll(MutableSharedFlow()) } + .take(1) + .collect() + } + + @Test + fun testCancelledEmitAllChannel() = runTest { + // emitAll does not call 'collect' on onCompletion collector + // if the target channel is empty + flowOf(1, 2, 3) + .onCompletion { emitAll(Channel()) } + .take(1) + .collect() + } } From e13b2044f3aaab699e967c7c251f5b73454c36ba Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 13 May 2021 12:16:50 +0300 Subject: [PATCH 062/328] Fix sample code for ReactorContext (#2682) * Also add toString implementation --- .../api/kotlinx-coroutines-reactor.api | 1 + reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api index b69bb334d7..4589117c94 100644 --- a/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api +++ b/reactive/kotlinx-coroutines-reactor/api/kotlinx-coroutines-reactor.api @@ -35,6 +35,7 @@ public final class kotlinx/coroutines/reactor/ReactorContext : kotlin/coroutines public fun (Lreactor/util/context/Context;)V public fun (Lreactor/util/context/ContextView;)V public final fun getContext ()Lreactor/util/context/Context; + public fun toString ()Ljava/lang/String; } public final class kotlinx/coroutines/reactor/ReactorContext$Key : kotlin/coroutines/CoroutineContext$Key { diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index c4370afa89..a8e247fc95 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -27,18 +27,18 @@ import reactor.util.context.* * ``` * val flux = myDatabaseService.getUsers() * .contextWrite { ctx -> println(ctx); ctx } - * flux.await() // Will print "null" + * flux.awaitFirst() // Will print "null" * * // Now add ReactorContext * withContext(Context.of("answer", "42").asCoroutineContext()) { - * flux.await() // Will print "Context{'key'='value'}" + * flux.awaitFirst() // Will print "Context{'key'='value'}" * } * ``` * * #### Propagating subscriber's Context to ReactorContext: * ``` * val flow = flow { - * println("Reactor context in Flow: " + coroutineContext[ReactorContext]) + * println("Reactor context in Flow: " + currentCoroutineContext()[ReactorContext]) * } * // No context * flow.asFlux() @@ -55,6 +55,8 @@ public class ReactorContext(public val context: Context) : AbstractCoroutineCont public constructor(contextView: ContextView): this(Context.of(contextView)) public companion object Key : CoroutineContext.Key + + override fun toString(): String = context.toString() } /** From c4242deb2b548a89cf4ad44f5b57d872c4a66b8f Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 13 May 2021 12:17:02 +0300 Subject: [PATCH 063/328] Fix a flaky test (#2677) --- .../test/PublisherRequestStressTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt index 9b069dcaec..a19ce2f49a 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherRequestStressTest.kt @@ -74,7 +74,7 @@ class PublisherRequestStressTest : TestBase() { private var demand = 0L // only updated from reqPool override fun onComplete() { - expectUnreached() + // Typically unreached, but, rarely, `emitPool` may shut down before the cancellation is performed. } override fun onSubscribe(sub: Subscription) { From c3d711b14f164314a2dadc3424f6196918b0a5fe Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 13 May 2021 14:44:27 +0300 Subject: [PATCH 064/328] Revert displaying fake stack frames as method calls (#2695) Reverts commit https://github.com/Kotlin/kotlinx.coroutines/commit/b61a66c7a565d8ca635a38e178564adbbbfaabd2 --- docs/images/after.png | Bin 160118 -> 297058 bytes docs/images/before.png | Bin 98194 -> 161429 bytes .../jvm/src/debug/CoroutineDebugging.kt | 65 ------------------ .../jvm/src/debug/internal/DebugProbesImpl.kt | 34 ++++----- .../jvm/src/internal/StackTraceRecovery.kt | 17 ++--- .../channels/testOfferFromScope.txt | 4 +- .../channels/testOfferWithContextWrapped.txt | 2 +- .../channels/testOfferWithCurrentContext.txt | 2 +- .../channels/testReceiveFromChannel.txt | 4 +- .../channels/testReceiveFromClosedChannel.txt | 4 +- .../channels/testSendFromScope.txt | 4 +- .../channels/testSendToChannel.txt | 4 +- .../channels/testSendToClosedChannel.txt | 4 +- .../resume-mode/testEventLoopDispatcher.txt | 4 +- .../testEventLoopDispatcherSuspending.txt | 4 +- .../testNestedEventLoopChangedContext.txt | 2 +- ...estedEventLoopChangedContextSuspending.txt | 4 +- .../testNestedEventLoopDispatcher.txt | 2 +- ...estNestedEventLoopDispatcherSuspending.txt | 4 +- .../resume-mode/testNestedUnconfined.txt | 4 +- .../testNestedUnconfinedChangedContext.txt | 2 +- ...stedUnconfinedChangedContextSuspending.txt | 4 +- .../testNestedUnconfinedSuspending.txt | 4 +- .../resume-mode/testUnconfined.txt | 4 +- .../resume-mode/testUnconfinedSuspending.txt | 4 +- .../select/testSelectCompletedAwait.txt | 2 +- .../stacktraces/select/testSelectJoin.txt | 2 +- ...edFromLexicalBlockWhenTriggeredByChild.txt | 4 +- ...acktraceIsRecoveredFromSuspensionPoint.txt | 4 +- ...sRecoveredFromSuspensionPointWithChild.txt | 4 +- .../StackTraceRecoveryNestedScopesTest.kt | 4 +- .../test/exceptions/StackTraceRecoveryTest.kt | 12 ++-- .../jvm/test/exceptions/Stacktraces.kt | 17 ++++- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-debug/src/DebugProbes.kt | 2 +- .../test/CoroutinesDumpTest.kt | 6 +- .../test/DebugProbesTest.kt | 10 +-- .../test/RunningThreadStackMergeTest.kt | 8 +-- .../test/SanitizedProbesTest.kt | 12 ++-- .../test/ScopedBuildersTest.kt | 4 +- .../test/StacktraceUtils.kt | 39 +++++++---- .../CoroutinesTimeoutDisabledTracesTest.kt | 2 +- 42 files changed, 143 insertions(+), 177 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/src/debug/CoroutineDebugging.kt diff --git a/docs/images/after.png b/docs/images/after.png index b1e138c68279eee31d03a286d6faa7cb6025773c..4ce15e8b4e635e033bca77ae40e66ae1f840c1ef 100644 GIT binary patch literal 297058 zcmYJZb8sfn*2eoLlZlhb#G2SPC$??dcHY>wZQHhO+qQY!t9Mmb_j-Eo zwVvM&m6aBOgT{mg003}eqJr`Oz>gUK03;0(^k2j@=5Gc7EQDN4kWbMSnFM5CX-LQI4?PgSzb;~X|*O=af%6XvPv^l3|;>NkvTuD_q(&lvdJ=PlHxn$D>! zY2fw*L5P|Dm>BzYGCPj5$#LiVRj2J125ATY(hu*y*B1k%&;Levkk&2u{}=xMM}An= z|L;_+t8cdd?>;&7vN%}Wn!1^m*18;JX{CY$3i3~mQM{_@uHPxy+7U?8Rk6n=JS(mQ zPZzB%jM>E-t-hF|H}5fTK>_bFpw=(};xp{XLb1qjAFsAnRvwb-FI=IL5MTPpq07ZQ zULNc2lOdcIt}wF-u(M5K`for0X(>B?V${9?hcXZo-7%UxQ?E z`tUcDbQrY9OOYE194wL@~~9 zbvcX6Lkyp`ZU-ad*7+YK6(L+tRt{X*YFs3eo2-e}zj&JERD`3u7{b0H))%3W!tO0% zy(#g?#U=i_wY62;F2_ZLW8Sk^k3hHEd?exo{WoL!gx&D6339niCz0^i-ZyJuht)JD zQN80yPZ-Q;{rnuE=Q|gBm-`HNQt&W%R_^dv-(OPSttQW$s;YpnPl!H~S}1IK%+p%V zpF7NQy%-R`$P+mZWK4`_E#4}Y(I(E#EkZvIRUvuFxWWL?uk&)~*J6GpC8&wW%&5iZ zkvpp_xQY4l<5~OMUIvlV7P#HflvxKJZRF19PNi|WwUt0vgSP><4UG~>@ecMOr@=85 zp09zaE%?`F{l|ZGz3k zQUA#1e6blgU)chg<0Drb3saVUFYl(dnr9rl#fvvhXQIT=+B>HA(sW5k620fVQczEA z)%J8TTbZ6oeV+UyM^tjEe7~^hj-kGQ8XEd9TD@Kd|Zg7Tzpx- zJo$iA4_5Y-`}Iz4D(SSR$Ezi7F-{-y_nSFR`ugQ%VfNHt_X}?cv^w?-ZiOQ$P7lL3 z-)b$*%-AVDlu187MLxN*oC;88`Ada4a>cO&_fG9u&1ne<3yR96Q>X$$UNa)Uq6t`S z^RyD*XeUV|Pxdl-aU)?u>lx92!qbiiN2u=0IB84OjxYtP!DA#O)mWH%pbS{xmeAok1qGeVnvJZC92}5TfwG67Zqhg|sXU3s2cD;b3VG-*t zu;_t~erd_yH}#cz<;#MvRneRt;&}4Sv~tL}ZYGCgC2&~RFBPyUXHHgg4LQu5FqE%F zKN^`;`tC(?ERE|w853?3ULZ%(4omdBas^sMh$_sMnj{a$&&2gfjk~F%dz%0 z>IL9reu!bDui+A9nK;MIY2~X!)hv4k2eskjTV91e;wiG0m7avL@wCvn$eV|#IPQ&w z1?Loai;q$7uKmOWb>({pE3ik?B~J0Ak<4=}Vx0NdeifVX%|R1&-Omh@<~VRL7eq1! z$n5@^*K-d6lnEGqWxp)=u$1#>z6Z4JN@wfo8hyDg>!OZgYMbe z1QHg%G8J^e_QMV2%g#RJ_T*tJiqBMW2fM?0k*v-2L%9k-EFqicx3o)mv&=>5Jv8+e zhn2ubWeBq)u)4Ed&(q$vqPCwVd*=TB(h0RgVKwJgXI%WC=KAUX@HZPfII9x%*DB z$c9Yi{sHk4T5>!#{2jptj_13ZYn!{&HH$9UdS9Q}1sK||Xud3*PKb6})rks}-sJsf zO-1JR$PEXtha@XOsiFAD_wcL*z`ml?1$l8rNcI= zPi~w0V~ep{xD*EdxHenb3Ivw}_M&=XT?JbnJ?8>ir0`8nfXCB74rnuh=@Ij9iJ$z% zvl0hXsQlgYyGS{YGJqIqd1d3FYYthQscX*9opzm!%Xjzbx@+knTxg|p@_?VPLV+J8 zBX=6jliL{wcBk)OKPn_-u4G!Ua|lnwLefHfR-|+w?Oh4GxDVXEA}X~L>VXntjUttt zsz-Nz{9ZGY3)B$ih?o#STvwNE9E(Uz@?|~nP&!JGQ|8$)5Vh)ip|^4czwQXNpyOY|+L+<@+6O6381-nZf|KC1jUeY7DdKVUgW?Q$1Xu zP`0;*4!+kCBZZoSB-6EZLkca#NH^|(WXZR)jFISf^XqT7Zf)05+BKuMJ2p1M-*z97 zY#|gxK2O4+_#VN2$`%&Kol>#;v;a(9{#k%58h4wak)6}D85g`)pKSJ@nf!CNYc7gE zAZsJ`I2q@&hX)}ji-Y=a_Rt7U&9qsktDkcbpA-+q(WsvM)`{7cFrXPIJvOu=nC= zCnwT+C#;70=f zb)+iL6DPE>L26hq`sMc3n&7I93oumZ00Z3xD3U&Rjs-!v%Dc@&&&;7FOsNE4R( zosa~d&@a?quVZHX&SAWSWL<-ONyn;=o3tJWi2yrhCTpPUvV)k8VZS-63;}bLrB;C#@|Snt(NX9I0mF_ zEuHw&DEPEX?gHq!SzBJjoWg~PjU&iu*8L*C(%51IvUSzqQ+AGSNF;DHsy8Ino_9KI zO^ zdB0iB=EB%15r#D$No1686Gi|k6>f|n3u?<`E|&IN!_X}B13a^&lv_>jn5Arbz0=aF z^6l|@Gl6DTsrkXdQ7=!|L3L8dZQXMmn1%#innucS&aqe72!wz?3;odcp$ik5ED%Cl z{w3^u*~e7y*^^r>>0-{dJr_s$=WOjK2td`zA&a42Lxr;Fq#Dj8lUvMHyl@|DanlXD zFrshbMeSE(9vCly4+G{Ociq8I@zT8P`bsm6(eD<66AH=McqeXm{CS@xA{H3_0e_H`=ceWg4bLcB?cl(aR07-Z1P?BtQ^3{x=E`@RU@5{1e>#} z@CPWxL&5Kl+*pu4mVLI4`OUgVs(Uu@@=v$$E1G>BH=wSUm$gIY*qE4ns)p&RO~CoL zaGi!g-i4KAv1()Bz|~lzqabgouPY`ZOs?S=BF1=HRi3PN0Xka_R&Z&GIH|O5Q|cP% zR;Mw5*TS?@IP#L-kPa)?>z^U^cj`{x(cb0bkC~>;5}bN-F%mJtgYE=dZt@%l4xe#-r>e29IK96 zZK&m-AMbl~YQNHAr_$UCkh2`;S?ZZ^gfud-de4fCJe*&2{Fg3#(I{Ug`4DzcGF{dd zi)I{|adUIXBdLN&BbVc5G_R2V_GAy++qOJE$l`djM0QP$UZ}nFHZ`(w(Hl*(GBcU; z(1s_oNb$ss`)9=x%(8ngW@A|_ql|dK*xIXJ?ER|Ig7dPt*d}(>*D(>`KZysAWG`Kk z)BtYmIgex6o7IA{h}C#d(7SaSJm8Q4uW6AVd=E3mn)TU#hvqTCho@@4Me6TWbWEox zFV@Pn)mJyHR-HwPX{=Q8i1eUGGbTIoB=J*g5m@R44B%OY7hMFtRd|;`z6;`uFGX-X z8k@O3p`w($-_~}sGjWbyIY6@xV+^eIKGQi3e9W+Li%ytR@b|?mh4n3N0J>5rLm zr0$kspr64JFUHp?&FMtQ5ZouFPrzPPyRAABjTa)!{%+Xj79PGzslIt(bbJXP)6POe-O8+?8Ex&X++3IKf*lcB=w7v|PK1Np|cFWW=?}wWLwoO3l zhjF&ky%z8I%u4D^0Ux6Bg)kbfY#=7M?1IfVqLAWN&#{tirpU+j0UB3Z8Y7UGU(5Y) z{wz4qPri13#agC0nkevt13uk~f~~&r0-0rfV#BY;LOm_bSHqiwdn_lBn|E}}S=nZ# z4uLmXh`e#`MSQ|DZBW#+Hp57=(h;aV*VnwR?B!io}+|hFbg1K5Of9|<; zzvbKGqrDKSuG?cnUU{ytwy0KSx-I(%uW#1=adbB465^|i|9>2ukjM}2A}eC+k}_(t z*%QaHqm7AhP7Tc0%XVy^(?!Huc`7;b1~7nnrZi0=*?@i}rYDPwi%2`UKutlxM+-83 zwb%yHf`MrC^7aMSLftx!BJ??mvErJYsyDU(IpZeRcQ(Y9W$ z9s=HpS!)(E&cBF_hnh*4WZpE*A|-}NQq(!g60l}6yrRq%g!`AtbRwn=hNocgKo@e@ z?O>e?{50&7#(3bkToF@|+@_Rlgu|!OvvYJlHA{<_%tMxPp;0bSK6ffB!>v*gyuBcSJ9!O@tenpQ*~dnH zy$waPxl1Q@uM{TVQv%oWwm-~5&0pL9Y>ed235XnQm2XuqHl^tJR8x|N)*m`uIec=~ zx)k+8`=hL*Mv4ZV$Uw~3*woB7`A{!NY+~JEA*V=Fh{ao>l*=OR`5tLEmy}!pv7IQs zsLrRgc8Eo7KIgWOQ9VPHe0l zPVPRj7^z_$K}2Aou|4`{cJSl%A_IJnb)uQh=ET1Y?ryqzQAxe zj0I`9_5#AYxtP&Hh+Rb$Hvi=k;8B~{7i)j;w5YqLG10u)4=Q9Ok?P>q+nXexzry{i zrbA8gd*F1l)P_bQ#|s^mesg~ftop?hs$~ik;h_Ls9B9zHZ--|RXYmC9>m7TokIlZCv)PDo2G zp`(=YFly<(>ub@y2gMBe^8`#DIj{lWE`uoK$%kF}smi9)XcCld=iwf6X}tCl-`)a( z^_tq#ePhVpWefq&)&goFtvaG#h-h`ItNBZ$kVP#O#JTJsc*8{b$sw(=Q$V@ z$@-!~=12r!8#R1KlWigT{)me?Wkh`Pl!!^Vxf{K~nD0lWsUWxU&_jZ^&1SU>O2&U3 z>om(!8J6kjwxcy(HAuN0`hst>KeKtoFA)?_(eYk{KA#=(Ds2Lc}%Ab<{xSi!aD zPw-b(3P63CnB{}>{b7hUppey;Qk+s~qcGG-4qX}-~PY&pxbgP?h|bqBkfU-$6B-|vyDd2Vz@7mE6A@FFifNU(W zA9{81LUD|fQH@WwxRE$dW4g~>jHpIfYEk1;ghXt15!vE!o%Xf2cUhVvD(nnG`WM~2 zJwM1kfEp}S8lYOdal9@3B1n|ZLd5EJvrv=MT0bbOLkixT&PXnQ$cb!fr7+vxGTrV^ zJncI+CK^rhD_Qv?BhXfVA5Nk@KL1NraMS+=h{d{?u+$V;QSsNC!}znR16auBxm98% z8roT}4;A146UIN;y*OY$Bc9I)cg_VKfYhUEme4pNAGQad@oyU<-HQf#P3G3L&tnMER zxJ-e29v;pBKRjTGDN33-uhnTwV#-nfhZS4W_f)UG;uNlk#!U zg`CATWp#S*Ic}s1K!FS!+9SW7$8wlWfph~Qr0MW8w>L+SzCUz&W%o80^#SefwhiD@%e3XWJv$smqb(BTS~#IAs24R8Ggj}JT*H(bW~u1JaI!hB zUFt(IKK9$*1T87JQRY>jFrW@2{Koia&3dn8&QL;6{h9vy!m9M;{nAD*omGahM=JlI zG4k?^)S(smvMyme@0vE{VP)-}&99EYa4=dZ8Mn4(<$g&aT}Wx#Ptla467|${zq*Jn zCMaY;J_YQQ2tE*g+gWby#=9-YGm}MqJOV<=69)YnUgm73K3ysJDcop?BnciZyN{_;xI(KfF@_>Ou&j4Se^ zPG|Jbj|AiW_uu|e0~$oQP@s@xNIql3Z24{I23f`a!)mAzH^^Q%2@xy$L#3Rdrl1Jyyb ziSfL}1)9!0eq;(;7*yz@p1iz{(`)*GjLdng%J%B(X@RFsYo(5%l?vV{s_cjYauMZi zdkpZ4z?>*HxxlPM{QILmt%2%>!RbeeIxX``2Zzas`89sIGMqIRNpx+~3$R>fX**hS z+nbkW9{Z4-f{FSkdKw*-NVob?7;%{Zf@cN2&aB{f3_m02@msXva|ABAmDDb zal%7Sl$pc5e@lRu@B?+H|RHjD3Z@1J<%pu^1cfvcbI4{sZ@4>bzqi=E(ZB{2K(nZwC28K?t)m z3B@{}yL%+VP1? zb8}QFt_$SFI?6(aD%#MMfOP~N91JZW z7RvwP=#fL=p>5|TS5PGvd@K^V#Wse%utRgbSCqcu1)hr zg8T+DHy?Vzqma}izaM$IG=8jT`TQp-EEoO9W?dM`TVaP#-r`B=5*Q{NMJTUq)@)3| zf~tC{tm&FPZ=QLpCRJ4%@F<7)`6;=0KtGh9AJ?8x_;0#aIWqFmA}R6hUAW>jXp#9< z75m;9wiD&LkAZN-C7nKzkRC^*CXqb(0@&i#Kh;qrg$}s)*T+V3G}bhPM1>{ClO~ST z!kZ05a@ZM>BiSl9NtT)8f-^dGDTkM-r@5V)!LbKI6R&+;yObFsw$^YsUp{=YVC@9)+bf0@N74@Sr3sm!GFug9%K8 zZYAL+<|!}k03s9p+bU3DMxwm+dlTQ{9t#-N(113zLfx=2(Y+C((EGF5aLhquqZK}e#&WI-`2n@QqRmB$ zLZu`H+PJ!c@2Q*+Om!<;;@9e&qEfMZ?&W?HsT#h*9CZbP@*P9G>uM`>YFb`Nb^y^O zI^w)#i!#1d>9~cYl=%oHLi0$CNoWs~eW-jc1E%9%*xXye!O=%hQ=gnWoI=Z+NOF{8 zE$qruW67W*TkV8y*pm>?lhQ-*E5I~oo3_c^iwd=oKj4-m3eW3D@;|Ym1zo969iV1vPx~ z(0;O2GhmV^eq8?_TQI(edfo)Uy(%I9jL~6}+AE90>%K7x|0s5S1-fs%n9B7XVo^Mp zK_R=z;8bh>rdvF3JFdu)QQlO$#;UdU?2S%*AkWXE_$;v*xfAle25LXwL4Vx*hY+K< zDeb(frN*dEcLy4vN7-4uJviFYGiL7DQn|x=lwb3b!uyHh2yfos!mrox$*Nb`lt^zJ zVM%vCJdL`=NzgA-gnd2*RBJjr>;k{Evq0|A0$i&nTayK6jv=i^dujVSRJb@i5_)X4 z1$7t9v*~QE+kxGC&88a56qO@k>qkI`CrNLaX`fUFf~L!=N;5B1y5Pa4!?g5SH*3y` zR!dX~$}+cy*Qgn;U<)_s0l}0{wz=W=E7o2HIA1zjHKiecu5_EJOwUXlx1kE%?8jGj zrI1i%#YD%QdX4*IhT^Ss)Vvfc?eWa!_&Qsw69Ec*Oyus$FfY%qn3N5tGEH6CL=(8C2 zP9~nqgSPei?RNTkM%y5jk+DU$+EK?O)3&sYmc=c{Ki5_Fxe9iho@0|gDdTZW_NQrz z)8g{`m8&4tx|uo4)6PEN_!t>E%&?;{;w1u%ri`@HQfpHe%F`5_t)VnJS={^E)?tob zfv#XvZwFqw4XF7Dh}4{I(KH+W{=v3{L*2mls9y>#obB8eh@~1Zq~%kg>$SH-7iwRU z?j|CZTWVUP7SU*xl&&pnq+e%?5jM@>v}uPtgM_+I9S~o);Q3`Y54kl;+_P9q!8C6t zZNb6c2|wjXX`vF`N!|n62EM}~6=-Ms-=;MX>dY^r<)ZEG26=vJgWbgW5iY+4RBHp5 zm!C%~+ubXu!vorGCU&1W{#v@4f8ldCLu|2u|srEn)7} zusXdqF9YvSeSR2w*k7v`tceov>e%feXqB#1KO4CF?|7|f&AVtWM0Nh{LUaS^py}iB ztGa9Zvv)_K^_VGg-YK9`)dF0S$?ZKcOUKda7!P0?_onzWcd*w`jes8yx`>=f9br{0!eA{{^eS6SP)cTw3N+oHf%M$R` z0qXUTS(o0-Ca{(H@tMk<-_G))MFuTC3;=~x^8Mao>ZY3tQH!VXW_)nEf1_NsAk06A z1nuG1M&$iMMwUadr?$RVp%%)M3yuP6u~~#e*SlCrKYB+fKvr2zyf`~ZyXrT;Vs(7L zKMKDjs{Fvb5-vBKUD09%0dYc;Z@` z8vKD3hSi9Pd|ji|fXU`M1N@%eQtKJEvi$xsotsU;SZ;-mW>}>w*{#4F(q&745a+pe8tzV0Eb}WxYqQ*XFw6es4`!lP5 zFp`un%)wk04uZ!&8hWqb?^KLJDze$VY_ddFyN$K|NXnqV#>?1v&04Z}LN5g#kvD6m zY{l7t&fGQ_@_P~-j*is?#D|FRYCb5k_WAEQEC$b6Z|4)?J2Fqlli7N1+#YmqiZo#a zyx7By=*vy6heWva(urs}ICYwfmFm+S|IHw!e4(@kB3gryNEOi7f64QY)hYmQ>h`n6 z%=lrEl_m4-S2xi6=1a;FC0S*FdBD(aCo7YW6en%LhV|mAQ@i{~j7!UN$z~#AA9Tj? zXKRMbH3QDJN-8t9$Dw+$99LMD_VZuc0LsO>i*r^?_O`_ns3&R;11jZBU!JqeoNdeo zo538t1a-{*CZS^E{-6~Ob>!AgL{tY5fBP6^Y=>9L9^c~-?#63hEUqNl1hCFWH3uff zRFe_y*ALd~I^1o_F+|7DOWkT6lk&R122UGDwu!Q#bqzT;o9}%xTl%qY?*d5p{oRdz ziiHT?cT?W4MDwh5gL69GYz>jQ65<=4^sI%jrX)|E;Ael99d}GQ{H<5pv>ZD3g`-Tl zUm#!{#yaXQh^nQq46NPQ;IRu`G=pz>61Y20Ta9$&d_iGjKz(;E-w*mB{Gz*AY`Cm< zT45@IjfqEz=C+xC$r?@?CH@@@P0!_l>vZj_3MKd)7+jDUB?1sEcDV8oTQAw2-pV~+ zKkLx(VczxHeBM61=)W}6SI>8h?%-lMnhiR6Pm7J=l?$`^Qu6n~#%)x1XD}S>iM1P_ zMZ}{ia1+P&G}PKqJ-x@AJ&G&WnxaDyelS+?$fGXSHn8?9_0^H_)R-+g+#k+9+c@E@ zwH`bgTt}jXiyz2FssF2pN822SY}TnWw(6#1CA5m77Y|S<8U+IjaJ?;O8XNiKIec>v z`4ccmD1I}gH@Lk_z6-ci6`>3UU;IUUWJ$_7Q>9|V)#5xet3@R$v*C$P znhQqPWOe;jDI9IhVG5hsTVuL9w9^th>5Xk@HX6j^YrNTJFg}}~E^}t4J{)1i({Wnz zn_4*1e5sQ#U5qlBi0X(nv%%~o^563+jgU!$&WJmsXp$r8B`?-pY`8B(7$vn1p3>4{ zyWrfs%AS*?Vwbnp9zX03{NFQ+qITG}KO4+k^rB#WCZ4;loGwygju!6s9=#;qp>$g9 z1?6+}Ze)5xeiI7MWb+Xepd9^u$vs~M=?`}mR}7UOpq-?g*#l$1qm1ZY?m9ii^`@YT zCzStpB4`by{mte|_zXcP_WR!8sDjhtX>^f@zaR%sr3WcKk-C6~-6dhj)$0jLI?u*` zgyT7pn7C}32!(j#eC1;yXY^;GeZWENc+np~Jts_b_yHzjZX95_KFOF>`GZ7>&`o=z zF)A|J5eqe0wTLI+9%j=Uvk9#~E2E|QU0AGu!}NQN%U#SGUx$+-TJ!B)LL7PU%9GQx zsX$OEuUupj%@2_fMX=W9jpu;q)o8Ju*DCYirr3#vLgedNQ3?zFF)jokNG*>8RK>M9fxIZ9^M2J! z&75mT#R;PDC}x;;GgU_KW<|6%o-_DF@NS-oqihE+0-Azaek`E z=H$kBlk@sHjY3H&&3HgZpL}N6K3Cbdb`7xWJWF2S#A4FJ?iJnt_GJbRF1H%v_|Q09 zsIDw1PsW;SfbR2V0&Ov8XRFj(PYjBoMK~47YkKK!ZERECsL+8)Gn@Vgxftga8B>e4 zeA4~mKI~BbkL8CrTe+t3nz#2gDM?9WbfQxKUzMA~xoHA!;#^|lW{{nqF2bzndCV$Cd))XB#4hwCP&7>itV#vEN|E>y-^%YXe<#Q z-b*uGZ7pN+azX+X%56`UI|LvHBs8YgGjlh;VnPkw$1`8p*|I2X07MjnRe_i!^DWY5 zZS41toOM>qyZe=!Wv`oVfw4(6v4DcL2D%e}qHjV1KrCitekIGK48aa#n1Ulk@R8Q= zQn^78NJ`VijP1luLx6~`kDk7DWmQ0)d>rxgg%#@R5vrsq?D=RWPoVQxqm9$NrQby zXQx`LWVyRk1@Et^aTz5fu=IG`YY!d}0YHjy8NXv-0&d07@egoFgEjbU+3Hv>aNVPo zipzvrvukb&`N9L+94x^Ei`=#!*#>kdGopwH3xX5mNn{O9MULhRs|aRP=SPI?g4^Bw zp4r7ICN)q&sSjAQIa&&^K1OC*-O`zc3492GN`sMJ3)Q{mkd6xP){~|;%RZuUTeU9v zTUw{+0DrA&Jpo2MC{2}lyPztsBR1mZm^UV}X{j(*B5Ie6h#`K#*c7bb{9Hw=!zoO* z()Tt#RAWm(j>ZayD!|m0H%>Lv7%m8w#Ypbc)_h|nE$VjwJc6!cTV%X|n7*UDeVSld z-n^aNf{37iBGuw$;@>L1GFft=U?c>J7oCR1)B`8itJdxO0- z7woeA1Jo`@6Gx1t77>k{kCJR4RTzOMj6!_^W*mIq+yq$!d?OekqQz|Wc$64?6lwx= zQ>zx?{aT#p1&o-ow3A!ut=yJPfadR+)3l6dFapsy-V#kZK8xjQz3r<6O^$Z!d|~61 zEjw4C%EYK2aXA&x+aQGyvj9EbJzl_2K-pcA6Peg7x6My%|AN0R83jZjWvf^Lu_x;q zM0U*0cv2#M1U$@Vx7332wFSJ6aa4)62FQCyb#(*^q$D*Pqt@4c*{dtZ2#`82pz~yx7it>hF9%|F+rC2eWR8zO`Ko0O>TfjX~zW? zV(i$LM(EDh*ndLeCo!+rMxwyM&X_jb9nL4@v1t!}WMViUI@3h}L_>nt6C38yz$+ZdTh z{m85VBQ@JL)C&p~x+izQicTllRwSXCkm_>bynU*lNpDVrKVQhJ{rSNi5OMvvzLWx- ziYThAIA^Cv$D3B#4T8OkrsgvZPy9fDwWX%5*y+T;14Az9oyld1#MJd6n@&yPh(KR9 z;8(%)_?a%<39LAg?RaZd?z>=cu=m7LAQQUS=%SRqaIHu6)@ z4`g`j#~;pyV!24rNIsXdD^ulJB7ZY=i2PfnGEKy`nO&X0F$qi!wO__{6jZ&Ax(t;F za%BV|VY8;ogHv+@GZeyZNr++uB?Dz*=T%bb{W>uG%2pLtmuj-?Omt&{C)05S48*jM z{g9b>c{`r=iTh{2FwEx*eg~ChS}nDPHx{0v(eRQuO=72|c(0O`BEMd(|91L>srzR2}OMZ+Bia9+d5j*U&lY9*d3uiWrJR7tmZFIqgyWtKKN-5(_oL5WC#5<|VS!bUqJ zZt%hq+S)1h20x6c`n~xFuQi$qo5L{QfkiBV<RcE ziiz=CA9Do*C$sd8jDi$3qoH^b5d>c~#g=tMGwAWX7ANysz+lD|^^{9D>oTRCr~tg$ z8K^GrAj-{;zeuB+FSfLKjP8GIcf7e_DAgcVN)qkeKq1mkSYe-W&ULxw3k6BAK$f!` zl{08_QAbUmKCJg{ITWd@rTeBG)87{BXZYMXF2)!zqC1v^=E`Bl2hEBB{^V>+!IFz< za`P?3JY3@O8cOvx@&#SdW zU5~d-zs7KzD(YS83JumuCeQnL20{3BME$D8^=npG;L=Z;!L8E%@rRe@!8%YBMUo9g zY8^wKzJ;2A;3?Eia5!%J8ou!$NpR}pEw|{*Vhd*VtI%nA+cb>L0{s4p$)0=Gw8k0% zNF|rWfe39SSkhe=SzCuX4|_)&+hLa*GK)my+ zSK0fCbOJR+F1^$QdP)8ajn2-1%!C0n|9euowWB(pbXmcl|Hn^oMmgvDZgCc$_vWXhUjXQC0+ z>W>9`l+{>;T~%aaDbyvUavs)8M=^Q`V;UGS&j&>bsU%FKp_%Mx>IzFb_QWwTW4aN!fWZ2hSvK zgGIOk7mx!kdb^wJB-BKTkRX7HYUM~0+=J0vTl*su$bmErGA!MMG1H$gnLq;G5|JgR zL=D=xf0D3oe$$!=Tjkdc$;_ieD>iO_;(cMb?#m^mCaESKGhSi_F4My*zuSU|?>oD~ zG%w6lWU!5-vgTN&!kIL|i{m%@8=%HGJOucUoCij}9|N#!9MtxWivW1j z5=rF+BjEn_bi(^Io|)LRMecu-1#0=t7EK&o7zHda12v0T958E|&QowFOXfon?V2$0 zOML0LR;&hD$W_c4&zmuVlQkG~S9e{OBCsaaWI6g+8M7PZeP}Sz<8d^v6ul!UQpLttp$t*$~e$I8AW0UR#MGg!@eo zzrWA!`=v6_Tf`^F<8!NSTJcE68)&prixBLUq_9+dK^WVgs2H30lOk1>S(q^i#r%Zx zH5M^sOuP;f!O0qbRI2fg5brfaj5RA2#D)1T)o?kcpisLNm|z)lq2Zr)s3Gq#1-LtFh0dNGgyh6wj6_sRJBJ1c~Eg+JYj3t*=(P zu`XcyVI4;Yhhz|Qk z3`F*IkeOE<=ki8qPaoC3b1R3Z{)`&yrj!PX4F?@0%DBmeQe(mvDE+LC(mml+Yv%N6 z7NlyZX*O6;*Y-6%oZM?U(aQ4}71bb-+J>cFgeYFGxx`XB$(fZ@wZwyL)r9MYC@NMK zpJJl#rAy6WQp+WgoFL~EGZ4DdY+Ia;vh*}Mk+Eqf4)@>m*YO}Kp(Q|lI@=C{-v-GP zE}s$T?>fgqM_mt)>VM#(*2z$Uk2JD5T?p;jEVOsB8pam{4f;HfMv@yP4yclj=S%1K zo(b1m$wfUh?H0vKWw8u`>Xkw=16jH8OaK<`aR%7<8||)?X*@Gk181XgOFHwY)0{14 z%k5g}6XbvUMOBhmTdudl9TGW(YHEfUFulM&3~v<{=z{n72p2AtnL1Y{J7qF0(Lvzl zGKmPqu-sJAt&)&1Ny=TZaeTa+l8dEil^<@BMAjSo;=~e(h{Y)DFw=Q#c1U8O&PVJN zg)Klz!VR0ja*lIoiSGSlQ8jhV!{)3--x8CQN2ezq z0g_R4Y$S|48TrpYl&Gftd*-VmnyAilrA+S^sa!+zH(_#I-yZff)-5ZJcam+qyBKj| zTn^@0^5(p}eLP}7hI{}*GaW4}IXe%vMs8m&X42sdjU<2C;|ehsb#Qz#Eh4$xBOm2? ztrk8f^X*~qN5)582Y;%j$!d+zysxxhiAstOWFEV z!OiD=Pc!#Mo?k*TDMLmlMP#&`7D<>rQr-)HsAdfAv#W@)ESaKKb9vH2YG}bKGtqAf zvx7w#93ak7(UIs2sGOMBUZ8{7G-z&Tybu=>9WN_=xq)>q^@N!Bcanl80U3ELB~wnY zxt3xYhMeMr%IFKm)$pEn*9+A+Yja&w@jUz1H6!8vo z;i7RPhCm+;dsLhyxTu5dR$9p+CUSJY+g^Y1(~u zhw-~k1@3nyjpn`8?&DP&)RvUskv=;OYWyuvWiH#ka$8w zvyUSM3r#4LoBlV*5At-L0WelSfQaZ$-^MzAr+Pmx1*NY@Fh5m2p}FRm+cx;4DCywn zj#n%zSQzGHK{<$J(7QZF0-;zM0Qwsrf$eAO6Sbm$OUdBnx|HAb*lZcnkti#OXY7$}A^T{J-=FBQrY7>EFr?!7;z%sS56_fD2p$9Uqo zKZS2X`Fw;WPd_CZF}{5lHVyuPApH=tXXy<0L1ZaIAMJooF;tVN+Dzh3yJog=G^hvD>DCq@Zt)NeBw9{*_s|DFC5p$>*KMdMC> z!-i3rVoAPBSid(&X}(bJ&`5RwS#q(*+MG1g-GzXiZEEBdfkntwm*w92WfY zRt$k_%V#g{9jb$4IwuUd)&BZ{aGnT691lEP_h9qiUKCL1c1Z0yO^h$6b?Z?&1AYcD z@@r2_^W;k)>o`uPSC1TB4030f3%v3HhishuQ)>I_CHqop!(R(m9hO!`{GNv&$O>V| zE?REdQGZVGV4^Y}MWJ-*%3&;(ynF5Ta$~azy{@>*m5k4IJ`LCZeXm?{e0D5@sa!Tt z&b+h<>Be1`jCJSqb{`#gbB~Vd(5P*bTT46IT>mf}ye>78qzR>AXF5gs)m15{(@?di zm5WT^?Y7+uD<0Of*(yjyuOdT!2SWr~vw57y6s^hibW>-L8zVgXOLG=%4EnqETD2&J z$Ki@vEG)?0?iz4~>B~2V6o<3uNUq+}rK{|f|2c#JWZA^Y0RRg#y~t?!v){?TUG79Z-jdgEv{ zjn1u3I#fSA_opyXg<<*oZpR+__#syOxVh_#$jgVbPsbC!{H3agF};iyXMcp_$3n@) zllhwMn-|=@uuT&7!LvCcE)>t-f!evpBuWDAGnp4*gHXEmjw6MlL08dP+jrcdCkypg zw|W<3!loBlZ^B6K0+*#(dC#GUOZU$KnmI8533C@Hpa|7#-27F!;42!q$Z=WOhiM}( ziEFzo{*&v9db%R>gR{%0MWB#$;RXm;A(V$d<>i947^0p#9^roiE7F?!7A;xA$R0_H26nt*S3yXjNXwRadoDY4rIg?Ktr$i7hq^ z`H9C_xq^HfHGW^BZ8F`_?|QqmAq7WfpFDMKio&<^a}RC#&K7|Xpwm`_uM#Y&b*FAr zS;C~rZ4-=Ez(%AQbD=-x?|9mBIoC>;<7EU&>=RypGx%2uNz%xND3WoCdO_L$&^2&V z3mA)b&3sGLolE>C6FJB}TglH%5xP$DUUX|z9`J{E zZmT_-HhPG0+H#X95Q&CWAmVgF5uCl-TX1-SJvFkpo(BrU3OMc|CgE)~UUUwQ1%$O=+nb(aE~u_c`U(lQkN(9ao0`!$54NTuq@w!H?7D@Qh+vS*$B4 z<`aL92&kGv`B&!t!)C2R&-cdVMg`-z@;G?NLE)-Xuj}>VbkQI-Tdh?$f%0x(#Su8I zZk!8eAO)G;uP8L+y`6<^6R8BK6HJs zzQ0CLAPskP)Tl+v+$MUv+AYi6Iy|cFE_Nx&s0^^w__TOFym46xzu%63z1-J!p%CvN zCYRw9)$>rCk7I&A05zw+rjZA7-r~6))&!Pdx_)ITUkVPZaj=~m*UBNDl#tHYW z>sr>OXUFMY#30}r5twf9b2|A;a75~NU}9n7+kfRg@@ODY$b2+^bxy^$!VKI?wp7K0 z__;3y1HC1DYk;Z7%1ar;S%zKm;(4V}#q#VvZ2iPAJrAMxLbRHMpBZGChlWGd)^jWL zRN0+()GaO$P{5uQOlKRbb2#P8d2uwd!1C~pe?p}E0h!*JbfnAg>(S#Hy}7Km7UuF3 zkt0~+Dz`_chi-vGUFU>Gnu~5Sal`Q!zSeucrwY-H<(P^_s|MEZTTl2CpQH&Yk6O)PQF*O$U#| z;`vRQDJKR=ShJV}80Rq}z?2K{T0$O+EK4ocpEE>(KpCXH^323814-QA^$C zM_&sGJtyU>_jVDQa)4zv`Pr?;)!tF7w?|0PdlH&- zXHSi$fCk3xtPiMNfj{T=Wfh;#*<`lnk^uL3xmQc!%T<-(_&hstCVF^Y5Bg)} zaAhqoVH$>A=@820jZ!+G+4ta{8?Ijwj7Z*k#Mf6yeI>D+^v^9RNR%Ct$+*rEkJ zF@8D;@^s1e5_}lwa67H!&!ZJx)YQ7u!sy3-DEaF2NeCgDg_RE~FBtiNNx93-^WUW-W;vVIzFj&o(a&XGx zOc?M}<0BWmX8uGfOS)RrkBO3f0!%vadF@w$GKPHIXWy^>9wd0nvI;Iu3=m2G*NG1Y zYo*}g+P|kA-4voy$NU>-_i20$P?anAEW~;d>fv)A?I#fr12JTV!L0(Zdr6ft-q*ce{<|9pPxdIjwA z=H}>K&E15HUZaQcDJ*4=0k=PYct*!Tw@hm{y4^Y>O8)=1{&gmwZNZs}W0V>i5FmBM zB1MbYPYbwg^}Yl9!~}$b0)$;Ew+BgF)~uY_nBv3i%$Xe9l#UCu!#9G9i8uN~`36%n;+fvG=Wp#Rme%j*0@aeRpTzjKy1k)JS25Y| z_OErz*#iOr5Ff-z!efaN$9e=RP!YZ@wE1HXAhi2)>@bF)PwpaG-u}~65h?Wsvv6vD79s_%R|V{drF&@9;eSOP)3HLMi0r!qjn~)=gr`Jsj0UMR^|g1{yTLf zLd<3-SK=$@!&}*NekIOUZWm*N$aT8TZI+!7-nDq07u4(bC@q{_^!k_7_uwSqGKm~w z+_T%wPK8|Nfz_FO2qogGTvVS|ky>4@=7?)nln*nsxO{(qK&u1MBT?8n`*S4#DQGg2 zZ2zf)nkgvKY$qAlJmQL7IQ;kahRZL0oOZVW(2=N4VXFj~S#$sX$Cpb!3LlqW{N|EBE!4!R|lr{g=D>OI_RfdbX0F9%SR3 zk<1zKuwV!}ZyHTH;n(|!LEIWXjG$UEGrlO|ErUyIEdq{byC4G*Lwsap&`$VwgLF>y zF?Ygv063Ru@UPy)a3~}k$Tv4mQY21G5z2RF_kho^-Teg91|0sCv?X(rB13(R{@sJR zPRqA%e5?JR2pM#YYfz{p1I>T*^I>jToUp(kqG3k2YL$K=yrK4b*^%~)e4_%^Sx_-* zKr8G948W#CC`Ny|Uh5k_0f-y1PYD58q)dT-?>MyoqJa1?T z3}v6b-d+LW&$%q}iYYs&0ojpQyiUK*G7zk9w~N<8`;ar&_l>g%*_t6PN4C_;xJrh# zUTpI2aFzunZqEI8PJHsF{`aaZgt zM&*38L$jlowxIFrqpp#c_PgtH1aUYHF`xY^fd~D8LIwFsfl~kDZ z2ifvcxF6Mb!SvsaGxp$L(Su!m4uoyW)mRRQ;^K}Va*vSR-<}T9s=b(wzwdvrMU`Nj zF%8dur^Fry*1tn_S-G36%zA+PdayYN#3)MTITmXctNN7$r%EO81)ouR=j1c$70;>p zde8r4M!Ug|85nue;j66)dcifSsN-3!r5&!NB?BsfbcE(;sa|)=l`H8~prH1l2P2^n zptgQXQZvHcPv0UO?BBQ?-zgO0hvadRDQ=k?$QFG$5h{u^HC(I!EOTW>`;=e-XN{Un zq8Q<%suBG-|j+VT(S2)y=fit0%DeQ{|J(sV`8L4IIx#Rs<{y^!%(#^mAA z5Iv*-2FTzF8eb=?x~8BMYJF(`Z3bFOG$MFkU$j&><%1`)O&B;rDD7=~k#g{2(K>*l zt=aZXncUV>hF+(ITJJnTFeHWslbRv;K7#&&W2+aDbv0Oi##zX=1}klr{wessKj2HY z!GfiE=mh-@qS{8M6RH@<3I53j#J%18m#tRJsm2?Te<3M5u>oEHak z*h(Z2_Xz-A8t0?K)JUA3G{L*RYj~E!TKmkesx3Sob-4PsBai}oOh9LgS@+%YfIb!4 zi6rKmkKH@vGV;~ch7N)V5C_a=&WbD0E?g#Rr0OT=vM zn{#NnP8WA2j@DAsLYV|q&E9jjZKvcZ<~yNE#Vlj56@oY_5KMpu=eT#?*Mq+1s1zeDnQ6!Rm(UK5UO~gXQ1Cn?2e$ zh4j zGKqTY4jQaSJIAxHIYK!?BWGhe@nVpGbk~cjyZ#?6N7G(Bp6l}#k(-PE*ppw6}W5Ct;@ZywM6 zAfQSPllHFPUc7b$BpNiT?eWO$nVc4-iGY%7+{jlsQqRn=Tts~k0PX>-f7+DuY-z97 zelXaI?>A&q4R9`=b=#^=e>3k7A5oDM$Pjp$Jj@|%@?!Pe z2N@*l+VaLJ(FWUzB%tkfIi3_oV3NdU-&!y2#?jbu{c6e|Y9rR|ND;^pxVw8^le}#ukeX&h>lFXWxNBNo<#}<6z;*U63HgHGZ{G=%Ta(>h~V) z&ig$lmh=QD$g#lP_gIL`or^Q>mX|R%DV$zIh=yUw(g1n*r`q0v1AAeNF)MVOz8JYW zd)#1LFbKeXuwKf*`3kEkXH*s(2X1eAC8;tPX?QDgC2oKJ3#%)VYz{(YYTx}Vt2flS z5E45P?cMe{!mnlsb;gjtmC&MGkAPiDBhI-feA!VE+|6 z)a$K*1SH`Nr_P{*^|Ub5*9knbd#}BY4`Ww8)WS^O57wfG)|)R*Vc4AWEJjBwhG5xp zA`M3vh4Z`FhsDs4@70FiO2S_H!e#2D(dCxq%pl*xpwN}kld-h%Mypz64f0q{E_}DM zT+NaN0(lVk72`F%`9gkf5LcykLdwa4$)tw#T$PexPfK@C&V>A4fI8E|BlFGQ8ev1* zwZ9kR-Z?j_6Pq+obvHB4v8B?4J6}M;(-lXq(A-KBz9&d>WJd>)Snp22JBw!iBVAW# zxPhPe?CCDSqboKC-vbm_97@o1v7FbTyXDE18*>5<`FmG6TQYJMywITiobmDv)$vc~ zD}tLo>30F?FqMbXNHk@okF#ad4aulZr$P(Fj)jIWpW2OND|FSHj!2Y=Gv|wW!+k}} z>c-;@uQmzz#k~HwH4MLuCpiAFm51 z15z}0ir(;W93S1E`;E-|)G5;qsi;n$E}+a=QbU-x?Rx6os6E7djoLB}McCS66TL4; zQ?);cMFjhkyiBYz{?$Fzy>yv~y%My*O!$dwg0b+nAjHAQHwlVYmf8*R@MJh4Ds47@ z-D@Jq9)4u@^_{=#MURoVD@D&bdG9p>5zA{^#0HH>Zgv_+OR({C!))HqoB&LWCH{`+ z&r=VyS7(#~Jae&g7H&rSUTwHEYFVy_=(Ecx?Wbe%5@Y4?n+bfce79U8O}cA+mTUmA zJ7D_my39{OUc-A{7;~=MZFfXRNN6yf;k+m0O7XI9FwrAXRvfko;%7B@iE4H;b?QbV zr(u!<@-}#!Nd9Oh5`gF1lzG>v&O7_#n8n7x=eP?gqjgL`o|elgFuE{4aU~^%8X2F9 zK(P5BjqQs)sCTLdhm=)WgYkiB#1jf_UW>q!`$0S>GP2%z`*WWM-oWWH)Nx)>=J#!c((&G3;^o8d1E^Ajf|=Z$OkK&tYD zL28|UWmG%u?4-0J%Cwr5<+(S0bo@izh8u~;yJ2quz1S92;CmJeor>1KWfNBEqzbI$ z;KYwp`H5%-i%TVhHh@Obn7NhR!5||dXuIu2LNpJ!W^x33DQIFBJ3=Uk?>?y_N1E5` z3=O^BVpr&P9@$2)sz0&XhdaetWkV+p~d{zH}jA8lKICh!oCC zg+XMyr*G3=Aa277m4I~Zj(WA#$3Jj*f+|2)$7C=gLMt1L7)II#2EcA54p@ur-9+L0 z4vCb<8QESTcuLdiOHgwKQ;+p{6-Z+T4h}HvornDQpnrysX4;!5lIDUY=?WeDU6B-w zGA!w7`xa?8Qh(flrxE_QnEoC0^>m1EF)7BbJ_BwN)-CLdn)D{9v zFpln4hzmbi6m;RRm=8hO7VL0L(2g)fB)ptv|M4GIQ=}+76qFQ2=vYL%&7e1_aNMN~ zQ|nW)FmC;+*D=Gd*o6r~=;j~WPPn(y0lA1%HE84h@Pd7_P!)M>Y1Rx{5Yt!=(%U_; z|0_!KdcHx`92_13ilyt{6|&j)Tasbrsyer%$RR1keh4X`)~DB)U0NdfB^*!B{vF#? zAZgpGxGA;Dx6BfOqeGn634L6(Tcu&E2O}#=Hu0P|bLw3wgH_EGKFMR zWDdGCQI(55RSAtY-+K~>!Zm1Xatm;I>ZXgN_!vw(q@<6lkZ5OBZh7344tb~3Kh1Sx zitulkDcQ!Okx?EM2@x!NDg+6Ub$cwou2l@ASHdn8INy9#ECfft;;@$> z3%~7}FZp{@GLJaEe~cQR>M2Y(EFffPW@_mQv~^vjX_4}2KZm~al9?K7a=%Q5Ed6&# zTq9aWXc8gS!(93rJyopvQ?hoh$Eu-r`rk-u8JgI8qd!4*^^;p#PKr{soEFwoYs|*M z3xNbXQ3W#4W_2HQ7Nf-r^-QV0rk8W)3ak~hK3j$r+?Qr@p^mt_t9K{-(^oQf9F+LD z#_8e5FI~Lfqrv*>Zxqz}{O))*Se5RCCR;PPK9ZOsbK5gJ038VxzX}!KK@$${T ztTI6O$S<7{ynVY53$rz6h(+HeY;m2GN6FNkNIujN_71eT-R+ao*38@T@O>w&k(yIoUB3!6$%T2~S@Cjr%|TNuV3zZnYZ=IY?GoQm z9w(xSLhM}5f0+#x#@@#bmL>6N)F^EoGz5;GjmsV;6CEw!1F!GdXx5zNCik(vu#c#} ztpcug7JnAd+$;9)-eNP>1T}oL_(9oXV9C_B-2LvijWJx7$O@t}_Z)FC8mkmdzN^X-B8W)K%rB z1I?oOH#=3tlpPLqb^6%8?Tv}}w<-d6FDmKzz#5Irtqt#1+OY>yr&l|$pMJW^X@s{kv$v;X8yFEY zc8gIyC9bw30?GLFmSf~wy3UP4Y^Da_KLe1kgm`>lw)1=ldc6Kv64Id0!STK;3yJQc zn>Ak=EjaZ&k>AfLjGWc6Ol-wzj!JQj`nuiK(e16+(Wo_v*D*pzpNF#Y8M0Tl;P@!& ztA{uU>xxAmo6l+AKf_pFgiB6KzN|~DU=@N$U`#Zt7Dyo-h%k75nx6^@Y1=H9+T7_!bptR25#FH|v~3c_|xN^$*-{eiM% ze&Sk0Ig{$%E#iz6K$UR^<-;ZIXc!lStl5c8XRm4m^J7hl44>$M=(nWX4|PsXck(gJ zyw&4f1#4kr!<)ZMP@v^6w_`Xu%=={CZ2HpU($G!cAG#CvworK$#9eRy(0C{%7ndf( zACTm%r_**~Ooz8^KPYSVBwk+5`oCiL$-bd??3D5FW2G80ri{)F_E%%5;Z{U~iP$1yG8GUxZOZkO^W7mx9Mr?^p;&jHYrtC_xh*oE*qlYX%xOZy1%y84<=H5O!%DbK0rRf;eWH? zI69g!#LA8(5}LGu>grpq&X^RlW;*k<7x!D=DQU$Tj1X7dY$rGYVy4^=lF?0nI02R`O$TWtGV(xds#8ZGp86(j zM4y{K7#<@`w&;MyYu*5(tei!OsX8bvTs+|*W+1JZf_lNmJQn=R@@>Q6p?$g*JI48q z7vlK3W7Hj*{Exq)QAog5aR>?e0Z;X&L%X5h9}(l$IZ3nnW4s_qqoB6(Z_yTpD{H|i z5%$q3KjSK>;nX#B*CRXdLcv(00g`jc?4ot}dH`N*qhH7bXA8YJkahOX6;?JwYC8u8 zp=vCT`N~(*vIYnHgTR>RYXJK7V4AO@Nf#Ab002TUWEl-w4FfF#9K>Mz1Fn*Ym$K#{ z8D~#6@^HRgON+fs9lyzfx5jrWon0OZwW*vQBnBHc~8B6aoiKn`Hg^>NF zVOK%c9NE7>rricl?(|I&ay5JDR*0-ab29}?H38di12yvFf3syZRKL<*oNf5l>0edY zSX7oqXRB_#(AqB++H_3aObM2l>#VcS!FyRvz{=$XyYg^)%$6Rd! zze2=qYHtKQPEznPAtnIKHz6`O!3bcmGy>^Sy!#D4(lYX8IgA=s7EV4P|EB{5gZpvV z!ykRMnQs(yIkXy^%8v%~C^VXJMvycXdjizsi{gvs&2fIO`xhwFpA>E406q7Vj3#WD z`uuH{eFak*=`@}Ymg_qvvQ$ULio_C<&f0ub-YLFIMsjmMoGKLOy*MMvTFiWO0|>W;x~?BjaXgzhica61~X0yi3WYG=4MmXn!u9G z1pgll2O)47@8d!u%E-F1Mo2bh2l_C2q`>GS6SH|X*nm>40&E#tmV$Zg^=0t6a?m*w z7};PwXZd_zGy5;Ov=S75=yEI*F!}2%f248%jgza42vmhVVeKiudHbe=DYm>JtK5Ce zUb!kSrE~sg{9b<(0!mO!1g4LPh2kYoXu46MLA9K$M*Xch8JnaLVnYtzBJIqvi$yO) za1lZcs+vfu@-7t^={Sc$>83D`^EqH7P84JEPh>W{dJXEliti2P2VOS);jl(7s1)8x zD)VsiA7i^Z?Ofg!k;=cHP7HiDan(8v6|v*g$S0glF=!`9`B1V>DJuN*DfG~gI~W&|CVjbrK>F5jGCL>;-(%BxK>CDS1clwy7_H9LjT zbp@hy(*I^r#)xLDYG=jcBt4N`qGcfPq755jwFwUZh>w18Lh>!At3z49x7BSl;G6`f zOz$X$E>_DA23SetN_}T2Jnsj#V@l+6&)%vweH6Wb6R^l-edRy|A7Yn zIuq0xro10ctY$&7P*lcETWAI6e=WgWyF_J_VG8)chihCHQFZbHppypl!Lz~Xnamsg zIB%@f^3cGeVN8a$cfgCt{Luq<2J$ysqPc@fIglBVc|Db}?yV4Ik-E`GU|27Xu6z*a z33(yF+3JpH8FLXCA;h)@#@g!k*pZGQt1l{ycOcSLb%{s*uPylkBm*j}SG~pHd%N3# zOdryn8Sh^ID!kQtI|%N-%|YYOgBvaUvF3K%-@tS=gS?%KlFij7`~{bP zUb=Jf>eAGZmw`qZMlI;ta4z^hLh(iiMEU~jPGY@SmQo~)>e8Ln4;&5ZmzY8w<8f*m zxg-a`XTKp~R)xYzfEj}ITdI!Kpl&N3g(Vx+R&x(1PP(~ZBFeDlB}W9C2n0$XaS)8a z$a88&-@VxpbiNnbP(Xd`qQ)(LROhUo8`NXJa)qoID zV1o;#z1LSktnGac{$7-V*{sVR7)e1>slCcd zy;OqqjE`5nlAu=Y`789IgV_79)uu;^>~_5QL;i`K?aV9W$>>c5phZ?_-_kyCtFw{j_CH|c@_j|?AVOR2ye(C`GPwJ ztZ?pNu8V3`ob<9JmMMq-+3|-nsnyuofSeZW)<$8v*%w5FRaM^*3}TvHZ6^&g>sV#w ztB*tMf^AkN7D@s%(`$ymEj>OiW>zX77N z5iO(p-kSEaASqD|r(_oJM|(R{_v0g4Rm?$>`d3r4bJb6s5cst!lyIl7C^Qs3@WSTR z-0<$s2}O^JRJtH4K1ae9{dNBnRK-}9kqnPGzVBOCUO31 zfLnQnREaX4&IPbKYePe$&mSGvi!ApioEbYaR|2|(ean3gvmH=vQ~Kh{Q!+PwCrj3E zl8qJ8c#QMy&e#fMv}#NC+WaYPZQ2>4Gn0PP4qwu*sagv^m=xn~`pSwrcH^IxhC0^5 zqR*3Jvnbm!Zt%dQaaBdgXytr0j*GSGb3Wf-6&)!neu8Ws88t6xl%OGQ6V?UkXnCo3 zB@VnFCbvMNIypEUc@0r;4F?O&;kUBEY(_bLEkpn9X+=at@0O|=*z0+{SnS&h&iU#r zN!EV=>Zyg3GHJB@xD-?MheQiQgzy16z;aT{Z_a+OKbn)KPc24l$2iR~jh&228UNb< z>YtTlpL;gP84nrhXrxRsesjhT8d7CYX-jrnI+Y;*pkX>SH(Q!$R2Rsr{axy*=l8td z9qIO%$s?Wp%y@onk`F*k{`I{|uLoQwsV@=GsK-VO*?s8?@lG-@wWnyuc)pH2^sVlN zK8Y6jQAz2`c*^QR&RK)#>Pm_$E(DI}&A>~nI9BVOjg0ZFjwoO#n4U3PBp)|U9z;=U$vMMi&m z*%iew81ir1P~JdODC;#af|kAkk(s`q`ZHshdE8|;9?7I-)r7%d-=RsZ+R#&f7nPql zm*%5HX9WJAEg(vAL_{$QM^}5|r*vDn9m-HgJGmxPHjetzBd6v{>GyOc_`qF5var%2 z^mj7rv-U|}>yka{*W9*@bltL~zeQQQRcuGiMqxXL7;#84X@s_pBh z>(8&yi&9%UY2Nx>!(!O72$=){MznAL6nG`H@dwilC^A!#mnf9D14Cw8{5N=0+~ z1T6Rva%QQ)9g78?wRZ8lN6dW6@7L!;`}^8mpdsjV2V9n;ef#7ezE%Qg)QUSLFV8*iTQAj2e3b_^(s?z3iRY2+VCel;kFILlwN zy*S=_##Y7ca{A;_pq4o&cEwXg%JDL^w$9kKcU#O}?a^f_2fLU&`1Y#nsrai`X{=~B zp>tuR#mBBY(FzE5{zMU?RO)3mqMnh&zZ|$hAwmAX#1)xHM1EI#ZcYO5$D`C73t2B2 zh7{$Li`P!pQW0U!L2_Q;Md>VSbQvW(O`Aw@5{}dcVwbO^3jdZty4C_4SMsn_k%z~f zv^3OEu{4)$S(aiXbduIM6g_gyfJ1;k%Wg_Us~7|u!M&}GK@iPGPi|aRZT#;9-OljX zQC2JUQePP<>80F2RxZ6FRQ)yyS=HRw6;8`5a|`v|2lmuX=8x*!DR?udEBq+trlzI`inY*?0npP6vtv;f zmh)wP92wGR4o?QI#6Ov6BU?eF3<~DUfAWop5T7LhM8l2eonCsC27-u}TZr~3%4#ch zx{1T{uj4+QhzYksZp`4PJb;)l=RJVc`UYOH7g})WkNqXsFHV2Vp5A6XgK<_sH*(8W zAi{U;gCWuuq|U@I{b%A=t2;In-}8KIbQ$}NT5?}kr6PUkE?%nx926W(46F*issTUR z#6;f{dMk~nE^~7B{G`FCKI?36jmkA${ManC0N^@weuOkfYr|g=Y-mW47JTw&v;+jJ z{ylRVAA|r&{|+u`?Sh#Zyf8Z%IoP{+UMrNebpD~r!yV%GJN8%A-}&3p4O3K!nUY#m z9R&>v5FD3*1pM2Z7?_UzOH*8zy6L$i9F`o#TL3Z_!hZ#u(Iy|kLDG5Z4Xwjr8=Y))q@DXwlbmS@GU99iU0iWy+yqIm$?51b~6(FD7rzM4*YDHu|H1 zkpr24+ewDTqs#EX|39v!j;2tGDujxa z=@dyDq_qZfxI)t`NW}eY`w5O3inJ`e&%?y66=~U7yTga!-wPB`gp@$z3w-wUG*hcp z*kA??0#Uc3i9GE_kK+hxfwEx$LbW2y1;lLD4X2$Veh^IO$3yq zH=B=fHY1;>oaG(Lqa}-F2P2)5kF4Z`FmOq8IudZnm$<SH||W zmaWL*vyfJg%*C@WqC3noP0nk|Vsn%G^W!qrb0iucn*?is)9tj!@n;8hbDNo);4;7b z);!sOp54D3jO20(|AmvYWpL=Z?-h2j^}PKL{ODqjL@=m2&6}aQ`@)~4VUV!vL_EiT zk8d`Ak|ZVnErZ|z9yd~wSNds7>1CpXS(>91N-ke){kdK##@!1&4GUc!%A_Y`Jma+7 zXlvqr+X;&pxV*pkw0^XsI&tR19L3l3*Ee;^V9d0rKwY?yAx3_=nLTEs`|}Ms8A`D52c<7G}VsMI-EKos}pc;Meo%Nwe9k84MY#hS}S zD76byIm)TM*v~T@V9;d5YR|a@sJg{7x}mqzAnY=8iCw0_`%rF?V8-PGn{EVY-g3OM z-eSIVy8poRJG@c0AXwhO}6lwqu z$qUm7v-g)xDWkSyMa76W?CIf9) zJ|eul$2dxTFevtOiR6?;c5c|yY0cgPBvC+o~#Z? ze54ZDAR_U+d!h+qSjg7_)FAy^f!2HU)(Uzfkq`nG|Iykicru`Lpqvj+BWh?%AZ+Qj z8d#E6!~xt!D!391fqHLjkinQUV4~K-gmf%*i?l2RLD$9~-pJsR9_{b;24-5(_rqV; z(NIoO&nC#6Y++7X2FIj$Ja{SDFfM}6E^LjC6}JKHr2nM)&1ajp09M?{|GA5we~CyW z^sCxkZOG(Iq}>=lcE*0!nTON?#aNF6CZxC&;Sdr9bYHU8o_#MguLee5$f;go76SXr z&W>~^(jVN1qe`6)d)_Yem7Ocpt0%lc`y0bH=)Mv75XprqGJBVLFLf?%lA3H{o@ zlc-r{0OhLUE>%0}^?VGlES$N$#hC2h(j&kl8eQu6vY9pK^CJq9bRHs74eeYBa@Qza zqm-|})i6i&v@9BpUnGdx-k+|FoN>QAPaMoYIszFAAa^S$Z!p9KxId)1UdLHpB{%$D zLM)x& zO(ttxhC$j2$CY!we2>X8Naxe*Ca`z>Oibsa7kF_qp}~S%i{$7#vIj&HE3hZ&iOx(k;;1BcNq4wuyhyl#OzC zc$nX8x>~AuyIcBB1;F_3;|I?3cCnbwjzDxUrpHUtrY&(Qv19pl;vDaq)H2?$q*rhTJ8SDp=U~~ zhsPbQ_Z)WnYBg$QHP1z90&m{ngJK#_F;aCy>Ej(|7w64Ep7-M{P0gr6v=s0*|H2;y zB~0j5f3%Xg+;S*LkQVJ0m@Ut&YnTtqHhPoXB8Wdt=a*ig$>$}}9PfiCP0p?%bae*h z^hoiDwZR|XYb0re7X2}=pv!n+@bo5`%#1dj5(}Fuum*p{;KCK`id+H(F4g>)-Xdqx z*hJsIMPtecGo27=ILt%VDl0iSt@sAB(Gltk!nSGkPxw(rebZ;YC%I1&O;4(LPSNNh z=(+#9!t`edR)~AP)z2~>j!l(w@><{P% zI|;|3AkjqOd`OwuiEl~y>NVosN`P`vHQHMv5@%~K-{*FW8VnH2e<%YI8I+$eAaKT# zQ^Y7Ot!}$kvQ%jgDq=RBkvs8`C;?C{3Cd0w&5DH8wc*`330V$@@8Y!N(nqocy}03v z7cRxYnLFb|{utS=1>ezZ!dYJPA2NQI_jA#Vmbatg&V=`)^W?yQ`l`?WF~Yp_R-`S; zbn1p6dtI$n%Rp93YLT4?BYp+=O&p{KUF3Moho@$3;}j;uZ=nYBLl{XSaDohl1em-X-wGj#IItuZK5h}%d^GSM#Arg20D0d7TqnVo!D9R;xf?^a zomeXXFB$A}d4phTZIY0hSrzk&DSVpH+2EW(-0P%ZmXS2!r->Gx*^Q?emGT3ur+UHk z?TRRph4>I<$G&prNO^u1;)DQI-8j!`B^6WS`hdy2$EOQKSX5=R1L4;Dn~B0lubQXq zx$J;GKa&4hwq9btsFl%k#IJiIxcHKOH2N2`t=AXM?zyPU(o$z&*X8wS4f9E*xamT_ zWBd8fXrfW{dJ>N<5G@~loUMdzJTL^DP#7gX{@O0k;DBqOr4U;*iG)>4^a(|^JM!Ca zzwdbZinI5^0n^Bfg|O%Uz&+vGWJ`zAxtE;r|ND2_|6EVNpfJ8%G{Pl1d+Cf7`6QQA zb?9LhT&{4kw*K&&cYt=A(snG{JHd(i2*6__kCeL0nmG*uh!=eF{?~Daii`iG)!ozG@B95cPliHEjHn-CR9u1VcN*l1bY#dV;B()=<~Omyq>=zAPY~0= zy78Q>G0;E<0AM}N~&O~&2ruO(!nr@5(00-fVn3kDSS!+C0_cTKE<{d03LDeFITbu zq7^mkGXM>2GH-MIA&eUEL81d91QO^6PDb!MQjoM4fSXOCSRk16cDZ6l#;E{QVcgb0n7&^O;ezX0hKO zKpN}OVyjQb$8+auNv3z}g6UyzQm#KX8!+?#0nPb$EO8W6f{XWuH#|t{jWqEDuYf2X zXX+il)Vmtw&+zAIHur^;tSsgie6*}KL>h|C3!c@_8`xpDPK?A60N>He#7gl8h&s;x zus@38CxAN6ogOz&6^M2gb9*D%Vf5 zeh}M1z8B`I4|bB;u)|FUhya{FL0Dgz5~Cy72PaewA4qzKwt9BV;Kq|p?(>(eJS}Db zV6Bca3ffKkWSg%Yx!xae(kygTi|ci~++V_0XRrg|{q$4wlgyT{XJMy}JVUas;_8p0QQ+$+IOC>|Fvn)Dve+&CDMnF1MC?|eL# zH#+x%!{$&7?D6_qTK~7-PpsJ{Zfv1hM(mG5Ll(KriX)I3$ufWKI3pqjY78dLD8CU| ztXaWIh=kxBa0aLk#U#a5>tkXHodxX6AXzwC8O;_Lbu}B7{K`+j1!1lELBs0~#zXGk z41x5K4A^x0Mal$;fEVbdFX*e#mR!&m+J=XK9~fO3 zAUAMTy?X(yM$PC{s(uehHZWe`f3=i)`8TxoCm3g?Y-qEfpr}umAh)ZCHC|Glm{E|L z3r=x`%;Dkt!pN4sDX0;LHrHFuG^oxZvbN@+yYn;out(s~{wr6Pgg* zBwZdpm^^{LKOfiy7@{ywa)zAS=UTc7A_Z z@HmWSd%8)UuW~)_pH2)?nVY)ct|^q;F;+&!aAS09YOFz1VPA!F6eXb9%kt(Vm1#yN zCZBFbBc!T4^s@f2H#Rjl*S9py@&L`I_Qq0T!ieeyXr+F2YcSZ&uLAc75*?$9hn`;= zAY~GwjD<_{5GyO;qE-|v)!WX=Vy9`NB^v+;k7|)ylW_j5%=qKuSfot#qZ-h>M2O_j zQM^1|N3G6AjSTGn5D-O8tm`SPsh*1BW9cE7Y%!5)JO7hScIc{QnjUXR!=Dt#}H|v z{XJ%OF z*}XE|a&fBS>BHlMB7{9|rdTV=36%ZpKL=YKy)Z#6T33~m@kB){W_J$_@ zj`oLQRLwmZo)xAZAZaQVlc+wtoj#4kyukzQKvpWqx)Syme_9Tak-~y22L@-Dqb1B2 zxd$Z+w+-tiYg;jPst+7Nc@XPG>q6{VLbu8eVaAgx=_DA`*j2?PJa{a0Rk8YXwgU&4 zh?!7FBT)CBIO~?~77dwrzop?MR{}QW;PaDiLUeo7E0b^UVMrc_gIXdc6bc^3Jl7HWQJSG?g^Lofhk>;ZxkDv#?o}AN8(A4Cd#ch}J`t;h1psEScq?T7y z7bPW;Qvlx3RVJ0nSp_*7FV@4AD%8Zrpn!x+7tEW%qzD5QrNFQN$jCVCM@Djr30mko zn)oYP>8~dpz1ty1hDTL)vSACrM{L2>EL9m<61LmN<#CdLPG0M=+M6v*!; z!vA9aj0K%}*FLWaN;r^^9vKZq5+2OJU^jBY80SS7Nm`IRFir9X+W!!RQ0Z}_Fdcn$ zRT!3CvwsEEHUz7HxNiiq;6Sjz-wv|!af)cEzkylNoEi-Fb@4|VL>n$3ag7C1jFlAYp3|Y7bN}N9EouhvnLUGDi7Rv{WUO$Ad^XCD?su!007lbsw=x|U>6^2@? zUT%q;7S~t5ZUDrWo$*jO(;hk7$7*G!F2=MUx6kGvQy~EHe>vXXl_3IiLQB%ft+q~> zoTAjCmO|ss_&JQ&oGPc1$!uS7D~_x5DSbzO!~3-&}o1CGY&| zU}NYka?O=`XdcU&jX=%Sb;}WW-%Dfi?2k2@yzOu`s9Nmf7!Y<2{SxRXx7k{z!O&i; zUo0B}4BEZ4b?dhflM~~OD@7V1em1jqgVdCbcQG?yVLwo|a0Nw$yhZTiaEdAMOM06+9|_uG>v4G^vOX z_P)OLVPU7c&_1p;9Q_B8%moqS!Hn;F%^H!Ioz>4RoMu2L1}y1t-0&pHn>SkCGTxJYRDUR zXyjwq!5CxnPqJ8Kuj?9U{1GqD|YgGOtuCyxFt?Ry+Qi1Ox zh8O$IV9dyr5irrcJV*!7?QX5I*kUzX8H`h#m!Cr~W-`lS6o*7WVxCdgzfBlY=@h~lzYQ!sBwW$90jtRbUJR5I+{D%2xGfnTQniyxZkb30At@rz%W=A#OilA4&&>4b zah=Z^Rf53WE5j{@L_ub-g-pq>)R%^Bim$(3Njbb~M<|C#}{!>M+mg84W^C z)VE&GOc|-wFNgJbSgI83mviNC(E~anR3zU z!JM-T3j?dhV*txw4i2E(uMt?Tcj@D_+2hpc1%K%U2nEeBRzhN=pbNw*mhE|^|{HTF`JUCA3|8@W@1OseULMm2Z=F;`kc}RUM!DBX`H15sx^@_^cDQ}eF zF{`_KW<+AfCnH4RTosRt9iM~I`R#!Y0^Tp%>5qlqkssSWnw@MjJk6hP)y4$d7K@Yg zmxsW$h0niW0Jh3y0zZ0OKMS_qU9Duk{GKF`{gU#v3U zD_7%9Y}%h&VvravozGTmrbW>Cl%Ci0sg(KHs#x9=K3jKD9CLDJ^!WFO4!w`C;SIVG ziVzTBT(@FU9Ualy%~-Q*<%u4Kl2MBJEKMP-V^YP}J0=}n%-3w5i(8pf+8f0=Jo`?U zIl5tRf$6R`9j&-L>-jx$ryH#W%KYBI6>qID)#AtJI%lbBb}ySx0&WLjU5BG}{ALIl zb4Ck%_*BlM`bo8Jy336e+L;(4wwq_XHFjf>8@UL$)QRR_tbr^B+kkcI*u=g|m&3!d z4GnAa`BlA45ZktM=OSk6hC`JykH~mFbp@r8HZzG5SAN$vAupS!4Os7bX$o3|%|?=! zLzRU;coMwstJf=Jzy00#&)JJ4Qh@=q3V-In__#5QIpY8klioFpM-uA<*K1y@fK&?s zJ~JwJ)pcJX#-_tiR{fKRL`NYlj{rNmv&n3h5lA=-oeZ^7d+Nhxv3q3D_dP^E3$5e8 z{2|O8 zaPee^aQTJ%esXCW9T(d&%y+3ktKKp(tlV4HNYG}kMU5GmCn%3UB;@b~nesg*WW<_l zKU~Ov=v_NXXj~)8=5q;9)b7JDN7qP3Pr*l7w0j@KC3>wk zRTXuoI-*GD;RY&-i=y*)q1NqX<%KU9KNo*(EHj7jhDZZa)1KB`IhWe&_RKR+O#IDcbxBHry7^rW3@kp#W>W9A z>~+~i#ay}KvB~I#<0>|3FGI?m-Q1lF9f{D~k0i;`_es~~18TQ3kjZf~hslZZQ>QOa zs81?L29l5nQW>YpqtOxMxJeKEW{f>DhGz+s_*i%53Mhs@8$-b5Uj!d<`zhu zZ?y;ESNjbskSShpeRtnIog#rHTHG0eEdx;xR11En@kRg+unv2G0>%ebh|zi?{nTFfYGQ7m}rs9^`r}u+#GOwoQaR<-Uk55tvV4HwBQf;K;I~6Fl;t zpJ|$FDDEv~Rak&O>pQ>q(k*D+iK&U?@uXj`x!fivS8D&SEUTT~T*Ce$?L7?xo%m0d zb=;Po8(L;j=hI5N;VpahT3iQ*dk4pPTMv6fZfm2+*zOZ{?KR`cCRi;!^x?XRbF8bGdgrKNKRB*luJuiphz(>8rMUcP< zHSJ`#$i;GGt7}q=_=R^ZzV9&}-|q3SC^!6eYETyF;J;Y%U`X51@szI_cB;kY9ArS{Ja2ruFFs26uybzS-m&o14lNQdEPHsYc5*Jc zZ`J^N%c@%8cw#w0MBJKH$0r%$vc1g6#%1qLqnPUSeF0lI91c=wYwD}^X}mx9Yfm;F zm?@zE>{>C>bpZlQ7MS{aR~qAW=8E`|B&W_(ezA~;PvM0)GmTmxy;yu2``#q5n5S@Z z-sCtEu^)8hV(rk>pA`5J74t2j(j-izfo)g7gFu>=^B zU6>uZNQ71H;o-lD&0(QsZGwHMYM<%vPsCD;kIi zk5D26WwED^U)%L8cHL`c)|ul&e_u5$QhcuCU2#)V$p}iVcO4?t*?n}?@^-y4<)q@; z(9gVy5iZFPI||_Q8wm-lxS7~e_jXw{r|G0+*A7Z$Wxf@71a;3&p2rKw%YkH!4&po{ zZ05eJtx6Bxq>n{FQey*WL)XeEyD~l$-=e7Nj6(N>523m4I-D2}(vvC=JtX zZSLy!^;4QW*P;8-3#^;olt)N*p`>?CBjXl6T;OkDdd*Vr;c{50Eb<&8qpAYteFnn~c)A=ZP9=0$CnaN!dGtWSNj%YJN;~oEvijMZu5b(IJ!{ z#ISpo&W}J1O@b`)glqv7P@5s#+Jz&&&Ay}eciO)!0$cFKn1f!Igq#0Rbj1jE8Cz>y)jl)zx&+SF_ zVP8z*ZTiJ$xq@1+1*K^|sXmlgu)Z5%=0;$Y+0Fw=4A{f^C}!NXgNUAPYH6g6fsc}s zPaR`p&Ctd=0B4ON4L`G^Mg{>2h8oP>3DzDsa*CA9uAv>+P{0#L@i&w-vXLw69_ljk z|05fT(aoMiJ*|oF^$Rwdsxh-Af9Gzk#Jb8`FR(dV4PFY{u!({!g0vqfNUn6j0xMG7 zY>rk=4lv25{)r{VjDoxf9sZ{YkE=(X4+n_R$#Ty0Zk5%|&m*1UDJ^e8JUdb zEKC`C2N*vEX^xKGQkl-USzqfTBFb$J)ag)@^4ID^E_pZ%jgm-znX0%gYFfzz6=49v z7=9=_Dpyb{iO^J5V9maR23-RIGit(hAJ~sOq=|(bq?JXHPT++x*+@jyZuG@CW{E7c zB#spK+$xrgjUo$%?TG!Ez?2CNhM~FfBbhc<6q2@7Ygz6n0IC-h72^z={x!$M9c>D7 z{3iZ`9K%P}JRNGq+ylJaGVoXOuMz%ka4e9%CSqtQjqw*EOK;>O)hI(Y>nar=9k{;D z{_>b)bcvAEupjE(t6}4h{462Kg~nP&vM=wyfEB9jw6h;$1i^@*1=WnD5&u6jhmI^e zfg#}5+EVmelihmD(Yrfq!6XZc-_lHhYkFwjaOlKwWNp#zr`-TX9Ct;r09fH%^`(vU zzQ{r1JgG8zbd1cvHVHOiAmukos8p%Na6ml8)o!F0_hO}$R&P!+9xUAI!^Os7*pre_ zjuut1%Nxg@rys2xeFcxLOW_}OAZ}?C9R`b}X0;GfNEP;8;ROEP$NmUF8OfyO;&RWX zzqQp!=rSN?9l*q$Olq8UQYmiaa0jWM$h(W01;*KzbCd z*E)Re^XafuqoW{vI# z6tE>~4vWxlvG_73tpVZroMgHIF{Wl_VfJjXI^wP63yzKyDi})@A{*0k5}FcSG{?mg z8H@F0)`7MxCi1CVdaI$$u(DQ=UgL^I{Rn4^iIC18XjvZ~1JimoI9%Sh&D7$+xgxW9 zb6~41c(OF9_Guf!o!pAkhzmcJIC1^J;`#HeK+K*5Q6(rxmVucQh=xG#IDwqwj)S5Y zb&uE<2lIlcU>Uh*^Vg7h0!+Y;r zz+8;~qZa^Zo`?n~=@c}!3U>hOMUkWoj$=+U*E&aI!HBdu@ds>>eQ9IeaDb*J`K&iE zeVyW%Rz9^nW?=z->^>)izu}Eto*JnIsfBY!F|$Bhu!x9Y0Fi0pobl9u05G-Z9{_wk zLa#A#OJ~ZDA?s8|0Z_u|+gJk@otDOOgD@#bt&pO#a#Y~0rpOn=uy;H|=k*HW@Da_#JO641`gggh^6Hc*1HSokv_auu2=r9Ua!n#AGryUKlcj6-_tk`7=CkJ%1%17#1mkx~<0_NxUfa zRSKy>vhe%??{Kyl6;A|0igjeVgQrO_1h}1v5paJ%;2NG z?fG`t+GI4|t8Nsz^h;;VHtG33| zR8+$NR%<~KO@J%qcBRXhw;aI|*Rsfq*1OkMpWiJ~41-fQN@L1iS4pt!Kv#S?! zC#M}JuUp3Bmi>X$buFf3ou6PnyV`&gBm|o9=T~%HgF~=m8lb9yRkncamwPmXxw>9w zTBEtadmTfHX}E&yRc%G9{tW2eFnM?wqFE*+`~C$~MKS-r@c7xhX%4bYC?Qt}O)cP>pkOGhRs1y8 z7jfLP{>9u~1AiN6mA^swAyB;d1GO7_j(jJ6V7RM_(DZRqM_50hzGDB|**K;MA?5Qj z-tv2h4SQa)(~cDyVXn>nX!>UMW~+QLHJ62qQkp4P3s-VeSWll*jF#3k1>9Hl6LL<| zgN&_%6`u<0Tzxv%wG`!`l!X&>d+M(^EN}LF;4_w1WX3x@-VU~5o5|)*tjV*rxb730 zZJ7XX_U^^iOxOtFV?Wc>Dkc1(1mOfVqt901fpN2ZHMy?VEmf-2MaVHyl4BiFp{3iw zgqSC7vay%*=PZ*X($>N)NEmEd^8Gv><6`EJ_{_LCGRz>>iA=YG~x*{JjBQV8a5a%{BzeGMcbJ;qQb5wWsPSMnK^k z5$bsbDR4BW@wfvwkZJOPzYtfAu*C3dcm-(XUfUbi@yV*& zX&X;(#+)V3bkZ)7YWft*4|0DEF<20|H0MTB{|Igyt~n>&zZr94#&uIzX-L3WXx^qS z!Tbbhxq5u6j*ci-e4;IKzML)w4t1THcT$8RXa)F5}87J-ms*C=bJ2n{o#`e zi<$9M^W&9;&1S9C{gEmvB4#N=hKI4?YY2i7qOt2}FcW_>7orffr@7!g9NdaTYjYSf zo4?M~bQ`qx3N!vO=XB{G!Uz5R0qQY43@*g~>Nfp~Hj9UkS0zJ+@ZiZ;!r|Pel5|7G zQD7S{kvE38km+g#f~J;$r3hc~f(ZA#yw9y%8L%T{Pm79~F+2#jxDDH+xroc-c~JN1ezMKmddPJP8s!(+{gJyLg&|O+R`kN>d<<1IQ zFpVzyGvzCZFmeRUyjT!@up-4=h76kJ^$WhVvn}o__@Y9N02>Mp`uF=^167`+CWFF# zBX=+oabj|2U_*0ASvFC38>!GZ{hR;!zWfI%q5nZjXXE!Ayi44R>M9FIp_CR^kba}g z1}0g06{5Qhfi(`6#`0SA5~^la8XlhW@hR!=l73SlAfmlcJl>=S^;x5l^q5A8zg=8- zyJy8jip52LqQk6DW-AkgP_h%iRym4ELt)Jd+@N7L^OEBn6TP8Isv~@Y&hBJeEPOf| zWa%kYgvgGcF11Xp+ew4+GIdsvtSxNDOy_9s6Y5qPOL+15H!rJL{y|Em`jTSyG${=y zQ<5x92GvwR>^hCw_$W2(f_ahXpJ%BB!XWo#!K@r;^=d%7yM~70ID2)FRKqYzIYN){ zQF1Z1zVYgMI;)%NJ0HU+WjPh{2(&N><@oQuwP??r?)!y}R+a6Z&(mtFShb+rqAa6c zI26V{xP&g1=21m)wLdZlKojKT>`w+wum+zM8S;fc5I(05hLOGTa4~x$Q_tbpNsl~7 z_MEL+L`byN$ly{e_&R=9A|+Ahqp)U%+E z25T#63LI|@wVQdD`)-KCD8A_K_Q__QHmeHm zHyn>&b6lk*mt|gJHuMJ-)Fp z_33xY5jKNLKX*rGtVtGPhz$ryhlefWRxB zv~?L#3Chu|v080d>@^VaJfBoAn#u}@-RaaT!m)-HSCe!TN@S5YS>6@8B+5T^>&Q5w z)J?-p9H+oRWcM3cB%Nj%(NouI(C+)p=RLKU(#d}B7V1yYui!A}&jen6mP9QSafRV^ z^wla#8gAw34~oM%KqwF|`;rY|siM51LqU1M@x%yiDb;xq*gG2Dn@}bM;YY(PQk&0% z_+|h_p9NOajSk1j06j&6;stfZDh`A=IyM5*#a;1!vgE_SN+>4mrs`*dWu^r*^OY?s z<^l0^o=t5-(8|$dEKBZ=+5sR0oB?P+u>m&p+Xqx5W?xP@;Y6SnWS&2yT3TH`J-n#n zEbl3|sg0gU8StHZc_r?1me80Qnaa`5iK} zGUrTNg#U`iHoB@d=d--aWv%A@2Hf|YXkQwh+~?UR%v>L@8*zg%*42;is)!3Tu2 z{v@X+Q7%ab8}6h@FjrwSVwrwC+iI1EDBB7>3__Z;4+|Em(TML4w63Up%qKZ2y(R1X zsD-HxWp%Q&fKHyR%C3@dSqudm>UyLbAETL|QLc~zDoXwxTwGkh9HX26M@pFz4T{S| zxZ6#YJH_SQ^pe7;xEN`;ARgm zG}e~K2qS2cK?-)(5_&wesBQLA`?o=bFu81}BhRHv{9_!sJRKd7zv8&)8(;#wTr&U^ zMTQgvK|)izB(5B}{K&M}l!83z_*c*uQY$GB5fcx8x+mHjhd(fVR0rxasb)#s-_EY^ zPUI;72=XNW^wcrYRgE~0z_29d^o~s}^3caR>UJMbL9G09p1K_dX$B>3S!J9YM|*U+ z=XOWhC_wL@l7@?y%WLJ$>_^i}dC!K#`ICQ4Tqz?uby1Lqihd&Au zewQvL25S#tp3v!zuUyaVwfWCrIy^vNB89KzDOkbc@ZN5Jz7+8`i>AGNczBD3YAtX- z>ToJIe4zzffEoD!O%$UvJW-Is4Hc*7zk1*nN9CS6@V=cMRKQ8o%tUlJvQLxfkD^u_ zF-zIDF!x5;&WGAqs%vF!xep0;a-WJtOgG7QYd_~IsHXVS1ME=pzCADEZT#EGp2xb*MwiFrRt(asvTx=l9aSjHxWL!p|szt z(0M9{Vg`Ju&qVTls3+B=Qxi&uDf6o~vXnG)7gaWNOnFQ7P9OR0>FFUpTPbj0$GR#K zG)@p36-wWx&e@b_PoGs;%*lDQcTYi+xB)g{;xR6?dpH92aokac+ZHQ1>?H3Pe4e}C zn+jSU!D^)rg%+UbzWg50YX+uE|1@gI%gb*%di*;s)nc++`zOM*rJ#e}z7&I>Bb1W8 zkQ}x_!jM?-SXhS+eJsGgU`C@tU^N8us*9mM_c%42cDK&rw%W9T^C*-l{t!JN zQXmC`qj-!yv@iT2K?*|JREx_fp>>4RK;A)lWmvyu1oK0vVIp_;+1eaod13chemfEo zAu~4sQ3w(TCy7eRg4Cd)fwVayYP~n5>}1+H zV{P{T-T(}g>niWB78u{Rq?Frw8Gvmu8xj|*hpH}Pl?amtO0UYTb7--Kyzd``fumw^ zPIQ@sDY@aZSKB>?$wijCW%v^BMaWq2Z*$K8L~&XLl5tVZt5FyJsc zcaldw!`uk!JX>ikb>7M^vpPrQR-JVV)n!al1iqJ1m(uDT@Sp{EbNRqwkb`3gdvdn5 zR<3nw&;3s@W4B|WS=o#&p}<&ipH6y>0utdn*VEuO z*g-LVaa~KVHgmq0{n*Igz6qPY+~6eTiwGH zrq`QNn2z!B`Wu}ZnVd{jqi(qxGYBDXgjRCHtP0Q0?od@9H(Tx@1F55W$J=ckJ#h2L ziHd3FPM?MLD^9fKWX)u_z)>nBVEURpyN?Zw2vr7J*VFraFcVTL#U)cORb1W*#mz;3 z@}60kXc>S{pH4NVS1d{}1h(DIm->SjEg$(oCU-e?Wqu$P;!5l$QBl{1(~!8*N%M{^ zW1yGG;&NB%?{tOmsSaANJIUW8^rR!Y_S*AJ|77$s@V*&Lc5)q_Bj+$rnf8$X7kD4Qr7tr^_SpIG+F@jjoZl5q~Atfrz1%=#U*$iR+R5-He^i1XLd({3;l7V2w>o=9AheHSOrwhe$ zvteOZsGmVqtCrEhiw!5VgjU|bf$2*YUEZ!|`4jmYsiF&$7S@dc9665{J2|tG!V0#L zK0gFOi>T?9E1UYADE>73nDv}Jfi2aB%b7Qp7EC)gey$H7!l0E>0&XZ@vD*3rz^A~h zq%o)++O3i(NdSE+fF$}Uw}8wx4f0NIqvL8Xd&7UseGyR(U9u=CWFuA>Ill6Vf^9fG zlDM{4I%NY0!;qcAEKh!5_c~sxwNla(83C4qggfj(aKv7$H#7^Y&{s}qTBnwRA}TQY zP+o1h<}qI(&vjZMR-YWRuQQpIBr~{Zax{p|Wg3)RLE!}UuP8oPQUeC@Q47AB@FJ~) z040A)J0p18Paj#`Wu$3oDvN7!KC8D?VX+*aPw3E2plrn^Mg<;NZP~)GrF?oPyWT9J zh@EDVYG$mRwS8#f7l`F3HpbFqJK>)gvh>-k5%a*jfR2ip0AuZF8Iaa?sQH^d`LjE@ z3JXq_4yp1;vvTM7^qK)2$Q4pT-HAK0sd{5H2V#;t8Ygp}k$Y=VmZfAtN zi~s2Cc|H(+0B}Gy@ViqPT$+BVnGZ>I5qk|=}-`h)XARk7UEY)L`;4eh&uNU&IUh8A@K zON&jriC}wbZ$!ar1930Wmt|YG1+Fe10I{4m3seKzec@QU&w1i}gs$u*2?7KPqQrw- zv1(@lUrXS>f&;__)jn%XCQAV4TvlR8qq&KQ@HY5S|8p=nH>JPdhS88Z$+KS{G3^}E zr8;0phy>gm9M4P$9X-An6vgLj3rHRd#TKZN+x{m56!Y$_#mNrxF(NQGgsj&|J&10t zVlQq){Lcd@%qx-aWwm+;PUt*v5X-_qj?6uGPIDK+IRAH+@E0&F2nxHwGz6pzXh?bg zW^~5WJSD++Tu-<#z5D)naP+v0kDqo--4@?Hh1F}$|EUt#w@#si0ak+C?up##j7R6I zK!sL)6R=(w&K439DuN|JB3kLUm-Xj?W5n~7cU&GSB&s=%JPZu69o}!puPlm2Q@+gB zo6nrVF{X0uXy*H=#^+2o(KiYUNmYcJlwpCk;~pP7Q_p(+M9QrdGlSxy%$gtlw!kAT zW~9f7)I#&|phC|%RExn?Ljr)wpvfW-(Q%e-0+_CE)tco)-A%Xkq0Ps)L4VYDK+)Ty z>NhN2ZPzbVmS!S*B~#tq2$Hv}HoMKF>?{>qSPLc3*?OOuzmvYqR!{ffGW^*+S;_i> zap=RvA?3c1uAO$9Cx6dMhbqq(N0|$4t)E<;id}u-4b}HY9xETWJbEle(lqS%Cs4mM z>|n?&gPn&N2wtyv(y&gREk^!OyrHI4N5TJA**kG+s%U5IaX#{dmNqUhGQgB^?~o!Fj(bRs1Jv$K;{7U7{Q}L!;B7(~rDN z$kO{M5czX?I=f19<@HBpr%0gGzJhRkB@~=q9kZD!-j-9aW*9+`iekauE}vM<>71Q)k|?JGFUUT)L`?B>$f0 zKrWw?iFI_XV8Ipd{|Yu(lLVi?XtzT!kdKCf<7p*3GnSkJnkygH65zwT%#(>Z+`I!#pMc|yTp;xh(ojvzq+dH6 zX^EeN^&RM_6qNTIU~8%0fX3oYK0&#)ghAl6D?53agy(pOj@Lp^5?}*v-b_!7#3-qct zuG0Bm$(z8>`;?^BsPPVTtrhyWoQ@$>%2`ZvF+eq=uNPBl!~A{7M8WpEsx~x(*Ym)0 zt517-a>C)}OVE2@StwkBB&p={({^jrJd4$ICS51&oiwznaYl#N>u?vBg4v9Z+pUo2 zYFHntPD0^4yn2FJ81LO`bHThcV8ReFfl_VMUs@H*cduv%TBAPdET)Q*>t=Lsw=w_* zo?1dF0nO22t8uL{cQWg;Yd>{yloYQ*90jlF+RO15_8V>k<;%jzROY;~@~Cv7}vHBrou)$WZhVcT%<0DVTbc#q6*I}K{fX1msg0b7TC1$pX@FMOK zXV;u43xhq?cb!>SKQSL3h_o3or!t}uvcGDSjDI=FMG`}Z5#EGD;63q)PH6MX^nEjz9Rv;WY z;5{2{WxmDT5R=L zPmCSi|BJ<9hdzR|85@4~gnWl6VzS+RcPV8dTi-o8ZC0joIq#ZAA7Q>?2@C`fl4Ux- z#{h!N9sR#-a15+{wR+gx4{MBj0V6-|#15&e8KvPW{ryL3>s7BETRj|eHtwpfT|bN@ zzk{?12FMM*SJt=EucQOG{P0h!n8HR)TJERMZD83Qjl|yRzW^1CR8TLw`cDOy18&2=~D~qVh0fzSnzut#5OQ5i4n_RvM)kgfoIMwoR#;h7B?CO3P^>0 z_H38<)U?kbGmsF;dZf zO^pm7)n+|gRL}6GeNAXWz<=3d357389sS_krU1|(0wo+5)L~%lt1d}a3($rG0U=GOVi}zdn2aUIz4=}UO z-g{yN#lOTF+X8va7`T=n9RYoTUrK2F9qx1UckT-qGp+h`W2uEZ zBjLzm%-X7m)th09U~jSi$zlJmM65Zfp@c5)WZ~$jkH|P|eg$R4vbmG5%9zA6ywp+v zCy)0-Ym+4&n?lD#uWa_iW)zP~gxx{~wbKSPPF1 z-uT}_S(J`CqQ^nt)i^Xo@SjEAzsNi3O#OZDQ3fGyexm>u4_3Z|^f9QEYWiNqb$fhM z?>6!bu)vd;)O)r5L&*h!&hpyYuYV>c)xsAKIew_CV7+X=FK-2c0DHqb2q(Qah}gyE zy8BsI?nLTHv)wjJ-^@$)`tu+<-MioL5$aOVO)|*LB;6%L^q0 z#!bM$6cw9r$`AY_xdjB<@ZV?!%P8LtE2H2{(+b_!T=$~XFTPOOS-C$_@v-7Cu+mTy zDGwzb5`z68Br}i?+-{YHow+NTbuyjqyGE9?(|L(P)jUOELps=Af`JJOBb43DY_k*5 zAbfxlGGZw^3hJCwmc%E8;B#I1yj07I2$KO0D57Xa=C0F&q_-k%44}i1c#&9(Szw6a zb}{5dg2=HL;R{AJuuS0`V*6_2uj}>p+okDDKBAc|l;?|Z&0=4!zf%r>1h;$EU}FCY zp?$eO&cx#@md}lFgIB{-B|;z4_g3ZZl#Y|r_^y{?(lB7(@k@P&KmgaX=EZi!=-Zc{u75e>~ zuZSxG5bam&+coxvW*h!(uZn^oKLRq<%?|=YgaJPS$<>rH~%=xA|4(S4TLi}G&(4sjO3pRvY;Fg&`NvIR-uUgTvaim^$ltyx8;F{Ud%1NoFxbR&2pf+ym2t z+PI9jZnrvHr5C9^?_z0dq}kUFZ*lE?hp&6z-$ED!X)_7VP_|0iVx^; zH2k~hc-hes^v-N?qmfTJIckqMFDV)bQajI!|6$jURI)TDi88qR4Mf}dXHY)t?R7i( z2~TIPDYWj>)t*j(jQV8%xJUy(WXASgw*&nEk3PlX8!)eKp0_}Z^4)#j;VIRh%1+VV zfyv){@IUyv$L>b|Kz;kQ-D#(sVrtuVYTIpU+s4$kZA@+3HmA1T&iwP+d+mq!{R)z- zm6hbW@;yI?@10q+d%C7HV1fF6P@cghw~_C;Jxi8CO@<5#(C0o-?`F|sCD&;btQq~U z>w_6Dp6s*<46X;ZIE5mIo51CfLA}mD?@KbANO0q0Rg2=1%cudYUl1}H52%d?SaGpc zDwh+Ld$dxH0aO;wU|2#x!;(_RaCp$?yhJ`ls_QEDBrC#D;%2$(uCMP#82qCWO zd0Ulg1AZ#UYK!8KRSabpS^*$%l}G@T2hPwy;MUXZ2V%XG=pXBNsp5Rk1cGgz16MuFFV0x=BmP0g74*6)RT@ z2Fh@;U9_0FZq7{q#hk}L#%h{l77^SB+B z=iBR@Dt|)fV~e6=*Lwl4?^p<6@!B*C_`>$&!uk}zlJsJ2^}Smt38o=) z_F`=YjATbuniyqe^=}tR2UmKjI@Qa{Cl)F1e~+<;PJ`!o1=&^TlnN*IlHomr8jMTY zz>4PCSSkVr=fhJ$ZP0xz!j&;{5e5y3%vOVzu8TQ=JRliaE&8FDh9-4u+l2HlJavKu zp=zb^iN~lAzHUTPXVneuAnx&gW0K7VIs8J^^nU`i&y;{-)W(4^hi>GDfudJ}z!gIs z5&QE6q)XN(gQ^T^(~~Bj9zf5k$9nz zid(Owibj(hKt48}PX^Wq{NZ2q6cAf(Qnh*~(4JOwAsX7pqA>9VbeCGo8+H`kk*z^eGM2^}3j% z@pB|p-bwA$7}by=(LiY~P*Rt33;Z#<}8$=K7P6fr6NnQGS?c z$lJct@+~1&Gq%thp`Bct-d)d(-}ixI8eOYhM~95 zRp7^WPI!_>mQooQqzZT{rBb0|~VDUzT#JXOKxySI03bSYKVQTCt>>Q<2wStlXZgA|{v8zu%Q<5bs9< z(B?0NOHs|w+f?(SJu*M?IIBsfN+`ExEI>bkeFe6Cq?jgKN`Y0cs8K7crCzwg)^WDU zy$HybLjxd3E9z|p3Ahy7uLAb30{a4I0~=W8PV+(CPw6Pozv56re~7U}p5lqn#BF*5GKfg?e`>7xA-295FIZXZKKM2N@ERVSA)s%`T# z;MYE9%E(Kg3Ll~QNl5X;oL=3mHbTzx^-bZ&ma&4MyY4x8_nZPuPCE<3Vq9tVl7+RX z;mCzn${qf=yzW7t#159m)cc}l3&O>gE}f$nV5pKhz(YKEskU@mvVV3UGY~?kz1ybS=d^TZwzAD4BJDdY8y?q3j{nJO?G{>x-u~H8#Yq&` z+ecld5ib#oP_ZY1y$3BW6@O=2J5iGFzulG*yFOEzw+@3+p4qpciTo&Nye{a`kW2{< z<_S11BgD^XC7Pth2o5aVL#+jcJv%RHloN~9(fn()7m6%d^%?Z>o>mkXBUBwk+-=h7jlP6DetD&%g$KU z_CI5Ma4Cyn__(_EsjMd{`|#f;pgS%Hu1~d^1%dV<5f(^1ITD<|D;BNZM51`q@lryD zTnUI;Ib}44#7afEt(2zvcXuuYhxe82dP{=L4oQ^N$<#1k2%^U@TXB#M9 z-p$+Gh6wPkX6@aHlWT4>m9^A?FosoIDXJ%W9AJz#IR10y(1k9wF=bkI-zxN!VVJmIsWh>1^(P^nJre7(jpu zp8N3%`UsJpe2OiqX7k+G+z#gk7D@*$6n}5kJ)ZVs^ZP9NZIUaS_jNWPS0D?GW$`q; zTdhZQ?lWyN*hQ%_%1^-hJl-G|0Z*>2Ww&;x#`t~8lf{;R-168at%Np71S5e25WQ9} zF9;TFzas&a;C7XKu>hQrN%hL^qDnpsfWUg?_ipy7m~1%mLj2(Os#z((lL3n|zP9mU zww^cunB>XgKDa!01>nbhqX|-`rAFB5+VLE3Sfx$n&tm=p`3`ZE(|+!w;*}(oqF38G zs=aD2qOb&4-+;Ke2*4wfVp^1rFSnxs%A_(yNb?DW*|fTtxJgJba>1FGzCunNw`I+L z(%7%$4BOJFwPO3kH^ev18Y3%Gr?Z?E{v7C!?67 z=Q$T%uM7tERLZ$``{frwmI@THzVC}`l#8X_1Y8VgR7f0&6xsa7@x|`6oU3@D5;jxCu28_K2q{GN^yQ{b7`rG^zc z{0h>~<}QYwemqce>a^^aQND!#<=FkrK>u=drBUSvkY)(kplUQ0pwqehn9>WsnD}$u zYry+*SIn$X7VFCgjNE*me$y&ZjOZX9w;ooW#a|6({Cqc_Ne0;y0-2wSANV&ZLnms- z9)!+%UAIr6;RFRR708J=&-`%)7d?hfjU^ZUUhjsd*Kf~HvS0y58%?vvWvsdiFPU6p zTN9t&jQHQf+j_KrSMzoG-t?%d4^xsTba;pmX{gdo=ZJFKO{u1do*-7dP#03&K3A2{ z4(1MBO2yePfJ(UgV-kQl|wErAEY$l#u zxQ~dP;8DoxDZQ4p(qap8O#O~4{rvR$xc(GjD3K~#-iO+3$hG}?cgfFRl)KDwE!SC% zg;~Pa8jF>?k=Mfnuw%u>K6>_g0LnF7JUbKV>~C^p^8WJ0M5cl`5|H`uvOz>iJFD9! zB>2_AkXe_vNfev+>hzY`w1!kJq(QL%<_1hDuBdDMN;T+X*90W^ys5tZa?UlcUpTE` zfSoyX1{w;b{y1v1T2IRJ^Wr%>F=xeoH}EeNQN&aOSmt*2-G{F{ZLIkY^O^OTf(I*g z&szvt?Y-G*)z>+ir~a%Ygu1~Vz^i}rLlL~*9kOFc?il?hj4GL;Y95ircM(qExw|aa1ms4bmd$>I8RfMlb3s- za4A|UY>9MvkXozfS4B}%LSXikG1EP#T$>}gAbC)e&6deQiK9Z^V-}}6#^v?PMMX6m z!w8cz9!KT2f*|`pM?Q(7b+@y5vx(%EB#P!A%tKq*Pi0u&-@07?0d;Z>B*G0^`95q1j5>Empy@r zOaA>_mcPPx!;-WrbmuC8emy1NZ!shE=eH{6vAwKBoHy>z0o1q&f6p>7DDMXNb|mBI zPEN$OQ3maIuh>d8?jEvo!{Z!FHUt-|Wc-~j4#I*zWdXY?Cz888#-fqNZZ>dTR~6*@ zS@|YjeF0tdQe`W1kKU(je4ODYcS_Xis(SnCVIjAL#uIhYpe8Mg<36nWq`-lMVB2Ds zZBA3vs88)y!m_R0m6k@C(nabQFSjcTBSI`XjZ0WdJOz3C)R%ASCjO+~fy8d_c2|w) zMrhH_>h-wm7;(DgZmszR`~d;}MoPCoCBuuOLApE{w)kRg4q6dj&xoEI;zwW7{ztQ>9(+TOnIf_;aZOi@b zAXjxT2!xO3R5IO9;N5(o9==;Y9QZXgnp#4OgZEy+aeoa|Yo#T`5xwlT>EgcjyMNVL z&J#c|rlhJ6 zu$y#&lj3_g@{N1?XdD0Bk(7^VcOT3xiQMca-`n_@KoYh;Ojce^E5MIE3U%Q9bTYoJ z2yRJNr%*p~Jlfs6eCz`+*!k!ah6vZTI;pN#ZbV#`F;ta{g8H(liP=kwM#IYe$Z z=F+Uetv@3DzAGqOsVWow8(5v;E{LenuqSk~V$4cSX?St6Q??Z6duVVfnxv!4YPwu* zzC(3|0#uX?e@>`&v3-8#G_B&sjM@{u{8^6==AB}0mX!_7s8BO$k;=IFlZ~&X$`GRH z%(6A}4c58lGIKsaHB2(q$0O_Rx@a(6>!)3|yN#$>PJ8xwf?|U6A++BX8|(YKch(G~ zq<|OC<&r*askGu$sI(YKPl@NB>yOx{&2}V4l!#sD#wJyiBa0>F-o8uP69_kcsL7eH z*{xG%e*~=&r2`MGQ|~(ZvM7=1&AKkW(>c$w_s7>H5O3gJ4hKb65dEu=tox~+h~0T8 z2GMmxWTl;!`uYw^@jLOK+H6F=z35XFSc1+~`$5KYD1%;CN#&v_YRD*YQg>8^Jx(s%V{W%<`(-ikV9{Foh{>$k>&a5t?vcI5=5zfe;X1z4s)bM9X1akL=t zW+wWpVQxE!hN?xhilciQw(mfP@%a8>^NW%zpX z-YifF-|f%7-V`7HR_56qPel_=5(z)i^{lA2(YMhLk@hY0hXA(U z{A$D7yD;UAtIjRvzof?14p!(lr*ar0Hd*z)Ap`#);j7w3st{ z6YVKIj_dUz4oIHkZN8iK3pxWKrZv#tiI|jLp#OK2Y%EYU?EZ z)aY&AQl3Hg-Z9Fcphw%K(T+ohz`dja?{0oXck&=3(F{~;^1nNk=O{|2u*JQqR<9W% z%3F`?c54lA1(X1fdGH?>9Hre6mICJR_`$Xd`E` zeIA#1ZOb~<>B_i84OHL;;X7KYyf&g9V}6hIaA|jCrFuQBsqR+PnxI9uZeDp#EwwpL zdu!pt6lm+W{(8pS+S&`IO#T&M2@~uGWhtO505*>+WVJsH-{wkWV^g3(TluXQ455w5 ziDs(}@+B^)86%b`fOj@PEME$uS3$@hju@Pgu23e;XE!v?JnM(Yf>kUXA|C_drzUkpD`DmUz*i{9_|Nj@8}L~xkQ zAlMp0y?hP-C@}f4rDqBqq%s+?$Yw%ej)?N>l#7r-xud>5!W%>1!kU@~iXl9!8v!1c})EkT1b%`%!fLrO!LYFbRh*ZCvzd*rs?z?Z0?|mhZ zHgfyJjfdUPM!x_`t&m3AZ?0x}e+2U9R^xxM<-6X++VwjM!SBfvb3~+!Pkvm{o<3`_ zkB3u#E~8c5Pr~_mub>}3WM;?ze`3p-u4rqk=7f7P%c@1V!kiu2H};(T?A_W~EmYTz zgq@QQoWD$YRPhrxT*g0EbLySoZUNOTy?h^6e{#KLZFUIWiWQYgq!Q7-nLf0IS-}IB z{sKO1Gkbb5Ym^ao=m?zq3WRNR_1j&ISEjh(C_s-?o&3$AsA~GJ{Nf_Z5c?**ukQsx z&Y8~@mJ*gsCQF>!*E915zd_4Ie|%5f%(hBpFGV^UtUSJJms)Fa@{d^u-PM6k9VoTFfZ^o$5NgzG#T4VpS zFm4!W|FbZ1e9rd%*TMjpQrDSj{b2gXP2RJCUcop^V7jPJz*i@p*=F$ll+fLFLqAt6 z6b-`+diUI@weCxS+7g4E^8wHs8-D(R;424M_$iO%JJ)_R?}h1vIAL2JxmkaT);HdQ zi2;cSAMBpIh4Fi*9}kO?QK5q7hH8NtIuBc(=WvaTl(cL@y#iI?%7m#qyF0?k+t0`d z=(eVZA9YdnGNFn!Gk@!>|2g+0l*1s*Kn(-vi2i;O$9$@>k{53Q$WFR1)cWeyM7${r zgkt}*lo0O6Kg9Ipab~bjmS!AVsY)<+4Ml~{=dWasL5eP+_kH5 ztT=Jc2Fr@Es$zQCt>1%r8)xo4BO?Px=xL~_MBxBMTlVSoC>zMXkY_0>#zS5lcV0zN zVn}IgLYx=%TP&Jj_jbBue0qW!5+z9JXp|m7`=8Pu9M`y77y z#6q0C_8h=mL3f_;-lWJ(xORF5jeE4cG=vG=SO3D7%Z_czjQ^%Dt*lbQ_c`_siE}Xy zt>G)zkRHb=tL5&Nt#(E;6<_bV?zrjIA7~jyP5RXz*R9~bp*2-yNzPpvk$S^>9FCdu zUIx5Z#0sHtdpU=k;<1z5nlK^V{hER2_}W-me7~h|ESOC-`Z%S}rCYo6SVCn)(Mwk9 zE<`JZ(YKkuUwItFU@xGWmcDzWnmRb${MFN8;lC{aPPC9{_d`IeXjk7woUGv6WF%(p z8eX_x$`6EYGSZ;c$BjyhaVT6;Q0GILgt;ghgn}!ZUQ!x<{ zA2Xc*tmHQ@K+mRxV&d_Q2aDI-1LO%cz#xE@t9DV6zWD`*RvwKB_$pBE*>F}WA__n5?|(y<Zi;36)-#$VgV5Um&^iU zUQ%cMYFB5$-I|VymmXO}iLrWhSRCT?qT(16o3zFI-aS9oR_aiERm)vr03~_H(VLRi zgqPUiQkHX%^B;Zhckk9t!FvO7aq=1U*LK_mOC(C#W1*$7qv5i0v=}PTlMUM=NNb`+ zox0BCiqOyk3b9%le4nnIz*jstr@2EvxFQmYMlb6nTwiI4BPc;3dM%4rvd33!D+AOo zE-YYLfl~;uJY9u9q6D@;-ppd8PO3mS&rjHvV6M@ySXPvkUa9QpSCvHWh0m8@-5oO~}oVLQwWwi*D4BInFau}f8o8(^Hr%4)*N&JXEG z#q`9|Ay1zLPgT!F;7gVLYy2jM7fql|aPa1Fjk3G49|BpSXRH!|o#X}?Q`EvWw95Q%FSx^ghy=%D1+`c!_5U>^>7ON^%2dXb$oqyeB@LS53&B(N*6cbAMJ7H*8(%*+Bj`g`Arn>xCS`3-4 z#*XeGO@{#0yonAJXYs(M2njAUwVYhJ3jf5f8$Oa^RM6nbR?SdhJ8}j^)FTQAOP;73f+cC}?=8c&tH9cp3gpjSdi2h+>0)znL znC1a-giWWv#Iy<%68@)NzJB=87U6_5=HRMoX;LzYm<%U2H-`5}oM@`Wsoh<_91zA< zshnA1!mpBF&t{Gd)%LvvNW=as3<_w8F2p&XhmwLu#xjH)yS$=tg%>o0wiKeBNtdeG zaV3ya9FQ$4e`zsMTn*f3)E>@F5oORPR^y0;?l!uYLw zz}7BW#1K|)oX&~AvVKi5DC|@p0}|HBJI^$W1+La{Sl^% z@0zHeId4pd-x0|VvgwYvUvew!IefiP*iDRa*4)y2OQ?+OQzvnCOPFP79p!&nG&*Rd z5q)TKFV~r%k{3#a%96aFp0`~16d|XT)try|;`iI_l*{8=+o=}B+Rgh|x#QDHhlzJ% z(^Ild@ukneAED{trGB827(V69U8VJ7o6${Zma0FOstW}gxu`yVN}MecXgS8Am&HDw zZ$+#71=wvG?W7L8@@v(aJEm;VHJ<{FO?A49Nqnbd*Zs$B=aS>l-Y1gQF7cP}dDfQD zyq}Tr*O^XL=}7wM&N=c}*srf@KFi1C`9~9ix<1Qpa0tWM&X&<3(NeJ{Ts1cxK|876 zU|^*gDp9{}jr9Z_`4N^5yywdc04i8zFx6|sXC#_-q-TX%3ffUB&`3m845pL&}G%__UI+vl8dTMFv@AGDy-TGK|U^tIl zmMk9n2leM<-6?Y)(<=c+{xuF47wptz90}9!Ao-_)Y=I<0(3#FoXn2x*OStftAYtCn zW=Mx5lGmSyDG-Ihg*ZbVPpnTkY)n9K3D^$!CU$TYp0y{iR7#6xu;TzU&F7%nZ6pe# zfnQ2W z>X7Jip^`$UXM*Q%Btb__hgn7c_f5mV@X>a(8e)Ep&? z5>Ma}#|;h~XAwzm$ND|gP`&D*ioYnG5P-J5wbdf3qi#z?8^y9yt(A22-EN~NsyUcG zSVD>m#}e-E4cJGdCwc=LD?ZT7PT7c@wL67rj72j7UMNTa&h}~@>j-&vn%aMI zOS9D}V7I@vsHTLvhDH~Oo1^kgkF*mgv&qvO`4bAKkTv6HjSbDSiEJ1E5|3gY!wDh) z-U}dKiXult4!ToXpslKp!(QL?o}hNd+CiUW8KX*o48TDt+;t6#u!2TL7u0X z>69T}wc0daYzetiYqQcclgG2t;ToQ*!W+JYNGC96qO9<=)-cI#C%SczU)kcJB=K45B~=J>mBJ)E=F5+Go-T%A)> zL!L%#+4Psgjh^;sLGFCff+zdiIhtzV6pvd|3rjF#ziMQVY8XB7&_T$trG$IAbQvKp zQkF}roPLx4z?I1`ppA;5&-s}5Z!PRkP6flo{knZxTp|`nCRYnHCC4GOzA%#NT^!`j znA*)({pT{O`E2Hn>b5Oezpppi3r;tdZ)D)jjV)JzI;x1@**HiX!uM=s5Sd1&`x7Dn zaAFvh)GU%Ibri<_PKBuRWMnl?Q5bWrzsohuIzIgzaQTO3pUIh=}lAhHj12iBB6_{}FV6ZG+HI67fI z1jN>l{&zy5h5|YKdc$C4m|;`bXCoZG4XFv{elMN)Hwh+qG57m#r43>!K^Xi0N>w#$n z6oB8~8MD4MBGj9j)utawu|QqHJImc8M!_84G$Kn`$^T5Ev#|ts`Hc*t0Gd435T?`& zZk+g(VxZ4NKQjkJ@*7i=ZC)VtIh6(!Hk!*b0thTp&VTB+MKqYmd$Xq$kTa@ zmC%>8GZYmE`r(I|T5A@|8Q3+{0+|~31>@Sf=EI)b=Pg`#Bt*G{)vrhdc|~PN;q?>n zjelj{E1JLzmUg%$o)br$#r3xa%`@ReBqJn#{=wuWl@=Wg@q`!!w)OSS*|sLIygAS+*U$a$LXt#n~Oho&R9DA^>m)|EMZ`Rm1Hc{N{&(F%w!`o z{TrxwMsjEODUUX$K1$^It0IllF;>a(9a++A{M#t}$?Nj6oXn-b}r={x9n8bsM#LNGRsOi+118n29AKzBV=G6bUA!#AhGO(aTuL z1IDna?dQiIq%7nF3M(Ho>$@z6h+omZ}6i-{hzWYB^c8QQDM=i(<)A1z`Lwc{TE9A2U-4 z426W=&1&G-H>ybY!>P=+_lHawadC2H^c_d}o0c-MU@2KNTR#;uKL{hHp-4IK5( ztjiAikE!V1_Mh~8A-H+e`_x(0xi%*j+CY&iuNdCAEb16I^Czp#in8Dr5Hyc!@2pP6oR>n^>VucVP10<%a2oXWa~py z7=MUF=g46Q>H&-6*r!W^>ix}p0`ptls~jv8Hv8@Now=Uu)|<$O<1_tUl`Jj}0-mYt z(3C3ZYR#${@j2XydGL4~CQCJb;Ku5evjy)2Tr`*W=7oBcrDWQAJuc3+#J}497JJUa z^BAvKiU7qUZvrN{sY=-q!v!hk4?&85Hm6-F4lsNPZp(=4hxQz?t%u ze%7;vW)eeT9uHh5I5;t8^PwX9hqM#sQ<%2D)z|%_K#5HYr)9!vt|<;QU)^s_QZy&n zT7%KEDL@!ici5+yLJFONaHvMi$?C80RGfpV&bCsknJ))RFIC3|9hdW5ES9DqiJ*uH z|GQBu3CruvDy8J&&NM_$D|I~#B861Q*hba<*RR< zD!bhuXWJhYH(Oq{f6)~t7@lP)CyBC2Q}4Q!C&w8o+zsJiE zlg^Lqm7TK9dM32kEJrCgx?mHFanfuztvqcNv0tlD_;pGRsiXx<)9TBT*v{4plhU*-fgWZhBkXHzT@g^F(0oOr&Tt87@{RG>!`* z=yxIZyeI};-1J;n4;S|51^%9va zbW&p63s@?`>NFmg-i9-kPpME-$)!@$ut^<2FCgJPNK#_5=5yAw-5?H#1y+CdGirNQ z#23}NfUZ`SbShNhK+gwx(^=8J#LM;^V5J!mG{aUiItQ2XDKcz6QqE~=+TBAKRVx7J z`4v`gw_s%Y9aH=5*Wv^@Mt1cn#pG0_V;wlkG`{jr`KU|$W{wo{GQr-N6mD0Y-$Mh^ zSRbc_B9s<$y}zj;(bQT3<7SA7AmWJB?m2FHVxULQJRSxceg!xeAW&e1!4W9|5i3m zBA&lJ*BRlOwbXb&8W(J(hr9m~5YJ?{S#3}l#=}Xiz=eUZ6VAk|^Wl(>m!dZM?eAbX zKRHS@-qLK(Z8W~u%&XJfO54%N`NuLKc21|Wr`?yfhDVNO^-R)znW?qmHw!zEMAtrC z`v!wf#kmw05e@lqfPR`jocZt#gG2-Q8&sSQS(qU6MX6){`|$HZ1O+K1D| zdo2}KtD(cJcLZyOaVj>nMs#yqlIX4nM@)+36QvAS`7l~z!fCcP%AOvw=e)K*M2Zoz<^?sOJw;`DlL(8|HC^p^5ZaI7JKX5cr1qPR3 z!eRnbXbsQF(8&6#*l>1`GBa1+6DS;wF{T~kO%783=d`j38xPE9Ve;O9NUex&>Zg}~ zR}_9Fza8EG=wHgHt&hLB^o>Y*lVyM-{&1V6`i%wj4*G@vDkgC&-ViFpl-1MU-ZNIm zy>%n7g)+{3*q&pZa}ro3=nR-_PDadDB9|buFd+ZL3u6%bDOCz5h9up;8+JWZ(Ev{I z{St-Iym+s*%4JEWeV^I>y76_IbbIk%Rdo(EG~jL$Iw@o7cTG=EQIF3gO*CO6YqJqv zl11J>_B`e@^~#c*CQqYeq*bw0EkD-%7e0Zbj*NrE`q#U) zI@t%FQt-V$xFOp(TB1rldMMPsuI#mx#&qD3mXmcWvfAI~dTF6yMBIe(B7v}(HF}URNt`G$9jT^+3@uI z{itL#mp?COTJ2lu(HjhFXSAiDk<&+kC@&KJhTrK}%b*#vqA)-^UtLC#V@bx#mwuR2 zoCK>_uRZ5)>6(|6N*OkGm=Zl!YAW311Q{teiWJ@aNdYh@Q8`pL1`#31Pw&L_Ou|jN zRJlO)_8wDTfL7)t{VChR$OM9{0OS5KD3qM91aI{ZSKcgEY6=`TL^d(lM{stvy|aem;D z%ly(b$lN>e-nSFBs}M*P6K|(Rwf8b`O|p`DHL+kLMsPk5;npq4&LjG;knB)ETk5b2 z*V56^Nf6t=FxQGW`y3Df*U0}Vgt|~kmaW{)D5m=xg`{0%hH>$q7Ae-mbT%H_4@HHH zT!PP6pjL*Ib~>)hlW+!7-D+b+Gxe8y@b^KNhKA~wYt!zTY08;%CKos?deJZ!0^Zey z%;DL;#8_2W);F=X+9GAW2m2F+#PVOg#GvYV0<2=+izV1W*&KaVpB zE43a;QWaSuU8+nAVF?OvmK z$nHeMc$bnxlkPv1g{ zjXN@I7l}4m#y|IxPB2VZj+7&kRk9DhRxajJ29%)-4xw|np6~V+x0-C2<0faPe+f9z zefT1EOF|;TQp~N{l&zRr>Ap(}f*U9j9DV;9YWDd;gb4s$^48`>`Vmf_+%79eka6my zs)?DjvNJc9dx?b6Jt;lfGDgU%U;d?d_90f^?fJXcK|!G|2h$2H49ZtI!K5KSdhdD= za4E?bLt(pgKfn)k4d!sQwP_Q+`Lpe7ilHTZdo+|bGv-i^5at_9!3t9q^z~r8C|HH? zQy3E#Fpu_KjwzPs4~D>9O|%Q5o8F zxc@DxPYoPqH&PzVolzK^NE&1RS(r+7U@yXOCV|rmkv>SphXMkuM8zzWZ_KhKIC{)L14|k9g?~X54TtLxM9A z)@FEnA3Q)xMFY`}T}eeBO53`(LI0|$Sj0iFBM@5S9=HidVFQC7(;xObJ{`eH^dTFf z?Ha{$J-Il4)WHMxmayPPs@_Z#t06n2dNr`+XXlc&5wgERw2XANwwulT49(NiPFf)6 zx@_@KO8N-QU~>70H);1Z@^r_~r10cfl#WQQDCv={X zp{=La+HQuzu|}JwrSXAE4ZeDH+zi)W9Z--Q(*wfSy`f zE@Zo&|B(6gKLp&A8Hj+p!AW=ZK8Y$jM#8STX{Lk>d%(iX{9Ngac*as}W24}o(i zw;KTQIsYMWblom71A7A44C4zj2rOl^&JSbi-5s^Mho-MPwM>0)SEUDSVZ@J(EP*m{ zw!R);#N#b?51U8mgM=9GM&b!=~1lc(va`2(}4M@WddC z85q>9Z}YV<3)fvNcx^t9Oz1Gswdu7UR)lio?XxT2a_x-Q8=O}?I-)}ITM0I%E9^o& zG9!FnhO=aXR!(ws|Gmz@^AuoUC3DGVu9{C+fPRHr5fH{6NTCLZ7rBW(GbRD+Vt9KR z?KZ>tKR&r!-e6`~Q6ay7Chr-_!75iJSDm43Z^V*SBPQ-%8 zdD4E`?5e2kh7XviKg|Y=Is2x{qWm_ba(0e5-tMf{{$o06W{C2o@kxQands#>+ZbLZ z_n$~tlsZ05X?G@HDBX)0qAnRx3B6LU_cB61zGZ#!qmuw=$b(e?Gld}(ELA?x<(xOd zI!fm0@AKr0rZ-xT&*XDCEaPgU`RDT2YE=syVrag~WHG|$a7-F_EnEKj^d_tCZ1!~& zM+#K+ByZ#0c=sZbGCduYTRKzc&5~m&TOUBosySpwnjHdf)e=0OOt6zH(|WzYB$%T` zF+#0d0vRuB6zcFK{6VLgM%KHX_BJ}Sy#yEeCl)#BLaBaQ$s$Oxcsz}Pjd8d7%g5VZ zeiu}W@>GRwsJvPQPpHZniB>z$LTe0W&1SRE=c*JqyX{jN6W7u>AeAFhdFJr`!_~~Q z32j+|#4)Hm9T`cH@>Gf-d^Z30hOB<(KN5!itK_O#L}zS_qwnc1r`zUl%973$r{#tf z)Z_6MmS<3bVCnCSHtII$rI)fBP5G~&cu=ww*Fad*%G3LAO5^~`opPg_3V^*lEJ!3Y zH>n-O36Vy|so5IV)>7)2yzXNiou->U#ZgXF||y6}bG| zCkU3m@jG9MQwcX-LT_9#DGT5Iq@p3wj=nawj8*g12sr_k!a$V@wik_0k}!1|^J0SD z;owzen;8pe-J!O5{bECuS&o7m8ym~EFFy%)<_O+5dDg)VpFUzQ*nK5#F;C(S1_$Wn zOv%MVLPg`AbTT=c0-fL{2$B9+=ZT=zwhFRL4I(*r`ekWEBnnXM2%;@DZjVLK!*`SY z3wSJZM^3bfx{}R6F@dShFao_!;z@me-_Db4gakZ+xH)t`=Q2Z=s8W?!IWErSAay&Z zL@J`cP)lN&L@#F36n5&kVb(`Jzpt-ESEW#SVAL1grq)xxwmJu>HkmzH`H}dU9T6qoMu+lQPi}P z&=35#{@m@aN`i;WuXekX4=T_O>*JDusIu2iZS5?GT9rw1(<&w8lPO3UMYBrKHf-{7J~g9$N57z2vD4VTE)PM~`|`v!>1%^`n* z#UTAZs@^d=5};kzj_pir+qP{xnM`ckwr$(CHL;V4ZQIG|_v~-)eZHT)R`=>!jjE@r z?&rGlxtg<;tmt4uVlAu4{}TF>PWEAj@pT2{K`_jU{LIu_vobQ~ZwSVv++N~dY9odh z|H|z{6mYH9zpPybMpAqzB&!G^^rMUg?%(w!<_(1@a>Inupcke=MZy?-Yq3uUVn;15 z5!4*0_F;6xoU>F_!n~vlgy?yXZDOio^+$em3nCRe^X>i6;LqYYS^E^rb<;Ns?MC2j zpke6%0s#N0<)6I|+$^#_Lg9NUgbR$>;6bRkv0xxHq9ZR!C**%##N&wIwH30PY9ro;Ly?yyJVGxnD zyp?PszO#9JvM+JxPZU9422#6&BE1B47MVlvLBN~+>++_< z>OtiTnnryLVyp`KkxN@m%e#Jddka8r^m<84jYKBC_uh85{wHXI!{M{p{dORJ-ttkP zlHu_gDO|YUF0l&#ocHnPj`?Qn1`KeD5!`jMGA-3>$XN-Ykw(tDe$?^cYk|z+`E+^U zlI87rH*vucRD5LhCkSOJ#q1$*h_}s#iM4Zn?o|Bi0&&AHDrS5hM|y^CCISxH&;Ck0 z4nbqgI{XvqFI7@9PRJZ}V&0Am14g$LgZtvx{VK+Fas=8wfK6n>qm0_9#Ko<3oZ|G2 zVFxw5oKSjr7@Es{*zl$*E=i@u6Z%$>*Zo{OSLMU)_T8li83of}JVI31|1(rpv(cE? zSecjZ{_{RI-F2`{aVGhdS6N8ehiIk2znGT8v12mAKvcK+=1s*cDCq$`Yj=9EH-5Rs zka{V9D?dQfGF+SGH(0SZc2c|T)vBnj-O5c)C?B%wt!b=&nn9x0@OZW~GPT4TNH{5$ z+|Kv1;Z|NR=+6(j>hNca-&Ri?K0|Es%fQp@mH%GArJOO(plN8Kar5AoW;)}?cIe%VC5QoDLFq)+TuaK(G`sN<-{+(4VLzHMBBS zBbt2l`}BK7>$C*Wx&@qAc78+3IfxHG+a%xzq?nyc@AN)yc;)B&hf#YD%W!%Vz6P)? z7cnR%lZNPP|9I1r{WDpvvtUZGB}?XNqyNb17)JY>04%5E`5JqrL_mX0?6RJCdP2ZX z@4>A@KnKgGpnnK$yey9FAgqADv>_yLR-d4wA z-$n^Rno441i0G03FEHQ7jrN30K6V@GJi$$l>qyV!@(SJp%EyB;x-34|tEi~ynzhEn zGy?B^#W%1&P&ab#81DjK`X5!!6Wv~`U-G#px73>jbkmXlDll%!YLvh!$ori>)a$lp z-F4wBfeR9kUiBORZUVb7GuTwHO;2Ja)$Dwg@O@i@XD-)724(fjy(6)!oiB%tkx#e+ z!@_+s{=SP&cOj4P-mO*&B3k{51>&4aS}x+lbM`L<5WXClX*xUhE7`c&mD9@Y`(&v& zyK{;Yvv;bC&z?u9+1y@9g-e5R*=Vcd~H_5>5L%tOEH3>`G>00 z1e}Fk%1QW~wYY^y zkXWUi=kN)VG=g=xg)tCPae4{Z3~eZ$H_@pK!c8an9S`%Nbf+p%iImjR7HFq$K9v$# zGXK5KCp zxTsPX|1pI-Q0+hUiA~z6OPi~BWLK_mF?irY>y-}aECsFz_S$wR8%0LuQd55)(tPJv z3XZK*DVqN}sV*k@*@q53r+oUn)qYA0A9k>r8EP`CrejdxA5QzC;Tv>W@AGzDm{g^K z54`geLS$2Y(kJUxX3*!qiubcDu?rO}mZyl?>HChaxGI{C`(^Nw&HnpE`Xq_N{&7o@ zs8aQNWDzff-u&h~ZLIEWP5?AVTm|3su#dT`YH||AK)q@iv+$_u0i}YWOhELr)(UQU z#dnp`h0gEK3l2yEc4c$ur<2r9z)b$x%L!!Q!OyXHT|u3~N6H1iBiPp~2{t=i4CdV% zyEEmx0~9ttE<7L^&f;!A!aiK@^iOdpPe3{B{YlK{JzpqjZjQ+Ov_4WqBviQ!z5qu3 zYDuHqE^7Tv#7;FV78j?G0HOf+t9<_*W4UH&)3-PolT?je+D27J;8CLIBfr;Yp74AY zd!)*fwOUxv=5A?R&5JVUJ@d(@+BSiET2aIW15PJINc^-*pxCr!8OF+Xi2AbhC(Y7C z(62Jf=R?IWwXMaMk63boN^FM1&h29FgSGisCmk7%2<(R{I(`iUp?lr4@_}VGA?YI^ z!4KSLuxDwK&iS8CUM^qOKwqdlvhP!Lq3_OsKwSRNkCbXdU-j$brrlqiooyfO{#B+z zn#ViIJH&~vUG-F9oZU-iZ&@$6Xm7+|;;m&i7H;B?kf!8I&gZ8ge7$quD^{1Os|W8z zSCM0R<8L`x*-9fjgWbjrxEzi%hGgU7si)D0Gb?O;hulVQ6!>on!Wh-q`G2yo=n(ct zFkldaebAu+xi`|W_RzszAeIn5oghiTm};L4=I=MtCzcy6L0erFIl#CK%Q0!gnx>6h77$kwm;0 zd~e=u=GY9qsE^=(UdQ_S5qQGa{p@g%>Wo0ZSPoA`H$Dk>D|7cS2^F)8e(S;w^4&(5 zI445ZlN;afw%HU@o3$>ES6W{&VLm*?!0 z+O$95(EsyBqj|1B;!7h~4hnktKC8J0U5%E1Nm=hN$5yjXJ|DdwHPZkz7(@b3zst<_ zS8uQ%nPLxUehGvzaM6RlB2X%^vyYe1Enixdy&s1~lTuRa^;~px1(4^yW+_d<%b6X= zg~(ljXq$&#ys)o+XwP)?bcw+oIDjkmzdoNwj*uw_9zR?oKCUlKxk7C7rt54zJEM*^ zkFt}l*kHY`^A@|07F$q(_L2QlKdFS9halO`hX@?*M;=N}!?IYLg@gC3HUz1Z?Tu5IhRPat*hDXkJ(;gY2f_{4?z;}uNaO1K*v#fwwy0qCo6Ld6j7 z5K%>K>a;3g$&mC}2D*ehC;!m1WEdeV2}O1C-CH(o5V+H1W&j2*9%b5e>WbetJp>w* znsAx9;M==InT&dB{P{Ea3XKGXQc;d4zP+830{}(4SS%}y=AC}2&K@`=JW4r!^DOgt zPfmeCTJmpHmiH|mkY;jlMAH{Zlw^=9Sy0cGFdyDjCNi)-<*7w-1P7qJN_I_(jeS1T zangxZ%&pX`P@J521xou6DJSQs-snA!isTL&5Lq*%w z=_tcz@4nJ;Q0P%4T`W85i$#A5O=lfaR27wJ(Z};q!cw=iTb(H3V5#U6hw}dC9|3T4 z6z-)S`R-=DSSa-cku3RRpk@MY4!Dd>^Af(MFfo^bu@_tAx;)|W7)3hM3Ec0V7S&)RGLsg3fx+El)#gn3E6>jDn&ybAABf|7aifJsH;v9sr*-OKK`%lV_K47Bv}ckY7QK_s z;JESk_5n01e$3a|QS6YG7%`)ux!4_I9p`LLjliSv=PLz^sh55)iL&`FPCrn)9YK$N z_wHHr*{pBoyY*fpW}kU?p`M)K-xQ8XGc~QV>0>-H@IXhYj2HSo?KUo&Fh~e{U*CR) zD!y8N^>V4Xh@!Y_m;W$u?oAkurvU8C&mxCKgPhI*qjzZ3r=c$;IW6A8Mux;Z7hExrY!jYfPMZcYMlP9y9cDCMX$^M;_m_IuyF=}@f zfFAyzIgi;lL$ju_v4xezM1-w4UZZlb-ZLm`L)*6k7aHZOrww=ZS+ynG>3a-yHOtv5 z-u0kxHUUE!4HyCnU*Ytd>8!utFHJzK04=8DmuD9L6b(iw_4*|ybEKJn;or<$`} z&yW{8GJfbKVj$(T=hx%0n6MD8dtWp9*bcAhRPvau4yxN@3OZ;%1mQtJf`~x2+s_u@ zK6>R)_gCAE>=XdT$WS?dHPtACz=X~;`{Qmnrj!rIY_s#w=QKmqj!c$;D))wNz2Km#@}@enFo9qWYTpt1K#hb60`YM@Cog_1Xp_C{|et$R9Z@9*}H?vNhJx$DBf{!F3)nWZWy@BQGjkMnz&S6xKi7l`&@fD0rhxk4*%8db%? z{^cCc6*j>+6E#^>7#vi0o?fZZ2kp6gHmtIxvuccELVhv@gPhM&&(lEY7x8A(6Pc89 zlK0DBWbCiw85$T6i~Ax1?sZ+QW-;0^WbgzZ!y78ps5o1q^29%VCt7L?)Cv8!&BVy3?!S*p1Ylhh!%7qs_wRZ=_xE{rm z<@q%1Y|-#3ckgS;obSseP&{Fiy&Hvp8984bE&=i9`OG}mfR<=4Ia*#_kOci8?eTF2 z#R?Z=j~1BPk4vVo^Ooq?@jCNz%5SM4ZZF3512i`=Vl=fbKr1l)@^0qTg+y$|2EVR{ zoGs;a)SLbG_UC1`0hh9k9L@=Uk8|>jeeZMRf9UW3Rg#RdZSJ_9;Vpu;^uv8vuyT6? zSExO3k^LQR9Z9Z5FI}=&ky~%YyeOABu>TVRMJ*`ELcrg1v7lc{3js7YZF70fT@L7> z6SW0sY?8iX%vHOpLqWT^Ttx+vaLg6CWnx#-$M`+q2DyN*?2gpsNj|-hP`U zG1xI!mOuWXM2W%FNJ1Bk&6CIT?Cj*KSF|h}?=D)->OBrd7wkr8j32!c1>%Vly#9J2pmP z?G&tmS+y85ggR{=U~i4d$Hg`w%aoRoc7|dM-i_-0!v+?l<>T}LQJP}HRJ}h0QIH@J z9}HJ?fuwG08a?wHSd}vEgse}$hns?PrrSuv3Q~tVROXFUv}y|_LRP!2)uldUJ$=<` z-c>$tlh46JsNzZdU$OXbQ>L30UjAgIfEi0ChK?0^ea5mkqX#+aG4NlFaM(gF%7s3Lf!1>tA zgs@JnS~gaSbF`VyIc8(oS!h_AX{G}TGff8Fy|zYHfZ(IKDio%vdaBHVK2Xaa1 zF6ZpFGpR>V!MJ3qLCY5Nt+seL1yLHVnLt9|#qvc;R!rP64x|(5re< z?5*rqzlEwYaEZZM3>(*2A&BHggF!gUkS=ENfr+ptLmAs-6&QGxL>s1n}Y|Bx+*qere=noV16S zZp|@HW|7V^-pFq&vO#BD2DeC6?M!_W(iGi5!!4aSosDi66&xKMl}=saDT>}dFkl8l zwK_kg2Y$PJuJE3Zq7bfEV^0mQm+!6Om7$HA3YO)+g>t0F9aDkB6esf+a&&_osm&_V7ntFJ+1-U!GwrU zMscXqT4_)hf%i#-{)EGEeM1@*hv0oadJsO$H6EZr0Ha!NSa+OC3x|1Z9j4xSny}p%+^FLz2^nmUd)ay8&eExOp$-u~ zTWVWXfHId0o4sTw;=TXMaU&7X%48xH3wac;@%nD;4d~&*6a)h#qe&&p;iso6P8Mpi zZ{fKlR(QKT!$WCC$g;T?(;hPzqeFlh@vxtAk$v3E4&O7*K585wqLOJCGYuWw$S%pR zvgoo#eclIr_P{z*Ew&qnPCpbf+3MBpnKxIzw2_izNF2n38cI*6H|Fc)v|r?Z>(4vJ7p5DEnLH zD=esV??CEq-8np%_9dBt5t9i^lF&zWd#@Wkn10PD=(PE+cODh(wEz+p9qM}f@548@ z5ruz{nf;@r_Yp4PoqX#SP{IR~Q;b8ixgQ<(KFuCZ`g9u?EIt9s=*@akj%S?od&##sWOek&v~c%6Y>yVq9*(=N zxf7A_@txcZ{!O}3e_^%rK1{s%Pqu~pQ4(z+L$?K2%?NL%(Mk{`aa0a(V+x1@+R+@;m)O2(bjg zCqlhwp=jRsC|$fpok|TGFQOL}gknkBr^Yh-b3!OayF}gU?@uQl>-l{y%IU{^In_K^ zMDL_@a4d6eEcNr2IlSp$pRIoPpvewsfMkw*j>o~Nl+5HslRPw9-m2d5_oM!cZJw={ zm4oqr58;n&dmqbc@;Dnae8hL(NI3cG*3r;ROj;M~j@9zW7)8+ML>duwi)J(`*#EVu z{NLs6KSy8Q6cg=olM328c^7>BU!RZ}+5b;13XrNK^dTtIph&{N81wqpkkS8do%+AR zmH&*v|G(?k|2*NoO};%Qo=yL2=f8f-O>LY!M6ZWi*_a4#1}VnFP$7v~xLzlsrq-cM ztl#rykW#*pFDX_9*Fw~I@2lF&91*Cb!g*I}qyQVFD<6i*=NT=yfV_yqwgGzLWS^0-!jz+dMY_Z8W}|zDfz>_2R0t` z4t%1MV^Q9Yn}FZU*W(#d9aOg9?TesVGPeDDpzjZ*R=r6k>p-poV+Tg!-?s?GR2tGPhMQ99z5S2q+<4u#ShINcaVV} zJbSIq3)H%Ohb~0261RorF>*nwPy< zWmQ$GzaMZ7qrmHBgkl;Zwat~fRPm_vh{qi`L#`-+mv$n=l6=4hM!CXN72BOKtPf3bo4)ytGFVENe*4f61ZC|e&q`Y6##cy%z zb2p0xY3c6Px{vzbW}}N7A-TEP-G5NN>CK}WliaRk@8XD&)W2cNaCh2nG-mynEvKsP z4gfZix8J*}3~7pVp9}+JWQG_DkODqr8mPBw@wJEFSMfm-G9ApXCn8YNNv(D<&K`B6 zN>|y6nU9yXvm+P01=xTLNF=Dhq1YH9-1m*3rOfqKB$uBWr8=;n)W0J$qmRw&#W3uY z_Zo$~4WEy09%u1yyHQGE?cIndRB3%43A|2?^wFPlsZYV1SO3#cRPmNGWrC_H=enE# z->(8YgVROG_vg?C)ZZJ(x0B!~y`b`h+3R4vRBSq+zz_~%w|nrHTwur*e$@mE`28bJ zij*KEe$au!ob3eJJ3}`n80{d}JN{K}Lizr7VRM5YCyaK#qOm{^#s=zz>W#UKe+h9} zQf=}<3LpkF7#VJAVlo4{UP9J_RWjCXG(7yfyEjf7ei`S)e6s^g4-YKFvA9!lv5;`R zcyL8VU%YYWqFT-n6RJ#5f^TI4G4!wrX#lr?u zYwpjV$ZkrW{l5j9;h3U9b;2wy){WLCWmE^#a+tRQA&M8x)N(mmGG4Yi24y-z=NVsi z>ebQEQsjF&N-0OCJ&3J<2J6o)$VGf!%=ZU-a`>P=NKA-ygtCIj?eM{#t+ZPCS0o*? zz4yHnhEI26gT-fSA^i%3@3hmy!S+cEW&NJ{Fa7qp40+TtSH0fh?G@bbH%99m?b@Ax zhOdaU5D;vF?c@g|2mh>A(asrg1FhPj4S~&8DLUN`1$xh1uC<%Z$~7xPen96eSQGp0 z3pZa%T_BqEIy)ZLM@(H!v7I(NCw4J=X*C2(}42O>4pLp4PI4 zP0nugOkmV6Dp+d%v6hRLfMlR^%Ld_X7;cc)n-0E-*zbZROYdzsoB}^^2)!J$kqz8d z*xw*$>%!966aEZK3yS#P_T9&9LdAkgeSRyUZT5n{!EVKmZ91J8{~B4a5JQg>JXUes>MkN!#70QzR+(H(hXF0E18wbpj@hY zCWt6*l%b=osio7PHC5*-K?Tr_K$D6to;7vGyv9mnf^o=N#=NJW)yi z)ga8Dn;-*N>yZs)<5SE~u^qIa>)KUI-d1KNz)d^`fIV4`#YdsQ60v2l)X-P;gioEnyvsEiAc`Nr#gO4EEPawRKkI^swp38`# z*k<@skW%-Qs7XG$CXK5C6%X!mLUX_l)x(S_nHJ+}OiKUh9-n3Dio>zA)wUsPkoH9i$9mIx+X9vZUTUA^QeMdne`l9svaNEBu;x@^gs*f_OG_(ID-V9SKap@~Km z6RcCn(I{WEe==tF(S8CJ3gwOxtXNVEi0MhqM=*z!y5dU11b(XQxc?ePqjWJ=vn;4% zzT2zm#`RbPDSI&!0k@osGz3PG6D6GJngEO-$nDYN>N>cE|D|<2t7Ce?4u;o7QiJkbrq%q zOi1g!aZCCna&m+X1l$FaS!Pm@2fUjM_&b$wX*{g7)0a2%7N~U7+wjRjAuGe&&hHYi z3F#e(TJ?xY7+6$qsxh&VyLRGiFu`Ey;S-Fs3e`@AS_`URz-}xcnDmi}_V}3M1gy)< z_kLpbZ_31yBB+laK%s*|S2g_^lH+%&mtuc_9a3MNY>-{E7!DK=Jyvq5s7swf3AZv5 z#joqm=IH%uLy)3dfqdtvNAOYD?B7@&YoBOE^=Y*{32Jik=|zR~ z`H`@#oSWjJk%f?l`-%7{j5{%&d~#j|;1&iqSD2hiCSsLfIzmCC@@^fgGBhu#HgAqu zz?XW4YGu!O#J8tH8i2a3kS3>vLL9e$p^m0m!UXA(4rQd^+q!ZoHOr1?pa@V$D?zvl zgJ0|PI!rad%VIO;Vm4-q~u@}p-)LwO43KF6AUZ| z5OZxS;u%yW!Nlf~Gw=x>SYTRG5`l)&P0`WS)mO;LXynThD!XixcovnlhBc=y?Rk;!$2GRg?hc^jCfr1YVR}7B? z%_wEQR8!OjArnJF2Jr`XU*OIVW{!z_8p$ix8jGIP5uH04q7X0b4w&ak9}g3TRmwZB@9C$??4j)$NK)u(+- zlz76|tyE7=QHEN^0!{iw>Vc!26`xv zD|qtSo=;vuHo@&6P){`Sx!HPmJSnONAi@0t?{U*>Kix9XNC)Xw#is#X`SU*Xa7V{!t9Mz5VL z)w1$_pc+!+N!_ukd4Z%SrS*EYoE5eJm4dhPoY!q7X*{VScP1U6+JHAag5eZ1Y~R@~ znKhkSB3Q`Uf6MmB!|zo)IL!)!lqzGIy3%#>PyiJ7 z{BIubSvv^mDcGcEr1ND67hW$GCk`=ydHY~tgDeWL2fufHUPw??ifQJ&{7k@TD!qU` z=kO_h6L3&b2P7a!?wYFG56az-uWFd+q=j4>_TpXw1n5ed2Vc3=4oit zW#oLRcr!9dCdud7)=|Ina(Thz#`TJ!{973BE|9-FM_|Wgyip?xo&W2sZ0vwsK&P3S zn7V4AH$iR?^;2Ta<67|N~NuTj%&Dv7mliO%?5y z!&~?D>bNrcs9|YvXKl^N=cX^-%7Gf{0hKR}!9lBg$!5IpWU-77 zOJHxj*+ah$bfPQD-sE|Urq;EaB1pc72#yg5B9!UW z(;PE&g1@6Tqp#oNd(cd!j6Z`{hvD*QR)7!xCuw6M%eyx=IVHq) zXtfPnQl^y90y;?>dXrH6?ts%6JgBO7hNjhnp-~?yGk--%1Vicd_iu-+cLaDeU%L6XP^lJkCFp-cV^qvlMg_e0+F1v^3P&(>nJAePMo9@`Xz z%|9G$Az}0)m(7Grq8O@Pv){!ISG|?n-TlE&r46PEbv2vvZ{Z=TC>FMVrO<3eDwPk& zSlm0Ys5hZFObN*KCiurhfIby=CNLB%Rd38R^@BAU7bZ4I*ao+cKWKSQxtx|)I@mbE z=misvgQ(-CR=$5Sl(40`cD87EuE1zV)csKV8r&Zd+5`JLVY@qO&&((1;P<;OCn^}H zHzMX~#B)iez5_b5So{f$PHO-CQ+z6@M@790-cfJKvHhcyYzsrQ@*_oXpp(Hd>$=4B&Kmwb1vD`u0@SsUeNhSMm6I52i9|#AS!g zS-Y-%HfGb;0HT;yBXRA_roMv>XT_tp?ALlzH~ognqhzV+EH0o5X#hFjZq}&9+5D#n z(f40h+>8SBx-;hr4LtB->&`9$i&<+PYm$kr>2|kEmIceYLf-aw8P#*_$}N04SF1Uj z@1KkLAT*_d&34gjf9ZH~ri_C(s*7o!CjBCbt*&`z^Ps{oH z$lYhc^J}H~<5tPdt`&2;_;q}1ILsFt#ebX`995XFXII$^0yKOyI^zF=aMEo8=mh?+tFqO7Sra_e~Gcc z3x5k|aG$=er~@uTx4by_2OZQMEdP}n5O3{EG79cal%EbtxPfvQq)p;};C67?pLn8n zh-&p_3)Un;fF0@bsHwdIg7O5jMS8 zpIw_p;`9V^J^s1OxL=Q9a;(jU-+V|^Dw{>bxOvp(M7smW24R5q zKIk~|wutsQF|dQTn3sSzzLS_h`@$g76yj|hvU+$&9xpm0uOWTCsL{OdnMW=N$>%Glq#K|8n1i@4YALkzvnOFt!jb$8)ZtsOog^kS%GhR0Xlt}wm z5u^%alaU1Ur_L`=htJ8hpw($L3UEkk-dyZiCI{unKc5dpGR}&yLbmGLV@R3ULuw#G z>YYA2dA__K&ih3=Hl6HKUJg5EJ3ax;g~298&o<<8woL75|8~;y666HIOX;{H{i05?<%FSOF_B7-!g4mF_8)zNKsfJw~y2LkC4iMoTv`RDKyWI(rfhvm{3 z4tYz$1-8@1mkGvmq_YM0=mb!Pq!BT`K*{2O`Qpb9fh$9_#r8MI?EXuvv^jtYhxd=U zAfm^3L^6p#1-H}nm+8NQt+&BDEa@K-Q6&D3wZ;)a+C#AN3y2fOd_;AwM0CwD9F$FG zLObX5_t86NnSHcS?cC{PQY}yq$`f$+5|KnkG6=Sfu`lf|-4)X3+%4Z{?761|&MyEJ zfR0?q2Q<*P`a6haTL%XFk&4glz@e<(!NMNGutiWp>7uooJrSYO)VU#-ClcqCL9R_{ znB7>;yD6ePKPMY)ZNR>a`uy`NA^9+`D*!H_I$|rARv~b)a;aDP36EO?TPTw2b$f)0 z@in4wAwt56KN8KhI&}A%_iVuSfhYbL+*YyvPgd#FYIooIL_KCkPE(Owu>j^!iN+Kc z=%Fi0J_;=v>3_pXlvHTkVzsM@1PJwX23H=Zy%wKBI5=%AFUi;_Us&2&#~0vR&*}eq zc=l>k4DsY)4Tf@f49-F%GO(SSrF-+Bh&M45QOh8Nn)NYE+~7AGkKfn?HEksmcV7Kpl91`yx{LP`3 zv0Crz1zZcaqnu7dPPJ-LVnX(gEEFPYvCuU7^bGWDzD8FdDTcR9DMnTz&2)0`2@S}q zbsE5^r^xId^<_OC@Qa_A|Im6!O-$q0Ah_ZG%2F3cOR(=om*18d!oTb)BzxpGz-?pd z>9Xv)w9=SOeju&9WvR9AoWT`BirhwtVmLkbtxNd4@#06-waWbB|qAf&W| zNU?Uj)|Pxs5$tB)D=KmmvQJ;qaBJe?v{dumYEw_xs%OWq1x$~j;(?`xKdh{ed-&4e zfMp73rP~)e=UXhIUL$uN(pZhJgAb;;hbhntq+zb}xZ#@@x6qH#A}HI?%6QL~zeQ&Y z*1%DO>F#xTP4YSxKOO?8>BtO*7`%TL>wO*(67(xh5s9FM6;%mSs3uF|i|L;?XNH`g zKg@bRllvd!vUW0jR4a)NN3f*uZ(tudp(;oirnWTd{Nl}OwTTYU(X1Q*9cp(?d5D*e z-4}$FH*AVWV%u#^ot@rgsu8P^;vN~3$pvE@E|XNLD~ZLZuhuJ3c6aXAsbNDOeVpD> zrPTn2E|q7W_q|Y-1(lSeF_6YYF)_5oso?yI)w=ZPn37ES7tr%1^T_KHD%# z_bi)*m)Esj z9~Eg)3yP$3b)!Z=~`WyxQA{FQ^)>NKUqz5DXL$mTMmC~ecjDVds+4<+O7*& za`hdRFuC=1JwJ5yvWoN|N=@vQ$gmBshluzP+%7eYC=z^pXQf)-KGKBR2_M8BLM6tg zsE{Y_=?OS(EU&+a5|K|qOc-BioG%RNh$z~byj2I2Jd|$-M zk>}Igu8J0Uue*@TA+(z>Fu?pz;f9Tsap2=cNFM)UoR#+$grO>xxl(fWFe{_Z!#S}! zu_Rh4$?ezW+gdwsqxne9$gsu-xb9RxZ4N@3A;-iX=ZO3n+Kyf=_u^YBCs{_S5KCJj zmO*X4!c4S+J4PvLaze@pwe1r>I_%8<_NTp?TjP;5VGNTGmF5Z;{CfmbxHvyjrZyiE z3{t#YARtC2_&`C#LgT#8t(=mlkYDIMjI5lpxgK1tW&Q=M%HNY*ny)0MI7Fc6P9@zF z;K?{YKoS0{XlK1JbVw17pkzn9=ig}~&b?;PI%fe!fn-Lcsb)Ss4YEQE|5qUQiU_^~ zrNA$j7C}77{9s%W2G!F`YGac~U#Eii#G6nEpvoN>F%z7^w6GO;5xR}Sc(}(h(l=rW zD^@eQd+!*}7I7QM!YZcnQmiFj)^?0@KHQ_I`LthU`Q-3Op#{$y$Z_San_nv7;v$o^ zMBs%;7zGhQ$UyHV9Lg1Qtz_Xg5%TUNxJrj3`Ok6{MH;yUnf9OA3JvKmFM9L4r+MMX z5TDcir*N>au7>3rLXMTPwI%aQh4zSv|A`JtO9oF6FuiQ0u=pR`4NrDyYX3VA%aZtb zv5|m;35lmjrnc^avtDRJhJR$lfxkRo!b0`_n`BKmg-1z~009hzEZ7q3ak%%rU~X#N;gwOw2^~mtwaRSFR7wgL$hg}(LRIqb+1fQj`?#|xW@@ZX=0#*6 znK1MchY@oIR9pm)Lq-A4@lt!OOVMbmD?8?=)o-9;{ch<&RC`#dnp)DiAsu8v6n{g) z-&ygU?#OjWLX-FJ$Wlc!V-eaKlaVaHu-V3GcsKDYQExUvPRd})BW*NE9Cf8$S87V=?Gmq7YGpv)P8r6 z@=pd2qml-CXS67jEdWk$cZwTO#XB}D#*^m<;&xU}F@CeI-{@}Bs1mDRKyTq*C{H)g zowwlb5PyqMt~N=sbSF`%@3Cob4CHXcG_|lv{!vb3EhOfTn{2LI{iEx}9%MOCpjSpt zLR+{M^_Foj-eZ1i7GKV*EtxOQeNbig`w$}`7|781Vy`Isd;`coqbDdSMJ*y6yOo@oaG$%`mQYHkvutBE$(x zjh-}9*ur7P0nzR4z$LV>;byha2e~!ZAr30Obag9;Ij%t?WyOAl(+4>U^x=4Knm$yy z^V{63pG`3xVbxBBLvFyCNRHsvG1S-_Y_>&7d~h>w$pLav8|46bZjRb+qP}nIk9cqwrx9^{N_J%F;#PUs?N==_OrP(g4lM`CPVL~S>>@(I1~>bK z{EUl0#X_~s?9S4TP`pSs)Tmi1zCiv9ynXh-v??7gb_$!`u3vX*vXD#Z1u}z<>hZ-+ z|E9y#<5V^yvxfA&<;Xh?PvfbiF-3DAuVZD#w>BRG17(4QSpQA%SIBgi50VIZKK^oL ztd3}M@Ij92(HHm}fv1huQXBIyU$Kr;7H{9M*WbqXm&FYc_CHe#DXxU-#_*E{d@D;F z0S*?LB*5`Qgg%1Q$nO+twq5N?@3+H5B zK_#>b#|a~xJW$n`QpDaVoT65KGfL;2WTY`FnZ~l+3+gj97;k%%@TU8i`C@OCgb*2M z0)`%^5GowkFhqey;rj@OQP75=u9I2V%wPyxn}8i~o%QzC)Kok^&W-tDTU~`g`P62G zC5>63Bw>jkt=`S`-irP}A=l--!NH!9jm|W)lchh!3CyNF~GmKP+k;IR2k{YN!NAxjyu}yIUxJQq`37~Z4cQ_|JhwPXHI1e+GzQz(s z`TPq*6|hgAxrr>ejgZ*w=I(iAMk?u}1HV@+`8&eZlVk#V@p{wc^(C<(Lc#n$mW)b@ z2K7u3-SYzkn2;@{e^lm-{+rz!Qmf!z`jDM9(3Top>)Kpp$dg4-K}BEr7?>Kr2t9Df z?3Ui>RXrmFD=xw6DI^^*X%9e{G!;6LA+!(j&lCw89|y_e>gLn1gwTJcej!}|0+wow z&xQ*Y(%bWPII_UX6W)@~{dAgYl_4)L3VYWgfYJ*KO-MT0V&87_|BU~m`vw754lUe< zL=k}?0fl+xP+`Lt%%92yq~j%_l@zs_?50u%BV#@LuRUBI=_%8S6QkWkNJ4`!(p;Xi zREd@7E359C!Ug`a@6Q1Hq;?>XoB;#@q4WFk!{^eE_n2!ejg18cd70UQS4H$YIZ!b% zgZQEQN~l8%!EwU&L&pmPsP>7vE!#F$wxOR|lc+E{YjJ>&PF7r2SGdk67?tXQ#wT!r zEZ?JW?*T%`J4n_#0us{V#p8rbnJzVj%M%P~WX3D_K7$5JxN@7t^UiSVf8zYiQ$vOr7}-k8 zMg{`SMvcF=z?mEzny~7VSxu!OIqUP(Kfn5|wQL&<7ZL}USWyQ&^xoL#apF`Q4ib;~ z^vsQh4H>{hK*FT|{WE@Qlus^KJ|;9(j?=b4CSugnZ|o{zG|6B-)qR&FRwO-C!UK&IHJL>sf{w443-4M|hpV|pz=XqudovM&0q(5YsPLQMzW%?JN)7f;v;W-l4AEm)+z-0P5UEQtO8BzystiPHZ zcm21ch8|I4$!x{!VR|o?KqW^et8Lw_ax?Yz#d\%9r~F@xR0pxIlbm#|}R&!7K# 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 z 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 k?8iUU9@mwxaPGn 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%0DlLDMhm2@vI1ZvbZ*FP+F%Eg+ zQ_fph2kbe6vwu0DjCSH_qm$%4CP(Rq0ePnz+r^kH1rxc|z{r80!9SH;^6T``#|18$ zYRcMluA4yT7cm}23~+Yu07B3=l(+X=#bvYmC$MIV(T=w=Si<8H;luT;*4=WyXNOh- z!>F}hD7mON`9l_~EE*j7@R#~{LF;TT+Apxi?y9s8JyR^Z!`z56dfk_@pC$rIs7e$S zbL#Hl7)`4EijU)XnS;txV!7@w2c(ET|G31I40%(n9J za5@5om?|*c7KVo*mri_&$E~SE9m@EeMe>|IXiH7VpSyZ6Fw_V1KD%CAoP#! z`!##1xTVSy+gMS(uAN4$uEva&FS<^JeF(qGIF!UitGRbbI$Y+n6M44-+4WEiAOMS? zIkTCNEJ*r_9>YP{7J|?h!_B1JsgcC~2LOOEllol*5zLzNa{TNZs+g!n4Cy??R1saz z_yamirk_E%-zCuD(dx1Iqg~+72iQ=(@^1?Hxa)~pvb;5-Y`?g$LmM%5m4n45pz$5C z#AvOldZ)1~95Qm+c#WOKimy7>h=*%IG>w{wlP_O9GMDu8^RhoznAC!DBI0q)gLOn~ z!Ss8Hflbfl-?LHKhg6OZo4X+m2ERiaH8b_Y&kl=GUS74M*bX`T0!+LzE~| z{-K!`H>)mEI?E-mt>(ddiid=xq~e5!3|Ep=y^H0ljrI=b6E%R}G^4BK^5%GEI6^o; zpR3_QzSs(h6qg)!MNA~x$zdW(F_*Oi79D#nIc4`}MoV;@<`wj7fOjMYqGK|McwtX?x}$OEVKD#O!2#x)=8K^yn&xn?grK0ZAw?0qS`m9sj4#f`qGJ{B zJsF?xstdoGVu9$WU2z;8BrMhQ^I*CY-q+(1JT@9RQJ1&N)g(~4?8Y1`W`04F4ULuuiSz+WW34%VzX^Y&ihAul@OW=GB*dIS(cMdS31 zrfxePE|OKw>!VQXC!}*0Lgh+DNKrRjx}>hYiP?aud(w&+^7fT>vrVav$0fvz*ZH6O zB}lD&-_;ia3OFZ8Cp!$Cp3ny?eJ-p%03!pwl6vDWKBK?lVs;v>I@>=Z)}KFjI%L(( zeD+`a=3i2vSY~x^K(yF^Qh?DtfMWlAdWc&cFjyK9;>1U@ATo)=!{p z0_6@o-rjl4xJR&Nn~=u*8}XyY_ipWASWki)3hFe_Xsf(6b@ev1lqqm%Ci4Z%l$wyG z3WGN!^K%fD(Lw|q!7a6PTK^qT0YyTHp<>RB3BftE4OimC+7#S8!oUF!fhvgt(%2DJLn_dl;{p|ML*Au#BmH?7}B>PgrFO9?fHdV+9dZuMBh<>8T zWMJXo*iraC6WTMjVN$OPhM3sBMw6|b-h@G~e6p+Y24r^nyS6%xN(`b*grj
)QSt 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 z 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 l@NAi`fft@| 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

)Oe348*>)O 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° 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 diff --git a/docs/images/before.png b/docs/images/before.png index 7386ee213b72acd29a6a50496a7762419e6db18c..31b910607ba3734b364d3ae8fdc8e39b93149529 100644 GIT binary patch literal 161429 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 literal 98194 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

q%G$yP|- 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�XAwN(TSRPot&c73QtDj#|u0(x^eD& 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
uH$Bd{GLxDUX@S)$zc>BU{6 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.toStackTraceFrame(): StackTraceFrame = - StackTraceFrame( - foldRight(null) { frame, acc -> - StackTraceFrame(acc, frame) - }, ARTIFICIAL_FRAME - ) + private fun List.toStackTraceFrame(): StackTraceFrame? = + foldRight(null) { frame, acc -> + StackTraceFrame(acc, frame) + } private fun createOwner(completion: Continuation, frame: StackTraceFrame?): Continuation { if (!isInstalled) return completion val info = DebugCoroutineInfoImpl(completion.context, frame, sequenceNumber.incrementAndGet()) - val owner = CoroutineOwner(completion, info) + val owner = CoroutineOwner(completion, info, frame) capturedCoroutinesMap[owner] = true if (!isInstalled) capturedCoroutinesMap.clear() return owner @@ -453,9 +452,9 @@ internal object DebugProbesImpl { */ private class CoroutineOwner( @JvmField val delegate: Continuation, - @JvmField val info: DebugCoroutineInfoImpl + @JvmField val info: DebugCoroutineInfoImpl, + private val frame: CoroutineStackFrame? ) : Continuation by delegate, CoroutineStackFrame { - private val frame get() = info.creationStackBottom override val callerFrame: CoroutineStackFrame? get() = frame?.callerFrame @@ -473,10 +472,12 @@ internal object DebugProbesImpl { private fun sanitizeStackTrace(throwable: T): List { val stackTrace = throwable.stackTrace val size = stackTrace.size - val traceStart = 1 + stackTrace.indexOfLast { it.className == "kotlin.coroutines.jvm.internal.DebugProbesKt" } + val probeIndex = stackTrace.indexOfLast { it.className == "kotlin.coroutines.jvm.internal.DebugProbesKt" } if (!sanitizeStackTraces) { - return List(size - traceStart) { stackTrace[it + traceStart] } + return List(size - probeIndex) { + if (it == 0) createArtificialFrame(ARTIFICIAL_FRAME_MESSAGE) else stackTrace[it + probeIndex] + } } /* @@ -487,8 +488,9 @@ internal object DebugProbesImpl { * If an interval of internal methods ends in a synthetic method, the outermost non-synthetic method in that * interval will also be included. */ - val result = ArrayList(size - traceStart + 1) - var i = traceStart + val result = ArrayList(size - probeIndex + 1) + result += createArtificialFrame(ARTIFICIAL_FRAME_MESSAGE) + var i = probeIndex + 1 while (i < size) { if (stackTrace[i].isInternalMethod) { result += stackTrace[i] // we include the boundary of the span in any case diff --git a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt index cf6506ef06..48e8790cd1 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt @@ -7,8 +7,6 @@ package kotlinx.coroutines.internal import kotlinx.coroutines.* -import _COROUTINE.ARTIFICIAL_FRAME_PACKAGE_NAME -import _COROUTINE.ArtificialStackFrames import java.util.* import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* @@ -20,8 +18,6 @@ import kotlin.coroutines.intrinsics.* private const val baseContinuationImplClass = "kotlin.coroutines.jvm.internal.BaseContinuationImpl" private const val stackTraceRecoveryClass = "kotlinx.coroutines.internal.StackTraceRecoveryKt" -private val ARTIFICIAL_FRAME = ArtificialStackFrames().coroutineBoundary() - private val baseContinuationImplClassName = runCatching { Class.forName(baseContinuationImplClass).canonicalName }.getOrElse { baseContinuationImplClass } @@ -46,7 +42,7 @@ private fun E.sanitizeStackTrace(): E { val adjustment = if (endIndex == -1) 0 else size - endIndex val trace = Array(size - lastIntrinsic - adjustment) { if (it == 0) { - ARTIFICIAL_FRAME + artificialFrame("Coroutine boundary") } else { stackTrace[startIndex + it - 1] } @@ -95,13 +91,13 @@ private fun recoverFromStackFrame(exception: E, continuation: Co * IllegalStateException * at foo * at kotlin.coroutines.resumeWith - * at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + * (Coroutine boundary) * at bar * ...real stackTrace... * caused by "IllegalStateException" (original one) */ private fun createFinalException(cause: E, result: E, resultStackTrace: ArrayDeque): E { - resultStackTrace.addFirst(ARTIFICIAL_FRAME) + resultStackTrace.addFirst(artificialFrame("Coroutine boundary")) val causeTrace = cause.stackTrace val size = causeTrace.frameIndex(baseContinuationImplClassName) if (size == -1) { @@ -191,7 +187,12 @@ private fun createStackTrace(continuation: CoroutineStackFrame): ArrayDeque.frameIndex(methodName: String) = indexOfFirst { methodName == it.className } private fun StackTraceElement.elementWiseEquals(e: StackTraceElement): Boolean { diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt index aa5a6a17e1..bf3fd3a3ca 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferFromScope.txt @@ -1,10 +1,10 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:109) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:167) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:162) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendFromScope$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:172) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:112) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:109) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt index 4908d3be38..612d00de06 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithContextWrapped.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithContextWrapped$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:98) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:199) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:194) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithContextWrapped$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:100) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt index 1eb464c71b..833afbf8aa 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testOfferWithCurrentContext.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithCurrentContext$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:86) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:210) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:205) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testOfferWithCurrentContext$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:89) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt index af8c1fd389..66bb5e5e2e 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:97) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelReceive(StackTraceRecoveryChannelsTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:101) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:97) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt index 3f392cd31d..76c0b1a8fa 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testReceiveFromClosedChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:110) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelReceive(StackTraceRecoveryChannelsTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:111) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testReceiveFromClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:110) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt index 49c3628bb2..9f932032bd 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendFromScope.txt @@ -1,10 +1,10 @@ kotlinx.coroutines.RecoverableTestCancellationException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:136) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.sendInChannel(StackTraceRecoveryChannelsTest.kt:167) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendWithContext$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:162) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$sendFromScope$2.invokeSuspend(StackTraceRecoveryChannelsTest.kt:172) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1$deferred$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:126) Caused by: kotlinx.coroutines.RecoverableTestCancellationException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendFromScope$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:136) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt index 4a8e320e2d..dab728fa79 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToChannel.txt @@ -2,11 +2,11 @@ java.util.concurrent.CancellationException: RendezvousChannel was cancelled at kotlinx.coroutines.channels.AbstractChannel.cancel(AbstractChannel.kt:630) at kotlinx.coroutines.channels.ReceiveChannel$DefaultImpls.cancel$default(Channel.kt:311) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:52) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelSend(StackTraceRecoveryChannelsTest.kt:73) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:56) Caused by: java.util.concurrent.CancellationException: RendezvousChannel was cancelled at kotlinx.coroutines.channels.AbstractChannel.cancel(AbstractChannel.kt:630) at kotlinx.coroutines.channels.ReceiveChannel$DefaultImpls.cancel$default(Channel.kt:311) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToChannel$1$job$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:52) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt index f2609594f3..54fdbb3295 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/channels/testSendToClosedChannel.txt @@ -1,8 +1,8 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest.channelSend(StackTraceRecoveryChannelsTest.kt:74) at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:44) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryChannelsTest$testSendToClosedChannel$1.invokeSuspend(StackTraceRecoveryChannelsTest.kt:43) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt index 0e75e64511..6b40ec8308 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcher.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcher$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -9,4 +9,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcher$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt index 0792646ed4..5afc559fe0 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testEventLoopDispatcherSuspending.txt @@ -1,10 +1,10 @@ otlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:99) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:116) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:110) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:101) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testEventLoopDispatcherSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:89) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:99) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt index f3ca1fc4e0..406b2d1c9c 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContext.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopChangedContext$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:54) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt index dbb574fead..86ec5e4bb2 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopChangedContextSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:124) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:115) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopChangedContextSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:102) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt index e17e2db685..d9098bbaad 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcher.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopDispatcher$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:47) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt index 26e035992c..8caed7ac0c 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedEventLoopDispatcherSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:124) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:115) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedEventLoopDispatcherSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:95) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:113) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt index f247920ee5..a2cd009dc8 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfined.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfined$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:27) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -10,4 +10,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfined$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:27) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt index b7ae52c9d3..a786682b7e 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContext.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedChangedContext$1$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:34) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt index 241a3b2342..8c937a7c6b 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedChangedContextSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:148) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedChangedContextSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:94) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt index 4484c66432..b6eef47911 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testNestedUnconfinedSuspending.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$4.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:148) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) @@ -8,4 +8,4 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testNestedUnconfinedSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:87) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt index 4f0103ecc8..9b9cba3eb4 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfined.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfined$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$withContext$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:76) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doFastPath(StackTraceRecoveryResumeModeTest.kt:71) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:62) @@ -9,4 +9,4 @@ kotlinx.coroutines.RecoverableTestException Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeFastPath(StackTraceRecoveryResumeModeTest.kt:61) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfined$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:40) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt index fb742a3076..ca0bbe7fb8 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/resume-mode/testUnconfinedSuspending.txt @@ -1,9 +1,9 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.doSuspendingPath(StackTraceRecoveryResumeModeTest.kt:140) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest.testResumeModeSuspending(StackTraceRecoveryResumeModeTest.kt:130) at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testUnconfinedSuspending$1.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:82) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoveryResumeModeTest$testResumeModeSuspending$2.invokeSuspend(StackTraceRecoveryResumeModeTest.kt:128) - at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) + at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt index 2e86a7ad18..dbc39ccc55 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectCompletedAwait.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:40) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:41) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectCompletedAwait$1.invokeSuspend(StackTraceRecoverySelectTest.kt:40) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt index 5a9a65e400..3bfd08e590 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/select/testSelectJoin.txt @@ -1,6 +1,6 @@ kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$2$1.invokeSuspend(StackTraceRecoverySelectTest.kt) - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$testSelectJoin$1.invokeSuspend(StackTraceRecoverySelectTest.kt) Caused by: kotlinx.coroutines.RecoverableTestException at kotlinx.coroutines.exceptions.StackTraceRecoverySelectTest$doSelect$2$1.invokeSuspend(StackTraceRecoverySelectTest.kt) diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt index ac40dc152b..ab23c9a369 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild.txt @@ -1,7 +1,7 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerChildWithTimeout(StackTraceRecoveryWithTimeoutTest.kt:48) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$testStacktraceIsRecoveredFromLexicalBlockWhenTriggeredByChild$1.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:40) Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) - at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) + at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt index 9d5ddb6621..d3497face6 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPoint.txt @@ -1,5 +1,5 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.suspendForever(StackTraceRecoveryWithTimeoutTest.kt:42) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$outerWithTimeout$2.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:32) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerWithTimeout(StackTraceRecoveryWithTimeoutTest.kt:31) @@ -7,4 +7,4 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) - at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:492) + at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:492) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt index 6f21cc6b30..8ec7691e50 100644 --- a/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt +++ b/kotlinx-coroutines-core/jvm/test-resources/stacktraces/timeout/testStacktraceIsRecoveredFromSuspensionPointWithChild.txt @@ -1,9 +1,9 @@ kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms - at _COROUTINE._BOUNDARY._(CoroutineDebugging.kt) + (Coroutine boundary) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.suspendForever(StackTraceRecoveryWithTimeoutTest.kt:92) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$outerChild$2.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:78) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest.outerChild(StackTraceRecoveryWithTimeoutTest.kt:74) at kotlinx.coroutines.exceptions.StackTraceRecoveryWithTimeoutTest$testStacktraceIsRecoveredFromSuspensionPointWithChild$1.invokeSuspend(StackTraceRecoveryWithTimeoutTest.kt:66) Caused by: kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 200 ms at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116) - at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) + at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86) \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt index dbb1ead568..a85bb7a23c 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryNestedScopesTest.kt @@ -12,7 +12,7 @@ class StackTraceRecoveryNestedScopesTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.failure(StackTraceRecoveryNestedScopesTest.kt:9)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.access\$failure(StackTraceRecoveryNestedScopesTest.kt:7)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$createFailingAsync\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:12)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callWithTimeout\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:23)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callCoroutineScope\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:29)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$$TEST_MACROS\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:36)\n" + @@ -82,7 +82,7 @@ class StackTraceRecoveryNestedScopesTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.failure(StackTraceRecoveryNestedScopesTest.kt:23)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest.access\$failure(StackTraceRecoveryNestedScopesTest.kt:7)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$createFailingAsync\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:26)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callWithTimeout\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:37)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$callCoroutineScope\$2.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:43)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryNestedScopesTest\$testAwaitNestedScopes\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryNestedScopesTest.kt:68)\n" + diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt index 574b27a815..8dc106bc22 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt @@ -35,7 +35,7 @@ class StackTraceRecoveryTest : TestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1\$createDeferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:99)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:49)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:44)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testAsync\$1.invokeSuspend(StackTraceRecoveryTest.kt:17)\n", @@ -57,7 +57,7 @@ class StackTraceRecoveryTest : TestBase() { val stacktrace = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCompletedAsync\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:44)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.oneMoreNestedMethod(StackTraceRecoveryTest.kt:81)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.nestedMethod(StackTraceRecoveryTest.kt:75)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCompletedAsync\$1.invokeSuspend(StackTraceRecoveryTest.kt:71)", @@ -91,7 +91,7 @@ class StackTraceRecoveryTest : TestBase() { outerMethod(deferred, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testWithContext\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerMethod\$2.invokeSuspend(StackTraceRecoveryTest.kt:151)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.outerMethod(StackTraceRecoveryTest.kt:150)\n" + @@ -128,7 +128,7 @@ class StackTraceRecoveryTest : TestBase() { outerScopedMethod(deferred, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCoroutineScope\$1\$deferred\$1.invokeSuspend(StackTraceRecoveryTest.kt:143)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.innerMethod(StackTraceRecoveryTest.kt:158)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerScopedMethod\$2\$1.invokeSuspend(StackTraceRecoveryTest.kt:193)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$outerScopedMethod\$2.invokeSuspend(StackTraceRecoveryTest.kt:151)\n" + @@ -227,7 +227,7 @@ class StackTraceRecoveryTest : TestBase() { "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.throws(StackTraceRecoveryTest.kt:280)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.access\$throws(StackTraceRecoveryTest.kt:20)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$throws\$1.invokeSuspend(StackTraceRecoveryTest.kt)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaiter(StackTraceRecoveryTest.kt:285)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testNonDispatchedRecovery\$await\$1.invokeSuspend(StackTraceRecoveryTest.kt:291)\n" + "Caused by: kotlinx.coroutines.RecoverableTestException") @@ -244,7 +244,7 @@ class StackTraceRecoveryTest : TestBase() { } catch (e: Throwable) { verifyStackTrace(e, "kotlinx.coroutines.RecoverableTestException\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCancellableContinuation\$1.invokeSuspend(StackTraceRecoveryTest.kt:329)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest.awaitCallback(StackTraceRecoveryTest.kt:348)\n" + "\tat kotlinx.coroutines.exceptions.StackTraceRecoveryTest\$testCancellableContinuation\$1\$1.invokeSuspend(StackTraceRecoveryTest.kt:322)\n" + "Caused by: kotlinx.coroutines.RecoverableTestException\n" + diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt b/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt index 5d85c9c9f2..f79ad4ba74 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/Stacktraces.kt @@ -33,10 +33,25 @@ public fun toStackTrace(t: Throwable): String { } public fun String.normalizeStackTrace(): String = - replace(Regex(":[0-9]+"), "") // remove line numbers + applyBackspace() + .replace(Regex(":[0-9]+"), "") // remove line numbers .replace("kotlinx_coroutines_core_main", "") // yay source sets .replace("kotlinx_coroutines_core", "") .replace(Regex("@[0-9a-f]+"), "") // remove hex addresses in debug toStrings .lines().joinToString("\n") // normalize line separators +public fun String.applyBackspace(): String { + val array = toCharArray() + val stack = CharArray(array.size) + var stackSize = -1 + for (c in array) { + if (c != '\b') { + stack[++stackSize] = c + } else { + --stackSize + } + } + return String(stack, 0, stackSize) +} + public fun String.count(substring: String): Int = split(substring).size - 1 \ No newline at end of file diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 6748a2f3df..9d23aeb2ac 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -123,7 +123,7 @@ Coroutine "coroutine#2":DeferredCoroutine{Active}@289d1c02, state: SUSPENDED at ExampleKt.combineResults(Example.kt:11) at ExampleKt$computeValue$2.invokeSuspend(Example.kt:7) at ExampleKt$main$1$deferred$1.invokeSuspend(Example.kt:25) - at _COROUTINE._CREATION._(CoroutineDebugging.kt) + (Coroutine creation stacktrace) at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25) at kotlinx.coroutines.BuildersKt.async$default(Unknown Source) diff --git a/kotlinx-coroutines-debug/src/DebugProbes.kt b/kotlinx-coroutines-debug/src/DebugProbes.kt index be5c4557e2..373864adb8 100644 --- a/kotlinx-coroutines-debug/src/DebugProbes.kt +++ b/kotlinx-coroutines-debug/src/DebugProbes.kt @@ -134,7 +134,7 @@ public object DebugProbes { * * Coroutine "coroutine#42":StandaloneCoroutine{Active}@58fdd99, state: SUSPENDED * at MyClass$awaitData.invokeSuspend(MyClass.kt:37) - * at _COROUTINE._CREATION._(CoroutineDebugging.kt) + * (Coroutine creation stacktrace) * at MyClass.createIoRequest(MyClass.kt:142) * at MyClass.fetchData(MyClass.kt:154) * at MyClass.showData(MyClass.kt:31) diff --git a/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt b/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt index 4fecb83e47..fd0279123f 100644 --- a/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt +++ b/kotlinx-coroutines-debug/test/CoroutinesDumpTest.kt @@ -25,7 +25,7 @@ class CoroutinesDumpTest : DebugTestBase() { "Coroutine \"coroutine#1\":DeferredCoroutine{Active}@1e4a7dd4, state: SUSPENDED\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.sleepingNestedMethod(CoroutinesDumpTest.kt:95)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.sleepingOuterMethod(CoroutinesDumpTest.kt:88)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n", @@ -51,7 +51,7 @@ class CoroutinesDumpTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.nestedActiveMethod(CoroutinesDumpTest.kt:141)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.activeMethod(CoroutinesDumpTest.kt:133)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest\$testRunningCoroutine\$1$deferred\$1.invokeSuspend(CoroutinesDumpTest.kt:41)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n" + @@ -81,7 +81,7 @@ class CoroutinesDumpTest : DebugTestBase() { "\tat java.lang.Thread.sleep(Native Method)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.nestedActiveMethod(CoroutinesDumpTest.kt:111)\n" + "\tat kotlinx.coroutines.debug.CoroutinesDumpTest.activeMethod(CoroutinesDumpTest.kt:106)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:99)\n" + diff --git a/kotlinx-coroutines-debug/test/DebugProbesTest.kt b/kotlinx-coroutines-debug/test/DebugProbesTest.kt index bc0c1e3f24..4b39438138 100644 --- a/kotlinx-coroutines-debug/test/DebugProbesTest.kt +++ b/kotlinx-coroutines-debug/test/DebugProbesTest.kt @@ -20,7 +20,7 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:14)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:49)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:44)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsync\$1.invokeSuspend(DebugProbesTest.kt:17)\n", @@ -40,11 +40,11 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:62)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable\$default(Cancellable.kt)\n" + @@ -71,11 +71,11 @@ class DebugProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$createDeferred\$1.invokeSuspend(DebugProbesTest.kt:16)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.oneMoreNestedMethod(DebugProbesTest.kt:71)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.nestedMethod(DebugProbesTest.kt:66)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest\$testAsyncWithSanitizedProbes\$1\$1.invokeSuspend(DebugProbesTest.kt:87)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.debug.DebugProbesTest.testAsyncWithSanitizedProbes(DebugProbesTest.kt:38)", diff --git a/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt b/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt index 8b5724219e..e7fdeede79 100644 --- a/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt +++ b/kotlinx-coroutines-debug/test/RunningThreadStackMergeTest.kt @@ -32,7 +32,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$suspendingFunction\$2.invokeSuspend(RunningThreadStackMergeTest.kt:77)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunction(RunningThreadStackMergeTest.kt:75)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchCoroutine\$1.invokeSuspend(RunningThreadStackMergeTest.kt:68)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -87,7 +87,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$suspendingFunctionWithContext\$2.invokeSuspend(RunningThreadStackMergeTest.kt:124)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunctionWithContext(RunningThreadStackMergeTest.kt:122)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchEscapingCoroutine\$1.invokeSuspend(RunningThreadStackMergeTest.kt:116)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -126,7 +126,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.nonSuspendingFun(RunningThreadStackMergeTest.kt:83)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest.suspendingFunctionWithoutContext(RunningThreadStackMergeTest.kt:160)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$launchEscapingCoroutineWithoutContext\$1.invokeSuspend(RunningThreadStackMergeTest.kt:153)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", ignoredCoroutine = ":BlockingCoroutine" ) { @@ -158,7 +158,7 @@ class RunningThreadStackMergeTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump(StacktraceUtils.kt)\n" + "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump\$default(StacktraceUtils.kt)\n" + "\tat kotlinx.coroutines.debug.RunningThreadStackMergeTest\$testRunBlocking\$1.invokeSuspend(RunningThreadStackMergeTest.kt)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt)\n") } diff --git a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt index 779c624533..fd1c288238 100644 --- a/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt +++ b/kotlinx-coroutines-debug/test/SanitizedProbesTest.kt @@ -27,11 +27,11 @@ class SanitizedProbesTest : DebugTestBase() { val traces = listOf( "java.util.concurrent.ExecutionException\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$createDeferredNested\$1.invokeSuspend(SanitizedProbesTest.kt:97)\n" + - "\tat _COROUTINE._BOUNDARY._(CoroutineDebugging.kt)\n" + + "\t(Coroutine boundary)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.oneMoreNestedMethod(SanitizedProbesTest.kt:67)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest.nestedMethod(SanitizedProbesTest.kt:61)\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$testRecoveredStackTrace\$1.invokeSuspend(SanitizedProbesTest.kt:50)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.TestBase.runTest\$default(TestBase.kt:141)\n" + @@ -51,7 +51,7 @@ class SanitizedProbesTest : DebugTestBase() { verifyDump( "Coroutine \"coroutine#3\":BlockingCoroutine{Active}@7d68ef40, state: RUNNING\n" + "\tat java.lang.Thread.getStackTrace(Thread.java)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.TestBase.runTest\$default(TestBase.kt:141)\n" + @@ -59,7 +59,7 @@ class SanitizedProbesTest : DebugTestBase() { "Coroutine \"coroutine#4\":DeferredCoroutine{Active}@75c072cb, state: SUSPENDED\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$createActiveDeferred\$1.invokeSuspend(SanitizedProbesTest.kt:63)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:23)\n" + "\tat kotlinx.coroutines.BuildersKt__Builders_commonKt.async\$default(Builders.common.kt)\n" + @@ -83,12 +83,12 @@ class SanitizedProbesTest : DebugTestBase() { expect(3) verifyDump("Coroutine \"coroutine#1\":BlockingCoroutine{Active}@35fc6dc4, state: RUNNING\n" + "\tat java.lang.Thread.getStackTrace(Thread.java:1552)\n" + // Skip the rest - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)", "Coroutine \"coroutine#2\":StandaloneCoroutine{Active}@1b68b9a4, state: SUSPENDED\n" + "\tat definitely.not.kotlinx.coroutines.SanitizedProbesTest\$launchSelector\$1\$1\$1.invokeSuspend(SanitizedProbesTest.kt)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n" + "\tat kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25)\n" + "\tat kotlinx.coroutines.BuildersKt__Builders_commonKt.launch\$default(Builders.common.kt)\n" + diff --git a/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt b/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt index 801b74b1aa..c762725569 100644 --- a/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt +++ b/kotlinx-coroutines-debug/test/ScopedBuildersTest.kt @@ -17,7 +17,7 @@ class ScopedBuildersTest : DebugTestBase() { yield() verifyDump( "Coroutine \"coroutine#1\":BlockingCoroutine{Active}@16612a51, state: RUNNING\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)\n", "Coroutine \"coroutine#2\":StandaloneCoroutine{Active}@6b53e23f, state: SUSPENDED\n" + @@ -25,7 +25,7 @@ class ScopedBuildersTest : DebugTestBase() { "\tat kotlinx.coroutines.debug.ScopedBuildersTest.doWithContext(ScopedBuildersTest.kt:47)\n" + "\tat kotlinx.coroutines.debug.ScopedBuildersTest\$doInScope\$2.invokeSuspend(ScopedBuildersTest.kt:41)\n" + "\tat kotlinx.coroutines.debug.ScopedBuildersTest\$testNestedScopes\$1\$job\$1.invokeSuspend(ScopedBuildersTest.kt:30)\n" + - "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" + + "\t(Coroutine creation stacktrace)\n" + "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt:116)") job.cancelAndJoin() finish(4) diff --git a/kotlinx-coroutines-debug/test/StacktraceUtils.kt b/kotlinx-coroutines-debug/test/StacktraceUtils.kt index 64af7e2681..8c591ebd44 100644 --- a/kotlinx-coroutines-debug/test/StacktraceUtils.kt +++ b/kotlinx-coroutines-debug/test/StacktraceUtils.kt @@ -7,9 +7,6 @@ package kotlinx.coroutines.debug import java.io.* import kotlin.test.* -private val coroutineCreationFrameRegex = - Regex("\n\tat _COROUTINE._CREATION._[^\n]*\n") - public fun String.trimStackTrace(): String = trimIndent() .replace(Regex(":[0-9]+"), "") @@ -17,6 +14,22 @@ public fun String.trimStackTrace(): String = .replace(Regex("(?<=\tat )[^\n]*/"), "") .replace(Regex("\t"), "") .replace("sun.misc.Unsafe.", "jdk.internal.misc.Unsafe.") // JDK8->JDK11 + .applyBackspace() + +public fun String.applyBackspace(): String { + val array = toCharArray() + val stack = CharArray(array.size) + var stackSize = -1 + for (c in array) { + if (c != '\b') { + stack[++stackSize] = c + } else { + --stackSize + } + } + + return String(stack, 0, stackSize + 1) +} public fun verifyStackTrace(e: Throwable, traces: List) { val stacktrace = toStackTrace(e) @@ -61,7 +74,7 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null, f * `$$BlockHound$$_` prepended at the last component. */ private fun cleanBlockHoundTraces(frames: List): List { - val result = mutableListOf() + var result = mutableListOf() val blockHoundSubstr = "\$\$BlockHound\$\$_" var i = 0 while (i < frames.size) { @@ -84,21 +97,21 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null) { assertTrue(filtered[0].startsWith("Coroutines dump")) return } - // The first line, "Coroutine dump", is dropped. This is not `zip` because not having enough dumps is an error. - trace.drop(1).withIndex().forEach { (index, value) -> + // Drop "Coroutine dump" line + trace.withIndex().drop(1).forEach { (index, value) -> if (ignoredCoroutine != null && value.contains(ignoredCoroutine)) { return@forEach } - val expected = traces[index].split(coroutineCreationFrameRegex, limit = 2) - val actual = value.split(coroutineCreationFrameRegex, limit = 2) + val expected = traces[index - 1].applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) + val actual = value.applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) assertEquals(expected.size, actual.size, "Creation stacktrace should be part of the expected input") - actual.zip(expected).forEach { (actualTrace, expectedTrace) -> - val sanitizedActualTrace = actualTrace.trimStackTrace().sanitizeAddresses() - val sanitizedExpectedTrace = expectedTrace.trimStackTrace().sanitizeAddresses() - val actualLines = cleanBlockHoundTraces(sanitizedActualTrace.split("\n")) - val expectedLines = sanitizedExpectedTrace.split("\n") + expected.withIndex().forEach { (index, trace) -> + val actualTrace = actual[index].trimStackTrace().sanitizeAddresses() + val expectedTrace = trace.trimStackTrace().sanitizeAddresses() + val actualLines = cleanBlockHoundTraces(actualTrace.split("\n")) + val expectedLines = expectedTrace.split("\n") for (i in expectedLines.indices) { assertEquals(expectedLines[i], actualLines[i]) } diff --git a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt index d6a42be528..886007c3e8 100644 --- a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt +++ b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt @@ -22,7 +22,7 @@ class CoroutinesTimeoutDisabledTracesTest : TestBase() { "at kotlinx.coroutines.debug.junit4.CoroutinesTimeoutDisabledTracesTest.hangForever", "at kotlinx.coroutines.debug.junit4.CoroutinesTimeoutDisabledTracesTest.waitForHangJob" ), - notExpectedOutParts = listOf("coroutineCreation"), + notExpectedOutParts = listOf("Coroutine creation stacktrace"), error = TestTimedOutException::class.java ) ) From 7053405e7052dafde3eb52a1971d3e4331b49dba Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 13 May 2021 16:14:23 +0300 Subject: [PATCH 065/328] Adjust deprecation message of 'poll' and 'receiveOrNull', explain the rationale and provide an alternative (#2704) --- .../common/src/channels/Channel.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index a0dbc6b9b4..8c69cbfe87 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -302,9 +302,18 @@ public interface ReceiveChannel { * * Its name was not aligned with the rest of the API and tried to mimic Java's queue instead. * * See https://github.com/Kotlin/kotlinx.coroutines/issues/974 for more context. + * + * ### Replacement note + * + * The replacement `tryReceive().getOrNull()` is a default that ignores all close exceptions and + * proceeds with `null`, while `poll` throws an exception if the channel was closed with an exception. + * Replacement with the very same 'poll' semantics is `tryReceive().onClosed { if (it != null) throw it }.getOrNull()` */ - @Deprecated(level = DeprecationLevel.WARNING, - message = "Deprecated in the favour of 'tryReceive'", + @Deprecated( + level = DeprecationLevel.WARNING, + message = "Deprecated in the favour of 'tryReceive'. " + + "Please note that the provided replacement does not rethrow channel's close cause as 'poll' did, " + + "for the precise replacement please refer to the 'poll' documentation", replaceWith = ReplaceWith("tryReceive().getOrNull()") ) // Warning since 1.5.0 public fun poll(): E? { @@ -322,12 +331,18 @@ public interface ReceiveChannel { * - Was throwing if the channel has failed even though its signature may suggest it returns 'null' * - It didn't really belong to core channel API and can be exposed as an extension instead. * - * @suppress doc + * ### Replacement note + * + * The replacement `receiveCatching().getOrNull()` is a safe default that ignores all close exceptions and + * proceeds with `null`, while `receiveOrNull` throws an exception if the channel was closed with an exception. + * Replacement with the very same `receiveOrNull` semantics is `receiveCatching().onClosed { if (it != null) throw it }.getOrNull()`. */ @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @LowPriorityInOverloadResolution @Deprecated( - message = "Deprecated in favor of receiveCatching", + message = "Deprecated in favor of 'receiveCatching'. " + + "Please note that the provided replacement does not rethrow channel's close cause as 'receiveOrNull' did, " + + "for the detailed replacement please refer to the 'receiveOrNull' documentation", level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("receiveCatching().getOrNull()") ) // Warning since 1.3.0, error in 1.5.0, will be hidden in 1.6.0 From 95b7a13d7bb234342ccb7b33a3d5792b12e605b6 Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Thu, 13 May 2021 16:43:25 +0300 Subject: [PATCH 066/328] Flows returned by stateIn/shareIn keep strong reference to sharing job (#2701) * Flows returned by stateIn/shareIn keep strong reference to sharing job Fixes #2557 * ~ Review fixes: fewer classes, suppress unused warning --- .../common/src/flow/operators/Share.kt | 25 ++++++----- .../jvm/test/flow/SharingReferenceTest.kt | 44 +++++++++++++++++++ 2 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt index fe1d7216b0..c0ab3b845b 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt @@ -144,8 +144,8 @@ public fun Flow.shareIn( onBufferOverflow = config.onBufferOverflow ) @Suppress("UNCHECKED_CAST") - scope.launchSharing(config.context, config.upstream, shared, started, NO_VALUE as T) - return shared.asSharedFlow() + val job = scope.launchSharing(config.context, config.upstream, shared, started, NO_VALUE as T) + return ReadonlySharedFlow(shared, job) } private class SharingConfig( @@ -197,7 +197,7 @@ private fun CoroutineScope.launchSharing( shared: MutableSharedFlow, started: SharingStarted, initialValue: T -) { +): Job = launch(context) { // the single coroutine to rule the sharing // Optimize common built-in started strategies when { @@ -230,7 +230,6 @@ private fun CoroutineScope.launchSharing( } } } -} // -------------------------------- stateIn -------------------------------- @@ -303,8 +302,8 @@ public fun Flow.stateIn( ): StateFlow { val config = configureSharing(1) val state = MutableStateFlow(initialValue) - scope.launchSharing(config.context, config.upstream, state, started, initialValue) - return state.asStateFlow() + val job = scope.launchSharing(config.context, config.upstream, state, started, initialValue) + return ReadonlyStateFlow(state, job) } /** @@ -332,7 +331,7 @@ private fun CoroutineScope.launchSharingDeferred( upstream.collect { value -> state?.let { it.value = value } ?: run { state = MutableStateFlow(value).also { - result.complete(it.asStateFlow()) + result.complete(ReadonlyStateFlow(it, coroutineContext.job)) } } } @@ -351,23 +350,27 @@ private fun CoroutineScope.launchSharingDeferred( * Represents this mutable shared flow as a read-only shared flow. */ public fun MutableSharedFlow.asSharedFlow(): SharedFlow = - ReadonlySharedFlow(this) + ReadonlySharedFlow(this, null) /** * Represents this mutable state flow as a read-only state flow. */ public fun MutableStateFlow.asStateFlow(): StateFlow = - ReadonlyStateFlow(this) + ReadonlyStateFlow(this, null) private class ReadonlySharedFlow( - flow: SharedFlow + flow: SharedFlow, + @Suppress("unused") + private val job: Job? // keeps a strong reference to the job (if present) ) : SharedFlow by flow, CancellableFlow, FusibleFlow { override fun fuse(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow) = fuseSharedFlow(context, capacity, onBufferOverflow) } private class ReadonlyStateFlow( - flow: StateFlow + flow: StateFlow, + @Suppress("unused") + private val job: Job? // keeps a strong reference to the job (if present) ) : StateFlow by flow, CancellableFlow, FusibleFlow { override fun fuse(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow) = fuseStateFlow(context, capacity, onBufferOverflow) diff --git a/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt b/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt new file mode 100644 index 0000000000..0b820f2a64 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import org.junit.* + +/** + * Tests that shared flows keep strong reference to their source flows. + * See https://github.com/Kotlin/kotlinx.coroutines/issues/2557 + */ +@OptIn(DelicateCoroutinesApi::class) +class SharingReferenceTest : TestBase() { + private val token = object {} + + private val weakEmitter = flow { + emit(null) + // suspend forever without keeping a strong reference to continuation -- this is a model of + // a callback API that does not keep a strong reference it is listeners, but works + suspendCancellableCoroutine { } + // using the token here to make it easily traceable + emit(token) + } + + @Test + fun testShareInReference() { + val flow = weakEmitter.shareIn(GlobalScope, SharingStarted.Eagerly, 0) + FieldWalker.assertReachableCount(1, flow) { it === token } + } + + @Test + fun testStateInReference() { + val flow = weakEmitter.stateIn(GlobalScope, SharingStarted.Eagerly, null) + FieldWalker.assertReachableCount(1, flow) { it === token } + } + + @Test + fun testStateInSuspendingReference() = runTest { + val flow = weakEmitter.stateIn(GlobalScope) + FieldWalker.assertReachableCount(1, flow) { it === token } + } +} \ No newline at end of file From 349566caa4c9e5c85cf385caa806cadb7a3ff429 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 14 May 2021 16:34:58 +0300 Subject: [PATCH 067/328] Fix flaky SharingReferenceTest (#2709) Previously assert has been racing with the coroutine state spilling, triggering spurious wakeups --- .../jvm/test/flow/SharingReferenceTest.kt | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt b/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt index 0b820f2a64..98240fc911 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt +++ b/kotlinx-coroutines-core/jvm/test/flow/SharingReferenceTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.flow import kotlinx.coroutines.* +import kotlinx.coroutines.internal.* import org.junit.* /** @@ -15,6 +16,15 @@ import org.junit.* class SharingReferenceTest : TestBase() { private val token = object {} + /* + * Single-threaded executor that we are using to ensure that the flow being sharing actually + * suspended (spilled its locals, attached to parent), so we can verify reachability. + * Without that, it's possible to have a situation where target flow is still + * being strongly referenced (by its dispatcher), but the test already tries to test reachability and fails. + */ + @get:Rule + val executor = ExecutorRule(1) + private val weakEmitter = flow { emit(null) // suspend forever without keeping a strong reference to continuation -- this is a model of @@ -26,19 +36,26 @@ class SharingReferenceTest : TestBase() { @Test fun testShareInReference() { - val flow = weakEmitter.shareIn(GlobalScope, SharingStarted.Eagerly, 0) + val flow = weakEmitter.shareIn(ContextScope(executor), SharingStarted.Eagerly, 0) + linearize() FieldWalker.assertReachableCount(1, flow) { it === token } } @Test fun testStateInReference() { - val flow = weakEmitter.stateIn(GlobalScope, SharingStarted.Eagerly, null) + val flow = weakEmitter.stateIn(ContextScope(executor), SharingStarted.Eagerly, null) + linearize() FieldWalker.assertReachableCount(1, flow) { it === token } } @Test fun testStateInSuspendingReference() = runTest { val flow = weakEmitter.stateIn(GlobalScope) + linearize() FieldWalker.assertReachableCount(1, flow) { it === token } } -} \ No newline at end of file + + private fun linearize() { + runBlocking(executor) { } + } +} From 894df7dc6375af177d2a2c1ccf80b0ed6fd7e3dd Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 14 May 2021 15:33:42 +0300 Subject: [PATCH 068/328] Version 1.5.0 --- CHANGES.md | 43 ++++++++++++++++++++++++++++++ README.md | 14 +++++----- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 25769073e7..75eecfd218 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,48 @@ # Change log for kotlinx.coroutines +## Version 1.5.0 + +Note that this is a full changelog relative to 1.4.3 version. Changelog relative to 1.5.0-RC can be found in the end. + +### Channels API + +* Major channels API rework (#330, #974). Existing `offer`, `poll`, and `sendBlocking` methods are deprecated, internal `receiveCatching` and `onReceiveCatching` removed, `receiveOrNull` and `onReceiveOrNull` are completely deprecated. Previously deprecated `SendChannel.isFull` declaration is removed. Channel operators deprecated with `ERROR` are now `HIDDEN`. +* New methods `receiveCatching`, `onReceiveCatching` `trySend`, `tryReceive`, and `trySendBlocking` along with the new result type `ChannelResult` are introduced. They provide better type safety, are less error-prone, and have a consistent future-proof naming scheme. The full rationale behind this change can be found [here](https://github.com/Kotlin/kotlinx.coroutines/issues/974#issuecomment-806569582). +* `BroadcastChannel` and `ConflatedBroadcastChannel` are marked as `ObsoleteCoroutinesApi` in the favor or `SharedFlow` and `StateFlow`. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release. +* `callbackFlow` and `channelFlow` are promoted to stable API. + +### Reactive integrations + +* All existing API in modules `kotlinx-coroutines-rx2`, `kotlinx-coroutines-rx3`, `kotlinx-coroutines-reactive`, `kotlinx-coroutines-reactor`, and `kotlinx-coroutines-jdk9` were revisited and promoted to stable (#2545). +* `publish` is no longer allowed to emit `null` values (#2646). +* Misleading `awaitSingleOr*` functions on `Publisher` type are deprecated (#2591). +* `MaybeSource.await` is deprecated in the favor of `awaitSingle`, additional lint functions for `Mono` are added in order to prevent ambiguous `Publisher` usages (#2628, #1587). +* `ContextView` support in `kotlinx-coroutines-reactor` (#2575). +* All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646). +* `MaybeSource.collect` and `Maybe.collect` properly finish when they are completed without a value (#2617). +* All exceptions are now consistently handled according to reactive specification, whether they are considered 'fatal' or not by reactive frameworks (#2646). + +### Other improvements + +* `Flow.last` and `Flow.lastOrNull` operators (#2246). +* `Flow.runningFold` operator (#2641). +* `CoroutinesTimeout` rule for JUnit5 (#2197). +* Internals of `Job` and `AbstractCoroutine` was reworked, resulting in smaller code size, less memory footprint, and better performance (#2513, #2512). +* `CancellationException` from Kotlin standard library is used for cancellation on Koltin/JS and Kotlin/Native (#2638). +* Introduced new `DelicateCoroutineApi` annotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now is `GlobalScope` (#2637). +* Fixed bug introduced in `1.4.3` when `kotlinx-coroutines-core.jar` triggered IDEA debugger failure (#2619). +* Fixed memory leak of `ChildHandlerNode` with reusable continuations (#2564). +* Various documentation improvements (#2555, #2589, #2592, #2583, #2437, #2616, #2633, #2560). + +### Changelog relative to version 1.5.0-RC + +* Fail-fast during `emitAll` called from cancelled `onCompletion` operator (#2700). +* Flows returned by `stateIn`/`shareIn` keep strong reference to sharing job (#2557). +* Rename internal `TimeSource` to `AbstractTimeSource` due to import issues (#2691). +* Reverted the change that triggered IDEA coroutines debugger crash (#2695, reverted #2291). +* `watchosX64` target support for Kotlin/Native (#2524). +* Various documentation fixes and improvements. + ## Version 1.5.0-RC ### Channels API diff --git a/README.md b/README.md index 76adb21241..fab386fa43 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0-RC)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0-RC/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.5.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.5.0-RC + 1.5.0 ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' } ``` @@ -127,7 +127,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") } ``` @@ -147,7 +147,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```groovy -implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC' +implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' ``` This gives you access to the Android [Dispatchers.Main] @@ -180,7 +180,7 @@ In common code that should get compiled for different platforms, you can add a d ```groovy commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") } } ``` @@ -192,7 +192,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.0-RC/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.0/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index be8d5fa670..5fbf33229e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.5.0-RC-SNAPSHOT +version=1.5.0-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.5.0 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 9d23aeb2ac..77ecd67f6c 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.0-RC.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.0.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 385afecc07..30027fdb76 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -9,7 +9,7 @@ This package provides testing utilities for effectively testing coroutines. Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0-RC' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index 3fcee41901..bc974f6c11 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 7741256c631e8a95e81797760aff9f1a1dd899d9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 14 May 2021 18:22:04 +0300 Subject: [PATCH 069/328] Update changelog --- CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 75eecfd218..656a818ea0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -24,12 +24,13 @@ Note that this is a full changelog relative to 1.4.3 version. Changelog relative ### Other improvements +* Kotlin version is upgraded to 1.5.0 and JVM target is updated to 1.8. * `Flow.last` and `Flow.lastOrNull` operators (#2246). * `Flow.runningFold` operator (#2641). * `CoroutinesTimeout` rule for JUnit5 (#2197). * Internals of `Job` and `AbstractCoroutine` was reworked, resulting in smaller code size, less memory footprint, and better performance (#2513, #2512). * `CancellationException` from Kotlin standard library is used for cancellation on Koltin/JS and Kotlin/Native (#2638). -* Introduced new `DelicateCoroutineApi` annotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now is `GlobalScope` (#2637). +* Introduced new `DelicateCoroutinesApi` annotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now is `GlobalScope` (#2637). * Fixed bug introduced in `1.4.3` when `kotlinx-coroutines-core.jar` triggered IDEA debugger failure (#2619). * Fixed memory leak of `ChildHandlerNode` with reusable continuations (#2564). * Various documentation improvements (#2555, #2589, #2592, #2583, #2437, #2616, #2633, #2560). From c03ca62ed69fabad53b993d92686263361eae1bc Mon Sep 17 00:00:00 2001 From: Johnny Lim Date: Sat, 15 May 2021 17:32:59 +0900 Subject: [PATCH 070/328] Update link to Knit in CONTRIBUTING.md (#2712) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4628eade47..7d6e32d878 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,7 +94,7 @@ export JDK_18="$JAVA_HOME" ### Running the Knit tool -* Use [Knit](https://github.com/Kotlin/kotlinx-knit/blob/master/README.md) for updates to documentation: +* Use [Knit](https://github.com/Kotlin/kotlinx-knit/blob/main/README.md) for updates to documentation: * Run `./gradlew knit` to update example files, links, tables of content. * Commit updated documents and examples together with other changes. From d858cba0ce8b621c106a0112f676effb63e05144 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 18 May 2021 14:32:03 +0300 Subject: [PATCH 071/328] =?UTF-8?q?User=20identityHashCode=20instead=20of?= =?UTF-8?q?=20deprecated=20`Kotlin=5FAny=5FhashCode`=20for=E2=80=A6=20(#27?= =?UTF-8?q?10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * User identityHashCode instead of deprecated `Kotlin_Any_hashCode` for Native debugging capabilities --- kotlinx-coroutines-core/native/src/Debug.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kotlinx-coroutines-core/native/src/Debug.kt b/kotlinx-coroutines-core/native/src/Debug.kt index a0a8d272f8..f17c2ed7fc 100644 --- a/kotlinx-coroutines-core/native/src/Debug.kt +++ b/kotlinx-coroutines-core/native/src/Debug.kt @@ -5,14 +5,12 @@ package kotlinx.coroutines import kotlin.math.* +import kotlin.native.* internal actual val DEBUG: Boolean = false -internal actual val Any.hexAddress: String get() = abs(id().let { if (it == Int.MIN_VALUE) 0 else it }).toString(16) +internal actual val Any.hexAddress: String get() = identityHashCode().toUInt().toString(16) internal actual val Any.classSimpleName: String get() = this::class.simpleName ?: "Unknown" -@SymbolName("Kotlin_Any_hashCode") -public external fun Any.id(): Int // Note: can return negative value on K/N - internal actual inline fun assert(value: () -> Boolean) {} From 73942eea05f3af068c88cb44754e29676c2e761a Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 18 May 2021 18:24:44 +0300 Subject: [PATCH 072/328] Move DebugProbesKt from debug to core module (#2716) Co-authored-by: Pierfrancesco Soffritti --- .../jvm/src/debug/internal/DebugProbes.kt | 22 +++++++++++++++++++ kotlinx-coroutines-debug/src/DebugProbes.kt | 7 ------ .../src/internal/Attach.kt | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbes.kt diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbes.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbes.kt new file mode 100644 index 0000000000..8dc5b7c23d --- /dev/null +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbes.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:Suppress("unused") + +package kotlinx.coroutines.debug.internal + +import kotlin.coroutines.* + +/* + * This class is used by ByteBuddy from kotlinx-coroutines-debug as kotlin.coroutines.jvm.internal.DebugProbesKt replacement. + * In theory, it should belong to kotlinx-coroutines-debug, but placing it here significantly simplifies the + * Android AS debugger that does on-load DEX transformation + */ + +// Stubs which are injected as coroutine probes. Require direct match of signatures +internal fun probeCoroutineResumed(frame: Continuation<*>) = DebugProbesImpl.probeCoroutineResumed(frame) + +internal fun probeCoroutineSuspended(frame: Continuation<*>) = DebugProbesImpl.probeCoroutineSuspended(frame) +internal fun probeCoroutineCreated(completion: Continuation): Continuation = + DebugProbesImpl.probeCoroutineCreated(completion) diff --git a/kotlinx-coroutines-debug/src/DebugProbes.kt b/kotlinx-coroutines-debug/src/DebugProbes.kt index 373864adb8..ed346d8136 100644 --- a/kotlinx-coroutines-debug/src/DebugProbes.kt +++ b/kotlinx-coroutines-debug/src/DebugProbes.kt @@ -143,10 +143,3 @@ public object DebugProbes { */ public fun dumpCoroutines(out: PrintStream = System.out): Unit = DebugProbesImpl.dumpCoroutines(out) } - -// Stubs which are injected as coroutine probes. Require direct match of signatures -internal fun probeCoroutineResumed(frame: Continuation<*>) = DebugProbesImpl.probeCoroutineResumed(frame) - -internal fun probeCoroutineSuspended(frame: Continuation<*>) = DebugProbesImpl.probeCoroutineSuspended(frame) -internal fun probeCoroutineCreated(completion: Continuation): Continuation = - DebugProbesImpl.probeCoroutineCreated(completion) diff --git a/kotlinx-coroutines-debug/src/internal/Attach.kt b/kotlinx-coroutines-debug/src/internal/Attach.kt index f38447f72a..f1cc96e6d3 100644 --- a/kotlinx-coroutines-debug/src/internal/Attach.kt +++ b/kotlinx-coroutines-debug/src/internal/Attach.kt @@ -20,7 +20,7 @@ internal class ByteBuddyDynamicAttach : Function1 { private fun attach() { ByteBuddyAgent.install(ByteBuddyAgent.AttachmentProvider.ForEmulatedAttachment.INSTANCE) val cl = Class.forName("kotlin.coroutines.jvm.internal.DebugProbesKt") - val cl2 = Class.forName("kotlinx.coroutines.debug.DebugProbesKt") + val cl2 = Class.forName("kotlinx.coroutines.debug.internal.DebugProbesKt") ByteBuddy() .redefine(cl2) From 00e6cbf9713c01431201caddf884da856b959ad0 Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Wed, 19 May 2021 16:59:38 +0300 Subject: [PATCH 073/328] Fix examples in coroutine-basics.md (#2711) Co-authored-by: Johnny Lim --- docs/topics/coroutines-basics.md | 8 +++++--- .../jvm/test/guide/example-basic-04.kt | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/topics/coroutines-basics.md b/docs/topics/coroutines-basics.md index ab8b427685..5d9d0e6db1 100644 --- a/docs/topics/coroutines-basics.md +++ b/docs/topics/coroutines-basics.md @@ -152,10 +152,12 @@ suspend fun doWorld() = coroutineScope { // this: CoroutineScope This code also prints: - +``` + + ## Scope builder and concurrency @@ -166,7 +168,7 @@ Let's launch two concurrent coroutines inside a `doWorld` suspending function: import kotlinx.coroutines.* //sampleStart -// Sequentially executes doWorld followed by "Hello" +// Sequentially executes doWorld followed by "Done" fun main() = runBlocking { doWorld() println("Done") diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt b/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt index 3531b22083..efac708530 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-basic-04.kt @@ -7,7 +7,7 @@ package kotlinx.coroutines.guide.exampleBasic04 import kotlinx.coroutines.* -// Sequentially executes doWorld followed by "Hello" +// Sequentially executes doWorld followed by "Done" fun main() = runBlocking { doWorld() println("Done") From c2d218a085c3a8f20b40cad240b6af7b9696364a Mon Sep 17 00:00:00 2001 From: Dominic Fischer Date: Sat, 22 May 2021 13:17:21 +0100 Subject: [PATCH 074/328] Fix typo in shareIn documentation (#2726) --- kotlinx-coroutines-core/common/src/flow/operators/Share.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt index c0ab3b845b..4fa74d8e50 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt @@ -68,7 +68,7 @@ import kotlin.jvm.* * ### Upstream completion and error handling * * **Normal completion of the upstream flow has no effect on subscribers**, and the sharing coroutine continues to run. If a - * a strategy like [SharingStarted.WhileSubscribed] is used, then the upstream can get restarted again. If a special + * strategy like [SharingStarted.WhileSubscribed] is used, then the upstream can get restarted again. If a special * action on upstream completion is needed, then an [onCompletion] operator can be used before the * `shareIn` operator to emit a special value in this case, like this: * From 623db413769923a9fdce8f9a874444fdf735ffc1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 25 May 2021 05:03:44 -0700 Subject: [PATCH 075/328] Add update, updateAndGet, and getAndUpdate extension functions to MutableStateFlow (#2729) * Add update, updateAndGet, and getAndUpdate extension functions to MutableStateFlow (#2720). Fixes #2720 Co-authored-by: Louis Wasserman --- .../api/kotlinx-coroutines-core.api | 3 + .../common/src/flow/StateFlow.kt | 57 +++++++++++++++++-- .../common/test/flow/sharing/StateFlowTest.kt | 26 +++------ .../test/flow/StateFlowUpdateStressTest.kt | 44 ++++++++++++++ 4 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/flow/StateFlowUpdateStressTest.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index ec161ce28e..06fad84d28 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -1100,6 +1100,9 @@ public abstract interface class kotlinx/coroutines/flow/StateFlow : kotlinx/coro public final class kotlinx/coroutines/flow/StateFlowKt { public static final fun MutableStateFlow (Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; + public static final fun getAndUpdate (Lkotlinx/coroutines/flow/MutableStateFlow;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun update (Lkotlinx/coroutines/flow/MutableStateFlow;Lkotlin/jvm/functions/Function1;)V + public static final fun updateAndGet (Lkotlinx/coroutines/flow/MutableStateFlow;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; } public abstract class kotlinx/coroutines/flow/internal/ChannelFlow : kotlinx/coroutines/flow/internal/FusibleFlow { diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index da06ec73b9..9e82e78771 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -37,7 +37,7 @@ import kotlin.native.concurrent.* * val counter = _counter.asStateFlow() // publicly exposed as read-only state flow * * fun inc() { - * _counter.value++ + * _counter.update { count -> count + 1 } // atomic, safe for concurrent use * } * } * ``` @@ -186,6 +186,56 @@ public interface MutableStateFlow : StateFlow, MutableSharedFlow { @Suppress("FunctionName") public fun MutableStateFlow(value: T): MutableStateFlow = StateFlowImpl(value ?: NULL) +// ------------------------------------ Update methods ------------------------------------ + +/** + * Updates the [MutableStateFlow.value] atomically using the specified [function] of its value, and returns the new + * value. + * + * [function] may be evaluated multiple times, if [value] is being concurrently updated. + */ +public inline fun MutableStateFlow.updateAndGet(function: (T) -> T): T { + while (true) { + val prevValue = value + val nextValue = function(prevValue) + if (compareAndSet(prevValue, nextValue)) { + return nextValue + } + } +} + +/** + * Updates the [MutableStateFlow.value] atomically using the specified [function] of its value, and returns its + * prior value. + * + * [function] may be evaluated multiple times, if [value] is being concurrently updated. + */ +public inline fun MutableStateFlow.getAndUpdate(function: (T) -> T): T { + while (true) { + val prevValue = value + val nextValue = function(prevValue) + if (compareAndSet(prevValue, nextValue)) { + return prevValue + } + } +} + + +/** + * Updates the [MutableStateFlow.value] atomically using the specified [function] of its value. + * + * [function] may be evaluated multiple times, if [value] is being concurrently updated. + */ +public inline fun MutableStateFlow.update(function: (T) -> T) { + while (true) { + val prevValue = value + val nextValue = function(prevValue) + if (compareAndSet(prevValue, nextValue)) { + return + } + } +} + // ------------------------------------ Implementation ------------------------------------ @SharedImmutable @@ -366,10 +416,7 @@ private class StateFlowImpl( } internal fun MutableStateFlow.increment(delta: Int) { - while (true) { // CAS loop - val current = value - if (compareAndSet(current, current + delta)) return - } + update { it + delta } } internal fun StateFlow.fuseStateFlow( diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/StateFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/StateFlowTest.kt index 0a2c0458c4..be4f8c536b 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/StateFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/StateFlowTest.kt @@ -174,23 +174,11 @@ class StateFlowTest : TestBase() { } @Test - fun testReferenceUpdatesAndCAS() { - val d0 = Data(0) - val d0_1 = Data(0) - val d1 = Data(1) - val d1_1 = Data(1) - val d1_2 = Data(1) - val state = MutableStateFlow(d0) - assertSame(d0, state.value) - state.value = d0_1 // equal, nothing changes - assertSame(d0, state.value) - state.value = d1 // updates - assertSame(d1, state.value) - assertFalse(state.compareAndSet(d0, d0)) // wrong value - assertSame(d1, state.value) - assertTrue(state.compareAndSet(d1_1, d1_2)) // "updates", but ref stays - assertSame(d1, state.value) - assertTrue(state.compareAndSet(d1_1, d0)) // updates, reference changes - assertSame(d0, state.value) + fun testUpdate() = runTest { + val state = MutableStateFlow(0) + state.update { it + 2 } + assertEquals(2, state.value) + state.update { it + 3 } + assertEquals(5, state.value) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/flow/StateFlowUpdateStressTest.kt b/kotlinx-coroutines-core/jvm/test/flow/StateFlowUpdateStressTest.kt new file mode 100644 index 0000000000..660ed0aacd --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/flow/StateFlowUpdateStressTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import org.junit.* +import kotlin.test.* +import kotlin.test.Test + +class StateFlowUpdateStressTest : TestBase() { + private val iterations = 1_000_000 * stressTestMultiplier + + @get:Rule + public val executor = ExecutorRule(2) + + @Test + fun testUpdate() = doTest { update { it + 1 } } + + @Test + fun testUpdateAndGet() = doTest { updateAndGet { it + 1 } } + + @Test + fun testGetAndUpdate() = doTest { getAndUpdate { it + 1 } } + + private fun doTest(increment: MutableStateFlow.() -> Unit) = runTest { + val flow = MutableStateFlow(0) + val j1 = launch(Dispatchers.Default) { + repeat(iterations / 2) { + flow.increment() + } + } + + val j2 = launch(Dispatchers.Default) { + repeat(iterations / 2) { + flow.increment() + } + } + + joinAll(j1, j2) + assertEquals(iterations, flow.value) + } +} From 5121005eae8f04e0110421d721002cef7b003e45 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 25 May 2021 05:07:39 -0700 Subject: [PATCH 076/328] Document and tweak the contract of Executor.asCoroutineDispatcher and ExecutorService.asCoroutineDispatcher (#2727) * Get rid of ThreadPoolDispatcher and PoolThread classes * Reuse the same class for both asCoroutineDispatcher and newFixedThreadPoolContext * Replace 3-classes hierarchy by a single impl class * Copy the auto-closing logic to test source * Document and tweak the contract of Executor.asCoroutineDispatcher and ExecutorService.asCoroutineDispatcher * Document it properly * Make it more robust to signature changes and/or delegation (e.g. see the implementation of java.util.concurrent.Executors.newScheduledThreadPool) * Give a public way to reduce the memory pressure via ScheduledFuture.cancel Fixes #2601 --- kotlinx-coroutines-core/jvm/src/Executors.kt | 80 ++++++++++++------- .../jvm/src/ThreadPoolDispatcher.kt | 41 ++-------- .../ExecutorAsCoroutineDispatcherDelayTest.kt | 44 ++++++++++ .../test/knit/ClosedAfterGuideTestExecutor.kt | 51 ++++++++++++ .../jvm/test/knit/TestUtil.kt | 6 +- 5 files changed, 154 insertions(+), 68 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/ExecutorAsCoroutineDispatcherDelayTest.kt create mode 100644 kotlinx-coroutines-core/jvm/test/knit/ClosedAfterGuideTestExecutor.kt diff --git a/kotlinx-coroutines-core/jvm/src/Executors.kt b/kotlinx-coroutines-core/jvm/src/Executors.kt index 394304f231..7ea3cc6874 100644 --- a/kotlinx-coroutines-core/jvm/src/Executors.kt +++ b/kotlinx-coroutines-core/jvm/src/Executors.kt @@ -4,6 +4,7 @@ package kotlinx.coroutines +import kotlinx.coroutines.flow.* import kotlinx.coroutines.internal.* import java.io.* import java.util.concurrent.* @@ -39,6 +40,22 @@ public abstract class ExecutorCoroutineDispatcher: CoroutineDispatcher(), Closea /** * Converts an instance of [ExecutorService] to an implementation of [ExecutorCoroutineDispatcher]. * + * ## Interaction with [delay] and time-based coroutines. + * + * If the given [ExecutorService] is an instance of [ScheduledExecutorService], then all time-related + * coroutine operations such as [delay], [withTimeout] and time-based [Flow] operators will be scheduled + * on this executor using [schedule][ScheduledExecutorService.schedule] method. If the corresponding + * coroutine is cancelled, [ScheduledFuture.cancel] will be invoked on the corresponding future. + * + * If the given [ExecutorService] is an instance of [ScheduledThreadPoolExecutor], then prior to any scheduling, + * remove on cancel policy will be set via [ScheduledThreadPoolExecutor.setRemoveOnCancelPolicy] in order + * to reduce the memory pressure of cancelled coroutines. + * + * If the executor service is neither of this types, the separate internal thread will be used to + * _track_ the delay and time-related executions, but the coroutine itself will still be executed + * on top of the given executor. + * + * ## Rejected execution * If the underlying executor throws [RejectedExecutionException] on * attempt to submit a continuation task (it happens when [closing][ExecutorCoroutineDispatcher.close] the * resulting dispatcher, on underlying executor [shutdown][ExecutorService.shutdown], or when it uses limited queues), @@ -52,6 +69,23 @@ public fun ExecutorService.asCoroutineDispatcher(): ExecutorCoroutineDispatcher /** * Converts an instance of [Executor] to an implementation of [CoroutineDispatcher]. * + * ## Interaction with [delay] and time-based coroutines. + * + * If the given [Executor] is an instance of [ScheduledExecutorService], then all time-related + * coroutine operations such as [delay], [withTimeout] and time-based [Flow] operators will be scheduled + * on this executor using [schedule][ScheduledExecutorService.schedule] method. If the corresponding + * coroutine is cancelled, [ScheduledFuture.cancel] will be invoked on the corresponding future. + * + * If the given [Executor] is an instance of [ScheduledThreadPoolExecutor], then prior to any scheduling, + * remove on cancel policy will be set via [ScheduledThreadPoolExecutor.setRemoveOnCancelPolicy] in order + * to reduce the memory pressure of cancelled coroutines. + * + * If the executor is neither of this types, the separate internal thread will be used to + * _track_ the delay and time-related executions, but the coroutine itself will still be executed + * on top of the given executor. + * + * ## Rejected execution + * * If the underlying executor throws [RejectedExecutionException] on * attempt to submit a continuation task (it happens when [closing][ExecutorCoroutineDispatcher.close] the * resulting dispatcher, on underlying executor [shutdown][ExecutorService.shutdown], or when it uses limited queues), @@ -75,18 +109,15 @@ private class DispatcherExecutor(@JvmField val dispatcher: CoroutineDispatcher) override fun toString(): String = dispatcher.toString() } -private class ExecutorCoroutineDispatcherImpl(override val executor: Executor) : ExecutorCoroutineDispatcherBase() { - init { - initFutureCancellation() - } -} +internal class ExecutorCoroutineDispatcherImpl(override val executor: Executor) : ExecutorCoroutineDispatcher(), Delay { -internal abstract class ExecutorCoroutineDispatcherBase : ExecutorCoroutineDispatcher(), Delay { - - private var removesFutureOnCancellation: Boolean = false - - internal fun initFutureCancellation() { - removesFutureOnCancellation = removeFutureOnCancel(executor) + /* + * Attempts to reflectively (to be Java 6 compatible) invoke + * ScheduledThreadPoolExecutor.setRemoveOnCancelPolicy in order to cleanup + * internal scheduler queue on cancellation. + */ + init { + removeFutureOnCancel(executor) } override fun dispatch(context: CoroutineContext, block: Runnable) { @@ -99,17 +130,12 @@ internal abstract class ExecutorCoroutineDispatcherBase : ExecutorCoroutineDispa } } - /* - * removesFutureOnCancellation is required to avoid memory leak. - * On Java 7+ we reflectively invoke ScheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true) and we're fine. - * On Java 6 we're scheduling time-based coroutines to our own thread safe heap which supports cancellation. - */ override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - val future = if (removesFutureOnCancellation) { - scheduleBlock(ResumeUndispatchedRunnable(this, continuation), continuation.context, timeMillis) - } else { - null - } + val future = (executor as? ScheduledExecutorService)?.scheduleBlock( + ResumeUndispatchedRunnable(this, continuation), + continuation.context, + timeMillis + ) // If everything went fine and the scheduling attempt was not rejected -- use it if (future != null) { continuation.cancelFutureOnCancellation(future) @@ -120,20 +146,16 @@ internal abstract class ExecutorCoroutineDispatcherBase : ExecutorCoroutineDispa } override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - val future = if (removesFutureOnCancellation) { - scheduleBlock(block, context, timeMillis) - } else { - null - } + val future = (executor as? ScheduledExecutorService)?.scheduleBlock(block, context, timeMillis) return when { future != null -> DisposableFutureHandle(future) else -> DefaultExecutor.invokeOnTimeout(timeMillis, block, context) } } - private fun scheduleBlock(block: Runnable, context: CoroutineContext, timeMillis: Long): ScheduledFuture<*>? { + private fun ScheduledExecutorService.scheduleBlock(block: Runnable, context: CoroutineContext, timeMillis: Long): ScheduledFuture<*>? { return try { - (executor as? ScheduledExecutorService)?.schedule(block, timeMillis, TimeUnit.MILLISECONDS) + schedule(block, timeMillis, TimeUnit.MILLISECONDS) } catch (e: RejectedExecutionException) { cancelJobOnRejection(context, e) null @@ -149,7 +171,7 @@ internal abstract class ExecutorCoroutineDispatcherBase : ExecutorCoroutineDispa } override fun toString(): String = executor.toString() - override fun equals(other: Any?): Boolean = other is ExecutorCoroutineDispatcherBase && other.executor === executor + override fun equals(other: Any?): Boolean = other is ExecutorCoroutineDispatcherImpl && other.executor === executor override fun hashCode(): Int = System.identityHashCode(executor) } diff --git a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt index 44a79d42ed..99e3b46cce 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt @@ -59,40 +59,11 @@ public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = @ObsoleteCoroutinesApi public fun newFixedThreadPoolContext(nThreads: Int, name: String): ExecutorCoroutineDispatcher { require(nThreads >= 1) { "Expected at least one thread, but $nThreads specified" } - return ThreadPoolDispatcher(nThreads, name) -} - -internal class PoolThread( - @JvmField val dispatcher: ThreadPoolDispatcher, // for debugging & tests - target: Runnable, name: String -) : Thread(target, name) { - init { isDaemon = true } -} - -/** - * Dispatches coroutine execution to a thread pool of a fixed size. Instances of this dispatcher are - * created with [newSingleThreadContext] and [newFixedThreadPoolContext]. - */ -internal class ThreadPoolDispatcher internal constructor( - private val nThreads: Int, - private val name: String -) : ExecutorCoroutineDispatcherBase() { - private val threadNo = AtomicInteger() - - override val executor: Executor = Executors.newScheduledThreadPool(nThreads) { target -> - PoolThread(this, target, if (nThreads == 1) name else name + "-" + threadNo.incrementAndGet()) - } - - init { - initFutureCancellation() + val threadNo = AtomicInteger() + val executor = Executors.newScheduledThreadPool(nThreads) { runnable -> + val t = Thread(runnable, if (nThreads == 1) name else name + "-" + threadNo.incrementAndGet()) + t.isDaemon = true + t } - - /** - * Closes this dispatcher -- shuts down all threads in this pool and releases resources. - */ - public override fun close() { - (executor as ExecutorService).shutdown() - } - - override fun toString(): String = "ThreadPoolDispatcher[$nThreads, $name]" + return executor.asCoroutineDispatcher() } diff --git a/kotlinx-coroutines-core/jvm/test/ExecutorAsCoroutineDispatcherDelayTest.kt b/kotlinx-coroutines-core/jvm/test/ExecutorAsCoroutineDispatcherDelayTest.kt new file mode 100644 index 0000000000..dbe9cb3741 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ExecutorAsCoroutineDispatcherDelayTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import org.junit.Test +import java.lang.Runnable +import java.util.concurrent.* +import kotlin.test.* + +class ExecutorAsCoroutineDispatcherDelayTest : TestBase() { + + private var callsToSchedule = 0 + + private inner class STPE : ScheduledThreadPoolExecutor(1) { + override fun schedule(command: Runnable, delay: Long, unit: TimeUnit): ScheduledFuture<*> { + if (delay != 0L) ++callsToSchedule + return super.schedule(command, delay, unit) + } + } + + private inner class SES : ScheduledExecutorService by STPE() + + @Test + fun testScheduledThreadPool() = runTest { + val executor = STPE() + withContext(executor.asCoroutineDispatcher()) { + delay(100) + } + executor.shutdown() + assertEquals(1, callsToSchedule) + } + + @Test + fun testScheduledExecutorService() = runTest { + val executor = SES() + withContext(executor.asCoroutineDispatcher()) { + delay(100) + } + executor.shutdown() + assertEquals(1, callsToSchedule) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/knit/ClosedAfterGuideTestExecutor.kt b/kotlinx-coroutines-core/jvm/test/knit/ClosedAfterGuideTestExecutor.kt new file mode 100644 index 0000000000..30fbfee264 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/knit/ClosedAfterGuideTestExecutor.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines // Trick to make guide tests use these declarations with executors that can be closed on our side implicitly + +import java.util.concurrent.* +import java.util.concurrent.atomic.* +import kotlin.coroutines.* + +internal fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = ClosedAfterGuideTestDispatcher(1, name) + +internal fun newFixedThreadPoolContext(nThreads: Int, name: String): ExecutorCoroutineDispatcher = + ClosedAfterGuideTestDispatcher(nThreads, name) + +internal class PoolThread( + @JvmField val dispatcher: ExecutorCoroutineDispatcher, // for debugging & tests + target: Runnable, name: String +) : Thread(target, name) { + init { + isDaemon = true + } +} + +private class ClosedAfterGuideTestDispatcher( + private val nThreads: Int, + private val name: String +) : ExecutorCoroutineDispatcher() { + private val threadNo = AtomicInteger() + + override val executor: Executor = + Executors.newScheduledThreadPool(nThreads, object : ThreadFactory { + override fun newThread(target: java.lang.Runnable): Thread { + return PoolThread( + this@ClosedAfterGuideTestDispatcher, + target, + if (nThreads == 1) name else name + "-" + threadNo.incrementAndGet() + ) + } + }) + + override fun dispatch(context: CoroutineContext, block: Runnable) { + executor.execute(wrapTask(block)) + } + + override fun close() { + (executor as ExecutorService).shutdown() + } + + override fun toString(): String = "ThreadPoolDispatcher[$nThreads, $name]" +} diff --git a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt index 7eda9043db..2e61ec6bce 100644 --- a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt +++ b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.knit @@ -11,8 +11,6 @@ import kotlinx.knit.test.* import java.util.concurrent.* import kotlin.test.* -fun wrapTask(block: Runnable) = kotlinx.coroutines.wrapTask(block) - // helper function to dump exception to stdout for ease of debugging failed tests private inline fun outputException(name: String, block: () -> T): T = try { block() } @@ -176,4 +174,4 @@ private inline fun List.verify(verification: () -> Unit) { } throw t } -} \ No newline at end of file +} From 937180fb19ef4b6ef727e10408bdcb81c665556f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 27 May 2021 17:52:42 +0300 Subject: [PATCH 077/328] =?UTF-8?q?Prevent=20StackOverflowError=20in=20Com?= =?UTF-8?q?pletableFuture.asDeferred=20and=20proper=E2=80=A6=20(#2731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevent StackOverflowError in CompletableFuture.asDeferred and properly report exceptions from completion handlers * It turned out that 'cancel' on completed future tries to help and invoke 'whenComplete' handlers that also invoke 'cancel' on the very same future * Use top-level exception handler as a last resort to deliver an exception Fixes #2730 --- .../src/ListenableFuture.kt | 6 ++- ...eferredUnhandledCompletionExceptionTest.kt | 46 +++++++++++++++++++ .../test/ListenableFutureTest.kt | 20 ++++++++ .../src/future/Future.kt | 19 +++++--- ...eferredUnhandledCompletionExceptionTest.kt | 38 +++++++++++++++ .../test/future/FutureTest.kt | 19 ++++++++ kotlinx-coroutines-core/jvm/src/Future.kt | 10 ++-- 7 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 integration/kotlinx-coroutines-guava/test/FutureAsDeferredUnhandledCompletionExceptionTest.kt create mode 100644 integration/kotlinx-coroutines-jdk8/test/future/FutureAsDeferredUnhandledCompletionExceptionTest.kt diff --git a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt index 35e0aeb379..8f11e0a916 100644 --- a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt +++ b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt @@ -136,11 +136,13 @@ public fun ListenableFuture.asDeferred(): Deferred { override fun onSuccess(result: T?) { // Here we work with flexible types, so we unchecked cast to trick the type system @Suppress("UNCHECKED_CAST") - deferred.complete(result as T) + runCatching { deferred.complete(result as T) } + .onFailure { handleCoroutineException(EmptyCoroutineContext, it) } } override fun onFailure(t: Throwable) { - deferred.completeExceptionally(t) + runCatching { deferred.completeExceptionally(t) } + .onFailure { handleCoroutineException(EmptyCoroutineContext, it) } } }, MoreExecutors.directExecutor()) diff --git a/integration/kotlinx-coroutines-guava/test/FutureAsDeferredUnhandledCompletionExceptionTest.kt b/integration/kotlinx-coroutines-guava/test/FutureAsDeferredUnhandledCompletionExceptionTest.kt new file mode 100644 index 0000000000..d6469a947e --- /dev/null +++ b/integration/kotlinx-coroutines-guava/test/FutureAsDeferredUnhandledCompletionExceptionTest.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.guava + +import com.google.common.util.concurrent.* +import kotlinx.coroutines.* +import org.junit.* +import org.junit.Test +import kotlin.test.* + +class FutureAsDeferredUnhandledCompletionExceptionTest : TestBase() { + + // This is a separate test in order to avoid interference with uncaught exception handlers in other tests + private val exceptionHandler = Thread.getDefaultUncaughtExceptionHandler() + private lateinit var caughtException: Throwable + + @Before + fun setUp() { + Thread.setDefaultUncaughtExceptionHandler { _, e -> caughtException = e } + } + + @After + fun tearDown() { + Thread.setDefaultUncaughtExceptionHandler(exceptionHandler) + } + + @Test + fun testLostExceptionOnSuccess() = runTest { + val future = SettableFuture.create() + val deferred = future.asDeferred() + deferred.invokeOnCompletion { throw TestException() } + future.set(1) + assertTrue { caughtException is CompletionHandlerException && caughtException.cause is TestException } + } + + @Test + fun testLostExceptionOnFailure() = runTest { + val future = SettableFuture.create() + val deferred = future.asDeferred() + deferred.invokeOnCompletion { throw TestException() } + future.setException(TestException2()) + assertTrue { caughtException is CompletionHandlerException && caughtException.cause is TestException } + } +} diff --git a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt index c463174a8d..69ba193071 100644 --- a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt +++ b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt @@ -11,6 +11,7 @@ import org.junit.Ignore import org.junit.Test import java.util.concurrent.* import java.util.concurrent.CancellationException +import java.util.concurrent.atomic.* import kotlin.test.* class ListenableFutureTest : TestBase() { @@ -755,4 +756,23 @@ class ListenableFutureTest : TestBase() { future(start = CoroutineStart.ATOMIC) { } future(start = CoroutineStart.UNDISPATCHED) { } } + + @Test + fun testStackOverflow() = runTest { + val future = SettableFuture.create() + val completed = AtomicLong() + val count = 10000L + val children = ArrayList() + for (i in 0 until count) { + children += launch(Dispatchers.Default) { + future.asDeferred().await() + completed.incrementAndGet() + } + } + future.set(1) + withTimeout(60_000) { + children.forEach { it.join() } + assertEquals(count, completed.get()) + } + } } diff --git a/integration/kotlinx-coroutines-jdk8/src/future/Future.kt b/integration/kotlinx-coroutines-jdk8/src/future/Future.kt index 7e9c349c66..caf2a3c359 100644 --- a/integration/kotlinx-coroutines-jdk8/src/future/Future.kt +++ b/integration/kotlinx-coroutines-jdk8/src/future/Future.kt @@ -126,13 +126,18 @@ public fun CompletionStage.asDeferred(): Deferred { } val result = CompletableDeferred() whenComplete { value, exception -> - if (exception == null) { - // the future has completed normally - result.complete(value) - } else { - // the future has completed with an exception, unwrap it consistently with fast path - // Note: In the fast-path the implementation of CompletableFuture.get() does unwrapping - result.completeExceptionally((exception as? CompletionException)?.cause ?: exception) + try { + if (exception == null) { + // the future has completed normally + result.complete(value) + } else { + // the future has completed with an exception, unwrap it consistently with fast path + // Note: In the fast-path the implementation of CompletableFuture.get() does unwrapping + result.completeExceptionally((exception as? CompletionException)?.cause ?: exception) + } + } catch (e: Throwable) { + // We come here iff the internals of Deferred threw an exception during its completion + handleCoroutineException(EmptyCoroutineContext, e) } } result.cancelFutureOnCompletion(future) diff --git a/integration/kotlinx-coroutines-jdk8/test/future/FutureAsDeferredUnhandledCompletionExceptionTest.kt b/integration/kotlinx-coroutines-jdk8/test/future/FutureAsDeferredUnhandledCompletionExceptionTest.kt new file mode 100644 index 0000000000..bf810af7aa --- /dev/null +++ b/integration/kotlinx-coroutines-jdk8/test/future/FutureAsDeferredUnhandledCompletionExceptionTest.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package future + +import kotlinx.coroutines.* +import kotlinx.coroutines.future.* +import org.junit.* +import org.junit.Test +import java.util.concurrent.* +import kotlin.test.* + +class FutureAsDeferredUnhandledCompletionExceptionTest : TestBase() { + + // This is a separate test in order to avoid interference with uncaught exception handlers in other tests + private val exceptionHandler = Thread.getDefaultUncaughtExceptionHandler() + private lateinit var caughtException: Throwable + + @Before + fun setUp() { + Thread.setDefaultUncaughtExceptionHandler { _, e -> caughtException = e } + } + + @After + fun tearDown() { + Thread.setDefaultUncaughtExceptionHandler(exceptionHandler) + } + + @Test + fun testLostException() = runTest { + val future = CompletableFuture() + val deferred = future.asDeferred() + deferred.invokeOnCompletion { throw TestException() } + future.complete(1) + assertTrue { caughtException is CompletionHandlerException && caughtException.cause is TestException } + } +} diff --git a/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt b/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt index 08e5cdad93..372e79ef1d 100644 --- a/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt +++ b/integration/kotlinx-coroutines-jdk8/test/future/FutureTest.kt @@ -575,4 +575,23 @@ class FutureTest : TestBase() { future(start = CoroutineStart.ATOMIC) { } future(start = CoroutineStart.UNDISPATCHED) { } } + + @Test + fun testStackOverflow() = runTest { + val future = CompletableFuture() + val completed = AtomicLong() + val count = 10000L + val children = ArrayList() + for (i in 0 until count) { + children += launch(Dispatchers.Default) { + future.asDeferred().await() + completed.incrementAndGet() + } + } + future.complete(1) + withTimeout(60_000) { + children.forEach { it.join() } + assertEquals(count, completed.get()) + } + } } diff --git a/kotlinx-coroutines-core/jvm/src/Future.kt b/kotlinx-coroutines-core/jvm/src/Future.kt index 948ef6065c..b27a970845 100644 --- a/kotlinx-coroutines-core/jvm/src/Future.kt +++ b/kotlinx-coroutines-core/jvm/src/Future.kt @@ -13,20 +13,20 @@ import java.util.concurrent.* * Cancels a specified [future] when this job is cancelled. * This is a shortcut for the following code with slightly more efficient implementation (one fewer object created). * ``` - * invokeOnCompletion { future.cancel(false) } + * invokeOnCompletion { if (it != null) future.cancel(false) } * ``` * * @suppress **This an internal API and should not be used from general code.** */ @InternalCoroutinesApi public fun Job.cancelFutureOnCompletion(future: Future<*>): DisposableHandle = - invokeOnCompletion(handler = CancelFutureOnCompletion(future)) // TODO make it work only on cancellation as well? + invokeOnCompletion(handler = CancelFutureOnCompletion(future)) /** * Cancels a specified [future] when this job is cancelled. * This is a shortcut for the following code with slightly more efficient implementation (one fewer object created). * ``` - * invokeOnCancellation { future.cancel(false) } + * invokeOnCancellation { if (it != null) future.cancel(false) } * ``` */ public fun CancellableContinuation<*>.cancelFutureOnCancellation(future: Future<*>): Unit = @@ -38,7 +38,7 @@ private class CancelFutureOnCompletion( override fun invoke(cause: Throwable?) { // Don't interrupt when cancelling future on completion, because no one is going to reset this // interruption flag and it will cause spurious failures elsewhere - future.cancel(false) + if (cause != null) future.cancel(false) } } @@ -46,7 +46,7 @@ private class CancelFutureOnCancel(private val future: Future<*>) : CancelHandle override fun invoke(cause: Throwable?) { // Don't interrupt when cancelling future on completion, because no one is going to reset this // interruption flag and it will cause spurious failures elsewhere - future.cancel(false) + if (cause != null) future.cancel(false) } override fun toString() = "CancelFutureOnCancel[$future]" } From 119e4433f3e786e09497335d01376811421557f1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 31 May 2021 17:26:43 +0300 Subject: [PATCH 078/328] Fail eagerly during exceptions in isDispatchNeeded (#2733) That helps to pro-actively catch cases like #2717 and to report such exception in even more robust manner --- .../common/src/intrinsics/Cancellable.kt | 15 ++++++++++++++- .../jvm/test/FailFastOnStartTest.kt | 12 +++++++++++- .../jvm/test/FailingCoroutinesMachineryTest.kt | 14 ++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/intrinsics/Cancellable.kt b/kotlinx-coroutines-core/common/src/intrinsics/Cancellable.kt index 173f0afb65..f5b96a8d88 100644 --- a/kotlinx-coroutines-core/common/src/intrinsics/Cancellable.kt +++ b/kotlinx-coroutines-core/common/src/intrinsics/Cancellable.kt @@ -49,6 +49,19 @@ private inline fun runSafely(completion: Continuation<*>, block: () -> Unit) { try { block() } catch (e: Throwable) { - completion.resumeWith(Result.failure(e)) + dispatcherFailure(completion, e) } } + +private fun dispatcherFailure(completion: Continuation<*>, e: Throwable) { + /* + * This method is invoked when we failed to start a coroutine due to the throwing + * dispatcher implementation or missing Dispatchers.Main. + * This situation is not recoverable, so we are trying to deliver the exception by all means: + * 1) Resume the coroutine with an exception, so it won't prevent its parent from completion + * 2) Rethrow the exception immediately, so it will crash the caller (e.g. when the coroutine had + * no parent or it was async/produce over MainScope). + */ + completion.resumeWith(Result.failure(e)) + throw e +} diff --git a/kotlinx-coroutines-core/jvm/test/FailFastOnStartTest.kt b/kotlinx-coroutines-core/jvm/test/FailFastOnStartTest.kt index 15cb83ceed..8a7878c9a6 100644 --- a/kotlinx-coroutines-core/jvm/test/FailFastOnStartTest.kt +++ b/kotlinx-coroutines-core/jvm/test/FailFastOnStartTest.kt @@ -70,8 +70,18 @@ class FailFastOnStartTest : TestBase() { val actor = actor(Dispatchers.Main, start = CoroutineStart.LAZY) { fail() } actor.send(1) } - + private fun mainException(e: Throwable): Boolean { return e is IllegalStateException && e.message?.contains("Module with the Main dispatcher is missing") ?: false } + + @Test + fun testProduceNonChild() = runTest(expected = ::mainException) { + produce(Job() + Dispatchers.Main) { fail() } + } + + @Test + fun testAsyncNonChild() = runTest(expected = ::mainException) { + async(Job() + Dispatchers.Main) { fail() } + } } diff --git a/kotlinx-coroutines-core/jvm/test/FailingCoroutinesMachineryTest.kt b/kotlinx-coroutines-core/jvm/test/FailingCoroutinesMachineryTest.kt index c9f722a5b8..04b0ba547d 100644 --- a/kotlinx-coroutines-core/jvm/test/FailingCoroutinesMachineryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/FailingCoroutinesMachineryTest.kt @@ -33,7 +33,7 @@ class FailingCoroutinesMachineryTest( private var caught: Throwable? = null private val latch = CountDownLatch(1) - private var exceptionHandler = CoroutineExceptionHandler { _, t -> caught = t;latch.countDown() } + private var exceptionHandler = CoroutineExceptionHandler { _, t -> caught = t; latch.countDown() } private val lazyOuterDispatcher = lazy { newFixedThreadPoolContext(1, "") } private object FailingUpdate : ThreadContextElement { @@ -115,14 +115,20 @@ class FailingCoroutinesMachineryTest( @Test fun testElement() = runTest { - launch(NonCancellable + dispatcher.value + exceptionHandler + element) {} + // Top-level throwing dispatcher may rethrow an exception right here + runCatching { + launch(NonCancellable + dispatcher.value + exceptionHandler + element) {} + } checkException() } @Test fun testNestedElement() = runTest { - launch(NonCancellable + dispatcher.value + exceptionHandler) { - launch(element) { } + // Top-level throwing dispatcher may rethrow an exception right here + runCatching { + launch(NonCancellable + dispatcher.value + exceptionHandler) { + launch(element) { } + } } checkException() } From c4a6ae1077a5e0a7d2e91403954052db46561456 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 31 May 2021 19:29:19 +0300 Subject: [PATCH 079/328] Take number of CPU cores into account in BlockingCoroutineDispatcherTest (#2737) --- .../test/scheduling/BlockingCoroutineDispatcherTest.kt | 4 ++-- .../jvm/test/scheduling/SchedulerTestBase.kt | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt index f31752c8b5..fe09440f59 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt @@ -101,7 +101,7 @@ class BlockingCoroutineDispatcherTest : SchedulerTestBase() { firstBarrier.await() secondBarrier.await() blockingTasks.joinAll() - checkPoolThreadsCreated(21..22) + checkPoolThreadsCreated(21 /* blocking tasks + 1 for CPU */..20 + CORES_COUNT) } @Test @@ -122,7 +122,7 @@ class BlockingCoroutineDispatcherTest : SchedulerTestBase() { barrier.await() blockingTasks.joinAll() // There may be race when multiple CPU threads are trying to lazily created one more - checkPoolThreadsCreated(104..120) + checkPoolThreadsCreated(101..100 + CORES_COUNT) } @Test diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt index 72d7c90882..dd969bdd37 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt @@ -39,14 +39,6 @@ abstract class SchedulerTestBase : TestBase() { ) } - /** - * Asserts that any number of pool worker threads in [range] exists at the time of method invocation - */ - fun checkPoolThreadsExist(range: IntRange) { - val threads = Thread.getAllStackTraces().keys.asSequence().filter { it is CoroutineScheduler.Worker }.count() - assertTrue(threads in range, "Expected threads in $range interval, but has $threads") - } - private fun maxSequenceNumber(): Int? { return Thread.getAllStackTraces().keys.asSequence().filter { it is CoroutineScheduler.Worker } .map { sequenceNumber(it.name) }.maxOrNull() From 537db247d0f75507439fc1ddc391099b53840876 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 4 Jun 2021 12:14:56 +0300 Subject: [PATCH 080/328] Depend on the local kotlinx-coroutines-core in android-unit-test project classpath (#2741) Otherwise, the dependency from Kotlin plugin to coroutines 1.4.3 (plugin -> compiler.jar -> coroutines) leaks into the runtime classpath --- .../android-unit-tests/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts b/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts index 18adf4bd1a..2fd0b81479 100644 --- a/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts @@ -3,6 +3,7 @@ */ dependencies { + kotlinCompilerPluginClasspathMain(project(":kotlinx-coroutines-core")) testImplementation("com.google.android:android:${version("android")}") testImplementation("org.robolectric:robolectric:${version("robolectric")}") testImplementation(project(":kotlinx-coroutines-test")) From 582086cec87fae3b6a7f8503e542d8eb3d23711d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 4 Jun 2021 16:00:52 +0300 Subject: [PATCH 081/328] Update R8 for Kotlin 1.5.0, enable DEX size metrics back (#2739) --- buildSrc/src/main/kotlin/RunR8.kt | 56 -------------- .../build.gradle.kts | 77 ++++++++++++++----- 2 files changed, 59 insertions(+), 74 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/RunR8.kt diff --git a/buildSrc/src/main/kotlin/RunR8.kt b/buildSrc/src/main/kotlin/RunR8.kt deleted file mode 100644 index b0fccf89fc..0000000000 --- a/buildSrc/src/main/kotlin/RunR8.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.JavaExec -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.bundling.Zip -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.named -import java.io.File - -/* - * Task used by our ui/android tests to test minification results - * and keep track of size of the binary. - * TODO move back to kotlinx-coroutines-android when it's migrated to the kts - */ -open class RunR8 : JavaExec() { - - @OutputDirectory - lateinit var outputDex: File - - @InputFile - lateinit var inputConfig: File - - @InputFile - val inputConfigCommon: File = File("testdata/r8-test-common.pro") - - @InputFiles - val jarFile: File = project.tasks.named("jar").get().archivePath - - init { - classpath = project.configurations["r8"] - main = "com.android.tools.r8.R8" - } - - override fun exec() { - // Resolve classpath only during execution - val arguments = mutableListOf( - "--release", - "--no-desugaring", - "--output", outputDex.absolutePath, - "--pg-conf", inputConfig.absolutePath - ) - arguments.addAll(project.configurations["runtimeClasspath"].files.map { it.absolutePath }) - arguments.add(jarFile.absolutePath) - - args = arguments - - project.delete(outputDex) - outputDex.mkdirs() - - super.exec() - } -} diff --git a/ui/kotlinx-coroutines-android/build.gradle.kts b/ui/kotlinx-coroutines-android/build.gradle.kts index 2af2d4f3a9..9cec1dc9f0 100644 --- a/ui/kotlinx-coroutines-android/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/build.gradle.kts @@ -18,7 +18,7 @@ dependencies { testImplementation("org.robolectric:robolectric:${version("robolectric")}") testImplementation("org.smali:baksmali:${version("baksmali")}") - "r8"("com.android.tools.build:builder:7.0.0-alpha14") + "r8"("com.android.tools.build:builder:7.1.0-alpha01") } val optimizedDexDir = File(buildDir, "dex-optim/") @@ -41,24 +41,65 @@ val runR8NoOptim by tasks.registering(RunR8::class) { dependsOn("jar") } -// TODO: Disable the test until we have published version of R8 that supports Kotlin 1.5.0 metadata - -//tasks.test { -// // Ensure the R8-processed dex is built and supply its path as a property to the test. -// dependsOn(runR8) -// dependsOn(runR8NoOptim) -// -// inputs.files(optimizedDexFile, unOptimizedDexFile) -// -// systemProperty("dexPath", optimizedDexFile.absolutePath) -// systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath) -// -// // Output custom metric with the size of the optimized dex -// doLast { -// println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']") -// } -//} +tasks.test { + // Ensure the R8-processed dex is built and supply its path as a property to the test. + dependsOn(runR8) + dependsOn(runR8NoOptim) + + inputs.files(optimizedDexFile, unOptimizedDexFile) + + systemProperty("dexPath", optimizedDexFile.absolutePath) + systemProperty("noOptimDexPath", unOptimizedDexFile.absolutePath) + + // Output custom metric with the size of the optimized dex + doLast { + println("##teamcity[buildStatisticValue key='optimizedDexSize' value='${optimizedDexFile.length()}']") + } +} externalDocumentationLink( url = "https://developer.android.com/reference/" ) +/* + * Task used by our ui/android tests to test minification results and keep track of size of the binary. + */ +open class RunR8 : JavaExec() { + + @OutputDirectory + lateinit var outputDex: File + + @InputFile + lateinit var inputConfig: File + + @InputFile + val inputConfigCommon: File = File("testdata/r8-test-common.pro") + + @InputFiles + val jarFile: File = project.tasks.named("jar").get().archivePath + + init { + classpath = project.configurations["r8"] + main = "com.android.tools.r8.R8" + } + + override fun exec() { + // Resolve classpath only during execution + val arguments = mutableListOf( + "--release", + "--no-desugaring", + "--min-api", "26", + "--output", outputDex.absolutePath, + "--pg-conf", inputConfig.absolutePath + ) + arguments.addAll(project.configurations["runtimeClasspath"].files.map { it.absolutePath }) + arguments.add(jarFile.absolutePath) + + args = arguments + + project.delete(outputDex) + outputDex.mkdirs() + + super.exec() + } +} + From a8ae0775df7ec7daf1fe15b79203e4a54c778ebc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 4 Jun 2021 17:11:47 +0300 Subject: [PATCH 082/328] Update reactive streams JAR version (#2744) Fixes #2740 --- gradle.properties | 2 +- reactive/kotlinx-coroutines-jdk9/build.gradle.kts | 3 +-- .../test/IterableFlowTckTest.kt | 12 +++--------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/gradle.properties b/gradle.properties index 5fbf33229e..a65c81612e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ lincheck_version=2.12 dokka_version=0.9.16-rdev-2-mpp-hacks byte_buddy_version=1.10.9 reactor_version=3.4.1 -reactive_streams_version=1.0.2 +reactive_streams_version=1.0.3 rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 diff --git a/reactive/kotlinx-coroutines-jdk9/build.gradle.kts b/reactive/kotlinx-coroutines-jdk9/build.gradle.kts index 38c6735cc4..be5eb421f1 100644 --- a/reactive/kotlinx-coroutines-jdk9/build.gradle.kts +++ b/reactive/kotlinx-coroutines-jdk9/build.gradle.kts @@ -3,8 +3,7 @@ */ dependencies { - compile(project(":kotlinx-coroutines-reactive")) - compile("org.reactivestreams:reactive-streams-flow-adapters:${version("reactive_streams")}") + implementation(project(":kotlinx-coroutines-reactive")) } tasks { diff --git a/reactive/kotlinx-coroutines-reactive/test/IterableFlowTckTest.kt b/reactive/kotlinx-coroutines-reactive/test/IterableFlowTckTest.kt index 906b2579d7..cf935f97dc 100644 --- a/reactive/kotlinx-coroutines-reactive/test/IterableFlowTckTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/IterableFlowTckTest.kt @@ -7,18 +7,12 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.flow.* -import org.junit.* import org.junit.Ignore import org.junit.Test import org.reactivestreams.* import org.reactivestreams.tck.* - -import org.reactivestreams.Subscription -import org.reactivestreams.Subscriber -import java.util.ArrayList import java.util.concurrent.* -import java.util.concurrent.CountDownLatch -import java.util.concurrent.ForkJoinPool.commonPool +import java.util.concurrent.ForkJoinPool.* import kotlin.test.* class IterableFlowTckTest : PublisherVerification(TestEnvironment()) { @@ -97,7 +91,7 @@ class IterableFlowTckTest : PublisherVerification(TestEnvironment()) { override fun onSubscribe(s: Subscription) { this.s = s - for (i in 0 until n) { + for (i in 0..n) { commonPool().execute { s.request(1) } } } @@ -115,7 +109,7 @@ class IterableFlowTckTest : PublisherVerification(TestEnvironment()) { } }) - latch.await(50, TimeUnit.SECONDS) + latch.await() assertEquals(array.toList(), collected) } From 1392686e6bf0d37b398fb70a0fc9b4215d1e21fb Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 7 Jun 2021 16:24:21 +0300 Subject: [PATCH 083/328] Improve ':kotlinx-coroutines-core' substitution for all modules. (#2748) * Improve ':kotlinx-coroutines-core' substitution for all modules. Ensure "org.jetbrains.kotlinx:kotlinx-coroutines-core" transitive dependencies are substituted with project itself to avoid test errors. Co-authored-by: Yahor Berdnikau --- build.gradle | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index fc52d8cc53..225634ada3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,9 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ + +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.konan.target.HostManager -import org.gradle.util.VersionNumber apply plugin: 'jdk-convention' apply from: rootProject.file("gradle/experimental.gradle") @@ -74,9 +75,6 @@ buildscript { CacheRedirector.configureBuildScript(buildscript, rootProject) } - -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType - // todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built if (!Idea.active) { ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true") @@ -288,3 +286,34 @@ if (jvm_ir_enabled) { } } } + +// Opt-in for build scan in order to troubleshoot Gradle on TC +if (hasProperty('buildScan')) { + buildScan { + termsOfServiceUrl = 'https://gradle.com/terms-of-service' + termsOfServiceAgree = 'yes' + } +} + +/* + * kotlinx-coroutines-core dependency leaks into test runtime classpath via kotlin-compiler-embeddable + * and conflicts with our own test/runtime incompatibilities (e.g. when class is moved from a main to test), + * so we do substitution here + */ +allprojects { subProject -> + subProject + .configurations + .matching { + // Excluding substituted project itself because of circular dependencies, but still do it + // for "*Test*" configurations + subProject.name != "kotlinx-coroutines-core" || it.name.contains("Test") + } + .configureEach { conf -> + conf.resolutionStrategy.dependencySubstitution { + substitute(module("org.jetbrains.kotlinx:kotlinx-coroutines-core")) + .using(project(":kotlinx-coroutines-core")) + .because("Because Kotlin compiler embeddable leaks coroutines into the runtime classpath, " + + "triggering all sort of incompatible class changes errors") + } + } +} From b852b20131fff5c0d605d7cb5f8001b715f02c1e Mon Sep 17 00:00:00 2001 From: Shubham <7660565+shubham08gupta@users.noreply.github.com> Date: Mon, 7 Jun 2021 23:11:38 +0900 Subject: [PATCH 084/328] Use correct wording in shared-mutable-state-and-concurrency.md (#2734) Using Dispatchers.Default we can make the coroutines run *parallelly*. Co-authored-by: Vsevolod Tolstopyatov Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- docs/topics/shared-mutable-state-and-concurrency.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/topics/shared-mutable-state-and-concurrency.md b/docs/topics/shared-mutable-state-and-concurrency.md index b4b68b30ce..40b0134a4b 100644 --- a/docs/topics/shared-mutable-state-and-concurrency.md +++ b/docs/topics/shared-mutable-state-and-concurrency.md @@ -2,8 +2,8 @@ [//]: # (title: Shared mutable state and concurrency) -Coroutines can be executed concurrently using a multi-threaded dispatcher like the [Dispatchers.Default]. It presents -all the usual concurrency problems. The main problem being synchronization of access to **shared mutable state**. +Coroutines can be executed parallelly using a multi-threaded dispatcher like the [Dispatchers.Default]. It presents +all the usual parallelism problems. The main problem being synchronization of access to **shared mutable state**. Some solutions to this problem in the land of coroutines are similar to the solutions in the multi-threaded world, but others are unique. @@ -510,4 +510,4 @@ have to switch to a different context at all. [actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html [produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html - \ No newline at end of file + From 8a4c130e27822b570dc83175d2ee545a37d2c2d3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 15 Jun 2021 14:59:32 +0300 Subject: [PATCH 085/328] Update binary compatibility validator (#2764) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a65c81612e..d4fe1b212c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.5.0 +binary_compatibility_validator_version=0.6.0 blockhound_version=1.0.2.RELEASE jna_version=5.5.0 From 38535bf8b1271ac34e39edd3a9ffde8d48303f73 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 16 Jun 2021 12:13:05 +0300 Subject: [PATCH 086/328] Replace InternalCoroutinesApi with deprecation in NonCancellable (#2765) * ICA is misused here as lint, for which we consistently use @Deprecated in other places * The current state is incompatible with 1.5.30 where KT-45844 is implemented --- .../common/src/NonCancellable.kt | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/NonCancellable.kt b/kotlinx-coroutines-core/common/src/NonCancellable.kt index 5d3644ba91..c278109224 100644 --- a/kotlinx-coroutines-core/common/src/NonCancellable.kt +++ b/kotlinx-coroutines-core/common/src/NonCancellable.kt @@ -24,40 +24,45 @@ import kotlin.coroutines.* * when the parent is cancelled, the whole parent-child relation between parent and child is severed. * The parent will not wait for the child's completion, nor will be cancelled when the child crashed. */ +@Suppress("DeprecatedCallableAddReplaceWith") public object NonCancellable : AbstractCoroutineContextElement(Job), Job { + + private const val message = "NonCancellable can be used only as an argument for 'withContext', direct usages of its API are prohibited" + /** * Always returns `true`. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi - override val isActive: Boolean get() = true + @Deprecated(level = DeprecationLevel.WARNING, message = message) + override val isActive: Boolean + get() = true /** * Always returns `false`. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override val isCompleted: Boolean get() = false /** * Always returns `false`. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override val isCancelled: Boolean get() = false /** * Always returns `false`. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun start(): Boolean = false /** * Always throws [UnsupportedOperationException]. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override suspend fun join() { throw UnsupportedOperationException("This job is always active") } @@ -66,6 +71,7 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Always throws [UnsupportedOperationException]. * @suppress **This an internal API and should not be used from general code.** */ + @Deprecated(level = DeprecationLevel.WARNING, message = message) override val onJoin: SelectClause0 get() = throw UnsupportedOperationException("This job is always active") @@ -73,14 +79,13 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Always throws [IllegalStateException]. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun getCancellationException(): CancellationException = throw IllegalStateException("This job is always active") /** * @suppress **This an internal API and should not be used from general code.** */ - @Suppress("OverridingDeprecatedMember") - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle = NonDisposableHandle @@ -88,7 +93,7 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Always returns no-op handle. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun invokeOnCompletion(onCancelling: Boolean, invokeImmediately: Boolean, handler: CompletionHandler): DisposableHandle = NonDisposableHandle @@ -96,7 +101,7 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Does nothing. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun cancel(cause: CancellationException?) {} /** @@ -110,7 +115,7 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Always returns [emptySequence]. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override val children: Sequence get() = emptySequence() @@ -118,7 +123,7 @@ public object NonCancellable : AbstractCoroutineContextElement(Job), Job { * Always returns [NonDisposableHandle] and does not do anything. * @suppress **This an internal API and should not be used from general code.** */ - @InternalCoroutinesApi + @Deprecated(level = DeprecationLevel.WARNING, message = message) override fun attachChild(child: ChildJob): ChildHandle = NonDisposableHandle /** @suppress */ From 93f5e0d00ae93be960a4d655b0b5ddbb03142114 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 16 Jun 2021 14:38:55 +0300 Subject: [PATCH 087/328] Update supervisorScope documentation to avoid confusion (#2757) * Update supervisorScope documentation to avoid confusion Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- kotlinx-coroutines-core/common/src/Supervisor.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Supervisor.kt b/kotlinx-coroutines-core/common/src/Supervisor.kt index 01a8e70522..8411c5c65a 100644 --- a/kotlinx-coroutines-core/common/src/Supervisor.kt +++ b/kotlinx-coroutines-core/common/src/Supervisor.kt @@ -42,11 +42,15 @@ public fun SupervisorJob0(parent: Job? = null) : Job = SupervisorJob(parent) * Creates a [CoroutineScope] with [SupervisorJob] and calls the specified suspend block with this scope. * The provided scope inherits its [coroutineContext][CoroutineScope.coroutineContext] from the outer scope, but overrides * context's [Job] with [SupervisorJob]. + * This function returns as soon as the given block and all its child coroutines are completed. * - * A failure of a child does not cause this scope to fail and does not affect its other children, - * so a custom policy for handling failures of its children can be implemented. See [SupervisorJob] for details. - * A failure of the scope itself (exception thrown in the [block] or cancellation) fails the scope with all its children, + * Unlike [coroutineScope], a failure of a child does not cause this scope to fail and does not affect its other children, + * so a custom policy for handling failures of its children can be implemented. See [SupervisorJob] for additional details. + * A failure of the scope itself (exception thrown in the [block] or external cancellation) fails the scope with all its children, * but does not cancel parent job. + * + * The method may throw a [CancellationException] if the current job was cancelled externally, + * or rethrow an exception thrown by the given [block]. */ public suspend fun supervisorScope(block: suspend CoroutineScope.() -> R): R { contract { From 41e2cf9ad48ea405f5a159b985ad581ce2cdafc5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 7 Jun 2021 18:15:18 +0300 Subject: [PATCH 088/328] Verify integrity of the recovered exception's message on both code paths Fixes #2749 --- .../jvm/src/internal/StackTraceRecovery.kt | 13 +++++--- .../StackTraceRecoveryCustomExceptionsTest.kt | 30 +++++++++++++++++++ .../test/exceptions/StackTraceRecoveryTest.kt | 14 --------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt index 48e8790cd1..4e17c08201 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt @@ -29,7 +29,7 @@ private val stackTraceRecoveryClassName = runCatching { internal actual fun recoverStackTrace(exception: E): E { if (!RECOVER_STACK_TRACES) return exception // No unwrapping on continuation-less path: exception is not reported multiple times via slow paths - val copy = tryCopyException(exception) ?: return exception + val copy = tryCopyAndVerify(exception) ?: return exception return copy.sanitizeStackTrace() } @@ -66,9 +66,7 @@ private fun recoverFromStackFrame(exception: E, continuation: Co val (cause, recoveredStacktrace) = exception.causeAndStacktrace() // Try to create an exception of the same type and get stacktrace from continuation - val newException = tryCopyException(cause) ?: return exception - // Verify that the new exception has the same message as the original one (bail out if not, see #1631) - if (newException.message != cause.message) return exception + val newException = tryCopyAndVerify(cause) ?: return exception // Update stacktrace val stacktrace = createStackTrace(continuation) if (stacktrace.isEmpty()) return exception @@ -80,6 +78,13 @@ private fun recoverFromStackFrame(exception: E, continuation: Co return createFinalException(cause, newException, stacktrace) } +private fun tryCopyAndVerify(exception: E): E? { + val newException = tryCopyException(exception) ?: return null + // Verify that the new exception has the same message as the original one (bail out if not, see #1631) + if (newException.message != exception.message) return null + return newException +} + /* * Here we partially copy original exception stackTrace to make current one much prettier. * E.g. for diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt index 70336659e8..3cac3ebabe 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.exceptions import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import org.junit.Test import kotlin.test.* @@ -71,4 +72,33 @@ class StackTraceRecoveryCustomExceptionsTest : TestBase() { assertEquals("custom", cause.message) } } + + class WrongMessageException(token: String) : RuntimeException("Token $token") + + @Test + fun testWrongMessageException() = runTest { + val result = runCatching { + coroutineScope { + throw WrongMessageException("OK") + } + } + val ex = result.exceptionOrNull() ?: error("Expected to fail") + assertTrue(ex is WrongMessageException) + assertEquals("Token OK", ex.message) + } + + @Test + fun testWrongMessageExceptionInChannel() = runTest { + // Separate code path + val result = produce(SupervisorJob() + Dispatchers.Unconfined) { + throw WrongMessageException("OK") + } + val ex = runCatching { + for (unit in result) { + // Iterator has a special code path + } + }.exceptionOrNull() ?: error("Expected to fail") + assertTrue(ex is WrongMessageException) + assertEquals("Token OK", ex.message) + } } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt index 8dc106bc22..0a8b6530e2 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryTest.kt @@ -261,18 +261,4 @@ class StackTraceRecoveryTest : TestBase() { } yield() // nop to make sure it is not a tail call } - - @Test - fun testWrongMessageException() = runTest { - val result = runCatching { - coroutineScope { - throw WrongMessageException("OK") - } - } - val ex = result.exceptionOrNull() ?: error("Expected to fail") - assertTrue(ex is WrongMessageException) - assertEquals("Token OK", ex.message) - } - - public class WrongMessageException(token: String) : RuntimeException("Token $token") } From 8ba04bceff13bbc9d370764a1c8c923031189fc9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 7 Jun 2021 18:29:07 +0300 Subject: [PATCH 089/328] Allow CopyableThrowable to modify exception message and document message identity in debugging.md Addresses #1931 --- docs/topics/debugging.md | 5 +++- .../common/src/Debug.common.kt | 5 ++++ .../jvm/src/internal/StackTraceRecovery.kt | 3 ++- .../StackTraceRecoveryCustomExceptionsTest.kt | 25 ++++++++++++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/docs/topics/debugging.md b/docs/topics/debugging.md index d18df7f465..5ff4d549e0 100644 --- a/docs/topics/debugging.md +++ b/docs/topics/debugging.md @@ -63,7 +63,10 @@ Exception copy logic is straightforward: 1) If the exception class implements [CopyableThrowable], [CopyableThrowable.createCopy] is used. `null` can be returned from `createCopy` to opt-out specific exception from being recovered. 2) If the exception class has class-specific fields not inherited from Throwable, the exception is not copied. - 3) Otherwise, one of the public exception's constructor is invoked reflectively with an optional `initCause` call. + 3) Otherwise, one of the public exception's constructor is invoked reflectively with an optional `initCause` call. + 4) If the reflective copy has a changed message (exception constructor passed a modified `message` parameter to the superclass), + the exception is not copied in order to preserve a human-readable message. [CopyableThrowable] does not have such a limitation + and allows the copy to have a `message` different from that of the original. ## Debug agent diff --git a/kotlinx-coroutines-core/common/src/Debug.common.kt b/kotlinx-coroutines-core/common/src/Debug.common.kt index 1381ecd882..185ad295d8 100644 --- a/kotlinx-coroutines-core/common/src/Debug.common.kt +++ b/kotlinx-coroutines-core/common/src/Debug.common.kt @@ -32,10 +32,15 @@ public interface CopyableThrowable where T : Throwable, T : CopyableThrowable /** * Creates a copy of the current instance. + * * For better debuggability, it is recommended to use original exception as [cause][Throwable.cause] of the resulting one. * Stacktrace of copied exception will be overwritten by stacktrace recovery machinery by [Throwable.setStackTrace] call. * An exception can opt-out of copying by returning `null` from this function. * Suppressed exceptions of the original exception should not be copied in order to avoid circular exceptions. + * + * This function is allowed to create a copy with a modified [message][Throwable.message], but it should be noted + * that the copy can be later recovered as well and message modification code should handle this situation correctly + * (e.g. by also storing the original message and checking it) to produce a human-readable result. */ public fun createCopy(): T? } diff --git a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt index 4e17c08201..174c57b762 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt @@ -81,7 +81,8 @@ private fun recoverFromStackFrame(exception: E, continuation: Co private fun tryCopyAndVerify(exception: E): E? { val newException = tryCopyException(exception) ?: return null // Verify that the new exception has the same message as the original one (bail out if not, see #1631) - if (newException.message != exception.message) return null + // CopyableThrowable has control over its message and thus can modify it the way it wants + if (exception !is CopyableThrowable<*> && newException.message != exception.message) return null return newException } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt index 3cac3ebabe..dba738a8d3 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt @@ -89,11 +89,11 @@ class StackTraceRecoveryCustomExceptionsTest : TestBase() { @Test fun testWrongMessageExceptionInChannel() = runTest { - // Separate code path val result = produce(SupervisorJob() + Dispatchers.Unconfined) { throw WrongMessageException("OK") } val ex = runCatching { + @Suppress("ControlFlowWithEmptyBody") for (unit in result) { // Iterator has a special code path } @@ -101,4 +101,27 @@ class StackTraceRecoveryCustomExceptionsTest : TestBase() { assertTrue(ex is WrongMessageException) assertEquals("Token OK", ex.message) } + + class CopyableWithCustomMessage( + message: String?, + cause: Throwable? = null + ) : RuntimeException(message, cause), + CopyableThrowable { + + override fun createCopy(): CopyableWithCustomMessage { + return CopyableWithCustomMessage("Recovered: [$message]", cause) + } + } + + @Test + fun testCustomCopyableMessage() = runTest { + val result = runCatching { + coroutineScope { + throw CopyableWithCustomMessage("OK") + } + } + val ex = result.exceptionOrNull() ?: error("Expected to fail") + assertTrue(ex is CopyableWithCustomMessage) + assertEquals("Recovered: [OK]", ex.message) + } } From 3d62f649fc0caccd05ca44608abcb871f412764b Mon Sep 17 00:00:00 2001 From: Joffrey Bion Date: Tue, 22 Jun 2021 15:45:20 +0200 Subject: [PATCH 090/328] Clarify Dispatchers.IO's implementation note (#2780) This implementation note mentions that withContext(IO) does not lead to a context switch, which may be misunderstood as a general statement, while it in fact only applies to switches between Default and IO dispatchers. This is one example of misunderstanding: https://stackoverflow.com/questions/68069529/is-kotlinx-coroutines-withcontext-safe-to-use-with-spring-webflux --- kotlinx-coroutines-core/jvm/src/Dispatchers.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt index 25c0fbe9b0..d82598eab4 100644 --- a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt @@ -107,9 +107,10 @@ public actual object Dispatchers { * * ### Implementation note * - * This dispatcher shares threads with a [Default][Dispatchers.Default] dispatcher, so using - * `withContext(Dispatchers.IO) { ... }` does not lead to an actual switching to another thread — - * typically execution continues in the same thread. + * This dispatcher shares threads with the [Default][Dispatchers.Default] dispatcher, so using + * `withContext(Dispatchers.IO) { ... }` when already running on the [Default][Dispatchers.Default] + * dispatcher does not lead to an actual switching to another thread — typically execution + * continues in the same thread. * As a result of thread sharing, more than 64 (default parallelism) threads can be created (but not used) * during operations over IO dispatcher. */ From f727657714c36fc1f9cc9b7f8c1ed6fd38f218dc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 22 Jun 2021 18:12:10 +0300 Subject: [PATCH 091/328] Remove InternalCoroutinesApi from overridden releaseInterceptedContinuation. (#2773) Otherwise compilation fails on 1.5.30 due to KT-45844 --- kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index 10be4a3d9e..d6432fe82e 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -99,7 +99,6 @@ public abstract class CoroutineDispatcher : public final override fun interceptContinuation(continuation: Continuation): Continuation = DispatchedContinuation(this, continuation) - @InternalCoroutinesApi public override fun releaseInterceptedContinuation(continuation: Continuation<*>) { /* * Unconditional cast is safe here: we only return DispatchedContinuation from `interceptContinuation`, From a9e2f0b1c1beddad927944eee3617289042db82f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 23 Jun 2021 11:37:02 +0300 Subject: [PATCH 092/328] Make releaseInterceptedContinuation final (#2785) * Make releaseInterceptedContinuation final * CoroutineDispatcher is internal for implementation and always has been * Overriding this method may lead to memory leaks in parent coroutines and is considered dangerous --- kotlinx-coroutines-core/api/kotlinx-coroutines-core.api | 2 +- kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 06fad84d28..50bfb60d62 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -158,7 +158,7 @@ public abstract class kotlinx/coroutines/CoroutineDispatcher : kotlin/coroutines public fun isDispatchNeeded (Lkotlin/coroutines/CoroutineContext;)Z public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; public final fun plus (Lkotlinx/coroutines/CoroutineDispatcher;)Lkotlinx/coroutines/CoroutineDispatcher; - public fun releaseInterceptedContinuation (Lkotlin/coroutines/Continuation;)V + public final fun releaseInterceptedContinuation (Lkotlin/coroutines/Continuation;)V public fun toString ()Ljava/lang/String; } diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index d6432fe82e..d5613d4110 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -99,7 +99,7 @@ public abstract class CoroutineDispatcher : public final override fun interceptContinuation(continuation: Continuation): Continuation = DispatchedContinuation(this, continuation) - public override fun releaseInterceptedContinuation(continuation: Continuation<*>) { + public final override fun releaseInterceptedContinuation(continuation: Continuation<*>) { /* * Unconditional cast is safe here: we only return DispatchedContinuation from `interceptContinuation`, * any ClassCastException can only indicate compiler bug From d2c652e83f36f7f33257f63452ea0d68853edc54 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 23 Jun 2021 14:02:22 +0300 Subject: [PATCH 093/328] =?UTF-8?q?Properly=20detect=20non-released=20reus?= =?UTF-8?q?able=20continuations=20in=20non-reusable=20o=E2=80=A6=20(#2772)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Properly detect non-released reusable continuations in non-reusable ones and await for reusability to have a consistent state * Ensure that the caller to DispatchedContinuation.isReusable is reusable itself * Using the previous invariant, simplify DispatchedContinuation.isReusable to a single null-check * It also restores the invariant that `cc.isReusable() == cc.resumeMode.isReusableMode` Fixes #2736 Fixes #2768 --- .../common/src/CancellableContinuationImpl.kt | 7 ++-- .../src/internal/DispatchedContinuation.kt | 26 ++++-------- .../test/ReusableContinuationStressTest.kt | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/ReusableContinuationStressTest.kt diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt index f74155eb8f..1a0169b65d 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuationImpl.kt @@ -107,7 +107,7 @@ internal open class CancellableContinuationImpl( } } - private fun isReusable(): Boolean = delegate is DispatchedContinuation<*> && delegate.isReusable(this) + private fun isReusable(): Boolean = resumeMode.isReusableMode && (delegate as DispatchedContinuation<*>).isReusable() /** * Resets cancellability state in order to [suspendCancellableCoroutineReusable] to work. @@ -115,7 +115,7 @@ internal open class CancellableContinuationImpl( */ @JvmName("resetStateReusable") // Prettier stack traces internal fun resetStateReusable(): Boolean { - assert { resumeMode == MODE_CANCELLABLE_REUSABLE } // invalid mode for CancellableContinuationImpl + assert { resumeMode == MODE_CANCELLABLE_REUSABLE } assert { parentHandle !== NonDisposableHandle } val state = _state.value assert { state !is NotCompleted } @@ -164,8 +164,7 @@ internal open class CancellableContinuationImpl( * Attempt to postpone cancellation for reusable cancellable continuation */ private fun cancelLater(cause: Throwable): Boolean { - if (!resumeMode.isReusableMode) return false - // Ensure that we are postponing cancellation to the right instance + // Ensure that we are postponing cancellation to the right reusable instance if (!isReusable()) return false val dispatched = delegate as DispatchedContinuation<*> return dispatched.postponeCancellation(cause) diff --git a/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt b/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt index 45b9699c84..c689a38186 100644 --- a/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt +++ b/kotlinx-coroutines-core/common/src/internal/DispatchedContinuation.kt @@ -58,40 +58,30 @@ internal class DispatchedContinuation( */ private val _reusableCancellableContinuation = atomic(null) - public val reusableCancellableContinuation: CancellableContinuationImpl<*>? + private val reusableCancellableContinuation: CancellableContinuationImpl<*>? get() = _reusableCancellableContinuation.value as? CancellableContinuationImpl<*> - public fun isReusable(requester: CancellableContinuationImpl<*>): Boolean { + fun isReusable(): Boolean { /* + Invariant: caller.resumeMode.isReusableMode * Reusability control: * `null` -> no reusability at all, `false` - * If current state is not CCI, then we are within `suspendCancellableCoroutineReusable`, true - * Else, if result is CCI === requester, then it's our reusable continuation - * Identity check my fail for the following pattern: - * ``` - * loop: - * suspendCancellableCoroutineReusable { } // Reusable, outer coroutine stores the child handle - * suspendCancellableCoroutine { } // **Not reusable**, handle should be disposed after {}, otherwise - * it will leak because it won't be freed by `releaseInterceptedContinuation` - * ``` + * anything else -> reusable. */ - val value = _reusableCancellableContinuation.value ?: return false - if (value is CancellableContinuationImpl<*>) return value === requester - return true + return _reusableCancellableContinuation.value != null } - /** * Awaits until previous call to `suspendCancellableCoroutineReusable` will * stop mutating cached instance */ - public fun awaitReusability() { - _reusableCancellableContinuation.loop { it -> + fun awaitReusability() { + _reusableCancellableContinuation.loop { if (it !== REUSABLE_CLAIMED) return } } - public fun release() { + fun release() { /* * Called from `releaseInterceptedContinuation`, can be concurrent with * the code in `getResult` right after `trySuspend` returned `true`, so we have diff --git a/kotlinx-coroutines-core/jvm/test/ReusableContinuationStressTest.kt b/kotlinx-coroutines-core/jvm/test/ReusableContinuationStressTest.kt new file mode 100644 index 0000000000..a256815db3 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ReusableContinuationStressTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.flow.* +import org.junit.* + +class ReusableContinuationStressTest : TestBase() { + + private val iterations = 1000 * stressTestMultiplierSqrt + + @Test // Originally reported by @denis-bezrukov in #2736 + fun testDebounceWithStateFlow() = runBlocking { + withContext(Dispatchers.Default) { + repeat(iterations) { + launch { // <- load the dispatcher and OS scheduler + runStressTestOnce(1, 1) + } + } + } + } + + private suspend fun runStressTestOnce(delay: Int, debounce: Int) = coroutineScope { + val stateFlow = MutableStateFlow(0) + val emitter = launch { + repeat(1000) { i -> + stateFlow.emit(i) + delay(delay.toLong()) + } + } + var last = 0 + stateFlow.debounce(debounce.toLong()).take(100).collect { i -> + if (i - last > 100) { + last = i + } + } + emitter.cancel() + } +} From e81ce210eef465d8fa0097bd6e463202b0f3e253 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 24 Jun 2021 12:48:38 +0300 Subject: [PATCH 094/328] Introduce Task.await and Task.asDeferred with CancellationTokenSource (#2786) * Support bi-directional cancellation for Task.asDeferred and Task.await via passed in CancellationTokenSource Fixes #2527 Co-authored-by: Alex Vanyo Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- .../README.md | 10 + .../api/kotlinx-coroutines-play-services.api | 2 + .../src/Tasks.kt | 99 +++++-- .../test/TaskTest.kt | 265 ++++++++++++++++++ 4 files changed, 349 insertions(+), 27 deletions(-) diff --git a/integration/kotlinx-coroutines-play-services/README.md b/integration/kotlinx-coroutines-play-services/README.md index 4ee6bf427c..e5e0e613b3 100644 --- a/integration/kotlinx-coroutines-play-services/README.md +++ b/integration/kotlinx-coroutines-play-services/README.md @@ -6,6 +6,7 @@ Extension functions: | **Name** | **Description** | -------- | --------------- +| [Task.asDeferred][asDeferred] | Converts a Task into a Deferred | [Task.await][await] | Awaits for completion of the Task (cancellable) | [Deferred.asTask][asTask] | Converts a deferred value to a Task @@ -25,5 +26,14 @@ val snapshot = try { // Do stuff ``` +If the `Task` supports cancellation via passing a `CancellationToken`, pass the corresponding `CancellationTokenSource` to `asDeferred` or `await` to support bi-directional cancellation: + +```kotlin +val cancellationTokenSource = CancellationTokenSource() +val currentLocationTask = fusedLocationProviderClient.getCurrentLocation(PRIORITY_HIGH_ACCURACY, cancellationTokenSource.token) +val currentLocation = currentLocationTask.await(cancellationTokenSource) // cancelling `await` also cancels `currentLocationTask`, and vice versa +``` + +[asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/com.google.android.gms.tasks.-task/as-deferred.html [await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/com.google.android.gms.tasks.-task/await.html [asTask]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/kotlinx.coroutines.-deferred/as-task.html diff --git a/integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api b/integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api index 9b2c4dd388..cc23e8db2e 100644 --- a/integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api +++ b/integration/kotlinx-coroutines-play-services/api/kotlinx-coroutines-play-services.api @@ -1,6 +1,8 @@ public final class kotlinx/coroutines/tasks/TasksKt { public static final fun asDeferred (Lcom/google/android/gms/tasks/Task;)Lkotlinx/coroutines/Deferred; + public static final fun asDeferred (Lcom/google/android/gms/tasks/Task;Lcom/google/android/gms/tasks/CancellationTokenSource;)Lkotlinx/coroutines/Deferred; public static final fun asTask (Lkotlinx/coroutines/Deferred;)Lcom/google/android/gms/tasks/Task; + public static final fun await (Lcom/google/android/gms/tasks/Task;Lcom/google/android/gms/tasks/CancellationTokenSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun await (Lcom/google/android/gms/tasks/Task;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/integration/kotlinx-coroutines-play-services/src/Tasks.kt b/integration/kotlinx-coroutines-play-services/src/Tasks.kt index d89d1aec7c..c37ac7a02d 100644 --- a/integration/kotlinx-coroutines-play-services/src/Tasks.kt +++ b/integration/kotlinx-coroutines-play-services/src/Tasks.kt @@ -6,15 +6,8 @@ package kotlinx.coroutines.tasks -import com.google.android.gms.tasks.CancellationTokenSource -import com.google.android.gms.tasks.RuntimeExecutionException -import com.google.android.gms.tasks.Task -import com.google.android.gms.tasks.TaskCompletionSource -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Job -import kotlinx.coroutines.suspendCancellableCoroutine +import com.google.android.gms.tasks.* +import kotlinx.coroutines.* import kotlin.coroutines.* /** @@ -45,39 +38,85 @@ public fun Deferred.asTask(): Task { /** * Converts this task to an instance of [Deferred]. * If task is cancelled then resulting deferred will be cancelled as well. + * However, the opposite is not true: if the deferred is cancelled, the [Task] will not be cancelled. + * For bi-directional cancellation, an overload that accepts [CancellationTokenSource] can be used. */ -public fun Task.asDeferred(): Deferred { +public fun Task.asDeferred(): Deferred = asDeferredImpl(null) + +/** + * Converts this task to an instance of [Deferred] with a [CancellationTokenSource] to control cancellation. + * The cancellation of this function is bi-directional: + * * If the given task is cancelled, the resulting deferred will be cancelled. + * * If the resulting deferred is cancelled, the provided [cancellationTokenSource] will be cancelled. + * + * Providing a [CancellationTokenSource] that is unrelated to the receiving [Task] is not supported and + * leads to an unspecified behaviour. + */ +@ExperimentalCoroutinesApi // Since 1.5.1, tentatively until 1.6.0 +public fun Task.asDeferred(cancellationTokenSource: CancellationTokenSource): Deferred = + asDeferredImpl(cancellationTokenSource) + +private fun Task.asDeferredImpl(cancellationTokenSource: CancellationTokenSource?): Deferred { + val deferred = CompletableDeferred() if (isComplete) { val e = exception - return if (e == null) { - @Suppress("UNCHECKED_CAST") - CompletableDeferred().apply { if (isCanceled) cancel() else complete(result as T) } + if (e == null) { + if (isCanceled) { + deferred.cancel() + } else { + @Suppress("UNCHECKED_CAST") + deferred.complete(result as T) + } } else { - CompletableDeferred().apply { completeExceptionally(e) } + deferred.completeExceptionally(e) + } + } else { + addOnCompleteListener { + val e = it.exception + if (e == null) { + @Suppress("UNCHECKED_CAST") + if (it.isCanceled) deferred.cancel() else deferred.complete(it.result as T) + } else { + deferred.completeExceptionally(e) + } } } - val result = CompletableDeferred() - addOnCompleteListener { - val e = it.exception - if (e == null) { - @Suppress("UNCHECKED_CAST") - if (isCanceled) result.cancel() else result.complete(it.result as T) - } else { - result.completeExceptionally(e) + if (cancellationTokenSource != null) { + deferred.invokeOnCompletion { + cancellationTokenSource.cancel() } } - return result + // Prevent casting to CompletableDeferred and manual completion. + return object : Deferred by deferred {} } /** - * Awaits for completion of the task without blocking a thread. + * Awaits the completion of the task without blocking a thread. * * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function * stops waiting for the completion stage and immediately resumes with [CancellationException]. + * + * For bi-directional cancellation, an overload that accepts [CancellationTokenSource] can be used. + */ +public suspend fun Task.await(): T = awaitImpl(null) + +/** + * Awaits the completion of the task that is linked to the given [CancellationTokenSource] to control cancellation. + * + * This suspending function is cancellable and cancellation is bi-directional: + * * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function + * cancels the [cancellationTokenSource] and throws a [CancellationException]. + * * If the task is cancelled, then this function will throw a [CancellationException]. + * + * Providing a [CancellationTokenSource] that is unrelated to the receiving [Task] is not supported and + * leads to an unspecified behaviour. */ -public suspend fun Task.await(): T { +@ExperimentalCoroutinesApi // Since 1.5.1, tentatively until 1.6.0 +public suspend fun Task.await(cancellationTokenSource: CancellationTokenSource): T = awaitImpl(cancellationTokenSource) + +private suspend fun Task.awaitImpl(cancellationTokenSource: CancellationTokenSource?): T { // fast path if (isComplete) { val e = exception @@ -95,13 +134,19 @@ public suspend fun Task.await(): T { return suspendCancellableCoroutine { cont -> addOnCompleteListener { - val e = exception + val e = it.exception if (e == null) { @Suppress("UNCHECKED_CAST") - if (isCanceled) cont.cancel() else cont.resume(result as T) + if (it.isCanceled) cont.cancel() else cont.resume(it.result as T) } else { cont.resumeWithException(e) } } + + if (cancellationTokenSource != null) { + cont.invokeOnCancellation { + cancellationTokenSource.cancel() + } + } } } diff --git a/integration/kotlinx-coroutines-play-services/test/TaskTest.kt b/integration/kotlinx-coroutines-play-services/test/TaskTest.kt index 0f125ac98c..b125192e93 100644 --- a/integration/kotlinx-coroutines-play-services/test/TaskTest.kt +++ b/integration/kotlinx-coroutines-play-services/test/TaskTest.kt @@ -149,5 +149,270 @@ class TaskTest : TestBase() { } } + @Test + fun testCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val deferred = Tasks.forResult(42).asDeferred(cancellationTokenSource) + assertEquals(42, deferred.await()) + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testNullResultCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + assertNull(Tasks.forResult(null).asDeferred(cancellationTokenSource).await()) + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testCancelledCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val deferred = Tasks.forCanceled().asDeferred(cancellationTokenSource) + + assertTrue(deferred.isCancelled) + try { + deferred.await() + fail("deferred.await() should be cancelled") + } catch (e: Exception) { + assertTrue(e is CancellationException) + } + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testCancellingCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val task = TaskCompletionSource(cancellationTokenSource.token).task + val deferred = task.asDeferred(cancellationTokenSource) + + deferred.cancel() + try { + deferred.await() + fail("deferred.await() should be cancelled") + } catch (e: Exception) { + assertTrue(e is CancellationException) + } + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testExternallyCancelledCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val task = TaskCompletionSource(cancellationTokenSource.token).task + val deferred = task.asDeferred(cancellationTokenSource) + + cancellationTokenSource.cancel() + + try { + deferred.await() + fail("deferred.await() should be cancelled") + } catch (e: Exception) { + assertTrue(e is CancellationException) + } + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testSeparatelyCancelledCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val task = TaskCompletionSource().task + task.asDeferred(cancellationTokenSource) + + cancellationTokenSource.cancel() + + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testFailedCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val deferred = Tasks.forException(TestException("something went wrong")).asDeferred(cancellationTokenSource) + + assertTrue(deferred.isCancelled && deferred.isCompleted) + val completionException = deferred.getCompletionExceptionOrNull()!! + assertTrue(completionException is TestException) + assertEquals("something went wrong", completionException.message) + + try { + deferred.await() + fail("deferred.await() should throw an exception") + } catch (e: Exception) { + assertTrue(e is TestException) + assertEquals("something went wrong", e.message) + } + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testFailingCancellableTaskAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val lock = ReentrantLock().apply { lock() } + + val deferred: Deferred = Tasks.call { + lock.withLock { throw TestException("something went wrong") } + }.asDeferred(cancellationTokenSource) + + assertFalse(deferred.isCompleted) + lock.unlock() + + try { + deferred.await() + fail("deferred.await() should throw an exception") + } catch (e: Exception) { + assertTrue(e is TestException) + assertEquals("something went wrong", e.message) + assertSame(e.cause, deferred.getCompletionExceptionOrNull()) // debug mode stack augmentation + } + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testFastPathCompletedTaskWithCancelledTokenSourceAsDeferred() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val deferred = Tasks.forResult(42).asDeferred(cancellationTokenSource) + cancellationTokenSource.cancel() + assertEquals(42, deferred.await()) + } + + @Test + fun testAwaitCancellableTask() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val taskCompletionSource = TaskCompletionSource(cancellationTokenSource.token) + + val deferred: Deferred = async(start = CoroutineStart.UNDISPATCHED) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + taskCompletionSource.setResult(42) + + assertEquals(42, deferred.await()) + assertTrue(deferred.isCompleted) + } + + @Test + fun testFailedAwaitTask() = runTest(expected = { it is TestException }) { + val cancellationTokenSource = CancellationTokenSource() + val taskCompletionSource = TaskCompletionSource(cancellationTokenSource.token) + + val deferred: Deferred = async(start = CoroutineStart.UNDISPATCHED) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + taskCompletionSource.setException(TestException("something went wrong")) + + deferred.await() + } + + @Test + fun testCancelledAwaitCancellableTask() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val taskCompletionSource = TaskCompletionSource(cancellationTokenSource.token) + + val deferred: Deferred = async(start = CoroutineStart.UNDISPATCHED) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + // Cancel the deferred + deferred.cancel() + + try { + deferred.await() + fail("deferred.await() should be cancelled") + } catch (e: Exception) { + assertTrue(e is CancellationException) + } + + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testExternallyCancelledAwaitCancellableTask() = runTest { + val cancellationTokenSource = CancellationTokenSource() + val taskCompletionSource = TaskCompletionSource(cancellationTokenSource.token) + + val deferred: Deferred = async(start = CoroutineStart.UNDISPATCHED) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + // Cancel the cancellation token source + cancellationTokenSource.cancel() + + try { + deferred.await() + fail("deferred.await() should be cancelled") + } catch (e: Exception) { + assertTrue(e is CancellationException) + } + + assertTrue(cancellationTokenSource.token.isCancellationRequested) + } + + @Test + fun testFastPathCancellationTokenSourceCancelledAwaitCancellableTask() = runTest { + val cancellationTokenSource = CancellationTokenSource() + // Construct a task without the cancellation token source + val taskCompletionSource = TaskCompletionSource() + + val deferred: Deferred = async(start = CoroutineStart.LAZY) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + cancellationTokenSource.cancel() + + // Cancelling the token doesn't cancel the deferred + assertTrue(cancellationTokenSource.token.isCancellationRequested) + assertFalse(deferred.isCompleted) + + // Cleanup + deferred.cancel() + } + + @Test + fun testSlowPathCancellationTokenSourceCancelledAwaitCancellableTask() = runTest { + val cancellationTokenSource = CancellationTokenSource() + // Construct a task without the cancellation token source + val taskCompletionSource = TaskCompletionSource() + + val deferred: Deferred = async(start = CoroutineStart.UNDISPATCHED) { + taskCompletionSource.task.await(cancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + cancellationTokenSource.cancel() + + // Cancelling the token doesn't cancel the deferred + assertTrue(cancellationTokenSource.token.isCancellationRequested) + assertFalse(deferred.isCompleted) + + // Cleanup + deferred.cancel() + } + + @Test + fun testFastPathWithCompletedTaskAndCanceledTokenSourceAwaitTask() = runTest { + val firstCancellationTokenSource = CancellationTokenSource() + val secondCancellationTokenSource = CancellationTokenSource() + // Construct a task with a different cancellation token source + val taskCompletionSource = TaskCompletionSource(firstCancellationTokenSource.token) + + val deferred: Deferred = async(start = CoroutineStart.LAZY) { + taskCompletionSource.task.await(secondCancellationTokenSource) + } + + assertFalse(deferred.isCompleted) + secondCancellationTokenSource.cancel() + + assertFalse(deferred.isCompleted) + taskCompletionSource.setResult(42) + + assertEquals(42, deferred.await()) + assertTrue(deferred.isCompleted) + } + class TestException(message: String) : Exception(message) } From a327dfb5809ef508d416a1cf98110340dcfe7430 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 25 Jun 2021 11:50:52 +0300 Subject: [PATCH 095/328] Remove opt-in annotation from internal MainTestDispatcher See #KT-45844 --- kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt b/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt index 9953756f70..c85d27ea87 100644 --- a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt +++ b/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt @@ -35,7 +35,6 @@ internal class TestMainDispatcher(private val mainFactory: MainDispatcherFactory delegate.dispatch(context, block) } - @ExperimentalCoroutinesApi override fun isDispatchNeeded(context: CoroutineContext): Boolean = delegate.isDispatchNeeded(context) override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { @@ -50,11 +49,11 @@ internal class TestMainDispatcher(private val mainFactory: MainDispatcherFactory return delay.invokeOnTimeout(timeMillis, block, context) } - public fun setDispatcher(dispatcher: CoroutineDispatcher) { + fun setDispatcher(dispatcher: CoroutineDispatcher) { _delegate = dispatcher } - public fun resetDispatcher() { + fun resetDispatcher() { _delegate = null } } From 6cd1883fc06fb27fd8efcf907e459d05f1296102 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 28 Jun 2021 11:59:01 +0300 Subject: [PATCH 096/328] =?UTF-8?q?Cancel=20dispatched=20coroutine=20on=20?= =?UTF-8?q?Dispatchers.IO=20when=20the=20underlying=20Han=E2=80=A6=20(#278?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cancel dispatched coroutine on Dispatchers.IO when the underlying Handler is closed in Handler.asCoroutineDispatcher() Fixes #2778 --- .../src/HandlerDispatcher.kt | 38 +++++++---- .../test/DisabledHandlerTest.kt | 64 +++++++++++++++++++ .../test/HandlerDispatcherTest.kt | 10 +-- 3 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt diff --git a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt index d693e2bc25..b1ec8047dd 100644 --- a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt +++ b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt @@ -7,8 +7,8 @@ package kotlinx.coroutines.android import android.os.* -import androidx.annotation.* import android.view.* +import androidx.annotation.* import kotlinx.coroutines.* import kotlinx.coroutines.internal.* import java.lang.reflect.* @@ -54,15 +54,22 @@ internal class AndroidDispatcherFactory : MainDispatcherFactory { override fun createDispatcher(allFactories: List) = HandlerContext(Looper.getMainLooper().asHandler(async = true)) - override fun hintOnError(): String? = "For tests Dispatchers.setMain from kotlinx-coroutines-test module can be used" + override fun hintOnError(): String = "For tests Dispatchers.setMain from kotlinx-coroutines-test module can be used" override val loadPriority: Int get() = Int.MAX_VALUE / 2 } /** - * Represents an arbitrary [Handler] as a implementation of [CoroutineDispatcher] + * Represents an arbitrary [Handler] as an implementation of [CoroutineDispatcher] * with an optional [name] for nicer debugging + * + * ## Rejected execution + * + * If the underlying handler is closed and its message-scheduling methods start to return `false` on + * an attempt to submit a continuation task to the resulting dispatcher, + * then the [Job] of the affected task is [cancelled][Job.cancel] and the task is submitted to the + * [Dispatchers.IO], so that the affected coroutine can cleanup its resources and promptly complete. */ @JvmName("from") // this is for a nice Java API, see issue #255 @JvmOverloads @@ -129,24 +136,33 @@ internal class HandlerContext private constructor( } override fun dispatch(context: CoroutineContext, block: Runnable) { - handler.post(block) + if (!handler.post(block)) { + cancelOnRejection(context, block) + } } override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { val block = Runnable { with(continuation) { resumeUndispatched(Unit) } } - handler.postDelayed(block, timeMillis.coerceAtMost(MAX_DELAY)) - continuation.invokeOnCancellation { handler.removeCallbacks(block) } + if (handler.postDelayed(block, timeMillis.coerceAtMost(MAX_DELAY))) { + continuation.invokeOnCancellation { handler.removeCallbacks(block) } + } else { + cancelOnRejection(continuation.context, block) + } } override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - handler.postDelayed(block, timeMillis.coerceAtMost(MAX_DELAY)) - return object : DisposableHandle { - override fun dispose() { - handler.removeCallbacks(block) - } + if (handler.postDelayed(block, timeMillis.coerceAtMost(MAX_DELAY))) { + return DisposableHandle { handler.removeCallbacks(block) } } + cancelOnRejection(context, block) + return NonDisposableHandle + } + + private fun cancelOnRejection(context: CoroutineContext, block: Runnable) { + context.cancel(CancellationException("The task was rejected, the handler underlying the dispatcher '${toString()}' was closed")) + Dispatchers.IO.dispatch(context, block) } override fun toString(): String = toStringInternalImpl() ?: run { diff --git a/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt b/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt new file mode 100644 index 0000000000..a1f0a03d4a --- /dev/null +++ b/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.android + +import android.os.* +import kotlinx.coroutines.* +import org.junit.* +import org.junit.runner.* +import org.robolectric.* +import org.robolectric.annotation.* + +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE, sdk = [28]) +class DisabledHandlerTest : TestBase() { + + private var delegateToSuper = false + private val disabledDispatcher = object : Handler() { + override fun sendMessageAtTime(msg: Message?, uptimeMillis: Long): Boolean { + if (delegateToSuper) return super.sendMessageAtTime(msg, uptimeMillis) + return false + } + }.asCoroutineDispatcher() + + @Test + fun testRunBlocking() { + expect(1) + try { + runBlocking(disabledDispatcher) { + expectUnreached() + } + expectUnreached() + } catch (e: CancellationException) { + finish(2) + } + } + + @Test + fun testInvokeOnCancellation() = runTest { + val job = launch(disabledDispatcher, start = CoroutineStart.LAZY) { expectUnreached() } + job.invokeOnCompletion { if (it != null) expect(2) } + yield() + expect(1) + job.join() + finish(3) + } + + @Test + fun testWithTimeout() = runTest { + delegateToSuper = true + try { + withContext(disabledDispatcher) { + expect(1) + delegateToSuper = false + delay(Long.MAX_VALUE - 1) + expectUnreached() + } + expectUnreached() + } catch (e: CancellationException) { + finish(2) + } + } +} diff --git a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt index 55decde61b..5128a74caf 100644 --- a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt +++ b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt @@ -29,7 +29,7 @@ class HandlerDispatcherTest : TestBase() { fun mainIsAsync() = runTest { ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) - val mainLooper = ShadowLooper.getShadowMainLooper() + val mainLooper = shadowOf(Looper.getMainLooper()) mainLooper.pause() val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) @@ -48,7 +48,7 @@ class HandlerDispatcherTest : TestBase() { val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - val mainLooper = ShadowLooper.getShadowMainLooper() + val mainLooper = shadowOf(Looper.getMainLooper()) mainLooper.pause() val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) @@ -67,7 +67,7 @@ class HandlerDispatcherTest : TestBase() { val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - val mainLooper = ShadowLooper.getShadowMainLooper() + val mainLooper = shadowOf(Looper.getMainLooper()) mainLooper.pause() val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) @@ -86,7 +86,7 @@ class HandlerDispatcherTest : TestBase() { val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - val mainLooper = ShadowLooper.getShadowMainLooper() + val mainLooper = shadowOf(Looper.getMainLooper()) mainLooper.pause() val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) @@ -105,7 +105,7 @@ class HandlerDispatcherTest : TestBase() { val main = Looper.getMainLooper().asHandler(async = false).asCoroutineDispatcher() - val mainLooper = ShadowLooper.getShadowMainLooper() + val mainLooper = shadowOf(Looper.getMainLooper()) mainLooper.pause() val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) From 074cc3f79aab22a4becfad5b7595f2de6fae3db1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 30 Jun 2021 16:49:19 +0300 Subject: [PATCH 097/328] Update Lincheck to 2.14 (#2801) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d4fe1b212c..0c1076eedc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ junit5_version=5.7.0 atomicfu_version=0.16.1 knit_version=0.2.3 html_version=0.7.2 -lincheck_version=2.12 +lincheck_version=2.14 dokka_version=0.9.16-rdev-2-mpp-hacks byte_buddy_version=1.10.9 reactor_version=3.4.1 From bcbcd16b8c4b63478ff2ad15567688428232e928 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 6 Jul 2021 14:29:27 +0300 Subject: [PATCH 098/328] Upgrade to newest Dokka and Knit (#2805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Migrate to Dokka pre-1.5.0 Co-authored-by: Kamil DolegÅ‚o Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- README.md | 20 +- build.gradle | 41 ++-- buildSrc/build.gradle.kts | 4 + buildSrc/settings.gradle.kts | 1 + buildSrc/src/main/kotlin/Dokka.kt | 24 +- docs/topics/cancellation-and-timeouts.md | 6 +- docs/topics/channels.md | 4 +- docs/topics/composing-suspending-functions.md | 2 +- .../coroutine-context-and-dispatchers.md | 4 +- docs/topics/exception-handling.md | 2 +- docs/topics/flow.md | 4 +- .../shared-mutable-state-and-concurrency.md | 2 +- gradle.properties | 6 +- gradle/dokka.gradle | 93 -------- gradle/dokka.gradle.kts | 75 ++++++ .../kotlinx-coroutines-guava/README.md | 11 +- integration/kotlinx-coroutines-jdk8/README.md | 8 +- js/js-stub/README.md | 1 - js/js-stub/build.gradle.kts | 11 - js/js-stub/src/Performance.kt | 9 - js/js-stub/src/Promise.kt | 7 - js/js-stub/src/Window.kt | 7 - kotlinx-coroutines-core/README.md | 121 +++++----- kotlinx-coroutines-core/build.gradle | 1 + kotlinx-coroutines-core/common/README.md | 8 +- kotlinx-coroutines-test/README.md | 2 +- .../kotlinx-coroutines-reactive/README.md | 14 +- reactive/kotlinx-coroutines-reactor/README.md | 10 +- reactive/kotlinx-coroutines-rx2/README.md | 32 +-- reactive/kotlinx-coroutines-rx2/build.gradle | 11 +- reactive/kotlinx-coroutines-rx3/README.md | 30 +-- reactive/kotlinx-coroutines-rx3/build.gradle | 12 +- settings.gradle | 8 +- site/README.md | 15 -- site/build.gradle.kts | 69 ------ site/deploy.sh | 30 +-- site/docs/_config.yml | 14 -- site/docs/_includes/footer.html | 3 - site/docs/_includes/head.html | 19 -- site/docs/_includes/header.html | 5 - site/docs/_layouts/api.html | 14 -- site/docs/_sass/_api.scss | 225 ------------------ site/docs/_sass/_base.scss | 97 -------- site/docs/_sass/_layout.scss | 37 --- site/docs/_sass/_minima.scss | 35 --- site/docs/assets/js/api.js | 20 -- site/docs/assets/main.scss | 36 --- site/docs/index.md | 33 --- stdlib-stubs/README.md | 1 - stdlib-stubs/build.gradle.kts | 11 - stdlib-stubs/src/Continuation.kt | 10 - stdlib-stubs/src/ContinuationInterceptor.kt | 15 -- stdlib-stubs/src/CoroutineContext.kt | 38 --- stdlib-stubs/src/Result.kt | 14 -- ui/coroutines-guide-ui.md | 10 +- 55 files changed, 294 insertions(+), 1048 deletions(-) delete mode 100644 gradle/dokka.gradle create mode 100644 gradle/dokka.gradle.kts delete mode 100644 js/js-stub/README.md delete mode 100644 js/js-stub/build.gradle.kts delete mode 100644 js/js-stub/src/Performance.kt delete mode 100644 js/js-stub/src/Promise.kt delete mode 100644 js/js-stub/src/Window.kt delete mode 100644 site/README.md delete mode 100644 site/build.gradle.kts delete mode 100644 site/docs/_config.yml delete mode 100644 site/docs/_includes/footer.html delete mode 100644 site/docs/_includes/head.html delete mode 100644 site/docs/_includes/header.html delete mode 100644 site/docs/_layouts/api.html delete mode 100644 site/docs/_sass/_api.scss delete mode 100644 site/docs/_sass/_base.scss delete mode 100644 site/docs/_sass/_layout.scss delete mode 100644 site/docs/_sass/_minima.scss delete mode 100644 site/docs/assets/js/api.js delete mode 100644 site/docs/assets/main.scss delete mode 100644 site/docs/index.md delete mode 100644 stdlib-stubs/README.md delete mode 100644 stdlib-stubs/build.gradle.kts delete mode 100644 stdlib-stubs/src/Continuation.kt delete mode 100644 stdlib-stubs/src/ContinuationInterceptor.kt delete mode 100644 stdlib-stubs/src/CoroutineContext.kt delete mode 100644 stdlib-stubs/src/Result.kt diff --git a/README.md b/README.md index fab386fa43..6844759d8e 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ suspend fun main() = coroutineScope { * [select] expression support and more. * [core/jvm](kotlinx-coroutines-core/jvm/) — additional core features available on Kotlin/JVM: * [Dispatchers.IO] dispatcher for blocking coroutines; - * [Executor.asCoroutineDispatcher] extension, custom thread pools, and more. + * [Executor.asCoroutineDispatcher][asCoroutineDispatcher] extension, custom thread pools, and more. * [core/js](kotlinx-coroutines-core/js/) — additional core features available on Kotlin/JS: * Integration with `Promise` via [Promise.await] and [promise] builder; * Integration with `Window` via [Window.asCoroutineDispatcher], etc. @@ -233,10 +233,10 @@ See [Contributing Guidelines](CONTRIBUTING.md). [SupervisorJob()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html [CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html [Dispatchers.IO]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-i-o.html -[Executor.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/java.util.concurrent.-executor/as-coroutine-dispatcher.html -[Promise.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/kotlin.js.-promise/await.html +[asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html +[Promise.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await.html [promise]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/promise.html -[Window.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/org.w3c.dom.-window/as-coroutine-dispatcher.html +[Window.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html @@ -261,7 +261,7 @@ See [Contributing Guidelines](CONTRIBUTING.md). -[Dispatchers.setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/kotlinx.coroutines.-dispatchers/set-main.html +[Dispatchers.setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html [TestCoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scope/index.html @@ -281,23 +281,23 @@ See [Contributing Guidelines](CONTRIBUTING.md). -[CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/java.util.concurrent.-completion-stage/await.html +[CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html -[ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/com.google.common.util.concurrent.-listenable-future/await.html +[ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html -[Task.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/com.google.android.gms.tasks.-task/await.html +[Task.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html -[Publisher.collect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/collect.html -[Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-single.html +[Publisher.collect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/collect.html +[Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html [kotlinx.coroutines.reactive.publish]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html diff --git a/build.gradle b/build.gradle index 225634ada3..b54e18b5d1 100644 --- a/build.gradle +++ b/build.gradle @@ -4,14 +4,17 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.konan.target.HostManager +import org.gradle.util.VersionNumber +import org.jetbrains.dokka.gradle.DokkaTaskPartial +import org.jetbrains.dokka.gradle.DokkaMultiModuleTask apply plugin: 'jdk-convention' apply from: rootProject.file("gradle/experimental.gradle") def coreModule = "kotlinx-coroutines-core" // Not applicable for Kotlin plugin -def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing'] -def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing'] +def sourceless = ['kotlinx.coroutines', 'kotlinx-coroutines-bom', 'integration-testing'] +def internal = ['kotlinx.coroutines', 'benchmarks', 'integration-testing'] // Not published def unpublished = internal + ['example-frontend-js', 'android-unit-tests'] @@ -43,7 +46,7 @@ buildscript { rootProject.properties.each { key, value -> if (key.endsWith("_version") && value instanceof String && value.endsWith("-SNAPSHOT")) { println("NOTE: USING SNAPSHOT VERSION: $key=$value") - ext.using_snapshot_version=true + ext.using_snapshot_version = true } } @@ -54,11 +57,10 @@ buildscript { } repositories { - // Leftover until we migrated to Dokka 1.4.30 - maven { url "https://kotlin.bintray.com/kotlin-dev" } - maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" } + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" } maven { url "https://plugins.gradle.org/m2/" } maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } + mavenLocal() } dependencies { @@ -125,7 +127,6 @@ apply plugin: "binary-compatibility-validator" apiValidation { ignoredProjects += unpublished + ["kotlinx-coroutines-bom"] if (build_snapshot_train) { - ignoredProjects.remove("site") ignoredProjects.remove("example-frontend-js") ignoredProjects.add("kotlinx-coroutines-core") } @@ -139,6 +140,8 @@ allprojects { * google should be first in the repository list because some of the play services * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution */ + mavenLocal() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" } google() mavenCentral() } @@ -225,11 +228,12 @@ configure(subprojects.findAll { } def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/" -def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list" +def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/htmlPartial/package-list" +apply plugin: "org.jetbrains.dokka" configure(subprojects.findAll { !unpublished.contains(it.name) }) { if (it.name != 'kotlinx-coroutines-bom') { - apply from: rootProject.file('gradle/dokka.gradle') + apply from: rootProject.file('gradle/dokka.gradle.kts') } apply from: rootProject.file('gradle/publish.gradle') } @@ -237,11 +241,12 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { configure(subprojects.findAll { !unpublished.contains(it.name) }) { if (it.name != "kotlinx-coroutines-bom") { if (it.name != coreModule) { - dokka.dependsOn project(":$coreModule").dokka - tasks.withType(dokka.getClass()) { - externalDocumentationLink { - url = new URL(core_docs_url) - packageListUrl = new File(core_docs_file).toURI().toURL() + tasks.withType(DokkaTaskPartial.class) { + dokkaSourceSets.configureEach { + externalDocumentationLink { + url.set(new URL(core_docs_url)) + packageListUrl.set(new File(core_docs_file).toURI().toURL()) + } } } } @@ -274,9 +279,15 @@ apply plugin: 'kotlinx-knit' knit { siteRoot = "https://kotlin.github.io/kotlinx.coroutines" moduleRoots = [".", "integration", "reactive", "ui"] + moduleDocs = "build/dokka/htmlPartial" + dokkaMultiModuleRoot = "build/dokka/htmlMultiModule/" } -knitPrepare.dependsOn getTasksByName("dokka", true) +knitPrepare.dependsOn getTasksByName("dokkaHtmlMultiModule", true) + +dependencies { + dokkaHtmlMultiModulePlugin("org.jetbrains.kotlinx:dokka-pathsaver-plugin:$knit_version") +} // Disable binary compatibility check for JVM IR compiler output by default if (jvm_ir_enabled) { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 80214522b8..4a3732c254 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -12,6 +12,9 @@ val cacheRedirectorEnabled = System.getenv("CACHE_REDIRECTOR")?.toBoolean() == t val buildSnapshotTrain = properties["build_snapshot_train"]?.toString()?.toBoolean() == true repositories { + maven(url = "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/") + mavenLocal() + if (cacheRedirectorEnabled) { maven("https://cache-redirector.jetbrains.com/plugins.gradle.org/m2") maven("https://cache-redirector.jetbrains.com/dl.bintray.com/kotlin/kotlin-dev") @@ -47,4 +50,5 @@ fun version(target: String): String { dependencies { implementation(kotlin("gradle-plugin", version("kotlin"))) implementation("org.jetbrains.dokka:dokka-gradle-plugin:${version("dokka")}") + implementation("org.jetbrains.dokka:dokka-core:${version("dokka")}") } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index c2e859f65d..e30c3ee597 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -4,6 +4,7 @@ pluginManagement { val build_snapshot_train: String? by settings repositories { + maven(url = "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/") val cacheRedirectorEnabled = System.getenv("CACHE_REDIRECTOR")?.toBoolean() == true if (cacheRedirectorEnabled) { println("Redirecting repositories for buildSrc buildscript") diff --git a/buildSrc/src/main/kotlin/Dokka.kt b/buildSrc/src/main/kotlin/Dokka.kt index f37aa7c151..a6b06ee1a9 100644 --- a/buildSrc/src/main/kotlin/Dokka.kt +++ b/buildSrc/src/main/kotlin/Dokka.kt @@ -2,13 +2,11 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -import org.gradle.api.Project -import org.gradle.kotlin.dsl.delegateClosureOf -import org.gradle.kotlin.dsl.withType -import org.jetbrains.dokka.DokkaConfiguration.ExternalDocumentationLink.Builder -import org.jetbrains.dokka.gradle.DokkaTask -import java.io.File -import java.net.URL +import org.gradle.api.* +import org.gradle.kotlin.dsl.* +import org.jetbrains.dokka.gradle.* +import java.io.* +import java.net.* /** * Package-list by external URL for documentation generation. @@ -17,10 +15,12 @@ fun Project.externalDocumentationLink( url: String, packageList: File = projectDir.resolve("package.list") ) { - tasks.withType().configureEach { - externalDocumentationLink(delegateClosureOf { - this.url = URL(url) - packageListUrl = packageList.toPath().toUri().toURL() - }) + tasks.withType().configureEach { + dokkaSourceSets.configureEach { + externalDocumentationLink { + this.url.set(URL(url)) + packageListUrl.set(packageList.toPath().toUri().toURL()) + } + } } } diff --git a/docs/topics/cancellation-and-timeouts.md b/docs/topics/cancellation-and-timeouts.md index 7aa51e2642..5221db922a 100644 --- a/docs/topics/cancellation-and-timeouts.md +++ b/docs/topics/cancellation-and-timeouts.md @@ -447,15 +447,15 @@ This example always prints zero. Resources do not leak. [launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html [Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html [cancelAndJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-and-join.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/cancel.html +[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html [Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html [CancellationException]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html [yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html [isActive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/is-active.html [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable.html +[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html [withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html [withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html - \ No newline at end of file + diff --git a/docs/topics/channels.md b/docs/topics/channels.md index 9380b2bdfb..7f41eaec2b 100644 --- a/docs/topics/channels.md +++ b/docs/topics/channels.md @@ -626,7 +626,7 @@ delay between elements. [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[kotlin.coroutines.CoroutineContext.cancelChildren]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/kotlin.coroutines.-coroutine-context/cancel-children.html +[kotlin.coroutines.CoroutineContext.cancelChildren]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-children.html [Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html @@ -640,7 +640,7 @@ delay between elements. [Channel()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel.html [ticker]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/ticker.html [ReceiveChannel.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/cancel.html -[TickerMode.FIXED_DELAY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-ticker-mode/-f-i-x-e-d_-d-e-l-a-y.html +[TickerMode.FIXED_DELAY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-ticker-mode/-f-i-x-e-d_-d-e-l-a-y/index.html diff --git a/docs/topics/composing-suspending-functions.md b/docs/topics/composing-suspending-functions.md index 9c1a26a910..e244d8c218 100644 --- a/docs/topics/composing-suspending-functions.md +++ b/docs/topics/composing-suspending-functions.md @@ -406,7 +406,7 @@ Computation failed with ArithmeticException [launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html [Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html [Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[CoroutineStart.LAZY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-l-a-z-y.html +[CoroutineStart.LAZY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-l-a-z-y/index.html [Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html [Job.start]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/start.html [GlobalScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index 402db103b4..c35de0e084 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -678,8 +678,8 @@ that should be implemented. [CoroutineScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope.html [MainScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html [Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html -[asContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/java.lang.-thread-local/as-context-element.html -[ensurePresent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/java.lang.-thread-local/ensure-present.html +[asContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-context-element.html +[ensurePresent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-present.html [ThreadContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/index.html diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index 4cff42f357..3facd51a22 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -508,7 +508,7 @@ The scope is completed [CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html [Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html [Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/cancel.html +[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html [runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html [SupervisorJob()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html [Job()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job.html diff --git a/docs/topics/flow.md b/docs/topics/flow.md index 9dd84f3f4b..7acc4f99a8 100644 --- a/docs/topics/flow.md +++ b/docs/topics/flow.md @@ -1852,7 +1852,7 @@ Integration modules include conversions from and to `Flow`, integration with Rea [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html [Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/cancel.html +[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html [Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html [ensureActive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-active.html [CancellationException]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html @@ -1890,7 +1890,7 @@ Integration modules include conversions from and to `Flow`, integration with Rea [catch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/catch.html [onCompletion]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/on-completion.html [launchIn]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/launch-in.html -[IntRange.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/kotlin.ranges.-int-range/as-flow.html +[IntRange.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/as-flow.html [cancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/cancellable.html diff --git a/docs/topics/shared-mutable-state-and-concurrency.md b/docs/topics/shared-mutable-state-and-concurrency.md index b4b68b30ce..f120a67e15 100644 --- a/docs/topics/shared-mutable-state-and-concurrency.md +++ b/docs/topics/shared-mutable-state-and-concurrency.md @@ -510,4 +510,4 @@ have to switch to a different context at all. [actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html [produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html - \ No newline at end of file + diff --git a/gradle.properties b/gradle.properties index 0c1076eedc..a6e017787f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,10 @@ kotlin_version=1.5.0 junit_version=4.12 junit5_version=5.7.0 atomicfu_version=0.16.1 -knit_version=0.2.3 +knit_version=0.3.0-RC html_version=0.7.2 lincheck_version=2.14 -dokka_version=0.9.16-rdev-2-mpp-hacks +dokka_version=1.5.0-dev-106 byte_buddy_version=1.10.9 reactor_version=3.4.1 reactive_streams_version=1.0.3 @@ -53,6 +53,6 @@ jekyll_version=4.0 # JS IR backend sometimes crashes with out-of-memory # TODO: Remove once KT-37187 is fixed -org.gradle.jvmargs=-Xmx2g +org.gradle.jvmargs=-Xmx4g kotlin.mpp.enableCompatibilityMetadataVariant=true diff --git a/gradle/dokka.gradle b/gradle/dokka.gradle deleted file mode 100644 index f0cad15442..0000000000 --- a/gradle/dokka.gradle +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -// Configures generation of JavaDoc & Dokka artifacts - -def makeLinkMapping(dokka, projectDir) { - dokka.linkMapping { - def relPath = rootProject.projectDir.toPath().relativize(projectDir.toPath()) - dir = "$projectDir/src" - url = "https://github.com/kotlin/kotlinx.coroutines/tree/master/$relPath/src" - suffix = "#L" - } -} - -configurations { - dokkaStubs.extendsFrom compileOnly - configureKotlinJvmPlatform(dokkaStubs) -} - -apply plugin: 'org.jetbrains.dokka' - -tasks.withType(dokka.getClass()) { - jdkVersion = 8 - includes = ['README.md'] -} - -dependencies { - dokkaStubs project(":stdlib-stubs") -} - - -dokka { - kotlinTasks { [] } - outputFormat = 'kotlin-website' - dependsOn(project.configurations.dokkaStubs) - - noStdlibLink = true - - externalDocumentationLink { - packageListUrl = rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL() - url = new URL("https://kotlinlang.org/api/latest/jvm/stdlib/") - } - - if (project.name != "kotlinx-coroutines-core") { - dependsOn(project.configurations.compileClasspath) - dependsOn(project.sourceSets.main.output) - doFirst { - // resolve classpath only during execution - classpath = project.configurations.dokkaStubs.files + project.configurations.compileClasspath.files + project.sourceSets.main.output.files - } - } -} - -if (project.name == "kotlinx-coroutines-core") { - // Custom configuration for MPP modules - dependencies { - dokkaStubs project(":js-stub") // so that JS library reference can resolve properly - dokkaStubs project(":kotlinx-coroutines-core") - } - - dokka { - kotlinTasks { [] } - suppressedModifiers = ['actual'] - makeLinkMapping(it, projectDir) - makeLinkMapping(it, project.file("js")) - makeLinkMapping(it, project.file("jvm")) - makeLinkMapping(it, project.file("native")) - makeLinkMapping(it, project.file("common")) - // source roots - impliedPlatforms = ['JVM', 'JS', 'Native'] - sourceRoot { - path = rootProject.file("$project.name/common/src") - } - sourceRoot { - path = rootProject.file("$project.name/jvm/src") - platforms = ['JVM'] - } - sourceRoot { - path = rootProject.file("$project.name/js/src") - platforms = ['JS'] - } - sourceRoot { - path = rootProject.file("$project.name/native/src") - platforms = ['Native'] - } - doFirst { - classpath = project.configurations.dokkaStubs.files + - project.configurations.jvmCompileClasspath.files + - project.kotlin.targets.jvm.compilations.main.output.allOutputs - } - } -} diff --git a/gradle/dokka.gradle.kts b/gradle/dokka.gradle.kts new file mode 100644 index 0000000000..659890a30b --- /dev/null +++ b/gradle/dokka.gradle.kts @@ -0,0 +1,75 @@ +import org.jetbrains.dokka.gradle.* +import java.net.* + +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +// Configures generation of JavaDoc & Dokka artifacts +apply() +//apply() + +fun GradleDokkaSourceSetBuilder.makeLinkMapping(projectDir: File) { + sourceLink { + val relPath = rootProject.projectDir.toPath().relativize(projectDir.toPath()) + localDirectory.set(projectDir.resolve("src")) + remoteUrl.set(URL("https://github.com/kotlin/kotlinx.coroutines/tree/master/$relPath/src")) + remoteLineSuffix.set("#L") + } +} + +val knit_version: String by project +tasks.withType(DokkaTaskPartial::class).configureEach { + dependencies { + plugins("org.jetbrains.kotlinx:dokka-pathsaver-plugin:$knit_version") + } +} + +tasks.withType(DokkaTaskPartial::class).configureEach { + suppressInheritedMembers.set(true) + dokkaSourceSets.configureEach { + jdkVersion.set(11) + includes.from("README.md") + noStdlibLink.set(true) + + externalDocumentationLink { + url.set(URL("https://kotlinlang.org/api/latest/jvm/stdlib/")) + packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL()) + } + + if (project.name != "kotlinx-coroutines-core") { + dependsOn(project.configurations["compileClasspath"]) + doFirst { + // resolve classpath only during execution + classpath.from(project.configurations["compileClasspath"].files)// + project.sourceSets.main.output.files) + } + } + } +} + +if (project.name == "kotlinx-coroutines-core") { + // Custom configuration for MPP modules + tasks.withType(DokkaTaskPartial::class).configureEach { + dokkaSourceSets { + val commonMain by getting { + makeLinkMapping(project.file("common")) + } + + val nativeMain by getting { + makeLinkMapping(project.file("native")) + } + + val jsMain by getting { + makeLinkMapping(project.file("js")) + } + + val jvmMain by getting { + makeLinkMapping(project.file("jvm")) + } + + configureEach { + classpath.from(project.configurations["jvmCompileClasspath"].files) + } + } + } +} diff --git a/integration/kotlinx-coroutines-guava/README.md b/integration/kotlinx-coroutines-guava/README.md index 130cf0a058..34b8e5818f 100644 --- a/integration/kotlinx-coroutines-guava/README.md +++ b/integration/kotlinx-coroutines-guava/README.md @@ -56,9 +56,12 @@ Integration with Guava [ListenableFuture](https://github.com/google/guava/wiki/L -[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/kotlinx.coroutines.-coroutine-scope/future.html -[com.google.common.util.concurrent.ListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/com.google.common.util.concurrent.-listenable-future/index.html -[com.google.common.util.concurrent.ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/com.google.common.util.concurrent.-listenable-future/await.html -[kotlinx.coroutines.Deferred.asListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/kotlinx.coroutines.-deferred/as-listenable-future.html +[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/future.html +[com.google.common.util.concurrent.ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html +[kotlinx.coroutines.Deferred.asListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/as-listenable-future.html + + + +[com.google.common.util.concurrent.ListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/https://google.github.io/guava/releases/28.0-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html diff --git a/integration/kotlinx-coroutines-jdk8/README.md b/integration/kotlinx-coroutines-jdk8/README.md index aebd90f06a..35808c6f3d 100644 --- a/integration/kotlinx-coroutines-jdk8/README.md +++ b/integration/kotlinx-coroutines-jdk8/README.md @@ -60,9 +60,9 @@ Integration with JDK8 [CompletableFuture] (Android API level 24). -[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/kotlinx.coroutines.-coroutine-scope/future.html -[java.util.concurrent.CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/java.util.concurrent.-completion-stage/await.html -[java.util.concurrent.CompletionStage.asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/java.util.concurrent.-completion-stage/as-deferred.html -[kotlinx.coroutines.Deferred.asCompletableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/kotlinx.coroutines.-deferred/as-completable-future.html +[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/future.html +[java.util.concurrent.CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html +[java.util.concurrent.CompletionStage.asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-deferred.html +[kotlinx.coroutines.Deferred.asCompletableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-completable-future.html diff --git a/js/js-stub/README.md b/js/js-stub/README.md deleted file mode 100644 index 46d18670f2..0000000000 --- a/js/js-stub/README.md +++ /dev/null @@ -1 +0,0 @@ -This is a workaround for Dokka to generate proper references for JS modules. \ No newline at end of file diff --git a/js/js-stub/build.gradle.kts b/js/js-stub/build.gradle.kts deleted file mode 100644 index 201ac43cb0..0000000000 --- a/js/js-stub/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -tasks.named("compileKotlin") { - kotlinOptions { - freeCompilerArgs += "-Xallow-kotlin-package" - } -} diff --git a/js/js-stub/src/Performance.kt b/js/js-stub/src/Performance.kt deleted file mode 100644 index eefb1d749b..0000000000 --- a/js/js-stub/src/Performance.kt +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.w3c.performance - -public abstract class Performance { - public abstract fun now(): Double -} diff --git a/js/js-stub/src/Promise.kt b/js/js-stub/src/Promise.kt deleted file mode 100644 index 243d0c9e33..0000000000 --- a/js/js-stub/src/Promise.kt +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlin.js - -public open class Promise diff --git a/js/js-stub/src/Window.kt b/js/js-stub/src/Window.kt deleted file mode 100644 index 8b2bb8000b..0000000000 --- a/js/js-stub/src/Window.kt +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package org.w3c.dom - -public abstract class Window diff --git a/kotlinx-coroutines-core/README.md b/kotlinx-coroutines-core/README.md index 9fdf418233..c21e5048f6 100644 --- a/kotlinx-coroutines-core/README.md +++ b/kotlinx-coroutines-core/README.md @@ -4,45 +4,45 @@ Core primitives to work with coroutines. Coroutine builder functions: -| **Name** | **Result** | **Scope** | **Description** -| ------------- | ------------- | ---------------- | --------------- -| [launch] | [Job] | [CoroutineScope] | Launches coroutine that does not have any result -| [async] | [Deferred] | [CoroutineScope] | Returns a single value with the future result -| [produce][kotlinx.coroutines.channels.produce] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [ProducerScope][kotlinx.coroutines.channels.ProducerScope] | Produces a stream of elements -| [runBlocking] | `T` | [CoroutineScope] | Blocks the thread while the coroutine runs +| **Name** | **Result** | **Scope** | **Description** +| ---------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------- | --------------- +| [launch][kotlinx.coroutines.launch] | [Job][kotlinx.coroutines.Job] | [CoroutineScope][kotlinx.coroutines.CoroutineScope] | Launches coroutine that does not have any result +| [async][kotlinx.coroutines.async] | [Deferred][kotlinx.coroutines.Deferred] | [CoroutineScope][kotlinx.coroutines.CoroutineScope] | Returns a single value with the future result +| [produce][kotlinx.coroutines.channels.produce] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [ProducerScope][kotlinx.coroutines.channels.ProducerScope] | Produces a stream of elements +| [runBlocking][kotlinx.coroutines.runBlocking] | `T` | [CoroutineScope][kotlinx.coroutines.CoroutineScope] | Blocks the thread while the coroutine runs Coroutine dispatchers implementing [CoroutineDispatcher]: -| **Name** | **Description** -| --------------------------- | --------------- -| [Dispatchers.Default] | Confines coroutine execution to a shared pool of background threads -| [Dispatchers.Unconfined] | Does not confine coroutine execution in any way +| **Name** | **Description** +| ------------------------------------------------------------------- | --------------- +| [Dispatchers.Default][kotlinx.coroutines.Dispatchers.Default] | Confines coroutine execution to a shared pool of background threads +| [Dispatchers.Unconfined][kotlinx.coroutines.Dispatchers.Unconfined] | Does not confine coroutine execution in any way More context elements: -| **Name** | **Description** -| --------------------------- | --------------- -| [NonCancellable] | A non-cancelable job that is always active -| [CoroutineExceptionHandler] | Handler for uncaught exception +| **Name** | **Description** +| ------------------------------------------------------------------------- | --------------- +| [NonCancellable][kotlinx.coroutines.NonCancellable] | A non-cancelable job that is always active +| [CoroutineExceptionHandler][kotlinx.coroutines.CoroutineExceptionHandler] | Handler for uncaught exception Synchronization primitives for coroutines: -| **Name** | **Suspending functions** | **Description** -| ---------- | ----------------------------------------------------------- | --------------- -| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | Mutual exclusion +| **Name** | **Suspending functions** | **Description** +| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | --------------- +| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | Mutual exclusion | [Channel][kotlinx.coroutines.channels.Channel] | [send][kotlinx.coroutines.channels.SendChannel.send], [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | Communication channel (aka queue or exchanger) Top-level suspending functions: -| **Name** | **Description** -| ------------------- | --------------- -| [delay] | Non-blocking sleep -| [yield] | Yields thread in single-threaded dispatchers -| [withContext] | Switches to a different context -| [withTimeout] | Set execution time-limit with exception on timeout -| [withTimeoutOrNull] | Set execution time-limit will null result on timeout -| [awaitAll] | Awaits for successful completion of all given jobs or exceptional completion of any -| [joinAll] | Joins on all given jobs +| **Name** | **Description** +| --------------------------------------------------------- | --------------- +| [delay][kotlinx.coroutines.delay] | Non-blocking sleep +| [yield][kotlinx.coroutines.yield] | Yields thread in single-threaded dispatchers +| [withContext][kotlinx.coroutines.withContext] | Switches to a different context +| [withTimeout][kotlinx.coroutines.withTimeout] | Set execution time-limit with exception on timeout +| [withTimeoutOrNull][kotlinx.coroutines.withTimeoutOrNull] | Set execution time-limit will null result on timeout +| [awaitAll][kotlinx.coroutines.awaitAll] | Awaits for successful completion of all given jobs or exceptional completion of any +| [joinAll][kotlinx.coroutines.joinAll] | Joins on all given jobs Cancellation support for user-defined suspending functions is available with [suspendCancellableCoroutine] helper function. [NonCancellable] job object is provided to suppress cancellation with @@ -50,15 +50,15 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio [Select][kotlinx.coroutines.selects.select] expression waits for the result of multiple suspending functions simultaneously: -| **Receiver** | **Suspending function** | **Select clause** | **Non-suspending version** -| ---------------- | --------------------------------------------- | ------------------------------------------------ | -------------------------- -| [Job] | [join][Job.join] | [onJoin][Job.onJoin] | [isCompleted][Job.isCompleted] -| [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] | [isCompleted][Job.isCompleted] -| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] -| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] -| none | [delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none +| **Receiver** | **Suspending function** | **Select clause** | **Non-suspending version** +| ------------------------------------------------------------ | --------------------------------------------------------------- | ----------------------------------------------------------------- | -------------------------- +| [Job][kotlinx.coroutines.Job] | [join][kotlinx.coroutines.Job.join] | [onJoin][kotlinx.coroutines.Job.onJoin] | [isCompleted][kotlinx.coroutines.Job.isCompleted] +| [Deferred][kotlinx.coroutines.Deferred] | [await][kotlinx.coroutines.Deferred.await] | [onAwait][kotlinx.coroutines.Deferred.onAwait] | [isCompleted][kotlinx.coroutines.Job.isCompleted] +| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] +| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] +| none | [delay][kotlinx.coroutines.delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none # Package kotlinx.coroutines @@ -91,30 +91,31 @@ Obsolete and deprecated module to test coroutines. Replaced with `kotlinx-corout -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[kotlinx.coroutines.launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[kotlinx.coroutines.Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[kotlinx.coroutines.CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[kotlinx.coroutines.async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[kotlinx.coroutines.Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[kotlinx.coroutines.runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html [CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable.html -[CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html -[withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html -[awaitAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html -[joinAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html +[kotlinx.coroutines.Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[kotlinx.coroutines.Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[kotlinx.coroutines.NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[kotlinx.coroutines.CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html +[kotlinx.coroutines.delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[kotlinx.coroutines.yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[kotlinx.coroutines.withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[kotlinx.coroutines.withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html +[kotlinx.coroutines.withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html +[kotlinx.coroutines.awaitAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html +[kotlinx.coroutines.joinAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html [suspendCancellableCoroutine]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[Job.onJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html -[Job.isCompleted]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html -[Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html -[Deferred.onAwait]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html +[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[kotlinx.coroutines.Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[kotlinx.coroutines.Job.onJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html +[kotlinx.coroutines.Job.isCompleted]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html +[kotlinx.coroutines.Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html +[kotlinx.coroutines.Deferred.onAwait]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html @@ -136,13 +137,13 @@ Obsolete and deprecated module to test coroutines. Replaced with `kotlinx-corout [kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html [kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html [kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html -[kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html +[kotlinx.coroutines.channels.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html +[kotlinx.coroutines.channels.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html [kotlinx.coroutines.selects.select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html -[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/-select-builder/on-timeout.html +[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 4ea81d3de3..d9be404b1d 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -3,6 +3,7 @@ */ apply plugin: 'org.jetbrains.kotlin.multiplatform' +apply plugin: 'org.jetbrains.dokka' apply from: rootProject.file("gradle/compile-jvm-multiplatform.gradle") apply from: rootProject.file("gradle/compile-common.gradle") diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index e8503d0d16..bdb23b82a0 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -19,7 +19,7 @@ Coroutine dispatchers implementing [CoroutineDispatcher]: | [Dispatchers.Unconfined] | Does not confine coroutine execution in any way | [newSingleThreadContext] | Creates a single-threaded coroutine context | [newFixedThreadPoolContext] | Creates a thread pool of a fixed size -| [Executor.asCoroutineDispatcher][java.util.concurrent.Executor.asCoroutineDispatcher] | Extension to convert any executor +| [Executor.asCoroutineDispatcher][asCoroutineDispatcher] | Extension to convert any executor More context elements: @@ -108,8 +108,8 @@ Low-level primitives for finer-grained control of coroutines. [Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html [newSingleThreadContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html [newFixedThreadPoolContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-fixed-thread-pool-context.html -[java.util.concurrent.Executor.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/java.util.concurrent.-executor/as-coroutine-dispatcher.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable.html +[asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html +[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html [CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html [delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html [yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html @@ -155,7 +155,7 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.selects.select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html -[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/-select-builder/on-timeout.html +[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 30027fdb76..30e1098041 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -445,7 +445,7 @@ If you have any suggestions for improvements to this experimental API please sha -[setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/kotlinx.coroutines.-dispatchers/set-main.html +[setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html [runBlockingTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-blocking-test.html [UncompletedCoroutinesError]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-uncompleted-coroutines-error/index.html [DelayController]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/index.html diff --git a/reactive/kotlinx-coroutines-reactive/README.md b/reactive/kotlinx-coroutines-reactive/README.md index b6466b2da7..ec59d3d9fd 100644 --- a/reactive/kotlinx-coroutines-reactive/README.md +++ b/reactive/kotlinx-coroutines-reactive/README.md @@ -43,13 +43,13 @@ Suspending extension functions and suspending iteration: [kotlinx.coroutines.reactive.publish]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html -[Publisher.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/as-flow.html -[Flow.asPublisher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/kotlinx.coroutines.flow.-flow/as-publisher.html -[org.reactivestreams.Publisher.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-first.html -[org.reactivestreams.Publisher.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-first-or-default.html -[org.reactivestreams.Publisher.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-first-or-else.html -[org.reactivestreams.Publisher.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-first-or-null.html -[org.reactivestreams.Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/await-single.html +[Publisher.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-flow.html +[Flow.asPublisher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-publisher.html +[org.reactivestreams.Publisher.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first.html +[org.reactivestreams.Publisher.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-default.html +[org.reactivestreams.Publisher.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-else.html +[org.reactivestreams.Publisher.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-null.html +[org.reactivestreams.Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html diff --git a/reactive/kotlinx-coroutines-reactor/README.md b/reactive/kotlinx-coroutines-reactor/README.md index 7028310621..a895107b44 100644 --- a/reactive/kotlinx-coroutines-reactor/README.md +++ b/reactive/kotlinx-coroutines-reactor/README.md @@ -46,12 +46,12 @@ Conversion functions: [mono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html [flux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/flux.html -[Flow.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/kotlinx.coroutines.flow.-flow/as-flux.html +[Flow.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-flux.html [ReactorContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/-reactor-context/index.html -[kotlinx.coroutines.Job.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/kotlinx.coroutines.-job/as-mono.html -[kotlinx.coroutines.Deferred.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/kotlinx.coroutines.-deferred/as-mono.html -[kotlinx.coroutines.channels.ReceiveChannel.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/kotlinx.coroutines.channels.-receive-channel/as-flux.html -[reactor.core.scheduler.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/reactor.core.scheduler.-scheduler/as-coroutine-dispatcher.html +[kotlinx.coroutines.Job.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html +[kotlinx.coroutines.Deferred.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html +[kotlinx.coroutines.channels.ReceiveChannel.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-flux.html +[reactor.core.scheduler.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx2/README.md b/reactive/kotlinx-coroutines-rx2/README.md index 1ae2c8a04c..b2078d29d9 100644 --- a/reactive/kotlinx-coroutines-rx2/README.md +++ b/reactive/kotlinx-coroutines-rx2/README.md @@ -71,22 +71,22 @@ Conversion functions: [rxSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-single.html [rxObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-observable.html [rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html -[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.flow.-flow/as-flowable.html -[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.flow.-flow/as-observable.html -[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/as-flow.html -[io.reactivex.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-completable-source/await.html -[io.reactivex.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-maybe-source/await.html -[io.reactivex.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-maybe-source/await-or-default.html -[io.reactivex.MaybeSource.openSubscription]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-maybe-source/open-subscription.html -[io.reactivex.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-single-source/await.html -[io.reactivex.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first.html -[io.reactivex.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first-or-default.html -[io.reactivex.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first-or-else.html -[io.reactivex.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-first-or-null.html -[io.reactivex.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-observable-source/await-single.html -[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.-job/as-completable.html -[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/kotlinx.coroutines.-deferred/as-single.html -[io.reactivex.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/io.reactivex.-scheduler/as-coroutine-dispatcher.html +[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flowable.html +[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-observable.html +[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flow.html +[io.reactivex.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html +[io.reactivex.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html +[io.reactivex.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-or-default.html +[io.reactivex.MaybeSource.openSubscription]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/open-subscription.html +[io.reactivex.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html +[io.reactivex.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first.html +[io.reactivex.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-default.html +[io.reactivex.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-else.html +[io.reactivex.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-null.html +[io.reactivex.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html +[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-completable.html +[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-single.html +[io.reactivex.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx2/build.gradle b/reactive/kotlinx-coroutines-rx2/build.gradle index 01c226a990..b6fd93274c 100644 --- a/reactive/kotlinx-coroutines-rx2/build.gradle +++ b/reactive/kotlinx-coroutines-rx2/build.gradle @@ -1,6 +1,7 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +import org.jetbrains.dokka.gradle.DokkaTaskPartial dependencies { api project(':kotlinx-coroutines-reactive') @@ -9,10 +10,12 @@ dependencies { api "io.reactivex.rxjava2:rxjava:$rxjava2_version" } -tasks.withType(dokka.getClass()) { - externalDocumentationLink { - url = new URL('http://reactivex.io/RxJava/2.x/javadoc/') - packageListUrl = projectDir.toPath().resolve("package.list").toUri().toURL() +tasks.withType(DokkaTaskPartial.class) { + dokkaSourceSets.configureEach { + externalDocumentationLink { + url.set(new URL('http://reactivex.io/RxJava/2.x/javadoc/')) + packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL()) + } } } diff --git a/reactive/kotlinx-coroutines-rx3/README.md b/reactive/kotlinx-coroutines-rx3/README.md index f9d3c5a86d..6c5a6e9eb2 100644 --- a/reactive/kotlinx-coroutines-rx3/README.md +++ b/reactive/kotlinx-coroutines-rx3/README.md @@ -69,21 +69,21 @@ Conversion functions: [rxSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-single.html [rxObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-observable.html [rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-flowable.html -[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/kotlinx.coroutines.flow.-flow/as-flowable.html -[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/kotlinx.coroutines.flow.-flow/as-observable.html -[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/as-flow.html -[io.reactivex.rxjava3.core.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-completable-source/await.html -[io.reactivex.rxjava3.core.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-maybe-source/await.html -[io.reactivex.rxjava3.core.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-maybe-source/await-or-default.html -[io.reactivex.rxjava3.core.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-single-source/await.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/await-first.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/await-first-or-default.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/await-first-or-else.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/await-first-or-null.html -[io.reactivex.rxjava3.core.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-observable-source/await-single.html -[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/kotlinx.coroutines.-job/as-completable.html -[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/kotlinx.coroutines.-deferred/as-single.html -[io.reactivex.rxjava3.core.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/io.reactivex.rxjava3.core.-scheduler/as-coroutine-dispatcher.html +[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flowable.html +[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-observable.html +[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flow.html +[io.reactivex.rxjava3.core.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html +[io.reactivex.rxjava3.core.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html +[io.reactivex.rxjava3.core.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-or-default.html +[io.reactivex.rxjava3.core.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-default.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-else.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-null.html +[io.reactivex.rxjava3.core.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html +[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-completable.html +[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-single.html +[io.reactivex.rxjava3.core.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx3/build.gradle b/reactive/kotlinx-coroutines-rx3/build.gradle index 1760270d76..15ef66da18 100644 --- a/reactive/kotlinx-coroutines-rx3/build.gradle +++ b/reactive/kotlinx-coroutines-rx3/build.gradle @@ -1,6 +1,8 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +import org.jetbrains.dokka.gradle.DokkaTaskPartial + targetCompatibility = JavaVersion.VERSION_1_8 dependencies { @@ -18,10 +20,12 @@ compileKotlin { kotlinOptions.jvmTarget = "1.8" } -tasks.withType(dokka.getClass()) { - externalDocumentationLink { - url = new URL('http://reactivex.io/RxJava/3.x/javadoc/') - packageListUrl = projectDir.toPath().resolve("package.list").toUri().toURL() +tasks.withType(DokkaTaskPartial.class) { + dokkaSourceSets.configureEach { + externalDocumentationLink { + url.set(new URL('http://reactivex.io/RxJava/3.x/javadoc/')) + packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL()) + } } } diff --git a/settings.gradle b/settings.gradle index 37fa6757cf..44effa7c20 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,11 @@ pluginManagement { id "net.ltgt.apt" version "0.21" id "me.champeau.gradle.jmh" version "0.5.2" } + + repositories { + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" } + gradlePluginPortal() + } } rootProject.name = 'kotlinx.coroutines' @@ -31,7 +36,6 @@ include "kotlinx-coroutines-core" module('kotlinx-coroutines-test') module('kotlinx-coroutines-debug') -module('stdlib-stubs') module('kotlinx-coroutines-bom') @@ -52,10 +56,8 @@ if (JavaVersion.current().isJava11Compatible()) { } module('ui/kotlinx-coroutines-swing') -module('js/js-stub') if (!build_snapshot_train) { module('js/example-frontend-js') - include('site') } module('integration-testing') diff --git a/site/README.md b/site/README.md deleted file mode 100644 index 7ffb4103fc..0000000000 --- a/site/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Reference documentation site - -This module builds references documentation. - -## Building docs - -* Install [Docker](https://www.docker.com/) -* In the project root directory run `./gradlew site` -* The resulting HTML pages are generated in `site/build/dist` -* For continuous testing of the documentation run `./gradlew serve` and navigate - to the URL that is printed on the screen - * Update the docs via `./gradlew copyDocs` while `serve` is running - -For release use [`deploy.sh`](deploy.sh) that performs clean build of the site and pushes the results -into `gh-pages` branch of the project. \ No newline at end of file diff --git a/site/build.gradle.kts b/site/build.gradle.kts deleted file mode 100644 index 003ae76262..0000000000 --- a/site/build.gradle.kts +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -import groovy.lang.* - -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -val buildDocsDir = "$buildDir/docs" -val jekyllDockerImage = "jekyll/jekyll:${version("jekyll")}" - -val copyDocs by tasks.registering(Copy::class) { - val dokkaTasks = rootProject.getTasksByName("dokka", true) - - from(dokkaTasks.map { "${it.project.buildDir}/dokka" }) { - include("**/*.md") - include("**/package-list") - } - from("docs") - into(buildDocsDir) - filter { it.replace("/index.md\"", "/index.html\"") } - - dependsOn(dokkaTasks) -} - -val copyExampleFrontendJs by tasks.registering(Copy::class) { - val srcBuildDir = project(":example-frontend-js").buildDir - from("$srcBuildDir/dist") - into("$buildDocsDir/example-frontend-js") - - dependsOn(":example-frontend-js:browserDistribution") -} - -tasks.register("site") { - description = "Generate github pages" - - inputs.files(fileTree(buildDocsDir)) - outputs.dir("$buildDir/dist") - workingDir = file(buildDocsDir) - - commandLine( - "docker", "run", "--rm", "--volume=$buildDir:/srv/jekyll", - "-t", jekyllDockerImage, - "/bin/bash", "-c", "cd docs; jekyll build" - ) - - dependsOn(copyDocs) - dependsOn(copyExampleFrontendJs) -} - -// A useful task for local debugging -- serves a site locally -tasks.register("serve") { - commandLine( - "docker", "run", "--rm", "--volume=$buildDir:/srv/jekyll", - "-p", "8080:8080", - "-t", jekyllDockerImage, - "/bin/bash", "-c", "cd docs; jekyll serve --host 0.0.0.0 --port 8080" - ) - - dependsOn(copyDocs) - dependsOn(copyExampleFrontendJs) -} - -tasks.register("clean") { - delete(buildDir) -} - diff --git a/site/deploy.sh b/site/deploy.sh index fd510aae0b..a04e49258d 100755 --- a/site/deploy.sh +++ b/site/deploy.sh @@ -10,8 +10,8 @@ set -e # Directories SITE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT_DIR="$SITE_DIR/.." -BUILD_DIR="$SITE_DIR/build" -DIST_DIR="$BUILD_DIR/dist" +BUILD_DIR="$ROOT_DIR/build" +DIST_DIR="$BUILD_DIR/dokka/htmlMultiModule" PAGES_DIR="$BUILD_DIR/pages" # Init options @@ -28,7 +28,7 @@ else fi # Makes sure that site is built -"$ROOT_DIR/gradlew" $GRADLE_OPT site +"$ROOT_DIR/gradlew" $GRADLE_OPT dokkaHtmlMultiModule # Cleanup dist directory (and ignore errors) rm -rf "$PAGES_DIR" || true @@ -46,28 +46,8 @@ cd "$PAGES_DIR" # Remove non-.html files git rm `find . -type f -not -name '*.html' -not -name '.git'` > /dev/null -# Replace "experimental" .html files with links to the corresponding non-experimental version -# or remove them if there is no corresponding non-experimental file -echo "Redirecting experimental pages" -git_add=() -git_rm=() -`find . -type f -name '*.html'` | while read file -do - match=nothing_is_found - if [[ $file =~ \.experimental ]] ; then - match="${file//\.experimental/}" - fi - if [[ -f "$DIST_DIR/$match" ]] ; then - # redirect to non-experimental version - echo "" > "$file" - git_add+=("$file") - else - # redirect not found -- remove the file - git_rm+=("$file") - fi -done -git add "${git_add[@]}" -git rm "${git_rm[@]}" > /dev/null +# Remove all the old documentation +git rm -r * > /dev/null # Copy new documentation from dist cp -r "$DIST_DIR"/* "$PAGES_DIR" diff --git a/site/docs/_config.yml b/site/docs/_config.yml deleted file mode 100644 index d7617e1ba1..0000000000 --- a/site/docs/_config.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Jekyll configuration file -title: kotlinx.coroutines -description: Library support for kotlin coroutines -baseurl: "/kotlinx.coroutines" -url: "https://kotlin.github.io" - -# Dirs -source: . -destination: ../dist - -# Build settings -markdown: kramdown -include: - - package-list diff --git a/site/docs/_includes/footer.html b/site/docs/_includes/footer.html deleted file mode 100644 index b115703c01..0000000000 --- a/site/docs/_includes/footer.html +++ /dev/null @@ -1,3 +0,0 @@ -

diff --git a/site/docs/_includes/head.html b/site/docs/_includes/head.html deleted file mode 100644 index ca3227d624..0000000000 --- a/site/docs/_includes/head.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} - - - - - - - diff --git a/site/docs/_includes/header.html b/site/docs/_includes/header.html deleted file mode 100644 index b250a17723..0000000000 --- a/site/docs/_includes/header.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/site/docs/_layouts/api.html b/site/docs/_layouts/api.html deleted file mode 100644 index 0f93a6b213..0000000000 --- a/site/docs/_layouts/api.html +++ /dev/null @@ -1,14 +0,0 @@ - - - {% include head.html %} - - {% include header.html %} -
-
- {{ content }} -
-
- {% include footer.html %} - - - diff --git a/site/docs/_sass/_api.scss b/site/docs/_sass/_api.scss deleted file mode 100644 index ae41149586..0000000000 --- a/site/docs/_sass/_api.scss +++ /dev/null @@ -1,225 +0,0 @@ - -// ----------------- Bits and pieces from kotlinlang.org reference ----------------- - -body { - -webkit-font-smoothing: antialiased; - font-smoothing: antialiased; - text-rendering: optimizeLegibility; -} - -a { - text-decoration: underline; -} - -$vertical-rhythm-unit: 15px !global; - -h1 { - margin-top: $vertical-rhythm-unit * 2; - margin-bottom: $vertical-rhythm-unit; - font-size: 30px; - line-height: 33px; - - &:first-of-type { - margin-top: 0; - margin-bottom: $vertical-rhythm-unit * 2; - } - - @media print { - page-break-before: always; - page-break-after: avoid; - } - - &%_section-title { - padding-top: 140px; - margin-bottom: 45px; - font-size: 55px; - line-height: 65px; - font-weight: bold; - } -} - -h2 { - margin-top: $vertical-rhythm-unit * 2; - margin-bottom: $vertical-rhythm-unit; - font-size: 24px; - line-height: 27px; - - &:first-of-type { - margin-top: 0; - } - - @media print { - page-break-after: avoid; - } -} - -h3 { - margin-top: $vertical-rhythm-unit * 2; - margin-bottom: $vertical-rhythm-unit; - font-size: 19px; - line-height: 22px; - - @media print { - page-break-after: avoid; - } -} - -h4 { - margin-top: $vertical-rhythm-unit * 2; - margin-bottom: $vertical-rhythm-unit; - font-size: 16px; - line-height: 20px; - font-weight: bold; - - @media print { - page-break-after: avoid; - } -} - -h5 { - margin-top: $vertical-rhythm-unit * 2; - margin-bottom: $vertical-rhythm-unit; - font-size: 16px; - line-height: 20px; - font-weight: normal; - - @media print { - page-break-after: avoid; - } -} - -caption {margin: 0;} - -$vertical-rhythm-unit: 15px !global; - -// tables - -table { - margin-bottom: $vertical-rhythm-unit*2; - line-height: inherit; - font-size: inherit; - border: 1px solid #dcdcdc; - - // Remove most spacing between table cells - border-collapse: collapse; - border-spacing: 0; - - &.zebra { - tbody tr:nth-child(odd) { - background-color: #f5f5f5; - } - } - - &.wide { - min-width: 100%; - } - - // Table header - thead { - background-color: #F7F7F7; - border-bottom-width: 2px; - } - - // Table footer - tfoot { - color: #ccc; - - tr {border-bottom: none;} - } - - // Row - tr { - border-bottom: 1px solid #dcdcdc; - } - - // Header cell - th { - padding-top: 10px; - padding-bottom: 6px; - text-align: left; - font-weight: bold; - } - - // Cell - th, - td { - padding: 6px 10px; - vertical-align: top; - - &:first-child { - padding-left: 12px; - } - - &:last-child { - padding-right: 12px; - } - } - - // ??? - p:last-child, - pre:last-child { - margin-bottom: 0; - } -} - -.api-docs-breadcrumbs { - margin-bottom: 25px; -} - -// code - -$font-family-mono: 'Liberation Mono', Consolas, Menlo, Courier, monospace !global; -$code-background: #efefef; - -pre { - background-color: $code-background; - overflow: auto; -} - -code { - font-family: $font-family-mono; - font-style: normal; - background-color: $code-background; -} - -code :target { - background-color: #FFFFCC; -} - -// kotlin syntax highlight - -.signature { - background-color: $code-background; - padding: 4px; -} - -.keyword { - color: #0000C0; -} - -.summarizedTypeName { - background-color: lightcyan; - font-style: italic; -} - -.parameterName { - font-weight: bold; -} - -// MPP projects - -.tags { - display: flex; -} - -.tags__tag { - color: white; - font-weight: bold; - text-transform: uppercase; - background: #a7a7a7; - padding: 0 7px; - font-size: 10px; - border-radius: 9px; - line-height: 18px; - margin-right: 5px; -} \ No newline at end of file diff --git a/site/docs/_sass/_base.scss b/site/docs/_sass/_base.scss deleted file mode 100644 index b8d70d526b..0000000000 --- a/site/docs/_sass/_base.scss +++ /dev/null @@ -1,97 +0,0 @@ -// Bits and pieces from Minima Jekyll Layout -// The MIT License (MIT) Copyright (c) 2016 Parker Moor - -// Reset some basic elements -body, h1, h2, h3, h4, h5, h6, -p, blockquote, pre, hr, -dl, dd, ol, ul, figure { - margin: 0; - padding: 0; -} - -// Basic styling -body { - font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; - color: $text-color; - background-color: $background-color; - -webkit-text-size-adjust: 100%; - -webkit-font-feature-settings: "kern" 1; - -moz-font-feature-settings: "kern" 1; - -o-font-feature-settings: "kern" 1; - font-feature-settings: "kern" 1; - font-kerning: normal; -} - -// Set `margin-bottom` to maintain vertical rhythm -h1, h2, h3, h4, h5, h6, -p, blockquote, pre, -ul, ol, dl, figure, -%vertical-rhythm { - margin-bottom: $spacing-unit / 2; -} - -// Lists -ul, ol { - margin-left: $spacing-unit; -} - -li { - > ul, - > ol { - margin-bottom: 0; - } -} - -// Links -a { - color: $brand-color; - text-decoration: none; - - &:visited { - color: darken($brand-color, 15%); - } - - &:hover { - color: $text-color; - text-decoration: underline; - } -} - -// Blockquotes -blockquote { - color: $grey-color; - border-left: 4px solid $grey-color-light; - padding-left: $spacing-unit / 2; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; - - > :last-child { - margin-bottom: 0; - } -} - -// Wrapper -.wrapper { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); - max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); - margin-right: auto; - margin-left: auto; - padding-right: $spacing-unit; - padding-left: $spacing-unit; - @extend %clearfix; - - @include media-query($on-laptop) { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); - max-width: calc(#{$content-width} - (#{$spacing-unit})); - padding-right: $spacing-unit / 2; - padding-left: $spacing-unit / 2; - } -} - -// Clearfix -%clearfix:after { - content: ""; - display: table; - clear: both; -} diff --git a/site/docs/_sass/_layout.scss b/site/docs/_sass/_layout.scss deleted file mode 100644 index d85d0592ef..0000000000 --- a/site/docs/_sass/_layout.scss +++ /dev/null @@ -1,37 +0,0 @@ -// Bits and pieces from Minima Jekyll Layout -// The MIT License (MIT) Copyright (c) 2016 Parker Moor - -// Site header -.site-header { - border-top: 5px solid $grey-color-dark; - border-bottom: 1px solid $grey-color-light; - min-height: 56px; - - // Positioning context for the mobile navigation icon - position: relative; -} - -.site-title { - font-size: 26px; - font-weight: 300; - line-height: 56px; - letter-spacing: -1px; - margin-bottom: 0; - float: left; - - &, - &:visited { - color: $grey-color-dark; - } -} -// Site footer -.site-footer { - border-top: 1px solid $grey-color-light; - padding: $spacing-unit 0; -} - -// Page content -.page-content { - padding: $spacing-unit 0; -} - diff --git a/site/docs/_sass/_minima.scss b/site/docs/_sass/_minima.scss deleted file mode 100644 index 86079f8529..0000000000 --- a/site/docs/_sass/_minima.scss +++ /dev/null @@ -1,35 +0,0 @@ -// Bits and pieces from Minima Jekyll Layout -// The MIT License (MIT) Copyright (c) 2016 Parker Moor - -// Define defaults for each variable. - -$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !default; -$base-font-size: 16px !default; -$base-font-weight: 400 !default; -$small-font-size: $base-font-size * 0.875 !default; -$base-line-height: 1.5 !default; - -$spacing-unit: 30px !default; - -$text-color: #111 !default; -$background-color: #fdfdfd !default; -$brand-color: #2a7ae2 !default; - -$grey-color: #828282 !default; -$grey-color-light: lighten($grey-color, 40%) !default; -$grey-color-dark: darken($grey-color, 25%) !default; - -// Width of the content area -$content-width: 800px !default; - -$on-palm: 600px !default; -$on-laptop: 800px !default; - -@mixin media-query($device) { - @media screen and (max-width: $device) { - @content; - } -} - -// Import partials. -@import "base", "layout"; diff --git a/site/docs/assets/js/api.js b/site/docs/assets/js/api.js deleted file mode 100644 index 08f41fa087..0000000000 --- a/site/docs/assets/js/api.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - - -function addTag(rowElement, tag) { - var tags = $(rowElement).find('.tags'); - if (tags.length == 0) { - tags = $('
'); - $(rowElement).find('td:first').append(tags); - } - tags.append('
' + tag + '
') -} - -$(document).ready(function () { - $('[data-platform]').each(function (ind, element) { - var platform = element.getAttribute('data-platform'); - addTag(element, platform) - }); -}); diff --git a/site/docs/assets/main.scss b/site/docs/assets/main.scss deleted file mode 100644 index 1be8487fb4..0000000000 --- a/site/docs/assets/main.scss +++ /dev/null @@ -1,36 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - -// Sans Serif -@import url('//fonts.googleapis.com/css?family=Open+Sans:300,300italic,400italic,700italic,400,700'); - -// Our variables -$base-font-family: "Open Sans", Helvetica, Arial, sans-serif; -$base-font-size: 14px; -$base-font-weight: 400; -$small-font-size: $base-font-size * 0.875; -$base-line-height: 20px; - -$spacing-unit: 30px; - -$text-color: #111; -$background-color: #fdfdfd; -$brand-color: #2a7ae2; - -$grey-color: #828282; -$grey-color-light: lighten($grey-color, 40%); -$grey-color-dark: darken($grey-color, 25%); - -// Width of the content area -$content-width: 800px; - -$on-palm: 600px; -$on-laptop: 800px; - -// Import partials from the `minima` theme. -@import "minima"; - -// Import api reference styles -@import "api"; diff --git a/site/docs/index.md b/site/docs/index.md deleted file mode 100644 index 92eb09483e..0000000000 --- a/site/docs/index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: kotlinx-coroutines -layout: api ---- - -# kotlinx.coroutines reference documentation - -Library support for Kotlin coroutines. This reference is a companion to -[Guide to kotlinx.coroutines by example](https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md). - -## Modules - -| Name | Description | -| ---------------------------------------------------------- | ------------------------------------------------ | -| [kotlinx-coroutines-core](kotlinx-coroutines-core) | Core primitives to work with coroutines | -| [kotlinx-coroutines-debug](kotlinx-coroutines-debug) | Debugging utilities for coroutines | -| [kotlinx-coroutines-test](kotlinx-coroutines-test) | Test primitives for coroutines, `Main` dispatcher injection | -| [kotlinx-coroutines-reactive](kotlinx-coroutines-reactive) | Utilities for [Reactive Streams](https://www.reactive-streams.org) | -| [kotlinx-coroutines-reactor](kotlinx-coroutines-reactor) | Utilities for [Reactor](https://projectreactor.io) | -| [kotlinx-coroutines-rx2](kotlinx-coroutines-rx2) | Utilities for [RxJava 2.x](https://github.com/ReactiveX/RxJava) | -| [kotlinx-coroutines-rx3](kotlinx-coroutines-rx3) | Utilities for [RxJava 3.x](https://github.com/ReactiveX/RxJava) | -| [kotlinx-coroutines-android](kotlinx-coroutines-android) | `Main` dispatcher for Android applications | -| [kotlinx-coroutines-javafx](kotlinx-coroutines-javafx) | `JavaFx` dispatcher for JavaFX UI applications | -| [kotlinx-coroutines-swing](kotlinx-coroutines-swing) | `Swing` dispatcher for Swing UI applications | -| [kotlinx-coroutines-jdk8](kotlinx-coroutines-jdk8) | Integration with JDK8 `CompletableFuture` (Android API level 24) | -| [kotlinx-coroutines-guava](kotlinx-coroutines-guava) | Integration with Guava [ListenableFuture](https://github.com/google/guava/wiki/ListenableFutureExplained) | -| [kotlinx-coroutines-slf4j](kotlinx-coroutines-slf4j) | Integration with SLF4J [MDC](https://logback.qos.ch/manual/mdc.html) | -| [kotlinx-coroutines-play-services](kotlinx-coroutines-play-services) | Integration with Google Play Services [Tasks API](https://developers.google.com/android/guides/tasks) | - -## Examples - -* [example-frontend-js](example-frontend-js/index.html) -- frontend application written in Kotlin/JS -that uses coroutines to implement animations in imperative style. diff --git a/stdlib-stubs/README.md b/stdlib-stubs/README.md deleted file mode 100644 index f47bccc8da..0000000000 --- a/stdlib-stubs/README.md +++ /dev/null @@ -1 +0,0 @@ -This is a workaround for Dokka to generate proper references for Kotlin 1.3 API. \ No newline at end of file diff --git a/stdlib-stubs/build.gradle.kts b/stdlib-stubs/build.gradle.kts deleted file mode 100644 index 201ac43cb0..0000000000 --- a/stdlib-stubs/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -tasks.named("compileKotlin") { - kotlinOptions { - freeCompilerArgs += "-Xallow-kotlin-package" - } -} diff --git a/stdlib-stubs/src/Continuation.kt b/stdlib-stubs/src/Continuation.kt deleted file mode 100644 index 66d672afea..0000000000 --- a/stdlib-stubs/src/Continuation.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -package kotlin.coroutines - -// DOKKA STUB -public interface Continuation { - public val context: CoroutineContext - public fun resumeWith(result: Result) -} diff --git a/stdlib-stubs/src/ContinuationInterceptor.kt b/stdlib-stubs/src/ContinuationInterceptor.kt deleted file mode 100644 index 5c96e82dff..0000000000 --- a/stdlib-stubs/src/ContinuationInterceptor.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -package kotlin.coroutines - -// DOKKA STUB -public interface ContinuationInterceptor : CoroutineContext.Element { - public companion object Key : CoroutineContext.Key - public fun interceptContinuation(continuation: Continuation): Continuation - public fun releaseInterceptedContinuation(continuation: Continuation<*>): Continuation<*> { - return continuation - } - public override operator fun get(key: CoroutineContext.Key): E? = TODO() - public override fun minusKey(key: CoroutineContext.Key<*>): CoroutineContext = TODO() -} diff --git a/stdlib-stubs/src/CoroutineContext.kt b/stdlib-stubs/src/CoroutineContext.kt deleted file mode 100644 index 6861198da5..0000000000 --- a/stdlib-stubs/src/CoroutineContext.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -package kotlin.coroutines - -// DOKKA STUB -public interface CoroutineContext { - public operator fun get(key: Key): E? - public fun fold(initial: R, operation: (R, Element) -> R): R - public operator fun plus(context: CoroutineContext): CoroutineContext = TODO() - public fun minusKey(key: Key<*>): CoroutineContext - public interface Key - public interface Element : CoroutineContext { - public val key: Key<*> - - public override operator fun get(key: Key): E? = - @Suppress("UNCHECKED_CAST") - if (this.key == key) this as E else null - - public override fun fold(initial: R, operation: (R, Element) -> R): R = - operation(initial, this) - - public override fun minusKey(key: Key<*>): CoroutineContext = - if (this.key == key) EmptyCoroutineContext else this - } -} - -public object EmptyCoroutineContext : CoroutineContext { - private const val serialVersionUID: Long = 0 - private fun readResolve(): Any = EmptyCoroutineContext - - public override fun get(key: CoroutineContext.Key): E? = null - public override fun fold(initial: R, operation: (R, CoroutineContext.Element) -> R): R = initial - public override fun plus(context: CoroutineContext): CoroutineContext = context - public override fun minusKey(key: CoroutineContext.Key<*>): CoroutineContext = this - public override fun hashCode(): Int = 0 - public override fun toString(): String = "EmptyCoroutineContext" -} diff --git a/stdlib-stubs/src/Result.kt b/stdlib-stubs/src/Result.kt deleted file mode 100644 index d873ac8902..0000000000 --- a/stdlib-stubs/src/Result.kt +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlin - -public interface Result { - public val value: T - public val isSuccess: Boolean - public val isFailure: Boolean - public fun exceptionOrNull(): Throwable? - public fun getOrNull(): T? - public fun getOrThrow(): T -} diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index bc974f6c11..0f69c387e2 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -310,7 +310,7 @@ processing the previous one. The [actor] coroutine builder accepts an optional controls the implementation of the channel that this actor is using for its mailbox. The description of all the available choices is given in documentation of the [`Channel()`][Channel] factory function. -Let us change the code to use a conflated channel by passing [Channel.CONFLATED] capacity value. The +Let us change the code to use a conflated channel by passing [Channel.CONFLATED][Channel.Factory.CONFLATED] capacity value. The change is only to the line that creates an actor: ```kotlin @@ -611,14 +611,14 @@ After delay [launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html [delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html [Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/cancel.html +[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html [CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [MainScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html [withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html [Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html [CoroutineStart]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/index.html [async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[CoroutineStart.UNDISPATCHED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-u-n-d-i-s-p-a-t-c-h-e-d.html +[CoroutineStart.UNDISPATCHED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-u-n-d-i-s-p-a-t-c-h-e-d/index.html @@ -626,12 +626,12 @@ After delay [SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html [SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html [Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[Channel.CONFLATED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/-c-o-n-f-l-a-t-e-d.html +[Channel.Factory.CONFLATED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/-factory/-c-o-n-f-l-a-t-e-d.html -[kotlinx.coroutines.Dispatchers.JavaFx]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-javafx/kotlinx.coroutines.javafx/kotlinx.coroutines.-dispatchers/-java-fx.html +[kotlinx.coroutines.Dispatchers.JavaFx]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-javafx/kotlinx.coroutines.javafx/-java-fx.html From c9ab4fd21b900f66336d4d029610643c1b8839ae Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 8 Jul 2021 12:12:48 +0300 Subject: [PATCH 099/328] Update Kotlin to 1.5.20 (#2810) --- README.md | 10 +++++----- gradle.properties | 4 ++-- gradle/compile-js-multiplatform.gradle | 2 +- kotlinx-coroutines-core/common/src/Delay.kt | 2 +- .../common/src/channels/ConflatedChannel.kt | 1 + .../common/src/channels/Deprecated.kt | 1 + .../common/src/flow/SharingStarted.kt | 2 +- .../common/src/flow/operators/Lint.kt | 2 +- kotlinx-coroutines-core/jvm/src/channels/Actor.kt | 1 + .../jvm/src/internal/MainDispatchers.kt | 5 ++++- 10 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6844759d8e..16cd49a9d0 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.5.0-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.5.20-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.5.0` release. +This is a companion version for the Kotlin `1.5.20` release. ```kotlin suspend fun main() = coroutineScope { @@ -91,7 +91,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.5.0 + 1.5.20 ``` @@ -109,7 +109,7 @@ And make sure that you use the latest Kotlin version: ```groovy buildscript { - ext.kotlin_version = '1.5.0' + ext.kotlin_version = '1.5.20' } ``` @@ -135,7 +135,7 @@ And make sure that you use the latest Kotlin version: ```groovy plugins { - kotlin("jvm") version "1.5.0" + kotlin("jvm") version "1.5.20" } ``` diff --git a/gradle.properties b/gradle.properties index a6e017787f..c7b9b65d22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,12 +5,12 @@ # Kotlin version=1.5.0-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.5.0 +kotlin_version=1.5.20 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.16.1 +atomicfu_version=0.16.2 knit_version=0.3.0-RC html_version=0.7.2 lincheck_version=2.14 diff --git a/gradle/compile-js-multiplatform.gradle b/gradle/compile-js-multiplatform.gradle index 1e885db0c5..d6df7e403a 100644 --- a/gradle/compile-js-multiplatform.gradle +++ b/gradle/compile-js-multiplatform.gradle @@ -46,7 +46,7 @@ compileJsLegacy.configure { kotlinOptions { // drop -js suffix from outputFile def baseName = project.name - "-js" - outputFile = new File(outputFile.parent, baseName + ".js") + outputFile = new File(outputFileProperty.get().parent, baseName + ".js") } } diff --git a/kotlinx-coroutines-core/common/src/Delay.kt b/kotlinx-coroutines-core/common/src/Delay.kt index 53dadf9730..4543c5dda1 100644 --- a/kotlinx-coroutines-core/common/src/Delay.kt +++ b/kotlinx-coroutines-core/common/src/Delay.kt @@ -150,4 +150,4 @@ internal val CoroutineContext.delay: Delay get() = get(ContinuationInterceptor) */ @ExperimentalTime internal fun Duration.toDelayMillis(): Long = - if (this > Duration.ZERO) toLongMilliseconds().coerceAtLeast(1) else 0 + if (this > Duration.ZERO) inWholeMilliseconds.coerceAtLeast(1) else 0 diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt index e1e2b140f5..f7f60cf97d 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt @@ -123,6 +123,7 @@ internal open class ConflatedChannel(onUndeliveredElement: OnUndeliveredEleme undeliveredElementException?.let { throw it } // throw UndeliveredElementException at the end if there was one } + @Suppress("UNCHECKED_CAST") private fun updateValueLocked(element: Any?): UndeliveredElementException? { val old = value val undeliveredElementException = if (old === EMPTY) null else diff --git a/kotlinx-coroutines-core/common/src/channels/Deprecated.kt b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt index 963c168c7b..7f1f6efb6e 100644 --- a/kotlinx-coroutines-core/common/src/channels/Deprecated.kt +++ b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt @@ -34,6 +34,7 @@ public suspend fun ReceiveChannel.elementAt(index: Int): E = consume { throw IndexOutOfBoundsException("ReceiveChannel doesn't contain element at index $index.") var count = 0 for (element in this) { + @Suppress("UNUSED_CHANGED_VALUE") // KT-47628 if (index == count++) return element } diff --git a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt index ce568fb46d..f4c6f2ee8d 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt @@ -140,7 +140,7 @@ public fun SharingStarted.Companion.WhileSubscribed( stopTimeout: Duration = Duration.ZERO, replayExpiration: Duration = Duration.INFINITE ): SharingStarted = - StartedWhileSubscribed(stopTimeout.toLongMilliseconds(), replayExpiration.toLongMilliseconds()) + StartedWhileSubscribed(stopTimeout.inWholeMilliseconds, replayExpiration.inWholeMilliseconds) // -------------------------------- implementation -------------------------------- diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt b/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt index 2f7bc358e8..858c885c1e 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt @@ -2,7 +2,7 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -@file:Suppress("unused", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") +@file:Suppress("unused", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "UNUSED_PARAMETER") package kotlinx.coroutines.flow diff --git a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt index 5153cb47f1..96cda7b1af 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt @@ -163,6 +163,7 @@ private class LazyActorCoroutine( return super.send(element) } + @Suppress("DEPRECATION_ERROR") override fun offer(element: E): Boolean { start() return super.offer(element) diff --git a/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt b/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt index 3102fdfbb9..2d447413b8 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt @@ -67,7 +67,10 @@ public fun MainCoroutineDispatcher.isMissing(): Boolean = this is MissingMainCor @Suppress("MayBeConstant") private val SUPPORT_MISSING = true -@Suppress("ConstantConditionIf") +@Suppress( + "ConstantConditionIf", + "IMPLICIT_NOTHING_TYPE_ARGUMENT_AGAINST_NOT_NOTHING_EXPECTED_TYPE" // KT-47626 +) private fun createMissingDispatcher(cause: Throwable? = null, errorHint: String? = null) = if (SUPPORT_MISSING) MissingMainCoroutineDispatcher(cause, errorHint) else cause?.let { throw it } ?: throwMissingMainDispatcherException() From f5e87400f4d11be56851a4304aa1a40fa3c09cde Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 8 Jul 2021 13:47:21 +0300 Subject: [PATCH 100/328] General cleanup (#2809) * Suppress all deprecated signatures from the documentation * Migrate inline classes to value * Get rid of annoying Gradle output when tasks are configured * Opt-in into delicate coroutines API * Get rid of legacy jvm_ir_enabled that was used for pre-release testing of JVM IR compiler * Update README references --- build.gradle | 17 +--- buildSrc/src/main/kotlin/Publishing.kt | 4 - .../kotlin/kotlin-jvm-conventions.gradle.kts | 6 -- gradle/compile-jvm-multiplatform.gradle | 8 +- gradle/{experimental.gradle => opt-in.gradle} | 5 +- kotlinx-coroutines-core/build.gradle | 8 +- kotlinx-coroutines-core/common/README.md | 10 +- .../common/src/channels/Channel.kt | 6 ++ .../common/src/channels/Deprecated.kt | 95 ++++++++++++++++--- .../common/src/flow/operators/Context.kt | 2 + .../src/internal/ConcurrentLinkedList.kt | 5 +- .../common/src/internal/InlineList.kt | 8 +- .../jvm/test/channels/ChannelsJvmTest.kt | 8 +- kotlinx-coroutines-debug/build.gradle | 10 -- .../kotlinx-coroutines-reactive/src/Await.kt | 6 +- .../src/Migration.kt | 3 + .../src/Publish.kt | 1 + reactive/kotlinx-coroutines-reactor/README.md | 2 - .../kotlinx-coroutines-reactor/src/Convert.kt | 1 + .../kotlinx-coroutines-reactor/src/Flux.kt | 3 + .../src/Migration.kt | 1 + .../kotlinx-coroutines-reactor/src/Mono.kt | 15 ++- .../src/ReactorContext.kt | 3 +- reactive/kotlinx-coroutines-rx2/README.md | 11 +-- .../kotlinx-coroutines-rx2/src/RxAwait.kt | 2 + .../kotlinx-coroutines-rx2/src/RxChannel.kt | 2 + .../src/RxCompletable.kt | 3 + .../kotlinx-coroutines-rx2/src/RxConvert.kt | 2 + .../kotlinx-coroutines-rx2/src/RxFlowable.kt | 1 + .../kotlinx-coroutines-rx2/src/RxMaybe.kt | 1 + .../src/RxObservable.kt | 1 + .../kotlinx-coroutines-rx2/src/RxSingle.kt | 1 + reactive/kotlinx-coroutines-rx3/README.md | 8 +- .../kotlinx-coroutines-rx3/src/RxAwait.kt | 4 + .../kotlinx-coroutines-rx3/src/RxConvert.kt | 2 + .../src/HandlerDispatcher.kt | 2 +- 36 files changed, 171 insertions(+), 96 deletions(-) rename gradle/{experimental.gradle => opt-in.gradle} (84%) diff --git a/build.gradle b/build.gradle index b54e18b5d1..46adbf7555 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ import org.jetbrains.dokka.gradle.DokkaTaskPartial import org.jetbrains.dokka.gradle.DokkaMultiModuleTask apply plugin: 'jdk-convention' -apply from: rootProject.file("gradle/experimental.gradle") +apply from: rootProject.file("gradle/opt-in.gradle") def coreModule = "kotlinx-coroutines-core" // Not applicable for Kotlin plugin @@ -36,9 +36,6 @@ buildscript { throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler") } } - // These three flags are enabled in train builds for JVM IR compiler testing - ext.jvm_ir_enabled = rootProject.properties['enable_jvm_ir'] != null - ext.jvm_ir_api_check_enabled = rootProject.properties['enable_jvm_ir_api_check'] != null ext.native_targets_enabled = rootProject.properties['disable_native_targets'] == null // Determine if any project dependency is using a snapshot version @@ -167,9 +164,8 @@ configure(subprojects.findAll { !sourceless.contains(it.name) }) { // Configure options for all Kotlin compilation tasks tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all { - kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it } + kotlinOptions.freeCompilerArgs += optInAnnotations.collect { "-Xopt-in=" + it } kotlinOptions.freeCompilerArgs += "-progressive" - kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses" // Disable KT-36770 for RxJava2 integration kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated" // Remove null assertions to get smaller bytecode on Android @@ -289,15 +285,6 @@ dependencies { dokkaHtmlMultiModulePlugin("org.jetbrains.kotlinx:dokka-pathsaver-plugin:$knit_version") } -// Disable binary compatibility check for JVM IR compiler output by default -if (jvm_ir_enabled) { - subprojects { project -> - configure(tasks.matching { it.name == "apiCheck" }) { - enabled = enabled && jvm_ir_api_check_enabled - } - } -} - // Opt-in for build scan in order to troubleshoot Gradle on TC if (hasProperty('buildScan')) { buildScan { diff --git a/buildSrc/src/main/kotlin/Publishing.kt b/buildSrc/src/main/kotlin/Publishing.kt index e0124cd966..8c6dd5de3d 100644 --- a/buildSrc/src/main/kotlin/Publishing.kt +++ b/buildSrc/src/main/kotlin/Publishing.kt @@ -40,12 +40,8 @@ fun MavenPom.configureMavenCentralMetadata(project: Project) { } fun mavenRepositoryUri(): URI { - // TODO -SNAPSHOT detection can be made here as well val repositoryId: String? = System.getenv("libs.repository.id") return if (repositoryId == null) { - // Using implicitly created staging, for MPP it's likely to be a mistake because - // publication on TeamCity will create 3 independent staging repositories - System.err.println("Warning: using an implicitly created staging for coroutines") URI("https://oss.sonatype.org/service/local/staging/deploy/maven2/") } else { URI("https://oss.sonatype.org/service/local/staging/deployByRepositoryId/$repositoryId") diff --git a/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts b/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts index 5f3193428c..c7744f8702 100644 --- a/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts @@ -15,12 +15,6 @@ java { targetCompatibility = JavaVersion.VERSION_1_6 } -if (rootProject.extra.get("jvm_ir_enabled") as Boolean) { - kotlin.target.compilations.configureEach { - kotlinOptions.useIR = true - } -} - dependencies { testImplementation(kotlin("test")) // Workaround to make addSuppressed work in tests diff --git a/gradle/compile-jvm-multiplatform.gradle b/gradle/compile-jvm-multiplatform.gradle index 1f861f800c..5e65042746 100644 --- a/gradle/compile-jvm-multiplatform.gradle +++ b/gradle/compile-jvm-multiplatform.gradle @@ -6,13 +6,7 @@ sourceCompatibility = 1.6 targetCompatibility = 1.6 kotlin { - jvm { - if (rootProject.ext.jvm_ir_enabled) { - compilations.all { - kotlinOptions.useIR = true - } - } - } + jvm {} sourceSets { jvmTest.dependencies { api "org.jetbrains.kotlin:kotlin-test:$kotlin_version" diff --git a/gradle/experimental.gradle b/gradle/opt-in.gradle similarity index 84% rename from gradle/experimental.gradle rename to gradle/opt-in.gradle index 11aeb6d8a6..bcf6bebe94 100644 --- a/gradle/experimental.gradle +++ b/gradle/opt-in.gradle @@ -2,11 +2,10 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -// For new mpp -ext.experimentalAnnotations = [ - "kotlin.Experimental", +ext.optInAnnotations = [ "kotlin.experimental.ExperimentalTypeInference", "kotlin.ExperimentalMultiplatform", + "kotlinx.coroutines.DelicateCoroutinesApi", "kotlinx.coroutines.ExperimentalCoroutinesApi", "kotlinx.coroutines.ObsoleteCoroutinesApi", "kotlinx.coroutines.InternalCoroutinesApi", diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index d9be404b1d..c45ca08cef 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -81,7 +81,7 @@ kotlin { } languageSettings { progressiveMode = true - experimentalAnnotations.each { useExperimentalAnnotation(it) } + optInAnnotations.each { useExperimentalAnnotation(it) } } } @@ -201,12 +201,6 @@ jvmTest { // Configure the IDEA runner for Lincheck configureJvmForLincheck(jvmTest) } - // TODO: JVM IR generates different stacktrace so temporary disable stacktrace tests - if (rootProject.ext.jvm_ir_enabled) { - filter { - excludeTestsMatching('kotlinx.coroutines.exceptions.StackTraceRecovery*') - } - } } // Setup manifest for kotlinx-coroutines-core-jvm.jar diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index bdb23b82a0..fcfe334c62 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -57,9 +57,9 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio | ---------------- | --------------------------------------------- | ------------------------------------------------ | -------------------------- | [Job] | [join][Job.join] | [onJoin][Job.onJoin] | [isCompleted][Job.isCompleted] | [Deferred] | [await][Deferred.await] | [onAwait][Deferred.onAwait] | [isCompleted][Job.isCompleted] -| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [offer][kotlinx.coroutines.channels.SendChannel.offer] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] -| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [poll][kotlinx.coroutines.channels.ReceiveChannel.poll] +| [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] +| [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] | [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] | none | [delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none @@ -146,9 +146,9 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.channels.SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html [kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html [kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html -[kotlinx.coroutines.channels.SendChannel.offer]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/offer.html +[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html [kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.poll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/poll.html +[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html [kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html [kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 8c69cbfe87..b15c4262ef 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -154,6 +154,8 @@ public interface SendChannel { * ``` * * See https://github.com/Kotlin/kotlinx.coroutines/issues/974 for more context. + * + * @suppress **Deprecated**. */ @Deprecated( level = DeprecationLevel.WARNING, @@ -308,6 +310,8 @@ public interface ReceiveChannel { * The replacement `tryReceive().getOrNull()` is a default that ignores all close exceptions and * proceeds with `null`, while `poll` throws an exception if the channel was closed with an exception. * Replacement with the very same 'poll' semantics is `tryReceive().onClosed { if (it != null) throw it }.getOrNull()` + * + * @suppress **Deprecated**. */ @Deprecated( level = DeprecationLevel.WARNING, @@ -336,6 +340,8 @@ public interface ReceiveChannel { * The replacement `receiveCatching().getOrNull()` is a safe default that ignores all close exceptions and * proceeds with `null`, while `receiveOrNull` throws an exception if the channel was closed with an exception. * Replacement with the very same `receiveOrNull` semantics is `receiveCatching().onClosed { if (it != null) throw it }.getOrNull()`. + * + * @suppress **Deprecated** */ @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @LowPriorityInOverloadResolution diff --git a/kotlinx-coroutines-core/common/src/channels/Deprecated.kt b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt index 7f1f6efb6e..2b9ed42dd1 100644 --- a/kotlinx-coroutines-core/common/src/channels/Deprecated.kt +++ b/kotlinx-coroutines-core/common/src/channels/Deprecated.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.* import kotlin.coroutines.* import kotlin.jvm.* +/** @suppress **/ @PublishedApi // Binary compatibility internal fun consumesAll(vararg channels: ReceiveChannel<*>): CompletionHandler = { cause: Throwable? -> @@ -28,6 +29,7 @@ internal fun consumesAll(vararg channels: ReceiveChannel<*>): CompletionHandler exception?.let { throw it } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.elementAt(index: Int): E = consume { if (index < 0) @@ -41,6 +43,7 @@ public suspend fun ReceiveChannel.elementAt(index: Int): E = consume { throw IndexOutOfBoundsException("ReceiveChannel doesn't contain element at index $index.") } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.elementAtOrNull(index: Int): E? = consume { @@ -54,6 +57,7 @@ public suspend fun ReceiveChannel.elementAtOrNull(index: Int): E? = return null } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.first(): E = consume { @@ -63,6 +67,7 @@ public suspend fun ReceiveChannel.first(): E = return iterator.next() } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.firstOrNull(): E? = consume { @@ -72,6 +77,7 @@ public suspend fun ReceiveChannel.firstOrNull(): E? = return iterator.next() } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.indexOf(element: E): Int { var index = 0 @@ -83,6 +89,7 @@ public suspend fun ReceiveChannel.indexOf(element: E): Int { return -1 } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.last(): E = consume { @@ -95,6 +102,7 @@ public suspend fun ReceiveChannel.last(): E = return last } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.lastIndexOf(element: E): Int { var lastIndex = -1 @@ -107,6 +115,7 @@ public suspend fun ReceiveChannel.lastIndexOf(element: E): Int { return lastIndex } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.lastOrNull(): E? = consume { @@ -119,6 +128,7 @@ public suspend fun ReceiveChannel.lastOrNull(): E? = return last } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.single(): E = consume { @@ -131,6 +141,7 @@ public suspend fun ReceiveChannel.single(): E = return single } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.singleOrNull(): E? = consume { @@ -143,6 +154,7 @@ public suspend fun ReceiveChannel.singleOrNull(): E? = return single } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public fun ReceiveChannel.drop(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { @@ -159,8 +171,12 @@ public fun ReceiveChannel.drop(n: Int, context: CoroutineContext = Dispat } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.dropWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = +public fun ReceiveChannel.dropWhile( + context: CoroutineContext = Dispatchers.Unconfined, + predicate: suspend (E) -> Boolean +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { for (e in this@dropWhile) { if (!predicate(e)) { @@ -174,15 +190,22 @@ public fun ReceiveChannel.dropWhile(context: CoroutineContext = Dispatche } @PublishedApi -internal fun ReceiveChannel.filter(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = +internal fun ReceiveChannel.filter( + context: CoroutineContext = Dispatchers.Unconfined, + predicate: suspend (E) -> Boolean +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { for (e in this@filter) { if (predicate(e)) send(e) } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.filterIndexed(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (index: Int, E) -> Boolean): ReceiveChannel = +public fun ReceiveChannel.filterIndexed( + context: CoroutineContext = Dispatchers.Unconfined, + predicate: suspend (index: Int, E) -> Boolean +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { var index = 0 for (e in this@filterIndexed) { @@ -190,8 +213,12 @@ public fun ReceiveChannel.filterIndexed(context: CoroutineContext = Dispa } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.filterNot(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = +public fun ReceiveChannel.filterNot( + context: CoroutineContext = Dispatchers.Unconfined, + predicate: suspend (E) -> Boolean +): ReceiveChannel = filter(context) { !predicate(it) } @PublishedApi @@ -199,6 +226,7 @@ public fun ReceiveChannel.filterNot(context: CoroutineContext = Dispatche internal fun ReceiveChannel.filterNotNull(): ReceiveChannel = filter { it != null } as ReceiveChannel +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { consumeEach { @@ -207,6 +235,7 @@ public suspend fun > ReceiveChannel.fil return destination } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun > ReceiveChannel.filterNotNullTo(destination: C): C { consumeEach { @@ -215,6 +244,7 @@ public suspend fun > ReceiveChannel.filterNotNul return destination } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public fun ReceiveChannel.take(n: Int, context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { @@ -229,8 +259,12 @@ public fun ReceiveChannel.take(n: Int, context: CoroutineContext = Dispat } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.takeWhile(context: CoroutineContext = Dispatchers.Unconfined, predicate: suspend (E) -> Boolean): ReceiveChannel = +public fun ReceiveChannel.takeWhile( + context: CoroutineContext = Dispatchers.Unconfined, + predicate: suspend (E) -> Boolean +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { for (e in this@takeWhile) { if (!predicate(e)) return@produce @@ -254,6 +288,7 @@ internal suspend fun > ReceiveChannel.toCollec return destination } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel>.toMap(): Map = toMap(LinkedHashMap()) @@ -266,16 +301,22 @@ internal suspend fun > ReceiveChannel ReceiveChannel.toMutableList(): MutableList = toCollection(ArrayList()) +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.toSet(): Set = this.toMutableSet() +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.flatMap(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> ReceiveChannel): ReceiveChannel = +public fun ReceiveChannel.flatMap( + context: CoroutineContext = Dispatchers.Unconfined, + transform: suspend (E) -> ReceiveChannel +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { for (e in this@flatMap) { transform(e).toChannel(this) @@ -283,7 +324,10 @@ public fun ReceiveChannel.flatMap(context: CoroutineContext = Dispatch } @PublishedApi -internal fun ReceiveChannel.map(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R): ReceiveChannel = +internal fun ReceiveChannel.map( + context: CoroutineContext = Dispatchers.Unconfined, + transform: suspend (E) -> R +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { consumeEach { send(transform(it)) @@ -291,7 +335,10 @@ internal fun ReceiveChannel.map(context: CoroutineContext = Dispatcher } @PublishedApi -internal fun ReceiveChannel.mapIndexed(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R): ReceiveChannel = +internal fun ReceiveChannel.mapIndexed( + context: CoroutineContext = Dispatchers.Unconfined, + transform: suspend (index: Int, E) -> R +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { var index = 0 for (e in this@mapIndexed) { @@ -299,14 +346,23 @@ internal fun ReceiveChannel.mapIndexed(context: CoroutineContext = Dis } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.mapIndexedNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (index: Int, E) -> R?): ReceiveChannel = +public fun ReceiveChannel.mapIndexedNotNull( + context: CoroutineContext = Dispatchers.Unconfined, + transform: suspend (index: Int, E) -> R? +): ReceiveChannel = mapIndexed(context, transform).filterNotNull() +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) -public fun ReceiveChannel.mapNotNull(context: CoroutineContext = Dispatchers.Unconfined, transform: suspend (E) -> R?): ReceiveChannel = +public fun ReceiveChannel.mapNotNull( + context: CoroutineContext = Dispatchers.Unconfined, + transform: suspend (E) -> R? +): ReceiveChannel = map(context, transform).filterNotNull() +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public fun ReceiveChannel.withIndex(context: CoroutineContext = Dispatchers.Unconfined): ReceiveChannel> = GlobalScope.produce(context, onCompletion = consumes()) { @@ -316,12 +372,16 @@ public fun ReceiveChannel.withIndex(context: CoroutineContext = Dispatche } } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public fun ReceiveChannel.distinct(): ReceiveChannel = this.distinctBy { it } @PublishedApi -internal fun ReceiveChannel.distinctBy(context: CoroutineContext = Dispatchers.Unconfined, selector: suspend (E) -> K): ReceiveChannel = +internal fun ReceiveChannel.distinctBy( + context: CoroutineContext = Dispatchers.Unconfined, + selector: suspend (E) -> K +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumes()) { val keys = HashSet() for (e in this@distinctBy) { @@ -337,12 +397,14 @@ internal fun ReceiveChannel.distinctBy(context: CoroutineContext = Dis internal suspend fun ReceiveChannel.toMutableSet(): MutableSet = toCollection(LinkedHashSet()) +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.any(): Boolean = consume { return iterator().hasNext() } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.count(): Int { var count = 0 @@ -350,6 +412,7 @@ public suspend fun ReceiveChannel.count(): Int { return count } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.maxWith(comparator: Comparator): E? = consume { @@ -363,6 +426,7 @@ public suspend fun ReceiveChannel.maxWith(comparator: Comparator): return max } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.minWith(comparator: Comparator): E? = consume { @@ -376,22 +440,29 @@ public suspend fun ReceiveChannel.minWith(comparator: Comparator): return min } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public suspend fun ReceiveChannel.none(): Boolean = consume { return !iterator().hasNext() } +/** @suppress **/ @Deprecated(message = "Left for binary compatibility", level = DeprecationLevel.HIDDEN) public fun ReceiveChannel.requireNoNulls(): ReceiveChannel = map { it ?: throw IllegalArgumentException("null element found in $this.") } +/** @suppress **/ @Deprecated(message = "Binary compatibility", level = DeprecationLevel.HIDDEN) public infix fun ReceiveChannel.zip(other: ReceiveChannel): ReceiveChannel> = zip(other) { t1, t2 -> t1 to t2 } @PublishedApi // Binary compatibility -internal fun ReceiveChannel.zip(other: ReceiveChannel, context: CoroutineContext = Dispatchers.Unconfined, transform: (a: E, b: R) -> V): ReceiveChannel = +internal fun ReceiveChannel.zip( + other: ReceiveChannel, + context: CoroutineContext = Dispatchers.Unconfined, + transform: (a: E, b: R) -> V +): ReceiveChannel = GlobalScope.produce(context, onCompletion = consumesAll(this, other)) { val otherIterator = other.iterator() this@zip.consumeEach { element1 -> diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt index 6686896766..04342ed074 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt @@ -309,6 +309,8 @@ private class CancellableFlowImpl(private val flow: Flow) : CancellableFlo * 3) It defers the execution of declarative [builder] until the moment of [collection][Flow.collect] similarly * to `Observable.defer`. But it is unexpected because nothing in the name `flowWith` reflects this fact. * 4) It can be confused with [flowOn] operator, though [flowWith] is much rarer. + * + * @suppress */ @FlowPreview @Deprecated(message = "flowWith is deprecated without replacement, please refer to its KDoc for an explanation", level = DeprecationLevel.ERROR) // Error in beta release, removal in 1.4 diff --git a/kotlinx-coroutines-core/common/src/internal/ConcurrentLinkedList.kt b/kotlinx-coroutines-core/common/src/internal/ConcurrentLinkedList.kt index 0e765838ab..638ec43200 100644 --- a/kotlinx-coroutines-core/common/src/internal/ConcurrentLinkedList.kt +++ b/kotlinx-coroutines-core/common/src/internal/ConcurrentLinkedList.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.internal import kotlinx.atomicfu.* import kotlinx.coroutines.* +import kotlin.jvm.* import kotlin.native.concurrent.SharedImmutable /** @@ -227,8 +228,8 @@ private inline fun AtomicInt.addConditionally(delta: Int, condition: (cur: Int) } } -@Suppress("EXPERIMENTAL_FEATURE_WARNING") // We are using inline class only internally, so it is Ok -internal inline class SegmentOrClosed>(private val value: Any?) { +@JvmInline +internal value class SegmentOrClosed>(private val value: Any?) { val isClosed: Boolean get() = value === CLOSED @Suppress("UNCHECKED_CAST") val segment: S get() = if (value === CLOSED) error("Does not contain segment") else value as S diff --git a/kotlinx-coroutines-core/common/src/internal/InlineList.kt b/kotlinx-coroutines-core/common/src/internal/InlineList.kt index 34c1e893ee..61bf6d01ad 100644 --- a/kotlinx-coroutines-core/common/src/internal/InlineList.kt +++ b/kotlinx-coroutines-core/common/src/internal/InlineList.kt @@ -7,14 +7,16 @@ package kotlinx.coroutines.internal import kotlinx.coroutines.assert +import kotlin.jvm.* /* * Inline class that represents a mutable list, but does not allocate an underlying storage * for zero and one elements. * Cannot be parametrized with `List<*>`. */ -internal inline class InlineList(private val holder: Any? = null) { - public operator fun plus(element: E): InlineList { +@JvmInline +internal value class InlineList(private val holder: Any? = null) { + operator fun plus(element: E): InlineList { assert { element !is List<*> } // Lists are prohibited return when (holder) { null -> InlineList(element) @@ -31,7 +33,7 @@ internal inline class InlineList(private val holder: Any? = null) { } } - public inline fun forEachReversed(action: (E) -> Unit) { + inline fun forEachReversed(action: (E) -> Unit) { when (holder) { null -> return !is ArrayList<*> -> action(holder as E) diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt index 2e4ba9ac0e..8512aebcc0 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelsJvmTest.kt @@ -25,7 +25,6 @@ class ChannelsJvmTest : TestBase() { assertEquals(45, runBlocking { sum.await() }) } - // Uncomment lines when migrated to 1.5, these are bugs in inline classes codegen @Test fun testTrySendBlockingClosedChannel() { run { @@ -33,7 +32,7 @@ class ChannelsJvmTest : TestBase() { channel.trySendBlocking(Unit) .onSuccess { expectUnreached() } .onFailure { assertTrue(it is ClosedSendChannelException) } -// .also { assertTrue { it.isClosed } } + .also { assertTrue { it.isClosed } } } run { @@ -41,7 +40,7 @@ class ChannelsJvmTest : TestBase() { channel.trySendBlocking(Unit) .onSuccess { expectUnreached() } .onFailure { assertTrue(it is TestException) } -// .also { assertTrue { it.isClosed } } + .also { assertTrue { it.isClosed } } } run { @@ -49,8 +48,7 @@ class ChannelsJvmTest : TestBase() { channel.trySendBlocking(Unit) .onSuccess { expectUnreached() } .onFailure { assertTrue(it is TestCancellationException) } -// .also { assertTrue { it.isClosed } } + .also { assertTrue { it.isClosed } } } } - } diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index b2e3f2cf53..43d94d1841 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -31,16 +31,6 @@ dependencies { api "net.java.dev.jna:jna-platform:$jna_version" } -// TODO: JVM IR generates different stacktrace so temporary disable stacktrace tests -if (rootProject.ext.jvm_ir_enabled) { - tasks.named('test', Test) { - filter { -// excludeTest('kotlinx.coroutines.debug.CoroutinesDumpTest', 'testCreationStackTrace') - excludeTestsMatching('kotlinx.coroutines.debug.DebugProbesTest') - } - } -} - java { /* This is needed to be able to run JUnit5 tests. Otherwise, Gradle complains that it can't find the JVM1.6-compatible version of the `junit-jupiter-api` artifact. */ diff --git a/reactive/kotlinx-coroutines-reactive/src/Await.kt b/reactive/kotlinx-coroutines-reactive/src/Await.kt index 067f5e8031..fef1205a8a 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Await.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Await.kt @@ -100,6 +100,8 @@ public suspend fun Publisher.awaitSingle(): T = awaitOne(Mode.SINGLE) * * @throws NoSuchElementException if the publisher does not emit any value * @throws IllegalArgumentException if the publisher emits more than one value + * + * @suppress */ @Deprecated( message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + @@ -127,6 +129,7 @@ public suspend fun Publisher.awaitSingleOrDefault(default: T): T = awaitO * meaning. * * @throws IllegalArgumentException if the publisher emits more than one value + * @suppress */ @Deprecated( message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + @@ -156,6 +159,7 @@ public suspend fun Publisher.awaitSingleOrNull(): T? = awaitOne(Mode.SING * meaning. * * @throws IllegalArgumentException if the publisher emits more than one value + * @suppress */ @Deprecated( message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + @@ -301,4 +305,4 @@ private fun gotSignalInTerminalStateException(context: CoroutineContext, signalN */ private fun moreThanOneValueProvidedException(context: CoroutineContext, mode: Mode) = handleCoroutineException(context, - IllegalStateException("Only a single value was requested in '$mode', but the publisher provided more")) \ No newline at end of file + IllegalStateException("Only a single value was requested in '$mode', but the publisher provided more")) diff --git a/reactive/kotlinx-coroutines-reactive/src/Migration.kt b/reactive/kotlinx-coroutines-reactive/src/Migration.kt index b949f22665..41927e67ec 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Migration.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Migration.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.* import org.reactivestreams.* // Binary compatibility with Spring 5.2 RC +/** @suppress */ @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactive.* instead of kotlinx.coroutines.reactive.FlowKt", level = DeprecationLevel.HIDDEN @@ -20,6 +21,7 @@ import org.reactivestreams.* public fun Publisher.asFlowDeprecated(): Flow = asFlow() // Binary compatibility with Spring 5.2 RC +/** @suppress */ @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactive.* instead of kotlinx.coroutines.reactive.FlowKt", level = DeprecationLevel.HIDDEN @@ -27,6 +29,7 @@ public fun Publisher.asFlowDeprecated(): Flow = asFlow() @JvmName("asPublisher") public fun Flow.asPublisherDeprecated(): Publisher = asPublisher() +/** @suppress */ @FlowPreview @Deprecated( message = "batchSize parameter is deprecated, use .buffer() instead to control the backpressure", diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 7ebe269436..4928a7439e 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -61,6 +61,7 @@ private const val CLOSED = -1L // closed, but have not signalled onCompleted/ private const val SIGNALLED = -2L // already signalled subscriber onCompleted/onError private val DEFAULT_HANDLER: (Throwable, CoroutineContext) -> Unit = { t, ctx -> if (t !is CancellationException) handleCoroutineException(ctx, t) } +/** @suppress */ @Suppress("CONFLICTING_JVM_DECLARATIONS", "RETURN_TYPE_MISMATCH_ON_INHERITANCE") @InternalCoroutinesApi public class PublisherCoroutine( diff --git a/reactive/kotlinx-coroutines-reactor/README.md b/reactive/kotlinx-coroutines-reactor/README.md index a895107b44..69157afc55 100644 --- a/reactive/kotlinx-coroutines-reactor/README.md +++ b/reactive/kotlinx-coroutines-reactor/README.md @@ -27,7 +27,6 @@ Conversion functions: | -------- | --------------- | [Job.asMono][kotlinx.coroutines.Job.asMono] | Converts a job to a hot Mono | [Deferred.asMono][kotlinx.coroutines.Deferred.asMono] | Converts a deferred value to a hot Mono -| [ReceiveChannel.asFlux][kotlinx.coroutines.channels.ReceiveChannel.asFlux] | Converts a streaming channel to a hot Flux | [Scheduler.asCoroutineDispatcher][reactor.core.scheduler.Scheduler.asCoroutineDispatcher] | Converts a scheduler to a [CoroutineDispatcher] @@ -50,7 +49,6 @@ Conversion functions: [ReactorContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/-reactor-context/index.html [kotlinx.coroutines.Job.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html [kotlinx.coroutines.Deferred.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html -[kotlinx.coroutines.channels.ReceiveChannel.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-flux.html [reactor.core.scheduler.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-reactor/src/Convert.kt b/reactive/kotlinx-coroutines-reactor/src/Convert.kt index 73cc336d0d..3063d1dda3 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Convert.kt @@ -42,6 +42,7 @@ public fun Deferred.asMono(context: CoroutineContext): Mono = mono(co * Every subscriber receives values from this channel in a **fan-out** fashion. If the are multiple subscribers, * they'll receive values in a round-robin way. * @param context -- the coroutine context from which the resulting flux is going to be signalled + * @suppress */ @Deprecated(message = "Deprecated in the favour of consumeAsFlow()", level = DeprecationLevel.ERROR, diff --git a/reactive/kotlinx-coroutines-reactor/src/Flux.kt b/reactive/kotlinx-coroutines-reactor/src/Flux.kt index 63168a443b..1e408d83e5 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Flux.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Flux.kt @@ -83,6 +83,9 @@ private fun Subscriber?.reject(t: Throwable) { onError(t) } +/** + * @suppress + */ @Deprecated( message = "CoroutineScope.flux is deprecated in favour of top-level flux", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-reactor/src/Migration.kt b/reactive/kotlinx-coroutines-reactor/src/Migration.kt index d5d84f5c2a..8da0db2d59 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Migration.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Migration.kt @@ -9,6 +9,7 @@ package kotlinx.coroutines.reactor import kotlinx.coroutines.flow.* import reactor.core.publisher.* +/** @suppress **/ @Deprecated( message = "Replaced in favor of ReactiveFlow extension, please import kotlinx.coroutines.reactor.* instead of kotlinx.coroutines.reactor.FlowKt", level = DeprecationLevel.HIDDEN diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index 67c1baa02d..e86d51c614 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -125,6 +125,9 @@ private class MonoCoroutine( override fun isDisposed(): Boolean = disposed } +/** + * @suppress + */ @Deprecated( message = "CoroutineScope.mono is deprecated in favour of top-level mono", level = DeprecationLevel.HIDDEN, @@ -148,6 +151,8 @@ public fun CoroutineScope.mono( * ``` * It looks like more than one value could be returned from `findById` and [awaitFirst] discards the extra elements, * when in fact, at most a single value can be present. + * + * @suppress */ @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + @@ -170,6 +175,8 @@ public suspend fun Mono.awaitFirst(): T = awaitSingle() * ``` * It looks like more than one value could be returned from `findById` and [awaitFirstOrDefault] discards the extra * elements, when in fact, at most a single value can be present. + * + * @suppress */ @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + @@ -192,6 +199,8 @@ public suspend fun Mono.awaitFirstOrDefault(default: T): T = awaitSingleO * ``` * It looks like more than one value could be returned from `findById` and [awaitFirstOrNull] discards the extra * elements, when in fact, at most a single value can be present. + * + * @suppress */ @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + @@ -214,6 +223,8 @@ public suspend fun Mono.awaitFirstOrNull(): T? = awaitSingleOrNull() * ``` * It looks like more than one value could be returned from `findById` and [awaitFirstOrElse] discards the extra * elements, when in fact, at most a single value can be present. + * + * @suppress */ @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + @@ -236,6 +247,8 @@ public suspend fun Mono.awaitFirstOrElse(defaultValue: () -> T): T = awai * ``` * It looks like more than one value could be returned from `findById` and [awaitLast] discards the initial elements, * when in fact, at most a single value can be present. + * + * @suppress */ @Deprecated( message = "Mono produces at most one value, so the last element is the same as the first. " + @@ -243,4 +256,4 @@ public suspend fun Mono.awaitFirstOrElse(defaultValue: () -> T): T = awai level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("this.awaitSingle()") ) // Warning since 1.5, error in 1.6 -public suspend fun Mono.awaitLast(): T = awaitSingle() \ No newline at end of file +public suspend fun Mono.awaitLast(): T = awaitSingle() diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index a8e247fc95..d9228409db 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -68,6 +68,7 @@ public fun ContextView.asCoroutineContext(): ReactorContext = ReactorContext(thi /** * Wraps the given [Context] into [ReactorContext], so it can be added to the coroutine's context * and later used via `coroutineContext[ReactorContext]`. + * @suppress */ @Deprecated("The more general version for ContextView should be used instead", level = DeprecationLevel.HIDDEN) public fun Context.asCoroutineContext(): ReactorContext = readOnly().asCoroutineContext() // `readOnly()` is zero-cost. @@ -76,4 +77,4 @@ public fun Context.asCoroutineContext(): ReactorContext = readOnly().asCoroutine * Updates the Reactor context in this [CoroutineContext], adding (or possibly replacing) some values. */ internal fun CoroutineContext.extendReactorContext(extensions: ContextView): CoroutineContext = - (this[ReactorContext]?.context?.putAll(extensions) ?: extensions).asCoroutineContext() \ No newline at end of file + (this[ReactorContext]?.context?.putAll(extensions) ?: extensions).asCoroutineContext() diff --git a/reactive/kotlinx-coroutines-rx2/README.md b/reactive/kotlinx-coroutines-rx2/README.md index b2078d29d9..d93f569ac9 100644 --- a/reactive/kotlinx-coroutines-rx2/README.md +++ b/reactive/kotlinx-coroutines-rx2/README.md @@ -25,9 +25,8 @@ Suspending extension functions and suspending iteration: | **Name** | **Description** | -------- | --------------- | [CompletableSource.await][io.reactivex.CompletableSource.await] | Awaits for completion of the completable value -| [MaybeSource.await][io.reactivex.MaybeSource.await] | Awaits for the value of the maybe and returns it or null -| [MaybeSource.awaitOrDefault][io.reactivex.MaybeSource.awaitOrDefault] | Awaits for the value of the maybe and returns it or default -| [MaybeSource.openSubscription][io.reactivex.MaybeSource.openSubscription] | Subscribes to maybe and returns [ReceiveChannel] +| [MaybeSource.awaitSingle][io.reactivex.MaybeSource.awaitSingle] | Awaits for the value of the maybe and returns it or throws an exception +| [MaybeSource.awaitSingleOrNull][io.reactivex.MaybeSource.awaitSingleOrNull] | Awaits for the value of the maybe and returns it or null | [SingleSource.await][io.reactivex.SingleSource.await] | Awaits for completion of the single value and returns it | [ObservableSource.awaitFirst][io.reactivex.ObservableSource.awaitFirst] | Awaits for the first value from the given observable | [ObservableSource.awaitFirstOrDefault][io.reactivex.ObservableSource.awaitFirstOrDefault] | Awaits for the first value from the given observable or default @@ -57,7 +56,6 @@ Conversion functions: [ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[ReceiveChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html @@ -75,9 +73,8 @@ Conversion functions: [Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-observable.html [ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flow.html [io.reactivex.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html -[io.reactivex.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html -[io.reactivex.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-or-default.html -[io.reactivex.MaybeSource.openSubscription]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/open-subscription.html +[io.reactivex.MaybeSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html +[io.reactivex.MaybeSource.awaitSingleOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single-or-null.html [io.reactivex.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html [io.reactivex.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first.html [io.reactivex.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-default.html diff --git a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt index d7b8ee26f6..0e0b47ebe8 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt @@ -76,6 +76,7 @@ public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: * * Deprecated in favor of [awaitSingleOrNull] in order to reflect that `null` can be returned to denote the absence of * a value, as opposed to throwing in such case. + * @suppress */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", @@ -97,6 +98,7 @@ public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() * * Deprecated in favor of [awaitSingleOrNull] for naming consistency (see the deprecation of [MaybeSource.await] for * details). + * @suppress */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", diff --git a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt index 51a5d54e1c..bb093b0793 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt @@ -18,6 +18,7 @@ import kotlinx.coroutines.reactive.* * * This API is deprecated in the favour of [Flow]. * [MaybeSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. + * @suppress */ @Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 public fun MaybeSource.openSubscription(): ReceiveChannel { @@ -32,6 +33,7 @@ public fun MaybeSource.openSubscription(): ReceiveChannel { * * This API is deprecated in the favour of [Flow]. * [ObservableSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. + * @suppress */ @Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 public fun ObservableSource.openSubscription(): ReceiveChannel { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt index 3f6c27a693..3f9153822b 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt @@ -60,6 +60,9 @@ private class RxCompletableCoroutine( } } +/** + * @suppress + */ @Deprecated( message = "CoroutineScope.rxCompletable is deprecated in favour of top-level rxCompletable", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt index 2aeb994de1..497c922ca5 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxConvert.kt @@ -149,6 +149,7 @@ public fun ReceiveChannel.asObservable(context: CoroutineContext): send(t) } +/** @suppress **/ @Suppress("UNUSED") // KT-42513 @JvmOverloads // binary compatibility @JvmName("from") @@ -156,6 +157,7 @@ public fun ReceiveChannel.asObservable(context: CoroutineContext): public fun Flow._asFlowable(context: CoroutineContext = EmptyCoroutineContext): Flowable = asFlowable(context) +/** @suppress **/ @Suppress("UNUSED") // KT-42513 @JvmOverloads // binary compatibility @JvmName("from") diff --git a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt index f3ae65aadf..c856bb4e18 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxFlowable.kt @@ -40,6 +40,7 @@ public fun rxFlowable( return Flowable.fromPublisher(publishInternal(GlobalScope, context, RX_HANDLER, block)) } +/** @suppress */ @Deprecated( message = "CoroutineScope.rxFlowable is deprecated in favour of top-level rxFlowable", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt index aa531c6ecf..ab713123d9 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxMaybe.kt @@ -61,6 +61,7 @@ private class RxMaybeCoroutine( } } +/** @suppress */ @Deprecated( message = "CoroutineScope.rxMaybe is deprecated in favour of top-level rxMaybe", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 7300b484c9..5f409815af 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -191,6 +191,7 @@ private class RxObservableCoroutine( } } +/** @suppress */ @Deprecated( message = "CoroutineScope.rxObservable is deprecated in favour of top-level rxObservable", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt index c7ad606eb6..27842a21ae 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxSingle.kt @@ -60,6 +60,7 @@ private class RxSingleCoroutine( } } +/** @suppress */ @Deprecated( message = "CoroutineScope.rxSingle is deprecated in favour of top-level rxSingle", level = DeprecationLevel.HIDDEN, diff --git a/reactive/kotlinx-coroutines-rx3/README.md b/reactive/kotlinx-coroutines-rx3/README.md index 6c5a6e9eb2..1530558ce2 100644 --- a/reactive/kotlinx-coroutines-rx3/README.md +++ b/reactive/kotlinx-coroutines-rx3/README.md @@ -25,8 +25,8 @@ Suspending extension functions and suspending iteration: | **Name** | **Description** | -------- | --------------- | [CompletableSource.await][io.reactivex.rxjava3.core.CompletableSource.await] | Awaits for completion of the completable value -| [MaybeSource.await][io.reactivex.rxjava3.core.MaybeSource.await] | Awaits for the value of the maybe and returns it or null -| [MaybeSource.awaitOrDefault][io.reactivex.rxjava3.core.MaybeSource.awaitOrDefault] | Awaits for the value of the maybe and returns it or default +| [MaybeSource.awaitSingle][io.reactivex.rxjava3.core.MaybeSource.awaitSingle] | Awaits for the value of the maybe and returns it or throws an exception +| [MaybeSource.awaitSingleOrNull][io.reactivex.rxjava3.core.MaybeSource.awaitSingleOrNull] | Awaits for the value of the maybe and returns it or null | [SingleSource.await][io.reactivex.rxjava3.core.SingleSource.await] | Awaits for completion of the single value and returns it | [ObservableSource.awaitFirst][io.reactivex.rxjava3.core.ObservableSource.awaitFirst] | Awaits for the first value from the given observable | [ObservableSource.awaitFirstOrDefault][io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault] | Awaits for the first value from the given observable or default @@ -73,8 +73,8 @@ Conversion functions: [Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-observable.html [ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flow.html [io.reactivex.rxjava3.core.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html -[io.reactivex.rxjava3.core.MaybeSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html -[io.reactivex.rxjava3.core.MaybeSource.awaitOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-or-default.html +[io.reactivex.rxjava3.core.MaybeSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html +[io.reactivex.rxjava3.core.MaybeSource.awaitSingleOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single-or-null.html [io.reactivex.rxjava3.core.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html [io.reactivex.rxjava3.core.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first.html [io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-default.html diff --git a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt index a4435b88e2..2a14cf7c6c 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt @@ -76,6 +76,8 @@ public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: * * Deprecated in favor of [awaitSingleOrNull] in order to reflect that `null` can be returned to denote the absence of * a value, as opposed to throwing in such case. + * + * @suppress */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", @@ -97,6 +99,8 @@ public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() * * Deprecated in favor of [awaitSingleOrNull] for naming consistency (see the deprecation of [MaybeSource.await] for * details). + * + * @suppress */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", diff --git a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt index dfe4c055f8..b4693a55e7 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxConvert.kt @@ -139,6 +139,7 @@ public fun Flow.asObservable(context: CoroutineContext = EmptyCorout public fun Flow.asFlowable(context: CoroutineContext = EmptyCoroutineContext): Flowable = Flowable.fromPublisher(asPublisher(context)) +/** @suppress */ @Suppress("UNUSED") // KT-42513 @JvmOverloads // binary compatibility @JvmName("from") @@ -146,6 +147,7 @@ public fun Flow.asFlowable(context: CoroutineContext = EmptyCoroutin public fun Flow._asFlowable(context: CoroutineContext = EmptyCoroutineContext): Flowable = asFlowable(context) +/** @suppress */ @Suppress("UNUSED") // KT-42513 @JvmOverloads // binary compatibility @JvmName("from") diff --git a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt index b1ec8047dd..ca8dd0d0ca 100644 --- a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt +++ b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt @@ -120,7 +120,7 @@ internal class HandlerContext private constructor( * @param handler a handler. * @param name an optional name for debugging. */ - public constructor( + constructor( handler: Handler, name: String? = null ) : this(handler, name, false) From 69c3ce31342f6aea7602da173fa7128f017365ee Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 8 Jul 2021 18:47:54 +0300 Subject: [PATCH 101/328] Update Dokka and Knit to their stable versions, remove bintray leftovers (#2811) --- build.gradle | 4 +-- buildSrc/build.gradle.kts | 7 +--- buildSrc/src/main/kotlin/CacheRedirector.kt | 36 +-------------------- gradle.properties | 4 +-- 4 files changed, 5 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 46adbf7555..e4b12ff3ad 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ buildscript { } repositories { - maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" } + mavenCentral() maven { url "https://plugins.gradle.org/m2/" } maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } mavenLocal() @@ -137,8 +137,6 @@ allprojects { * google should be first in the repository list because some of the play services * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution */ - mavenLocal() - maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" } google() mavenCentral() } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 4a3732c254..c54e226af1 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -12,16 +12,11 @@ val cacheRedirectorEnabled = System.getenv("CACHE_REDIRECTOR")?.toBoolean() == t val buildSnapshotTrain = properties["build_snapshot_train"]?.toString()?.toBoolean() == true repositories { - maven(url = "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/") - mavenLocal() - + mavenCentral() if (cacheRedirectorEnabled) { maven("https://cache-redirector.jetbrains.com/plugins.gradle.org/m2") - maven("https://cache-redirector.jetbrains.com/dl.bintray.com/kotlin/kotlin-dev") } else { maven("https://plugins.gradle.org/m2") - // Leftover until we migrated to Dokka 1.4.30 - maven("https://dl.bintray.com/kotlin/kotlin-dev") } maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") diff --git a/buildSrc/src/main/kotlin/CacheRedirector.kt b/buildSrc/src/main/kotlin/CacheRedirector.kt index 9f6efd2cdc..bcadd7364e 100644 --- a/buildSrc/src/main/kotlin/CacheRedirector.kt +++ b/buildSrc/src/main/kotlin/CacheRedirector.kt @@ -21,46 +21,15 @@ private val cacheRedirectorEnabled = System.getenv("CACHE_REDIRECTOR")?.toBoolea private val mirroredUrls = listOf( "https://cdn.azul.com/zulu/bin", "https://clojars.org/repo", - "https://dl.bintray.com/d10xa/maven", - "https://dl.bintray.com/groovy/maven", - "https://dl.bintray.com/jetbrains/maven-patched", - "https://dl.bintray.com/jetbrains/scala-plugin-deps", - "https://dl.bintray.com/kodein-framework/Kodein-DI", - "https://dl.bintray.com/konsoletyper/teavm", - "https://dl.bintray.com/kotlin/kotlin-dev", - "https://dl.bintray.com/kotlin/kotlin-eap", - "https://dl.bintray.com/kotlin/kotlinx.html", - "https://dl.bintray.com/kotlin/kotlinx", - "https://dl.bintray.com/kotlin/ktor", - "https://dl.bintray.com/scalacenter/releases", - "https://dl.bintray.com/scalamacros/maven", - "https://dl.bintray.com/kotlin/exposed", - "https://dl.bintray.com/cy6ergn0m/maven", - "https://dl.bintray.com/kotlin/kotlin-js-wrappers", "https://dl.google.com/android/repository", "https://dl.google.com/dl/android/maven2", "https://dl.google.com/dl/android/studio/ide-zips", "https://dl.google.com/go", "https://download.jetbrains.com", - "https://jcenter.bintray.com", - "https://jetbrains.bintray.com/dekaf", - "https://jetbrains.bintray.com/intellij-jbr", - "https://jetbrains.bintray.com/intellij-jdk", - "https://jetbrains.bintray.com/intellij-plugin-service", - "https://jetbrains.bintray.com/intellij-terraform", - "https://jetbrains.bintray.com/intellij-third-party-dependencies", - "https://jetbrains.bintray.com/jediterm", - "https://jetbrains.bintray.com/kotlin-native-dependencies", - "https://jetbrains.bintray.com/markdown", - "https://jetbrains.bintray.com/teamcity-rest-client", - "https://jetbrains.bintray.com/test-discovery", - "https://jetbrains.bintray.com/wormhole", "https://jitpack.io", "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev", "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/bootstrap", "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/eap", - "https://kotlin.bintray.com/dukat", - "https://kotlin.bintray.com/kotlin-dependencies", "https://oss.sonatype.org/content/repositories/releases", "https://oss.sonatype.org/content/repositories/snapshots", "https://oss.sonatype.org/content/repositories/staging", @@ -85,10 +54,7 @@ private val mirroredUrls = listOf( ) private val aliases = mapOf( - "https://repo.maven.apache.org/maven2" to "https://repo1.maven.org/maven2", // Maven Central - "https://kotlin.bintray.com/kotlin-dev" to "https://dl.bintray.com/kotlin/kotlin-dev", - "https://kotlin.bintray.com/kotlin-eap" to "https://dl.bintray.com/kotlin/kotlin-eap", - "https://kotlin.bintray.com/kotlinx" to "https://dl.bintray.com/kotlin/kotlinx" + "https://repo.maven.apache.org/maven2" to "https://repo1.maven.org/maven2" // Maven Central ) private fun URI.toCacheRedirectorUri() = URI("https://cache-redirector.jetbrains.com/$host/$path") diff --git a/gradle.properties b/gradle.properties index c7b9b65d22..3e557a8a78 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,10 @@ kotlin_version=1.5.20 junit_version=4.12 junit5_version=5.7.0 atomicfu_version=0.16.2 -knit_version=0.3.0-RC +knit_version=0.3.0 html_version=0.7.2 lincheck_version=2.14 -dokka_version=1.5.0-dev-106 +dokka_version=1.5.0 byte_buddy_version=1.10.9 reactor_version=3.4.1 reactive_streams_version=1.0.3 From 2a4c00bd2604be9088468ca73edd2a258e089eff Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 8 Jul 2021 19:14:24 +0300 Subject: [PATCH 102/328] Version 1.5.1 --- CHANGES.md | 18 ++++++++++++++++++ README.md | 14 +++++++------- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 656a818ea0..510c35accf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,23 @@ # Change log for kotlinx.coroutines +## Version 1.5.1 + +* Atomic `update`, `getAndUpdate`, and `updateAndGet` operations of `MutableStateFlow` (#2720). +* `Executor.asCoroutineDispatcher` implementation improvements (#2601): + * If the target executor is `ScheduledExecutorService`, then its `schedule` API is used for time-related coroutine operations. + * `RemoveOnCancelPolicy` is now part of the public contract. +* Introduced overloads for `Task.asDeferred` and `Task.await` that accept `CancellationTokenSource` for bidirectional cancellation (#2527). +* Reactive streams are updated to `1.0.3` (#2740). +* `CopyableThrowable` is allowed to modify the exception message during stacktrace recovery (#1931). +* `CoroutineDispatcher.releaseInterceptedContinuation` is now a `final` method (#2785). +* Closing a Handler underlying `Handler.asCoroutineDispatcher` now causes the dispatched coroutines to be canceled on `Dispatchers.IO (#2778)`. +* Kotlin is updated to 1.5.20. +* Fixed a spurious `ClassCastException` in `releaseInterceptedContinuation` and `IllegalStateException` from `tryReleaseClaimedContinuation` (#2736, #2768). +* Fixed inconsistent exception message during stacktrace recovery for non-suspending channel iterators (#2749). +* Fixed linear stack usage for `CompletableFuture.asDeferred` when the target future has a long chain of listeners (#2730). +* Any exceptions from `CoroutineDispatcher.isDispatchNeeded` are now considered as fatal and are propagated to the caller (#2733). +* Internal `DebugProbesKt` (used in the debugger implementation) are moved from `debug` to `core` module. + ## Version 1.5.0 Note that this is a full changelog relative to 1.4.3 version. Changelog relative to 1.5.0-RC can be found in the end. diff --git a/README.md b/README.md index 16cd49a9d0..3cdce4387b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.0/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.5.20-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.5.0 + 1.5.1 ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1' } ``` @@ -127,7 +127,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1") } ``` @@ -147,7 +147,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```groovy -implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' +implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1' ``` This gives you access to the Android [Dispatchers.Main] @@ -180,7 +180,7 @@ In common code that should get compiled for different platforms, you can add a d ```groovy commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1") } } ``` @@ -192,7 +192,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.0/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.1/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index 3e557a8a78..2983dd11a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.5.0-SNAPSHOT +version=1.5.1-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.5.20 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 77ecd67f6c..f7b8602236 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.0.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.1.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 30e1098041..622e81d50b 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -9,7 +9,7 @@ This package provides testing utilities for effectively testing coroutines. Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.1' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index 0f69c387e2..408a43d1e1 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 55aced2c04b5592c647136c9295c7462805975c4 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 13 Jul 2021 19:41:47 +0300 Subject: [PATCH 103/328] Migrate from deprecated API and fix compilation warnings where possible --- gradle.properties | 1 + gradle/opt-in.gradle | 1 + .../common/src/channels/AbstractChannel.kt | 1 + .../common/src/flow/SharedFlow.kt | 2 +- .../src/internal/StackTraceRecovery.common.kt | 1 + .../test/selects/SelectTimeoutDurationTest.kt | 16 ++++++++-------- .../jvm/src/channels/Actor.kt | 2 +- .../jvm/src/internal/StackTraceRecovery.kt | 1 + 8 files changed, 15 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2983dd11a0..7f20ac9a44 100644 --- a/gradle.properties +++ b/gradle.properties @@ -56,3 +56,4 @@ jekyll_version=4.0 org.gradle.jvmargs=-Xmx4g kotlin.mpp.enableCompatibilityMetadataVariant=true +kotlin.mpp.stability.nowarn=true diff --git a/gradle/opt-in.gradle b/gradle/opt-in.gradle index bcf6bebe94..22f022dbb5 100644 --- a/gradle/opt-in.gradle +++ b/gradle/opt-in.gradle @@ -3,6 +3,7 @@ */ ext.optInAnnotations = [ + "kotlin.RequiresOptIn", "kotlin.experimental.ExperimentalTypeInference", "kotlin.ExperimentalMultiplatform", "kotlinx.coroutines.DelicateCoroutinesApi", diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index bcf1921594..4751296c87 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -136,6 +136,7 @@ internal abstract class AbstractSendChannel( return sendSuspend(element) } + @Suppress("DEPRECATION") override fun offer(element: E): Boolean { // Temporary migration for offer users who rely on onUndeliveredElement try { diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index 9bcf088e95..d79e203464 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -469,7 +469,7 @@ private class SharedFlowImpl( // outside of the lock: register dispose on cancellation emitter?.let { cont.disposeOnCancellation(it) } // outside of the lock: resume slots if needed - for (cont in resumes) cont?.resume(Unit) + for (r in resumes) r?.resume(Unit) } private fun cancelEmitter(emitter: Emitter) = synchronized(this) { diff --git a/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt b/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt index b91f30d319..2d00768d7c 100644 --- a/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt @@ -20,6 +20,7 @@ internal expect fun recoverStackTrace(exception: E, continuation: /** * initCause on JVM, nop on other platforms */ +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") internal expect fun Throwable.initCause(cause: Throwable) /** diff --git a/kotlinx-coroutines-core/common/test/selects/SelectTimeoutDurationTest.kt b/kotlinx-coroutines-core/common/test/selects/SelectTimeoutDurationTest.kt index 66cb72a535..26d6f809b8 100644 --- a/kotlinx-coroutines-core/common/test/selects/SelectTimeoutDurationTest.kt +++ b/kotlinx-coroutines-core/common/test/selects/SelectTimeoutDurationTest.kt @@ -14,15 +14,15 @@ class SelectTimeoutDurationTest : TestBase() { fun testBasic() = runTest { expect(1) val result = select { - onTimeout(1000.milliseconds) { + onTimeout(Duration.milliseconds(1000)) { expectUnreached() "FAIL" } - onTimeout(100.milliseconds) { + onTimeout(Duration.milliseconds(100)) { expect(2) "OK" } - onTimeout(500.milliseconds) { + onTimeout(Duration.milliseconds(500)) { expectUnreached() "FAIL" } @@ -35,7 +35,7 @@ class SelectTimeoutDurationTest : TestBase() { fun testZeroTimeout() = runTest { expect(1) val result = select { - onTimeout(1.seconds) { + onTimeout(Duration.seconds(1)) { expectUnreached() "FAIL" } @@ -52,11 +52,11 @@ class SelectTimeoutDurationTest : TestBase() { fun testNegativeTimeout() = runTest { expect(1) val result = select { - onTimeout(1.seconds) { + onTimeout(Duration.seconds(1)) { expectUnreached() "FAIL" } - onTimeout(-10.milliseconds) { + onTimeout(-Duration.milliseconds(10)) { expect(2) "OK" } @@ -71,13 +71,13 @@ class SelectTimeoutDurationTest : TestBase() { val iterations =10_000 for (i in 0..iterations) { val result = selectUnbiased { - onTimeout(-1.seconds) { + onTimeout(-Duration.seconds(1)) { 0 } onTimeout(Duration.ZERO) { 1 } - onTimeout(1.seconds) { + onTimeout(Duration.seconds(1)) { expectUnreached() 2 } diff --git a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt index 96cda7b1af..4657bc7d1e 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt @@ -163,7 +163,7 @@ private class LazyActorCoroutine( return super.send(element) } - @Suppress("DEPRECATION_ERROR") + @Suppress("DEPRECATION") override fun offer(element: E): Boolean { start() return super.offer(element) diff --git a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt index 174c57b762..6153862e2a 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/StackTraceRecovery.kt @@ -216,6 +216,7 @@ internal actual typealias CoroutineStackFrame = kotlin.coroutines.jvm.internal.C @Suppress("ACTUAL_WITHOUT_EXPECT") internal actual typealias StackTraceElement = java.lang.StackTraceElement +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") internal actual fun Throwable.initCause(cause: Throwable) { // Resolved to member, verified by test initCause(cause) From b1aadee48a7e638f001d2a2c50404537ab387303 Mon Sep 17 00:00:00 2001 From: BattleShip Park Date: Thu, 15 Jul 2021 18:12:04 +0900 Subject: [PATCH 104/328] Update flow.md (#2822) --- docs/topics/flow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/flow.md b/docs/topics/flow.md index 7acc4f99a8..311411f8ef 100644 --- a/docs/topics/flow.md +++ b/docs/topics/flow.md @@ -157,7 +157,7 @@ Notice the following differences in the code with the [Flow] from the earlier ex * Values are _emitted_ from the flow using [emit][FlowCollector.emit] function. * Values are _collected_ from the flow using [collect][collect] function. -> We can replace [delay] with `Thread.sleep` in the body of `foo`'s `flow { ... }` and see that the main +> We can replace [delay] with `Thread.sleep` in the body of `simple`'s `flow { ... }` and see that the main > thread is blocked in this case. > {type="note"} From 2571516cd490bb49a432dee7bca803b2120b0459 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 16 Jul 2021 14:38:58 +0300 Subject: [PATCH 105/328] Fix js tests (#2824) * Properly detect asynchronous tests that try to use `runTest` multiple times * Refactor multi-shot tests * Wrap them in 'withContext(Job)' instead of 'runTest' to be properly working on JS * Skip few way too slow for JS tests only on JS platform Fixes #2820 --- .../common/test/CancelledParentAttachTest.kt | 130 +++++++++++------- .../common/test/TestBase.common.kt | 8 ++ .../channels/ChannelUndeliveredElementTest.kt | 42 +++--- .../test/flow/sharing/SharedFlowTest.kt | 8 +- kotlinx-coroutines-core/js/test/TestBase.kt | 29 +++- kotlinx-coroutines-core/jvm/test/TestBase.kt | 1 + .../native/test/TestBase.kt | 1 + 7 files changed, 145 insertions(+), 74 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt b/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt index 749bbfc921..9dd61b8012 100644 --- a/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt +++ b/kotlinx-coroutines-core/common/test/CancelledParentAttachTest.kt @@ -11,75 +11,105 @@ import kotlin.test.* class CancelledParentAttachTest : TestBase() { @Test - fun testAsync() = CoroutineStart.values().forEach(::testAsyncCancelledParent) + fun testAsync() = runTest { + CoroutineStart.values().forEach { testAsyncCancelledParent(it) } + } - private fun testAsyncCancelledParent(start: CoroutineStart) = - runTest({ it is CancellationException }) { - cancel() - expect(1) - val d = async(start = start) { 42 } - expect(2) - d.invokeOnCompletion { - finish(3) - reset() + private suspend fun testAsyncCancelledParent(start: CoroutineStart) { + try { + withContext(Job()) { + cancel() + expect(1) + val d = async(start = start) { 42 } + expect(2) + d.invokeOnCompletion { + finish(3) + reset() + } } + expectUnreached() + } catch (e: CancellationException) { + // Expected } + } @Test - fun testLaunch() = CoroutineStart.values().forEach(::testLaunchCancelledParent) + fun testLaunch() = runTest { + CoroutineStart.values().forEach { testLaunchCancelledParent(it) } + } - private fun testLaunchCancelledParent(start: CoroutineStart) = - runTest({ it is CancellationException }) { - cancel() - expect(1) - val d = launch(start = start) { } - expect(2) - d.invokeOnCompletion { - finish(3) - reset() + private suspend fun testLaunchCancelledParent(start: CoroutineStart) { + try { + withContext(Job()) { + cancel() + expect(1) + val d = launch(start = start) { } + expect(2) + d.invokeOnCompletion { + finish(3) + reset() + } } + expectUnreached() + } catch (e: CancellationException) { + // Expected } + } @Test - fun testProduce() = - runTest({ it is CancellationException }) { - cancel() - expect(1) - val d = produce { } - expect(2) - (d as Job).invokeOnCompletion { - finish(3) - reset() - } + fun testProduce() = runTest({ it is CancellationException }) { + cancel() + expect(1) + val d = produce { } + expect(2) + (d as Job).invokeOnCompletion { + finish(3) + reset() } + } @Test - fun testBroadcast() = CoroutineStart.values().forEach(::testBroadcastCancelledParent) + fun testBroadcast() = runTest { + CoroutineStart.values().forEach { testBroadcastCancelledParent(it) } + } - private fun testBroadcastCancelledParent(start: CoroutineStart) = - runTest({ it is CancellationException }) { - cancel() - expect(1) - val bc = broadcast(start = start) {} - expect(2) - (bc as Job).invokeOnCompletion { - finish(3) - reset() + private suspend fun testBroadcastCancelledParent(start: CoroutineStart) { + try { + withContext(Job()) { + cancel() + expect(1) + val bc = broadcast(start = start) {} + expect(2) + (bc as Job).invokeOnCompletion { + finish(3) + reset() + } } + expectUnreached() + } catch (e: CancellationException) { + // Expected } + } @Test - fun testScopes() { - testScope { coroutineScope { } } - testScope { supervisorScope { } } - testScope { flowScope { } } - testScope { withTimeout(Long.MAX_VALUE) { } } - testScope { withContext(Job()) { } } - testScope { withContext(CoroutineName("")) { } } + fun testScopes() = runTest { + testScope { coroutineScope { } } + testScope { supervisorScope { } } + testScope { flowScope { } } + testScope { withTimeout(Long.MAX_VALUE) { } } + testScope { withContext(Job()) { } } + testScope { withContext(CoroutineName("")) { } } } - private inline fun testScope(crossinline block: suspend () -> Unit) = runTest({ it is CancellationException }) { - cancel() - block() + private suspend inline fun testScope(crossinline block: suspend () -> Unit) { + try { + withContext(Job()) { + cancel() + block() + } + expectUnreached() + } catch (e: CancellationException) { + // Expected + } } } diff --git a/kotlinx-coroutines-core/common/test/TestBase.common.kt b/kotlinx-coroutines-core/common/test/TestBase.common.kt index 0ba80ee509..7ac696ddb8 100644 --- a/kotlinx-coroutines-core/common/test/TestBase.common.kt +++ b/kotlinx-coroutines-core/common/test/TestBase.common.kt @@ -14,6 +14,14 @@ public expect val isStressTest: Boolean public expect val stressTestMultiplier: Int public expect open class TestBase constructor() { + /* + * In common tests we emulate parameterized tests + * by iterating over parameters space in the single @Test method. + * This kind of tests is too slow for JS and does not fit into + * the default Mocha timeout, so we're using this flag to bail-out + * and run such tests only on JVM and K/N. + */ + public val isBoundByJsTestTimeout: Boolean public fun error(message: Any, cause: Throwable? = null): Nothing public fun expect(index: Int) public fun expectUnreached() diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt index 5513dab782..9915d38fe6 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt @@ -10,17 +10,19 @@ import kotlin.test.* class ChannelUndeliveredElementTest : TestBase() { @Test - fun testSendSuccessfully() = runAllKindsTest { kind -> - val channel = kind.create { it.cancel() } - val res = Resource("OK") - launch { - channel.send(res) + fun testSendSuccessfully() = runTest { + runAllKindsTest { kind -> + val channel = kind.create { it.cancel() } + val res = Resource("OK") + launch { + channel.send(res) + } + val ok = channel.receive() + assertEquals("OK", ok.value) + assertFalse(res.isCancelled) // was not cancelled + channel.close() + assertFalse(res.isCancelled) // still was not cancelled } - val ok = channel.receive() - assertEquals("OK", ok.value) - assertFalse(res.isCancelled) // was not cancelled - channel.close() - assertFalse(res.isCancelled) // still was not cancelled } @Test @@ -86,21 +88,23 @@ class ChannelUndeliveredElementTest : TestBase() { } @Test - fun testSendToClosedChannel() = runAllKindsTest { kind -> - val channel = kind.create { it.cancel() } - channel.close() // immediately close channel - val res = Resource("OK") - assertFailsWith { - channel.send(res) // send fails to closed channel, resource was not delivered + fun testSendToClosedChannel() = runTest { + runAllKindsTest { kind -> + val channel = kind.create { it.cancel() } + channel.close() // immediately close channel + val res = Resource("OK") + assertFailsWith { + channel.send(res) // send fails to closed channel, resource was not delivered + } + assertTrue(res.isCancelled) } - assertTrue(res.isCancelled) } - private fun runAllKindsTest(test: suspend CoroutineScope.(TestChannelKind) -> Unit) { + private suspend fun runAllKindsTest(test: suspend CoroutineScope.(TestChannelKind) -> Unit) { for (kind in TestChannelKind.values()) { if (kind.viaBroadcast) continue // does not support onUndeliveredElement try { - runTest { + withContext(Job()) { test(kind) } } catch(e: Throwable) { diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt index 32d88f3c99..4314739e34 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt @@ -439,7 +439,8 @@ class SharedFlowTest : TestBase() { } @Test - fun testDifferentBufferedFlowCapacities() { + fun testDifferentBufferedFlowCapacities() = runTest { + if (isBoundByJsTestTimeout) return@runTest // Too slow for JS, bounded by 2 sec. default JS timeout for (replay in 0..10) { for (extraBufferCapacity in 0..5) { if (replay == 0 && extraBufferCapacity == 0) continue // test only buffered shared flows @@ -456,7 +457,7 @@ class SharedFlowTest : TestBase() { } } - private fun testBufferedFlow(sh: MutableSharedFlow, replay: Int) = runTest { + private suspend fun testBufferedFlow(sh: MutableSharedFlow, replay: Int) = withContext(Job()) { reset() expect(1) val n = 100 // initially emitted to fill buffer @@ -678,6 +679,7 @@ class SharedFlowTest : TestBase() { @Test fun testStateFlowModel() = runTest { + if (isBoundByJsTestTimeout) return@runTest // Too slow for JS, bounded by 2 sec. default JS timeout val stateFlow = MutableStateFlow(null) val expect = modelLog(stateFlow) val sharedFlow = MutableSharedFlow( @@ -795,4 +797,4 @@ class SharedFlowTest : TestBase() { job.join() finish(5) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/js/test/TestBase.kt b/kotlinx-coroutines-core/js/test/TestBase.kt index 8b3d69a7f5..e3d0fdee2d 100644 --- a/kotlinx-coroutines-core/js/test/TestBase.kt +++ b/kotlinx-coroutines-core/js/test/TestBase.kt @@ -10,9 +10,11 @@ public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 public actual open class TestBase actual constructor() { + public actual val isBoundByJsTestTimeout = true private var actionIndex = 0 private var finished = false private var error: Throwable? = null + private var lastTestPromise: Promise<*>? = null /** * Throws [IllegalStateException] like `error` in stdlib, but also ensures that the test will not @@ -70,7 +72,6 @@ public actual open class TestBase actual constructor() { finished = false } - // todo: The dynamic (promise) result is a work-around for missing suspend tests, see KT-22228 @Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS") public actual fun runTest( expected: ((Throwable) -> Boolean)? = null, @@ -79,7 +80,29 @@ public actual open class TestBase actual constructor() { ): dynamic { var exCount = 0 var ex: Throwable? = null - return GlobalScope.promise(block = block, context = CoroutineExceptionHandler { context, e -> + /* + * This is an additional sanity check against `runTest` mis-usage on JS. + * The only way to write an async test on JS is to return Promise from the test function. + * _Just_ launching promise and returning `Unit` won't suffice as the underlying test framework + * won't be able to detect an asynchronous failure in a timely manner. + * We cannot detect such situations, but we can detect the most common erroneous pattern + * in our code base, an attempt to use multiple `runTest` in the same `@Test` method, + * which typically is a premise to the same error: + * ``` + * @Test + * fun incorrectTestForJs() { // <- promise is not returned + * for (parameter in parameters) { + * runTest { + * runTestForParameter(parameter) + * } + * } + * } + * ``` + */ + if (lastTestPromise != null) { + error("Attempt to run multiple asynchronous test within one @Test method") + } + val result = GlobalScope.promise(block = block, context = CoroutineExceptionHandler { context, e -> if (e is CancellationException) return@CoroutineExceptionHandler // are ignored exCount++ when { @@ -102,6 +125,8 @@ public actual open class TestBase actual constructor() { error?.let { throw it } check(actionIndex == 0 || finished) { "Expecting that 'finish(...)' was invoked, but it was not" } } + lastTestPromise = result + return result } } diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index 17238e873c..f74321d72e 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -50,6 +50,7 @@ public val stressTestMultiplierCbrt = cbrt(stressTestMultiplier.toDouble()).roun * ``` */ public actual open class TestBase actual constructor() { + public actual val isBoundByJsTestTimeout = false private var actionIndex = AtomicInteger() private var finished = AtomicBoolean() private var error = AtomicReference() diff --git a/kotlinx-coroutines-core/native/test/TestBase.kt b/kotlinx-coroutines-core/native/test/TestBase.kt index 890f029ca2..d6d5ce519a 100644 --- a/kotlinx-coroutines-core/native/test/TestBase.kt +++ b/kotlinx-coroutines-core/native/test/TestBase.kt @@ -8,6 +8,7 @@ public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 public actual open class TestBase actual constructor() { + public actual val isBoundByJsTestTimeout = false private var actionIndex = 0 private var finished = false private var error: Throwable? = null From a3429f7fb7b57f19ae6d2310af1d162950634d4e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 16 Jul 2021 16:02:36 +0300 Subject: [PATCH 106/328] =?UTF-8?q?Introduce=20TestResult=20into=20TestBas?= =?UTF-8?q?e=20as=20the=20first=20preparation=20step=20to=20m=E2=80=A6=20(?= =?UTF-8?q?#2827)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introduce TestResult into TestBase as the first preparation step to multiplatform tests * The goal of this change is to test our IDE and tooling tolerance to hack-ish TestResult --- .../common/test/TestBase.common.kt | 9 ++++++++- .../test/flow/operators/FlatMapMergeBaseTest.kt | 2 +- kotlinx-coroutines-core/js/test/PromiseTest.kt | 14 +++++++++++++- kotlinx-coroutines-core/js/test/TestBase.kt | 5 ++++- kotlinx-coroutines-core/jvm/test/TestBase.kt | 5 ++++- kotlinx-coroutines-core/native/test/TestBase.kt | 5 ++++- 6 files changed, 34 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/TestBase.common.kt b/kotlinx-coroutines-core/common/test/TestBase.common.kt index 7ac696ddb8..71c45769cb 100644 --- a/kotlinx-coroutines-core/common/test/TestBase.common.kt +++ b/kotlinx-coroutines-core/common/test/TestBase.common.kt @@ -13,6 +13,13 @@ import kotlin.test.* public expect val isStressTest: Boolean public expect val stressTestMultiplier: Int +/** + * The result of a multiplatform asynchronous test. + * Aliases into Unit on K/JVM and K/N, and into Promise on K/JS. + */ +@Suppress("NO_ACTUAL_FOR_EXPECT") +public expect class TestResult + public expect open class TestBase constructor() { /* * In common tests we emulate parameterized tests @@ -33,7 +40,7 @@ public expect open class TestBase constructor() { expected: ((Throwable) -> Boolean)? = null, unhandled: List<(Throwable) -> Boolean> = emptyList(), block: suspend CoroutineScope.() -> Unit - ) + ): TestResult } public suspend inline fun hang(onCancellation: () -> Unit) { diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt index 44376980cd..4095172dab 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt @@ -90,5 +90,5 @@ abstract class FlatMapMergeBaseTest : FlatMapBaseTest() { } @Test - abstract fun testFlatMapConcurrency() + abstract fun testFlatMapConcurrency(): TestResult } diff --git a/kotlinx-coroutines-core/js/test/PromiseTest.kt b/kotlinx-coroutines-core/js/test/PromiseTest.kt index d0f6b2b714..cc1297cd78 100644 --- a/kotlinx-coroutines-core/js/test/PromiseTest.kt +++ b/kotlinx-coroutines-core/js/test/PromiseTest.kt @@ -74,4 +74,16 @@ class PromiseTest : TestBase() { assertSame(d2, deferred) assertEquals("OK", d2.await()) } -} \ No newline at end of file + + @Test + fun testLeverageTestResult(): TestResult { + // Cannot use expect(..) here + var seq = 0 + val result = runTest { + ++seq + } + return result.then { + if (seq != 1) error("Unexpected result: $seq") + } + } +} diff --git a/kotlinx-coroutines-core/js/test/TestBase.kt b/kotlinx-coroutines-core/js/test/TestBase.kt index e3d0fdee2d..5f84d92216 100644 --- a/kotlinx-coroutines-core/js/test/TestBase.kt +++ b/kotlinx-coroutines-core/js/test/TestBase.kt @@ -9,6 +9,9 @@ import kotlin.js.* public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 +@Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") +public actual typealias TestResult = Promise + public actual open class TestBase actual constructor() { public actual val isBoundByJsTestTimeout = true private var actionIndex = 0 @@ -77,7 +80,7 @@ public actual open class TestBase actual constructor() { expected: ((Throwable) -> Boolean)? = null, unhandled: List<(Throwable) -> Boolean> = emptyList(), block: suspend CoroutineScope.() -> Unit - ): dynamic { + ): TestResult { var exCount = 0 var ex: Throwable? = null /* diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index f74321d72e..2192507d7d 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -30,6 +30,9 @@ public actual val stressTestMultiplier = stressTestMultiplierSqrt * stressTestMu public val stressTestMultiplierCbrt = cbrt(stressTestMultiplier.toDouble()).roundToInt() +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + /** * Base class for tests, so that tests for predictable scheduling of actions in multiple coroutines sharing a single * thread can be written. Use it like this: @@ -188,7 +191,7 @@ public actual open class TestBase actual constructor() { expected: ((Throwable) -> Boolean)? = null, unhandled: List<(Throwable) -> Boolean> = emptyList(), block: suspend CoroutineScope.() -> Unit - ) { + ): TestResult { var exCount = 0 var ex: Throwable? = null try { diff --git a/kotlinx-coroutines-core/native/test/TestBase.kt b/kotlinx-coroutines-core/native/test/TestBase.kt index d6d5ce519a..4ffa6c0b11 100644 --- a/kotlinx-coroutines-core/native/test/TestBase.kt +++ b/kotlinx-coroutines-core/native/test/TestBase.kt @@ -7,6 +7,9 @@ package kotlinx.coroutines public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + public actual open class TestBase actual constructor() { public actual val isBoundByJsTestTimeout = false private var actionIndex = 0 @@ -71,7 +74,7 @@ public actual open class TestBase actual constructor() { expected: ((Throwable) -> Boolean)? = null, unhandled: List<(Throwable) -> Boolean> = emptyList(), block: suspend CoroutineScope.() -> Unit - ) { + ): TestResult { var exCount = 0 var ex: Throwable? = null try { From 8b60fe87184cd8458624a50c58d5e5362397896f Mon Sep 17 00:00:00 2001 From: Angus Holder Date: Mon, 19 Jul 2021 16:16:59 +0100 Subject: [PATCH 107/328] Fix copy-paste mistake in Flow.runningFold() docs (#2836) --- kotlinx-coroutines-core/common/src/flow/operators/Transform.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt index 5929886495..a47ae776ca 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt @@ -93,7 +93,7 @@ public fun Flow.scan(initial: R, @BuilderInference operation: suspend * Note that initial value should be immutable (or should not be mutated) as it is shared between different collectors. * For example: * ``` - * flowOf(1, 2, 3).scan(emptyList()) { acc, value -> acc + value }.toList() + * flowOf(1, 2, 3).runningFold(emptyList()) { acc, value -> acc + value }.toList() * ``` * will produce `[], [1], [1, 2], [1, 2, 3]]`. */ From 3f62cb8a1c84052fbf3ccb95cbfeb05abf9f5c1c Mon Sep 17 00:00:00 2001 From: Pavel Semyonov <42832629+p7nov@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:51:04 +0700 Subject: [PATCH 108/328] docs: fix ToC and add module name (#2815) * docs: remove file stored in kotlin-web-site from coroutines TOC * docs: add unique webhelp module name --- docs/kc.tree | 1 - docs/project.ihp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kc.tree b/docs/kc.tree index bd37d87ff0..3074dd7103 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -8,7 +8,6 @@ start-page="coroutines-guide.md"> - diff --git a/docs/project.ihp b/docs/project.ihp index 20e44ec82e..d8da718e83 100644 --- a/docs/project.ihp +++ b/docs/project.ihp @@ -3,6 +3,7 @@ + From 3694ac9ef1921860e0b3c7aef2e2b9cdd751a920 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 20 Jul 2021 19:37:46 +0300 Subject: [PATCH 109/328] More precise SharedFlow lint message (#2830) --- kotlinx-coroutines-core/common/src/flow/operators/Lint.kt | 3 ++- .../common/test/flow/sharing/SharedFlowTest.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt b/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt index 858c885c1e..83f83e1e15 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Lint.kt @@ -83,7 +83,8 @@ public val FlowCollector<*>.coroutineContext: CoroutineContext get() = noImpl() @Deprecated( - message = "SharedFlow never completes, so this operator has no effect.", + message = "SharedFlow never completes, so this operator typically has not effect, it can only " + + "catch exceptions from 'onSubscribe' operator", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("this") ) diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt index 4314739e34..6e18b38f55 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt @@ -602,6 +602,7 @@ class SharedFlowTest : TestBase() { } @Test + @Suppress("DEPRECATION") // 'catch' fun onSubscriptionThrows() = runTest { expect(1) val sh = MutableSharedFlow(1) From f85b207261b6209a75c69b6f240399f5534710c6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 20 Jul 2021 19:37:58 +0300 Subject: [PATCH 110/328] Fixed a bug when onUndeliveredElement was invoked for normally-receive elements on JS (#2828) Fixes #2826 --- .../channels/ChannelUndeliveredElementTest.kt | 15 +++++++++++++++ .../js/src/internal/LinkedList.kt | 15 +++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt index 9915d38fe6..f26361f2f8 100644 --- a/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt +++ b/kotlinx-coroutines-core/common/test/channels/ChannelUndeliveredElementTest.kt @@ -123,4 +123,19 @@ class ChannelUndeliveredElementTest : TestBase() { check(!_cancelled.getAndSet(true)) { "Already cancelled" } } } + + @Test + fun testHandlerIsNotInvoked() = runTest { // #2826 + val channel = Channel { + expectUnreached() + } + + expect(1) + launch { + expect(2) + channel.receive() + } + channel.send(Unit) + finish(3) + } } diff --git a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt index f2711f50af..147b31dc3e 100644 --- a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt +++ b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt @@ -32,7 +32,18 @@ public open class LinkedListNode { this._prev = node } + /* + * Remove that is invoked as a virtual function with a + * potentially augmented behaviour. + * I.g. `LockFreeLinkedListHead` throws, while `SendElementWithUndeliveredHandler` + * invokes handler on remove + */ public open fun remove(): Boolean { + return removeImpl() + } + + @PublishedApi + internal fun removeImpl(): Boolean { if (_removed) return false val prev = this._prev val next = this._next @@ -76,7 +87,7 @@ public open class LinkedListNode { public fun removeFirstOrNull(): Node? { val next = _next if (next === this) return null - check(next.remove()) { "Should remove" } + check(next.removeImpl()) { "Should remove" } return next } @@ -85,7 +96,7 @@ public open class LinkedListNode { if (next === this) return null if (next !is T) return null if (predicate(next)) return next - check(next.remove()) { "Should remove" } + check(next.removeImpl()) { "Should remove" } return next } } From ea440c5b17b091a5463f08248b1f5efe675ef927 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 27 Jul 2021 20:30:44 +0300 Subject: [PATCH 111/328] Make helpRemove actually lock-free and address multiple chained removed nodes (#2795) * The previous version invoked correctPrev on the next node and bailed out fi it was removed, effectively blocking the progress of any attempts to remove previous node * Use helpRemovePrev in helpRemove that was actually implemented to avoid such problem Fixes #2590 --- .../jvm/src/internal/LockFreeLinkedList.kt | 2 +- kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt | 2 +- .../jvm/test/lincheck/MutexLincheckTest.kt | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt b/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt index caad1e3323..9bbc6dc9eb 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt @@ -259,7 +259,7 @@ public actual open class LockFreeLinkedListNode { // Helps with removal of this node public actual fun helpRemove() { // Note: this node must be already removed - (next as Removed).ref.correctPrev(null) + (next as Removed).ref.helpRemovePrev() } // Helps with removal of nodes that are previous to this diff --git a/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt index 2b4e91c02a..89bbbfd7ee 100644 --- a/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/AbstractLincheckTest.kt @@ -15,7 +15,7 @@ abstract class AbstractLincheckTest : VerifierState() { open fun StressOptions.customize(isStressTest: Boolean): StressOptions = this @Test - open fun modelCheckingTest() = ModelCheckingOptions() + fun modelCheckingTest() = ModelCheckingOptions() .iterations(if (isStressTest) 100 else 20) .invocationsPerIteration(if (isStressTest) 10_000 else 1_000) .commonConfiguration() diff --git a/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt b/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt index f7f59eef5e..a278985fdd 100644 --- a/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt +++ b/kotlinx-coroutines-core/jvm/test/lincheck/MutexLincheckTest.kt @@ -9,15 +9,10 @@ import kotlinx.coroutines.sync.* import org.jetbrains.kotlinx.lincheck.* import org.jetbrains.kotlinx.lincheck.annotations.Operation import org.jetbrains.kotlinx.lincheck.strategy.managed.modelchecking.* -import org.junit.* class MutexLincheckTest : AbstractLincheckTest() { private val mutex = Mutex() - override fun modelCheckingTest() { - // Ignored via empty body as the only way - } - @Operation fun tryLock() = mutex.tryLock() From bbd133581e154cbecdf95c70ede648c66c38d558 Mon Sep 17 00:00:00 2001 From: Leon Kiefer Date: Mon, 2 Aug 2021 11:21:43 +0200 Subject: [PATCH 112/328] Use setTimeout-based dispatcher on JS for ReactNative (#2846) Fixes #2843 --- kotlinx-coroutines-core/js/src/CoroutineContext.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/kotlinx-coroutines-core/js/src/CoroutineContext.kt b/kotlinx-coroutines-core/js/src/CoroutineContext.kt index e08345a1d2..b1c0c35a49 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineContext.kt @@ -13,12 +13,6 @@ private const val UNDEFINED = "undefined" internal external val process: dynamic internal actual fun createDefaultDispatcher(): CoroutineDispatcher = when { - // Check if we are running under ReactNative. We have to use NodeDispatcher under it. - // The problem is that ReactNative has a `window` object with `addEventListener`, but it does not really work. - // For details see https://github.com/Kotlin/kotlinx.coroutines/issues/236 - // The check for ReactNative is based on https://github.com/facebook/react-native/commit/3c65e62183ce05893be0822da217cb803b121c61 - jsTypeOf(navigator) != UNDEFINED && navigator != null && navigator.product == "ReactNative" -> - NodeDispatcher // Check if we are running under jsdom. WindowDispatcher doesn't work under jsdom because it accesses MessageEvent#source. // It is not implemented in jsdom, see https://github.com/jsdom/jsdom/blob/master/Changelog.md // "It's missing a few semantics, especially around origins, as well as MessageEvent source." @@ -27,7 +21,7 @@ internal actual fun createDefaultDispatcher(): CoroutineDispatcher = when { jsTypeOf(window) != UNDEFINED && window.asDynamic() != null && jsTypeOf(window.asDynamic().addEventListener) != UNDEFINED -> window.asCoroutineDispatcher() // If process is undefined (e.g. in NativeScript, #1404), use SetTimeout-based dispatcher - jsTypeOf(process) == UNDEFINED -> SetTimeoutDispatcher + jsTypeOf(process) == UNDEFINED || jsTypeOf(process.nextTick) == UNDEFINED -> SetTimeoutDispatcher // Fallback to NodeDispatcher when browser environment is not detected else -> NodeDispatcher } From 8baa73630ca45ee57af2707aefed4d5ac066914d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 2 Aug 2021 12:55:35 +0300 Subject: [PATCH 113/328] Migrate from deprecated API --- .../common/test/AsyncLazyTest.kt | 8 ++-- .../common/test/AsyncTest.kt | 4 +- .../test/AtomicCancellationCommonTest.kt | 2 +- .../common/test/CancellableResumeTest.kt | 4 +- .../common/test/UndispatchedResultTest.kt | 2 +- .../common/test/WithTimeoutDurationTest.kt | 28 ++++++------ .../test/WithTimeoutOrNullDurationTest.kt | 43 ++++++++++--------- .../common/test/WithTimeoutOrNullTest.kt | 3 +- .../common/test/flow/operators/CatchTest.kt | 2 +- .../test/flow/operators/DebounceTest.kt | 22 +++++----- .../common/test/flow/operators/OnEachTest.kt | 1 - .../common/test/flow/operators/SampleTest.kt | 11 +++-- .../SharingStartedWhileSubscribedTest.kt | 6 ++- .../common/test/flow/terminal/FoldTest.kt | 1 - .../common/test/flow/terminal/ReduceTest.kt | 3 +- .../js/src/CoroutineContext.kt | 2 +- kotlinx-coroutines-core/js/test/TestBase.kt | 2 +- 17 files changed, 72 insertions(+), 72 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/AsyncLazyTest.kt b/kotlinx-coroutines-core/common/test/AsyncLazyTest.kt index 5b23b64143..cd2401049e 100644 --- a/kotlinx-coroutines-core/common/test/AsyncLazyTest.kt +++ b/kotlinx-coroutines-core/common/test/AsyncLazyTest.kt @@ -76,7 +76,7 @@ class AsyncLazyTest : TestBase() { expected = { it is TestException } ) { expect(1) - val d = async(start = CoroutineStart.LAZY) { + val d = async(start = CoroutineStart.LAZY) { finish(3) throw TestException() } @@ -90,7 +90,7 @@ class AsyncLazyTest : TestBase() { expected = { it is TestException } ) { expect(1) - val d = async(start = CoroutineStart.LAZY) { + val d = async(start = CoroutineStart.LAZY) { expect(3) yield() // this has not effect, because parent coroutine is waiting finish(4) @@ -104,7 +104,7 @@ class AsyncLazyTest : TestBase() { @Test fun testCatchException() = runTest { expect(1) - val d = async(NonCancellable, start = CoroutineStart.LAZY) { + val d = async(NonCancellable, start = CoroutineStart.LAZY) { expect(3) throw TestException() } @@ -184,4 +184,4 @@ class AsyncLazyTest : TestBase() { assertEquals(d.await(), 42) // await shall throw CancellationException expectUnreached() } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/AsyncTest.kt b/kotlinx-coroutines-core/common/test/AsyncTest.kt index 3019ddeab1..c9f72cf411 100644 --- a/kotlinx-coroutines-core/common/test/AsyncTest.kt +++ b/kotlinx-coroutines-core/common/test/AsyncTest.kt @@ -43,7 +43,7 @@ class AsyncTest : TestBase() { @Test fun testSimpleException() = runTest(expected = { it is TestException }) { expect(1) - val d = async { + val d = async { finish(3) throw TestException() } @@ -170,7 +170,7 @@ class AsyncTest : TestBase() { @Test fun testDeferAndYieldException() = runTest(expected = { it is TestException }) { expect(1) - val d = async { + val d = async { expect(3) yield() // no effect, parent waiting finish(4) diff --git a/kotlinx-coroutines-core/common/test/AtomicCancellationCommonTest.kt b/kotlinx-coroutines-core/common/test/AtomicCancellationCommonTest.kt index a41013779a..3881eb2779 100644 --- a/kotlinx-coroutines-core/common/test/AtomicCancellationCommonTest.kt +++ b/kotlinx-coroutines-core/common/test/AtomicCancellationCommonTest.kt @@ -140,7 +140,7 @@ class AtomicCancellationCommonTest : TestBase() { val mutex = Mutex(true) // locked mutex val job = launch(start = CoroutineStart.UNDISPATCHED) { expect(2) - val result = select { // suspends + select { // suspends mutex.onLock { expect(4) "OK" diff --git a/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt b/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt index fbfa082555..bff971961b 100644 --- a/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt +++ b/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt @@ -82,7 +82,7 @@ class CancellableResumeTest : TestBase() { cont.invokeOnCancellation { expect(3) } ctx.cancel() expect(4) - cont.resume("OK") { cause -> + cont.resume("OK") { expect(5) } finish(6) @@ -108,7 +108,7 @@ class CancellableResumeTest : TestBase() { } ctx.cancel() expect(4) - cont.resume("OK") { cause -> + cont.resume("OK") { expect(5) throw TestException3("FAIL") // onCancellation block fails with exception } diff --git a/kotlinx-coroutines-core/common/test/UndispatchedResultTest.kt b/kotlinx-coroutines-core/common/test/UndispatchedResultTest.kt index e262572277..34b8164472 100644 --- a/kotlinx-coroutines-core/common/test/UndispatchedResultTest.kt +++ b/kotlinx-coroutines-core/common/test/UndispatchedResultTest.kt @@ -55,7 +55,7 @@ class UndispatchedResultTest : TestBase() { try { expect(1) // Will cancel its parent - async(context) { + async(context) { expect(2) throw TestException() }.await() diff --git a/kotlinx-coroutines-core/common/test/WithTimeoutDurationTest.kt b/kotlinx-coroutines-core/common/test/WithTimeoutDurationTest.kt index b91a87f0bd..efd55fe231 100644 --- a/kotlinx-coroutines-core/common/test/WithTimeoutDurationTest.kt +++ b/kotlinx-coroutines-core/common/test/WithTimeoutDurationTest.kt @@ -17,7 +17,7 @@ class WithTimeoutDurationTest : TestBase() { @Test fun testBasicNoSuspend() = runTest { expect(1) - val result = withTimeout(10.seconds) { + val result = withTimeout(Duration.seconds(10)) { expect(2) "OK" } @@ -31,7 +31,7 @@ class WithTimeoutDurationTest : TestBase() { @Test fun testBasicSuspend() = runTest { expect(1) - val result = withTimeout(10.seconds) { + val result = withTimeout(Duration.seconds(10)) { expect(2) yield() expect(3) @@ -54,7 +54,7 @@ class WithTimeoutDurationTest : TestBase() { } expect(2) // test that it does not yield to the above job when started - val result = withTimeout(1.seconds) { + val result = withTimeout(Duration.seconds(1)) { expect(3) yield() // yield only now expect(5) @@ -74,7 +74,7 @@ class WithTimeoutDurationTest : TestBase() { fun testYieldBlockingWithTimeout() = runTest( expected = { it is CancellationException } ) { - withTimeout(100.milliseconds) { + withTimeout(Duration.milliseconds(100)) { while (true) { yield() } @@ -87,7 +87,7 @@ class WithTimeoutDurationTest : TestBase() { @Test fun testWithTimeoutChildWait() = runTest { expect(1) - withTimeout(100.milliseconds) { + withTimeout(Duration.milliseconds(100)) { expect(2) // launch child with timeout launch { @@ -102,7 +102,7 @@ class WithTimeoutDurationTest : TestBase() { @Test fun testBadClass() = runTest { val bad = BadClass() - val result = withTimeout(100.milliseconds) { + val result = withTimeout(Duration.milliseconds(100)) { bad } assertSame(bad, result) @@ -118,9 +118,9 @@ class WithTimeoutDurationTest : TestBase() { fun testExceptionOnTimeout() = runTest { expect(1) try { - withTimeout(100.milliseconds) { + withTimeout(Duration.milliseconds(100)) { expect(2) - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) expectUnreached() "OK" } @@ -135,10 +135,10 @@ class WithTimeoutDurationTest : TestBase() { expected = { it is CancellationException } ) { expect(1) - withTimeout(100.milliseconds) { + withTimeout(Duration.milliseconds(100)) { expect(2) try { - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) } catch (e: CancellationException) { finish(3) } @@ -151,10 +151,10 @@ class WithTimeoutDurationTest : TestBase() { fun testSuppressExceptionWithAnotherException() = runTest { expect(1) try { - withTimeout(100.milliseconds) { + withTimeout(Duration.milliseconds(100)) { expect(2) try { - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) } catch (e: CancellationException) { expect(3) throw TestException() @@ -172,7 +172,7 @@ class WithTimeoutDurationTest : TestBase() { fun testNegativeTimeout() = runTest { expect(1) try { - withTimeout(-1.milliseconds) { + withTimeout(-Duration.milliseconds(1)) { expectUnreached() "OK" } @@ -187,7 +187,7 @@ class WithTimeoutDurationTest : TestBase() { expect(1) try { expect(2) - withTimeout(1.seconds) { + withTimeout(Duration.seconds(1)) { expect(3) throw TestException() } diff --git a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt index f72bb7d99d..b5777753b6 100644 --- a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt +++ b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt @@ -19,7 +19,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testBasicNoSuspend() = runTest { expect(1) - val result = withTimeoutOrNull(10.seconds) { + val result = withTimeoutOrNull(Duration.seconds(10)) { expect(2) "OK" } @@ -33,7 +33,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testBasicSuspend() = runTest { expect(1) - val result = withTimeoutOrNull(10.seconds) { + val result = withTimeoutOrNull(Duration.seconds(10)) { expect(2) yield() expect(3) @@ -56,7 +56,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { } expect(2) // test that it does not yield to the above job when started - val result = withTimeoutOrNull(1.seconds) { + val result = withTimeoutOrNull(Duration.seconds(1)) { expect(3) yield() // yield only now expect(5) @@ -74,7 +74,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testYieldBlockingWithTimeout() = runTest { expect(1) - val result = withTimeoutOrNull(100.milliseconds) { + val result = withTimeoutOrNull(Duration.milliseconds(100)) { while (true) { yield() } @@ -86,7 +86,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testSmallTimeout() = runTest { val channel = Channel(1) - val value = withTimeoutOrNull(1.milliseconds) { + val value = withTimeoutOrNull(Duration.milliseconds(1)) { channel.receive() } assertNull(value) @@ -94,7 +94,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testThrowException() = runTest(expected = {it is AssertionError}) { - withTimeoutOrNull(Duration.INFINITE) { + withTimeoutOrNull(Duration.INFINITE) { throw AssertionError() } } @@ -103,12 +103,13 @@ class WithTimeoutOrNullDurationTest : TestBase() { fun testInnerTimeout() = runTest( expected = { it is CancellationException } ) { - withTimeoutOrNull(1000.milliseconds) { - withTimeout(10.milliseconds) { + withTimeoutOrNull(Duration.milliseconds(1000)) { + withTimeout(Duration.milliseconds(10)) { while (true) { yield() } } + @Suppress("UNREACHABLE_CODE") expectUnreached() // will timeout } expectUnreached() // will timeout @@ -118,7 +119,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { fun testNestedTimeout() = runTest(expected = { it is TimeoutCancellationException }) { withTimeoutOrNull(Duration.INFINITE) { // Exception from this withTimeout is not suppressed by withTimeoutOrNull - withTimeout(10.milliseconds) { + withTimeout(Duration.milliseconds(10)) { delay(Duration.INFINITE) 1 } @@ -130,9 +131,9 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testOuterTimeout() = runTest { var counter = 0 - val result = withTimeoutOrNull(250.milliseconds) { + val result = withTimeoutOrNull(Duration.milliseconds(250)) { while (true) { - val inner = withTimeoutOrNull(100.milliseconds) { + val inner = withTimeoutOrNull(Duration.milliseconds(100)) { while (true) { yield() } @@ -148,7 +149,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testBadClass() = runTest { val bad = BadClass() - val result = withTimeoutOrNull(100.milliseconds) { + val result = withTimeoutOrNull(Duration.milliseconds(100)) { bad } assertSame(bad, result) @@ -163,9 +164,9 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testNullOnTimeout() = runTest { expect(1) - val result = withTimeoutOrNull(100.milliseconds) { + val result = withTimeoutOrNull(Duration.milliseconds(100)) { expect(2) - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) expectUnreached() "OK" } @@ -176,10 +177,10 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testSuppressExceptionWithResult() = runTest { expect(1) - val result = withTimeoutOrNull(100.milliseconds) { + val result = withTimeoutOrNull(Duration.milliseconds(100)) { expect(2) try { - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) } catch (e: CancellationException) { expect(3) } @@ -193,10 +194,10 @@ class WithTimeoutOrNullDurationTest : TestBase() { fun testSuppressExceptionWithAnotherException() = runTest { expect(1) try { - withTimeoutOrNull(100.milliseconds) { + withTimeoutOrNull(Duration.milliseconds(100)) { expect(2) try { - delay(1000.milliseconds) + delay(Duration.milliseconds(1000)) } catch (e: CancellationException) { expect(3) throw TestException() @@ -215,11 +216,11 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testNegativeTimeout() = runTest { expect(1) - var result = withTimeoutOrNull(-1.milliseconds) { + var result = withTimeoutOrNull(-Duration.milliseconds(1)) { expectUnreached() } assertNull(result) - result = withTimeoutOrNull(0.milliseconds) { + result = withTimeoutOrNull(Duration.milliseconds(0)) { expectUnreached() } assertNull(result) @@ -231,7 +232,7 @@ class WithTimeoutOrNullDurationTest : TestBase() { expect(1) try { expect(2) - withTimeoutOrNull(1000.milliseconds) { + withTimeoutOrNull(Duration.milliseconds(1000)) { expect(3) throw TestException() } diff --git a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt index 40d2758daa..90bcf2dac3 100644 --- a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt +++ b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt @@ -92,7 +92,7 @@ class WithTimeoutOrNullTest : TestBase() { @Test fun testThrowException() = runTest(expected = {it is AssertionError}) { - withTimeoutOrNull(Long.MAX_VALUE) { + withTimeoutOrNull(Long.MAX_VALUE) { throw AssertionError() } } @@ -107,6 +107,7 @@ class WithTimeoutOrNullTest : TestBase() { yield() } } + @Suppress("UNREACHABLE_CODE") expectUnreached() // will timeout } expectUnreached() // will timeout diff --git a/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt index eedfac2ea3..447eb73b5d 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt @@ -133,7 +133,7 @@ class CatchTest : TestBase() { .flowOn(d2) // flowOn with a different dispatcher introduces asynchrony so that all exceptions in the // upstream flows are handled before they go downstream - .onEach { value -> + .onEach { expectUnreached() // already cancelled } .catch { e -> diff --git a/kotlinx-coroutines-core/common/test/flow/operators/DebounceTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/DebounceTest.kt index ce75e598e9..aa0893e888 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/DebounceTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/DebounceTest.kt @@ -205,19 +205,19 @@ class DebounceTest : TestBase() { val flow = flow { expect(3) emit("A") - delay(1500.milliseconds) + delay(Duration.milliseconds(1500)) emit("B") - delay(500.milliseconds) + delay(Duration.milliseconds(500)) emit("C") - delay(250.milliseconds) + delay(Duration.milliseconds(250)) emit("D") - delay(2000.milliseconds) + delay(Duration.milliseconds(2000)) emit("E") expect(4) } expect(2) - val result = flow.debounce(1000.milliseconds).toList() + val result = flow.debounce(Duration.milliseconds(1000)).toList() assertEquals(listOf("A", "D", "E"), result) finish(5) } @@ -296,13 +296,13 @@ class DebounceTest : TestBase() { val flow = flow { expect(3) emit("A") - delay(1500.milliseconds) + delay(Duration.milliseconds(1500)) emit("B") - delay(500.milliseconds) + delay(Duration.milliseconds(500)) emit("C") - delay(250.milliseconds) + delay(Duration.milliseconds(250)) emit("D") - delay(2000.milliseconds) + delay(Duration.milliseconds(2000)) emit("E") expect(4) } @@ -310,9 +310,9 @@ class DebounceTest : TestBase() { expect(2) val result = flow.debounce { if (it == "C") { - 0.milliseconds + Duration.milliseconds(0) } else { - 1000.milliseconds + Duration.milliseconds(1000) } }.toList() diff --git a/kotlinx-coroutines-core/common/test/flow/operators/OnEachTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/OnEachTest.kt index bad9db9757..3c1ebfa005 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/OnEachTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/OnEachTest.kt @@ -42,7 +42,6 @@ class OnEachTest : TestBase() { }.onEach { latch.receive() throw TestException() - it + 1 }.catch { emit(42) } assertEquals(42, flow.single()) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt index 22a0d4a39a..87bee56f1d 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt @@ -268,7 +268,6 @@ class SampleTest : TestBase() { expect(2) yield() throw TestException() - it } assertFailsWith(flow) @@ -282,19 +281,19 @@ class SampleTest : TestBase() { val flow = flow { expect(3) emit("A") - delay(1500.milliseconds) + delay(Duration.milliseconds(1500)) emit("B") - delay(500.milliseconds) + delay(Duration.milliseconds(500)) emit("C") - delay(250.milliseconds) + delay(Duration.milliseconds(250)) emit("D") - delay(2000.milliseconds) + delay(Duration.milliseconds(2000)) emit("E") expect(4) } expect(2) - val result = flow.sample(1000.milliseconds).toList() + val result = flow.sample(Duration.milliseconds(1000)).toList() assertEquals(listOf("A", "B", "D"), result) finish(5) } diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt index bcf626e3e3..516bb2e291 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt @@ -30,11 +30,13 @@ class SharingStartedWhileSubscribedTest : TestBase() { @Test fun testDurationParams() { assertEquals(SharingStarted.WhileSubscribed(0), SharingStarted.WhileSubscribed(Duration.ZERO)) - assertEquals(SharingStarted.WhileSubscribed(10), SharingStarted.WhileSubscribed(10.milliseconds)) + assertEquals(SharingStarted.WhileSubscribed(10), SharingStarted.WhileSubscribed(Duration.milliseconds(10))) assertEquals(SharingStarted.WhileSubscribed(1000), SharingStarted.WhileSubscribed(1.seconds)) assertEquals(SharingStarted.WhileSubscribed(Long.MAX_VALUE), SharingStarted.WhileSubscribed(Duration.INFINITE)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 0), SharingStarted.WhileSubscribed(replayExpiration = Duration.ZERO)) - assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 3), SharingStarted.WhileSubscribed(replayExpiration = 3.milliseconds)) + assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 3), SharingStarted.WhileSubscribed( + replayExpiration = Duration.milliseconds(3) + )) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 7000), SharingStarted.WhileSubscribed(replayExpiration = 7.seconds)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = Long.MAX_VALUE), SharingStarted.WhileSubscribed(replayExpiration = Duration.INFINITE)) } diff --git a/kotlinx-coroutines-core/common/test/flow/terminal/FoldTest.kt b/kotlinx-coroutines-core/common/test/flow/terminal/FoldTest.kt index 3c88571378..9a920f1d5f 100644 --- a/kotlinx-coroutines-core/common/test/flow/terminal/FoldTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/terminal/FoldTest.kt @@ -47,7 +47,6 @@ class FoldTest : TestBase() { latch.receive() expect(4) throw TestException() - 42 // Workaround for KT-30642, return type should not be Nothing } } finish(6) diff --git a/kotlinx-coroutines-core/common/test/flow/terminal/ReduceTest.kt b/kotlinx-coroutines-core/common/test/flow/terminal/ReduceTest.kt index 99ee1d6641..8ba0b5efbc 100644 --- a/kotlinx-coroutines-core/common/test/flow/terminal/ReduceTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/terminal/ReduceTest.kt @@ -30,7 +30,7 @@ class ReduceTest : TestBase() { fun testNullableReduce() = runTest { val flow = flowOf(1, null, null, 2) var invocations = 0 - val sum = flow.reduce { acc, value -> + val sum = flow.reduce { _, value -> ++invocations value } @@ -67,7 +67,6 @@ class ReduceTest : TestBase() { latch.receive() expect(4) throw TestException() - 42 // Workaround for KT-30642, return type should not be Nothing } } finish(6) diff --git a/kotlinx-coroutines-core/js/src/CoroutineContext.kt b/kotlinx-coroutines-core/js/src/CoroutineContext.kt index b1c0c35a49..a98ea9732d 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineContext.kt @@ -4,8 +4,8 @@ package kotlinx.coroutines +import kotlinx.browser.* import kotlinx.coroutines.internal.* -import kotlin.browser.* import kotlin.coroutines.* private external val navigator: dynamic diff --git a/kotlinx-coroutines-core/js/test/TestBase.kt b/kotlinx-coroutines-core/js/test/TestBase.kt index 5f84d92216..cc7865ba07 100644 --- a/kotlinx-coroutines-core/js/test/TestBase.kt +++ b/kotlinx-coroutines-core/js/test/TestBase.kt @@ -105,7 +105,7 @@ public actual open class TestBase actual constructor() { if (lastTestPromise != null) { error("Attempt to run multiple asynchronous test within one @Test method") } - val result = GlobalScope.promise(block = block, context = CoroutineExceptionHandler { context, e -> + val result = GlobalScope.promise(block = block, context = CoroutineExceptionHandler { _, e -> if (e is CancellationException) return@CoroutineExceptionHandler // are ignored exCount++ when { From 7e762d324aeeb34b53390dee931569013809660e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 2 Aug 2021 13:36:34 +0300 Subject: [PATCH 114/328] Optimize mutex implementation (#2851) * Get rid of addLastIf and DCSS primitive during contention * Leverage constants returned by tryResume* and simplify signatures --- .../common/src/CancellableContinuation.kt | 4 ++ .../common/src/sync/Mutex.kt | 70 +++++++++++++------ 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt index b133b7935d..2c2f1b8ff6 100644 --- a/kotlinx-coroutines-core/common/src/CancellableContinuation.kt +++ b/kotlinx-coroutines-core/common/src/CancellableContinuation.kt @@ -81,6 +81,10 @@ public interface CancellableContinuation : Continuation { * Same as [tryResume] but with [onCancellation] handler that called if and only if the value is not * delivered to the caller because of the dispatch in the process, so that atomicity delivery * guaranteed can be provided by having a cancellation fallback. + * + * Implementation note: current implementation always returns RESUME_TOKEN or `null` + * + * @suppress **This is unstable API and it is subject to change.** */ @InternalCoroutinesApi public fun tryResume(value: T, idempotent: Any?, onCancellation: ((cause: Throwable) -> Unit)?): Any? diff --git a/kotlinx-coroutines-core/common/src/sync/Mutex.kt b/kotlinx-coroutines-core/common/src/sync/Mutex.kt index 7d0a343d95..19584e0981 100644 --- a/kotlinx-coroutines-core/common/src/sync/Mutex.kt +++ b/kotlinx-coroutines-core/common/src/sync/Mutex.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.internal.* import kotlinx.coroutines.intrinsics.* import kotlinx.coroutines.selects.* import kotlin.contracts.* -import kotlin.coroutines.* import kotlin.jvm.* import kotlin.native.concurrent.* @@ -124,8 +123,6 @@ private val LOCK_FAIL = Symbol("LOCK_FAIL") @SharedImmutable private val UNLOCK_FAIL = Symbol("UNLOCK_FAIL") @SharedImmutable -private val SELECT_SUCCESS = Symbol("SELECT_SUCCESS") -@SharedImmutable private val LOCKED = Symbol("LOCKED") @SharedImmutable private val UNLOCKED = Symbol("UNLOCKED") @@ -191,7 +188,7 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { } private suspend fun lockSuspend(owner: Any?) = suspendCancellableCoroutineReusable sc@ { cont -> - val waiter = LockCont(owner, cont) + var waiter = LockCont(owner, cont) _state.loop { state -> when (state) { is Empty -> { @@ -210,11 +207,24 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { is LockedQueue -> { val curOwner = state.owner check(curOwner !== owner) { "Already locked by $owner" } - if (state.addLastIf(waiter) { _state.value === state }) { - // added to waiter list! + + state.addLast(waiter) + /* + * If the state has been changed while we were adding the waiter, + * it means that 'unlock' has taken it and _either_ resumed it successfully or just overwritten. + * To rendezvous that, we try to "invalidate" our node and go for retry. + * + * Node has to be re-instantiated as we do not support node re-adding, even to + * another list + */ + if (_state.value === state || !waiter.take()) { + // added to waiter list cont.removeOnCancellation(waiter) return@sc } + + waiter = LockCont(owner, cont) + return@loop } is OpDescriptor -> state.perform(this) // help else -> error("Illegal state $state") @@ -252,8 +262,17 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { is LockedQueue -> { check(state.owner !== owner) { "Already locked by $owner" } val node = LockSelect(owner, select, block) - if (state.addLastIf(node) { _state.value === state }) { - // successfully enqueued + /* + * If the state has been changed while we were adding the waiter, + * it means that 'unlock' has taken it and _either_ resumed it successfully or just overwritten. + * To rendezvous that, we try to "invalidate" our node and go for retry. + * + * Node has to be re-instantiated as we do not support node re-adding, even to + * another list + */ + state.addLast(node) + if (_state.value === state || !node.take()) { + // added to waiter list select.disposeOnSelect(node) return } @@ -300,7 +319,7 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { } } - public override fun unlock(owner: Any?) { + override fun unlock(owner: Any?) { _state.loop { state -> when (state) { is Empty -> { @@ -319,10 +338,9 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { val op = UnlockOp(state) if (_state.compareAndSet(state, op) && op.perform(this) == null) return } else { - val token = (waiter as LockWaiter).tryResumeLockWaiter() - if (token != null) { + if ((waiter as LockWaiter).tryResumeLockWaiter()) { state.owner = waiter.owner ?: LOCKED - waiter.completeResumeLockWaiter(token) + waiter.completeResumeLockWaiter() return } } @@ -352,21 +370,28 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { private abstract inner class LockWaiter( @JvmField val owner: Any? ) : LockFreeLinkedListNode(), DisposableHandle { + private val isTaken = atomic(false) + fun take(): Boolean = isTaken.compareAndSet(false, true) final override fun dispose() { remove() } - abstract fun tryResumeLockWaiter(): Any? - abstract fun completeResumeLockWaiter(token: Any) + abstract fun tryResumeLockWaiter(): Boolean + abstract fun completeResumeLockWaiter() } private inner class LockCont( owner: Any?, - @JvmField val cont: CancellableContinuation + private val cont: CancellableContinuation ) : LockWaiter(owner) { - override fun tryResumeLockWaiter() = cont.tryResume(Unit, idempotent = null) { - // if this continuation gets cancelled during dispatch to the caller, then release the lock - unlock(owner) + + override fun tryResumeLockWaiter(): Boolean { + if (!take()) return false + return cont.tryResume(Unit, idempotent = null) { + // if this continuation gets cancelled during dispatch to the caller, then release the lock + unlock(owner) + } != null } - override fun completeResumeLockWaiter(token: Any) = cont.completeResume(token) - override fun toString(): String = "LockCont[$owner, $cont] for ${this@MutexImpl}" + + override fun completeResumeLockWaiter() = cont.completeResume(RESUME_TOKEN) + override fun toString(): String = "LockCont[$owner, ${cont}] for ${this@MutexImpl}" } private inner class LockSelect( @@ -374,9 +399,8 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { @JvmField val select: SelectInstance, @JvmField val block: suspend (Mutex) -> R ) : LockWaiter(owner) { - override fun tryResumeLockWaiter(): Any? = if (select.trySelect()) SELECT_SUCCESS else null - override fun completeResumeLockWaiter(token: Any) { - assert { token === SELECT_SUCCESS } + override fun tryResumeLockWaiter(): Boolean = take() && select.trySelect() + override fun completeResumeLockWaiter() { block.startCoroutineCancellable(receiver = this@MutexImpl, completion = select.completion) { // if this continuation gets cancelled during dispatch to the caller, then release the lock unlock(owner) From 8c98180f177bbe4b26f1ed9685a9280fea648b9c Mon Sep 17 00:00:00 2001 From: Pavel Semyonov <42832629+p7nov@users.noreply.github.com> Date: Fri, 6 Aug 2021 18:47:09 +0700 Subject: [PATCH 115/328] chore: wrap docs tree in chunk to include in Kotlin docs (#2861) --- docs/kc.tree | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/kc.tree b/docs/kc.tree index 3074dd7103..82877f44be 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -7,18 +7,19 @@ name="Kotlin coroutines" start-page="coroutines-guide.md"> - - - - - - - - - - - - - - + + + + + + + + + + + + + + + From 3c29d96e6c1557bc5369f84db90c23a733dfe00d Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Thu, 12 Aug 2021 11:25:08 +0200 Subject: [PATCH 116/328] Remove a duplicated word in the API doc of GlobalScope (#2874) --- kotlinx-coroutines-core/common/src/CoroutineScope.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index 627318f676..b7887dcd2f 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -185,7 +185,7 @@ public val CoroutineScope.isActive: Boolean * } * ``` * - * In top-level code, when launching a concurrent operation operation from a non-suspending context, an appropriately + * In top-level code, when launching a concurrent operation from a non-suspending context, an appropriately * confined instance of [CoroutineScope] shall be used instead of a `GlobalScope`. See docs on [CoroutineScope] for * details. * From dfca05f036ea2f886ecd9c761327bb2dbfd2c7c4 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 12 Aug 2021 12:49:44 +0300 Subject: [PATCH 117/328] Fix typo in the deprecation message of BroadcastChannel.asFlow() Fixes #2873 --- kotlinx-coroutines-core/common/src/flow/Channels.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 5cc8ad8b35..07a71366a6 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -171,7 +171,7 @@ private class ChannelAsFlow( */ @Deprecated( level = DeprecationLevel.WARNING, - message = "'BroadcastChannel' is obsolete and all coreresponding operators are deprecated " + + message = "'BroadcastChannel' is obsolete and all corresponding operators are deprecated " + "in the favour of StateFlow and SharedFlow" ) // Since 1.5.0, was @FlowPreview, safe to remove in 1.7.0 public fun BroadcastChannel.asFlow(): Flow = flow { From e123c8ab95f77413a771be13e8412cc2127e6417 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 12 Aug 2021 12:55:53 +0300 Subject: [PATCH 118/328] Minor documentation tweaks --- .../common/src/flow/Channels.kt | 2 +- .../common/test/AsyncTest.kt | 34 +++++++++++++++++++ .../jvm/test/AsyncJvmTest.kt | 5 ++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 07a71366a6..382953efcb 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -182,7 +182,7 @@ public fun BroadcastChannel.asFlow(): Flow = flow { * ### Deprecated * * **This API is deprecated.** The [BroadcastChannel] provides a complex channel-like API for hot flows. - * [SharedFlow] is a easier-to-use and more flow-centric API for the same purposes, so using + * [SharedFlow] is an easier-to-use and more flow-centric API for the same purposes, so using * [shareIn] operator is preferred. It is not a direct replacement, so please * study [shareIn] documentation to see what kind of shared flow fits your use-case. As a rule of thumb: * diff --git a/kotlinx-coroutines-core/common/test/AsyncTest.kt b/kotlinx-coroutines-core/common/test/AsyncTest.kt index c9f72cf411..2096a4d69e 100644 --- a/kotlinx-coroutines-core/common/test/AsyncTest.kt +++ b/kotlinx-coroutines-core/common/test/AsyncTest.kt @@ -266,4 +266,38 @@ class AsyncTest : TestBase() { assertFalse(deferred.isCancelled) } + @Test + fun testAsyncWithFinally() = runTest { + expect(1) + + @Suppress("UNREACHABLE_CODE") + val d = async { + expect(3) + try { + yield() // to main, will cancel + } finally { + expect(6) // will go there on await + return@async "Fail" // result will not override cancellation + } + expectUnreached() + "Fail2" + } + expect(2) + yield() // to async + expect(4) + check(d.isActive && !d.isCompleted && !d.isCancelled) + d.cancel() + check(!d.isActive && !d.isCompleted && d.isCancelled) + check(!d.isActive && !d.isCompleted && d.isCancelled) + expect(5) + try { + d.await() // awaits + expectUnreached() // does not complete normally + } catch (e: Throwable) { + expect(7) + check(e is CancellationException) + } + check(!d.isActive && d.isCompleted && d.isCancelled) + finish(8) + } } diff --git a/kotlinx-coroutines-core/jvm/test/AsyncJvmTest.kt b/kotlinx-coroutines-core/jvm/test/AsyncJvmTest.kt index 026752086c..59ff76a538 100644 --- a/kotlinx-coroutines-core/jvm/test/AsyncJvmTest.kt +++ b/kotlinx-coroutines-core/jvm/test/AsyncJvmTest.kt @@ -8,7 +8,10 @@ import kotlin.test.* class AsyncJvmTest : TestBase() { - // This must be a common test but it fails on JS because of KT-21961 + // We have the same test in common module, but the maintainer uses this particular file + // and semi-automatically types cmd+N + AsyncJvm in order to duck-tape any JVM samples/repros, + // please do not remove this test + @Test fun testAsyncWithFinally() = runTest { expect(1) From dabe24e7f3b98ee588324ded3d93f0b7e1df2a21 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Tue, 17 Aug 2021 16:33:58 +0200 Subject: [PATCH 119/328] Add a missing 'is' in the API doc of Job (#2883) --- kotlinx-coroutines-core/common/src/Job.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index be58213288..9552153aa9 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -168,7 +168,7 @@ public interface Job : CoroutineContext.Element { /** * Starts coroutine related to this job (if any) if it was not started yet. - * The result `true` if this invocation actually started coroutine or `false` + * The result is `true` if this invocation actually started coroutine or `false` * if it was already started or completed. */ public fun start(): Boolean From 3e89a175f0954f7fffb0f0de00a18babe3eac9f5 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 18 Aug 2021 14:16:41 +0300 Subject: [PATCH 120/328] Update binary compatibility validator to be compatible with upcoming Kotlin 1.6.0 (#2885) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7f20ac9a44..33049b2deb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.6.0 +binary_compatibility_validator_version=0.7.0 blockhound_version=1.0.2.RELEASE jna_version=5.5.0 From 4508b133b8717ccbe54549569c901f73279e97c0 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Mon, 23 Aug 2021 13:41:09 +0200 Subject: [PATCH 121/328] Fix a mistake in the API doc of CoroutineScope (#2888) --- kotlinx-coroutines-core/common/src/CoroutineScope.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index b7887dcd2f..3ed233bfb9 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -49,7 +49,7 @@ import kotlin.coroutines.intrinsics.* * * `CoroutineScope()` uses [Dispatchers.Default] for its coroutines. * * `MainScope()` uses [Dispatchers.Main] for its coroutines. * - * **The key part of custom usage of `CustomScope` is cancelling it and the end of the lifecycle.** + * **The key part of custom usage of `CustomScope` is cancelling it at the end of the lifecycle.** * The [CoroutineScope.cancel] extension function shall be used when the entity that was launching coroutines * is no longer needed. It cancels all the coroutines that might still be running on behalf of it. * From e5c6cf9e64ba4662667551c9050741010a2313b0 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Mon, 23 Aug 2021 13:43:38 +0200 Subject: [PATCH 122/328] Remove redundant 'that' (#2887) --- docs/topics/coroutine-context-and-dispatchers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index c35de0e084..9648214848 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -65,7 +65,7 @@ context of the main `runBlocking` coroutine which runs in the `main` thread. [Dispatchers.Unconfined] is a special dispatcher that also appears to run in the `main` thread, but it is, in fact, a different mechanism that is explained later. -The default dispatcher that is used when no other dispatcher is explicitly specified in the scope. +The default dispatcher is used when no other dispatcher is explicitly specified in the scope. It is represented by [Dispatchers.Default] and uses a shared background pool of threads. [newSingleThreadContext] creates a thread for the coroutine to run. From b5679abfbcae176f9fe54d8fa9f03b1843abe6e8 Mon Sep 17 00:00:00 2001 From: ebraminio Date: Mon, 23 Aug 2021 17:07:22 +0430 Subject: [PATCH 123/328] Update DebugProbesKt.bin exclusion instruction (#2889) raw exclude call is now deprecated and gives the following warning, This property is deprecated. Use resources.excludes or jniLibs.excludes instead. Use jniLibs.excludes for .so file patterns, and use resources.excludes for all other file patterns. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cdce4387b..6437ac72f6 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ normally and is only used by the debugger. To exclude it at no loss of functiona `android` block in your Gradle file for the application subproject: ```groovy packagingOptions { - exclude "DebugProbesKt.bin" + resources.excludes += "DebugProbesKt.bin" } ``` From 810f28f2f852f5944b34f2f5249374349686b522 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 23 Aug 2021 18:41:18 +0300 Subject: [PATCH 124/328] Verify that tests haven't written anything in the System.out (#2882) * Remove LF tests, each test has its stress on lincheck counterpart * Adjust failing tests, allow junit4 test printing to console --- .../jvm/test/FieldWalker.kt | 6 +- kotlinx-coroutines-core/jvm/test/TestBase.kt | 43 ++++- .../jvm/test/channels/ChannelLFStressTest.kt | 107 ----------- .../LockFreeLinkedListAtomicLFStressTest.kt | 169 ------------------ .../selects/SelectDeadlockLFStressTest.kt | 101 ----------- .../CoroutinesTimeoutDisabledTracesTest.kt | 2 +- .../test/junit4/CoroutinesTimeoutEagerTest.kt | 2 +- .../test/junit4/CoroutinesTimeoutTest.kt | 2 +- .../test/junit4/TestFailureValidation.kt | 4 +- 9 files changed, 42 insertions(+), 394 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test/channels/ChannelLFStressTest.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListAtomicLFStressTest.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/selects/SelectDeadlockLFStressTest.kt diff --git a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt index c4232d6e60..88feda421a 100644 --- a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt +++ b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt @@ -11,7 +11,6 @@ import java.util.* import java.util.Collections.* import java.util.concurrent.atomic.* import java.util.concurrent.locks.* -import kotlin.collections.ArrayList import kotlin.test.* object FieldWalker { @@ -154,8 +153,9 @@ object FieldWalker { while (true) { val fields = type.declaredFields.filter { !it.type.isPrimitive - && (statics || !Modifier.isStatic(it.modifiers)) - && !(it.type.isArray && it.type.componentType.isPrimitive) + && (statics || !Modifier.isStatic(it.modifiers)) + && !(it.type.isArray && it.type.componentType.isPrimitive) + && it.name != "previousOut" // System.out from TestBase that we store in a field to restore later } fields.forEach { it.isAccessible = true } // make them all accessible result.addAll(fields) diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index 2192507d7d..61a2c8b8b7 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -7,11 +7,10 @@ package kotlinx.coroutines import kotlinx.coroutines.internal.* import kotlinx.coroutines.scheduling.* import org.junit.* -import java.lang.Math.* +import java.io.* import java.util.* import java.util.concurrent.atomic.* import kotlin.coroutines.* -import kotlin.math.* import kotlin.test.* private val VERBOSE = systemProp("test.verbose", false) @@ -23,13 +22,13 @@ public actual val isStressTest = System.getProperty("stressTest")?.toBoolean() ? public val stressTestMultiplierSqrt = if (isStressTest) 5 else 1 +private const val SHUTDOWN_TIMEOUT = 1_000L // 1s at most to wait per thread + /** * Multiply various constants in stress tests by this factor, so that they run longer during nightly stress test. */ public actual val stressTestMultiplier = stressTestMultiplierSqrt * stressTestMultiplierSqrt -public val stressTestMultiplierCbrt = cbrt(stressTestMultiplier.toDouble()).roundToInt() - @Suppress("ACTUAL_WITHOUT_EXPECT") public actual typealias TestResult = Unit @@ -52,7 +51,10 @@ public actual typealias TestResult = Unit * } * ``` */ -public actual open class TestBase actual constructor() { +public actual open class TestBase(private var disableOutCheck: Boolean) { + + actual constructor(): this(false) + public actual val isBoundByJsTestTimeout = false private var actionIndex = AtomicInteger() private var finished = AtomicBoolean() @@ -62,9 +64,15 @@ public actual open class TestBase actual constructor() { private lateinit var threadsBefore: Set private val uncaughtExceptions = Collections.synchronizedList(ArrayList()) private var originalUncaughtExceptionHandler: Thread.UncaughtExceptionHandler? = null - private val SHUTDOWN_TIMEOUT = 1_000L // 1s at most to wait per thread + /* + * System.out that we redefine in order to catch any debugging/diagnostics + * 'println' from main source set. + * NB: We do rely on the name 'previousOut' in the FieldWalker in order to skip its + * processing + */ + private lateinit var previousOut: PrintStream - /** + /** * Throws [IllegalStateException] like `error` in stdlib, but also ensures that the test will not * complete successfully even if this exception is consumed somewhere in the test. */ @@ -117,7 +125,7 @@ public actual open class TestBase actual constructor() { } /** - * Asserts that this it the last action in the test. It must be invoked by any test that used [expect]. + * Asserts that this is the last action in the test. It must be invoked by any test that used [expect]. */ public actual fun finish(index: Int) { expect(index) @@ -137,6 +145,16 @@ public actual open class TestBase actual constructor() { finished.set(false) } + private object TestOutputStream : PrintStream(object : OutputStream() { + override fun write(b: Int) { + error("Detected unexpected call to 'println' from source code") + } + }) + + fun println(message: Any?) { + previousOut.println(message) + } + @Before fun before() { initPoolsBeforeTest() @@ -147,6 +165,10 @@ public actual open class TestBase actual constructor() { e.printStackTrace() uncaughtExceptions.add(e) } + if (!disableOutCheck) { + previousOut = System.out + System.setOut(TestOutputStream) + } } @After @@ -158,7 +180,7 @@ public actual open class TestBase actual constructor() { } // Shutdown all thread pools shutdownPoolsAfterTest() - // Check that that are now leftover threads + // Check that are now leftover threads runCatching { checkTestThreads(threadsBefore) }.onFailure { @@ -166,6 +188,9 @@ public actual open class TestBase actual constructor() { } // Restore original uncaught exception handler Thread.setDefaultUncaughtExceptionHandler(originalUncaughtExceptionHandler) + if (!disableOutCheck) { + System.setOut(previousOut) + } if (uncaughtExceptions.isNotEmpty()) { makeError("Expected no uncaught exceptions, but got $uncaughtExceptions") } diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelLFStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelLFStressTest.kt deleted file mode 100644 index 256ef62132..0000000000 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelLFStressTest.kt +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.channels - -import kotlinx.atomicfu.* -import kotlinx.coroutines.* -import java.util.concurrent.atomic.AtomicLong -import java.util.concurrent.atomic.AtomicLongArray -import kotlin.math.* -import kotlin.test.* - -/** - * Tests lock-freedom of send and receive operations on rendezvous and conflated channels. - * There is a single channel with two sender and two receiver threads. - * When one sender or receiver gets suspended at most one other operation is allowed to cease having progress - * (`allowSuspendedThreads = 1`). - * - * **Note**: In the current implementation buffered channels are not lock-free, so this test would fail - * if channel is created with a buffer. - */ -class ChannelLFStressTest : TestBase() { - private val nSeconds = 5 * stressTestMultiplier - private val env = LockFreedomTestEnvironment("ChannelLFStressTest", allowSuspendedThreads = 1) - private lateinit var channel: Channel - - private val sendIndex = AtomicLong() - private val receiveCount = AtomicLong() - private val duplicateCount = AtomicLong() - - private val nCheckedSize = 10_000_000 - private val nChecked = (nCheckedSize * Long.SIZE_BITS).toLong() - private val receivedBits = AtomicLongArray(nCheckedSize) // bit set of received values - - @Test - fun testRendezvousLockFreedom() { - channel = Channel() - performLockFreedomTest() - // ensure that all sent were received - checkAllReceived() - } - - private fun performLockFreedomTest() { - env.onCompletion { - // We must cancel the channel to abort both senders & receivers - channel.cancel(TestCompleted()) - } - repeat(2) { env.testThread("sender-$it") { sender() } } - repeat(2) { env.testThread("receiver-$it") { receiver() } } - env.performTest(nSeconds) { - println("Sent: $sendIndex, Received: $receiveCount, dups: $duplicateCount") - } - // ensure no duplicates - assertEquals(0L, duplicateCount.get()) - } - - private fun checkAllReceived() { - for (i in 0 until min(sendIndex.get(), nChecked)) { - assertTrue(isReceived(i)) - } - } - - private suspend fun sender() { - val value = sendIndex.getAndIncrement() - try { - channel.send(value) - } catch (e: TestCompleted) { - check(env.isCompleted) // expected when test was completed - markReceived(value) // fake received (actually failed to send) - } - } - - private suspend fun receiver() { - val value = try { - channel.receive() - } catch (e: TestCompleted) { - check(env.isCompleted) // expected when test was completed - return - } - receiveCount.incrementAndGet() - markReceived(value) - } - - private fun markReceived(value: Long) { - if (value >= nChecked) return // too big - val index = (value / Long.SIZE_BITS).toInt() - val mask = 1L shl (value % Long.SIZE_BITS).toInt() - while (true) { - val bits = receivedBits.get(index) - if (bits and mask != 0L) { - duplicateCount.incrementAndGet() - break - } - if (receivedBits.compareAndSet(index, bits, bits or mask)) break - } - } - - private fun isReceived(value: Long): Boolean { - val index = (value / Long.SIZE_BITS).toInt() - val mask = 1L shl (value % Long.SIZE_BITS).toInt() - val bits = receivedBits.get(index) - return bits and mask != 0L - } - - private class TestCompleted : CancellationException() -} diff --git a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListAtomicLFStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListAtomicLFStressTest.kt deleted file mode 100644 index 225b848186..0000000000 --- a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListAtomicLFStressTest.kt +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.internal - -import kotlinx.atomicfu.LockFreedomTestEnvironment -import kotlinx.coroutines.stressTestMultiplier -import org.junit.Test -import java.util.* -import java.util.concurrent.atomic.AtomicLong -import java.util.concurrent.atomic.AtomicReference -import kotlin.test.* - -/** - * This stress test has 4 threads adding randomly to the list and them immediately undoing - * this addition by remove, and 4 threads trying to remove nodes from two lists simultaneously (atomically). - */ -class LockFreeLinkedListAtomicLFStressTest { - private val env = LockFreedomTestEnvironment("LockFreeLinkedListAtomicLFStressTest") - - private data class Node(val i: Long) : LockFreeLinkedListNode() - - private val nSeconds = 5 * stressTestMultiplier - - private val nLists = 4 - private val nAdderThreads = 4 - private val nRemoverThreads = 4 - - private val lists = Array(nLists) { LockFreeLinkedListHead() } - - private val undone = AtomicLong() - private val missed = AtomicLong() - private val removed = AtomicLong() - private val error = AtomicReference() - private val index = AtomicLong() - - @Test - fun testStress() { - repeat(nAdderThreads) { threadId -> - val rnd = Random() - env.testThread(name = "adder-$threadId") { - when (rnd.nextInt(4)) { - 0 -> { - val list = lists[rnd.nextInt(nLists)] - val node = Node(index.incrementAndGet()) - addLastOp(list, node) - randomSpinWaitIntermission() - tryRemoveOp(node) - } - 1 -> { - // just to test conditional add - val list = lists[rnd.nextInt(nLists)] - val node = Node(index.incrementAndGet()) - addLastIfTrueOp(list, node) - randomSpinWaitIntermission() - tryRemoveOp(node) - } - 2 -> { - // just to test failed conditional add and burn some time - val list = lists[rnd.nextInt(nLists)] - val node = Node(index.incrementAndGet()) - addLastIfFalseOp(list, node) - } - 3 -> { - // add two atomically - val idx1 = rnd.nextInt(nLists - 1) - val idx2 = idx1 + 1 + rnd.nextInt(nLists - idx1 - 1) - check(idx1 < idx2) // that is our global order - val list1 = lists[idx1] - val list2 = lists[idx2] - val node1 = Node(index.incrementAndGet()) - val node2 = Node(index.incrementAndGet()) - addTwoOp(list1, node1, list2, node2) - randomSpinWaitIntermission() - tryRemoveOp(node1) - randomSpinWaitIntermission() - tryRemoveOp(node2) - } - else -> error("Cannot happen") - } - } - } - repeat(nRemoverThreads) { threadId -> - val rnd = Random() - env.testThread(name = "remover-$threadId") { - val idx1 = rnd.nextInt(nLists - 1) - val idx2 = idx1 + 1 + rnd.nextInt(nLists - idx1 - 1) - check(idx1 < idx2) // that is our global order - val list1 = lists[idx1] - val list2 = lists[idx2] - removeTwoOp(list1, list2) - } - } - env.performTest(nSeconds) { - val undone = undone.get() - val missed = missed.get() - val removed = removed.get() - println(" Adders undone $undone node additions") - println(" Adders missed $missed nodes") - println("Remover removed $removed nodes") - } - error.get()?.let { throw it } - assertEquals(missed.get(), removed.get()) - assertTrue(undone.get() > 0) - assertTrue(missed.get() > 0) - lists.forEach { it.validate() } - } - - private fun addLastOp(list: LockFreeLinkedListHead, node: Node) { - list.addLast(node) - } - - private fun addLastIfTrueOp(list: LockFreeLinkedListHead, node: Node) { - assertTrue(list.addLastIf(node) { true }) - } - - private fun addLastIfFalseOp(list: LockFreeLinkedListHead, node: Node) { - assertFalse(list.addLastIf(node) { false }) - } - - private fun addTwoOp(list1: LockFreeLinkedListHead, node1: Node, list2: LockFreeLinkedListHead, node2: Node) { - val add1 = list1.describeAddLast(node1) - val add2 = list2.describeAddLast(node2) - val op = object : AtomicOp() { - init { - add1.atomicOp = this - add2.atomicOp = this - } - override fun prepare(affected: Any?): Any? = - add1.prepare(this) ?: - add2.prepare(this) - - override fun complete(affected: Any?, failure: Any?) { - add1.complete(this, failure) - add2.complete(this, failure) - } - } - assertTrue(op.perform(null) == null) - } - - private fun tryRemoveOp(node: Node) { - if (node.remove()) - undone.incrementAndGet() - else - missed.incrementAndGet() - } - - private fun removeTwoOp(list1: LockFreeLinkedListHead, list2: LockFreeLinkedListHead) { - val remove1 = list1.describeRemoveFirst() - val remove2 = list2.describeRemoveFirst() - val op = object : AtomicOp() { - init { - remove1.atomicOp = this - remove2.atomicOp = this - } - override fun prepare(affected: Any?): Any? = - remove1.prepare(this) ?: - remove2.prepare(this) - - override fun complete(affected: Any?, failure: Any?) { - remove1.complete(this, failure) - remove2.complete(this, failure) - } - } - val success = op.perform(null) == null - if (success) removed.addAndGet(2) - } -} \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test/selects/SelectDeadlockLFStressTest.kt b/kotlinx-coroutines-core/jvm/test/selects/SelectDeadlockLFStressTest.kt deleted file mode 100644 index 4497bec5b9..0000000000 --- a/kotlinx-coroutines-core/jvm/test/selects/SelectDeadlockLFStressTest.kt +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.selects - -import kotlinx.atomicfu.* -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.* -import org.junit.* -import org.junit.Ignore -import org.junit.Test -import kotlin.math.* -import kotlin.test.* - -/** - * A stress-test on lock-freedom of select sending/receiving into opposite channels. - */ -class SelectDeadlockLFStressTest : TestBase() { - private val env = LockFreedomTestEnvironment("SelectDeadlockLFStressTest", allowSuspendedThreads = 1) - private val nSeconds = 5 * stressTestMultiplier - - private val c1 = Channel() - private val c2 = Channel() - - @Test - fun testLockFreedom() = testScenarios( - "s1r2", - "s2r1", - "r1s2", - "r2s1" - ) - - private fun testScenarios(vararg scenarios: String) { - env.onCompletion { - c1.cancel(TestCompleted()) - c2.cancel(TestCompleted()) - } - val t = scenarios.mapIndexed { i, scenario -> - val idx = i + 1L - TestDef(idx, "$idx [$scenario]", scenario) - } - t.forEach { it.test() } - env.performTest(nSeconds) { - t.forEach { println(it) } - } - } - - private inner class TestDef( - var sendIndex: Long = 0L, - val name: String, - scenario: String - ) { - var receiveIndex = 0L - - val clauses: List.() -> Unit> = ArrayList.() -> Unit>().apply { - require(scenario.length % 2 == 0) - for (i in scenario.indices step 2) { - val ch = when (val c = scenario[i + 1]) { - '1' -> c1 - '2' -> c2 - else -> error("Channel '$c'") - } - val clause = when (val op = scenario[i]) { - 's' -> fun SelectBuilder.() { sendClause(ch) } - 'r' -> fun SelectBuilder.() { receiveClause(ch) } - else -> error("Operation '$op'") - } - add(clause) - } - } - - fun test() = env.testThread(name) { - doSendReceive() - } - - private suspend fun doSendReceive() { - try { - select { - for (clause in clauses) clause() - } - } catch (e: TestCompleted) { - assertTrue(env.isCompleted) - } - } - - private fun SelectBuilder.sendClause(c: Channel) = - c.onSend(sendIndex) { - sendIndex += 4L - } - - private fun SelectBuilder.receiveClause(c: Channel) = - c.onReceive { i -> - receiveIndex = max(i, receiveIndex) - } - - override fun toString(): String = "$name: send=$sendIndex, received=$receiveIndex" - } - - private class TestCompleted : CancellationException() -} \ No newline at end of file diff --git a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt index 886007c3e8..2063090c82 100644 --- a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt +++ b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutDisabledTracesTest.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.* import org.junit.* import org.junit.runners.model.* -class CoroutinesTimeoutDisabledTracesTest : TestBase() { +class CoroutinesTimeoutDisabledTracesTest : TestBase(disableOutCheck = true) { @Rule @JvmField diff --git a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutEagerTest.kt b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutEagerTest.kt index 0845f5bcb3..7a686ff2a7 100644 --- a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutEagerTest.kt +++ b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutEagerTest.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.* import org.junit.* import org.junit.runners.model.* -class CoroutinesTimeoutEagerTest : TestBase() { +class CoroutinesTimeoutEagerTest : TestBase(disableOutCheck = true) { @Rule @JvmField diff --git a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutTest.kt b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutTest.kt index ac3408e20a..53447ac5f9 100644 --- a/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutTest.kt +++ b/kotlinx-coroutines-debug/test/junit4/CoroutinesTimeoutTest.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.* import org.junit.* import org.junit.runners.model.* -class CoroutinesTimeoutTest : TestBase() { +class CoroutinesTimeoutTest : TestBase(disableOutCheck = true) { @Rule @JvmField diff --git a/kotlinx-coroutines-debug/test/junit4/TestFailureValidation.kt b/kotlinx-coroutines-debug/test/junit4/TestFailureValidation.kt index 34ba679adb..6d25a6da7d 100644 --- a/kotlinx-coroutines-debug/test/junit4/TestFailureValidation.kt +++ b/kotlinx-coroutines-debug/test/junit4/TestFailureValidation.kt @@ -104,6 +104,6 @@ internal class TestFailureValidation(private val testsSpec: Map = listOf(), val notExpectedOutParts: - List = listOf(), val error: Class? = null + val testName: String, val expectedOutParts: List = listOf(), + val notExpectedOutParts: List = listOf(), val error: Class? = null ) From dbfb4aebfacc0b58da189a386a9614365ecaf643 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Tue, 24 Aug 2021 13:14:22 +0200 Subject: [PATCH 125/328] Fix the API doc of launchIn operator (#2893) --- kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt index d26839f9ea..771f8332c3 100644 --- a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt +++ b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt @@ -44,7 +44,7 @@ public suspend fun Flow<*>.collect(): Unit = collect(NopCollector) * .launchIn(uiScope) * ``` * - * Note that resulting value of [launchIn] is not used the provided scope takes care of cancellation. + * Note that the resulting value of [launchIn] is not used and the provided scope takes care of cancellation. */ public fun Flow.launchIn(scope: CoroutineScope): Job = scope.launch { collect() // tail-call From 50807d0babeafddc9fa56ad6f567d8e2ef002407 Mon Sep 17 00:00:00 2001 From: Mikhail Gostev Date: Thu, 26 Aug 2021 12:12:08 +0300 Subject: [PATCH 126/328] Fix typo in the documentation of CompletableJob#complete (#2900) Co-authored-by: Mikhail Gostev --- kotlinx-coroutines-core/common/src/CompletableJob.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CompletableJob.kt b/kotlinx-coroutines-core/common/src/CompletableJob.kt index f986d78760..beafdaf2ca 100644 --- a/kotlinx-coroutines-core/common/src/CompletableJob.kt +++ b/kotlinx-coroutines-core/common/src/CompletableJob.kt @@ -21,7 +21,7 @@ public interface CompletableJob : Job { * * Subsequent invocations of this function have no effect and always produce `false`. * - * This function transitions this job into _completed- state if it was not completed or cancelled yet. + * This function transitions this job into _completed_ state if it was not completed or cancelled yet. * However, that if this job has children, then it transitions into _completing_ state and becomes _complete_ * once all its children are [complete][isCompleted]. See [Job] for details. */ From d281a7cc15b6dcfd0e62179e6b266d5ac3e8ba3e Mon Sep 17 00:00:00 2001 From: Danil Pavlov Date: Thu, 26 Aug 2021 12:34:21 +0300 Subject: [PATCH 127/328] update: links to android resources added to references (#2898) --- docs/topics/coroutines-guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/topics/coroutines-guide.md b/docs/topics/coroutines-guide.md index 3d857991a1..0c6432f61c 100644 --- a/docs/topics/coroutines-guide.md +++ b/docs/topics/coroutines-guide.md @@ -34,3 +34,5 @@ In order to use coroutines as well as follow the examples in this guide, you nee * [Guide to UI programming with coroutines](https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md) * [Coroutines design document (KEEP)](https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md) * [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines) +* [Best practices for coroutines in Android](https://developer.android.com/kotlin/coroutines/coroutines-best-practices) +* [Additional Android resources for Kotlin coroutines and flow](https://developer.android.com/kotlin/coroutines/additional-resources) From dfa1b6342e4cfb5316f87cb6fc3145d172f9b436 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 26 Aug 2021 13:33:09 +0300 Subject: [PATCH 128/328] Update Kotlin (#2902) * Update Kotlin to 1.5.30 * Add new M1 targets --- README.md | 8 ++++---- gradle.properties | 4 ++-- gradle/compile-native-multiplatform.gradle | 4 ++++ .../test/CoroutineDispatcherOperatorFunInvokeTest.kt | 1 - kotlinx-coroutines-core/common/test/flow/VirtualTime.kt | 1 - kotlinx-coroutines-core/jvm/test/FieldWalker.kt | 1 + 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3cdce4387b..99ae18b475 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.5.20-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.5.30-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.5.20` release. +This is a companion version for the Kotlin `1.5.30` release. ```kotlin suspend fun main() = coroutineScope { @@ -91,7 +91,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.5.20 + 1.5.30 ``` @@ -109,7 +109,7 @@ And make sure that you use the latest Kotlin version: ```groovy buildscript { - ext.kotlin_version = '1.5.20' + ext.kotlin_version = '1.5.30' } ``` diff --git a/gradle.properties b/gradle.properties index 33049b2deb..4c5e747e12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,12 +5,12 @@ # Kotlin version=1.5.1-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.5.20 +kotlin_version=1.5.30 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.16.2 +atomicfu_version=0.16.3 knit_version=0.3.0 html_version=0.7.2 lincheck_version=2.14 diff --git a/gradle/compile-native-multiplatform.gradle b/gradle/compile-native-multiplatform.gradle index 73e99e8465..0a247ede9a 100644 --- a/gradle/compile-native-multiplatform.gradle +++ b/gradle/compile-native-multiplatform.gradle @@ -25,6 +25,10 @@ kotlin { addTarget(presets.watchosArm64) addTarget(presets.watchosX86) addTarget(presets.watchosX64) + addTarget(presets.iosSimulatorArm64) + addTarget(presets.watchosSimulatorArm64) + addTarget(presets.tvosSimulatorArm64) + addTarget(presets.macosArm64) } sourceSets { diff --git a/kotlinx-coroutines-core/common/test/CoroutineDispatcherOperatorFunInvokeTest.kt b/kotlinx-coroutines-core/common/test/CoroutineDispatcherOperatorFunInvokeTest.kt index 6fdd3bbe8b..e6b340cc62 100644 --- a/kotlinx-coroutines-core/common/test/CoroutineDispatcherOperatorFunInvokeTest.kt +++ b/kotlinx-coroutines-core/common/test/CoroutineDispatcherOperatorFunInvokeTest.kt @@ -65,7 +65,6 @@ class CoroutineDispatcherOperatorFunInvokeTest : TestBase() { dispatcher.dispatch(context, block) } - @ExperimentalCoroutinesApi override fun isDispatchNeeded(context: CoroutineContext): Boolean { return dispatcher.isDispatchNeeded(context) } diff --git a/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt b/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt index b2d957be46..bba5c6bd87 100644 --- a/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt +++ b/kotlinx-coroutines-core/common/test/flow/VirtualTime.kt @@ -48,7 +48,6 @@ internal class VirtualTimeDispatcher(enclosingScope: CoroutineScope) : Coroutine originalDispatcher.dispatch(context, block) } - @ExperimentalCoroutinesApi override fun isDispatchNeeded(context: CoroutineContext): Boolean = originalDispatcher.isDispatchNeeded(context) override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { diff --git a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt index 88feda421a..179b2e5e6e 100644 --- a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt +++ b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt @@ -89,6 +89,7 @@ object FieldWalker { cur = ref.parent path += "[${ref.index}]" } + else -> error("Should not be reached") } } path.reverse() From 3dcc3497ac104758989cbdedac1a8455e9989b7e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 26 Aug 2021 13:33:22 +0300 Subject: [PATCH 129/328] Make supervisor samples runnable (#2897) Fixes #2896 --- docs/topics/exception-handling.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index 3facd51a22..35e645f4b6 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -364,6 +364,7 @@ only downwards. This can easily be demonstrated using the following example: import kotlinx.coroutines.* fun main() = runBlocking { +//sampleStart val supervisor = SupervisorJob() with(CoroutineScope(coroutineContext + supervisor)) { // launch the first child -- its exception is ignored for this example (don't do this in practice!) @@ -389,8 +390,10 @@ fun main() = runBlocking { supervisor.cancel() secondChild.join() } +//sampleEnd } ``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-supervision-01.kt). > @@ -418,6 +421,7 @@ import kotlin.coroutines.* import kotlinx.coroutines.* fun main() = runBlocking { +//sampleStart try { supervisorScope { val child = launch { @@ -436,8 +440,10 @@ fun main() = runBlocking { } catch(e: AssertionError) { println("Caught an assertion error") } +//sampleEnd } ``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-supervision-02.kt). > @@ -468,6 +474,7 @@ import kotlin.coroutines.* import kotlinx.coroutines.* fun main() = runBlocking { +//sampleStart val handler = CoroutineExceptionHandler { _, exception -> println("CoroutineExceptionHandler got $exception") } @@ -479,8 +486,10 @@ fun main() = runBlocking { println("The scope is completing") } println("The scope is completed") +//sampleEnd } ``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-supervision-03.kt). > From 45547c068a1726d02a16a6422077285533e4deb6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 26 Aug 2021 19:56:17 +0300 Subject: [PATCH 130/328] Version 1.5.2 --- CHANGES.md | 10 ++++++++++ README.md | 14 +++++++------- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 510c35accf..611e9c9c74 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,15 @@ # Change log for kotlinx.coroutines +## Version 1.5.2 + +* Kotlin is updated to 1.5.30. +* New native targets for Apple Silicon are introduced. +* Fixed a bug when `onUndeliveredElement` was incorrectly called on a properly received elements on JS (#2826). +* Fixed `Dispatchers.Default` on React Native, it now fully relies on `setTimeout` instead of stub `process.nextTick`. Thanks to @Legion2 (#2843). +* Optimizations of `Mutex` implementation (#2581). +* `Mutex` implementation is made completely lock-free as stated (#2590). +* Various documentation and guides improvements. Thanks to @MasoodFallahpoor and @Pihanya. + ## Version 1.5.1 * Atomic `update`, `getAndUpdate`, and `updateAndGet` operations of `MutableStateFlow` (#2720). diff --git a/README.md b/README.md index 108b79a5dd..6a13f07aa3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.1/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.5.30-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.5.1 + 1.5.2 ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' } ``` @@ -127,7 +127,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2") } ``` @@ -147,7 +147,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```groovy -implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1' +implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' ``` This gives you access to the Android [Dispatchers.Main] @@ -180,7 +180,7 @@ In common code that should get compiled for different platforms, you can add a d ```groovy commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2") } } ``` @@ -192,7 +192,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.1/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.2/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index 4c5e747e12..26e5147c51 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.5.1-SNAPSHOT +version=1.5.2-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.5.30 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index f7b8602236..cd71f580f0 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.1.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.2.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 622e81d50b..43ae18f532 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -9,7 +9,7 @@ This package provides testing utilities for effectively testing coroutines. Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.1' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index 408a43d1e1..71b2d69c5c 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 6055432cc1bbefefda3ddc876052bc5e202a88f2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 2 Sep 2021 12:14:53 +0300 Subject: [PATCH 131/328] Fix BlockHound false positive in stack trace recovery (#2895) Fixes #2894 --- .../{ExceptionsConstuctor.kt => ExceptionsConstructor.kt} | 0 kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt | 2 ++ 2 files changed, 2 insertions(+) rename kotlinx-coroutines-core/jvm/src/internal/{ExceptionsConstuctor.kt => ExceptionsConstructor.kt} (100%) diff --git a/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstuctor.kt b/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt similarity index 100% rename from kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstuctor.kt rename to kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index 190476c41a..e0905567d6 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -19,6 +19,8 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { allowServiceLoaderInvocationsOnInit() allowBlockingCallsInReflectionImpl() allowBlockingCallsInDebugProbes() + // Stacktrace recovery cache is guarded by lock + allowBlockingCallsInside("kotlinx.coroutines.internal.ExceptionsConstructorKt", "tryCopyException") /* The predicates that define that BlockHound should only report blocking calls from threads that are part of the coroutine thread pool and currently execute a CPU-bound coroutine computation. */ addDynamicThreadPredicate { isSchedulerWorker(it) } From 1cdd47114c3807d092b61c0c68cbaf0a92791575 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 2 Sep 2021 12:15:14 +0300 Subject: [PATCH 132/328] Fix BlockHound false-positive in ConflatedChannel (#2881) Fixes #2866 --- .../src/CoroutinesBlockHoundIntegration.kt | 2 +- .../test/BlockHoundTest.kt | 27 ++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index e0905567d6..e13bc06aa0 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -135,7 +135,7 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { */ private fun BlockHound.Builder.allowBlockingCallsInConflatedChannel() { for (method in listOf("offerInternal", "offerSelectInternal", "pollInternal", "pollSelectInternal", - "onCancelIdempotent")) + "onCancelIdempotent", "isEmpty", "enqueueReceiveInternal")) { allowBlockingCallsInside("kotlinx.coroutines.channels.ConflatedChannel", method) } diff --git a/kotlinx-coroutines-debug/test/BlockHoundTest.kt b/kotlinx-coroutines-debug/test/BlockHoundTest.kt index 571daca12f..3f58878525 100644 --- a/kotlinx-coroutines-debug/test/BlockHoundTest.kt +++ b/kotlinx-coroutines-debug/test/BlockHoundTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.channels.* import org.junit.* import reactor.blockhound.* +@Suppress("UnusedEquals", "DeferredResultUnused", "BlockingMethodInNonBlockingContext") class BlockHoundTest : TestBase() { @Before @@ -12,21 +13,21 @@ class BlockHoundTest : TestBase() { } @Test(expected = BlockingOperationError::class) - fun shouldDetectBlockingInDefault() = runTest { + fun testShouldDetectBlockingInDefault() = runTest { withContext(Dispatchers.Default) { Thread.sleep(1) } } @Test - fun shouldNotDetectBlockingInIO() = runTest { + fun testShouldNotDetectBlockingInIO() = runTest { withContext(Dispatchers.IO) { Thread.sleep(1) } } @Test - fun shouldNotDetectNonblocking() = runTest { + fun testShouldNotDetectNonblocking() = runTest { withContext(Dispatchers.Default) { val a = 1 val b = 2 @@ -54,7 +55,7 @@ class BlockHoundTest : TestBase() { } @Test - fun testChannelsNotBeingConsideredBlocking() = runTest { + fun testChannelNotBeingConsideredBlocking() = runTest { withContext(Dispatchers.Default) { // Copy of kotlinx.coroutines.channels.ArrayChannelTest.testSimple val q = Channel(1) @@ -74,6 +75,24 @@ class BlockHoundTest : TestBase() { } } + @Test + fun testConflatedChannelsNotBeingConsideredBlocking() = runTest { + withContext(Dispatchers.Default) { + val q = Channel(Channel.CONFLATED) + check(q.isEmpty) + check(!q.isClosedForReceive) + check(!q.isClosedForSend) + val sender = launch { + q.send(1) + } + val receiver = launch { + q.receive() == 1 + } + sender.join() + receiver.join() + } + } + @Test(expected = BlockingOperationError::class) fun testReusingThreadsFailure() = runTest { val n = 100 From 42b3217e08281e5c309bb6f314439af70cc6c0e4 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 2 Sep 2021 14:09:09 +0300 Subject: [PATCH 133/328] Move `isInstalledStatically` field to a separate object (#2913) By doing this DebugProbesImpl can check for static installation without having to depend on AgentPremain, which is not compatible with Android. Co-authored-by: Pierfrancesco Soffritti --- .../jvm/src/debug/AgentPremain.kt | 12 +++++------- .../src/debug/internal/AgentInstallationType.kt | 16 ++++++++++++++++ .../jvm/src/debug/internal/DebugProbesImpl.kt | 4 ++-- 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/src/debug/internal/AgentInstallationType.kt diff --git a/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt b/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt index 8ef0c18217..d592bf657a 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt @@ -4,12 +4,12 @@ package kotlinx.coroutines.debug -import kotlinx.coroutines.debug.internal.DebugProbesImpl +import android.annotation.* +import kotlinx.coroutines.debug.internal.* import sun.misc.* import java.lang.instrument.* import java.lang.instrument.ClassFileTransformer import java.security.* -import android.annotation.* /* * This class is loaded if and only if kotlinx-coroutines-core was used as -javaagent argument, @@ -19,15 +19,13 @@ import android.annotation.* @SuppressLint("all") internal object AgentPremain { - public var isInstalledStatically = false - private val enableCreationStackTraces = runCatching { System.getProperty("kotlinx.coroutines.debug.enable.creation.stack.trace")?.toBoolean() }.getOrNull() ?: DebugProbesImpl.enableCreationStackTraces @JvmStatic - public fun premain(args: String?, instrumentation: Instrumentation) { - isInstalledStatically = true + fun premain(args: String?, instrumentation: Instrumentation) { + AgentInstallationType.isInstalledStatically = true instrumentation.addTransformer(DebugProbesTransformer) DebugProbesImpl.enableCreationStackTraces = enableCreationStackTraces DebugProbesImpl.install() @@ -52,7 +50,7 @@ internal object AgentPremain { * on the fly (-> get rid of ASM dependency). * You can verify its content either by using javap on it or looking at out integration test module. */ - isInstalledStatically = true + AgentInstallationType.isInstalledStatically = true return loader.getResourceAsStream("DebugProbesKt.bin").readBytes() } } diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/AgentInstallationType.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/AgentInstallationType.kt new file mode 100644 index 0000000000..0e9b26ce02 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/AgentInstallationType.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.debug.internal + +/** + * Object used to differentiate between agent installed statically or dynamically. + * This is done in a separate object so [DebugProbesImpl] can check for static installation + * without having to depend on [kotlinx.coroutines.debug.AgentPremain], which is not compatible with Android. + * Otherwise, access to `AgentPremain.isInstalledStatically` triggers the load of its internal `ClassFileTransformer` + * that is not available on Android. + */ +internal object AgentInstallationType { + internal var isInstalledStatically = false +} diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index 05befc1a59..73d731091d 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -82,7 +82,7 @@ internal object DebugProbesImpl { public fun install(): Unit = coroutineStateLock.write { if (++installations > 1) return startWeakRefCleanerThread() - if (AgentPremain.isInstalledStatically) return + if (AgentInstallationType.isInstalledStatically) return dynamicAttach?.invoke(true) // attach } @@ -92,7 +92,7 @@ internal object DebugProbesImpl { stopWeakRefCleanerThread() capturedCoroutinesMap.clear() callerInfoCache.clear() - if (AgentPremain.isInstalledStatically) return + if (AgentInstallationType.isInstalledStatically) return dynamicAttach?.invoke(false) // detach } From 9530760ef07bb40df917c230f1b2048f04cfe6ba Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 2 Sep 2021 14:15:58 +0300 Subject: [PATCH 134/328] Update CoroutineScope() factory documentation (#2892) * Update CoroutineScope() factory documentation Fixes #2891 --- kotlinx-coroutines-core/common/src/CoroutineScope.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index 3ed233bfb9..21d2a6e000 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -12,7 +12,7 @@ import kotlin.coroutines.* import kotlin.coroutines.intrinsics.* /** - * Defines a scope for new coroutines. Every **coroutine builder** (like [launch], [async], etc) + * Defines a scope for new coroutines. Every **coroutine builder** (like [launch], [async], etc.) * is an extension on [CoroutineScope] and inherits its [coroutineContext][CoroutineScope.coroutineContext] * to automatically propagate all its elements and cancellation. * @@ -28,8 +28,8 @@ import kotlin.coroutines.intrinsics.* * By convention, the [context of a scope][CoroutineScope.coroutineContext] should contain an instance of a * [job][Job] to enforce the discipline of **structured concurrency** with propagation of cancellation. * - * Every coroutine builder (like [launch], [async], etc) - * and every scoping function (like [coroutineScope], [withContext], etc) provides _its own_ scope + * Every coroutine builder (like [launch], [async], and others) + * and every scoping function (like [coroutineScope] and [withContext]) provides _its own_ scope * with its own [Job] instance into the inner block of code it runs. * By convention, they all wait for all the coroutines inside their block to complete before completing themselves, * thus enforcing the structured concurrency. See [Job] documentation for more details. @@ -269,8 +269,8 @@ public suspend fun coroutineScope(block: suspend CoroutineScope.() -> R): R * Creates a [CoroutineScope] that wraps the given coroutine [context]. * * If the given [context] does not contain a [Job] element, then a default `Job()` is created. - * This way, cancellation or failure of any child coroutine in this scope cancels all the other children, - * just like inside [coroutineScope] block. + * This way, failure of any child coroutine in this scope or [cancellation][CoroutineScope.cancel] of the scope itself + * cancels all the scope's children, just like inside [coroutineScope] block. */ @Suppress("FunctionName") public fun CoroutineScope(context: CoroutineContext): CoroutineScope = From 4d1c216282cb93457ee0e9c8a48c87063e94a629 Mon Sep 17 00:00:00 2001 From: sandyiscool Date: Thu, 2 Sep 2021 17:22:38 +0530 Subject: [PATCH 135/328] Fix a typo in coroutines basics doc (#2909) --- docs/topics/coroutines-basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/coroutines-basics.md b/docs/topics/coroutines-basics.md index 5d9d0e6db1..885c29fc28 100644 --- a/docs/topics/coroutines-basics.md +++ b/docs/topics/coroutines-basics.md @@ -75,7 +75,7 @@ Coroutines follow a principle of which delimits the lifetime of the coroutine. The above example shows that [runBlocking] establishes the corresponding scope and that is why the previous example waits until `World!` is printed after a second's delay and only then exits. -In the real application, you will be launching a lot of coroutines. Structured concurrency ensures that they are not +In a real application, you will be launching a lot of coroutines. Structured concurrency ensures that they are not lost and do not leak. An outer scope cannot complete until all its children coroutines complete. Structured concurrency also ensures that any errors in the code are properly reported and are never lost. From 17bc90bb00f17672476e1fb8f0a36b3a026406a9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 3 Sep 2021 19:15:48 +0300 Subject: [PATCH 136/328] Non-conflating subscription count in SharedFlow and StateFlow (#2872) * Non-conflating subscription count in SharedFlow and StateFlow Sharing strategies are too sensitive to conflation around extrema and may miss the necessity to start or not to stop the sharing. For more particular examples see #2863 and #2488 Fixes #2488 Fixes #2863 Fixes #2871 --- .../common/src/flow/SharedFlow.kt | 13 ++++- .../common/src/flow/StateFlow.kt | 4 -- .../src/flow/internal/AbstractSharedFlow.kt | 49 ++++++++++++++++--- .../common/src/flow/operators/Share.kt | 13 ++++- .../flow/sharing/ShareInConflationTest.kt | 4 +- .../common/test/flow/sharing/ShareInTest.kt | 26 ++++++++++ .../test/flow/sharing/SharedFlowTest.kt | 20 ++++++++ .../SharingStartedWhileSubscribedTest.kt | 35 ++++++++++++- .../jvm/test/flow/SharingStressTest.kt | 8 ++- 9 files changed, 151 insertions(+), 21 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index d79e203464..3424b38027 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -198,6 +198,8 @@ public interface MutableSharedFlow : SharedFlow, FlowCollector { * } * .launchIn(scope) // launch it * ``` + * + * Implementation note: the resulting flow **does not** conflate subscription count. */ public val subscriptionCount: StateFlow @@ -253,7 +255,7 @@ public fun MutableSharedFlow( // ------------------------------------ Implementation ------------------------------------ -private class SharedFlowSlot : AbstractSharedFlowSlot>() { +internal class SharedFlowSlot : AbstractSharedFlowSlot>() { @JvmField var index = -1L // current "to-be-emitted" index, -1 means the slot is free now @@ -275,7 +277,7 @@ private class SharedFlowSlot : AbstractSharedFlowSlot>() { } } -private class SharedFlowImpl( +internal open class SharedFlowImpl( private val replay: Int, private val bufferCapacity: Int, private val onBufferOverflow: BufferOverflow @@ -334,6 +336,13 @@ private class SharedFlowImpl( result } + /* + * A tweak for SubscriptionCountStateFlow to get the latest value. + */ + @Suppress("UNCHECKED_CAST") + protected val lastReplayedLocked: T + get() = buffer!!.getBufferAt(replayIndex + replaySize - 1) as T + @Suppress("UNCHECKED_CAST") override suspend fun collect(collector: FlowCollector) { val slot = allocateSlot() diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index 9e82e78771..53770dc91e 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -415,10 +415,6 @@ private class StateFlowImpl( fuseStateFlow(context, capacity, onBufferOverflow) } -internal fun MutableStateFlow.increment(delta: Int) { - update { it + delta } -} - internal fun StateFlow.fuseStateFlow( context: CoroutineContext, capacity: Int, diff --git a/kotlinx-coroutines-core/common/src/flow/internal/AbstractSharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/internal/AbstractSharedFlow.kt index 7114cc08d3..39ca98391f 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/AbstractSharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/AbstractSharedFlow.kt @@ -4,6 +4,7 @@ package kotlinx.coroutines.flow.internal +import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.* import kotlinx.coroutines.internal.* import kotlin.coroutines.* @@ -26,12 +27,12 @@ internal abstract class AbstractSharedFlow> : Sync protected var nCollectors = 0 // number of allocated (!free) slots private set private var nextIndex = 0 // oracle for the next free slot index - private var _subscriptionCount: MutableStateFlow? = null // init on first need + private var _subscriptionCount: SubscriptionCountStateFlow? = null // init on first need val subscriptionCount: StateFlow get() = synchronized(this) { // allocate under lock in sync with nCollectors variable - _subscriptionCount ?: MutableStateFlow(nCollectors).also { + _subscriptionCount ?: SubscriptionCountStateFlow(nCollectors).also { _subscriptionCount = it } } @@ -43,7 +44,7 @@ internal abstract class AbstractSharedFlow> : Sync @Suppress("UNCHECKED_CAST") protected fun allocateSlot(): S { // Actually create slot under lock - var subscriptionCount: MutableStateFlow? = null + var subscriptionCount: SubscriptionCountStateFlow? = null val slot = synchronized(this) { val slots = when (val curSlots = slots) { null -> createSlotArray(2).also { slots = it } @@ -74,7 +75,7 @@ internal abstract class AbstractSharedFlow> : Sync @Suppress("UNCHECKED_CAST") protected fun freeSlot(slot: S) { // Release slot under lock - var subscriptionCount: MutableStateFlow? = null + var subscriptionCount: SubscriptionCountStateFlow? = null val resumes = synchronized(this) { nCollectors-- subscriptionCount = _subscriptionCount // retrieve under lock if initialized @@ -83,10 +84,10 @@ internal abstract class AbstractSharedFlow> : Sync (slot as AbstractSharedFlowSlot).freeLocked(this) } /* - Resume suspended coroutines. - This can happens when the subscriber that was freed was a slow one and was holding up buffer. - When this subscriber was freed, previously queued emitted can now wake up and are resumed here. - */ + * Resume suspended coroutines. + * This can happen when the subscriber that was freed was a slow one and was holding up buffer. + * When this subscriber was freed, previously queued emitted can now wake up and are resumed here. + */ for (cont in resumes) cont?.resume(Unit) // decrement subscription count subscriptionCount?.increment(-1) @@ -99,3 +100,35 @@ internal abstract class AbstractSharedFlow> : Sync } } } + +/** + * [StateFlow] that represents the number of subscriptions. + * + * It is exposed as a regular [StateFlow] in our public API, but it is implemented as [SharedFlow] undercover to + * avoid conflations of consecutive updates because the subscription count is very sensitive to it. + * + * The importance of non-conflating can be demonstrated with the following example: + * ``` + * val shared = flowOf(239).stateIn(this, SharingStarted.Lazily, 42) // stateIn for the sake of the initial value + * println(shared.first()) + * yield() + * println(shared.first()) + * ``` + * If the flow is shared within the same dispatcher (e.g. Main) or with a slow/throttled one, + * the `SharingStarted.Lazily` will never be able to start the source: `first` sees the initial value and immediately + * unsubscribes, leaving the asynchronous `SharingStarted` with conflated zero. + * + * To avoid that (especially in a more complex scenarios), we do not conflate subscription updates. + */ +private class SubscriptionCountStateFlow(initialValue: Int) : StateFlow, + SharedFlowImpl(1, Int.MAX_VALUE, BufferOverflow.DROP_OLDEST) +{ + init { tryEmit(initialValue) } + + override val value: Int + get() = synchronized(this) { lastReplayedLocked } + + fun increment(delta: Int) = synchronized(this) { + tryEmit(lastReplayedLocked + delta) + } +} diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt index 4fa74d8e50..2b690e3c04 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Share.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Share.kt @@ -197,8 +197,16 @@ private fun CoroutineScope.launchSharing( shared: MutableSharedFlow, started: SharingStarted, initialValue: T -): Job = - launch(context) { // the single coroutine to rule the sharing +): Job { + /* + * Conditional start: in the case when sharing and subscribing happens in the same dispatcher, we want to + * have the following invariants preserved: + * * Delayed sharing strategies have a chance to immediately observe consecutive subscriptions. + * E.g. in the cases like `flow.shareIn(...); flow.take(1)` we want sharing strategy to see the initial subscription + * * Eager sharing does not start immediately, so the subscribers have actual chance to subscribe _prior_ to sharing. + */ + val start = if (started == SharingStarted.Eagerly) CoroutineStart.DEFAULT else CoroutineStart.UNDISPATCHED + return launch(context, start = start) { // the single coroutine to rule the sharing // Optimize common built-in started strategies when { started === SharingStarted.Eagerly -> { @@ -230,6 +238,7 @@ private fun CoroutineScope.launchSharing( } } } +} // -------------------------------- stateIn -------------------------------- diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInConflationTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInConflationTest.kt index 0528e97e7d..c19d52367b 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInConflationTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInConflationTest.kt @@ -21,7 +21,7 @@ class ShareInConflationTest : TestBase() { op: suspend Flow.(CoroutineScope) -> Flow ) = runTest { expect(1) - // emit all and conflate, then should collect bufferCapacity latest ones + // emit all and conflate, then should collect bufferCapacity the latest ones val done = Job() flow { repeat(n) { i -> @@ -159,4 +159,4 @@ class ShareInConflationTest : TestBase() { checkConflation(1, BufferOverflow.DROP_LATEST) { buffer(23).buffer(onBufferOverflow = BufferOverflow.DROP_LATEST).shareIn(it, SharingStarted.Eagerly, 0) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt index db69e2bc06..cf83a50b0f 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/ShareInTest.kt @@ -210,4 +210,30 @@ class ShareInTest : TestBase() { stop() } } + + @Test + fun testShouldStart() = runTest { + val flow = flow { + expect(2) + emit(1) + expect(3) + }.shareIn(this, SharingStarted.Lazily) + + expect(1) + flow.onSubscription { throw CancellationException("") } + .catch { e -> assertTrue { e is CancellationException } } + .collect() + yield() + finish(4) + } + + @Test + fun testShouldStartScalar() = runTest { + val j = Job() + val shared = flowOf(239).stateIn(this + j, SharingStarted.Lazily, 42) + assertEquals(42, shared.first()) + yield() + assertEquals(239, shared.first()) + j.cancel() + } } diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt index 6e18b38f55..98e04f00e8 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharedFlowTest.kt @@ -798,4 +798,24 @@ class SharedFlowTest : TestBase() { job.join() finish(5) } + + @Test + fun testSubscriptionCount() = runTest { + val flow = MutableSharedFlow() + fun startSubscriber() = launch(start = CoroutineStart.UNDISPATCHED) { flow.collect() } + + assertEquals(0, flow.subscriptionCount.first()) + + val j1 = startSubscriber() + assertEquals(1, flow.subscriptionCount.first()) + + val j2 = startSubscriber() + assertEquals(2, flow.subscriptionCount.first()) + + j1.cancelAndJoin() + assertEquals(1, flow.subscriptionCount.first()) + + j2.cancelAndJoin() + assertEquals(0, flow.subscriptionCount.first()) + } } diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt index 516bb2e291..b3a3400389 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt @@ -40,5 +40,38 @@ class SharingStartedWhileSubscribedTest : TestBase() { assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 7000), SharingStarted.WhileSubscribed(replayExpiration = 7.seconds)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = Long.MAX_VALUE), SharingStarted.WhileSubscribed(replayExpiration = Duration.INFINITE)) } -} + @Test + fun testShouldRestart() = runTest { + var started = 0 + val flow = flow { + expect(1 + ++started) + emit(1) + hang { } + }.shareIn(this, SharingStarted.WhileSubscribed(100 /* ms */)) + + expect(1) + flow.first() + delay(200) + flow.first() + finish(4) + coroutineContext.job.cancelChildren() + } + + @Test + fun testImmediateUnsubscribe() = runTest { + val flow = flow { + expect(2) + emit(1) + hang { finish(4) } + }.shareIn(this, SharingStarted.WhileSubscribed(400, 0 /* ms */), 1) + + expect(1) + repeat(5) { + flow.first() + delay(100) + } + expect(3) + coroutineContext.job.cancelChildren() + } +} diff --git a/kotlinx-coroutines-core/jvm/test/flow/SharingStressTest.kt b/kotlinx-coroutines-core/jvm/test/flow/SharingStressTest.kt index 7d346bdc33..25c0c98314 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/SharingStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/flow/SharingStressTest.kt @@ -189,5 +189,9 @@ class SharingStressTest : TestBase() { var count = 0L } - private fun log(msg: String) = println("${testStarted.elapsedNow().toLongMilliseconds()} ms: $msg") -} \ No newline at end of file + private fun log(msg: String) = println("${testStarted.elapsedNow().inWholeMilliseconds} ms: $msg") + + private fun MutableStateFlow.increment(delta: Int) { + update { it + delta } + } +} From 61acb958196351490398070fc5c36f89f24761d1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 3 Sep 2021 19:16:08 +0300 Subject: [PATCH 137/328] Make DisposableHandle fun interface, remove our own adapter (#2790) --- .../api/kotlinx-coroutines-core.api | 1 - kotlinx-coroutines-core/common/src/Job.kt | 14 +------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 50bfb60d62..eb6b4184e7 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -367,7 +367,6 @@ public final class kotlinx/coroutines/Job$Key : kotlin/coroutines/CoroutineConte } public final class kotlinx/coroutines/JobKt { - public static final fun DisposableHandle (Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/DisposableHandle; public static final fun Job (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; public static final synthetic fun Job (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; public static synthetic fun Job$default (Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index 9552153aa9..31d90eeef0 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -387,7 +387,7 @@ public fun Job0(parent: Job? = null): Job = Job(parent) /** * A handle to an allocated object that can be disposed to make it eligible for garbage collection. */ -public interface DisposableHandle { +public fun interface DisposableHandle { /** * Disposes the corresponding object, making it eligible for garbage collection. * Repeated invocation of this function has no effect. @@ -395,18 +395,6 @@ public interface DisposableHandle { public fun dispose() } -/** - * @suppress **This an internal API and should not be used from general code.** - */ -@Suppress("FunctionName") -@InternalCoroutinesApi -public inline fun DisposableHandle(crossinline block: () -> Unit): DisposableHandle = - object : DisposableHandle { - override fun dispose() { - block() - } - } - // -------------------- Parent-child communication -------------------- /** From 3f459d5d999ffcbb39ba22e7e4a4773370cdcfdc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 3 Sep 2021 19:16:29 +0300 Subject: [PATCH 138/328] Remove workarounds for obsolete compiler bugs (#2829) --- .../common/src/internal/LockFreeLinkedList.common.kt | 2 +- kotlinx-coroutines-core/common/test/flow/operators/DropTest.kt | 3 +-- .../common/test/flow/operators/FilterTest.kt | 2 -- .../common/test/flow/operators/FlatMapMergeBaseTest.kt | 2 +- .../common/test/flow/operators/FlowOnTest.kt | 2 +- .../common/test/flow/operators/MapNotNullTest.kt | 3 +-- .../common/test/flow/operators/SampleTest.kt | 1 - kotlinx-coroutines-core/common/test/flow/operators/TakeTest.kt | 3 +-- kotlinx-coroutines-core/js/src/internal/LinkedList.kt | 2 +- kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt | 2 +- kotlinx-coroutines-core/native/src/internal/LinkedList.kt | 2 +- kotlinx-coroutines-core/native/test/TestBase.kt | 2 +- 12 files changed, 10 insertions(+), 16 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt index 0e1d1b473a..8b20ade1f0 100644 --- a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt @@ -43,7 +43,7 @@ public expect open class LockFreeLinkedListNode() { public expect open class LockFreeLinkedListHead() : LockFreeLinkedListNode { public val isEmpty: Boolean public inline fun forEach(block: (T) -> Unit) - public final override fun remove(): Boolean // Actual return type is Nothing, KT-27534 + public final override fun remove(): Nothing } /** @suppress **This is unstable API and it is subject to change.** */ diff --git a/kotlinx-coroutines-core/common/test/flow/operators/DropTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/DropTest.kt index 1c5a305352..dfa2827447 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/DropTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/DropTest.kt @@ -48,10 +48,9 @@ class DropTest : TestBase() { expectUnreached() } }.drop(1) - .map { + .map { expect(4) throw TestException() - 42 }.catch { emit(42) } expect(1) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FilterTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FilterTest.kt index 3de5d54a6d..f52416d823 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FilterTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FilterTest.kt @@ -38,7 +38,6 @@ class FilterTest : TestBase() { }.filter { latch.receive() throw TestException() - true }.catch { emit(42) } assertEquals(42, flow.single()) @@ -74,7 +73,6 @@ class FilterTest : TestBase() { }.filterNot { latch.receive() throw TestException() - true }.catch { emit(42) } assertEquals(42, flow.single()) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt index 4095172dab..f09db120a8 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeBaseTest.kt @@ -72,7 +72,7 @@ abstract class FlatMapMergeBaseTest : FlatMapBaseTest() { emit(2) expectUnreached() }.flatMap { - if (it == 1) flow { + if (it == 1) flow { expect(5) latch.send(Unit) hang { expect(7) } diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlowOnTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlowOnTest.kt index 68653281cc..8fba8456e8 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlowOnTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlowOnTest.kt @@ -83,7 +83,7 @@ class FlowOnTest : TestBase() { }.map { expect(2) assertEquals("throwing", it) - throw TestException(); it + throw TestException() }.flowOn(NamedDispatchers("throwing")) assertFailsWith(flow) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/MapNotNullTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/MapNotNullTest.kt index 893811df15..d8bb480054 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/MapNotNullTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/MapNotNullTest.kt @@ -39,10 +39,9 @@ class MapNotNullTest : TestBase() { } emit(1) } - }.mapNotNull { + }.mapNotNull { latch.receive() throw TestException() - it + 1 }.catch { emit(42) } assertEquals(42, flow.single()) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt index 87bee56f1d..f7741fbd59 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/SampleTest.kt @@ -250,7 +250,6 @@ class SampleTest : TestBase() { expect(2) yield() throw TestException() - it } assertFailsWith(flow) diff --git a/kotlinx-coroutines-core/common/test/flow/operators/TakeTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/TakeTest.kt index 62d2322c04..ea8939fed2 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/TakeTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/TakeTest.kt @@ -88,9 +88,8 @@ class TakeTest : TestBase() { emit(1) } }.take(2) - .map { + .map { throw TestException() - 42 }.catch { emit(42) } assertEquals(42, flow.single()) diff --git a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt index 147b31dc3e..d8c07f4e19 100644 --- a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt +++ b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt @@ -177,5 +177,5 @@ public open class LinkedListHead : LinkedListNode() { } // just a defensive programming -- makes sure that list head sentinel is never removed - public final override fun remove(): Boolean = throw UnsupportedOperationException() + public final override fun remove(): Nothing = throw UnsupportedOperationException() } diff --git a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt b/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt index 9bbc6dc9eb..8b4517cb22 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt @@ -646,7 +646,7 @@ public actual open class LockFreeLinkedListHead : LockFreeLinkedListNode() { } // just a defensive programming -- makes sure that list head sentinel is never removed - public actual final override fun remove(): Boolean = error("head cannot be removed") + public actual final override fun remove(): Nothing = error("head cannot be removed") // optimization: because head is never removed, we don't have to read _next.value to check these: override val isRemoved: Boolean get() = false diff --git a/kotlinx-coroutines-core/native/src/internal/LinkedList.kt b/kotlinx-coroutines-core/native/src/internal/LinkedList.kt index a8aed04461..a161bc5bab 100644 --- a/kotlinx-coroutines-core/native/src/internal/LinkedList.kt +++ b/kotlinx-coroutines-core/native/src/internal/LinkedList.kt @@ -166,5 +166,5 @@ public open class LinkedListHead : LinkedListNode() { } // just a defensive programming -- makes sure that list head sentinel is never removed - public final override fun remove(): Boolean = throw UnsupportedOperationException() + public final override fun remove(): Nothing = throw UnsupportedOperationException() } diff --git a/kotlinx-coroutines-core/native/test/TestBase.kt b/kotlinx-coroutines-core/native/test/TestBase.kt index 4ffa6c0b11..1b12cefefe 100644 --- a/kotlinx-coroutines-core/native/test/TestBase.kt +++ b/kotlinx-coroutines-core/native/test/TestBase.kt @@ -78,7 +78,7 @@ public actual open class TestBase actual constructor() { var exCount = 0 var ex: Throwable? = null try { - runBlocking(block = block, context = CoroutineExceptionHandler { context, e -> + runBlocking(block = block, context = CoroutineExceptionHandler { _, e -> if (e is CancellationException) return@CoroutineExceptionHandler // are ignored exCount++ when { From 684766100e9260fd20d4936c1c4801fb3f5f3891 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Mon, 6 Sep 2021 10:32:45 +0200 Subject: [PATCH 139/328] Fix the 'Coroutine Exceptions handling' doc (#2917) --- docs/topics/exception-handling.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index 35e645f4b6..9e14ff2afd 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -15,7 +15,7 @@ When these builders are used to create a _root_ coroutine, that is not a _child_ the former builders treat exceptions as **uncaught** exceptions, similar to Java's `Thread.uncaughtExceptionHandler`, while the latter are relying on the user to consume the final exception, for example via [await][Deferred.await] or [receive][ReceiveChannel.receive] -([produce] and [receive][ReceiveChannel.receive] are covered later in [Channels](https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/channels.md) section). +([produce] and [receive][ReceiveChannel.receive] are covered in [Channels](https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/channels.md) section). It can be demonstrated by a simple example that creates root coroutines using the [GlobalScope]: @@ -68,7 +68,7 @@ Caught ArithmeticException ## CoroutineExceptionHandler It is possible to customize the default behavior of printing **uncaught** exceptions to the console. -[CoroutineExceptionHandler] context element on a _root_ coroutine can be used as generic `catch` block for +[CoroutineExceptionHandler] context element on a _root_ coroutine can be used as a generic `catch` block for this root coroutine and all its children where custom exception handling may take place. It is similar to [`Thread.uncaughtExceptionHandler`](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)). You cannot recover from the exception in the `CoroutineExceptionHandler`. The coroutine had already completed @@ -349,7 +349,7 @@ hierarchy of coroutines. Let us take a look at the case when unidirectional canc A good example of such a requirement is a UI component with the job defined in its scope. If any of the UI's child tasks have failed, it is not always necessary to cancel (effectively kill) the whole UI component, -but if UI component is destroyed (and its job is cancelled), then it is necessary to fail all child jobs as their results are no longer needed. +but if the UI component is destroyed (and its job is cancelled), then it is necessary to cancel all child jobs as their results are no longer needed. Another example is a server process that spawns multiple child jobs and needs to _supervise_ their execution, tracking their failures and only restarting the failed ones. From a3a70bedca2189e248ed0be5844ddcb96cea9ae7 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Tue, 7 Sep 2021 15:15:21 +0200 Subject: [PATCH 140/328] Add some missing articles in 'Select Expression' doc (#2921) --- docs/topics/select-expression.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/select-expression.md b/docs/topics/select-expression.md index 3d20ff39d4..fd40fe2e32 100644 --- a/docs/topics/select-expression.md +++ b/docs/topics/select-expression.md @@ -213,7 +213,7 @@ Channel 'a' is closed -There are couple of observations to make out of it. +There are a couple of observations to make out of it. First of all, `select` is _biased_ to the first clause. When several clauses are selectable at the same time, the first one among them gets selected. Here, both channels are constantly producing strings, so `a` channel, @@ -228,7 +228,7 @@ channel is already closed. Select expression has [onSend][SendChannel.onSend] clause that can be used for a great good in combination with a biased nature of selection. -Let us write an example of producer of integers that sends its values to a `side` channel when +Let us write an example of a producer of integers that sends its values to a `side` channel when the consumers on its primary channel cannot keep up with it: ```kotlin From c76cc2478c19e4c2b4da70624838deff96834986 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 8 Sep 2021 20:12:40 +0300 Subject: [PATCH 141/328] Add method that allows dumping all coroutine information needed by the IDEA debugger in one call (#2923) Co-authored-by: Nikita Nazarov Co-authored-by: Nikita Nazarov --- .../jvm/src/debug/internal/DebugProbesImpl.kt | 55 ++++++++++- kotlinx-coroutines-debug/build.gradle | 1 + ...umpCoroutineInfoAsJsonAndReferencesTest.kt | 96 +++++++++++++++++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 kotlinx-coroutines-debug/test/DumpCoroutineInfoAsJsonAndReferencesTest.kt diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index 73d731091d..f0fc50e658 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -6,7 +6,6 @@ package kotlinx.coroutines.debug.internal import kotlinx.atomicfu.* import kotlinx.coroutines.* -import kotlinx.coroutines.debug.* import kotlinx.coroutines.internal.* import kotlinx.coroutines.internal.ScopeCoroutine import java.io.* @@ -163,6 +162,60 @@ internal object DebugProbesImpl { } } + /* + * This method optimises the number of packages sent by the IDEA debugger + * to a client VM to speed up fetching of coroutine information. + * + * The return value is an array of objects, which consists of four elements: + * 1) A string in a JSON format that stores information that is needed to display + * every coroutine in the coroutine panel in the IDEA debugger. + * 2) An array of last observed threads. + * 3) An array of last observed frames. + * 4) An array of DebugCoroutineInfo. + * + * ### Implementation note + * For methods like `dumpCoroutinesInfo` JDWP provides `com.sun.jdi.ObjectReference` + * that does a roundtrip to client VM for *each* field or property read. + * To avoid that, we serialize most of the critical for UI data into a primitives + * to save an exponential number of roundtrips. + * + * Internal (JVM-public) method used by IDEA debugger as of 1.6.0-RC. + */ + @OptIn(ExperimentalStdlibApi::class) + public fun dumpCoroutinesInfoAsJsonAndReferences(): Array { + fun Any.toStringWithQuotes() = "\"$this\"" + val coroutinesInfo = dumpCoroutinesInfo() + val size = coroutinesInfo.size + val lastObservedThreads = ArrayList(size) + val lastObservedFrames = ArrayList(size) + val coroutinesInfoAsJson = ArrayList(size) + for (info in coroutinesInfo) { + val context = info.context + val name = context[CoroutineName.Key]?.name?.toStringWithQuotes() + val dispatcher = context[CoroutineDispatcher.Key]?.toStringWithQuotes() + coroutinesInfoAsJson.add( + """ + { + "name": $name, + "id": ${context[CoroutineId.Key]?.id}, + "dispatcher": $dispatcher, + "sequenceNumber": ${info.sequenceNumber}, + "state": "${info.state}" + } + """.trimIndent() + ) + lastObservedFrames.add(info.lastObservedFrame) + lastObservedThreads.add(info.lastObservedThread) + } + + return arrayOf( + "[${coroutinesInfoAsJson.joinToString()}]", + lastObservedThreads.toTypedArray(), + lastObservedFrames.toTypedArray(), + coroutinesInfo.toTypedArray() + ) + } + /* * Internal (JVM-public) method used by IDEA debugger as of 1.4-M3. */ diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index 43d94d1841..4830670d24 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -27,6 +27,7 @@ dependencies { shadowDeps "net.bytebuddy:byte-buddy-agent:$byte_buddy_version" compileOnly "io.projectreactor.tools:blockhound:$blockhound_version" testImplementation "io.projectreactor.tools:blockhound:$blockhound_version" + testImplementation "com.google.code.gson:gson:2.8.6" api "net.java.dev.jna:jna:$jna_version" api "net.java.dev.jna:jna-platform:$jna_version" } diff --git a/kotlinx-coroutines-debug/test/DumpCoroutineInfoAsJsonAndReferencesTest.kt b/kotlinx-coroutines-debug/test/DumpCoroutineInfoAsJsonAndReferencesTest.kt new file mode 100644 index 0000000000..4808470eb6 --- /dev/null +++ b/kotlinx-coroutines-debug/test/DumpCoroutineInfoAsJsonAndReferencesTest.kt @@ -0,0 +1,96 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +package kotlinx.coroutines.debug + +import com.google.gson.* +import kotlinx.coroutines.* +import kotlinx.coroutines.debug.internal.* +import org.junit.Test +import kotlin.coroutines.* +import kotlin.test.* + +@ExperimentalStdlibApi +class DumpCoroutineInfoAsJsonAndReferencesTest : DebugTestBase() { + private data class CoroutineInfoFromJson( + val name: String?, + val id: Long?, + val dispatcher: String?, + val sequenceNumber: Long?, + val state: String? + ) + + @Test + fun testDumpOfUnnamedCoroutine() = + runTestWithNamedDeferred(name = null) + + @Test + fun testDumpOfNamedCoroutine() = + runTestWithNamedDeferred("Name") + + @Test + fun testDumpWithNoCoroutines() { + val dumpResult = DebugProbesImpl.dumpCoroutinesInfoAsJsonAndReferences() + assertEquals(dumpResult.size, 4) + assertIsEmptyArray(dumpResult[1]) + assertIsEmptyArray(dumpResult[2]) + assertIsEmptyArray(dumpResult[3]) + } + + private fun assertIsEmptyArray(obj: Any) = + assertTrue(obj is Array<*> && obj.isEmpty()) + + private fun runTestWithNamedDeferred(name: String?) = runTest { + val context = if (name == null) EmptyCoroutineContext else CoroutineName(name) + val deferred = async(context) { + suspendingMethod() + assertTrue(true) + } + yield() + verifyDump() + deferred.cancelAndJoin() + } + + private suspend fun suspendingMethod() { + delay(Long.MAX_VALUE) + } + + private fun verifyDump() { + val dumpResult = DebugProbesImpl.dumpCoroutinesInfoAsJsonAndReferences() + + assertEquals(dumpResult.size, 4) + + val coroutinesInfoAsJsonString = dumpResult[0] + val lastObservedThreads = dumpResult[1] + val lastObservedFrames = dumpResult[2] + val coroutinesInfo = dumpResult[3] + + assertTrue(coroutinesInfoAsJsonString is String) + assertTrue(lastObservedThreads is Array<*>) + assertTrue(lastObservedFrames is Array<*>) + assertTrue(coroutinesInfo is Array<*>) + + val coroutinesInfoFromJson = Gson().fromJson(coroutinesInfoAsJsonString, Array::class.java) + + val size = coroutinesInfo.size + assertTrue(size != 0) + assertEquals(size, coroutinesInfoFromJson.size) + assertEquals(size, lastObservedFrames.size) + assertEquals(size, lastObservedThreads.size) + + for (i in 0 until size) { + val info = coroutinesInfo[i] + val infoFromJson = coroutinesInfoFromJson[i] + assertTrue(info is DebugCoroutineInfo) + assertEquals(info.lastObservedThread, lastObservedThreads[i]) + assertEquals(info.lastObservedFrame, lastObservedFrames[i]) + assertEquals(info.sequenceNumber, infoFromJson.sequenceNumber) + assertEquals(info.state, infoFromJson.state) + val context = info.context + assertEquals(context[CoroutineName.Key]?.name, infoFromJson.name) + assertEquals(context[CoroutineId.Key]?.id, infoFromJson.id) + assertEquals(context[CoroutineDispatcher.Key]?.toString(), infoFromJson.dispatcher) + } + } +} From 12d70ebcd320ebfcc5e731a95640086d5d665e6c Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 8 Sep 2021 21:51:07 +0300 Subject: [PATCH 142/328] Generate links in Play Services integration README with Knit (#2924) --- .../kotlinx-coroutines-play-services/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/integration/kotlinx-coroutines-play-services/README.md b/integration/kotlinx-coroutines-play-services/README.md index e5e0e613b3..647dafd2c1 100644 --- a/integration/kotlinx-coroutines-play-services/README.md +++ b/integration/kotlinx-coroutines-play-services/README.md @@ -34,6 +34,12 @@ val currentLocationTask = fusedLocationProviderClient.getCurrentLocation(PRIORIT val currentLocation = currentLocationTask.await(cancellationTokenSource) // cancelling `await` also cancels `currentLocationTask`, and vice versa ``` -[asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/com.google.android.gms.tasks.-task/as-deferred.html -[await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/com.google.android.gms.tasks.-task/await.html -[asTask]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/kotlinx.coroutines.-deferred/as-task.html + + + + +[asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-deferred.html +[await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html +[asTask]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-task.html + + From 7523368de24b2b27f438d9a511a65dcd1250c4c0 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 9 Sep 2021 15:44:21 +0300 Subject: [PATCH 143/328] Introduce CloseableCoroutineDispatcher abstract class (#2903) * Introduce CloseableCoroutineDispatcher abstract class * Alias it to ExecutorCoroutineDispatcher on JVM as the most appropriate candidate * Add abstract classes to JVM and Native * This class will be implemented by new dispatchers for K/N new memory model Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- .../common/src/Annotations.kt | 13 +++++++++ .../src/CloseableCoroutineDispatcher.kt | 28 +++++++++++++++++++ .../js/src/CloseableCoroutineDispatcher.kt | 9 ++++++ kotlinx-coroutines-core/jvm/src/Executors.kt | 3 ++ .../src/CloseableCoroutineDispatcher.kt | 9 ++++++ 5 files changed, 62 insertions(+) create mode 100644 kotlinx-coroutines-core/common/src/CloseableCoroutineDispatcher.kt create mode 100644 kotlinx-coroutines-core/js/src/CloseableCoroutineDispatcher.kt create mode 100644 kotlinx-coroutines-core/native/src/CloseableCoroutineDispatcher.kt diff --git a/kotlinx-coroutines-core/common/src/Annotations.kt b/kotlinx-coroutines-core/common/src/Annotations.kt index 724cc8cb87..bacce39408 100644 --- a/kotlinx-coroutines-core/common/src/Annotations.kt +++ b/kotlinx-coroutines-core/common/src/Annotations.kt @@ -30,6 +30,19 @@ public annotation class DelicateCoroutinesApi */ @MustBeDocumented @Retention(value = AnnotationRetention.BINARY) +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.ANNOTATION_CLASS, + AnnotationTarget.PROPERTY, + AnnotationTarget.FIELD, + AnnotationTarget.LOCAL_VARIABLE, + AnnotationTarget.VALUE_PARAMETER, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FUNCTION, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.TYPEALIAS +) @RequiresOptIn(level = RequiresOptIn.Level.WARNING) public annotation class ExperimentalCoroutinesApi diff --git a/kotlinx-coroutines-core/common/src/CloseableCoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CloseableCoroutineDispatcher.kt new file mode 100644 index 0000000000..9c6703291a --- /dev/null +++ b/kotlinx-coroutines-core/common/src/CloseableCoroutineDispatcher.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +/** + * [CoroutineDispatcher] that provides a method to close it, + * causing the rejection of any new tasks and cleanup of all underlying resources + * associated with the current dispatcher. + * Examples of closeable dispatchers are dispatchers backed by `java.lang.Executor` and + * by `kotlin.native.Worker`. + * + * **The `CloseableCoroutineDispatcher` class is not stable for inheritance in 3rd party libraries**, as new methods + * might be added to this interface in the future, but is stable for use. + */ +@ExperimentalCoroutinesApi +public expect abstract class CloseableCoroutineDispatcher() : CoroutineDispatcher { + + /** + * Initiate the closing sequence of the coroutine dispatcher. + * After a successful call to [close], no new tasks will + * be accepted to be [dispatched][dispatch], but the previously dispatched tasks will be run. + * + * Invocations of `close` are idempotent and thread-safe. + */ + public abstract fun close() +} diff --git a/kotlinx-coroutines-core/js/src/CloseableCoroutineDispatcher.kt b/kotlinx-coroutines-core/js/src/CloseableCoroutineDispatcher.kt new file mode 100644 index 0000000000..0e239a42f7 --- /dev/null +++ b/kotlinx-coroutines-core/js/src/CloseableCoroutineDispatcher.kt @@ -0,0 +1,9 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +public actual abstract class CloseableCoroutineDispatcher actual constructor() : CoroutineDispatcher() { + public actual abstract fun close() +} diff --git a/kotlinx-coroutines-core/jvm/src/Executors.kt b/kotlinx-coroutines-core/jvm/src/Executors.kt index 7ea3cc6874..4e98e7bc98 100644 --- a/kotlinx-coroutines-core/jvm/src/Executors.kt +++ b/kotlinx-coroutines-core/jvm/src/Executors.kt @@ -37,6 +37,9 @@ public abstract class ExecutorCoroutineDispatcher: CoroutineDispatcher(), Closea public abstract override fun close() } +@ExperimentalCoroutinesApi +public actual typealias CloseableCoroutineDispatcher = ExecutorCoroutineDispatcher + /** * Converts an instance of [ExecutorService] to an implementation of [ExecutorCoroutineDispatcher]. * diff --git a/kotlinx-coroutines-core/native/src/CloseableCoroutineDispatcher.kt b/kotlinx-coroutines-core/native/src/CloseableCoroutineDispatcher.kt new file mode 100644 index 0000000000..0e239a42f7 --- /dev/null +++ b/kotlinx-coroutines-core/native/src/CloseableCoroutineDispatcher.kt @@ -0,0 +1,9 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +public actual abstract class CloseableCoroutineDispatcher actual constructor() : CoroutineDispatcher() { + public actual abstract fun close() +} From 81d7780325a5b06a533a741e7fa1a0f7fde22511 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 9 Sep 2021 15:47:24 +0300 Subject: [PATCH 144/328] Remove obsolete CommonPool support (#2916) * We state that it's deprecated since the initial release of CoroutineScheduler * It is an additional DEX load for Android --- .../common/src/CoroutineContext.common.kt | 2 - .../js/src/CoroutineContext.kt | 2 +- kotlinx-coroutines-core/jvm/src/CommonPool.kt | 143 ------------------ .../jvm/src/CoroutineContext.kt | 13 -- .../jvm/src/Dispatchers.kt | 2 +- .../jvm/test/CommonPoolTest.kt | 56 ------- kotlinx-coroutines-core/jvm/test/TestBase.kt | 3 - .../jvm/test/knit/TestUtil.kt | 3 - .../native/src/CoroutineContext.kt | 2 +- 9 files changed, 3 insertions(+), 223 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/src/CommonPool.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/CommonPoolTest.kt diff --git a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt index 68b4b1a393..e17833218f 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt @@ -12,8 +12,6 @@ import kotlin.coroutines.* */ public expect fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext -internal expect fun createDefaultDispatcher(): CoroutineDispatcher - @Suppress("PropertyName") internal expect val DefaultDelay: Delay diff --git a/kotlinx-coroutines-core/js/src/CoroutineContext.kt b/kotlinx-coroutines-core/js/src/CoroutineContext.kt index a98ea9732d..95cb3c2964 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineContext.kt @@ -12,7 +12,7 @@ private external val navigator: dynamic private const val UNDEFINED = "undefined" internal external val process: dynamic -internal actual fun createDefaultDispatcher(): CoroutineDispatcher = when { +internal fun createDefaultDispatcher(): CoroutineDispatcher = when { // Check if we are running under jsdom. WindowDispatcher doesn't work under jsdom because it accesses MessageEvent#source. // It is not implemented in jsdom, see https://github.com/jsdom/jsdom/blob/master/Changelog.md // "It's missing a few semantics, especially around origins, as well as MessageEvent source." diff --git a/kotlinx-coroutines-core/jvm/src/CommonPool.kt b/kotlinx-coroutines-core/jvm/src/CommonPool.kt deleted file mode 100644 index 502630b010..0000000000 --- a/kotlinx-coroutines-core/jvm/src/CommonPool.kt +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines - -import java.util.concurrent.* -import java.util.concurrent.atomic.* -import kotlin.coroutines.* - -/** - * Represents common pool of shared threads as coroutine dispatcher for compute-intensive tasks. - * - * If there isn't a SecurityManager present it uses [java.util.concurrent.ForkJoinPool] when available, which implements - * efficient work-stealing algorithm for its queues, so every coroutine resumption is dispatched as a separate task even - * when it already executes inside the pool. When available, it wraps `ForkJoinPool.commonPool` and provides a similar - * shared pool where not. - * - * If there is a SecurityManager present (as would be if running inside a Java Web Start context) then a plain thread - * pool is created. This is to work around the fact that ForkJoinPool creates threads that cannot perform - * privileged actions. - */ -internal object CommonPool : ExecutorCoroutineDispatcher() { - - /** - * Name of the property that controls default parallelism level of [CommonPool]. - * If the property is not specified, `Runtime.getRuntime().availableProcessors() - 1` will be used instead (or `1` for single-core JVM). - * Note that until Java 10, if an application is run within a container, - * `Runtime.getRuntime().availableProcessors()` is not aware of container constraints and will return the real number of cores. - */ - private const val DEFAULT_PARALLELISM_PROPERTY_NAME = "kotlinx.coroutines.default.parallelism" - - override val executor: Executor - get() = pool ?: getOrCreatePoolSync() - - // Equals to -1 if not explicitly specified - private val requestedParallelism = run { - val property = Try { System.getProperty(DEFAULT_PARALLELISM_PROPERTY_NAME) } ?: return@run -1 - val parallelism = property.toIntOrNull() - if (parallelism == null || parallelism < 1) { - error("Expected positive number in $DEFAULT_PARALLELISM_PROPERTY_NAME, but has $property") - } - parallelism - } - - private val parallelism: Int - get() = requestedParallelism.takeIf { it > 0 } - ?: (Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1) - - // For debug and tests - private var usePrivatePool = false - - @Volatile - private var pool: Executor? = null - - private inline fun Try(block: () -> T) = try { block() } catch (e: Throwable) { null } - - private fun createPool(): ExecutorService { - if (System.getSecurityManager() != null) return createPlainPool() - // Reflection on ForkJoinPool class so that it works on JDK 6 (which is absent there) - val fjpClass = Try { Class.forName("java.util.concurrent.ForkJoinPool") } - ?: return createPlainPool() // Fallback to plain thread pool - // Try to use commonPool unless parallelism was explicitly specified or in debug privatePool mode - if (!usePrivatePool && requestedParallelism < 0) { - Try { fjpClass.getMethod("commonPool").invoke(null) as? ExecutorService } - ?.takeIf { isGoodCommonPool(fjpClass, it) } - ?.let { return it } - } - // Try to create private ForkJoinPool instance - Try { fjpClass.getConstructor(Int::class.java).newInstance(parallelism) as? ExecutorService } - ?. let { return it } - // Fallback to plain thread pool - return createPlainPool() - } - - /** - * Checks that this ForkJoinPool's parallelism is at least one to avoid pathological bugs. - */ - internal fun isGoodCommonPool(fjpClass: Class<*>, executor: ExecutorService): Boolean { - // We cannot use getParallelism, since it lies to us (always returns at least 1) - // So we submit a task and check that getPoolSize is at least one after that - // A broken FJP (that is configured for 0 parallelism) would not execute the task and - // would report its pool size as zero. - executor.submit {} - val actual = Try { fjpClass.getMethod("getPoolSize").invoke(executor) as? Int } - ?: return false - return actual >= 1 - } - - private fun createPlainPool(): ExecutorService { - val threadId = AtomicInteger() - return Executors.newFixedThreadPool(parallelism) { - Thread(it, "CommonPool-worker-${threadId.incrementAndGet()}").apply { isDaemon = true } - } - } - - @Synchronized - private fun getOrCreatePoolSync(): Executor = - pool ?: createPool().also { pool = it } - - override fun dispatch(context: CoroutineContext, block: Runnable) { - try { - (pool ?: getOrCreatePoolSync()).execute(wrapTask(block)) - } catch (e: RejectedExecutionException) { - unTrackTask() - // CommonPool only rejects execution when it is being closed and this behavior is reserved - // for testing purposes, so we don't have to worry about cancelling the affected Job here. - DefaultExecutor.enqueue(block) - } - } - - // used for tests - @Synchronized - internal fun usePrivatePool() { - shutdown(0) - usePrivatePool = true - pool = null - } - - // used for tests - @Synchronized - internal fun shutdown(timeout: Long) { - (pool as? ExecutorService)?.apply { - shutdown() - if (timeout > 0) - awaitTermination(timeout, TimeUnit.MILLISECONDS) - shutdownNow().forEach { DefaultExecutor.enqueue(it) } - } - pool = Executor { throw RejectedExecutionException("CommonPool was shutdown") } - } - - // used for tests - @Synchronized - internal fun restore() { - shutdown(0) - usePrivatePool = false - pool = null - } - - override fun toString(): String = "CommonPool" - - override fun close(): Unit = error("Close cannot be invoked on CommonPool") -} diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index e91bb9fd21..702a0d83ea 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -9,19 +9,6 @@ import kotlinx.coroutines.scheduling.* import kotlin.coroutines.* import kotlin.coroutines.jvm.internal.CoroutineStackFrame -internal const val COROUTINES_SCHEDULER_PROPERTY_NAME = "kotlinx.coroutines.scheduler" - -internal val useCoroutinesScheduler = systemProp(COROUTINES_SCHEDULER_PROPERTY_NAME).let { value -> - when (value) { - null, "", "on" -> true - "off" -> false - else -> error("System property '$COROUTINES_SCHEDULER_PROPERTY_NAME' has unrecognized value '$value'") - } -} - -internal actual fun createDefaultDispatcher(): CoroutineDispatcher = - if (useCoroutinesScheduler) DefaultScheduler else CommonPool - /** * Creates context for the new coroutine. It installs [Dispatchers.Default] when no other dispatcher nor * [ContinuationInterceptor] is specified, and adds optional support for debugging facilities (when turned on). diff --git a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt index d82598eab4..78723893c1 100644 --- a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt @@ -29,7 +29,7 @@ public actual object Dispatchers { * Level of parallelism X guarantees that no more than X tasks can be executed in this dispatcher in parallel. */ @JvmStatic - public actual val Default: CoroutineDispatcher = createDefaultDispatcher() + public actual val Default: CoroutineDispatcher = DefaultScheduler /** * A coroutine dispatcher that is confined to the Main thread operating with UI objects. diff --git a/kotlinx-coroutines-core/jvm/test/CommonPoolTest.kt b/kotlinx-coroutines-core/jvm/test/CommonPoolTest.kt deleted file mode 100644 index 8f9f855477..0000000000 --- a/kotlinx-coroutines-core/jvm/test/CommonPoolTest.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines - -import org.junit.Test -import java.lang.reflect.* -import java.util.concurrent.* -import kotlin.test.* - -@Suppress("DEPRECATION") -class CommonPoolTest { - private inline fun Try(block: () -> T) = try { block() } catch (e: Throwable) { null } - - @Test - fun testIsGoodCommonPool() { - // Test only on JDKs that has all we need - val fjpClass = Try { Class.forName("java.util.concurrent.ForkJoinPool") } ?: return - val wtfClass = Try { Class.forName("java.util.concurrent.ForkJoinPool${'$'}ForkJoinWorkerThreadFactory") } ?: return - val dwtfClass = Try { Class.forName("java.util.concurrent.ForkJoinPool${'$'}DefaultForkJoinWorkerThreadFactory") } ?: return - // We need private constructor to create "broken" FJP instance - val fjpCtor = Try { fjpClass.getDeclaredConstructor( - Int::class.java, - wtfClass, - Thread.UncaughtExceptionHandler::class.java, - Int::class.java, - String::class.java - ) } ?: return - fjpCtor.isAccessible = true - val dwtfCtor = Try { dwtfClass.getDeclaredConstructor() } ?: return - dwtfCtor.isAccessible = true - // Create bad pool - val fjp0: ExecutorService = createFJP(0, fjpCtor, dwtfCtor) ?: return - assertFalse(CommonPool.isGoodCommonPool(fjpClass, fjp0)) - fjp0.shutdown() - // Create good pool - val fjp1: ExecutorService = createFJP(1, fjpCtor, dwtfCtor) ?: return - assertTrue(CommonPool.isGoodCommonPool(fjpClass, fjp1)) - fjp1.shutdown() - } - - private fun createFJP( - parallelism: Int, - fjpCtor: Constructor, - dwtfCtor: Constructor - ): ExecutorService? = Try { - fjpCtor.newInstance( - parallelism, - dwtfCtor.newInstance(), - Thread.getDefaultUncaughtExceptionHandler(), - 0, - "Worker" - ) - } as? ExecutorService -} \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index 61a2c8b8b7..a8955f3e95 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -199,15 +199,12 @@ public actual open class TestBase(private var disableOutCheck: Boolean) { } fun initPoolsBeforeTest() { - CommonPool.usePrivatePool() DefaultScheduler.usePrivateScheduler() } fun shutdownPoolsAfterTest() { - CommonPool.shutdown(SHUTDOWN_TIMEOUT) DefaultScheduler.shutdown(SHUTDOWN_TIMEOUT) DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) - CommonPool.restore() DefaultScheduler.restore() } diff --git a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt index 2e61ec6bce..5e83d7e909 100644 --- a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt +++ b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt @@ -26,7 +26,6 @@ private val OUT_ENABLED = systemProp("guide.tests.sout", false) fun test(name: String, block: () -> R): List = outputException(name) { try { captureOutput(name, stdoutEnabled = OUT_ENABLED) { log -> - CommonPool.usePrivatePool() DefaultScheduler.usePrivateScheduler() DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) resetCoroutineId() @@ -39,7 +38,6 @@ fun test(name: String, block: () -> R): List = outputException(name) } finally { // the shutdown log.println("--- shutting down") - CommonPool.shutdown(SHUTDOWN_TIMEOUT) DefaultScheduler.shutdown(SHUTDOWN_TIMEOUT) shutdownDispatcherPools(SHUTDOWN_TIMEOUT) DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) // the last man standing -- cleanup all pending tasks @@ -47,7 +45,6 @@ fun test(name: String, block: () -> R): List = outputException(name) checkTestThreads(threadsBefore) // check thread if the main completed successfully } } finally { - CommonPool.restore() DefaultScheduler.restore() } } diff --git a/kotlinx-coroutines-core/native/src/CoroutineContext.kt b/kotlinx-coroutines-core/native/src/CoroutineContext.kt index 47afd8aded..ac0f43913c 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineContext.kt @@ -25,7 +25,7 @@ internal actual object DefaultExecutor : CoroutineDispatcher(), Delay { internal fun loopWasShutDown(): Nothing = error("Cannot execute task because event loop was shut down") -internal actual fun createDefaultDispatcher(): CoroutineDispatcher = +internal fun createDefaultDispatcher(): CoroutineDispatcher = DefaultExecutor @SharedImmutable From 1786eb09e05c95107d58ceff76540e1087e16ac4 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 9 Sep 2021 19:11:29 +0300 Subject: [PATCH 145/328] Introduce Dispatchers.shutdown (#2915) Fixes #2558 --- .../api/kotlinx-coroutines-core.api | 1 + .../common/src/EventLoop.common.kt | 4 +-- .../jvm/src/DefaultExecutor.kt | 35 +++++++++++++++---- .../jvm/src/Dispatchers.kt | 29 ++++++++++++++- kotlinx-coroutines-core/jvm/src/EventLoop.kt | 3 +- .../jvm/src/scheduling/Dispatcher.kt | 7 ++++ kotlinx-coroutines-core/jvm/test/TestBase.kt | 2 +- .../jvm/test/VirtualTimeSource.kt | 4 +-- .../jvm/test/knit/TestUtil.kt | 4 +-- 9 files changed, 73 insertions(+), 16 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index eb6b4184e7..fcd51ae2eb 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -279,6 +279,7 @@ public final class kotlinx/coroutines/Dispatchers { public static final fun getIO ()Lkotlinx/coroutines/CoroutineDispatcher; public static final fun getMain ()Lkotlinx/coroutines/MainCoroutineDispatcher; public static final fun getUnconfined ()Lkotlinx/coroutines/CoroutineDispatcher; + public final fun shutdown ()V } public final class kotlinx/coroutines/DispatchersKt { diff --git a/kotlinx-coroutines-core/common/src/EventLoop.common.kt b/kotlinx-coroutines-core/common/src/EventLoop.common.kt index e6a57c927a..e2a1ffd69f 100644 --- a/kotlinx-coroutines-core/common/src/EventLoop.common.kt +++ b/kotlinx-coroutines-core/common/src/EventLoop.common.kt @@ -115,7 +115,7 @@ internal abstract class EventLoop : CoroutineDispatcher() { } } - protected open fun shutdown() {} + open fun shutdown() {} } @ThreadLocal @@ -279,7 +279,7 @@ internal abstract class EventLoopImplBase: EventLoopImplPlatform(), Delay { public final override fun dispatch(context: CoroutineContext, block: Runnable) = enqueue(block) - public fun enqueue(task: Runnable) { + open fun enqueue(task: Runnable) { if (enqueueImpl(task)) { // todo: we should unpark only when this delayed task became first in the queue unpark() diff --git a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt index fe020276e5..2968825d15 100644 --- a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt +++ b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt @@ -17,13 +17,13 @@ internal actual object DefaultExecutor : EventLoopImplBase(), Runnable { incrementUseCount() // this event loop is never completed } - private const val DEFAULT_KEEP_ALIVE = 1000L // in milliseconds + private const val DEFAULT_KEEP_ALIVE_MS = 1000L // in milliseconds private val KEEP_ALIVE_NANOS = TimeUnit.MILLISECONDS.toNanos( try { - java.lang.Long.getLong("kotlinx.coroutines.DefaultExecutor.keepAlive", DEFAULT_KEEP_ALIVE) + java.lang.Long.getLong("kotlinx.coroutines.DefaultExecutor.keepAlive", DEFAULT_KEEP_ALIVE_MS) } catch (e: SecurityException) { - DEFAULT_KEEP_ALIVE + DEFAULT_KEEP_ALIVE_MS }) @Suppress("ObjectPropertyName") @@ -37,15 +37,39 @@ internal actual object DefaultExecutor : EventLoopImplBase(), Runnable { private const val ACTIVE = 1 private const val SHUTDOWN_REQ = 2 private const val SHUTDOWN_ACK = 3 + private const val SHUTDOWN = 4 @Volatile private var debugStatus: Int = FRESH + val isShutDown: Boolean get() = debugStatus == SHUTDOWN + private val isShutdownRequested: Boolean get() { val debugStatus = debugStatus return debugStatus == SHUTDOWN_REQ || debugStatus == SHUTDOWN_ACK } + actual override fun enqueue(task: Runnable) { + if (isShutDown) shutdownError() + super.enqueue(task) + } + + override fun reschedule(now: Long, delayedTask: DelayedTask) { + // Reschedule on default executor can only be invoked after Dispatchers.shutdown + shutdownError() + } + + private fun shutdownError() { + throw RejectedExecutionException("DefaultExecutor was shut down. " + + "This error indicates that Dispatchers.shutdown() was invoked prior to completion of exiting coroutines, leaving coroutines in incomplete state. " + + "Please refer to Dispatchers.shutdown documentation for more details") + } + + override fun shutdown() { + debugStatus = SHUTDOWN + super.shutdown() + } + /** * All event loops are using DefaultExecutor#invokeOnTimeout to avoid livelock on * ``` @@ -118,9 +142,8 @@ internal actual object DefaultExecutor : EventLoopImplBase(), Runnable { return true } - // used for tests - @Synchronized - fun shutdown(timeout: Long) { + @Synchronized // used _only_ for tests + fun shutdownForTests(timeout: Long) { val deadline = System.currentTimeMillis() + timeout if (!isShutdownRequested) debugStatus = SHUTDOWN_REQ // loop while there is anything to do immediately or deadline passes diff --git a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt index 78723893c1..a3be9fa53c 100644 --- a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt @@ -21,7 +21,7 @@ public const val IO_PARALLELISM_PROPERTY_NAME: String = "kotlinx.coroutines.io.p public actual object Dispatchers { /** * The default [CoroutineDispatcher] that is used by all standard builders like - * [launch][CoroutineScope.launch], [async][CoroutineScope.async], etc + * [launch][CoroutineScope.launch], [async][CoroutineScope.async], etc. * if no dispatcher nor any other [ContinuationInterceptor] is specified in their context. * * It is backed by a shared pool of threads on JVM. By default, the maximal level of parallelism used @@ -116,4 +116,31 @@ public actual object Dispatchers { */ @JvmStatic public val IO: CoroutineDispatcher = DefaultScheduler.IO + + /** + * Shuts down built-in dispatchers, such as [Default] and [IO], + * stopping all the threads associated with them and making them reject all new tasks. + * Dispatcher used as a fallback for time-related operations (`delay`, `withTimeout`) + * and to handle rejected tasks from other dispatchers is also shut down. + * + * This is a **delicate** API. It is not supposed to be called from a general + * application-level code and its invocation is irreversible. + * The invocation of shutdown affects most of the coroutines machinery and + * leaves the coroutines framework in an inoperable state. + * The shutdown method should only be invoked when there are no pending tasks or active coroutines. + * Otherwise, the behavior is unspecified: the call to `shutdown` may throw an exception without completing + * the shutdown, or it may finish successfully, but the remaining jobs will be in a permanent dormant state, + * never completing nor executing. + * + * The main goal of the shutdown is to stop all background threads associated with the coroutines + * framework in order to make kotlinx.coroutines classes unloadable by Java Virtual Machine. + * It is only recommended to be used in containerized environments (OSGi, Gradle plugins system, + * IDEA plugins) at the end of the container lifecycle. + */ + @DelicateCoroutinesApi + public fun shutdown() { + DefaultExecutor.shutdown() + // Also shuts down Dispatchers.IO + DefaultScheduler.shutdown() + } } diff --git a/kotlinx-coroutines-core/jvm/src/EventLoop.kt b/kotlinx-coroutines-core/jvm/src/EventLoop.kt index e49c7dc7e1..b17d1dad25 100644 --- a/kotlinx-coroutines-core/jvm/src/EventLoop.kt +++ b/kotlinx-coroutines-core/jvm/src/EventLoop.kt @@ -13,8 +13,7 @@ internal actual abstract class EventLoopImplPlatform: EventLoop() { unpark(thread) } - protected actual fun reschedule(now: Long, delayedTask: EventLoopImplBase.DelayedTask) { - assert { this !== DefaultExecutor } // otherwise default execution was shutdown with tasks in it (cannot be) + protected actual open fun reschedule(now: Long, delayedTask: EventLoopImplBase.DelayedTask) { DefaultExecutor.schedule(now, delayedTask) } } diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt b/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt index 7227b07c07..0b5a542c2c 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt @@ -14,6 +14,7 @@ import kotlin.coroutines.* * Default instance of coroutine dispatcher. */ internal object DefaultScheduler : ExperimentalCoroutineDispatcher() { + @JvmField val IO: CoroutineDispatcher = LimitingDispatcher( this, systemProp(IO_PARALLELISM_PROPERTY_NAME, 64.coerceAtLeast(AVAILABLE_PROCESSORS)), @@ -21,6 +22,12 @@ internal object DefaultScheduler : ExperimentalCoroutineDispatcher() { TASK_PROBABLY_BLOCKING ) + // Shuts down the dispatcher, used only by Dispatchers.shutdown() + internal fun shutdown() { + super.close() + } + + // Overridden in case anyone writes (Dispatchers.Default as ExecutorCoroutineDispatcher).close() override fun close() { throw UnsupportedOperationException("$DEFAULT_DISPATCHER_NAME cannot be closed") } diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index a8955f3e95..fce8eff3c5 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -204,7 +204,7 @@ public actual open class TestBase(private var disableOutCheck: Boolean) { fun shutdownPoolsAfterTest() { DefaultScheduler.shutdown(SHUTDOWN_TIMEOUT) - DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) + DefaultExecutor.shutdownForTests(SHUTDOWN_TIMEOUT) DefaultScheduler.restore() } diff --git a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt index bd9a185f6a..b4bc96ebdd 100644 --- a/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt +++ b/kotlinx-coroutines-core/jvm/test/VirtualTimeSource.kt @@ -11,14 +11,14 @@ import java.util.concurrent.locks.* private const val SHUTDOWN_TIMEOUT = 1000L internal inline fun withVirtualTimeSource(log: PrintStream? = null, block: () -> Unit) { - DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) // shutdown execution with old time source (in case it was working) + DefaultExecutor.shutdownForTests(SHUTDOWN_TIMEOUT) // shutdown execution with old time source (in case it was working) val testTimeSource = VirtualTimeSource(log) timeSource = testTimeSource DefaultExecutor.ensureStarted() // should start with new time source try { block() } finally { - DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) + DefaultExecutor.shutdownForTests(SHUTDOWN_TIMEOUT) testTimeSource.shutdown() timeSource = null // restore time source } diff --git a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt index 5e83d7e909..80c98030d9 100644 --- a/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt +++ b/kotlinx-coroutines-core/jvm/test/knit/TestUtil.kt @@ -27,7 +27,7 @@ fun test(name: String, block: () -> R): List = outputException(name) try { captureOutput(name, stdoutEnabled = OUT_ENABLED) { log -> DefaultScheduler.usePrivateScheduler() - DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) + DefaultExecutor.shutdownForTests(SHUTDOWN_TIMEOUT) resetCoroutineId() val threadsBefore = currentThreads() try { @@ -40,7 +40,7 @@ fun test(name: String, block: () -> R): List = outputException(name) log.println("--- shutting down") DefaultScheduler.shutdown(SHUTDOWN_TIMEOUT) shutdownDispatcherPools(SHUTDOWN_TIMEOUT) - DefaultExecutor.shutdown(SHUTDOWN_TIMEOUT) // the last man standing -- cleanup all pending tasks + DefaultExecutor.shutdownForTests(SHUTDOWN_TIMEOUT) // the last man standing -- cleanup all pending tasks } checkTestThreads(threadsBefore) // check thread if the main completed successfully } From 5636e43a8807a898a71bda46a110c846aa1d6e38 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Sat, 11 Sep 2021 00:33:28 +0300 Subject: [PATCH 146/328] Fix benchmarks compilation after migration to Kotlin 1.5.30 --- .../kotlin/benchmarks/flow/scrabble/SequencePlaysScrabble.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/jmh/kotlin/benchmarks/flow/scrabble/SequencePlaysScrabble.kt b/benchmarks/src/jmh/kotlin/benchmarks/flow/scrabble/SequencePlaysScrabble.kt index e7bd1f5fb9..acfb3f3c6d 100644 --- a/benchmarks/src/jmh/kotlin/benchmarks/flow/scrabble/SequencePlaysScrabble.kt +++ b/benchmarks/src/jmh/kotlin/benchmarks/flow/scrabble/SequencePlaysScrabble.kt @@ -30,7 +30,7 @@ open class SequencePlaysScrabble : ShakespearePlaysScrabble() { val bonusForDoubleLetter: (String) -> Int = { word: String -> toBeMaxed(word) .map { letterScores[it - 'a'.toInt()] } - .max()!! + .maxOrNull()!! } val score3: (String) -> Int = { word: String -> From a6a10b1a62e31311f18e74ebf52ea1f2f98d3691 Mon Sep 17 00:00:00 2001 From: Masood Fallahpoor Date: Mon, 13 Sep 2021 10:06:22 +0200 Subject: [PATCH 147/328] Make some corrections in 'Shared mutable state and concurrency' doc (#2929) --- docs/topics/shared-mutable-state-and-concurrency.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/shared-mutable-state-and-concurrency.md b/docs/topics/shared-mutable-state-and-concurrency.md index 40b0134a4b..1b84f136ce 100644 --- a/docs/topics/shared-mutable-state-and-concurrency.md +++ b/docs/topics/shared-mutable-state-and-concurrency.md @@ -9,7 +9,7 @@ but others are unique. ## The problem -Let us launch a hundred coroutines all doing the same action thousand times. +Let us launch a hundred coroutines all doing the same action a thousand times. We'll also measure their completion time for further comparisons: ```kotlin @@ -384,7 +384,7 @@ single reference to the actor can be carried around as its handle. The first step of using an actor is to define a class of messages that an actor is going to process. Kotlin's [sealed classes](https://kotlinlang.org/docs/reference/sealed-classes.html) are well suited for that purpose. We define `CounterMsg` sealed class with `IncCounter` message to increment a counter and `GetCounter` message -to get its value. The later needs to send a response. A [CompletableDeferred] communication +to get its value. The latter needs to send a response. A [CompletableDeferred] communication primitive, that represents a single value that will be known (communicated) in the future, is used here for that purpose. From 287a931d3b8ce534757c6c2399eb72e6574bcf69 Mon Sep 17 00:00:00 2001 From: Mark Hansen Date: Mon, 13 Sep 2021 21:08:00 +1000 Subject: [PATCH 148/328] Fix docs (#2928) Fix chapter pointer: it's the second next chapter. This probably used to be the next chapter, but not any more. --- docs/topics/cancellation-and-timeouts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/cancellation-and-timeouts.md b/docs/topics/cancellation-and-timeouts.md index 5221db922a..43977a9b44 100644 --- a/docs/topics/cancellation-and-timeouts.md +++ b/docs/topics/cancellation-and-timeouts.md @@ -388,7 +388,7 @@ If you run the above code you'll see that it does not always print zero, though of your machine you may need to tweak timeouts in this example to actually see non-zero values. > Note, that incrementing and decrementing `acquired` counter here from 100K coroutines is completely safe, -> since it always happens from the same main thread. More on that will be explained in the next chapter +> since it always happens from the same main thread. More on that will be explained in the chapter > on coroutine context. > {type="note"} From 61a039301d9de98266a8e4bd2dd33265543da168 Mon Sep 17 00:00:00 2001 From: Nikita Nazarov Date: Mon, 20 Sep 2021 10:41:26 +0300 Subject: [PATCH 149/328] Add method that allows IDEA debugger to retrieve enhanced stack trace in a JSON format (#2933) --- .../jvm/src/debug/internal/DebugProbesImpl.kt | 35 ++++++++++--- ...nhanceStackTraceWithTreadDumpAsJsonTest.kt | 49 +++++++++++++++++++ 2 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 kotlinx-coroutines-debug/test/EnhanceStackTraceWithTreadDumpAsJsonTest.kt diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index f0fc50e658..e6cddbca1c 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -183,7 +183,6 @@ internal object DebugProbesImpl { */ @OptIn(ExperimentalStdlibApi::class) public fun dumpCoroutinesInfoAsJsonAndReferences(): Array { - fun Any.toStringWithQuotes() = "\"$this\"" val coroutinesInfo = dumpCoroutinesInfo() val size = coroutinesInfo.size val lastObservedThreads = ArrayList(size) @@ -196,11 +195,11 @@ internal object DebugProbesImpl { coroutinesInfoAsJson.add( """ { - "name": $name, - "id": ${context[CoroutineId.Key]?.id}, - "dispatcher": $dispatcher, - "sequenceNumber": ${info.sequenceNumber}, - "state": "${info.state}" + "name": $name, + "id": ${context[CoroutineId.Key]?.id}, + "dispatcher": $dispatcher, + "sequenceNumber": ${info.sequenceNumber}, + "state": "${info.state}" } """.trimIndent() ) @@ -216,6 +215,30 @@ internal object DebugProbesImpl { ) } + /* + * Internal (JVM-public) method used by IDEA debugger as of 1.6.0-RC. + */ + public fun enhanceStackTraceWithThreadDumpAsJson(info: DebugCoroutineInfo): String { + val stackTraceElements = enhanceStackTraceWithThreadDump(info, info.lastObservedStackTrace) + val stackTraceElementsInfoAsJson = mutableListOf() + for (element in stackTraceElements) { + stackTraceElementsInfoAsJson.add( + """ + { + "declaringClass": "${element.className}", + "methodName": "${element.methodName}", + "fileName": ${element.fileName?.toStringWithQuotes()}, + "lineNumber": ${element.lineNumber} + } + """.trimIndent() + ) + } + + return "[${stackTraceElementsInfoAsJson.joinToString()}]" + } + + private fun Any.toStringWithQuotes() = "\"$this\"" + /* * Internal (JVM-public) method used by IDEA debugger as of 1.4-M3. */ diff --git a/kotlinx-coroutines-debug/test/EnhanceStackTraceWithTreadDumpAsJsonTest.kt b/kotlinx-coroutines-debug/test/EnhanceStackTraceWithTreadDumpAsJsonTest.kt new file mode 100644 index 0000000000..fcf9f1a9a9 --- /dev/null +++ b/kotlinx-coroutines-debug/test/EnhanceStackTraceWithTreadDumpAsJsonTest.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +package kotlinx.coroutines.debug + +import com.google.gson.* +import kotlinx.coroutines.* +import kotlinx.coroutines.debug.internal.* +import org.junit.Test +import kotlin.test.* + +class EnhanceStackTraceWithTreadDumpAsJsonTest : DebugTestBase() { + private data class StackTraceElementInfoFromJson( + val declaringClass: String, + val methodName: String, + val fileName: String?, + val lineNumber: Int + ) + + @Test + fun testEnhancedStackTraceFormatWithDeferred() = runTest { + val deferred = async { + suspendingMethod() + assertTrue(true) + } + yield() + + val coroutineInfo = DebugProbesImpl.dumpCoroutinesInfo() + assertEquals(coroutineInfo.size, 2) + val info = coroutineInfo[1] + val enhancedStackTraceAsJsonString = DebugProbesImpl.enhanceStackTraceWithThreadDumpAsJson(info) + val enhancedStackTraceFromJson = Gson().fromJson(enhancedStackTraceAsJsonString, Array::class.java) + val enhancedStackTrace = DebugProbesImpl.enhanceStackTraceWithThreadDump(info, info.lastObservedStackTrace) + assertEquals(enhancedStackTrace.size, enhancedStackTraceFromJson.size) + for ((frame, frameFromJson) in enhancedStackTrace.zip(enhancedStackTraceFromJson)) { + assertEquals(frame.className, frameFromJson.declaringClass) + assertEquals(frame.methodName, frameFromJson.methodName) + assertEquals(frame.fileName, frameFromJson.fileName) + assertEquals(frame.lineNumber, frameFromJson.lineNumber) + } + + deferred.cancelAndJoin() + } + + private suspend fun suspendingMethod() { + delay(Long.MAX_VALUE) + } +} From d07b6b224806f2687abee2a896b33c85f0f021b7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 21 Sep 2021 14:50:00 +0300 Subject: [PATCH 150/328] Update license year in NOTICE.txt Fixes #2934 --- license/NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/license/NOTICE.txt b/license/NOTICE.txt index d1d00c1a87..8d1100a3a5 100644 --- a/license/NOTICE.txt +++ b/license/NOTICE.txt @@ -5,4 +5,4 @@ ========================================================================= kotlinx.coroutines library. -Copyright 2016-2019 JetBrains s.r.o and respective authors and developers \ No newline at end of file +Copyright 2016-2021 JetBrains s.r.o and respective authors and developers From bf41f2167bbaeab2bd2745532d049bb6327d0b05 Mon Sep 17 00:00:00 2001 From: Brian Hoffmann Date: Thu, 23 Sep 2021 18:08:15 +0200 Subject: [PATCH 151/328] Documentation: Kotlin 1.5.30 (#2948) Adjust documented Kotlin version to 1.5.30 according to the rest of the document --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a13f07aa3..5fc8973330 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ And make sure that you use the latest Kotlin version: ```groovy plugins { - kotlin("jvm") version "1.5.20" + kotlin("jvm") version "1.5.30" } ``` From 73ba62aadd078acf2259126a7f47c95f76068ebc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 23 Sep 2021 19:19:31 +0300 Subject: [PATCH 152/328] Promote newSingleThreadContext and newFixedThreadPoolContext to delicate API (#2922) * Mention CoroutineDispatcher.limitedParallelism as an intended replacement * Prepare the API to sharing with K/N new memory model where we _have_ to have this API Addresses #2919 --- .../jvm/src/ThreadPoolDispatcher.kt | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt index 99e3b46cce..32df8bfcdf 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt @@ -17,11 +17,12 @@ import java.util.concurrent.atomic.AtomicInteger * then the [Job] of the affected task is [cancelled][Job.cancel] and the task is submitted to the * [Dispatchers.IO], so that the affected coroutine can cleanup its resources and promptly complete. * - * **NOTE: This API will be replaced in the future**. A different API to create thread-limited thread pools - * that is based on a shared thread-pool and does not require the resulting dispatcher to be explicitly closed - * will be provided, thus avoiding potential thread leaks and also significantly improving performance, due - * to coroutine-oriented scheduling policy and thread-switch minimization. - * See [issue #261](https://github.com/Kotlin/kotlinx.coroutines/issues/261) for details. + * This is a **delicate** API. The result of this method is a closeable resource with the + * associated native resources (threads). It should not be allocated in place, + * should be closed at the end of its lifecycle, and has non-trivial memory and CPU footprint. + * If you do not need a separate thread-pool, but only have to limit effective parallelism of the dispatcher, + * it is recommended to use [CoroutineDispatcher.limitedParallelism] instead. + * * If you need a completely separate thread-pool with scheduling policy that is based on the standard * JDK executors, use the following expression: * `Executors.newSingleThreadExecutor().asCoroutineDispatcher()`. @@ -29,7 +30,7 @@ import java.util.concurrent.atomic.AtomicInteger * * @param name the base name of the created thread. */ -@ObsoleteCoroutinesApi +@DelicateCoroutinesApi public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = newFixedThreadPoolContext(1, name) @@ -43,11 +44,12 @@ public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = * then the [Job] of the affected task is [cancelled][Job.cancel] and the task is submitted to the * [Dispatchers.IO], so that the affected coroutine can cleanup its resources and promptly complete. * - * **NOTE: This API will be replaced in the future**. A different API to create thread-limited thread pools - * that is based on a shared thread-pool and does not require the resulting dispatcher to be explicitly closed - * will be provided, thus avoiding potential thread leaks and also significantly improving performance, due - * to coroutine-oriented scheduling policy and thread-switch minimization. - * See [issue #261](https://github.com/Kotlin/kotlinx.coroutines/issues/261) for details. + * This is a **delicate** API. The result of this method is a closeable resource with the + * associated native resources (threads). It should not be allocated in place, + * should be closed at the end of its lifecycle, and has non-trivial memory and CPU footprint. + * If you do not need a separate thread-pool, but only have to limit effective parallelism of the dispatcher, + * it is recommended to use [CoroutineDispatcher.limitedParallelism] instead. + * * If you need a completely separate thread-pool with scheduling policy that is based on the standard * JDK executors, use the following expression: * `Executors.newFixedThreadPool().asCoroutineDispatcher()`. @@ -56,7 +58,7 @@ public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = * @param nThreads the number of threads. * @param name the base name of the created threads. */ -@ObsoleteCoroutinesApi +@DelicateCoroutinesApi public fun newFixedThreadPoolContext(nThreads: Int, name: String): ExecutorCoroutineDispatcher { require(nThreads >= 1) { "Expected at least one thread, but $nThreads specified" } val threadNo = AtomicInteger() From 76fbfc939f224ec2c1ac2e3b600db037e70641e6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 24 Sep 2021 17:49:49 +0300 Subject: [PATCH 153/328] Cleanup root Gradle script --- build.gradle | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index e4b12ff3ad..6e0b250ea3 100644 --- a/build.gradle +++ b/build.gradle @@ -47,12 +47,6 @@ buildscript { } } - if (using_snapshot_version) { - repositories { - mavenLocal() - } - } - repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } @@ -102,13 +96,6 @@ allprojects { kotlin_version = rootProject.properties['kotlin_snapshot_version'] } - if (using_snapshot_version) { - repositories { - mavenLocal() - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } - } - } - ext.unpublished = unpublished // This project property is set during nightly stress test @@ -139,6 +126,7 @@ allprojects { */ google() mavenCentral() + maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } } } From 5c75e7ad58337dcce68b00f5f7e40bfc0108dce7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 27 Sep 2021 11:55:48 +0300 Subject: [PATCH 154/328] Add version file to each module resources (#2950) * Add version file to each module resources * The approach with "Specification-Version" in Manifest doesn't work because Android merges all JARs into a single resource, trimming all the manifests Fixes #2941 --- build.gradle | 34 ++++++++++++++++ integration-testing/build.gradle | 1 + ...t => MavenPublicationAtomicfuValidator.kt} | 2 +- .../MavenPublicationVersionValidator.kt | 40 +++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) rename integration-testing/src/mavenTest/kotlin/{MavenPublicationValidator.kt => MavenPublicationAtomicfuValidator.kt} (97%) create mode 100644 integration-testing/src/mavenTest/kotlin/MavenPublicationVersionValidator.kt diff --git a/build.gradle b/build.gradle index 6e0b250ea3..f55e6c39d2 100644 --- a/build.gradle +++ b/build.gradle @@ -233,6 +233,40 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { } } } + + def thisProject = it + if (thisProject.name in sourceless) { + return + } + + def versionFileTask = thisProject.tasks.register("versionFileTask") { + def name = thisProject.name.replace("-", "_") + def versionFile = thisProject.layout.buildDirectory.file("${name}.version") + it.outputs.file(versionFile) + + it.doLast { + versionFile.get().asFile.text = version.toString() + } + } + + List jarTasks + if (it.name == "kotlinx-coroutines-core") { + jarTasks = ["jvmJar", "metadataJar"] + } else if (it.name == "kotlinx-coroutines-debug") { + // We shadow debug module instead of just packaging it + jarTasks = ["shadowJar"] + } else { + jarTasks = ["jar"] + } + + for (name in jarTasks) { + thisProject.tasks.named(name, Jar) { + it.dependsOn versionFileTask + it.from(versionFileTask) { + into("META-INF") + } + } + } } // Report Kotlin compiler version when building project diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index 6efa3a14e6..d0286d7d55 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -58,6 +58,7 @@ task npmTest(type: Test) { } task mavenTest(type: Test) { + environment "version", version def sourceSet = sourceSets.mavenTest dependsOn(project(':').getTasksByName("publishToMavenLocal", true)) testClassesDirs = sourceSet.output.classesDirs diff --git a/integration-testing/src/mavenTest/kotlin/MavenPublicationValidator.kt b/integration-testing/src/mavenTest/kotlin/MavenPublicationAtomicfuValidator.kt similarity index 97% rename from integration-testing/src/mavenTest/kotlin/MavenPublicationValidator.kt rename to integration-testing/src/mavenTest/kotlin/MavenPublicationAtomicfuValidator.kt index 39d6598b55..dbb1921d80 100644 --- a/integration-testing/src/mavenTest/kotlin/MavenPublicationValidator.kt +++ b/integration-testing/src/mavenTest/kotlin/MavenPublicationAtomicfuValidator.kt @@ -8,7 +8,7 @@ import org.junit.* import org.junit.Assert.assertTrue import java.util.jar.* -class MavenPublicationValidator { +class MavenPublicationAtomicfuValidator { private val ATOMIC_FU_REF = "Lkotlinx/atomicfu/".toByteArray() @Test diff --git a/integration-testing/src/mavenTest/kotlin/MavenPublicationVersionValidator.kt b/integration-testing/src/mavenTest/kotlin/MavenPublicationVersionValidator.kt new file mode 100644 index 0000000000..da87d4cc59 --- /dev/null +++ b/integration-testing/src/mavenTest/kotlin/MavenPublicationVersionValidator.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.validator + +import org.junit.* +import org.junit.Test +import java.util.jar.* +import kotlin.test.* + +class MavenPublicationVersionValidator { + + @Test + fun testMppJar() { + val clazz = Class.forName("kotlinx.coroutines.Job") + JarFile(clazz.protectionDomain.codeSource.location.file).checkForVersion("kotlinx_coroutines_core.version") + } + + @Test + fun testAndroidJar() { + val clazz = Class.forName("kotlinx.coroutines.android.HandlerDispatcher") + JarFile(clazz.protectionDomain.codeSource.location.file).checkForVersion("kotlinx_coroutines_android.version") + } + + private fun JarFile.checkForVersion(file: String) { + val actualFile = "META-INF/$file" + val version = System.getenv("version") + use { + for (e in entries()) { + if (e.name == actualFile) { + val string = getInputStream(e).readAllBytes().decodeToString() + assertEquals(version, string) + return + } + } + error("File $file not found") + } + } +} From e4bee7474bba0dd3e54c80ced0a315d62d45b1af Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 27 Sep 2021 17:17:11 +0300 Subject: [PATCH 155/328] Migrate from deprecated packages in js-example (#2955) --- js/example-frontend-js/src/ExampleMain.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/example-frontend-js/src/ExampleMain.kt b/js/example-frontend-js/src/ExampleMain.kt index d4e530b04a..67c6ef04e7 100644 --- a/js/example-frontend-js/src/ExampleMain.kt +++ b/js/example-frontend-js/src/ExampleMain.kt @@ -8,7 +8,7 @@ import kotlinx.html.div import kotlinx.html.dom.* import kotlinx.html.js.onClickFunction import org.w3c.dom.* -import kotlin.browser.* +import kotlinx.browser.* import kotlin.coroutines.* import kotlin.math.* import kotlin.random.Random From 60eefecc6d58bc2ff024b5d56c6867b083103d16 Mon Sep 17 00:00:00 2001 From: Vadim Semenov <6957841+vadimsemenov@users.noreply.github.com> Date: Thu, 30 Sep 2021 13:52:56 +0100 Subject: [PATCH 156/328] Breaking change: Guava future coroutine builder shouldn't report to CoroutineExceptionHandler (#2840) This change makes `future` coroutine builder consistent with `java.util.concurrent.FutureTask` which also drops exceptions that happen after successful cancellation. Fixes #2774 Fixes #2791 --- .../src/ListenableFuture.kt | 45 ++++++----- .../test/ListenableFutureTest.kt | 79 +++++++++++++------ 2 files changed, 80 insertions(+), 44 deletions(-) diff --git a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt index 8f11e0a916..d214cc6b1a 100644 --- a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt +++ b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt @@ -14,7 +14,7 @@ import kotlin.coroutines.* /** * Starts [block] in a new coroutine and returns a [ListenableFuture] pointing to its result. * - * The coroutine is immediately started. Passing [CoroutineStart.LAZY] to [start] throws + * The coroutine is started immediately. Passing [CoroutineStart.LAZY] to [start] throws * [IllegalArgumentException], because Futures don't have a way to start lazily. * * When the created coroutine [isCompleted][Job.isCompleted], it will try to @@ -35,10 +35,12 @@ import kotlin.coroutines.* * See [newCoroutineContext][CoroutineScope.newCoroutineContext] for a description of debugging * facilities. * - * Note that the error and cancellation semantics of [future] are _subtly different_ than [asListenableFuture]'s. - * In particular, any exception that happens in the coroutine after returned future is - * successfully cancelled will be passed to the [CoroutineExceptionHandler] from the [context]. - * See [ListenableFutureCoroutine] for details. + * Note that the error and cancellation semantics of [future] are _different_ than [async]'s. + * In contrast to [Deferred], [Future] doesn't have an intermediate `Cancelling` state. If + * the returned `Future` is successfully cancelled, and `block` throws afterward, the thrown + * error is dropped, and getting the `Future`'s value will throw a `CancellationException` with + * no cause. This is to match the specification and behavior of + * `java.util.concurrent.FutureTask`. * * @param context added overlaying [CoroutineScope.coroutineContext] to form the new context. * @param start coroutine start option. The default value is [CoroutineStart.DEFAULT]. @@ -241,8 +243,8 @@ public suspend fun ListenableFuture.await(): T { return suspendCancellableCoroutine { cont: CancellableContinuation -> addListener( - ToContinuation(this, cont), - MoreExecutors.directExecutor()) + ToContinuation(this, cont), + MoreExecutors.directExecutor()) cont.invokeOnCancellation { cancel(false) } @@ -284,16 +286,13 @@ private class ToContinuation( * By documented contract, a [Future] has been cancelled if * and only if its `isCancelled()` method returns true. * - * Any error that occurs after successfully cancelling a [ListenableFuture] will be passed - * to the [CoroutineExceptionHandler] from the context. The contract of [Future] does not permit - * it to return an error after it is successfully cancelled. - * - * By calling [asListenableFuture] on a [Deferred], any error that occurs after successfully - * cancelling the [ListenableFuture] representation of the [Deferred] will _not_ be passed to - * the [CoroutineExceptionHandler]. Cancelling a [Deferred] places that [Deferred] in the - * cancelling/cancelled states defined by [Job], which _can_ show the error. It's assumed that - * the [Deferred] pointing to the task will be used to observe any error outcome occurring after - * cancellation. + * Any error that occurs after successfully cancelling a [ListenableFuture] is lost. + * The contract of [Future] does not permit it to return an error after it is successfully cancelled. + * On the other hand, we can't report an unhandled exception to [CoroutineExceptionHandler], + * otherwise [Future.cancel] can lead to an app crash which arguably is a contract violation. + * In contrast to [Future] which can't change its outcome after a successful cancellation, + * cancelling a [Deferred] places that [Deferred] in the cancelling/cancelled states defined by [Job], + * which _can_ show the error. * * This may be counterintuitive, but it maintains the error and cancellation contracts of both * the [Deferred] and [ListenableFuture] types, while permitting both kinds of promise to point @@ -312,10 +311,14 @@ private class ListenableFutureCoroutine( } override fun onCancelled(cause: Throwable, handled: Boolean) { - if (!future.completeExceptionallyOrCancel(cause) && !handled) { - // prevents loss of exception that was not handled by parent & could not be set to JobListenableFuture - handleCoroutineException(context, cause) - } + // Note: if future was cancelled in a race with a cancellation of this + // coroutine, and the future was successfully cancelled first, the cause of coroutine + // cancellation is dropped in this promise. A Future can only be completed once. + // + // This is consistent with FutureTask behaviour. A race between a Future.cancel() and + // a FutureTask.setException() for the same Future will similarly drop the + // cause of a failure-after-cancellation. + future.completeExceptionallyOrCancel(cause) } } diff --git a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt index 69ba193071..581e09abdd 100644 --- a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt +++ b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt @@ -555,11 +555,7 @@ class ListenableFutureTest : TestBase() { } @Test - fun testUnhandledExceptionOnExternalCancellation() = runTest( - unhandled = listOf( - { it -> it is TestException } // exception is unhandled because there is no parent - ) - ) { + fun testUnhandledExceptionOnExternalCancellation() = runTest { expect(1) // No parent here (NonCancellable), so nowhere to propagate exception val result = future(NonCancellable + Dispatchers.Unconfined) { @@ -567,7 +563,7 @@ class ListenableFutureTest : TestBase() { delay(Long.MAX_VALUE) } finally { expect(2) - throw TestException() // this exception cannot be handled + throw TestException() // this exception cannot be handled and is set to be lost. } } result.cancel(true) @@ -708,23 +704,6 @@ class ListenableFutureTest : TestBase() { assertEquals(testException, thrown.cause) } - @Test - fun stressTestJobListenableFutureIsCancelledDoesNotThrow() = runTest { - repeat(1000) { - val deferred = CompletableDeferred() - val asListenableFuture = deferred.asListenableFuture() - // We heed two threads to test a race condition. - withContext(Dispatchers.Default) { - val cancellationJob = launch { - asListenableFuture.cancel(false) - } - while (!cancellationJob.isCompleted) { - asListenableFuture.isCancelled // Shouldn't throw. - } - } - } - } - private inline fun ListenableFuture<*>.checkFutureException() { val e = assertFailsWith { get() } val cause = e.cause!! @@ -775,4 +754,58 @@ class ListenableFutureTest : TestBase() { assertEquals(count, completed.get()) } } + + @Test + fun futurePropagatesExceptionToParentAfterCancellation() = runTest { + val latch = CompletableDeferred() + val parent = Job() + val scope = CoroutineScope(parent) + val exception = TestException("propagated to parent") + val future = scope.future { + withContext(NonCancellable) { + latch.await() + throw exception + } + } + future.cancel(true) + latch.complete(true) + parent.join() + assertTrue(parent.isCancelled) + assertEquals(exception, parent.getCancellationException().cause) + } + + // Stress tests. + + @Test + fun testFutureDoesNotReportToCoroutineExceptionHandler() = runTest { + repeat(1000) { + supervisorScope { // Don't propagate failures in children to parent and other children. + val innerFuture = SettableFuture.create() + val outerFuture = async { innerFuture.await() } + + withContext(Dispatchers.Default) { + launch { innerFuture.setException(TestException("can be lost")) } + launch { outerFuture.cancel() } + // nothing should be reported to CoroutineExceptionHandler, otherwise `Future.cancel` contract violation. + } + } + } + } + + @Test + fun testJobListenableFutureIsCancelledDoesNotThrow() = runTest { + repeat(1000) { + val deferred = CompletableDeferred() + val asListenableFuture = deferred.asListenableFuture() + // We heed two threads to test a race condition. + withContext(Dispatchers.Default) { + val cancellationJob = launch { + asListenableFuture.cancel(false) + } + while (!cancellationJob.isCompleted) { + asListenableFuture.isCancelled // Shouldn't throw. + } + } + } + } } From 1ba202def4a2f35934e23dbecc950768677fb6b8 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 5 Oct 2021 18:03:15 +0300 Subject: [PATCH 157/328] Update binary compatibility validator (#2969) * Update binary compatibility validator * Fix race in testFuturePropagatesExceptionToParentAfterCancellation --- gradle.properties | 2 +- .../test/ListenableFutureTest.kt | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 26e5147c51..46eef4d76e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.7.0 +binary_compatibility_validator_version=0.8.0-RC blockhound_version=1.0.2.RELEASE jna_version=5.5.0 diff --git a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt index 581e09abdd..511b1b0322 100644 --- a/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt +++ b/integration/kotlinx-coroutines-guava/test/ListenableFutureTest.kt @@ -756,19 +756,22 @@ class ListenableFutureTest : TestBase() { } @Test - fun futurePropagatesExceptionToParentAfterCancellation() = runTest { - val latch = CompletableDeferred() + fun testFuturePropagatesExceptionToParentAfterCancellation() = runTest { + val throwLatch = CompletableDeferred() + val cancelLatch = CompletableDeferred() val parent = Job() val scope = CoroutineScope(parent) val exception = TestException("propagated to parent") val future = scope.future { + cancelLatch.complete(true) withContext(NonCancellable) { - latch.await() + throwLatch.await() throw exception } } + cancelLatch.await() future.cancel(true) - latch.complete(true) + throwLatch.complete(true) parent.join() assertTrue(parent.isCancelled) assertEquals(exception, parent.getCancellationException().cause) From 2706a76ae793c40482fed6e23ba30fecf2ae63b4 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Fri, 8 Oct 2021 10:04:45 +0300 Subject: [PATCH 158/328] Make kotlinx-coroutines-test an MPP (#2965) Change the build scripts and the file layout so that kotlinx-coroutines-test is built on all platforms. --- build.gradle | 54 ++-- buildSrc/src/main/kotlin/OptInPreset.kt | 13 + buildSrc/src/main/kotlin/SourceSets.kt | 19 ++ gradle/dokka.gradle.kts | 2 +- gradle/opt-in.gradle | 13 - gradle/publish.gradle | 2 +- kotlinx-coroutines-core/build.gradle | 15 +- .../common/src/Unconfined.kt | 2 +- .../common/src/flow/Migration.kt | 2 +- .../api/kotlinx-coroutines-test.api | 7 +- kotlinx-coroutines-test/build.gradle.kts | 10 +- .../{ => common}/src/DelayController.kt | 2 +- .../{ => common}/src/TestBuilders.kt | 21 +- .../src/TestCoroutineDispatcher.kt | 7 +- .../src/TestCoroutineExceptionHandler.kt | 14 +- .../{ => common}/src/TestCoroutineScope.kt | 4 +- .../common/src/TestDispatchers.kt | 26 ++ .../{ => common}/test/TestBuildersTest.kt | 3 +- .../test/TestCoroutineDispatcherOrderTest.kt | 25 +- .../test/TestCoroutineDispatcherTest.kt | 44 +--- .../test/TestCoroutineExceptionHandlerTest.kt | 3 +- .../test/TestCoroutineScopeTest.kt | 5 +- .../{ => common}/test/TestModuleHelpers.kt | 13 +- .../test/TestRunBlockingOrderTest.kt | 23 +- .../{ => common}/test/TestRunBlockingTest.kt | 244 +++++++++++------- .../js/src/TestDispatchers.kt | 16 ++ .../META-INF/proguard/coroutines.pro | 0 ....coroutines.internal.MainDispatcherFactory | 0 .../jvm/src/TestDispatchers.kt | 24 ++ .../src/internal/TestMainDispatcher.kt} | 2 +- .../jvm/test/MultithreadingTest.kt | 89 +++++++ .../jvm/test/TestDispatchersTest.kt | 72 ++++++ .../native/src/TestDispatchers.kt | 17 ++ kotlinx-coroutines-test/npm/README.md | 4 + kotlinx-coroutines-test/npm/package.json | 23 ++ .../src/TestDispatchers.kt | 38 --- .../test/TestDispatchersTest.kt | 89 ------- 37 files changed, 577 insertions(+), 370 deletions(-) create mode 100644 buildSrc/src/main/kotlin/OptInPreset.kt create mode 100644 buildSrc/src/main/kotlin/SourceSets.kt delete mode 100644 gradle/opt-in.gradle rename kotlinx-coroutines-test/{ => common}/src/DelayController.kt (97%) rename kotlinx-coroutines-test/{ => common}/src/TestBuilders.kt (85%) rename kotlinx-coroutines-test/{ => common}/src/TestCoroutineDispatcher.kt (98%) rename kotlinx-coroutines-test/{ => common}/src/TestCoroutineExceptionHandler.kt (81%) rename kotlinx-coroutines-test/{ => common}/src/TestCoroutineScope.kt (95%) create mode 100644 kotlinx-coroutines-test/common/src/TestDispatchers.kt rename kotlinx-coroutines-test/{ => common}/test/TestBuildersTest.kt (97%) rename kotlinx-coroutines-test/{ => common}/test/TestCoroutineDispatcherOrderTest.kt (58%) rename kotlinx-coroutines-test/{ => common}/test/TestCoroutineDispatcherTest.kt (69%) rename kotlinx-coroutines-test/{ => common}/test/TestCoroutineExceptionHandlerTest.kt (85%) rename kotlinx-coroutines-test/{ => common}/test/TestCoroutineScopeTest.kt (74%) rename kotlinx-coroutines-test/{ => common}/test/TestModuleHelpers.kt (60%) rename kotlinx-coroutines-test/{ => common}/test/TestRunBlockingOrderTest.kt (70%) rename kotlinx-coroutines-test/{ => common}/test/TestRunBlockingTest.kt (56%) create mode 100644 kotlinx-coroutines-test/js/src/TestDispatchers.kt rename kotlinx-coroutines-test/{ => jvm}/resources/META-INF/proguard/coroutines.pro (100%) rename kotlinx-coroutines-test/{ => jvm}/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory (100%) create mode 100644 kotlinx-coroutines-test/jvm/src/TestDispatchers.kt rename kotlinx-coroutines-test/{src/internal/MainTestDispatcher.kt => jvm/src/internal/TestMainDispatcher.kt} (95%) create mode 100644 kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt create mode 100644 kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt create mode 100644 kotlinx-coroutines-test/native/src/TestDispatchers.kt create mode 100644 kotlinx-coroutines-test/npm/README.md create mode 100644 kotlinx-coroutines-test/npm/package.json delete mode 100644 kotlinx-coroutines-test/src/TestDispatchers.kt delete mode 100644 kotlinx-coroutines-test/test/TestDispatchersTest.kt diff --git a/build.gradle b/build.gradle index f55e6c39d2..26b598ff5d 100644 --- a/build.gradle +++ b/build.gradle @@ -4,14 +4,13 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.konan.target.HostManager -import org.gradle.util.VersionNumber import org.jetbrains.dokka.gradle.DokkaTaskPartial -import org.jetbrains.dokka.gradle.DokkaMultiModuleTask apply plugin: 'jdk-convention' -apply from: rootProject.file("gradle/opt-in.gradle") def coreModule = "kotlinx-coroutines-core" +def testModule = "kotlinx-coroutines-test" +def multiplatform = [coreModule, testModule] // Not applicable for Kotlin plugin def sourceless = ['kotlinx.coroutines', 'kotlinx-coroutines-bom', 'integration-testing'] def internal = ['kotlinx.coroutines', 'benchmarks', 'integration-testing'] @@ -112,7 +111,7 @@ apiValidation { ignoredProjects += unpublished + ["kotlinx-coroutines-bom"] if (build_snapshot_train) { ignoredProjects.remove("example-frontend-js") - ignoredProjects.add("kotlinx-coroutines-core") + ignoredProjects.add(coreModule) } ignoredPackages += "kotlinx.coroutines.internal" } @@ -133,13 +132,31 @@ allprojects { // Add dependency to core source sets. Core is configured in kx-core/build.gradle configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) { evaluationDependsOn(":$coreModule") - def platform = PlatformKt.platformOf(it) - apply plugin: "kotlin-${platform}-conventions" - dependencies { - // See comment below for rationale, it will be replaced with "project" dependency - api project(":$coreModule") - // the only way IDEA can resolve test classes - testImplementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs + if (it.name in multiplatform) { + apply plugin: "kotlin-multiplatform" + apply from: rootProject.file("gradle/compile-jvm-multiplatform.gradle") + apply from: rootProject.file("gradle/compile-common.gradle") + + if (rootProject.ext["native_targets_enabled"] as Boolean) { + apply from: rootProject.file("gradle/compile-native-multiplatform.gradle") + } + + apply from: rootProject.file("gradle/compile-js-multiplatform.gradle") + apply from: rootProject.file("gradle/publish-npm-js.gradle") + kotlin.sourceSets.commonMain.dependencies { + api project(":$coreModule") + } + kotlin.sourceSets.jvmTest.dependencies { + implementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs + } + } else { + def platform = PlatformKt.platformOf(it) + apply plugin: "kotlin-${platform}-conventions" + dependencies { + api project(":$coreModule") + // the only way IDEA can resolve test classes + testImplementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs + } } } @@ -150,7 +167,7 @@ configure(subprojects.findAll { !sourceless.contains(it.name) }) { // Configure options for all Kotlin compilation tasks tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all { - kotlinOptions.freeCompilerArgs += optInAnnotations.collect { "-Xopt-in=" + it } + kotlinOptions.freeCompilerArgs += OptInPresetKt.optInAnnotations.collect { "-Xopt-in=" + it } kotlinOptions.freeCompilerArgs += "-progressive" // Disable KT-36770 for RxJava2 integration kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated" @@ -177,7 +194,7 @@ if (build_snapshot_train) { } println "Manifest of kotlin-compiler-embeddable.jar for coroutines" - configure(subprojects.findAll { it.name == "kotlinx-coroutines-core" }) { + configure(subprojects.findAll { it.name == coreModule }) { configurations.matching { it.name == "kotlinCompilerClasspath" }.all { resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each { def manifest = zipTree(it).matching { @@ -194,9 +211,8 @@ if (build_snapshot_train) { // Redefine source sets because we are not using 'kotlin/main/fqn' folder convention configure(subprojects.findAll { - !sourceless.contains(it.name) && + !sourceless.contains(it.name) && !multiplatform.contains(it.name) && it.name != "benchmarks" && - it.name != coreModule && it.name != "example-frontend-js" }) { // Pure JS and pure MPP doesn't have this notion and are configured separately @@ -250,7 +266,7 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { } List jarTasks - if (it.name == "kotlinx-coroutines-core") { + if (it.name in multiplatform) { jarTasks = ["jvmJar", "metadataJar"] } else if (it.name == "kotlinx-coroutines-debug") { // We shadow debug module instead of just packaging it @@ -324,12 +340,12 @@ allprojects { subProject -> .matching { // Excluding substituted project itself because of circular dependencies, but still do it // for "*Test*" configurations - subProject.name != "kotlinx-coroutines-core" || it.name.contains("Test") + subProject.name != coreModule || it.name.contains("Test") } .configureEach { conf -> conf.resolutionStrategy.dependencySubstitution { - substitute(module("org.jetbrains.kotlinx:kotlinx-coroutines-core")) - .using(project(":kotlinx-coroutines-core")) + substitute(module("org.jetbrains.kotlinx:$coreModule")) + .using(project(":$coreModule")) .because("Because Kotlin compiler embeddable leaks coroutines into the runtime classpath, " + "triggering all sort of incompatible class changes errors") } diff --git a/buildSrc/src/main/kotlin/OptInPreset.kt b/buildSrc/src/main/kotlin/OptInPreset.kt new file mode 100644 index 0000000000..ee2aab11cf --- /dev/null +++ b/buildSrc/src/main/kotlin/OptInPreset.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +val optInAnnotations = listOf( + "kotlin.RequiresOptIn", + "kotlin.experimental.ExperimentalTypeInference", + "kotlin.ExperimentalMultiplatform", + "kotlinx.coroutines.DelicateCoroutinesApi", + "kotlinx.coroutines.ExperimentalCoroutinesApi", + "kotlinx.coroutines.ObsoleteCoroutinesApi", + "kotlinx.coroutines.InternalCoroutinesApi", + "kotlinx.coroutines.FlowPreview") \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/SourceSets.kt b/buildSrc/src/main/kotlin/SourceSets.kt new file mode 100644 index 0000000000..533ac70ac6 --- /dev/null +++ b/buildSrc/src/main/kotlin/SourceSets.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +import org.jetbrains.kotlin.gradle.plugin.* + +fun KotlinSourceSet.configureMultiplatform() { + val srcDir = if (name.endsWith("Main")) "src" else "test" + val platform = name.dropLast(4) + kotlin.srcDir("$platform/$srcDir") + if (name == "jvmMain") { + resources.srcDir("$platform/resources") + } else if (name == "jvmTest") { + resources.srcDir("$platform/test-resources") + } + languageSettings { + optInAnnotations.forEach { optIn(it) } + progressiveMode = true + } +} \ No newline at end of file diff --git a/gradle/dokka.gradle.kts b/gradle/dokka.gradle.kts index 659890a30b..a4926f7e61 100644 --- a/gradle/dokka.gradle.kts +++ b/gradle/dokka.gradle.kts @@ -37,7 +37,7 @@ tasks.withType(DokkaTaskPartial::class).configureEach { packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL()) } - if (project.name != "kotlinx-coroutines-core") { + if (project.name != "kotlinx-coroutines-core" && project.name != "kotlinx-coroutines-test") { dependsOn(project.configurations["compileClasspath"]) doFirst { // resolve classpath only during execution diff --git a/gradle/opt-in.gradle b/gradle/opt-in.gradle deleted file mode 100644 index 22f022dbb5..0000000000 --- a/gradle/opt-in.gradle +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -ext.optInAnnotations = [ - "kotlin.RequiresOptIn", - "kotlin.experimental.ExperimentalTypeInference", - "kotlin.ExperimentalMultiplatform", - "kotlinx.coroutines.DelicateCoroutinesApi", - "kotlinx.coroutines.ExperimentalCoroutinesApi", - "kotlinx.coroutines.ObsoleteCoroutinesApi", - "kotlinx.coroutines.InternalCoroutinesApi", - "kotlinx.coroutines.FlowPreview"] diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 3a0a4224ab..fa2bbb8544 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -12,7 +12,7 @@ apply plugin: 'signing' // ------------- tasks -def isMultiplatform = project.name == "kotlinx-coroutines-core" +def isMultiplatform = project.name == "kotlinx-coroutines-core" || project.name == "kotlinx-coroutines-test" def isBom = project.name == "kotlinx-coroutines-bom" if (!isBom) { diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index c45ca08cef..4435ad7fa1 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -70,19 +70,8 @@ if (rootProject.ext.native_targets_enabled) { * because JMV-only projects depend on core, thus core should always be initialized before configuration. */ kotlin { - configure(sourceSets) { - def srcDir = name.endsWith('Main') ? 'src' : 'test' - def platform = name[0..-5] - kotlin.srcDirs = ["$platform/$srcDir"] - if (name == "jvmMain") { - resources.srcDirs = ["$platform/resources"] - } else if (name == "jvmTest") { - resources.srcDirs = ["$platform/test-resources"] - } - languageSettings { - progressiveMode = true - optInAnnotations.each { useExperimentalAnnotation(it) } - } + sourceSets.forEach { + SourceSetsKt.configureMultiplatform(it) } configure(targets) { diff --git a/kotlinx-coroutines-core/common/src/Unconfined.kt b/kotlinx-coroutines-core/common/src/Unconfined.kt index 4f48645895..df0087100a 100644 --- a/kotlinx-coroutines-core/common/src/Unconfined.kt +++ b/kotlinx-coroutines-core/common/src/Unconfined.kt @@ -14,7 +14,7 @@ internal object Unconfined : CoroutineDispatcher() { override fun isDispatchNeeded(context: CoroutineContext): Boolean = false override fun dispatch(context: CoroutineContext, block: Runnable) { - // It can only be called by the "yield" function. See also code of "yield" function. + /** It can only be called by the [yield] function. See also code of [yield] function. */ val yieldContext = context[YieldContext] if (yieldContext != null) { // report to "yield" that it is an unconfined dispatcher and don't call "block.run()" diff --git a/kotlinx-coroutines-core/common/src/flow/Migration.kt b/kotlinx-coroutines-core/common/src/flow/Migration.kt index 6278081a5d..64effbf395 100644 --- a/kotlinx-coroutines-core/common/src/flow/Migration.kt +++ b/kotlinx-coroutines-core/common/src/flow/Migration.kt @@ -260,7 +260,7 @@ public fun Flow.skip(count: Int): Flow = noImpl() @Deprecated( level = DeprecationLevel.ERROR, message = "Flow analogue of 'forEach' is 'collect'", - replaceWith = ReplaceWith("collect(block)") + replaceWith = ReplaceWith("collect(action)") ) public fun Flow.forEach(action: suspend (value: T) -> Unit): Unit = noImpl() diff --git a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api index c99ec5cbf1..707ee43df2 100644 --- a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api +++ b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api @@ -36,7 +36,7 @@ public final class kotlinx/coroutines/test/TestCoroutineDispatcher : kotlinx/cor public final class kotlinx/coroutines/test/TestCoroutineExceptionHandler : kotlin/coroutines/AbstractCoroutineContextElement, kotlinx/coroutines/CoroutineExceptionHandler, kotlinx/coroutines/test/UncaughtExceptionCaptor { public fun ()V - public fun cleanupTestCoroutines ()V + public fun cleanupTestCoroutinesCaptor ()V public fun getUncaughtExceptions ()Ljava/util/List; public fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V } @@ -56,12 +56,11 @@ public final class kotlinx/coroutines/test/TestDispatchers { } public abstract interface class kotlinx/coroutines/test/UncaughtExceptionCaptor { - public abstract fun cleanupTestCoroutines ()V + public abstract fun cleanupTestCoroutinesCaptor ()V public abstract fun getUncaughtExceptions ()Ljava/util/List; } public final class kotlinx/coroutines/test/UncompletedCoroutinesError : java/lang/AssertionError { - public fun (Ljava/lang/String;Ljava/lang/Throwable;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;)V } diff --git a/kotlinx-coroutines-test/build.gradle.kts b/kotlinx-coroutines-test/build.gradle.kts index fef0a146f7..7b244bb091 100644 --- a/kotlinx-coroutines-test/build.gradle.kts +++ b/kotlinx-coroutines-test/build.gradle.kts @@ -2,6 +2,12 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -dependencies { - implementation(project(":kotlinx-coroutines-debug")) +val experimentalAnnotations = listOf( + "kotlin.Experimental", + "kotlinx.coroutines.ExperimentalCoroutinesApi", + "kotlinx.coroutines.InternalCoroutinesApi" +) + +kotlin { + sourceSets.all { configureMultiplatform() } } diff --git a/kotlinx-coroutines-test/src/DelayController.kt b/kotlinx-coroutines-test/common/src/DelayController.kt similarity index 97% rename from kotlinx-coroutines-test/src/DelayController.kt rename to kotlinx-coroutines-test/common/src/DelayController.kt index 6e72222718..a4ab8c4aba 100644 --- a/kotlinx-coroutines-test/src/DelayController.kt +++ b/kotlinx-coroutines-test/common/src/DelayController.kt @@ -126,4 +126,4 @@ public interface DelayController { */ // todo: maybe convert into non-public class in 1.3.0 (need use-cases for a public exception type) @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public class UncompletedCoroutinesError(message: String, cause: Throwable? = null): AssertionError(message, cause) +public class UncompletedCoroutinesError(message: String): AssertionError(message) diff --git a/kotlinx-coroutines-test/src/TestBuilders.kt b/kotlinx-coroutines-test/common/src/TestBuilders.kt similarity index 85% rename from kotlinx-coroutines-test/src/TestBuilders.kt rename to kotlinx-coroutines-test/common/src/TestBuilders.kt index b40769ee97..dde9ac7b12 100644 --- a/kotlinx-coroutines-test/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/common/src/TestBuilders.kt @@ -80,19 +80,16 @@ public fun TestCoroutineDispatcher.runBlockingTest(block: suspend TestCoroutineS runBlockingTest(this, block) private fun CoroutineContext.checkArguments(): Pair { - // TODO optimize it - val dispatcher = get(ContinuationInterceptor).run { - this?.let { require(this is DelayController) { "Dispatcher must implement DelayController: $this" } } - this ?: TestCoroutineDispatcher() + val dispatcher = when (val dispatcher = get(ContinuationInterceptor)) { + is DelayController -> dispatcher + null -> TestCoroutineDispatcher() + else -> throw IllegalArgumentException("Dispatcher must implement DelayController: $dispatcher") } - - val exceptionHandler = get(CoroutineExceptionHandler).run { - this?.let { - require(this is UncaughtExceptionCaptor) { "coroutineExceptionHandler must implement UncaughtExceptionCaptor: $this" } - } - this ?: TestCoroutineExceptionHandler() + val exceptionHandler = when (val handler = get(CoroutineExceptionHandler)) { + is UncaughtExceptionCaptor -> handler + null -> TestCoroutineExceptionHandler() + else -> throw IllegalArgumentException("coroutineExceptionHandler must implement UncaughtExceptionCaptor: $handler") } - val job = get(Job) ?: SupervisorJob() - return Pair(this + dispatcher + exceptionHandler + job, dispatcher as DelayController) + return Pair(this + dispatcher + exceptionHandler + job, dispatcher) } diff --git a/kotlinx-coroutines-test/src/TestCoroutineDispatcher.kt b/kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt similarity index 98% rename from kotlinx-coroutines-test/src/TestCoroutineDispatcher.kt rename to kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt index f6464789fc..55b92cd6b7 100644 --- a/kotlinx-coroutines-test/src/TestCoroutineDispatcher.kt +++ b/kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt @@ -8,6 +8,7 @@ import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.internal.* import kotlin.coroutines.* +import kotlin.jvm.* import kotlin.math.* /** @@ -67,11 +68,7 @@ public class TestCoroutineDispatcher: CoroutineDispatcher(), Delay, DelayControl /** @suppress */ override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { val node = postDelayed(block, timeMillis) - return object : DisposableHandle { - override fun dispose() { - queue.remove(node) - } - } + return DisposableHandle { queue.remove(node) } } /** @suppress */ diff --git a/kotlinx-coroutines-test/src/TestCoroutineExceptionHandler.kt b/kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt similarity index 81% rename from kotlinx-coroutines-test/src/TestCoroutineExceptionHandler.kt rename to kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt index 66eb235906..b1296df12a 100644 --- a/kotlinx-coroutines-test/src/TestCoroutineExceptionHandler.kt +++ b/kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* +import kotlinx.coroutines.internal.* import kotlin.coroutines.* /** @@ -16,7 +17,7 @@ public interface UncaughtExceptionCaptor { * List of uncaught coroutine exceptions. * * The returned list is a copy of the currently caught exceptions. - * During [cleanupTestCoroutines] the first element of this list is rethrown if it is not empty. + * During [cleanupTestCoroutinesCaptor] the first element of this list is rethrown if it is not empty. */ public val uncaughtExceptions: List @@ -28,7 +29,7 @@ public interface UncaughtExceptionCaptor { * * @throws Throwable the first uncaught exception, if there are any uncaught exceptions. */ - public fun cleanupTestCoroutines() + public fun cleanupTestCoroutinesCaptor() } /** @@ -39,21 +40,22 @@ public class TestCoroutineExceptionHandler : AbstractCoroutineContextElement(CoroutineExceptionHandler), UncaughtExceptionCaptor, CoroutineExceptionHandler { private val _exceptions = mutableListOf() + private val _lock = SynchronizedObject() /** @suppress **/ override fun handleException(context: CoroutineContext, exception: Throwable) { - synchronized(_exceptions) { + synchronized(_lock) { _exceptions += exception } } /** @suppress **/ override val uncaughtExceptions: List - get() = synchronized(_exceptions) { _exceptions.toList() } + get() = synchronized(_lock) { _exceptions.toList() } /** @suppress **/ - override fun cleanupTestCoroutines() { - synchronized(_exceptions) { + override fun cleanupTestCoroutinesCaptor() { + synchronized(_lock) { val exception = _exceptions.firstOrNull() ?: return // log the rest _exceptions.drop(1).forEach { it.printStackTrace() } diff --git a/kotlinx-coroutines-test/src/TestCoroutineScope.kt b/kotlinx-coroutines-test/common/src/TestCoroutineScope.kt similarity index 95% rename from kotlinx-coroutines-test/src/TestCoroutineScope.kt rename to kotlinx-coroutines-test/common/src/TestCoroutineScope.kt index 7c1ff872ec..da29cd22b4 100644 --- a/kotlinx-coroutines-test/src/TestCoroutineScope.kt +++ b/kotlinx-coroutines-test/common/src/TestCoroutineScope.kt @@ -14,7 +14,7 @@ import kotlin.coroutines.* public interface TestCoroutineScope: CoroutineScope, UncaughtExceptionCaptor, DelayController { /** * Call after the test completes. - * Calls [UncaughtExceptionCaptor.cleanupTestCoroutines] and [DelayController.cleanupTestCoroutines]. + * Calls [UncaughtExceptionCaptor.cleanupTestCoroutinesCaptor] and [DelayController.cleanupTestCoroutines]. * * @throws Throwable the first uncaught exception, if there are any uncaught exceptions. * @throws UncompletedCoroutinesError if any pending tasks are active, however it will not throw for suspended @@ -31,7 +31,7 @@ private class TestCoroutineScopeImpl ( DelayController by coroutineContext.delayController { override fun cleanupTestCoroutines() { - coroutineContext.uncaughtExceptionCaptor.cleanupTestCoroutines() + coroutineContext.uncaughtExceptionCaptor.cleanupTestCoroutinesCaptor() coroutineContext.delayController.cleanupTestCoroutines() } } diff --git a/kotlinx-coroutines-test/common/src/TestDispatchers.kt b/kotlinx-coroutines-test/common/src/TestDispatchers.kt new file mode 100644 index 0000000000..2f00331506 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/TestDispatchers.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* + +/** + * Sets the given [dispatcher] as an underlying dispatcher of [Dispatchers.Main]. + * All subsequent usages of [Dispatchers.Main] will use given [dispatcher] under the hood. + * + * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. + */ +@ExperimentalCoroutinesApi +public expect fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) + +/** + * Resets state of the [Dispatchers.Main] to the original main dispatcher. + * For example, in Android Main thread dispatcher will be set as [Dispatchers.Main]. + * Used to clean up all possible dependencies, should be used in tear down (`@After`) methods. + * + * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. + */ +@ExperimentalCoroutinesApi +public expect fun Dispatchers.resetMain() diff --git a/kotlinx-coroutines-test/test/TestBuildersTest.kt b/kotlinx-coroutines-test/common/test/TestBuildersTest.kt similarity index 97% rename from kotlinx-coroutines-test/test/TestBuildersTest.kt rename to kotlinx-coroutines-test/common/test/TestBuildersTest.kt index 27c8f5fb19..a3167e5876 100644 --- a/kotlinx-coroutines-test/test/TestBuildersTest.kt +++ b/kotlinx-coroutines-test/common/test/TestBuildersTest.kt @@ -5,7 +5,6 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* -import org.junit.Test import kotlin.coroutines.* import kotlin.test.* @@ -59,7 +58,7 @@ class TestBuildersTest { } @Test - fun scopeRunBlocking_disablesImmedateOnExit() { + fun scopeRunBlocking_disablesImmediatelyOnExit() { val scope = TestCoroutineScope() scope.runBlockingTest { assertRunsFast { diff --git a/kotlinx-coroutines-test/test/TestCoroutineDispatcherOrderTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt similarity index 58% rename from kotlinx-coroutines-test/test/TestCoroutineDispatcherOrderTest.kt rename to kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt index 116aadcf8d..c3686845de 100644 --- a/kotlinx-coroutines-test/test/TestCoroutineDispatcherOrderTest.kt +++ b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt @@ -1,11 +1,28 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.coroutines.test +import kotlinx.atomicfu.* import kotlinx.coroutines.* -import org.junit.* -import kotlin.coroutines.* -import kotlin.test.assertEquals +import kotlin.test.* + +class TestCoroutineDispatcherOrderTest { + + private val actionIndex = atomic(0) + private val finished = atomic(false) -class TestCoroutineDispatcherOrderTest : TestBase() { + private fun expect(index: Int) { + val wasIndex = actionIndex.incrementAndGet() + // println("expect($index), wasIndex=$wasIndex") + check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } + } + + private fun finish(index: Int) { + expect(index) + check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } + } @Test fun testAdvanceTimeBy_progressesOnEachDelay() { diff --git a/kotlinx-coroutines-test/test/TestCoroutineDispatcherTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt similarity index 69% rename from kotlinx-coroutines-test/test/TestCoroutineDispatcherTest.kt rename to kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt index 260edf9dc8..baf946f2e1 100644 --- a/kotlinx-coroutines-test/test/TestCoroutineDispatcherTest.kt +++ b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt @@ -1,11 +1,10 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.test import kotlinx.coroutines.* -import org.junit.Test import kotlin.test.* class TestCoroutineDispatcherTest { @@ -91,7 +90,7 @@ class TestCoroutineDispatcherTest { assertEquals(1, executed) } - @Test(expected = UncompletedCoroutinesError::class) + @Test fun whenDispatcherHasUncompletedCoroutines_itThrowsErrorInCleanup() { val subject = TestCoroutineDispatcher() subject.pauseDispatcher() @@ -99,44 +98,7 @@ class TestCoroutineDispatcherTest { scope.launch { delay(1_000) } - subject.cleanupTestCoroutines() - } - - @Test - fun whenDispatchCalled_runsOnCurrentThread() { - val currentThread = Thread.currentThread() - val subject = TestCoroutineDispatcher() - val scope = TestCoroutineScope(subject) - - val deferred = scope.async(Dispatchers.Default) { - withContext(subject) { - assertNotSame(currentThread, Thread.currentThread()) - 3 - } - } - - runBlocking { - // just to ensure the above code terminates - assertEquals(3, deferred.await()) - } + assertFailsWith { subject.cleanupTestCoroutines() } } - @Test - fun whenAllDispatchersMocked_runsOnSameThread() { - val currentThread = Thread.currentThread() - val subject = TestCoroutineDispatcher() - val scope = TestCoroutineScope(subject) - - val deferred = scope.async(subject) { - withContext(subject) { - assertSame(currentThread, Thread.currentThread()) - 3 - } - } - - runBlocking { - // just to ensure the above code terminates - assertEquals(3, deferred.await()) - } - } } \ No newline at end of file diff --git a/kotlinx-coroutines-test/test/TestCoroutineExceptionHandlerTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt similarity index 85% rename from kotlinx-coroutines-test/test/TestCoroutineExceptionHandlerTest.kt rename to kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt index 1a0833af50..674fd288dd 100644 --- a/kotlinx-coroutines-test/test/TestCoroutineExceptionHandlerTest.kt +++ b/kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt @@ -4,12 +4,11 @@ package kotlinx.coroutines.test -import org.junit.Test import kotlin.test.* class TestCoroutineExceptionHandlerTest { @Test - fun whenExceptionsCaught_avaliableViaProperty() { + fun whenExceptionsCaught_availableViaProperty() { val subject = TestCoroutineExceptionHandler() val expected = IllegalArgumentException() subject.handleException(subject, expected) diff --git a/kotlinx-coroutines-test/test/TestCoroutineScopeTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt similarity index 74% rename from kotlinx-coroutines-test/test/TestCoroutineScopeTest.kt rename to kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt index fa14c38409..4480cd99a3 100644 --- a/kotlinx-coroutines-test/test/TestCoroutineScopeTest.kt +++ b/kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt @@ -5,13 +5,12 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* -import org.junit.Test import kotlin.test.* class TestCoroutineScopeTest { @Test fun whenGivenInvalidExceptionHandler_throwsException() { - val handler = CoroutineExceptionHandler { _, _ -> Unit } + val handler = CoroutineExceptionHandler { _, _ -> } assertFails { TestCoroutineScope(handler) } @@ -20,7 +19,7 @@ class TestCoroutineScopeTest { @Test fun whenGivenInvalidDispatcher_throwsException() { assertFails { - TestCoroutineScope(newSingleThreadContext("incorrect call")) + TestCoroutineScope(Dispatchers.Default) } } } diff --git a/kotlinx-coroutines-test/test/TestModuleHelpers.kt b/kotlinx-coroutines-test/common/test/TestModuleHelpers.kt similarity index 60% rename from kotlinx-coroutines-test/test/TestModuleHelpers.kt rename to kotlinx-coroutines-test/common/test/TestModuleHelpers.kt index 12541bd90f..a34dbfd6c7 100644 --- a/kotlinx-coroutines-test/test/TestModuleHelpers.kt +++ b/kotlinx-coroutines-test/common/test/TestModuleHelpers.kt @@ -5,18 +5,21 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* -import org.junit.* -import java.time.* +import kotlin.test.* +import kotlin.time.* const val SLOW = 10_000L /** * Assert a block completes within a second or fail the suite */ +@OptIn(ExperimentalTime::class) suspend fun CoroutineScope.assertRunsFast(block: suspend CoroutineScope.() -> Unit) { - val start = Instant.now().toEpochMilli() + val start = TimeSource.Monotonic.markNow() // don't need to be fancy with timeouts here since anything longer than a few ms is an error block() - val duration = Instant.now().minusMillis(start).toEpochMilli() - Assert.assertTrue("All tests must complete within 2000ms (use longer timeouts to cause failure)", duration < 2_000) + val duration = start.elapsedNow() + assertTrue("All tests must complete within 2000ms (use longer timeouts to cause failure)") { + duration.inWholeSeconds < 2 + } } diff --git a/kotlinx-coroutines-test/test/TestRunBlockingOrderTest.kt b/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt similarity index 70% rename from kotlinx-coroutines-test/test/TestRunBlockingOrderTest.kt rename to kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt index e21c82b95c..064cb7cb71 100644 --- a/kotlinx-coroutines-test/test/TestRunBlockingOrderTest.kt +++ b/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt @@ -1,14 +1,29 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.test +import kotlinx.atomicfu.* import kotlinx.coroutines.* -import org.junit.* -import kotlin.coroutines.* +import kotlin.test.* + +class TestRunBlockingOrderTest { + + private val actionIndex = atomic(0) + private val finished = atomic(false) + + private fun expect(index: Int) { + val wasIndex = actionIndex.incrementAndGet() + // println("expect($index), wasIndex=$wasIndex") + check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } + } + + private fun finish(index: Int) { + expect(index) + check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } + } -class TestRunBlockingOrderTest : TestBase() { @Test fun testLaunchImmediate() = runBlockingTest { expect(1) diff --git a/kotlinx-coroutines-test/test/TestRunBlockingTest.kt b/kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt similarity index 56% rename from kotlinx-coroutines-test/test/TestRunBlockingTest.kt rename to kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt index e0c7091505..c93b50811f 100644 --- a/kotlinx-coroutines-test/test/TestRunBlockingTest.kt +++ b/kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt @@ -5,7 +5,6 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* -import kotlin.coroutines.* import kotlin.test.* class TestRunBlockingTest { @@ -53,22 +52,14 @@ class TestRunBlockingTest { } @Test - fun incorrectlyCalledRunblocking_doesNotHaveSameInterceptor() = runBlockingTest { - // this code is an error as a production test, please do not use this as an example - - // this test exists to document this error condition, if it's possible to make this code work please update - val outerInterceptor = coroutineContext[ContinuationInterceptor] - // runBlocking always requires an argument to pass the context in tests - runBlocking { - assertNotSame(coroutineContext[ContinuationInterceptor], outerInterceptor) - } - } - - @Test(expected = TimeoutCancellationException::class) - fun whenUsingTimeout_triggersWhenDelayed() = runBlockingTest { - assertRunsFast { - withTimeout(SLOW) { - delay(SLOW) + fun whenUsingTimeout_triggersWhenDelayed() { + assertFailsWith { + runBlockingTest { + assertRunsFast { + withTimeout(SLOW) { + delay(SLOW) + } + } } } } @@ -82,12 +73,16 @@ class TestRunBlockingTest { } } - @Test(expected = TimeoutCancellationException::class) - fun whenUsingTimeout_triggersWhenWaiting() = runBlockingTest { - val uncompleted = CompletableDeferred() - assertRunsFast { - withTimeout(SLOW) { - uncompleted.await() + @Test + fun whenUsingTimeout_triggersWhenWaiting() { + assertFailsWith { + runBlockingTest { + val uncompleted = CompletableDeferred() + assertRunsFast { + withTimeout(SLOW) { + uncompleted.await() + } + } } } } @@ -114,16 +109,20 @@ class TestRunBlockingTest { } } - @Test(expected = TimeoutCancellationException::class) - fun whenUsingTimeout_inAsync_triggersWhenDelayed() = runBlockingTest { - val deferred = async { - withTimeout(SLOW) { - delay(SLOW) - } - } + @Test + fun whenUsingTimeout_inAsync_triggersWhenDelayed() { + assertFailsWith { + runBlockingTest { + val deferred = async { + withTimeout(SLOW) { + delay(SLOW) + } + } - assertRunsFast { - deferred.await() + assertRunsFast { + deferred.await() + } + } } } @@ -141,18 +140,21 @@ class TestRunBlockingTest { } } - @Test(expected = TimeoutCancellationException::class) - fun whenUsingTimeout_inLaunch_triggersWhenDelayed() = runBlockingTest { - val job= launch { - withTimeout(1) { - delay(SLOW + 1) - 3 - } - } + @Test + fun whenUsingTimeout_inLaunch_triggersWhenDelayed() { + assertFailsWith { + runBlockingTest { + val job = launch { + withTimeout(1) { + delay(SLOW + 1) + } + } - assertRunsFast { - job.join() - throw job.getCancellationException() + assertRunsFast { + job.join() + throw job.getCancellationException() + } + } } } @@ -170,36 +172,48 @@ class TestRunBlockingTest { } } - @Test(expected = IllegalArgumentException::class) - fun throwingException_throws() = runBlockingTest { - assertRunsFast { - delay(SLOW) - throw IllegalArgumentException("Test") + @Test + fun throwingException_throws() { + assertFailsWith { + runBlockingTest { + assertRunsFast { + delay(SLOW) + throw IllegalArgumentException("Test") + } + } } } - @Test(expected = IllegalArgumentException::class) - fun throwingException_inLaunch_throws() = runBlockingTest { - val job = launch { - delay(SLOW) - throw IllegalArgumentException("Test") - } + @Test + fun throwingException_inLaunch_throws() { + assertFailsWith { + runBlockingTest { + val job = launch { + delay(SLOW) + throw IllegalArgumentException("Test") + } - assertRunsFast { - job.join() - throw job.getCancellationException().cause ?: assertFails { "expected exception" } + assertRunsFast { + job.join() + throw job.getCancellationException().cause ?: assertFails { "expected exception" } + } + } } } - @Test(expected = IllegalArgumentException::class) - fun throwingException__inAsync_throws() = runBlockingTest { - val deferred = async { - delay(SLOW) - throw IllegalArgumentException("Test") - } + @Test + fun throwingException__inAsync_throws() { + assertFailsWith { + runBlockingTest { + val deferred: Deferred = async { + delay(SLOW) + throw IllegalArgumentException("Test") + } - assertRunsFast { - deferred.await() + assertRunsFast { + deferred.await() + } + } } } @@ -273,25 +287,33 @@ class TestRunBlockingTest { job.join() } - @Test(expected = UncompletedCoroutinesError::class) - fun whenACoroutineLeaks_errorIsThrown() = runBlockingTest { - val uncompleted = CompletableDeferred() - launch { - uncompleted.await() + @Test + fun whenACoroutineLeaks_errorIsThrown() { + assertFailsWith { + runBlockingTest { + val uncompleted = CompletableDeferred() + launch { + uncompleted.await() + } + } } } - @Test(expected = java.lang.IllegalArgumentException::class) + @Test fun runBlockingTestBuilder_throwsOnBadDispatcher() { - runBlockingTest(newSingleThreadContext("name")) { + assertFailsWith { + runBlockingTest(Dispatchers.Default) { + } } } - @Test(expected = java.lang.IllegalArgumentException::class) + @Test fun runBlockingTestBuilder_throwsOnBadHandler() { - runBlockingTest(CoroutineExceptionHandler { _, _ -> Unit} ) { + assertFailsWith { + runBlockingTest(CoroutineExceptionHandler { _, _ -> }) { + } } } @@ -338,36 +360,48 @@ class TestRunBlockingTest { } - @Test(expected = IllegalAccessError::class) - fun testWithTestContextThrowingAnAssertionError() = runBlockingTest { - val expectedError = IllegalAccessError("hello") + @Test + fun testWithTestContextThrowingAnAssertionError() { + assertFailsWith { + runBlockingTest { + val expectedError = TestException("hello") - val job = launch { - throw expectedError - } + val job = launch { + throw expectedError + } - // don't rethrow or handle the exception + // don't rethrow or handle the exception + } + } } - @Test(expected = IllegalAccessError::class) - fun testExceptionHandlingWithLaunch() = runBlockingTest { - val expectedError = IllegalAccessError("hello") + @Test + fun testExceptionHandlingWithLaunch() { + assertFailsWith { + runBlockingTest { + val expectedError = TestException("hello") - launch { - throw expectedError + launch { + throw expectedError + } + } } } - @Test(expected = IllegalAccessError::class) - fun testExceptions_notThrownImmediately() = runBlockingTest { - val expectedException = IllegalAccessError("hello") - val result = runCatching { - launch { - throw expectedException + @Test + fun testExceptions_notThrownImmediately() { + assertFailsWith { + runBlockingTest { + val expectedException = TestException("hello") + val result = runCatching { + launch { + throw expectedException + } + } + runCurrent() + assertEquals(true, result.isSuccess) } } - runCurrent() - assertEquals(true, result.isSuccess) } @@ -380,9 +414,13 @@ class TestRunBlockingTest { assertNotSame(coroutineContext[CoroutineExceptionHandler], exceptionHandler) } - @Test(expected = IllegalArgumentException::class) - fun testPartialDispatcherOverride() = runBlockingTest(Dispatchers.Unconfined) { - fail("Unreached") + @Test + fun testPartialDispatcherOverride() { + assertFailsWith { + runBlockingTest(Dispatchers.Unconfined) { + fail("Unreached") + } + } } @Test @@ -390,8 +428,14 @@ class TestRunBlockingTest { assertSame(coroutineContext[CoroutineExceptionHandler], exceptionHandler) } - @Test(expected = IllegalArgumentException::class) - fun testOverrideExceptionHandlerError() = runBlockingTest(CoroutineExceptionHandler { _, _ -> }) { - fail("Unreached") + @Test + fun testOverrideExceptionHandlerError() { + assertFailsWith { + runBlockingTest(CoroutineExceptionHandler { _, _ -> }) { + fail("Unreached") + } + } } } + +private class TestException(message: String? = null): Exception(message) \ No newline at end of file diff --git a/kotlinx-coroutines-test/js/src/TestDispatchers.kt b/kotlinx-coroutines-test/js/src/TestDispatchers.kt new file mode 100644 index 0000000000..10322079d3 --- /dev/null +++ b/kotlinx-coroutines-test/js/src/TestDispatchers.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test +import kotlinx.coroutines.* + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { + throw UnsupportedOperationException("`setMain` is not supported on JS") +} + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.resetMain() { + throw UnsupportedOperationException("`resetMain` is not supported on JS") +} diff --git a/kotlinx-coroutines-test/resources/META-INF/proguard/coroutines.pro b/kotlinx-coroutines-test/jvm/resources/META-INF/proguard/coroutines.pro similarity index 100% rename from kotlinx-coroutines-test/resources/META-INF/proguard/coroutines.pro rename to kotlinx-coroutines-test/jvm/resources/META-INF/proguard/coroutines.pro diff --git a/kotlinx-coroutines-test/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory b/kotlinx-coroutines-test/jvm/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory similarity index 100% rename from kotlinx-coroutines-test/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory rename to kotlinx-coroutines-test/jvm/resources/META-INF/services/kotlinx.coroutines.internal.MainDispatcherFactory diff --git a/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt b/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt new file mode 100644 index 0000000000..800eca5d1d --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:JvmName("TestDispatchers") + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.test.internal.* + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { + require(dispatcher !is TestMainDispatcher) { "Dispatchers.setMain(Dispatchers.Main) is prohibited, probably Dispatchers.resetMain() should be used instead" } + val mainDispatcher = Main + require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } + mainDispatcher.setDispatcher(dispatcher) +} + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.resetMain() { + val mainDispatcher = Main + require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } + mainDispatcher.resetDispatcher() +} diff --git a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt b/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt similarity index 95% rename from kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt rename to kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt index c85d27ea87..4c70ca3fcf 100644 --- a/kotlinx-coroutines-test/src/internal/MainTestDispatcher.kt +++ b/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt @@ -69,7 +69,7 @@ internal class TestMainDispatcherFactory : MainDispatcherFactory { /** * [Int.MAX_VALUE] -- test dispatcher always wins no matter what factories are present in the classpath. - * By default all actions are delegated to the second-priority dispatcher, so that it won't be the issue. + * By default, all actions are delegated to the second-priority dispatcher, so that it won't be the issue. */ override val loadPriority: Int get() = Int.MAX_VALUE diff --git a/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt b/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt new file mode 100644 index 0000000000..d06f2a35c6 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt @@ -0,0 +1,89 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import kotlinx.coroutines.* +import kotlinx.coroutines.test.* +import kotlin.coroutines.* +import kotlin.test.* + +class MultithreadingTest : TestBase() { + + @Test + fun incorrectlyCalledRunblocking_doesNotHaveSameInterceptor() = runBlockingTest { + // this code is an error as a production test, please do not use this as an example + + // this test exists to document this error condition, if it's possible to make this code work please update + val outerInterceptor = coroutineContext[ContinuationInterceptor] + // runBlocking always requires an argument to pass the context in tests + runBlocking { + assertNotSame(coroutineContext[ContinuationInterceptor], outerInterceptor) + } + } + + @Test + fun testSingleThreadExecutor() = runTest { + val mainThread = Thread.currentThread() + Dispatchers.setMain(Dispatchers.Unconfined) + newSingleThreadContext("testSingleThread").use { threadPool -> + withContext(Dispatchers.Main) { + assertSame(mainThread, Thread.currentThread()) + } + + Dispatchers.setMain(threadPool) + withContext(Dispatchers.Main) { + assertNotSame(mainThread, Thread.currentThread()) + } + assertSame(mainThread, Thread.currentThread()) + + withContext(Dispatchers.Main.immediate) { + assertNotSame(mainThread, Thread.currentThread()) + } + assertSame(mainThread, Thread.currentThread()) + + Dispatchers.setMain(Dispatchers.Unconfined) + withContext(Dispatchers.Main.immediate) { + assertSame(mainThread, Thread.currentThread()) + } + assertSame(mainThread, Thread.currentThread()) + } + } + + @Test + fun whenDispatchCalled_runsOnCurrentThread() { + val currentThread = Thread.currentThread() + val subject = TestCoroutineDispatcher() + val scope = TestCoroutineScope(subject) + + val deferred = scope.async(Dispatchers.Default) { + withContext(subject) { + assertNotSame(currentThread, Thread.currentThread()) + 3 + } + } + + runBlocking { + // just to ensure the above code terminates + assertEquals(3, deferred.await()) + } + } + + @Test + fun whenAllDispatchersMocked_runsOnSameThread() { + val currentThread = Thread.currentThread() + val subject = TestCoroutineDispatcher() + val scope = TestCoroutineScope(subject) + + val deferred = scope.async(subject) { + withContext(subject) { + assertSame(currentThread, Thread.currentThread()) + 3 + } + } + + runBlocking { + // just to ensure the above code terminates + assertEquals(3, deferred.await()) + } + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt new file mode 100644 index 0000000000..3ab78987f0 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import kotlinx.atomicfu.* +import kotlinx.coroutines.* +import kotlinx.coroutines.test.* +import kotlin.coroutines.* +import kotlin.test.* + +class TestDispatchersTest { + private val actionIndex = atomic(0) + private val finished = atomic(false) + + private fun expect(index: Int) { + val wasIndex = actionIndex.incrementAndGet() + println("expect($index), wasIndex=$wasIndex") + check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } + } + + private fun finish(index: Int) { + expect(index) + check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } + } + + @BeforeTest + fun setUp() { + Dispatchers.resetMain() + } + + @Test + fun testSelfSet() { + assertFailsWith { Dispatchers.setMain(Dispatchers.Main) } + } + + @Test + fun testImmediateDispatcher() = runBlockingTest { + Dispatchers.setMain(ImmediateDispatcher()) + expect(1) + withContext(Dispatchers.Main) { + expect(3) + } + + Dispatchers.setMain(RegularDispatcher()) + withContext(Dispatchers.Main) { + expect(6) + } + + finish(7) + } + + private inner class ImmediateDispatcher : CoroutineDispatcher() { + override fun isDispatchNeeded(context: CoroutineContext): Boolean { + expect(2) + return false + } + + override fun dispatch(context: CoroutineContext, block: Runnable) = throw RuntimeException("Shouldn't be reached") + } + + private inner class RegularDispatcher : CoroutineDispatcher() { + override fun isDispatchNeeded(context: CoroutineContext): Boolean { + expect(4) + return true + } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + expect(5) + block.run() + } + } +} diff --git a/kotlinx-coroutines-test/native/src/TestDispatchers.kt b/kotlinx-coroutines-test/native/src/TestDispatchers.kt new file mode 100644 index 0000000000..44c7a72752 --- /dev/null +++ b/kotlinx-coroutines-test/native/src/TestDispatchers.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { + throw UnsupportedOperationException("`setMain` is not supported on Native") +} + +@ExperimentalCoroutinesApi +public actual fun Dispatchers.resetMain() { + throw UnsupportedOperationException("`resetMain` is not supported on Native") +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/npm/README.md b/kotlinx-coroutines-test/npm/README.md new file mode 100644 index 0000000000..4df4825da9 --- /dev/null +++ b/kotlinx-coroutines-test/npm/README.md @@ -0,0 +1,4 @@ +# kotlinx-coroutines-test + +Testing support for `kotlinx-coroutines` in +[Kotlin/JS](https://kotlinlang.org/docs/js-overview.html). diff --git a/kotlinx-coroutines-test/npm/package.json b/kotlinx-coroutines-test/npm/package.json new file mode 100644 index 0000000000..b59d92fe03 --- /dev/null +++ b/kotlinx-coroutines-test/npm/package.json @@ -0,0 +1,23 @@ +{ + "name": "kotlinx-coroutines-test", + "version" : "$version", + "description" : "Test utilities for kotlinx-coroutines", + "main" : "kotlinx-coroutines-test.js", + "author": "JetBrains", + "license": "Apache-2.0", + "homepage": "https://github.com/Kotlin/kotlinx.coroutines", + "bugs": { + "url": "https://github.com/Kotlin/kotlinx.coroutines/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Kotlin/kotlinx.coroutines.git" + }, + "keywords": [ + "Kotlin", + "async", + "coroutines", + "JetBrains", + "test" + ] +} diff --git a/kotlinx-coroutines-test/src/TestDispatchers.kt b/kotlinx-coroutines-test/src/TestDispatchers.kt deleted file mode 100644 index bf068f9d7b..0000000000 --- a/kotlinx-coroutines-test/src/TestDispatchers.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -@file:Suppress("unused") -@file:JvmName("TestDispatchers") - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlinx.coroutines.test.internal.* - -/** - * Sets the given [dispatcher] as an underlying dispatcher of [Dispatchers.Main]. - * All consecutive usages of [Dispatchers.Main] will use given [dispatcher] under the hood. - * - * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. - */ -@ExperimentalCoroutinesApi -public fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { - require(dispatcher !is TestMainDispatcher) { "Dispatchers.setMain(Dispatchers.Main) is prohibited, probably Dispatchers.resetMain() should be used instead" } - val mainDispatcher = Dispatchers.Main - require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } - mainDispatcher.setDispatcher(dispatcher) -} - -/** - * Resets state of the [Dispatchers.Main] to the original main dispatcher. - * For example, in Android Main thread dispatcher will be set as [Dispatchers.Main]. - * Used to clean up all possible dependencies, should be used in tear down (`@After`) methods. - * - * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. - */ -@ExperimentalCoroutinesApi -public fun Dispatchers.resetMain() { - val mainDispatcher = Dispatchers.Main - require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } - mainDispatcher.resetDispatcher() -} diff --git a/kotlinx-coroutines-test/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/test/TestDispatchersTest.kt deleted file mode 100644 index 98d9705311..0000000000 --- a/kotlinx-coroutines-test/test/TestDispatchersTest.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import org.junit.* -import org.junit.Test -import kotlin.coroutines.* -import kotlin.test.* - -class TestDispatchersTest : TestBase() { - - @Before - fun setUp() { - Dispatchers.resetMain() - } - - @Test(expected = IllegalArgumentException::class) - fun testSelfSet() = runTest { - Dispatchers.setMain(Dispatchers.Main) - } - - @Test - fun testSingleThreadExecutor() = runTest { - val mainThread = Thread.currentThread() - Dispatchers.setMain(Dispatchers.Unconfined) - newSingleThreadContext("testSingleThread").use { threadPool -> - withContext(Dispatchers.Main) { - assertSame(mainThread, Thread.currentThread()) - } - - Dispatchers.setMain(threadPool) - withContext(Dispatchers.Main) { - assertNotSame(mainThread, Thread.currentThread()) - } - assertSame(mainThread, Thread.currentThread()) - - withContext(Dispatchers.Main.immediate) { - assertNotSame(mainThread, Thread.currentThread()) - } - assertSame(mainThread, Thread.currentThread()) - - Dispatchers.setMain(Dispatchers.Unconfined) - withContext(Dispatchers.Main.immediate) { - assertSame(mainThread, Thread.currentThread()) - } - assertSame(mainThread, Thread.currentThread()) - } - } - - @Test - fun testImmediateDispatcher() = runTest { - Dispatchers.setMain(ImmediateDispatcher()) - expect(1) - withContext(Dispatchers.Main) { - expect(3) - } - - Dispatchers.setMain(RegularDispatcher()) - withContext(Dispatchers.Main) { - expect(6) - } - - finish(7) - } - - private inner class ImmediateDispatcher : CoroutineDispatcher() { - override fun isDispatchNeeded(context: CoroutineContext): Boolean { - expect(2) - return false - } - - override fun dispatch(context: CoroutineContext, block: Runnable) = expectUnreached() - } - - private inner class RegularDispatcher : CoroutineDispatcher() { - override fun isDispatchNeeded(context: CoroutineContext): Boolean { - expect(4) - return true - } - - override fun dispatch(context: CoroutineContext, block: Runnable) { - expect(5) - block.run() - } - } -} From 5a6278124ca66e83243b88eec247e4da8278193c Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Fri, 8 Oct 2021 12:38:34 +0300 Subject: [PATCH 159/328] Implement `setMain` in common code (#2967) Fixes #1720 --- kotlinx-coroutines-core/js/src/Dispatchers.kt | 16 +++- .../native/src/Dispatchers.kt | 18 ++++- .../common/src/TestDispatchers.kt | 12 ++- .../common/src/internal/TestMainDispatcher.kt | 42 ++++++++++ .../test/TestCoroutineDispatcherOrderTest.kt | 1 - .../test/TestDispatchersTest.kt | 3 +- .../common/test/TestRunBlockingOrderTest.kt | 1 - .../js/src/TestDispatchers.kt | 16 ---- .../js/src/internal/TestMainDispatcher.kt | 13 ++++ .../jvm/src/TestDispatchers.kt | 24 ------ .../jvm/src/internal/TestMainDispatcher.kt | 76 ------------------- .../jvm/src/internal/TestMainDispatcherJvm.kt | 31 ++++++++ .../native/src/TestDispatchers.kt | 17 ----- .../native/src/TestMainDispatcher.kt | 13 ++++ 14 files changed, 142 insertions(+), 141 deletions(-) create mode 100644 kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt rename kotlinx-coroutines-test/{jvm => common}/test/TestDispatchersTest.kt (97%) delete mode 100644 kotlinx-coroutines-test/js/src/TestDispatchers.kt create mode 100644 kotlinx-coroutines-test/js/src/internal/TestMainDispatcher.kt delete mode 100644 kotlinx-coroutines-test/jvm/src/TestDispatchers.kt delete mode 100644 kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt create mode 100644 kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcherJvm.kt delete mode 100644 kotlinx-coroutines-test/native/src/TestDispatchers.kt create mode 100644 kotlinx-coroutines-test/native/src/TestMainDispatcher.kt diff --git a/kotlinx-coroutines-core/js/src/Dispatchers.kt b/kotlinx-coroutines-core/js/src/Dispatchers.kt index 8d3bac3209..3eec5408cc 100644 --- a/kotlinx-coroutines-core/js/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/js/src/Dispatchers.kt @@ -8,8 +8,22 @@ import kotlin.coroutines.* public actual object Dispatchers { public actual val Default: CoroutineDispatcher = createDefaultDispatcher() - public actual val Main: MainCoroutineDispatcher = JsMainDispatcher(Default, false) + public actual val Main: MainCoroutineDispatcher + get() = injectedMainDispatcher ?: mainDispatcher public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined + + private val mainDispatcher = JsMainDispatcher(Default, false) + private var injectedMainDispatcher: MainCoroutineDispatcher? = null + + @PublishedApi + internal fun injectMain(dispatcher: MainCoroutineDispatcher) { + injectedMainDispatcher = dispatcher + } + + @PublishedApi + internal fun resetInjectedMain() { + injectedMainDispatcher = null + } } private class JsMainDispatcher( diff --git a/kotlinx-coroutines-core/native/src/Dispatchers.kt b/kotlinx-coroutines-core/native/src/Dispatchers.kt index 4e5facfeee..904483c2c0 100644 --- a/kotlinx-coroutines-core/native/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/native/src/Dispatchers.kt @@ -6,10 +6,26 @@ package kotlinx.coroutines import kotlin.coroutines.* +/** Not inside [Dispatchers], as otherwise mutating this throws an `InvalidMutabilityException`. */ +private var injectedMainDispatcher: MainCoroutineDispatcher? = null + public actual object Dispatchers { public actual val Default: CoroutineDispatcher = createDefaultDispatcher() - public actual val Main: MainCoroutineDispatcher = NativeMainDispatcher(Default) + public actual val Main: MainCoroutineDispatcher + get() = injectedMainDispatcher ?: mainDispatcher public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing + + private val mainDispatcher = NativeMainDispatcher(Default) + + @PublishedApi + internal fun injectMain(dispatcher: MainCoroutineDispatcher) { + injectedMainDispatcher = dispatcher + } + + @PublishedApi + internal fun resetInjectedMain() { + injectedMainDispatcher = null + } } private class NativeMainDispatcher(val delegate: CoroutineDispatcher) : MainCoroutineDispatcher() { diff --git a/kotlinx-coroutines-test/common/src/TestDispatchers.kt b/kotlinx-coroutines-test/common/src/TestDispatchers.kt index 2f00331506..f8896d7278 100644 --- a/kotlinx-coroutines-test/common/src/TestDispatchers.kt +++ b/kotlinx-coroutines-test/common/src/TestDispatchers.kt @@ -1,10 +1,13 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +@file:JvmName("TestDispatchers") package kotlinx.coroutines.test import kotlinx.coroutines.* +import kotlinx.coroutines.test.internal.* +import kotlin.jvm.* /** * Sets the given [dispatcher] as an underlying dispatcher of [Dispatchers.Main]. @@ -13,7 +16,10 @@ import kotlinx.coroutines.* * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. */ @ExperimentalCoroutinesApi -public expect fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) +public fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { + require(dispatcher !is TestMainDispatcher) { "Dispatchers.setMain(Dispatchers.Main) is prohibited, probably Dispatchers.resetMain() should be used instead" } + getTestMainDispatcher().setDispatcher(dispatcher) +} /** * Resets state of the [Dispatchers.Main] to the original main dispatcher. @@ -23,4 +29,6 @@ public expect fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. */ @ExperimentalCoroutinesApi -public expect fun Dispatchers.resetMain() +public fun Dispatchers.resetMain() { + getTestMainDispatcher().resetDispatcher() +} diff --git a/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt b/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt new file mode 100644 index 0000000000..f2e5b7a168 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test.internal +import kotlinx.coroutines.* +import kotlin.coroutines.* + +/** + * The testable main dispatcher used by kotlinx-coroutines-test. + * It is a [MainCoroutineDispatcher] that delegates all actions to a settable delegate. + */ +internal class TestMainDispatcher(private var delegate: CoroutineDispatcher): + MainCoroutineDispatcher(), + Delay by (delegate as? Delay ?: defaultDelay) +{ + private val mainDispatcher = delegate // the initial value passed to the constructor + + override val immediate: MainCoroutineDispatcher + get() = (delegate as? MainCoroutineDispatcher)?.immediate ?: this + + override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.dispatch(context, block) + + override fun isDispatchNeeded(context: CoroutineContext): Boolean = delegate.isDispatchNeeded(context) + + override fun dispatchYield(context: CoroutineContext, block: Runnable) = delegate.dispatchYield(context, block) + + fun setDispatcher(dispatcher: CoroutineDispatcher) { + delegate = dispatcher + } + + fun resetDispatcher() { + delegate = mainDispatcher + } +} + +@Suppress("INVISIBLE_MEMBER") +private val defaultDelay + inline get() = DefaultDelay + +@Suppress("INVISIBLE_MEMBER") +internal expect fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt index c3686845de..e54ba21568 100644 --- a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt +++ b/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt @@ -15,7 +15,6 @@ class TestCoroutineDispatcherOrderTest { private fun expect(index: Int) { val wasIndex = actionIndex.incrementAndGet() - // println("expect($index), wasIndex=$wasIndex") check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } } diff --git a/kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt similarity index 97% rename from kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt rename to kotlinx-coroutines-test/common/test/TestDispatchersTest.kt index 3ab78987f0..b758c58636 100644 --- a/kotlinx-coroutines-test/jvm/test/TestDispatchersTest.kt +++ b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt @@ -14,7 +14,6 @@ class TestDispatchersTest { private fun expect(index: Int) { val wasIndex = actionIndex.incrementAndGet() - println("expect($index), wasIndex=$wasIndex") check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } } @@ -69,4 +68,4 @@ class TestDispatchersTest { block.run() } } -} +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt b/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt index 064cb7cb71..5d94bd2866 100644 --- a/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt +++ b/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt @@ -15,7 +15,6 @@ class TestRunBlockingOrderTest { private fun expect(index: Int) { val wasIndex = actionIndex.incrementAndGet() - // println("expect($index), wasIndex=$wasIndex") check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } } diff --git a/kotlinx-coroutines-test/js/src/TestDispatchers.kt b/kotlinx-coroutines-test/js/src/TestDispatchers.kt deleted file mode 100644 index 10322079d3..0000000000 --- a/kotlinx-coroutines-test/js/src/TestDispatchers.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test -import kotlinx.coroutines.* - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { - throw UnsupportedOperationException("`setMain` is not supported on JS") -} - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.resetMain() { - throw UnsupportedOperationException("`resetMain` is not supported on JS") -} diff --git a/kotlinx-coroutines-test/js/src/internal/TestMainDispatcher.kt b/kotlinx-coroutines-test/js/src/internal/TestMainDispatcher.kt new file mode 100644 index 0000000000..4d865f83c0 --- /dev/null +++ b/kotlinx-coroutines-test/js/src/internal/TestMainDispatcher.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test.internal +import kotlinx.coroutines.* + +@Suppress("INVISIBLE_MEMBER") +internal actual fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher = + when (val mainDispatcher = Main) { + is TestMainDispatcher -> mainDispatcher + else -> TestMainDispatcher(mainDispatcher).also { injectMain(it) } + } diff --git a/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt b/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt deleted file mode 100644 index 800eca5d1d..0000000000 --- a/kotlinx-coroutines-test/jvm/src/TestDispatchers.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -@file:JvmName("TestDispatchers") - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlinx.coroutines.test.internal.* - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { - require(dispatcher !is TestMainDispatcher) { "Dispatchers.setMain(Dispatchers.Main) is prohibited, probably Dispatchers.resetMain() should be used instead" } - val mainDispatcher = Main - require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } - mainDispatcher.setDispatcher(dispatcher) -} - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.resetMain() { - val mainDispatcher = Main - require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } - mainDispatcher.resetDispatcher() -} diff --git a/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt b/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt deleted file mode 100644 index 4c70ca3fcf..0000000000 --- a/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcher.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test.internal - -import kotlinx.coroutines.* -import kotlinx.coroutines.internal.* -import kotlin.coroutines.* - -/** - * The testable main dispatcher used by kotlinx-coroutines-test. - * It is a [MainCoroutineDispatcher] which delegates all actions to a settable delegate. - */ -internal class TestMainDispatcher(private val mainFactory: MainDispatcherFactory) : MainCoroutineDispatcher(), Delay { - private var _delegate: CoroutineDispatcher? = null - private val delegate: CoroutineDispatcher get() { - _delegate?.let { return it } - mainFactory.tryCreateDispatcher(emptyList()).let { - // If we've failed to create a dispatcher, do no set _delegate - if (!isMissing()) { - _delegate = it - } - return it - } - } - - @Suppress("INVISIBLE_MEMBER") - private val delay: Delay get() = delegate as? Delay ?: DefaultDelay - - override val immediate: MainCoroutineDispatcher - get() = (delegate as? MainCoroutineDispatcher)?.immediate ?: this - - override fun dispatch(context: CoroutineContext, block: Runnable) { - delegate.dispatch(context, block) - } - - override fun isDispatchNeeded(context: CoroutineContext): Boolean = delegate.isDispatchNeeded(context) - - override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - delay.scheduleResumeAfterDelay(timeMillis, continuation) - } - - override suspend fun delay(time: Long) { - delay.delay(time) - } - - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - return delay.invokeOnTimeout(timeMillis, block, context) - } - - fun setDispatcher(dispatcher: CoroutineDispatcher) { - _delegate = dispatcher - } - - fun resetDispatcher() { - _delegate = null - } -} - -internal class TestMainDispatcherFactory : MainDispatcherFactory { - - override fun createDispatcher(allFactories: List): MainCoroutineDispatcher { - val originalFactory = allFactories.asSequence() - .filter { it !== this } - .maxByOrNull { it.loadPriority } ?: MissingMainCoroutineDispatcherFactory - return TestMainDispatcher(originalFactory) - } - - /** - * [Int.MAX_VALUE] -- test dispatcher always wins no matter what factories are present in the classpath. - * By default, all actions are delegated to the second-priority dispatcher, so that it won't be the issue. - */ - override val loadPriority: Int - get() = Int.MAX_VALUE -} diff --git a/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcherJvm.kt b/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcherJvm.kt new file mode 100644 index 0000000000..f86b08ea14 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/internal/TestMainDispatcherJvm.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test.internal + +import kotlinx.coroutines.* +import kotlinx.coroutines.internal.* + +internal class TestMainDispatcherFactory : MainDispatcherFactory { + + override fun createDispatcher(allFactories: List): MainCoroutineDispatcher { + val otherFactories = allFactories.filter { it !== this } + val secondBestFactory = otherFactories.maxByOrNull { it.loadPriority } ?: MissingMainCoroutineDispatcherFactory + val dispatcher = secondBestFactory.tryCreateDispatcher(otherFactories) + return TestMainDispatcher(dispatcher) + } + + /** + * [Int.MAX_VALUE] -- test dispatcher always wins no matter what factories are present in the classpath. + * By default, all actions are delegated to the second-priority dispatcher, so that it won't be the issue. + */ + override val loadPriority: Int + get() = Int.MAX_VALUE +} + +internal actual fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher { + val mainDispatcher = Main + require(mainDispatcher is TestMainDispatcher) { "TestMainDispatcher is not set as main dispatcher, have $mainDispatcher instead." } + return mainDispatcher +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/native/src/TestDispatchers.kt b/kotlinx-coroutines-test/native/src/TestDispatchers.kt deleted file mode 100644 index 44c7a72752..0000000000 --- a/kotlinx-coroutines-test/native/src/TestDispatchers.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { - throw UnsupportedOperationException("`setMain` is not supported on Native") -} - -@ExperimentalCoroutinesApi -public actual fun Dispatchers.resetMain() { - throw UnsupportedOperationException("`resetMain` is not supported on Native") -} \ No newline at end of file diff --git a/kotlinx-coroutines-test/native/src/TestMainDispatcher.kt b/kotlinx-coroutines-test/native/src/TestMainDispatcher.kt new file mode 100644 index 0000000000..4d865f83c0 --- /dev/null +++ b/kotlinx-coroutines-test/native/src/TestMainDispatcher.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test.internal +import kotlinx.coroutines.* + +@Suppress("INVISIBLE_MEMBER") +internal actual fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher = + when (val mainDispatcher = Main) { + is TestMainDispatcher -> mainDispatcher + else -> TestMainDispatcher(mainDispatcher).also { injectMain(it) } + } From 8d1ee7d3230a66f7c26910c1b17746fd3ada57d8 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 11 Oct 2021 16:57:33 +0300 Subject: [PATCH 160/328] Promote the following experimental API to stable (#2971) * transformWhile * awaitClose and ProducerScope (for callbackFlow and channelFlow) * merge * runningFold, runningReduce, and scan --- kotlinx-coroutines-core/common/src/channels/Produce.kt | 8 ++------ .../common/src/flow/operators/Limit.kt | 1 - .../common/src/flow/operators/Merge.kt | 2 -- .../common/src/flow/operators/Transform.kt | 3 --- reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt | 1 - 5 files changed, 2 insertions(+), 13 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/channels/Produce.kt b/kotlinx-coroutines-core/common/src/channels/Produce.kt index 3342fb6ec9..a03e3d8742 100644 --- a/kotlinx-coroutines-core/common/src/channels/Produce.kt +++ b/kotlinx-coroutines-core/common/src/channels/Produce.kt @@ -6,14 +6,11 @@ package kotlinx.coroutines.channels import kotlinx.coroutines.* import kotlin.coroutines.* +import kotlinx.coroutines.flow.* /** - * Scope for the [produce][CoroutineScope.produce] coroutine builder. - * - * **Note: This is an experimental api.** Behavior of producers that work as children in a parent scope with respect - * to cancellation and error handling may change in the future. + * Scope for the [produce][CoroutineScope.produce], [callbackFlow] and [channelFlow] builders. */ -@ExperimentalCoroutinesApi public interface ProducerScope : CoroutineScope, SendChannel { /** * A reference to the channel this coroutine [sends][send] elements to. @@ -45,7 +42,6 @@ public interface ProducerScope : CoroutineScope, SendChannel { * } * ``` */ -@ExperimentalCoroutinesApi public suspend fun ProducerScope<*>.awaitClose(block: () -> Unit = {}) { check(kotlin.coroutines.coroutineContext[Job] === this) { "awaitClose() can only be invoked from the producer context" } try { diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt b/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt index 8fbf1a2b0e..734464b557 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt @@ -112,7 +112,6 @@ public fun Flow.takeWhile(predicate: suspend (T) -> Boolean): Flow = f * } * ``` */ -@ExperimentalCoroutinesApi public fun Flow.transformWhile( @BuilderInference transform: suspend FlowCollector.(value: T) -> Boolean ): Flow = diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt index 432160f340..228cc9e245 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt @@ -90,7 +90,6 @@ public fun Flow>.flattenConcat(): Flow = flow { * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. */ -@ExperimentalCoroutinesApi public fun Iterable>.merge(): Flow { /* * This is a fuseable implementation of the following operator: @@ -114,7 +113,6 @@ public fun Iterable>.merge(): Flow { * Applications of [flowOn], [buffer], and [produceIn] _after_ this operator are fused with * its concurrent merging so that only one properly configured channel is used for execution of merging logic. */ -@ExperimentalCoroutinesApi public fun merge(vararg flows: Flow): Flow = flows.asIterable().merge() /** diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt index a47ae776ca..9b97193227 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt @@ -85,7 +85,6 @@ public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform * * This function is an alias to [runningFold] operator. */ -@ExperimentalCoroutinesApi public fun Flow.scan(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = runningFold(initial, operation) /** @@ -97,7 +96,6 @@ public fun Flow.scan(initial: R, @BuilderInference operation: suspend * ``` * will produce `[], [1], [1, 2], [1, 2, 3]]`. */ -@ExperimentalCoroutinesApi public fun Flow.runningFold(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = flow { var accumulator: R = initial emit(accumulator) @@ -118,7 +116,6 @@ public fun Flow.runningFold(initial: R, @BuilderInference operation: s * ``` * will produce `[1, 3, 6, 10]` */ -@ExperimentalCoroutinesApi public fun Flow.runningReduce(operation: suspend (accumulator: T, value: T) -> T): Flow = flow { var accumulator: Any? = NULL collect { value -> diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index d9228409db..ce68091705 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -4,7 +4,6 @@ package kotlinx.coroutines.reactor -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlin.coroutines.* import kotlinx.coroutines.reactive.* import reactor.util.context.* From 1df0be553c5c0558feeb7299114239442bd3d33c Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 12 Oct 2021 14:40:16 +0300 Subject: [PATCH 161/328] Introduce CoroutineDispatcher.limitedParallelism and make Dispatchers.IO unbounded for limited parallelism (#2918) * Introduce CoroutineDispatcher.limitedParallelism for granular concurrency control * Elastic Dispatchers.IO: * Extract Ktor-obsolete API to a separate file for backwards compatibility * Make Dispatchers.IO being a slice of unlimited blocking scheduler * Make Dispatchers.IO.limitParallelism take slices from the same internal scheduler Fixes #2943 Fixes #2919 --- .../benchmarks/ParametrizedDispatcherBase.kt | 2 +- .../kotlin/benchmarks/SemaphoreBenchmark.kt | 11 +- .../actors/PingPongWithBlockingContext.kt | 6 +- .../test/TaskTest.kt | 8 +- .../api/kotlinx-coroutines-core.api | 2 + .../common/src/CoroutineDispatcher.kt | 39 +++ .../common/src/EventLoop.common.kt | 6 +- .../common/src/MainCoroutineDispatcher.kt | 8 + .../common/src/Unconfined.kt | 6 + .../common/src/internal/LimitedDispatcher.kt | 105 +++++++ .../js/src/JSDispatcher.kt | 5 + .../jvm/src/Dispatchers.kt | 30 +- .../jvm/src/internal/MainDispatchers.kt | 3 + .../jvm/src/scheduling/Deprecated.kt | 212 ++++++++++++++ .../jvm/src/scheduling/Dispatcher.kt | 266 +++++------------- .../jvm/src/scheduling/Tasks.kt | 37 ++- .../jvm/test/LimitedParallelismStressTest.kt | 83 ++++++ .../jvm/test/LimitedParallelismTest.kt | 55 ++++ ...oroutineDispatcherTerminationStressTest.kt | 2 +- .../BlockingCoroutineDispatcherTest.kt | 65 ----- ...utineDispatcherWorkSignallingStressTest.kt | 2 +- .../scheduling/CoroutineDispatcherTest.kt | 2 +- .../CoroutineSchedulerCloseStressTest.kt | 26 +- .../CoroutineSchedulerStressTest.kt | 2 +- .../test/scheduling/CoroutineSchedulerTest.kt | 12 +- .../test/scheduling/DefaultDispatchersTest.kt | 75 +++++ .../test/scheduling/LimitingDispatcherTest.kt | 5 - .../jvm/test/scheduling/SchedulerTestBase.kt | 21 +- .../test/scheduling/SharingWorkerClassTest.kt | 6 +- 29 files changed, 755 insertions(+), 347 deletions(-) create mode 100644 kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt create mode 100644 kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt create mode 100644 kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt create mode 100644 kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt create mode 100644 kotlinx-coroutines-core/jvm/test/scheduling/DefaultDispatchersTest.kt diff --git a/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt b/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt index 9948a371bc..80e15a1b4f 100644 --- a/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt +++ b/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt @@ -30,7 +30,7 @@ abstract class ParametrizedDispatcherBase : CoroutineScope { coroutineContext = when { dispatcher == "fjp" -> ForkJoinPool.commonPool().asCoroutineDispatcher() dispatcher == "scheduler" -> { - ExperimentalCoroutineDispatcher(CORES_COUNT).also { closeable = it } + Dispatchers.Default } dispatcher.startsWith("ftp") -> { newFixedThreadPoolContext(dispatcher.substring(4).toInt(), dispatcher).also { closeable = it } diff --git a/benchmarks/src/jmh/kotlin/benchmarks/SemaphoreBenchmark.kt b/benchmarks/src/jmh/kotlin/benchmarks/SemaphoreBenchmark.kt index 40ddc8ec36..9e1bfc43bb 100644 --- a/benchmarks/src/jmh/kotlin/benchmarks/SemaphoreBenchmark.kt +++ b/benchmarks/src/jmh/kotlin/benchmarks/SemaphoreBenchmark.kt @@ -6,13 +6,10 @@ package benchmarks import benchmarks.common.* import kotlinx.coroutines.* -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.scheduling.ExperimentalCoroutineDispatcher -import kotlinx.coroutines.sync.Semaphore -import kotlinx.coroutines.sync.withPermit +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.sync.* import org.openjdk.jmh.annotations.* -import java.util.concurrent.ForkJoinPool -import java.util.concurrent.TimeUnit +import java.util.concurrent.* @Warmup(iterations = 3, time = 500, timeUnit = TimeUnit.MICROSECONDS) @Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MICROSECONDS) @@ -84,7 +81,7 @@ open class SemaphoreBenchmark { enum class SemaphoreBenchDispatcherCreator(val create: (parallelism: Int) -> CoroutineDispatcher) { FORK_JOIN({ parallelism -> ForkJoinPool(parallelism).asCoroutineDispatcher() }), - EXPERIMENTAL({ parallelism -> ExperimentalCoroutineDispatcher(corePoolSize = parallelism, maxPoolSize = parallelism) }) + EXPERIMENTAL({ parallelism -> Dispatchers.Default }) // TODO doesn't take parallelism into account } private const val WORK_INSIDE = 80 diff --git a/benchmarks/src/jmh/kotlin/benchmarks/scheduler/actors/PingPongWithBlockingContext.kt b/benchmarks/src/jmh/kotlin/benchmarks/scheduler/actors/PingPongWithBlockingContext.kt index a6f0a473c1..d874f3bbe1 100644 --- a/benchmarks/src/jmh/kotlin/benchmarks/scheduler/actors/PingPongWithBlockingContext.kt +++ b/benchmarks/src/jmh/kotlin/benchmarks/scheduler/actors/PingPongWithBlockingContext.kt @@ -27,10 +27,8 @@ import kotlin.coroutines.* @State(Scope.Benchmark) open class PingPongWithBlockingContext { - @UseExperimental(InternalCoroutinesApi::class) - private val experimental = ExperimentalCoroutineDispatcher(8) - @UseExperimental(InternalCoroutinesApi::class) - private val blocking = experimental.blocking(8) + private val experimental = Dispatchers.Default + private val blocking = Dispatchers.IO.limitedParallelism(8) private val threadPool = newFixedThreadPoolContext(8, "PongCtx") @TearDown diff --git a/integration/kotlinx-coroutines-play-services/test/TaskTest.kt b/integration/kotlinx-coroutines-play-services/test/TaskTest.kt index b125192e93..34fbe23b55 100644 --- a/integration/kotlinx-coroutines-play-services/test/TaskTest.kt +++ b/integration/kotlinx-coroutines-play-services/test/TaskTest.kt @@ -45,8 +45,8 @@ class TaskTest : TestBase() { } @Test - fun testCancelledAsTask() { - val deferred = GlobalScope.async { + fun testCancelledAsTask() = runTest { + val deferred = async(Dispatchers.Default) { delay(100) }.apply { cancel() } @@ -60,8 +60,8 @@ class TaskTest : TestBase() { } @Test - fun testThrowingAsTask() { - val deferred = GlobalScope.async { + fun testThrowingAsTask() = runTest({ e -> e is TestException }) { + val deferred = async(Dispatchers.Default) { throw TestException("Fail") } diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index fcd51ae2eb..495d11a804 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -156,6 +156,7 @@ public abstract class kotlinx/coroutines/CoroutineDispatcher : kotlin/coroutines public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; public final fun interceptContinuation (Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; public fun isDispatchNeeded (Lkotlin/coroutines/CoroutineContext;)Z + public fun limitedParallelism (I)Lkotlinx/coroutines/CoroutineDispatcher; public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; public final fun plus (Lkotlinx/coroutines/CoroutineDispatcher;)Lkotlinx/coroutines/CoroutineDispatcher; public final fun releaseInterceptedContinuation (Lkotlin/coroutines/Continuation;)V @@ -447,6 +448,7 @@ public class kotlinx/coroutines/JobSupport : kotlinx/coroutines/ChildJob, kotlin public abstract class kotlinx/coroutines/MainCoroutineDispatcher : kotlinx/coroutines/CoroutineDispatcher { public fun ()V public abstract fun getImmediate ()Lkotlinx/coroutines/MainCoroutineDispatcher; + public fun limitedParallelism (I)Lkotlinx/coroutines/CoroutineDispatcher; public fun toString ()Ljava/lang/String; protected final fun toStringInternalImpl ()Ljava/lang/String; } diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index d5613d4110..c91e944b91 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -61,6 +61,45 @@ public abstract class CoroutineDispatcher : */ public open fun isDispatchNeeded(context: CoroutineContext): Boolean = true + /** + * Creates a view of the current dispatcher that limits the parallelism to the given [value][parallelism]. + * The resulting view uses the original dispatcher for execution, but with the guarantee that + * no more than [parallelism] coroutines are executed at the same time. + * + * This method does not impose restrictions on the number of views or the total sum of parallelism values, + * each view controls its own parallelism independently with the guarantee that the effective parallelism + * of all views cannot exceed the actual parallelism of the original dispatcher. + * + * ### Limitations + * + * The default implementation of `limitedParallelism` does not support direct dispatchers, + * such as executing the given runnable in place during [dispatch] calls. + * Any dispatcher that may return `false` from [isDispatchNeeded] is considered direct. + * For direct dispatchers, it is recommended to override this method + * and provide a domain-specific implementation or to throw an [UnsupportedOperationException]. + * + * ### Example of usage + * ``` + * private val backgroundDispatcher = newFixedThreadPoolContext(4, "App Background") + * // At most 2 threads will be processing images as it is really slow and CPU-intensive + * private val imageProcessingDispatcher = backgroundDispatcher.limitedParallelism(2) + * // At most 3 threads will be processing JSON to avoid image processing starvation + * private val imageProcessingDispatcher = backgroundDispatcher.limitedParallelism(3) + * // At most 1 thread will be doing IO + * private val fileWriterDispatcher = backgroundDispatcher.limitedParallelism(1) + * ``` + * is 6. Yet at most 4 coroutines can be executed simultaneously as each view limits only its own parallelism. + * + * Note that this example was structured in such a way that it illustrates the parallelism guarantees. + * In practice, it is usually better to use [Dispatchers.IO] or [Dispatchers.Default] instead of creating a + * `backgroundDispatcher`. It is both possible and advised to call `limitedParallelism` on them. + */ + @ExperimentalCoroutinesApi + public open fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + parallelism.checkParallelism() + return LimitedDispatcher(this, parallelism) + } + /** * Dispatches execution of a runnable [block] onto another thread in the given [context]. * This method should guarantee that the given [block] will be eventually invoked, diff --git a/kotlinx-coroutines-core/common/src/EventLoop.common.kt b/kotlinx-coroutines-core/common/src/EventLoop.common.kt index e2a1ffd69f..c4d4e272d7 100644 --- a/kotlinx-coroutines-core/common/src/EventLoop.common.kt +++ b/kotlinx-coroutines-core/common/src/EventLoop.common.kt @@ -115,6 +115,11 @@ internal abstract class EventLoop : CoroutineDispatcher() { } } + final override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + parallelism.checkParallelism() + return this + } + open fun shutdown() {} } @@ -525,4 +530,3 @@ internal expect fun nanoTime(): Long internal expect object DefaultExecutor { public fun enqueue(task: Runnable) } - diff --git a/kotlinx-coroutines-core/common/src/MainCoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/MainCoroutineDispatcher.kt index 602da6e0b5..a7065ccd15 100644 --- a/kotlinx-coroutines-core/common/src/MainCoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/MainCoroutineDispatcher.kt @@ -4,6 +4,8 @@ package kotlinx.coroutines +import kotlinx.coroutines.internal.* + /** * Base class for special [CoroutineDispatcher] which is confined to application "Main" or "UI" thread * and used for any UI-based activities. Instance of `MainDispatcher` can be obtained by [Dispatchers.Main]. @@ -51,6 +53,12 @@ public abstract class MainCoroutineDispatcher : CoroutineDispatcher() { */ override fun toString(): String = toStringInternalImpl() ?: "$classSimpleName@$hexAddress" + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + parallelism.checkParallelism() + // MainCoroutineDispatcher is single-threaded -- short-circuit any attempts to limit it + return this + } + /** * Internal method for more specific [toString] implementations. It returns non-null * string if this dispatcher is set in the platform as the main one. diff --git a/kotlinx-coroutines-core/common/src/Unconfined.kt b/kotlinx-coroutines-core/common/src/Unconfined.kt index df0087100a..24a401f702 100644 --- a/kotlinx-coroutines-core/common/src/Unconfined.kt +++ b/kotlinx-coroutines-core/common/src/Unconfined.kt @@ -11,6 +11,12 @@ import kotlin.jvm.* * A coroutine dispatcher that is not confined to any specific thread. */ internal object Unconfined : CoroutineDispatcher() { + + @ExperimentalCoroutinesApi + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + throw UnsupportedOperationException("limitedParallelism is not supported for Dispatchers.Unconfined") + } + override fun isDispatchNeeded(context: CoroutineContext): Boolean = false override fun dispatch(context: CoroutineContext, block: Runnable) { diff --git a/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt b/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt new file mode 100644 index 0000000000..892375b89f --- /dev/null +++ b/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.internal + +import kotlinx.coroutines.* +import kotlin.coroutines.* +import kotlin.jvm.* + +/** + * The result of .limitedParallelism(x) call, a dispatcher + * that wraps the given dispatcher, but limits the parallelism level, while + * trying to emulate fairness. + */ +internal class LimitedDispatcher( + private val dispatcher: CoroutineDispatcher, + private val parallelism: Int +) : CoroutineDispatcher(), Runnable, Delay by (dispatcher as? Delay ?: DefaultDelay) { + + @Volatile + private var runningWorkers = 0 + + private val queue = LockFreeTaskQueue(singleConsumer = false) + + @ExperimentalCoroutinesApi + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + parallelism.checkParallelism() + if (parallelism >= this.parallelism) return this + return super.limitedParallelism(parallelism) + } + + override fun run() { + var fairnessCounter = 0 + while (true) { + val task = queue.removeFirstOrNull() + if (task != null) { + try { + task.run() + } catch (e: Throwable) { + handleCoroutineException(EmptyCoroutineContext, e) + } + // 16 is our out-of-thin-air constant to emulate fairness. Used in JS dispatchers as well + if (++fairnessCounter >= 16 && dispatcher.isDispatchNeeded(this)) { + // Do "yield" to let other views to execute their runnable as well + // Note that we do not decrement 'runningWorkers' as we still committed to do our part of work + dispatcher.dispatch(this, this) + return + } + continue + } + + @Suppress("CAST_NEVER_SUCCEEDS") + synchronized(this as SynchronizedObject) { + --runningWorkers + if (queue.size == 0) return + ++runningWorkers + fairnessCounter = 0 + } + } + } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + dispatchInternal(block) { + dispatcher.dispatch(this, this) + } + } + + @InternalCoroutinesApi + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + dispatchInternal(block) { + dispatcher.dispatchYield(this, this) + } + } + + private inline fun dispatchInternal(block: Runnable, dispatch: () -> Unit) { + // Add task to queue so running workers will be able to see that + if (addAndTryDispatching(block)) return + /* + * Protect against the race when the number of workers is enough, + * but one (because of synchronized serialization) attempts to complete, + * and we just observed the number of running workers smaller than the actual + * number (hit right between `--runningWorkers` and `++runningWorkers` in `run()`) + */ + if (!tryAllocateWorker()) return + dispatch() + } + + private fun tryAllocateWorker(): Boolean { + @Suppress("CAST_NEVER_SUCCEEDS") + synchronized(this as SynchronizedObject) { + if (runningWorkers >= parallelism) return false + ++runningWorkers + return true + } + } + + private fun addAndTryDispatching(block: Runnable): Boolean { + queue.addLast(block) + return runningWorkers >= parallelism + } +} + +// Save a few bytecode ops +internal fun Int.checkParallelism() = require(this >= 1) { "Expected positive parallelism level, but got $this" } diff --git a/kotlinx-coroutines-core/js/src/JSDispatcher.kt b/kotlinx-coroutines-core/js/src/JSDispatcher.kt index 6ad7d41b15..603005d5a4 100644 --- a/kotlinx-coroutines-core/js/src/JSDispatcher.kt +++ b/kotlinx-coroutines-core/js/src/JSDispatcher.kt @@ -31,6 +31,11 @@ internal sealed class SetTimeoutBasedDispatcher: CoroutineDispatcher(), Delay { abstract fun scheduleQueueProcessing() + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + parallelism.checkParallelism() + return this + } + override fun dispatch(context: CoroutineContext, block: Runnable) { messageQueue.enqueue(block) } diff --git a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt index a3be9fa53c..4b1b03337d 100644 --- a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt @@ -86,7 +86,7 @@ public actual object Dispatchers { * Note that if you need your coroutine to be confined to a particular thread or a thread-pool after resumption, * but still want to execute it in the current call-frame until its first suspension, then you can use * an optional [CoroutineStart] parameter in coroutine builders like - * [launch][CoroutineScope.launch] and [async][CoroutineScope.async] setting it to the + * [launch][CoroutineScope.launch] and [async][CoroutineScope.async] setting it to * the value of [CoroutineStart.UNDISPATCHED]. */ @JvmStatic @@ -100,14 +100,30 @@ public actual object Dispatchers { * "`kotlinx.coroutines.io.parallelism`" ([IO_PARALLELISM_PROPERTY_NAME]) system property. * It defaults to the limit of 64 threads or the number of cores (whichever is larger). * - * Moreover, the maximum configurable number of threads is capped by the - * `kotlinx.coroutines.scheduler.max.pool.size` system property. - * If you need a higher number of parallel threads, - * you should use a custom dispatcher backed by your own thread pool. + * ### Elasticity for limited parallelism + * + * `Dispatchers.IO` has a unique property of elasticity: its views + * obtained with [CoroutineDispatcher.limitedParallelism] are + * not restricted by the `Dispatchers.IO` parallelism. Conceptually, there is + * a dispatcher backed by an unlimited pool of threads, and both `Dispatchers.IO` + * and views of `Dispatchers.IO` are actually views of that dispatcher. In practice + * this means that, despite not abiding by `Dispatchers.IO`'s parallelism + * restrictions, its views share threads and resources with it. + * + * In the following example + * ``` + * // 100 threads for MySQL connection + * val myMysqlDbDispatcher = Dispatchers.IO.limitedParallelism(100) + * // 60 threads for MongoDB connection + * val myMongoDbDispatcher = Dispatchers.IO.limitedParallelism(60) + * ``` + * the system may have up to `64 + 100 + 60` threads dedicated to blocking tasks during peak loads, + * but during its steady state there is only a small number of threads shared + * among `Dispatchers.IO`, `myMysqlDbDispatcher` and `myMongoDbDispatcher`. * * ### Implementation note * - * This dispatcher shares threads with the [Default][Dispatchers.Default] dispatcher, so using + * This dispatcher and its views share threads with the [Default][Dispatchers.Default] dispatcher, so using * `withContext(Dispatchers.IO) { ... }` when already running on the [Default][Dispatchers.Default] * dispatcher does not lead to an actual switching to another thread — typically execution * continues in the same thread. @@ -115,7 +131,7 @@ public actual object Dispatchers { * during operations over IO dispatcher. */ @JvmStatic - public val IO: CoroutineDispatcher = DefaultScheduler.IO + public val IO: CoroutineDispatcher = DefaultIoScheduler /** * Shuts down built-in dispatchers, such as [Default] and [IO], diff --git a/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt b/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt index 2d447413b8..2da633a6b6 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/MainDispatchers.kt @@ -93,6 +93,9 @@ private class MissingMainCoroutineDispatcher( override fun isDispatchNeeded(context: CoroutineContext): Boolean = missing() + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher = + missing() + override suspend fun delay(time: Long) = missing() diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt b/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt new file mode 100644 index 0000000000..86b0ade61a --- /dev/null +++ b/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt @@ -0,0 +1,212 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:Suppress("unused") + +package kotlinx.coroutines.scheduling +import kotlinx.atomicfu.* +import kotlinx.coroutines.* +import java.util.concurrent.* +import kotlin.coroutines.* + +/** + * This API was "public @InternalApi" and leaked into Ktor enabled-by-default sources. + * Since then, we refactored scheduler sources and its API and decided to get rid of it in + * its current shape. + * + * To preserve backwards compatibility with Ktor 1.x, previous version of the code is + * extracted here as is and isolated from the rest of code base, so R8 can get rid of it. + * + * It should be removed after Kotlin 3.0.0 (EOL of Ktor 1.x) around 2022. + */ +@PublishedApi +internal open class ExperimentalCoroutineDispatcher( + private val corePoolSize: Int, + private val maxPoolSize: Int, + private val idleWorkerKeepAliveNs: Long, + private val schedulerName: String = "CoroutineScheduler" +) : ExecutorCoroutineDispatcher() { + public constructor( + corePoolSize: Int = CORE_POOL_SIZE, + maxPoolSize: Int = MAX_POOL_SIZE, + schedulerName: String = DEFAULT_SCHEDULER_NAME + ) : this(corePoolSize, maxPoolSize, IDLE_WORKER_KEEP_ALIVE_NS, schedulerName) + + @Deprecated(message = "Binary compatibility for Ktor 1.0-beta", level = DeprecationLevel.HIDDEN) + public constructor( + corePoolSize: Int = CORE_POOL_SIZE, + maxPoolSize: Int = MAX_POOL_SIZE + ) : this(corePoolSize, maxPoolSize, IDLE_WORKER_KEEP_ALIVE_NS) + + override val executor: Executor + get() = coroutineScheduler + + // This is variable for test purposes, so that we can reinitialize from clean state + private var coroutineScheduler = createScheduler() + + override fun dispatch(context: CoroutineContext, block: Runnable): Unit = + try { + coroutineScheduler.dispatch(block) + } catch (e: RejectedExecutionException) { + // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved + // for testing purposes, so we don't have to worry about cancelling the affected Job here. + DefaultExecutor.dispatch(context, block) + } + + override fun dispatchYield(context: CoroutineContext, block: Runnable): Unit = + try { + coroutineScheduler.dispatch(block, tailDispatch = true) + } catch (e: RejectedExecutionException) { + // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved + // for testing purposes, so we don't have to worry about cancelling the affected Job here. + DefaultExecutor.dispatchYield(context, block) + } + + override fun close(): Unit = coroutineScheduler.close() + + override fun toString(): String { + return "${super.toString()}[scheduler = $coroutineScheduler]" + } + + /** + * Creates a coroutine execution context with limited parallelism to execute tasks which may potentially block. + * Resulting [CoroutineDispatcher] doesn't own any resources (its threads) and provides a view of the original [ExperimentalCoroutineDispatcher], + * giving it additional hints to adjust its behaviour. + * + * @param parallelism parallelism level, indicating how many threads can execute tasks in the resulting dispatcher parallel. + */ + fun blocking(parallelism: Int = 16): CoroutineDispatcher { + require(parallelism > 0) { "Expected positive parallelism level, but have $parallelism" } + return LimitingDispatcher(this, parallelism, null, TASK_PROBABLY_BLOCKING) + } + + /** + * Creates a coroutine execution context with limited parallelism to execute CPU-intensive tasks. + * Resulting [CoroutineDispatcher] doesn't own any resources (its threads) and provides a view of the original [ExperimentalCoroutineDispatcher], + * giving it additional hints to adjust its behaviour. + * + * @param parallelism parallelism level, indicating how many threads can execute tasks in the resulting dispatcher parallel. + */ + fun limited(parallelism: Int): CoroutineDispatcher { + require(parallelism > 0) { "Expected positive parallelism level, but have $parallelism" } + require(parallelism <= corePoolSize) { "Expected parallelism level lesser than core pool size ($corePoolSize), but have $parallelism" } + return LimitingDispatcher(this, parallelism, null, TASK_NON_BLOCKING) + } + + internal fun dispatchWithContext(block: Runnable, context: TaskContext, tailDispatch: Boolean) { + try { + coroutineScheduler.dispatch(block, context, tailDispatch) + } catch (e: RejectedExecutionException) { + // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved + // for testing purposes, so we don't have to worry about cancelling the affected Job here. + // TaskContext shouldn't be lost here to properly invoke before/after task + DefaultExecutor.enqueue(coroutineScheduler.createTask(block, context)) + } + } + + private fun createScheduler() = CoroutineScheduler(corePoolSize, maxPoolSize, idleWorkerKeepAliveNs, schedulerName) +} + +private class LimitingDispatcher( + private val dispatcher: ExperimentalCoroutineDispatcher, + private val parallelism: Int, + private val name: String?, + override val taskMode: Int +) : ExecutorCoroutineDispatcher(), TaskContext, Executor { + + private val queue = ConcurrentLinkedQueue() + private val inFlightTasks = atomic(0) + + override val executor: Executor + get() = this + + override fun execute(command: Runnable) = dispatch(command, false) + + override fun close(): Unit = error("Close cannot be invoked on LimitingBlockingDispatcher") + + override fun dispatch(context: CoroutineContext, block: Runnable) = dispatch(block, false) + + private fun dispatch(block: Runnable, tailDispatch: Boolean) { + var taskToSchedule = block + while (true) { + // Commit in-flight tasks slot + val inFlight = inFlightTasks.incrementAndGet() + + // Fast path, if parallelism limit is not reached, dispatch task and return + if (inFlight <= parallelism) { + dispatcher.dispatchWithContext(taskToSchedule, this, tailDispatch) + return + } + + // Parallelism limit is reached, add task to the queue + queue.add(taskToSchedule) + + /* + * We're not actually scheduled anything, so rollback committed in-flight task slot: + * If the amount of in-flight tasks is still above the limit, do nothing + * If the amount of in-flight tasks is lesser than parallelism, then + * it's a race with a thread which finished the task from the current context, we should resubmit the first task from the queue + * to avoid starvation. + * + * Race example #1 (TN is N-th thread, R is current in-flight tasks number), execution is sequential: + * + * T1: submit task, start execution, R == 1 + * T2: commit slot for next task, R == 2 + * T1: finish T1, R == 1 + * T2: submit next task to local queue, decrement R, R == 0 + * Without retries, task from T2 will be stuck in the local queue + */ + if (inFlightTasks.decrementAndGet() >= parallelism) { + return + } + + taskToSchedule = queue.poll() ?: return + } + } + + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + dispatch(block, tailDispatch = true) + } + + override fun toString(): String { + return name ?: "${super.toString()}[dispatcher = $dispatcher]" + } + + /** + * Tries to dispatch tasks which were blocked due to reaching parallelism limit if there is any. + * + * Implementation note: blocking tasks are scheduled in a fair manner (to local queue tail) to avoid + * non-blocking continuations starvation. + * E.g. for + * ``` + * foo() + * blocking() + * bar() + * ``` + * it's more profitable to execute bar at the end of `blocking` rather than pending blocking task + */ + override fun afterTask() { + var next = queue.poll() + // If we have pending tasks in current blocking context, dispatch first + if (next != null) { + dispatcher.dispatchWithContext(next, this, true) + return + } + inFlightTasks.decrementAndGet() + + /* + * Re-poll again and try to submit task if it's required otherwise tasks may be stuck in the local queue. + * Race example #2 (TN is N-th thread, R is current in-flight tasks number), execution is sequential: + * T1: submit task, start execution, R == 1 + * T2: commit slot for next task, R == 2 + * T1: finish T1, poll queue (it's still empty), R == 2 + * T2: submit next task to the local queue, decrement R, R == 1 + * T1: decrement R, finish. R == 0 + * + * The task from T2 is stuck is the local queue + */ + next = queue.poll() ?: return + dispatch(next, true) + } +} diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt b/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt index 0b5a542c2c..d55edec94f 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/Dispatcher.kt @@ -4,24 +4,16 @@ package kotlinx.coroutines.scheduling -import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.internal.* import java.util.concurrent.* import kotlin.coroutines.* -/** - * Default instance of coroutine dispatcher. - */ -internal object DefaultScheduler : ExperimentalCoroutineDispatcher() { - @JvmField - val IO: CoroutineDispatcher = LimitingDispatcher( - this, - systemProp(IO_PARALLELISM_PROPERTY_NAME, 64.coerceAtLeast(AVAILABLE_PROCESSORS)), - "Dispatchers.IO", - TASK_PROBABLY_BLOCKING - ) - +// Instance of Dispatchers.Default +internal object DefaultScheduler : SchedulerCoroutineDispatcher( + CORE_POOL_SIZE, MAX_POOL_SIZE, + IDLE_WORKER_KEEP_ALIVE_NS, DEFAULT_SCHEDULER_NAME +) { // Shuts down the dispatcher, used only by Dispatchers.shutdown() internal fun shutdown() { super.close() @@ -29,106 +21,91 @@ internal object DefaultScheduler : ExperimentalCoroutineDispatcher() { // Overridden in case anyone writes (Dispatchers.Default as ExecutorCoroutineDispatcher).close() override fun close() { - throw UnsupportedOperationException("$DEFAULT_DISPATCHER_NAME cannot be closed") + throw UnsupportedOperationException("Dispatchers.Default cannot be closed") } - override fun toString(): String = DEFAULT_DISPATCHER_NAME + override fun toString(): String = "Dispatchers.Default" +} + +// The unlimited instance of Dispatchers.IO that utilizes all the threads CoroutineScheduler provides +private object UnlimitedIoScheduler : CoroutineDispatcher() { @InternalCoroutinesApi - @Suppress("UNUSED") - public fun toDebugString(): String = super.toString() + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + DefaultScheduler.dispatchWithContext(block, BlockingContext, true) + } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + DefaultScheduler.dispatchWithContext(block, BlockingContext, false) + } } -/** - * @suppress **This is unstable API and it is subject to change.** - */ -// TODO make internal (and rename) after complete integration -@InternalCoroutinesApi -public open class ExperimentalCoroutineDispatcher( - private val corePoolSize: Int, - private val maxPoolSize: Int, - private val idleWorkerKeepAliveNs: Long, - private val schedulerName: String = "CoroutineScheduler" -) : ExecutorCoroutineDispatcher() { - public constructor( - corePoolSize: Int = CORE_POOL_SIZE, - maxPoolSize: Int = MAX_POOL_SIZE, - schedulerName: String = DEFAULT_SCHEDULER_NAME - ) : this(corePoolSize, maxPoolSize, IDLE_WORKER_KEEP_ALIVE_NS, schedulerName) - - @Deprecated(message = "Binary compatibility for Ktor 1.0-beta", level = DeprecationLevel.HIDDEN) - public constructor( - corePoolSize: Int = CORE_POOL_SIZE, - maxPoolSize: Int = MAX_POOL_SIZE - ) : this(corePoolSize, maxPoolSize, IDLE_WORKER_KEEP_ALIVE_NS) +// Dispatchers.IO +internal object DefaultIoScheduler : ExecutorCoroutineDispatcher(), Executor { + + private val default = UnlimitedIoScheduler.limitedParallelism( + systemProp( + IO_PARALLELISM_PROPERTY_NAME, + 64.coerceAtLeast(AVAILABLE_PROCESSORS) + ) + ) override val executor: Executor - get() = coroutineScheduler + get() = this - // This is variable for test purposes, so that we can reinitialize from clean state - private var coroutineScheduler = createScheduler() + override fun execute(command: java.lang.Runnable) = dispatch(EmptyCoroutineContext, command) - override fun dispatch(context: CoroutineContext, block: Runnable): Unit = - try { - coroutineScheduler.dispatch(block) - } catch (e: RejectedExecutionException) { - // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved - // for testing purposes, so we don't have to worry about cancelling the affected Job here. - DefaultExecutor.dispatch(context, block) - } + @ExperimentalCoroutinesApi + override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { + // See documentation to Dispatchers.IO for the rationale + return UnlimitedIoScheduler.limitedParallelism(parallelism) + } - override fun dispatchYield(context: CoroutineContext, block: Runnable): Unit = - try { - coroutineScheduler.dispatch(block, tailDispatch = true) - } catch (e: RejectedExecutionException) { - // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved - // for testing purposes, so we don't have to worry about cancelling the affected Job here. - DefaultExecutor.dispatchYield(context, block) - } - - override fun close(): Unit = coroutineScheduler.close() - - override fun toString(): String { - return "${super.toString()}[scheduler = $coroutineScheduler]" + override fun dispatch(context: CoroutineContext, block: Runnable) { + default.dispatch(context, block) } - /** - * Creates a coroutine execution context with limited parallelism to execute tasks which may potentially block. - * Resulting [CoroutineDispatcher] doesn't own any resources (its threads) and provides a view of the original [ExperimentalCoroutineDispatcher], - * giving it additional hints to adjust its behaviour. - * - * @param parallelism parallelism level, indicating how many threads can execute tasks in the resulting dispatcher parallel. - */ - public fun blocking(parallelism: Int = BLOCKING_DEFAULT_PARALLELISM): CoroutineDispatcher { - require(parallelism > 0) { "Expected positive parallelism level, but have $parallelism" } - return LimitingDispatcher(this, parallelism, null, TASK_PROBABLY_BLOCKING) + @InternalCoroutinesApi + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + default.dispatchYield(context, block) } - /** - * Creates a coroutine execution context with limited parallelism to execute CPU-intensive tasks. - * Resulting [CoroutineDispatcher] doesn't own any resources (its threads) and provides a view of the original [ExperimentalCoroutineDispatcher], - * giving it additional hints to adjust its behaviour. - * - * @param parallelism parallelism level, indicating how many threads can execute tasks in the resulting dispatcher parallel. - */ - public fun limited(parallelism: Int): CoroutineDispatcher { - require(parallelism > 0) { "Expected positive parallelism level, but have $parallelism" } - require(parallelism <= corePoolSize) { "Expected parallelism level lesser than core pool size ($corePoolSize), but have $parallelism" } - return LimitingDispatcher(this, parallelism, null, TASK_NON_BLOCKING) + override fun close() { + error("Cannot be invoked on Dispatchers.IO") } + override fun toString(): String = "Dispatchers.IO" +} + +// Instantiated in tests so we can test it in isolation +internal open class SchedulerCoroutineDispatcher( + private val corePoolSize: Int = CORE_POOL_SIZE, + private val maxPoolSize: Int = MAX_POOL_SIZE, + private val idleWorkerKeepAliveNs: Long = IDLE_WORKER_KEEP_ALIVE_NS, + private val schedulerName: String = "CoroutineScheduler", +) : ExecutorCoroutineDispatcher() { + + override val executor: Executor + get() = coroutineScheduler + + // This is variable for test purposes, so that we can reinitialize from clean state + private var coroutineScheduler = createScheduler() + + private fun createScheduler() = + CoroutineScheduler(corePoolSize, maxPoolSize, idleWorkerKeepAliveNs, schedulerName) + + override fun dispatch(context: CoroutineContext, block: Runnable): Unit = coroutineScheduler.dispatch(block) + + override fun dispatchYield(context: CoroutineContext, block: Runnable): Unit = + coroutineScheduler.dispatch(block, tailDispatch = true) + internal fun dispatchWithContext(block: Runnable, context: TaskContext, tailDispatch: Boolean) { - try { - coroutineScheduler.dispatch(block, context, tailDispatch) - } catch (e: RejectedExecutionException) { - // CoroutineScheduler only rejects execution when it is being closed and this behavior is reserved - // for testing purposes, so we don't have to worry about cancelling the affected Job here. - // TaskContext shouldn't be lost here to properly invoke before/after task - DefaultExecutor.enqueue(coroutineScheduler.createTask(block, context)) - } + coroutineScheduler.dispatch(block, context, tailDispatch) } - private fun createScheduler() = CoroutineScheduler(corePoolSize, maxPoolSize, idleWorkerKeepAliveNs, schedulerName) + override fun close() { + coroutineScheduler.close() + } // fot tests only @Synchronized @@ -146,106 +123,3 @@ public open class ExperimentalCoroutineDispatcher( // for tests only internal fun restore() = usePrivateScheduler() // recreate scheduler } - -private class LimitingDispatcher( - private val dispatcher: ExperimentalCoroutineDispatcher, - private val parallelism: Int, - private val name: String?, - override val taskMode: Int -) : ExecutorCoroutineDispatcher(), TaskContext, Executor { - - private val queue = ConcurrentLinkedQueue() - private val inFlightTasks = atomic(0) - - override val executor: Executor - get() = this - - override fun execute(command: Runnable) = dispatch(command, false) - - override fun close(): Unit = error("Close cannot be invoked on LimitingBlockingDispatcher") - - override fun dispatch(context: CoroutineContext, block: Runnable) = dispatch(block, false) - - private fun dispatch(block: Runnable, tailDispatch: Boolean) { - var taskToSchedule = block - while (true) { - // Commit in-flight tasks slot - val inFlight = inFlightTasks.incrementAndGet() - - // Fast path, if parallelism limit is not reached, dispatch task and return - if (inFlight <= parallelism) { - dispatcher.dispatchWithContext(taskToSchedule, this, tailDispatch) - return - } - - // Parallelism limit is reached, add task to the queue - queue.add(taskToSchedule) - - /* - * We're not actually scheduled anything, so rollback committed in-flight task slot: - * If the amount of in-flight tasks is still above the limit, do nothing - * If the amount of in-flight tasks is lesser than parallelism, then - * it's a race with a thread which finished the task from the current context, we should resubmit the first task from the queue - * to avoid starvation. - * - * Race example #1 (TN is N-th thread, R is current in-flight tasks number), execution is sequential: - * - * T1: submit task, start execution, R == 1 - * T2: commit slot for next task, R == 2 - * T1: finish T1, R == 1 - * T2: submit next task to local queue, decrement R, R == 0 - * Without retries, task from T2 will be stuck in the local queue - */ - if (inFlightTasks.decrementAndGet() >= parallelism) { - return - } - - taskToSchedule = queue.poll() ?: return - } - } - - override fun dispatchYield(context: CoroutineContext, block: Runnable) { - dispatch(block, tailDispatch = true) - } - - override fun toString(): String { - return name ?: "${super.toString()}[dispatcher = $dispatcher]" - } - - /** - * Tries to dispatch tasks which were blocked due to reaching parallelism limit if there is any. - * - * Implementation note: blocking tasks are scheduled in a fair manner (to local queue tail) to avoid - * non-blocking continuations starvation. - * E.g. for - * ``` - * foo() - * blocking() - * bar() - * ``` - * it's more profitable to execute bar at the end of `blocking` rather than pending blocking task - */ - override fun afterTask() { - var next = queue.poll() - // If we have pending tasks in current blocking context, dispatch first - if (next != null) { - dispatcher.dispatchWithContext(next, this, true) - return - } - inFlightTasks.decrementAndGet() - - /* - * Re-poll again and try to submit task if it's required otherwise tasks may be stuck in the local queue. - * Race example #2 (TN is N-th thread, R is current in-flight tasks number), execution is sequential: - * T1: submit task, start execution, R == 1 - * T2: commit slot for next task, R == 2 - * T1: finish T1, poll queue (it's still empty), R == 2 - * T2: submit next task to the local queue, decrement R, R == 1 - * T1: decrement R, finish. R == 0 - * - * The task from T2 is stuck is the local queue - */ - next = queue.poll() ?: return - dispatch(next, true) - } -} diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/Tasks.kt b/kotlinx-coroutines-core/jvm/src/scheduling/Tasks.kt index da867c9853..5403cfc1fd 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/Tasks.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/Tasks.kt @@ -9,10 +9,6 @@ import kotlinx.coroutines.internal.* import java.util.concurrent.* -// TODO most of these fields will be moved to 'object ExperimentalDispatcher' - -// User-visible name -internal const val DEFAULT_DISPATCHER_NAME = "Dispatchers.Default" // Internal debuggability name + thread name prefixes internal const val DEFAULT_SCHEDULER_NAME = "DefaultDispatcher" @@ -22,27 +18,24 @@ internal val WORK_STEALING_TIME_RESOLUTION_NS = systemProp( "kotlinx.coroutines.scheduler.resolution.ns", 100000L ) -@JvmField -internal val BLOCKING_DEFAULT_PARALLELISM = systemProp( - "kotlinx.coroutines.scheduler.blocking.parallelism", 16 -) - -// NOTE: we coerce default to at least two threads to give us chances that multi-threading problems -// get reproduced even on a single-core machine, but support explicit setting of 1 thread scheduler if needed. +/** + * The maximum number of threads allocated for CPU-bound tasks at the default set of dispatchers. + * + * NOTE: we coerce default to at least two threads to give us chances that multi-threading problems + * get reproduced even on a single-core machine, but support explicit setting of 1 thread scheduler if needed + */ @JvmField internal val CORE_POOL_SIZE = systemProp( "kotlinx.coroutines.scheduler.core.pool.size", - AVAILABLE_PROCESSORS.coerceAtLeast(2), // !!! at least two here + AVAILABLE_PROCESSORS.coerceAtLeast(2), minValue = CoroutineScheduler.MIN_SUPPORTED_POOL_SIZE ) +/** The maximum number of threads allocated for blocking tasks at the default set of dispatchers. */ @JvmField internal val MAX_POOL_SIZE = systemProp( "kotlinx.coroutines.scheduler.max.pool.size", - (AVAILABLE_PROCESSORS * 128).coerceIn( - CORE_POOL_SIZE, - CoroutineScheduler.MAX_SUPPORTED_POOL_SIZE - ), + CoroutineScheduler.MAX_SUPPORTED_POOL_SIZE, maxValue = CoroutineScheduler.MAX_SUPPORTED_POOL_SIZE ) @@ -69,14 +62,18 @@ internal interface TaskContext { fun afterTask() } -internal object NonBlockingContext : TaskContext { - override val taskMode: Int = TASK_NON_BLOCKING - +private class TaskContextImpl(override val taskMode: Int): TaskContext { override fun afterTask() { - // Nothing for non-blocking context + // Nothing for non-blocking context } } +@JvmField +internal val NonBlockingContext: TaskContext = TaskContextImpl(TASK_NON_BLOCKING) + +@JvmField +internal val BlockingContext: TaskContext = TaskContextImpl(TASK_PROBABLY_BLOCKING) + internal abstract class Task( @JvmField var submissionTime: Long, @JvmField var taskContext: TaskContext diff --git a/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt b/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt new file mode 100644 index 0000000000..4de1862b0f --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import org.junit.* +import org.junit.Test +import org.junit.runner.* +import org.junit.runners.* +import java.util.concurrent.* +import java.util.concurrent.atomic.* +import kotlin.test.* + +@RunWith(Parameterized::class) +class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBase() { + + companion object { + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun params(): Collection> = listOf(1, 2, 3, 4).map { arrayOf(it) } + } + + @get:Rule + val executor = ExecutorRule(targetParallelism * 2) + private val iterations = 100_000 * stressTestMultiplier + + private val parallelism = AtomicInteger(0) + + private fun checkParallelism() { + val value = parallelism.incrementAndGet() + Thread.yield() + assertTrue { value <= targetParallelism } + parallelism.decrementAndGet() + } + + @Test + fun testLimitedExecutor() = runTest { + val view = executor.limitedParallelism(targetParallelism) + repeat(iterations) { + launch(view) { + checkParallelism() + } + } + } + + @Test + fun testLimitedDispatchersIo() = runTest { + val view = Dispatchers.IO.limitedParallelism(targetParallelism) + repeat(iterations) { + launch(view) { + checkParallelism() + } + } + } + + @Test + fun testLimitedDispatchersIoDispatchYield() = runTest { + val view = Dispatchers.IO.limitedParallelism(targetParallelism) + repeat(iterations) { + launch(view) { + yield() + checkParallelism() + } + } + } + + @Test + fun testLimitedExecutorReachesTargetParallelism() = runTest { + val view = executor.limitedParallelism(targetParallelism) + repeat(iterations) { + val barrier = CyclicBarrier(targetParallelism + 1) + repeat(targetParallelism) { + launch(view) { + barrier.await() + } + } + // Successfully awaited parallelism + 1 + barrier.await() + coroutineContext.job.children.toList().joinAll() + } + } +} diff --git a/kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt b/kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt new file mode 100644 index 0000000000..30c54117a9 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import org.junit.Test +import java.util.concurrent.* +import kotlin.coroutines.* +import kotlin.test.* + +class LimitedParallelismTest : TestBase() { + + @Test + fun testParallelismSpec() { + assertFailsWith { Dispatchers.Default.limitedParallelism(0) } + assertFailsWith { Dispatchers.Default.limitedParallelism(-1) } + assertFailsWith { Dispatchers.Default.limitedParallelism(Int.MIN_VALUE) } + Dispatchers.Default.limitedParallelism(Int.MAX_VALUE) + } + + @Test + fun testTaskFairness() = runTest { + val executor = newSingleThreadContext("test") + val view = executor.limitedParallelism(1) + val view2 = executor.limitedParallelism(1) + val j1 = launch(view) { + while (true) { + yield() + } + } + val j2 = launch(view2) { j1.cancel() } + joinAll(j1, j2) + executor.close() + } + + @Test + fun testUnhandledException() = runTest { + var caughtException: Throwable? = null + val executor = Executors.newFixedThreadPool( + 1 + ) { + Thread(it).also { + it.uncaughtExceptionHandler = Thread.UncaughtExceptionHandler { _, e -> caughtException = e } + } + }.asCoroutineDispatcher() + val view = executor.limitedParallelism(1) + view.dispatch(EmptyCoroutineContext, Runnable { throw TestException() }) + withContext(view) { + // Verify it is in working state and establish happens-before + } + assertTrue { caughtException is TestException } + executor.close() + } +} diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTerminationStressTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTerminationStressTest.kt index 9c17e6988d..864ecdc087 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTerminationStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTerminationStressTest.kt @@ -10,7 +10,7 @@ import java.util.* import java.util.concurrent.* class BlockingCoroutineDispatcherTerminationStressTest : TestBase() { - private val baseDispatcher = ExperimentalCoroutineDispatcher( + private val baseDispatcher = SchedulerCoroutineDispatcher( 2, 20, TimeUnit.MILLISECONDS.toNanos(10) ) diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt index fe09440f59..f8830feeef 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherTest.kt @@ -125,71 +125,6 @@ class BlockingCoroutineDispatcherTest : SchedulerTestBase() { checkPoolThreadsCreated(101..100 + CORES_COUNT) } - @Test - fun testBlockingFairness() = runBlocking { - corePoolSize = 1 - maxPoolSize = 1 - - val blocking = blockingDispatcher(1) - val task = async(dispatcher) { - expect(1) - - val nonBlocking = async(dispatcher) { - expect(3) - } - - val firstBlocking = async(blocking) { - expect(2) - } - - val secondBlocking = async(blocking) { - // Already have 1 queued blocking task, so this one wouldn't be scheduled to head - expect(4) - } - - listOf(firstBlocking, nonBlocking, secondBlocking).joinAll() - finish(5) - } - - task.await() - } - - @Test - fun testBoundedBlockingFairness() = runBlocking { - corePoolSize = 1 - maxPoolSize = 1 - - val blocking = blockingDispatcher(2) - val task = async(dispatcher) { - expect(1) - - val nonBlocking = async(dispatcher) { - expect(3) - } - - val firstBlocking = async(blocking) { - expect(4) - } - - val secondNonBlocking = async(dispatcher) { - expect(5) - } - - val secondBlocking = async(blocking) { - expect(2) // <- last submitted blocking is executed first - } - - val thirdBlocking = async(blocking) { - expect(6) // parallelism level is reached before this task - } - - listOf(firstBlocking, nonBlocking, secondBlocking, secondNonBlocking, thirdBlocking).joinAll() - finish(7) - } - - task.await() - } - @Test(timeout = 1_000) fun testYield() = runBlocking { corePoolSize = 1 diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherWorkSignallingStressTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherWorkSignallingStressTest.kt index 3280527f2a..3b3e085047 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherWorkSignallingStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/BlockingCoroutineDispatcherWorkSignallingStressTest.kt @@ -18,7 +18,7 @@ class BlockingCoroutineDispatcherWorkSignallingStressTest : SchedulerTestBase() val iterations = 1000 * stressTestMultiplier repeat(iterations) { // Create a dispatcher every iteration to increase probability of race - val dispatcher = ExperimentalCoroutineDispatcher(CORES_COUNT) + val dispatcher = SchedulerCoroutineDispatcher(CORES_COUNT) val blockingDispatcher = dispatcher.blocking(100) val blockingBarrier = CyclicBarrier(CORES_COUNT * 3 + 1) diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineDispatcherTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineDispatcherTest.kt index 3cd77da74a..c95415a8df 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineDispatcherTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineDispatcherTest.kt @@ -134,7 +134,7 @@ class CoroutineDispatcherTest : SchedulerTestBase() { val initialCount = Thread.getAllStackTraces().keys.asSequence() .count { it is CoroutineScheduler.Worker && it.name.contains("SomeTestName") } assertEquals(0, initialCount) - val dispatcher = ExperimentalCoroutineDispatcher(1, 1, IDLE_WORKER_KEEP_ALIVE_NS, "SomeTestName") + val dispatcher = SchedulerCoroutineDispatcher(1, 1, IDLE_WORKER_KEEP_ALIVE_NS, "SomeTestName") dispatcher.use { launch(dispatcher) { }.join() diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerCloseStressTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerCloseStressTest.kt index 473b429283..a50867d61c 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerCloseStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerCloseStressTest.kt @@ -22,15 +22,13 @@ class CoroutineSchedulerCloseStressTest(private val mode: Mode) : TestBase() { fun params(): Collection> = Mode.values().map { arrayOf(it) } } - private val N_REPEAT = 2 * stressTestMultiplier private val MAX_LEVEL = 5 private val N_COROS = (1 shl (MAX_LEVEL + 1)) - 1 private val N_THREADS = 4 private val rnd = Random() - private lateinit var closeableDispatcher: ExperimentalCoroutineDispatcher - private lateinit var dispatcher: ExecutorCoroutineDispatcher - private var closeIndex = -1 + private lateinit var closeableDispatcher: SchedulerCoroutineDispatcher + private lateinit var dispatcher: CoroutineDispatcher private val started = atomic(0) private val finished = atomic(0) @@ -44,20 +42,12 @@ class CoroutineSchedulerCloseStressTest(private val mode: Mode) : TestBase() { } } - @Test - fun testRacingClose() { - repeat(N_REPEAT) { - closeIndex = rnd.nextInt(N_COROS) - launchCoroutines() - } - } - private fun launchCoroutines() = runBlocking { - closeableDispatcher = ExperimentalCoroutineDispatcher(N_THREADS) + closeableDispatcher = SchedulerCoroutineDispatcher(N_THREADS) dispatcher = when (mode) { Mode.CPU -> closeableDispatcher - Mode.CPU_LIMITED -> closeableDispatcher.limited(N_THREADS) as ExecutorCoroutineDispatcher - Mode.BLOCKING -> closeableDispatcher.blocking(N_THREADS) as ExecutorCoroutineDispatcher + Mode.CPU_LIMITED -> closeableDispatcher.limitedParallelism(N_THREADS) + Mode.BLOCKING -> closeableDispatcher.blocking(N_THREADS) } started.value = 0 finished.value = 0 @@ -68,20 +58,16 @@ class CoroutineSchedulerCloseStressTest(private val mode: Mode) : TestBase() { assertEquals(N_COROS, finished.value) } + // Index and level are used only for debugging purpose private fun CoroutineScope.launchChild(index: Int, level: Int): Job = launch(start = CoroutineStart.ATOMIC) { started.incrementAndGet() try { - if (index == closeIndex) closeableDispatcher.close() if (level < MAX_LEVEL) { launchChild(2 * index + 1, level + 1) launchChild(2 * index + 2, level + 1) } else { if (rnd.nextBoolean()) { delay(1000) - val t = Thread.currentThread() - if (!t.name.contains("DefaultDispatcher-worker")) { - val a = 2 - } } else { yield() } diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerStressTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerStressTest.kt index cb49f054ce..7aefd4f75c 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerStressTest.kt @@ -15,7 +15,7 @@ import kotlin.coroutines.* import kotlin.test.* class CoroutineSchedulerStressTest : TestBase() { - private var dispatcher: ExperimentalCoroutineDispatcher = ExperimentalCoroutineDispatcher() + private var dispatcher: SchedulerCoroutineDispatcher = SchedulerCoroutineDispatcher() private val observedThreads = ConcurrentHashMap() private val tasksNum = 500_000 * stressMemoryMultiplier() diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerTest.kt index b0a5954b70..9d41c05d26 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/CoroutineSchedulerTest.kt @@ -106,22 +106,22 @@ class CoroutineSchedulerTest : TestBase() { @Test(expected = IllegalArgumentException::class) fun testNegativeCorePoolSize() { - ExperimentalCoroutineDispatcher(-1, 4) + SchedulerCoroutineDispatcher(-1, 4) } @Test(expected = IllegalArgumentException::class) fun testNegativeMaxPoolSize() { - ExperimentalCoroutineDispatcher(1, -4) + SchedulerCoroutineDispatcher(1, -4) } @Test(expected = IllegalArgumentException::class) fun testCorePoolSizeGreaterThanMaxPoolSize() { - ExperimentalCoroutineDispatcher(4, 1) + SchedulerCoroutineDispatcher(4, 1) } @Test fun testSelfClose() { - val dispatcher = ExperimentalCoroutineDispatcher(1, 1) + val dispatcher = SchedulerCoroutineDispatcher(1, 1) val latch = CountDownLatch(1) dispatcher.dispatch(EmptyCoroutineContext, Runnable { dispatcher.close(); latch.countDown() @@ -131,7 +131,7 @@ class CoroutineSchedulerTest : TestBase() { @Test fun testInterruptionCleanup() { - ExperimentalCoroutineDispatcher(1, 1).use { + SchedulerCoroutineDispatcher(1, 1).use { val executor = it.executor var latch = CountDownLatch(1) executor.execute { @@ -171,4 +171,4 @@ class CoroutineSchedulerTest : TestBase() { private class TaskContextImpl(override val taskMode: Int) : TaskContext { override fun afterTask() {} } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/DefaultDispatchersTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/DefaultDispatchersTest.kt new file mode 100644 index 0000000000..56c669547c --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/scheduling/DefaultDispatchersTest.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.scheduling + +import kotlinx.coroutines.* +import org.junit.Test +import java.util.concurrent.* +import java.util.concurrent.atomic.* +import kotlin.test.* + +class DefaultDispatchersTest : TestBase() { + + private /*const*/ val EXPECTED_PARALLELISM = 64 + + @Test(timeout = 10_000L) + fun testLimitedParallelismIsSeparatedFromDefaultIo() = runTest { + val barrier = CyclicBarrier(EXPECTED_PARALLELISM + 1) + val ioBlocker = CountDownLatch(1) + repeat(EXPECTED_PARALLELISM) { + launch(Dispatchers.IO) { + barrier.await() + ioBlocker.await() + } + } + + barrier.await() // Ensure all threads are occupied + barrier.reset() + val limited = Dispatchers.IO.limitedParallelism(EXPECTED_PARALLELISM) + repeat(EXPECTED_PARALLELISM) { + launch(limited) { + barrier.await() + } + } + barrier.await() + ioBlocker.countDown() + } + + @Test(timeout = 10_000L) + fun testDefaultDispatcherIsSeparateFromIO() = runTest { + val ioBarrier = CyclicBarrier(EXPECTED_PARALLELISM + 1) + val ioBlocker = CountDownLatch(1) + repeat(EXPECTED_PARALLELISM) { + launch(Dispatchers.IO) { + ioBarrier.await() + ioBlocker.await() + } + } + + ioBarrier.await() // Ensure all threads are occupied + val parallelism = Runtime.getRuntime().availableProcessors() + val defaultBarrier = CyclicBarrier(parallelism + 1) + repeat(parallelism) { + launch(Dispatchers.Default) { + defaultBarrier.await() + } + } + defaultBarrier.await() + ioBlocker.countDown() + } + + @Test + fun testHardCapOnParallelism() = runTest { + val iterations = 100_000 * stressTestMultiplierSqrt + val concurrency = AtomicInteger() + repeat(iterations) { + launch(Dispatchers.IO) { + val c = concurrency.incrementAndGet() + assertTrue("Got: $c") { c <= EXPECTED_PARALLELISM } + concurrency.decrementAndGet() + } + } + } +} diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/LimitingDispatcherTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/LimitingDispatcherTest.kt index b4924277b5..e5705803c0 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/LimitingDispatcherTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/LimitingDispatcherTest.kt @@ -10,11 +10,6 @@ import java.util.concurrent.* class LimitingDispatcherTest : SchedulerTestBase() { - @Test(expected = IllegalArgumentException::class) - fun testTooLargeView() { - view(corePoolSize + 1) - } - @Test(expected = IllegalArgumentException::class) fun testNegativeView() { view(-1) diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt index dd969bdd37..fc4436f418 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/SchedulerTestBase.kt @@ -6,7 +6,6 @@ package kotlinx.coroutines.scheduling -import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.internal.* import org.junit.* @@ -61,11 +60,11 @@ abstract class SchedulerTestBase : TestBase() { protected var maxPoolSize = 1024 protected var idleWorkerKeepAliveNs = IDLE_WORKER_KEEP_ALIVE_NS - private var _dispatcher: ExperimentalCoroutineDispatcher? = null + private var _dispatcher: SchedulerCoroutineDispatcher? = null protected val dispatcher: CoroutineDispatcher get() { if (_dispatcher == null) { - _dispatcher = ExperimentalCoroutineDispatcher( + _dispatcher = SchedulerCoroutineDispatcher( corePoolSize, maxPoolSize, idleWorkerKeepAliveNs @@ -86,7 +85,7 @@ abstract class SchedulerTestBase : TestBase() { protected fun view(parallelism: Int): CoroutineDispatcher { val intitialize = dispatcher - return _dispatcher!!.limited(parallelism) + return _dispatcher!!.limitedParallelism(parallelism) } @After @@ -98,3 +97,17 @@ abstract class SchedulerTestBase : TestBase() { } } } + +internal fun SchedulerCoroutineDispatcher.blocking(parallelism: Int = 16): CoroutineDispatcher { + return object : CoroutineDispatcher() { + + @InternalCoroutinesApi + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + this@blocking.dispatchWithContext(block, BlockingContext, true) + } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + this@blocking.dispatchWithContext(block, BlockingContext, false) + } + }.limitedParallelism(parallelism) +} diff --git a/kotlinx-coroutines-core/jvm/test/scheduling/SharingWorkerClassTest.kt b/kotlinx-coroutines-core/jvm/test/scheduling/SharingWorkerClassTest.kt index 6a66da9f5c..743b4a617f 100644 --- a/kotlinx-coroutines-core/jvm/test/scheduling/SharingWorkerClassTest.kt +++ b/kotlinx-coroutines-core/jvm/test/scheduling/SharingWorkerClassTest.kt @@ -13,8 +13,8 @@ class SharingWorkerClassTest : SchedulerTestBase() { @Test fun testSharedThread() = runTest { - val dispatcher = ExperimentalCoroutineDispatcher(1, schedulerName = "first") - val dispatcher2 = ExperimentalCoroutineDispatcher(1, schedulerName = "second") + val dispatcher = SchedulerCoroutineDispatcher(1, schedulerName = "first") + val dispatcher2 = SchedulerCoroutineDispatcher(1, schedulerName = "second") try { withContext(dispatcher) { @@ -39,7 +39,7 @@ class SharingWorkerClassTest : SchedulerTestBase() { val cores = Runtime.getRuntime().availableProcessors() repeat(cores + 1) { CoroutineScope(Dispatchers.Default).launch { - ExperimentalCoroutineDispatcher(1).close() + SchedulerCoroutineDispatcher(1).close() }.join() } } From 5e870c11311b3bfd58f0557c651f1d877e9e5827 Mon Sep 17 00:00:00 2001 From: Louis Wasserman Date: Tue, 12 Oct 2021 04:42:37 -0700 Subject: [PATCH 162/328] Clarify behavior of produceIn. (#2976) The previous wording said "thus resulting channel should be properly closed or cancelled," but it wasn't really clear what that meant -- whether the caller needed to close it or cancel it, or whether it would be properly closed by the implementation. --- kotlinx-coroutines-core/common/src/flow/Channels.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 382953efcb..9c6051d36d 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -217,7 +217,11 @@ public fun Flow.broadcastIn( * Creates a [produce] coroutine that collects the given flow. * * This transformation is **stateful**, it launches a [produce] coroutine - * that collects the given flow and thus resulting channel should be properly closed or cancelled. + * that collects the given flow, and has the same behavior: + * + * * if collecting the flow throws, the channel will be closed with that exception + * * if the [ReceiveChannel] is cancelled, the collection of the flow will be cancelled + * * if collecting the flow completes normally, the [ReceiveChannel] will be closed normally * * A channel with [default][Channel.Factory.BUFFERED] buffer size is created. * Use [buffer] operator on the flow before calling `produceIn` to specify a value other than From 0b65246a32a81da724fc920d9f62f1670dff7d35 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 12 Oct 2021 19:05:44 +0300 Subject: [PATCH 163/328] Eagerly load CoroutineExceptionHandler and load corresponding service (#2957) * Eagerly load CoroutineExceptionHandler and load the corresponding service Partially addresses #2552 --- .../common/src/CoroutineExceptionHandler.kt | 8 +++++++- kotlinx-coroutines-core/common/src/Job.kt | 8 +++++++- .../js/src/CoroutineExceptionHandlerImpl.kt | 4 ++++ .../jvm/src/CoroutineExceptionHandlerImpl.kt | 6 ++++++ .../native/src/CoroutineExceptionHandlerImpl.kt | 4 ++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt b/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt index 49923a92e7..819f205b17 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt @@ -1,13 +1,19 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ - package kotlinx.coroutines import kotlin.coroutines.* +import kotlin.jvm.* internal expect fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) +/** + * JVM kludge: trigger loading of all the classes and service loading + * **before** any exception occur because it may be OOM, SOE or VerifyError + */ +internal expect fun initializeDefaultExceptionHandlers() + /** * Helper function for coroutine builder implementations to handle uncaught and unexpected exceptions in coroutines, * that could not be otherwise handled in a normal way through structured concurrency, saving them to a future, and diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index 31d90eeef0..085ef7e8af 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -113,7 +113,13 @@ public interface Job : CoroutineContext.Element { /** * Key for [Job] instance in the coroutine context. */ - public companion object Key : CoroutineContext.Key + public companion object Key : CoroutineContext.Key { + init { + // `Job` will necessarily be accessed early, so this is as good a place as any for the + // initialization logic that we want to happen as soon as possible + initializeDefaultExceptionHandlers() + } + } // ------------ state query ------------ diff --git a/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt index 54a65e10a6..a4d671dc65 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt @@ -6,6 +6,10 @@ package kotlinx.coroutines import kotlin.coroutines.* +internal actual fun initializeDefaultExceptionHandlers() { + // Do nothing +} + internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // log exception console.error(exception) diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt index 6d06969293..4c8c81b8db 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt @@ -22,6 +22,12 @@ private val handlers: List = ServiceLoader.load( CoroutineExceptionHandler::class.java.classLoader ).iterator().asSequence().toList() +internal actual fun initializeDefaultExceptionHandlers() { + // Load CEH and handlers + CoroutineExceptionHandler +} + + internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // use additional extension handlers for (handler in handlers) { diff --git a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt index b0aa86339a..7fedbd9fac 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt @@ -6,6 +6,10 @@ package kotlinx.coroutines import kotlin.coroutines.* +internal actual fun initializeDefaultExceptionHandlers() { + // Do nothing +} + internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // log exception exception.printStackTrace() From 09d1975edd97f3c3a67faa59bd7d454aa5b81735 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 12 Oct 2021 20:01:10 +0300 Subject: [PATCH 164/328] Update Kotlin to 1.6.0-RC (#2980) --- gradle.properties | 2 +- .../common/src/flow/operators/Delay.kt | 1 + .../common/test/DelayDurationTest.kt | 2 ++ .../SharingStartedWhileSubscribedTest.kt | 7 +++++-- .../jvm/resources/DebugProbesKt.bin | Bin 1714 -> 1719 bytes .../jvm/test/examples/example-delay-01.kt | 1 + .../jvm/test/examples/example-delay-02.kt | 1 + .../jvm/test/examples/example-delay-03.kt | 1 + .../examples/example-delay-duration-01.kt | 1 + .../examples/example-delay-duration-02.kt | 1 + .../examples/example-delay-duration-03.kt | 1 + .../jvm/test/flow/SharedFlowStressTest.kt | 4 ++-- ui/kotlinx-coroutines-javafx/build.gradle.kts | 19 ++++++++++-------- 13 files changed, 28 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index 46eef4d76e..f0d49b5ef8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ # Kotlin version=1.5.2-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.5.30 +kotlin_version=1.6.0-RC # Dependencies junit_version=4.12 diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index fed5962bd5..e893f44ea5 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -23,6 +23,7 @@ import kotlin.time.* ----- INCLUDE .* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* +import kotlin.time.Duration.Companion.milliseconds fun main() = runBlocking { ----- SUFFIX .* diff --git a/kotlinx-coroutines-core/common/test/DelayDurationTest.kt b/kotlinx-coroutines-core/common/test/DelayDurationTest.kt index 3dd55bde84..1c6c189a44 100644 --- a/kotlinx-coroutines-core/common/test/DelayDurationTest.kt +++ b/kotlinx-coroutines-core/common/test/DelayDurationTest.kt @@ -10,6 +10,8 @@ package kotlinx.coroutines import kotlin.test.* import kotlin.time.* +import kotlin.time.Duration.Companion.seconds +import kotlin.time.Duration.Companion.nanoseconds @ExperimentalTime class DelayDurationTest : TestBase() { diff --git a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt index b3a3400389..3b961c5783 100644 --- a/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/sharing/SharingStartedWhileSubscribedTest.kt @@ -7,6 +7,8 @@ package kotlinx.coroutines.flow import kotlinx.coroutines.* import kotlin.test.* import kotlin.time.* +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds class SharingStartedWhileSubscribedTest : TestBase() { @Test // make sure equals works properly, or otherwise other tests don't make sense @@ -30,14 +32,15 @@ class SharingStartedWhileSubscribedTest : TestBase() { @Test fun testDurationParams() { assertEquals(SharingStarted.WhileSubscribed(0), SharingStarted.WhileSubscribed(Duration.ZERO)) - assertEquals(SharingStarted.WhileSubscribed(10), SharingStarted.WhileSubscribed(Duration.milliseconds(10))) + assertEquals(SharingStarted.WhileSubscribed(10), SharingStarted.WhileSubscribed(10.milliseconds)) assertEquals(SharingStarted.WhileSubscribed(1000), SharingStarted.WhileSubscribed(1.seconds)) assertEquals(SharingStarted.WhileSubscribed(Long.MAX_VALUE), SharingStarted.WhileSubscribed(Duration.INFINITE)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 0), SharingStarted.WhileSubscribed(replayExpiration = Duration.ZERO)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 3), SharingStarted.WhileSubscribed( replayExpiration = Duration.milliseconds(3) )) - assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 7000), SharingStarted.WhileSubscribed(replayExpiration = 7.seconds)) + assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 7000), + SharingStarted.WhileSubscribed(replayExpiration = 7.seconds)) assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = Long.MAX_VALUE), SharingStarted.WhileSubscribed(replayExpiration = Duration.INFINITE)) } diff --git a/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin b/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin index 397aaf67ac52cdf6b99d39da8ddf1065bc098293..6c1500ae6e012b9ca4643da3671d498b39907235 100644 GIT binary patch delta 324 zcma)$OHKk&5Jk`9r5ou0aVQ`#Ad!y>3dsL6BfK^AGHL;g9rs2+O-vZToJA2!Vn7%% zxViTxRj2AB^_>cK`}GEBGhGE=*7vOzKDYMWm~P~};=HHb$EX7Onvc00Sj9numAu6 delta 282 zcmdnayNQ?U)W2Q(7#J8#80fY#tz+ zfq{>KlR*kdTLLi?13QBikOryZ0Mgcz7qE%|bqlabOg_uXZi6s^2gL+ABokyAtbsb& z8KFi Date: Wed, 13 Oct 2021 23:24:56 +0300 Subject: [PATCH 165/328] Handle exceptions on K/N by invoking 'processUnhandledException' (#2981) --- .../native/src/CoroutineExceptionHandlerImpl.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt index 7fedbd9fac..d97743b4bf 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt @@ -5,12 +5,14 @@ package kotlinx.coroutines import kotlin.coroutines.* +import kotlin.native.* internal actual fun initializeDefaultExceptionHandlers() { // Do nothing } +@OptIn(ExperimentalStdlibApi::class) internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // log exception - exception.printStackTrace() + processUnhandledException(exception) } From dfc4821bbe010e6cf8b858a31904d4ba74551cb0 Mon Sep 17 00:00:00 2001 From: Morten Krogh-Jespersen Date: Tue, 19 Oct 2021 11:20:02 +0300 Subject: [PATCH 166/328] R8 specific rules to allow for service loader optimizations (#2880) Fixes the R8 ServiceLoader optimization that broke in the R8 bundled in the new AGP. For details, see https://issuetracker.google.com/issues/196302685 --- .../com.android.tools/proguard/coroutines.pro | 24 +++++++++++++++++++ .../com.android.tools/r8/coroutines.pro | 20 ++++++++++++++++ .../META-INF/proguard/coroutines.pro | 4 ++++ 3 files changed, 48 insertions(+) create mode 100644 kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/proguard/coroutines.pro create mode 100644 kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/r8/coroutines.pro diff --git a/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/proguard/coroutines.pro b/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/proguard/coroutines.pro new file mode 100644 index 0000000000..58509bdf0f --- /dev/null +++ b/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/proguard/coroutines.pro @@ -0,0 +1,24 @@ +# When editing this file, update the following files as well: +# - META-INF/proguard/coroutines.pro +# - META-INF/com.android.tools/r8/coroutines.pro + +# ServiceLoader support +-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} +-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} + +# Most of volatile fields are updated with AFU and should not be mangled +-keepclassmembers class kotlinx.coroutines.** { + volatile ; +} + +# Same story for the standard library's SafeContinuation that also uses AtomicReferenceFieldUpdater +-keepclassmembers class kotlin.coroutines.SafeContinuation { + volatile ; +} + +# These classes are only required by kotlinx.coroutines.debug.AgentPremain, which is only loaded when +# kotlinx-coroutines-core is used as a Java agent, so these are not needed in contexts where ProGuard is used. +-dontwarn java.lang.instrument.ClassFileTransformer +-dontwarn sun.misc.SignalHandler +-dontwarn java.lang.instrument.Instrumentation +-dontwarn sun.misc.Signal diff --git a/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/r8/coroutines.pro b/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/r8/coroutines.pro new file mode 100644 index 0000000000..8a89318229 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/resources/META-INF/com.android.tools/r8/coroutines.pro @@ -0,0 +1,20 @@ +# When editing this file, update the following files as well: +# - META-INF/proguard/coroutines.pro +# - META-INF/com.android.tools/proguard/coroutines.pro + +# Most of volatile fields are updated with AFU and should not be mangled +-keepclassmembers class kotlinx.coroutines.** { + volatile ; +} + +# Same story for the standard library's SafeContinuation that also uses AtomicReferenceFieldUpdater +-keepclassmembers class kotlin.coroutines.SafeContinuation { + volatile ; +} + +# These classes are only required by kotlinx.coroutines.debug.AgentPremain, which is only loaded when +# kotlinx-coroutines-core is used as a Java agent, so these are not needed in contexts where ProGuard is used. +-dontwarn java.lang.instrument.ClassFileTransformer +-dontwarn sun.misc.SignalHandler +-dontwarn java.lang.instrument.Instrumentation +-dontwarn sun.misc.Signal diff --git a/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro b/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro index 1a9ae1c7ff..628a113ecf 100644 --- a/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro +++ b/kotlinx-coroutines-core/jvm/resources/META-INF/proguard/coroutines.pro @@ -1,3 +1,7 @@ +# When editing this file, update the following files as well: +# - META-INF/com.android.tools/proguard/coroutines.pro +# - META-INF/com.android.tools/r8/coroutines.pro + # ServiceLoader support -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} From 7755edb43da2fbc9181e1ff4316ad34ffb1b5d7e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 11:40:08 +0300 Subject: [PATCH 167/328] Mutex.onLock deprecation (#2850) * Actually test 'onLock' and the corresponding concurrency and cancellation of Reactive's onSend * Update benchmarks * Non-linearizable implementation of PublisherCoroutine.onSend that isn't using Mutex.onLock * Deprecate Mutex.onLock Fixes #2794 Co-authored-by: Dmitry Khalanskiy --- benchmarks/build.gradle.kts | 13 ++++--- kotlinx-coroutines-core/README.md | 3 -- kotlinx-coroutines-core/common/README.md | 2 - .../common/src/channels/Channel.kt | 1 - .../common/src/selects/Select.kt | 1 - .../common/src/sync/Mutex.kt | 9 ++--- ...Test.kt => RendezvousChannelStressTest.kt} | 2 +- .../src/Publish.kt | 14 ++++++- .../test/PublishTest.kt | 38 ++++++++++++++++++- .../test/PublisherMultiTest.kt | 25 +++++++++++- .../src/RxObservable.kt | 15 +++++++- .../test/ObservableCompletionStressTest.kt | 4 +- .../test/ObservableMultiTest.kt | 26 ++++++++++++- .../src/RxObservable.kt | 15 +++++++- .../test/ObservableMultiTest.kt | 26 ++++++++++++- 15 files changed, 166 insertions(+), 28 deletions(-) rename kotlinx-coroutines-core/jvm/test/channels/{RandevouzChannelStressTest.kt => RendezvousChannelStressTest.kt} (92%) diff --git a/benchmarks/build.gradle.kts b/benchmarks/build.gradle.kts index ce0bff1cdf..27ab59b5f5 100644 --- a/benchmarks/build.gradle.kts +++ b/benchmarks/build.gradle.kts @@ -54,13 +54,14 @@ tasks.named("jmhJar") { } dependencies { - compile("org.openjdk.jmh:jmh-core:1.26") - compile("io.projectreactor:reactor-core:${version("reactor")}") - compile("io.reactivex.rxjava2:rxjava:2.1.9") - compile("com.github.akarnokd:rxjava2-extensions:0.20.8") + implementation("org.openjdk.jmh:jmh-core:1.26") + implementation("io.projectreactor:reactor-core:${version("reactor")}") + implementation("io.reactivex.rxjava2:rxjava:2.1.9") + implementation("com.github.akarnokd:rxjava2-extensions:0.20.8") - compile("com.typesafe.akka:akka-actor_2.12:2.5.0") - compile(project(":kotlinx-coroutines-core")) + implementation("com.typesafe.akka:akka-actor_2.12:2.5.0") + implementation(project(":kotlinx-coroutines-core")) + implementation(project(":kotlinx-coroutines-reactive")) // add jmh dependency on main "jmhImplementation"(sourceSets.main.get().runtimeClasspath) diff --git a/kotlinx-coroutines-core/README.md b/kotlinx-coroutines-core/README.md index c21e5048f6..c06cd358ad 100644 --- a/kotlinx-coroutines-core/README.md +++ b/kotlinx-coroutines-core/README.md @@ -57,7 +57,6 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio | [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] -| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] | none | [delay][kotlinx.coroutines.delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none # Package kotlinx.coroutines @@ -121,8 +120,6 @@ Obsolete and deprecated module to test coroutines. Replaced with `kotlinx-corout [kotlinx.coroutines.sync.Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html [kotlinx.coroutines.sync.Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[kotlinx.coroutines.sync.Mutex.onLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/on-lock.html -[kotlinx.coroutines.sync.Mutex.tryLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/try-lock.html diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index fcfe334c62..b00921bbcd 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -60,7 +60,6 @@ helper function. [NonCancellable] job object is provided to suppress cancellatio | [SendChannel][kotlinx.coroutines.channels.SendChannel] | [send][kotlinx.coroutines.channels.SendChannel.send] | [onSend][kotlinx.coroutines.channels.SendChannel.onSend] | [trySend][kotlinx.coroutines.channels.SendChannel.trySend] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receive][kotlinx.coroutines.channels.ReceiveChannel.receive] | [onReceive][kotlinx.coroutines.channels.ReceiveChannel.onReceive] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] | [ReceiveChannel][kotlinx.coroutines.channels.ReceiveChannel] | [receiveCatching][kotlinx.coroutines.channels.ReceiveChannel.receiveCatching] | [onReceiveCatching][kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching] | [tryReceive][kotlinx.coroutines.channels.ReceiveChannel.tryReceive] -| [Mutex][kotlinx.coroutines.sync.Mutex] | [lock][kotlinx.coroutines.sync.Mutex.lock] | [onLock][kotlinx.coroutines.sync.Mutex.onLock] | [tryLock][kotlinx.coroutines.sync.Mutex.tryLock] | none | [delay] | [onTimeout][kotlinx.coroutines.selects.SelectBuilder.onTimeout] | none This module provides debugging facilities for coroutines (run JVM with `-ea` or `-Dkotlinx.coroutines.debug` options) @@ -131,7 +130,6 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.sync.Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html [kotlinx.coroutines.sync.Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[kotlinx.coroutines.sync.Mutex.onLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/on-lock.html [kotlinx.coroutines.sync.Mutex.tryLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/try-lock.html diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index b15c4262ef..b24658a4c4 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -64,7 +64,6 @@ public interface SendChannel { */ public val onSend: SelectClause2> - /** * Immediately adds the specified [element] to this channel, if this doesn't violate its capacity restrictions, * and returns the successful result. Otherwise, returns failed or closed result. diff --git a/kotlinx-coroutines-core/common/src/selects/Select.kt b/kotlinx-coroutines-core/common/src/selects/Select.kt index a7172707e2..a313de3d5d 100644 --- a/kotlinx-coroutines-core/common/src/selects/Select.kt +++ b/kotlinx-coroutines-core/common/src/selects/Select.kt @@ -186,7 +186,6 @@ public interface SelectInstance { * | [SendChannel] | [send][SendChannel.send] | [onSend][SendChannel.onSend] * | [ReceiveChannel] | [receive][ReceiveChannel.receive] | [onReceive][ReceiveChannel.onReceive] * | [ReceiveChannel] | [receiveCatching][ReceiveChannel.receiveCatching] | [onReceiveCatching][ReceiveChannel.onReceiveCatching] - * | [Mutex] | [lock][Mutex.lock] | [onLock][Mutex.onLock] * | none | [delay] | [onTimeout][SelectBuilder.onTimeout] * * This suspending function is cancellable. If the [Job] of the current coroutine is cancelled or completed while this diff --git a/kotlinx-coroutines-core/common/src/sync/Mutex.kt b/kotlinx-coroutines-core/common/src/sync/Mutex.kt index 19584e0981..ebebcc8d1c 100644 --- a/kotlinx-coroutines-core/common/src/sync/Mutex.kt +++ b/kotlinx-coroutines-core/common/src/sync/Mutex.kt @@ -52,8 +52,7 @@ public interface Mutex { * Note that this function does not check for cancellation when it is not suspended. * Use [yield] or [CoroutineScope.isActive] to periodically check for cancellation in tight loops if needed. * - * This function can be used in [select] invocation with [onLock] clause. - * Use [tryLock] to try acquire lock without waiting. + * Use [tryLock] to try acquiring a lock without waiting. * * This function is fair; suspended callers are resumed in first-in-first-out order. * @@ -63,10 +62,10 @@ public interface Mutex { public suspend fun lock(owner: Any? = null) /** - * Clause for [select] expression of [lock] suspending function that selects when the mutex is locked. - * Additional parameter for the clause in the `owner` (see [lock]) and when the clause is selected - * the reference to this mutex is passed into the corresponding block. + * Deprecated for removal without built-in replacement. */ + @Deprecated(level = DeprecationLevel.WARNING, message = "Mutex.onLock deprecated without replacement. " + + "For additional details please refer to #2794") public val onLock: SelectClause2 /** diff --git a/kotlinx-coroutines-core/jvm/test/channels/RandevouzChannelStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt similarity index 92% rename from kotlinx-coroutines-core/jvm/test/channels/RandevouzChannelStressTest.kt rename to kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt index a054175412..eb086cd204 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/RandevouzChannelStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt @@ -7,7 +7,7 @@ package kotlinx.coroutines.channels import kotlinx.coroutines.* import org.junit.* -class RandevouzChannelStressTest : TestBase() { +class RendezvousChannelStressTest : TestBase() { @Test fun testStress() = runTest { diff --git a/reactive/kotlinx-coroutines-reactive/src/Publish.kt b/reactive/kotlinx-coroutines-reactive/src/Publish.kt index 4928a7439e..1b8683ce64 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Publish.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Publish.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.reactive import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +import kotlinx.coroutines.intrinsics.* import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import org.reactivestreams.* @@ -104,10 +105,21 @@ public class PublisherCoroutine( // registerSelectSend @Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE") override fun registerSelectClause2(select: SelectInstance, element: T, block: suspend (SendChannel) -> R) { - mutex.onLock.registerSelectClause2(select, null) { + val clause = suspend { doLockedNext(element)?.let { throw it } block(this) } + + launch(start = CoroutineStart.UNDISPATCHED) { + mutex.lock() + // Already selected -- bail out + if (!select.trySelect()) { + mutex.unlock() + return@launch + } + + clause.startCoroutineCancellable(select.completion) + } } /* diff --git a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt index 095b724d40..267953f5a5 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt @@ -5,9 +5,13 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.sync.* import org.junit.Test import org.reactivestreams.* +import java.util.concurrent.* import kotlin.test.* class PublishTest : TestBase() { @@ -284,4 +288,36 @@ class PublishTest : TestBase() { } assertEquals("OK", publisher.awaitFirstOrNull()) } -} \ No newline at end of file + + @Test + fun testOnSendCancelled() = runTest { + val latch = CountDownLatch(1) + val published = publish(Dispatchers.Default) { + expect(2) + // Collector is ready + send(1) + try { + send(2) + expectUnreached() + } catch (e: CancellationException) { + // publisher cancellation is async + latch.countDown() + throw e + } + } + + expect(1) + val collectorLatch = Mutex(true) + val job = launch { + published.asFlow().buffer(0).collect { + collectorLatch.unlock() + hang { expect(4) } + } + } + collectorLatch.lock() + expect(3) + job.cancelAndJoin() + latch.await() + finish(5) + } +} diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherMultiTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherMultiTest.kt index e3b1d3b384..4a552b5f8d 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublisherMultiTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublisherMultiTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.reactive import kotlinx.coroutines.* +import kotlinx.coroutines.selects.* import org.junit.Test import kotlin.test.* @@ -16,7 +17,7 @@ class PublisherMultiTest : TestBase() { // concurrent emitters (many coroutines) val jobs = List(n) { // launch - launch { + launch(Dispatchers.Default) { send(it) } } @@ -28,4 +29,26 @@ class PublisherMultiTest : TestBase() { } assertEquals(n, resultSet.size) } + + @Test + fun testConcurrentStressOnSend() = runBlocking { + val n = 10_000 * stressTestMultiplier + val observable = publish { + // concurrent emitters (many coroutines) + val jobs = List(n) { + // launch + launch(Dispatchers.Default) { + select { + onSend(it) {} + } + } + } + jobs.forEach { it.join() } + } + val resultSet = mutableSetOf() + observable.collect { + assertTrue(resultSet.add(it)) + } + assertEquals(n, resultSet.size) + } } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt index 5f409815af..90e770bb4f 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxObservable.kt @@ -10,6 +10,7 @@ import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import kotlinx.coroutines.internal.* +import kotlinx.coroutines.intrinsics.* import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import kotlin.coroutines.* @@ -95,10 +96,22 @@ private class RxObservableCoroutine( element: T, block: suspend (SendChannel) -> R ) { - mutex.onLock.registerSelectClause2(select, null) { + val clause = suspend { doLockedNext(element)?.let { throw it } block(this) } + + // This is the default replacement proposed in onLock replacement + launch(start = CoroutineStart.UNDISPATCHED) { + mutex.lock() + // Already selected -- bail out + if (!select.trySelect()) { + mutex.unlock() + return@launch + } + + clause.startCoroutineCancellable(select.completion) + } } // assert: mutex.isLocked() diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableCompletionStressTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableCompletionStressTest.kt index 30266e3e50..7e1d335028 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableCompletionStressTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableCompletionStressTest.kt @@ -12,7 +12,7 @@ import kotlin.coroutines.* class ObservableCompletionStressTest : TestBase() { private val N_REPEATS = 10_000 * stressTestMultiplier - private fun CoroutineScope.range(context: CoroutineContext, start: Int, count: Int) = rxObservable(context) { + private fun range(context: CoroutineContext, start: Int, count: Int) = rxObservable(context) { for (x in start until start + count) send(x) } @@ -33,4 +33,4 @@ class ObservableCompletionStressTest : TestBase() { } } } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx2/test/ObservableMultiTest.kt b/reactive/kotlinx-coroutines-rx2/test/ObservableMultiTest.kt index 074fcf4900..7023211450 100644 --- a/reactive/kotlinx-coroutines-rx2/test/ObservableMultiTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/ObservableMultiTest.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.rx2 import io.reactivex.* import kotlinx.coroutines.* +import kotlinx.coroutines.selects.* import org.junit.Test import java.io.* import kotlin.test.* @@ -47,6 +48,29 @@ class ObservableMultiTest : TestBase() { } } + @Test + fun testConcurrentStressOnSend() { + val n = 10_000 * stressTestMultiplier + val observable = rxObservable { + newCoroutineContext(coroutineContext) + // concurrent emitters (many coroutines) + val jobs = List(n) { + // launch + launch(Dispatchers.Default) { + val i = it + select { + onSend(i) {} + } + } + } + jobs.forEach { it.join() } + } + checkSingleValue(observable.toList()) { list -> + assertEquals(n, list.size) + assertEquals((0 until n).toList(), list.sorted()) + } + } + @Test fun testIteratorResendUnconfined() { val n = 10_000 * stressTestMultiplier @@ -88,4 +112,4 @@ class ObservableMultiTest : TestBase() { assertEquals("OK", it) } } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt index 57007bbdd4..1c5f7c0a63 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxObservable.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.selects.* import kotlinx.coroutines.sync.* import kotlin.coroutines.* import kotlinx.coroutines.internal.* +import kotlinx.coroutines.intrinsics.* /** * Creates cold [observable][Observable] that will run a given [block] in a coroutine. @@ -95,10 +96,22 @@ private class RxObservableCoroutine( element: T, block: suspend (SendChannel) -> R ) { - mutex.onLock.registerSelectClause2(select, null) { + val clause = suspend { doLockedNext(element)?.let { throw it } block(this) } + + // This is the default replacement proposed in onLock replacement + launch(start = CoroutineStart.UNDISPATCHED) { + mutex.lock() + // Already selected -- bail out + if (!select.trySelect()) { + mutex.unlock() + return@launch + } + + clause.startCoroutineCancellable(select.completion) + } } // assert: mutex.isLocked() diff --git a/reactive/kotlinx-coroutines-rx3/test/ObservableMultiTest.kt b/reactive/kotlinx-coroutines-rx3/test/ObservableMultiTest.kt index b4adf7af27..d7c799db1c 100644 --- a/reactive/kotlinx-coroutines-rx3/test/ObservableMultiTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/ObservableMultiTest.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.rx3 import io.reactivex.rxjava3.core.* import kotlinx.coroutines.* +import kotlinx.coroutines.selects.* import org.junit.Test import java.io.* import kotlin.test.* @@ -34,7 +35,7 @@ class ObservableMultiTest : TestBase() { // concurrent emitters (many coroutines) val jobs = List(n) { // launch - launch { + launch(Dispatchers.Default) { val i = it send(i) } @@ -47,6 +48,29 @@ class ObservableMultiTest : TestBase() { } } + @Test + fun testConcurrentStressOnSend() { + val n = 10_000 * stressTestMultiplier + val observable = rxObservable { + newCoroutineContext(coroutineContext) + // concurrent emitters (many coroutines) + val jobs = List(n) { + // launch + launch(Dispatchers.Default) { + val i = it + select { + onSend(i) {} + } + } + } + jobs.forEach { it.join() } + } + checkSingleValue(observable.toList()) { list -> + assertEquals(n, list.size) + assertEquals((0 until n).toList(), list.sorted()) + } + } + @Test fun testIteratorResendUnconfined() { val n = 10_000 * stressTestMultiplier From e60685ffce849a1870c2d299f3985be2e23c6541 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 12:04:41 +0300 Subject: [PATCH 168/328] Introduce SharedFlow collect overload and override that return Nothing (#2803) * Introduce SharedFlow collect overload and override that return Nothing * Override will ensure the proper implementation of the interface * collect extension is added as the very basic lint helper Fixes #2789 Fixes #2502 Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- .../api/kotlinx-coroutines-core.api | 2 ++ .../common/src/flow/SharedFlow.kt | 15 ++++++++++++++- .../common/src/flow/StateFlow.kt | 2 +- .../common/src/flow/terminal/Collect.kt | 13 +++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 495d11a804..546bfe3507 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -902,6 +902,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun channelFlow (Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; public static final fun collect (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun collect (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun collect (Lkotlinx/coroutines/flow/SharedFlow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun collectIndexed (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun collectLatest (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; @@ -1063,6 +1064,7 @@ public abstract interface class kotlinx/coroutines/flow/MutableStateFlow : kotli } public abstract interface class kotlinx/coroutines/flow/SharedFlow : kotlinx/coroutines/flow/Flow { + public abstract fun collect (Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun getReplayCache ()Ljava/util/List; } diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index 3424b38027..41d05a6868 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -129,6 +129,19 @@ public interface SharedFlow : Flow { * A snapshot of the replay cache. */ public val replayCache: List + + /** + * Accepts the given [collector] and [emits][FlowCollector.emit] values into it. + * This method should never be used directly. To emit values from a shared flow into a specific collector, either `collector.emitAll(flow)` or `collect { ... }` extension + * should be used. + * + * **A shared flow never completes**. A call to [Flow.collect] or any other terminal operator + * on a shared flow never completes normally. + * + * @see [Flow.collect] + */ + @InternalCoroutinesApi + override suspend fun collect(collector: FlowCollector): Nothing } /** @@ -344,7 +357,7 @@ internal open class SharedFlowImpl( get() = buffer!!.getBufferAt(replayIndex + replaySize - 1) as T @Suppress("UNCHECKED_CAST") - override suspend fun collect(collector: FlowCollector) { + override suspend fun collect(collector: FlowCollector): Nothing { val slot = allocateSlot() try { if (collector is SubscribedFlowCollector) collector.onSubscription() diff --git a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt index 53770dc91e..be6cbd6bbd 100644 --- a/kotlinx-coroutines-core/common/src/flow/StateFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/StateFlow.kt @@ -380,7 +380,7 @@ private class StateFlowImpl( throw UnsupportedOperationException("MutableStateFlow.resetReplayCache is not supported") } - override suspend fun collect(collector: FlowCollector) { + override suspend fun collect(collector: FlowCollector): Nothing { val slot = allocateSlot() try { if (collector is SubscribedFlowCollector) collector.onSubscription() diff --git a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt index 771f8332c3..91d410b9a2 100644 --- a/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt +++ b/kotlinx-coroutines-core/common/src/flow/terminal/Collect.kt @@ -73,6 +73,19 @@ public suspend inline fun Flow.collect(crossinline action: suspend (value override suspend fun emit(value: T) = action(value) }) +/** + * Terminal flow operator that collects the given [SharedFlow] with the provided [action]. + * If any exception occurs during `collect` or in the provided flow, this exception is rethrown from this method. + * + * This is a counterpart of a regular [Flow.collect] extension, only different in the return type + * so that any code below `collect` produces a compilation warning. + */ +public suspend inline fun SharedFlow.collect(crossinline action: suspend (value: T) -> Unit): Nothing { + collect(object : FlowCollector { + override suspend fun emit(value: T) = action(value) + }) +} + /** * Terminal flow operator that collects the given flow with a provided [action] that takes the index of an element (zero-based) and the element. * If any exception occurs during collect or in the provided flow, this exception is rethrown from this method. From e6592c4e3a69a2cbf65795c533ec77cde3814e2f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 12:06:22 +0300 Subject: [PATCH 169/328] Introduce coroutines platform to have all the dependencies aligned (#2952) * Introduce coroutines platform to have all the dependencies aligned Fixes #2865 --- build.gradle | 14 +++++--------- buildSrc/src/main/kotlin/Projects.kt | 14 +++++++++++++- .../main/kotlin/bom-conventions.gradle.kts | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 buildSrc/src/main/kotlin/bom-conventions.gradle.kts diff --git a/build.gradle b/build.gradle index 26b598ff5d..9dd9e74517 100644 --- a/build.gradle +++ b/build.gradle @@ -2,20 +2,14 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ + import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.dokka.gradle.DokkaTaskPartial -apply plugin: 'jdk-convention' +import static Projects.* -def coreModule = "kotlinx-coroutines-core" -def testModule = "kotlinx-coroutines-test" -def multiplatform = [coreModule, testModule] -// Not applicable for Kotlin plugin -def sourceless = ['kotlinx.coroutines', 'kotlinx-coroutines-bom', 'integration-testing'] -def internal = ['kotlinx.coroutines', 'benchmarks', 'integration-testing'] -// Not published -def unpublished = internal + ['example-frontend-js', 'android-unit-tests'] +apply plugin: 'jdk-convention' buildscript { /* @@ -160,6 +154,8 @@ configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != core } } +apply plugin: "bom-conventions" + // Configure subprojects with Kotlin sources configure(subprojects.findAll { !sourceless.contains(it.name) }) { // Use atomicfu plugin, it also adds all the necessary dependencies diff --git a/buildSrc/src/main/kotlin/Projects.kt b/buildSrc/src/main/kotlin/Projects.kt index dd284b6132..d5494e16cd 100644 --- a/buildSrc/src/main/kotlin/Projects.kt +++ b/buildSrc/src/main/kotlin/Projects.kt @@ -1,8 +1,20 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ - +@file:JvmName("Projects") import org.gradle.api.Project fun Project.version(target: String): String = property("${target}_version") as String + +val coreModule = "kotlinx-coroutines-core" +val testModule = "kotlinx-coroutines-test" + +val multiplatform = setOf(coreModule, testModule) +// Not applicable for Kotlin plugin +val sourceless = setOf("kotlinx.coroutines", "kotlinx-coroutines-bom", "integration-testing") +val internal = setOf("kotlinx.coroutines", "benchmarks", "integration-testing") +// Not published +val unpublished = internal + setOf("example-frontend-js", "android-unit-tests") + +val Project.isMultiplatform: Boolean get() = name in multiplatform diff --git a/buildSrc/src/main/kotlin/bom-conventions.gradle.kts b/buildSrc/src/main/kotlin/bom-conventions.gradle.kts new file mode 100644 index 0000000000..45f30edff1 --- /dev/null +++ b/buildSrc/src/main/kotlin/bom-conventions.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.gradle.dsl.* + + +configure(subprojects.filter { it.name !in unpublished }) { + if (name == "kotlinx-coroutines-bom" || name == "kotlinx.coroutines") return@configure + if (isMultiplatform) { + kotlinExtension.sourceSets.getByName("jvmMain").dependencies { + api(project.dependencies.platform(project(":kotlinx-coroutines-bom"))) + } + } else { + dependencies { + "api"(platform(project(":kotlinx-coroutines-bom"))) + } + } +} From 85b17ceceff3885464c90b35a88c3e7bbc0ec723 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 14:25:29 +0300 Subject: [PATCH 170/328] =?UTF-8?q?Introduce=20animalsniffer=20checks=20to?= =?UTF-8?q?=20coroutines=20and=20compile=20against=20Java=E2=80=A6=20(#296?= =?UTF-8?q?3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Introduce animalsniffer checks to coroutines and compile against Java 8 source and binary target, but still avoiding Java 7+ API * Do not use deprecated target, language desugaring will handle default interface methods and Math/Long/Int static methods * Partially migrate to .gradle.kts Fixes #1589 --- build.gradle | 19 ++++++++----- buildSrc/build.gradle.kts | 1 + buildSrc/src/main/kotlin/OptInPreset.kt | 3 ++- buildSrc/src/main/kotlin/Projects.kt | 13 ++++++++- .../animalsniffer-convention.gradle.kts | 27 +++++++++++++++++++ .../kotlin/kotlin-jvm-conventions.gradle.kts | 4 +-- gradle/compile-jvm-multiplatform.gradle | 8 ++++-- kotlinx-coroutines-core/build.gradle | 5 ++++ .../common/src/flow/SharingStarted.kt | 3 ++- .../internal/InternalAnnotations.common.kt | 10 +++++++ .../common/src/internal/Symbol.kt | 4 ++- .../jvm/src/CoroutineContext.kt | 2 +- .../jvm/src/debug/AgentPremain.kt | 2 ++ .../jvm/src/internal/InternalAnnotations.kt | 8 ++++++ 14 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts create mode 100644 kotlinx-coroutines-core/common/src/internal/InternalAnnotations.common.kt create mode 100644 kotlinx-coroutines-core/jvm/src/internal/InternalAnnotations.kt diff --git a/build.gradle b/build.gradle index 9dd9e74517..1bec7a3700 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,9 @@ */ +import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.dokka.gradle.DokkaTaskPartial @@ -54,6 +56,7 @@ buildscript { classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version" classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version" + classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.3" // Android API check // JMH plugins classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0" @@ -101,6 +104,8 @@ allprojects { } apply plugin: "binary-compatibility-validator" +apply plugin: 'base' + apiValidation { ignoredProjects += unpublished + ["kotlinx-coroutines-bom"] if (build_snapshot_train) { @@ -126,7 +131,7 @@ allprojects { // Add dependency to core source sets. Core is configured in kx-core/build.gradle configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) { evaluationDependsOn(":$coreModule") - if (it.name in multiplatform) { + if (isMultiplatform(it)) { apply plugin: "kotlin-multiplatform" apply from: rootProject.file("gradle/compile-jvm-multiplatform.gradle") apply from: rootProject.file("gradle/compile-common.gradle") @@ -162,8 +167,8 @@ configure(subprojects.findAll { !sourceless.contains(it.name) }) { apply plugin: 'kotlinx-atomicfu' // Configure options for all Kotlin compilation tasks - tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all { - kotlinOptions.freeCompilerArgs += OptInPresetKt.optInAnnotations.collect { "-Xopt-in=" + it } + tasks.withType(AbstractKotlinCompile).all { + kotlinOptions.freeCompilerArgs += OptInPreset.optInAnnotations.collect { "-Xopt-in=" + it } kotlinOptions.freeCompilerArgs += "-progressive" // Disable KT-36770 for RxJava2 integration kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated" @@ -207,7 +212,7 @@ if (build_snapshot_train) { // Redefine source sets because we are not using 'kotlin/main/fqn' folder convention configure(subprojects.findAll { - !sourceless.contains(it.name) && !multiplatform.contains(it.name) && + !sourceless.contains(it.name) && !isMultiplatform(it) && it.name != "benchmarks" && it.name != "example-frontend-js" }) { @@ -262,7 +267,7 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { } List jarTasks - if (it.name in multiplatform) { + if (isMultiplatform(it)) { jarTasks = ["jvmJar", "metadataJar"] } else if (it.name == "kotlinx-coroutines-debug") { // We shadow debug module instead of just packaging it @@ -282,7 +287,7 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) { } // Report Kotlin compiler version when building project -println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION") +println("Using Kotlin compiler version: $KotlinCompilerVersion.VERSION") // --------------- Cache redirector --------------- @@ -296,7 +301,7 @@ def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm" task deploy(dependsOn: publishTasks) -apply plugin: 'base' +apply plugin: 'animalsniffer-convention' clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c54e226af1..c2808c004a 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -46,4 +46,5 @@ dependencies { implementation(kotlin("gradle-plugin", version("kotlin"))) implementation("org.jetbrains.dokka:dokka-gradle-plugin:${version("dokka")}") implementation("org.jetbrains.dokka:dokka-core:${version("dokka")}") + implementation("ru.vyarus:gradle-animalsniffer-plugin:1.5.3") // Android API check } diff --git a/buildSrc/src/main/kotlin/OptInPreset.kt b/buildSrc/src/main/kotlin/OptInPreset.kt index ee2aab11cf..fdcdb8ecf8 100644 --- a/buildSrc/src/main/kotlin/OptInPreset.kt +++ b/buildSrc/src/main/kotlin/OptInPreset.kt @@ -1,6 +1,7 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +@file:JvmName("OptInPreset") val optInAnnotations = listOf( "kotlin.RequiresOptIn", @@ -10,4 +11,4 @@ val optInAnnotations = listOf( "kotlinx.coroutines.ExperimentalCoroutinesApi", "kotlinx.coroutines.ObsoleteCoroutinesApi", "kotlinx.coroutines.InternalCoroutinesApi", - "kotlinx.coroutines.FlowPreview") \ No newline at end of file + "kotlinx.coroutines.FlowPreview") diff --git a/buildSrc/src/main/kotlin/Projects.kt b/buildSrc/src/main/kotlin/Projects.kt index d5494e16cd..d19e00ca46 100644 --- a/buildSrc/src/main/kotlin/Projects.kt +++ b/buildSrc/src/main/kotlin/Projects.kt @@ -2,7 +2,7 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:JvmName("Projects") -import org.gradle.api.Project +import org.gradle.api.* fun Project.version(target: String): String = property("${target}_version") as String @@ -18,3 +18,14 @@ val internal = setOf("kotlinx.coroutines", "benchmarks", "integration-testing") val unpublished = internal + setOf("example-frontend-js", "android-unit-tests") val Project.isMultiplatform: Boolean get() = name in multiplatform + +// Projects that we do not check for Android API level 14 check due to various limitations +val androidNonCompatibleProjects = setOf( + "kotlinx-coroutines-debug", + "kotlinx-coroutines-swing", + "kotlinx-coroutines-javafx", + "kotlinx-coroutines-jdk8", + "kotlinx-coroutines-jdk9", + "kotlinx-coroutines-reactor", + "kotlinx-coroutines-test" +) diff --git a/buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts b/buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts new file mode 100644 index 0000000000..32b4931e57 --- /dev/null +++ b/buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import ru.vyarus.gradle.plugin.animalsniffer.* + +subprojects { + // Skip JDK 8 projects or unpublished ones + if (!shouldSniff()) return@subprojects + apply(plugin = "ru.vyarus.animalsniffer") + configure { + sourceSets = listOf((project.extensions.getByName("sourceSets") as SourceSetContainer).getByName("main")) + } + val signature: Configuration by configurations + dependencies { + signature("net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature") + signature("org.codehaus.mojo.signature:java17:1.0@signature") + } +} + +fun Project.shouldSniff(): Boolean { + // Skip all non-JVM projects + if (platformOf(project) != "jvm") return false + val name = project.name + if (name in unpublished || name in sourceless || name in androidNonCompatibleProjects) return false + return true +} diff --git a/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts b/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts index c7744f8702..90847f4567 100644 --- a/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kotlin-jvm-conventions.gradle.kts @@ -11,8 +11,8 @@ plugins { } java { - sourceCompatibility = JavaVersion.VERSION_1_6 - targetCompatibility = JavaVersion.VERSION_1_6 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } dependencies { diff --git a/gradle/compile-jvm-multiplatform.gradle b/gradle/compile-jvm-multiplatform.gradle index 5e65042746..88b717976d 100644 --- a/gradle/compile-jvm-multiplatform.gradle +++ b/gradle/compile-jvm-multiplatform.gradle @@ -2,12 +2,16 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -sourceCompatibility = 1.6 -targetCompatibility = 1.6 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 kotlin { jvm {} sourceSets { + jvmMain.dependencies { + compileOnly "org.codehaus.mojo:animal-sniffer-annotations:1.20" + } + jvmTest.dependencies { api "org.jetbrains.kotlin:kotlin-test:$kotlin_version" // Workaround to make addSuppressed work in tests diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 4435ad7fa1..fdb6f39787 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -90,6 +90,11 @@ kotlin { } } } + + jvm { + // For animal sniffer + withJava() + } } configurations { diff --git a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt index f4c6f2ee8d..a5ae63667f 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt @@ -5,7 +5,7 @@ package kotlinx.coroutines.flow import kotlinx.coroutines.* -import kotlinx.coroutines.flow.internal.* +import kotlinx.coroutines.internal.IgnoreJreRequirement import kotlin.time.* /** @@ -204,5 +204,6 @@ private class StartedWhileSubscribed( stopTimeout == other.stopTimeout && replayExpiration == other.replayExpiration + @IgnoreJreRequirement // desugared hashcode implementation override fun hashCode(): Int = stopTimeout.hashCode() * 31 + replayExpiration.hashCode() } diff --git a/kotlinx-coroutines-core/common/src/internal/InternalAnnotations.common.kt b/kotlinx-coroutines-core/common/src/internal/InternalAnnotations.common.kt new file mode 100644 index 0000000000..1df81c9cc4 --- /dev/null +++ b/kotlinx-coroutines-core/common/src/internal/InternalAnnotations.common.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.internal + +// Ignore JRE requirements for animal-sniffer, compileOnly dependency +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE) +@OptionalExpectation +internal expect annotation class IgnoreJreRequirement() diff --git a/kotlinx-coroutines-core/common/src/internal/Symbol.kt b/kotlinx-coroutines-core/common/src/internal/Symbol.kt index 84db2ef6cc..b629951fbd 100644 --- a/kotlinx-coroutines-core/common/src/internal/Symbol.kt +++ b/kotlinx-coroutines-core/common/src/internal/Symbol.kt @@ -4,12 +4,14 @@ package kotlinx.coroutines.internal +import kotlin.jvm.* + /** * A symbol class that is used to define unique constants that are self-explanatory in debugger. * * @suppress **This is unstable API and it is subject to change.** */ -internal class Symbol(val symbol: String) { +internal class Symbol(@JvmField val symbol: String) { override fun toString(): String = "<$symbol>" @Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE") diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index 702a0d83ea..9a8f168bcd 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -5,7 +5,6 @@ package kotlinx.coroutines import kotlinx.coroutines.internal.* -import kotlinx.coroutines.scheduling.* import kotlin.coroutines.* import kotlin.coroutines.jvm.internal.CoroutineStackFrame @@ -140,6 +139,7 @@ internal actual val CoroutineContext.coroutineName: String? get() { private const val DEBUG_THREAD_NAME_SEPARATOR = " @" +@IgnoreJreRequirement // desugared hashcode implementation internal data class CoroutineId( val id: Long ) : ThreadContextElement, AbstractCoroutineContextElement(CoroutineId) { diff --git a/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt b/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt index d592bf657a..4b0ce3f31e 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/AgentPremain.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.debug import android.annotation.* import kotlinx.coroutines.debug.internal.* +import org.codehaus.mojo.animal_sniffer.* import sun.misc.* import java.lang.instrument.* import java.lang.instrument.ClassFileTransformer @@ -17,6 +18,7 @@ import java.security.* */ @Suppress("unused") @SuppressLint("all") +@IgnoreJRERequirement // Never touched on Android internal object AgentPremain { private val enableCreationStackTraces = runCatching { diff --git a/kotlinx-coroutines-core/jvm/src/internal/InternalAnnotations.kt b/kotlinx-coroutines-core/jvm/src/internal/InternalAnnotations.kt new file mode 100644 index 0000000000..41707f7b89 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/src/internal/InternalAnnotations.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.internal + +@Suppress("ACTUAL_WITHOUT_EXPECT") // Not the same name to WA the bug in the compiler +internal actual typealias IgnoreJreRequirement = org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement From 80af4990caa035d29c51c2bc437eeac6891908b3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 14:31:25 +0300 Subject: [PATCH 171/328] Do not propagate cancellation to the upstream in Flow flat* operators (#2964) * Do not propagate cancellation to the upstream in Flow flat* operators Fixes #2964 --- .../common/src/channels/Produce.kt | 2 +- .../common/src/flow/internal/FlowCoroutine.kt | 24 +------- .../common/src/flow/internal/Merge.kt | 6 +- .../common/src/flow/operators/Merge.kt | 9 ++- .../operators/FlatMapMergeFastPathTest.kt | 9 +-- .../test/flow/operators/FlatMapMergeTest.kt | 9 +-- .../test/flow/operators/FlattenConcatTest.kt | 13 +++++ .../common/test/flow/operators/MergeTest.kt | 58 +++++++++++++++++++ 8 files changed, 84 insertions(+), 46 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/channels/Produce.kt b/kotlinx-coroutines-core/common/src/channels/Produce.kt index a03e3d8742..da8f884be1 100644 --- a/kotlinx-coroutines-core/common/src/channels/Produce.kt +++ b/kotlinx-coroutines-core/common/src/channels/Produce.kt @@ -133,7 +133,7 @@ internal fun CoroutineScope.produce( return coroutine } -internal open class ProducerCoroutine( +private class ProducerCoroutine( parentContext: CoroutineContext, channel: Channel ) : ChannelCoroutine(parentContext, channel, true, active = true), ProducerScope { override val isActive: Boolean diff --git a/kotlinx-coroutines-core/common/src/flow/internal/FlowCoroutine.kt b/kotlinx-coroutines-core/common/src/flow/internal/FlowCoroutine.kt index b395525620..9a81eefa2d 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/FlowCoroutine.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/FlowCoroutine.kt @@ -51,33 +51,11 @@ internal fun scopedFlow(@BuilderInference block: suspend CoroutineScope.(Flo flowScope { block(this@flow) } } -internal fun CoroutineScope.flowProduce( - context: CoroutineContext, - capacity: Int = 0, - @BuilderInference block: suspend ProducerScope.() -> Unit -): ReceiveChannel { - val channel = Channel(capacity) - val newContext = newCoroutineContext(context) - val coroutine = FlowProduceCoroutine(newContext, channel) - coroutine.start(CoroutineStart.ATOMIC, coroutine, block) - return coroutine -} - private class FlowCoroutine( context: CoroutineContext, uCont: Continuation ) : ScopeCoroutine(context, uCont) { - public override fun childCancelled(cause: Throwable): Boolean { - if (cause is ChildCancelledException) return true - return cancelImpl(cause) - } -} - -private class FlowProduceCoroutine( - parentContext: CoroutineContext, - channel: Channel -) : ProducerCoroutine(parentContext, channel) { - public override fun childCancelled(cause: Throwable): Boolean { + override fun childCancelled(cause: Throwable): Boolean { if (cause is ChildCancelledException) return true return cancelImpl(cause) } diff --git a/kotlinx-coroutines-core/common/src/flow/internal/Merge.kt b/kotlinx-coroutines-core/common/src/flow/internal/Merge.kt index 9eca8aa0c2..c18adba3b7 100644 --- a/kotlinx-coroutines-core/common/src/flow/internal/Merge.kt +++ b/kotlinx-coroutines-core/common/src/flow/internal/Merge.kt @@ -22,7 +22,7 @@ internal class ChannelFlowTransformLatest( override suspend fun flowCollect(collector: FlowCollector) { assert { collector is SendingCollector } // So cancellation behaviour is not leaking into the downstream - flowScope { + coroutineScope { var previousFlow: Job? = null flow.collect { value -> previousFlow?.apply { @@ -49,7 +49,7 @@ internal class ChannelFlowMerge( ChannelFlowMerge(flow, concurrency, context, capacity, onBufferOverflow) override fun produceImpl(scope: CoroutineScope): ReceiveChannel { - return scope.flowProduce(context, capacity, block = collectToFun) + return scope.produce(context, capacity, block = collectToFun) } override suspend fun collectTo(scope: ProducerScope) { @@ -87,7 +87,7 @@ internal class ChannelLimitedFlowMerge( ChannelLimitedFlowMerge(flows, context, capacity, onBufferOverflow) override fun produceImpl(scope: CoroutineScope): ReceiveChannel { - return scope.flowProduce(context, capacity, block = collectToFun) + return scope.produce(context, capacity, block = collectToFun) } override suspend fun collectTo(scope: ProducerScope) { diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt index 228cc9e245..35c44d0895 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt @@ -61,7 +61,7 @@ public fun Flow.flatMapConcat(transform: suspend (value: T) -> Flow * its concurrent merging so that only one properly configured channel is used for execution of merging logic. * * @param concurrency controls the number of in-flight flows, at most [concurrency] flows are collected - * at the same time. By default it is equal to [DEFAULT_CONCURRENCY]. + * at the same time. By default, it is equal to [DEFAULT_CONCURRENCY]. */ @FlowPreview public fun Flow.flatMapMerge( @@ -71,8 +71,7 @@ public fun Flow.flatMapMerge( map(transform).flattenMerge(concurrency) /** - * Flattens the given flow of flows into a single flow in a sequentially manner, without interleaving nested flows. - * This method is conceptually identical to `flattenMerge(concurrency = 1)` but has faster implementation. + * Flattens the given flow of flows into a single flow in a sequential manner, without interleaving nested flows. * * Inner flows are collected by this operator *sequentially*. */ @@ -119,7 +118,7 @@ public fun merge(vararg flows: Flow): Flow = flows.asIterable().merge( * Flattens the given flow of flows into a single flow with a [concurrency] limit on the number of * concurrently collected flows. * - * If [concurrency] is more than 1, then inner flows are be collected by this operator *concurrently*. + * If [concurrency] is more than 1, then inner flows are collected by this operator *concurrently*. * With `concurrency == 1` this operator is identical to [flattenConcat]. * * ### Operator fusion @@ -131,7 +130,7 @@ public fun merge(vararg flows: Flow): Flow = flows.asIterable().merge( * and size of its output buffer can be changed by applying subsequent [buffer] operator. * * @param concurrency controls the number of in-flight flows, at most [concurrency] flows are collected - * at the same time. By default it is equal to [DEFAULT_CONCURRENCY]. + * at the same time. By default, it is equal to [DEFAULT_CONCURRENCY]. */ @FlowPreview public fun Flow>.flattenMerge(concurrency: Int = DEFAULT_CONCURRENCY): Flow { diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeFastPathTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeFastPathTest.kt index a92189c45c..f810221848 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeFastPathTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeFastPathTest.kt @@ -39,19 +39,14 @@ class FlatMapMergeFastPathTest : FlatMapMergeBaseTest() { @Test fun testCancellationExceptionDownstream() = runTest { - val flow = flow { - emit(1) - hang { expect(2) } - }.flatMapMerge { + val flow = flowOf(1, 2, 3).flatMapMerge { flow { emit(it) - expect(1) throw CancellationException("") } }.buffer(64) - assertFailsWith(flow) - finish(3) + assertEquals(listOf(1, 2, 3), flow.toList()) } @Test diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeTest.kt index 7470289ece..c2ce346d9b 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlatMapMergeTest.kt @@ -69,19 +69,14 @@ class FlatMapMergeTest : FlatMapMergeBaseTest() { @Test fun testCancellationExceptionDownstream() = runTest { - val flow = flow { - emit(1) - hang { expect(2) } - }.flatMapMerge { + val flow = flowOf(1, 2, 3).flatMapMerge { flow { emit(it) - expect(1) throw CancellationException("") } } - assertFailsWith(flow) - finish(3) + assertEquals(listOf(1, 2, 3), flow.toList()) } @Test diff --git a/kotlinx-coroutines-core/common/test/flow/operators/FlattenConcatTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/FlattenConcatTest.kt index 084af5b9bb..4ec7cc3cd1 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/FlattenConcatTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/FlattenConcatTest.kt @@ -36,4 +36,17 @@ class FlattenConcatTest : FlatMapBaseTest() { consumer.cancelAndJoin() finish(2) } + + @Test + fun testCancellation() = runTest { + val flow = flow { + repeat(5) { + emit(flow { + if (it == 2) throw CancellationException("") + emit(1) + }) + } + } + assertFailsWith(flow.flattenConcat()) + } } diff --git a/kotlinx-coroutines-core/common/test/flow/operators/MergeTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/MergeTest.kt index 1248188554..f084798487 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/MergeTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/MergeTest.kt @@ -45,6 +45,64 @@ abstract class MergeTest : TestBase() { assertEquals(listOf("source"), result) } + @Test + fun testOneSourceCancelled() = runTest { + val flow = flow { + expect(1) + emit(1) + expect(2) + yield() + throw CancellationException("") + } + + val otherFlow = flow { + repeat(5) { + emit(1) + yield() + } + + expect(3) + } + + val result = listOf(flow, otherFlow).merge().toList() + assertEquals(MutableList(6) { 1 }, result) + finish(4) + } + + @Test + fun testOneSourceCancelledNonFused() = runTest { + val flow = flow { + expect(1) + emit(1) + expect(2) + yield() + throw CancellationException("") + } + + val otherFlow = flow { + repeat(5) { + emit(1) + yield() + } + + expect(3) + } + + val result = listOf(flow, otherFlow).nonFuseableMerge().toList() + assertEquals(MutableList(6) { 1 }, result) + finish(4) + } + + private fun Iterable>.nonFuseableMerge(): Flow { + return channelFlow { + forEach { flow -> + launch { + flow.collect { send(it) } + } + } + } + } + @Test fun testIsolatedContext() = runTest { val flow = flow { From 0c6f16b73800a14d09c942040862e8d58996e1d6 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 20 Oct 2021 15:01:30 +0300 Subject: [PATCH 172/328] Deprecate for removal redundant Delay method (#2979) --- kotlinx-coroutines-core/common/src/Delay.kt | 15 ++++++--------- .../src/JavaFxDispatcher.kt | 1 - 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Delay.kt b/kotlinx-coroutines-core/common/src/Delay.kt index 4543c5dda1..35e83f3aba 100644 --- a/kotlinx-coroutines-core/common/src/Delay.kt +++ b/kotlinx-coroutines-core/common/src/Delay.kt @@ -19,15 +19,12 @@ import kotlin.time.* */ @InternalCoroutinesApi public interface Delay { - /** - * Delays coroutine for a given time without blocking a thread and resumes it after a specified time. - * - * This suspending function is cancellable. - * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function - * immediately resumes with [CancellationException]. - * There is a **prompt cancellation guarantee**. If the job was cancelled while this function was - * suspended, it will not resume successfully. See [suspendCancellableCoroutine] documentation for low-level details. - */ + + /** @suppress **/ + @Deprecated( + message = "Deprecated without replacement as an internal method never intended for public use", + level = DeprecationLevel.ERROR + ) // Error since 1.6.0 public suspend fun delay(time: Long) { if (time <= 0) return // don't delay return suspendCancellableCoroutine { scheduleResumeAfterDelay(time, it) } diff --git a/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt b/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt index 0a35cbf22e..6915c53972 100644 --- a/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt +++ b/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt @@ -10,7 +10,6 @@ import javafx.event.* import javafx.util.* import kotlinx.coroutines.* import kotlinx.coroutines.internal.* -import kotlinx.coroutines.javafx.JavaFx.delay import java.lang.UnsupportedOperationException import java.lang.reflect.* import java.util.concurrent.* From 7e82d195730bf444c7b5df81cc984e2490419026 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Fri, 22 Oct 2021 17:26:55 +0300 Subject: [PATCH 173/328] Use AtomicBoolean instead of AtomicRef for LockWaiter (#2998) It's more optimal and robust to boxing/unboxing issues. --- kotlinx-coroutines-core/common/src/sync/Mutex.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/sync/Mutex.kt b/kotlinx-coroutines-core/common/src/sync/Mutex.kt index ebebcc8d1c..c02422825e 100644 --- a/kotlinx-coroutines-core/common/src/sync/Mutex.kt +++ b/kotlinx-coroutines-core/common/src/sync/Mutex.kt @@ -369,7 +369,7 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { private abstract inner class LockWaiter( @JvmField val owner: Any? ) : LockFreeLinkedListNode(), DisposableHandle { - private val isTaken = atomic(false) + private val isTaken = atomic(false) fun take(): Boolean = isTaken.compareAndSet(false, true) final override fun dispose() { remove() } abstract fun tryResumeLockWaiter(): Boolean From 4c6aa540801a21d5cb72918314a70c5c03cc434e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 22 Oct 2021 18:38:21 +0300 Subject: [PATCH 174/328] Fix spurious failures in TaskTest (#2996) --- .../kotlinx-coroutines-play-services/test/FakeAndroid.kt | 9 ++++++++- kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt | 2 +- kotlinx-coroutines-core/jvm/test/TestBase.kt | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/integration/kotlinx-coroutines-play-services/test/FakeAndroid.kt b/integration/kotlinx-coroutines-play-services/test/FakeAndroid.kt index 6026ffd75d..e286ee197b 100644 --- a/integration/kotlinx-coroutines-play-services/test/FakeAndroid.kt +++ b/integration/kotlinx-coroutines-play-services/test/FakeAndroid.kt @@ -2,10 +2,17 @@ package android.os import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import java.util.concurrent.* class Handler(val looper: Looper) { fun post(r: Runnable): Boolean { - GlobalScope.launch { r.run() } + try { + GlobalScope.launch { r.run() } + } catch (e: RejectedExecutionException) { + // Execute leftover callbacks in place for tests + r.run() + } + return true } } diff --git a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt index 2968825d15..6457d26e0a 100644 --- a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt +++ b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt @@ -42,7 +42,7 @@ internal actual object DefaultExecutor : EventLoopImplBase(), Runnable { @Volatile private var debugStatus: Int = FRESH - val isShutDown: Boolean get() = debugStatus == SHUTDOWN + private val isShutDown: Boolean get() = debugStatus == SHUTDOWN private val isShutdownRequested: Boolean get() { val debugStatus = debugStatus diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index fce8eff3c5..72a4a2cf2c 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -152,7 +152,8 @@ public actual open class TestBase(private var disableOutCheck: Boolean) { }) fun println(message: Any?) { - previousOut.println(message) + if (disableOutCheck) kotlin.io.println(message) + else previousOut.println(message) } @Before From 1004f395c2973b0ebe334370a6b8656f4e34ebe8 Mon Sep 17 00:00:00 2001 From: Alex Vanyo Date: Tue, 26 Oct 2021 09:29:12 -0500 Subject: [PATCH 175/328] Use DirectExecutor for Task.addOnCompleteListener (#2992) Fixes #2990 --- .../src/Tasks.kt | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/integration/kotlinx-coroutines-play-services/src/Tasks.kt b/integration/kotlinx-coroutines-play-services/src/Tasks.kt index c37ac7a02d..0451d7beb8 100644 --- a/integration/kotlinx-coroutines-play-services/src/Tasks.kt +++ b/integration/kotlinx-coroutines-play-services/src/Tasks.kt @@ -8,6 +8,8 @@ package kotlinx.coroutines.tasks import com.google.android.gms.tasks.* import kotlinx.coroutines.* +import java.lang.Runnable +import java.util.concurrent.Executor import kotlin.coroutines.* /** @@ -71,7 +73,8 @@ private fun Task.asDeferredImpl(cancellationTokenSource: CancellationToke deferred.completeExceptionally(e) } } else { - addOnCompleteListener { + // Run the callback directly to avoid unnecessarily scheduling on the main thread. + addOnCompleteListener(DirectExecutor) { val e = it.exception if (e == null) { @Suppress("UNCHECKED_CAST") @@ -114,7 +117,8 @@ public suspend fun Task.await(): T = awaitImpl(null) * leads to an unspecified behaviour. */ @ExperimentalCoroutinesApi // Since 1.5.1, tentatively until 1.6.0 -public suspend fun Task.await(cancellationTokenSource: CancellationTokenSource): T = awaitImpl(cancellationTokenSource) +public suspend fun Task.await(cancellationTokenSource: CancellationTokenSource): T = + awaitImpl(cancellationTokenSource) private suspend fun Task.awaitImpl(cancellationTokenSource: CancellationTokenSource?): T { // fast path @@ -133,7 +137,8 @@ private suspend fun Task.awaitImpl(cancellationTokenSource: CancellationT } return suspendCancellableCoroutine { cont -> - addOnCompleteListener { + // Run the callback directly to avoid unnecessarily scheduling on the main thread. + addOnCompleteListener(DirectExecutor) { val e = it.exception if (e == null) { @Suppress("UNCHECKED_CAST") @@ -150,3 +155,12 @@ private suspend fun Task.awaitImpl(cancellationTokenSource: CancellationT } } } + +/** + * An [Executor] that just directly executes the [Runnable]. + */ +private object DirectExecutor : Executor { + override fun execute(r: Runnable) { + r.run() + } +} From eccebf2710a84222c2375e923e1c65c328473e91 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 28 Oct 2021 12:41:35 +0300 Subject: [PATCH 176/328] Fix -Poverwrite.probes not being propagated to the test (#2935) --- integration-testing/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index d0286d7d55..aea4d45203 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -82,6 +82,7 @@ task debugAgentTest(type: Test) { jvmArgs ('-javaagent:' + project(':kotlinx-coroutines-debug').shadowJar.outputs.files.getFiles()[0]) testClassesDirs = sourceSet.output.classesDirs classpath = sourceSet.runtimeClasspath + systemProperties project.properties.subMap(["overwrite.probes"]) } task coreAgentTest(type: Test) { From 8a1deb95ae7dfe5b41837e515fae7c2e7aaaff0f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 29 Oct 2021 13:13:14 +0300 Subject: [PATCH 177/328] Update JNA to 5.9 (#3003) * It supports Apple M1 since 5.7: https://github.com/java-native-access/jna/blob/master/CHANGES.md#features-3 Fixes #3001 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f0d49b5ef8..5b5c2a90c0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,7 @@ javafx_version=11.0.2 javafx_plugin_version=0.0.8 binary_compatibility_validator_version=0.8.0-RC blockhound_version=1.0.2.RELEASE -jna_version=5.5.0 +jna_version=5.9.0 # Android versions android_version=4.1.1.4 From 6813bc04d35d4e69726abdc5a7cd7bd9423ae93f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 8 Nov 2021 15:30:18 +0300 Subject: [PATCH 178/328] Update coroutines-guide.md (#3012) * Update coroutines-guide.md "kotlinx.coroutines guide" Google search first result still leads here and it would be nice to guide people directly to kotlinlang Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- coroutines-guide.md | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/coroutines-guide.md b/coroutines-guide.md index 3b4707cf83..3cc035ae6a 100644 --- a/coroutines-guide.md +++ b/coroutines-guide.md @@ -1,14 +1,3 @@ The main coroutines guide has moved to the [docs folder](docs/topics/coroutines-guide.md) and split up into smaller documents. -## Table of contents - - - - - - - - - - - +It is recommended to read the guide on the [kotlinlang website](https://kotlinlang.org/docs/coroutines-guide.html), with proper HTML formatting and runnable samples. From 22e31b7d50b728530207c6c6a0d58926b19943c7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 8 Nov 2021 16:32:24 +0300 Subject: [PATCH 179/328] Update Kotlin to 1.6.0-RC2 (#3013) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5b5c2a90c0..d2f5f30599 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ # Kotlin version=1.5.2-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.6.0-RC +kotlin_version=1.6.0-RC2 # Dependencies junit_version=4.12 From 30b057e2217d5355f85284b1cd5ff012a6d00393 Mon Sep 17 00:00:00 2001 From: Nikita Koval Date: Fri, 12 Nov 2021 01:27:19 +0700 Subject: [PATCH 180/328] Invoke `jmhJar` as a part of build procedure to ensure that benchmarks always compile (#3019) * Invoke jmhJar as a part of the build procedure to ensure that benchmarks always compile --- benchmarks/build.gradle.kts | 8 +++++++- settings.gradle | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/benchmarks/build.gradle.kts b/benchmarks/build.gradle.kts index 27ab59b5f5..b7dcb57968 100644 --- a/benchmarks/build.gradle.kts +++ b/benchmarks/build.gradle.kts @@ -46,13 +46,19 @@ extensions.configure("jmh") { // includeTests = false } -tasks.named("jmhJar") { +val jmhJarTask = tasks.named("jmhJar") { archiveBaseName by "benchmarks" archiveClassifier by null archiveVersion by null destinationDirectory.file("$rootDir") } +tasks { + build { + dependsOn(jmhJarTask) + } +} + dependencies { implementation("org.openjdk.jmh:jmh-core:1.26") implementation("io.projectreactor:reactor-core:${version("reactor")}") diff --git a/settings.gradle b/settings.gradle index 44effa7c20..d7673a64f9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,7 +8,7 @@ pluginManagement { // JMH id "net.ltgt.apt" version "0.21" - id "me.champeau.gradle.jmh" version "0.5.2" + id "me.champeau.gradle.jmh" version "0.5.3" } repositories { From c112be4a896a5b937883f0a6cd2ac9a2e71e15cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20W=C3=BCnsche?= Date: Mon, 15 Nov 2021 09:07:32 +0000 Subject: [PATCH 181/328] Add missing indent to error message (#3022) --- reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt index 3f9153822b..e4670f3579 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxCompletable.kt @@ -20,7 +20,7 @@ public fun rxCompletable( context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> Unit ): Completable { - require(context[Job] === null) { "Completable context cannot contain job in it." + + require(context[Job] === null) { "Completable context cannot contain job in it. " + "Its lifecycle should be managed via Disposable handle. Had $context" } return rxCompletableInternal(GlobalScope, context, block) } From 042720589c6f438f77d84254bd2dceb569f01841 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 15 Nov 2021 12:09:43 +0300 Subject: [PATCH 182/328] Incorporate new Native memory model into kotlinx-coroutines mainline (#2833) * Support of new K/N memory model * Dispatchers.Default backed by a pool of workers on Linux and by global_queue on iOS-like * Implementation of Dispatchers.Main that uses the main queue on iOS and default dispatcher on other platforms (#2858) * Introduced newSingleThreadDispatcher and newFixedThreadPoolDispatcher * Use proper reentrant locking and CoW arrays on new memory model, make TestBase _almost_ race-free * More thread-safety in Native counterpart and one more test from native-mt * Source-set sharing for tests shared between JVM and K/N * Wrap Obj-C interop into autorelease pool to avoid memory leaks Fixes #2914 Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- buildSrc/src/main/kotlin/SourceSets.kt | 2 +- kotlinx-coroutines-core/build.gradle | 56 ++++-- .../common/src/EventLoop.common.kt | 13 +- .../src/channels/ArrayBroadcastChannel.kt | 6 + .../common/src/internal/Concurrent.common.kt | 4 +- .../common/test/EmptyContext.kt | 8 +- .../common/test/TestBase.common.kt | 4 + .../common/test/flow/FlowInvariantsTest.kt | 2 +- .../concurrent/src/Builders.concurrent.kt | 14 ++ .../src/CompletionHandler.kt | 0 .../src/MultithreadedDispatchers.common.kt | 11 ++ .../src/internal/LockFreeLinkedList.kt | 6 +- .../test/AbstractDispatcherConcurrencyTest.kt | 54 ++++++ .../test/AtomicCancellationTest.kt | 4 +- .../test/ConcurrentExceptionsStressTest.kt | 67 +++++++ .../test/ConcurrentTestUtilities.common.kt | 23 +++ .../test/DefaultDispatcherConcurrencyTest.kt | 8 + .../test/JobStructuredJoinStressTest.kt | 12 +- .../test/RunBlockingTest.kt | 100 +++++------ .../test/TestBaseExtension.common.kt | 10 ++ .../channels/BroadcastChannelSubStressTest.kt | 60 +++++++ ...annelCancelUndeliveredElementStressTest.kt | 16 +- ...nflatedBroadcastChannelNotifyStressTest.kt | 33 ++-- .../test/flow/CombineStressTest.kt | 8 +- .../test/flow/FlowCancellationTest.kt | 11 +- .../test/flow/StateFlowCommonStressTest.kt | 47 +++++ .../test/flow/StateFlowUpdateCommonTest.kt | 39 ++++ .../test/internal/LockFreeLinkedListTest.kt | 5 +- .../test/selects/SelectChannelStressTest.kt | 33 ++-- .../test/selects/SelectMutexStressTest.kt | 2 +- .../test/sync/MutexStressTest.kt | 45 ++++- .../test/sync/SemaphoreStressTest.kt | 54 ++++-- kotlinx-coroutines-core/js/src/EventLoop.kt | 2 + .../js/src/internal/Concurrent.kt | 1 + .../js/test/PromiseTest.kt | 2 +- kotlinx-coroutines-core/js/test/TestBase.kt | 3 + kotlinx-coroutines-core/jvm/src/Builders.kt | 2 +- kotlinx-coroutines-core/jvm/src/EventLoop.kt | 2 + .../jvm/src/ThreadPoolDispatcher.kt | 4 +- .../jvm/test/ConcurrentTestUtilities.kt | 29 +++ .../jvm/test/FieldWalker.kt | 9 +- .../jvm/test/RunBlockingJvmTest.kt | 18 ++ kotlinx-coroutines-core/jvm/test/TestBase.kt | 5 +- .../jvm/test/TestBaseExtension.kt | 10 ++ .../channels/BroadcastChannelSubStressTest.kt | 70 -------- .../channels/RendezvousChannelStressTest.kt | 29 --- .../jvm/test/exceptions/Exceptions.kt | 2 +- .../native/src/Builders.kt | 37 +++- .../native/src/CompletionHandler.kt | 22 --- .../native/src/CoroutineContext.kt | 50 ++++-- .../native/src/Dispatchers.kt | 35 +++- .../native/src/EventLoop.kt | 32 +++- .../native/src/Exceptions.kt | 7 +- .../native/src/MultithreadedDispatchers.kt | 77 ++++++++ .../native/src/internal/Concurrent.kt | 31 +++- .../native/src/internal/CopyOnWriteList.kt | 83 +++------ .../native/src/internal/LinkedList.kt | 170 ------------------ .../native/src/internal/Synchronized.kt | 6 +- .../native/test/ConcurrentTestUtilities.kt | 37 ++++ .../native/test/DelayExceptionTest.kt | 16 -- .../native/test/RunBlockingTest.kt | 18 -- .../native/test/TestBase.kt | 27 +-- .../native/test/TestBaseExtension.kt | 19 ++ .../native/test/WorkerTest.kt | 4 +- .../native/test/internal/LinkedListTest.kt | 6 +- .../nativeDarwin/src/Dispatchers.kt | 108 +++++++++++ .../nativeDarwin/test/MainDispatcherTest.kt | 130 ++++++++++++++ .../nativeOther/src/Dispatchers.kt | 35 ++++ .../common/test/Helpers.kt | 8 + .../common/test/TestDispatchersTest.kt | 4 +- .../native/test/Helpers.kt | 8 + 71 files changed, 1299 insertions(+), 616 deletions(-) create mode 100644 kotlinx-coroutines-core/concurrent/src/Builders.concurrent.kt rename kotlinx-coroutines-core/{jvm => concurrent}/src/CompletionHandler.kt (100%) create mode 100644 kotlinx-coroutines-core/concurrent/src/MultithreadedDispatchers.common.kt rename kotlinx-coroutines-core/{jvm => concurrent}/src/internal/LockFreeLinkedList.kt (99%) create mode 100644 kotlinx-coroutines-core/concurrent/test/AbstractDispatcherConcurrencyTest.kt rename kotlinx-coroutines-core/{jvm => concurrent}/test/AtomicCancellationTest.kt (98%) create mode 100644 kotlinx-coroutines-core/concurrent/test/ConcurrentExceptionsStressTest.kt create mode 100644 kotlinx-coroutines-core/concurrent/test/ConcurrentTestUtilities.common.kt create mode 100644 kotlinx-coroutines-core/concurrent/test/DefaultDispatcherConcurrencyTest.kt rename kotlinx-coroutines-core/{jvm => concurrent}/test/JobStructuredJoinStressTest.kt (86%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/RunBlockingTest.kt (66%) create mode 100644 kotlinx-coroutines-core/concurrent/test/TestBaseExtension.common.kt create mode 100644 kotlinx-coroutines-core/concurrent/test/channels/BroadcastChannelSubStressTest.kt rename kotlinx-coroutines-core/{jvm => concurrent}/test/channels/ChannelCancelUndeliveredElementStressTest.kt (89%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt (70%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/flow/CombineStressTest.kt (89%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/flow/FlowCancellationTest.kt (83%) create mode 100644 kotlinx-coroutines-core/concurrent/test/flow/StateFlowCommonStressTest.kt create mode 100644 kotlinx-coroutines-core/concurrent/test/flow/StateFlowUpdateCommonTest.kt rename kotlinx-coroutines-core/{jvm => concurrent}/test/internal/LockFreeLinkedListTest.kt (97%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/selects/SelectChannelStressTest.kt (65%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/selects/SelectMutexStressTest.kt (93%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/sync/MutexStressTest.kt (73%) rename kotlinx-coroutines-core/{jvm => concurrent}/test/sync/SemaphoreStressTest.kt (69%) create mode 100644 kotlinx-coroutines-core/jvm/test/ConcurrentTestUtilities.kt create mode 100644 kotlinx-coroutines-core/jvm/test/RunBlockingJvmTest.kt create mode 100644 kotlinx-coroutines-core/jvm/test/TestBaseExtension.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelSubStressTest.kt delete mode 100644 kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt delete mode 100644 kotlinx-coroutines-core/native/src/CompletionHandler.kt create mode 100644 kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt delete mode 100644 kotlinx-coroutines-core/native/src/internal/LinkedList.kt create mode 100644 kotlinx-coroutines-core/native/test/ConcurrentTestUtilities.kt delete mode 100644 kotlinx-coroutines-core/native/test/RunBlockingTest.kt create mode 100644 kotlinx-coroutines-core/native/test/TestBaseExtension.kt create mode 100644 kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt create mode 100644 kotlinx-coroutines-core/nativeDarwin/test/MainDispatcherTest.kt create mode 100644 kotlinx-coroutines-core/nativeOther/src/Dispatchers.kt create mode 100644 kotlinx-coroutines-test/common/test/Helpers.kt create mode 100644 kotlinx-coroutines-test/native/test/Helpers.kt diff --git a/buildSrc/src/main/kotlin/SourceSets.kt b/buildSrc/src/main/kotlin/SourceSets.kt index 533ac70ac6..3ad1dd4dcc 100644 --- a/buildSrc/src/main/kotlin/SourceSets.kt +++ b/buildSrc/src/main/kotlin/SourceSets.kt @@ -16,4 +16,4 @@ fun KotlinSourceSet.configureMultiplatform() { optInAnnotations.forEach { optIn(it) } progressiveMode = true } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index fdb6f39787..35142854b5 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -74,19 +74,50 @@ kotlin { SourceSetsKt.configureMultiplatform(it) } - configure(targets) { - // Configure additional binaries and test runs -- one for each OS - if (["macos", "linux", "mingw"].any { name.startsWith(it) }) { - binaries { - // Test for memory leaks using a special entry point that does not exit but returns from main - binaries.getTest("DEBUG").freeCompilerArgs += ["-e", "kotlinx.coroutines.mainNoExit"] - // Configure a separate test where code runs in background - test("background", [org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType.DEBUG]) { - freeCompilerArgs += ["-e", "kotlinx.coroutines.mainBackground"] - } + /* + * Configure four test runs: + * 1) Old memory model, Main thread + * 2) New memory model, Main thread + * 3) Old memory model, BG thread + * 4) New memory model, BG thread (required for Dispatchers.Main tests on Darwin) + * + * All new MM targets are build with optimize = true to have stress tests properly run. + */ + targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests.class).configureEach { + binaries { + // Test for memory leaks using a special entry point that does not exit but returns from main + binaries.getTest("DEBUG").freeCompilerArgs += ["-e", "kotlinx.coroutines.mainNoExit"] + } + + binaries.test("newMM", [DEBUG]) { + def thisTest = it + freeCompilerArgs += ["-e", "kotlinx.coroutines.mainNoExit"] + optimized = true + binaryOptions["memoryModel"] = "experimental" + testRuns.create("newMM") { + setExecutionSourceFrom(thisTest) + // A hack to get different suffixes in the aggregated report. + executionTask.configure { targetName = "$targetName new MM" } + } + } + + binaries.test("worker", [DEBUG]) { + def thisTest = it + freeCompilerArgs += ["-e", "kotlinx.coroutines.mainBackground"] + testRuns.create("worker") { + setExecutionSourceFrom(thisTest) + executionTask.configure { targetName = "$targetName worker" } } - testRuns { - background { setExecutionSourceFrom(binaries.backgroundDebugTest) } + } + + binaries.test("workerWithNewMM", [DEBUG]) { + def thisTest = it + optimized = true + freeCompilerArgs += ["-e", "kotlinx.coroutines.mainBackground"] + binaryOptions["memoryModel"] = "experimental" + testRuns.create("workerWithNewMM") { + setExecutionSourceFrom(thisTest) + executionTask.configure { targetName = "$targetName worker with new MM" } } } } @@ -97,6 +128,7 @@ kotlin { } } + configurations { configureKotlinJvmPlatform(kotlinCompilerPluginClasspath) } diff --git a/kotlinx-coroutines-core/common/src/EventLoop.common.kt b/kotlinx-coroutines-core/common/src/EventLoop.common.kt index c4d4e272d7..f4f61b25d4 100644 --- a/kotlinx-coroutines-core/common/src/EventLoop.common.kt +++ b/kotlinx-coroutines-core/common/src/EventLoop.common.kt @@ -276,7 +276,7 @@ internal abstract class EventLoopImplBase: EventLoopImplPlatform(), Delay { // then process one event from queue val task = dequeue() if (task != null) { - task.run() + platformAutoreleasePool { task.run() } return 0 } return nextTime @@ -530,3 +530,14 @@ internal expect fun nanoTime(): Long internal expect object DefaultExecutor { public fun enqueue(task: Runnable) } + +/** + * Used by Darwin targets to wrap a [Runnable.run] call in an Objective-C Autorelease Pool. It is a no-op on JVM, JS and + * non-Darwin native targets. + * + * Coroutines on Darwin targets can call into the Objective-C world, where a callee may push a to-be-returned object to + * the Autorelease Pool, so as to avoid a premature ARC release before it reaches the caller. This means the pool must + * be eventually drained to avoid leaks. Since Kotlin Coroutines does not use [NSRunLoop], which provides automatic + * pool management, it must manage the pool creation and pool drainage manually. + */ +internal expect inline fun platformAutoreleasePool(crossinline block: () -> Unit) diff --git a/kotlinx-coroutines-core/common/src/channels/ArrayBroadcastChannel.kt b/kotlinx-coroutines-core/common/src/channels/ArrayBroadcastChannel.kt index 600eb6a951..0a96f75380 100644 --- a/kotlinx-coroutines-core/common/src/channels/ArrayBroadcastChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ArrayBroadcastChannel.kt @@ -33,6 +33,11 @@ internal class ArrayBroadcastChannel( require(capacity >= 1) { "ArrayBroadcastChannel capacity must be at least 1, but $capacity was specified" } } + /** + * NB: prior to changing any logic of ArrayBroadcastChannel internals, please ensure that + * you do not break internal invariants of the SubscriberList implementation on K/N and KJS + */ + /* * Writes to buffer are guarded by bufferLock, but reads from buffer are concurrent with writes * - Write element to buffer then write "tail" (volatile) @@ -60,6 +65,7 @@ internal class ArrayBroadcastChannel( get() = _size.value set(value) { _size.value = value } + @Suppress("DEPRECATION") private val subscribers = subscriberList>() override val isBufferAlwaysFull: Boolean get() = false diff --git a/kotlinx-coroutines-core/common/src/internal/Concurrent.common.kt b/kotlinx-coroutines-core/common/src/internal/Concurrent.common.kt index 9f2699ae48..fb254a0ebc 100644 --- a/kotlinx-coroutines-core/common/src/internal/Concurrent.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/Concurrent.common.kt @@ -8,10 +8,12 @@ package kotlinx.coroutines.internal * Special kind of list intended to be used as collection of subscribers in `ArrayBroadcastChannel` * On JVM it's CopyOnWriteList and on JS it's MutableList. * - * Note that this alias is intentionally not named as CopyOnWriteList to avoid accidental misusage outside of ArrayBroadcastChannel + * Note that this alias is intentionally not named as CopyOnWriteList to avoid accidental misusage outside of the ArrayBroadcastChannel */ internal typealias SubscribersList = MutableList +@Deprecated(message = "Implementation of this primitive is tailored to specific ArrayBroadcastChannel usages on K/N " + + "and K/JS platforms and it is unsafe to use it anywhere else") internal expect fun subscriberList(): SubscribersList internal expect class ReentrantLock() { diff --git a/kotlinx-coroutines-core/common/test/EmptyContext.kt b/kotlinx-coroutines-core/common/test/EmptyContext.kt index ad78429d2b..97efec34c9 100644 --- a/kotlinx-coroutines-core/common/test/EmptyContext.kt +++ b/kotlinx-coroutines-core/common/test/EmptyContext.kt @@ -7,10 +7,6 @@ package kotlinx.coroutines import kotlinx.coroutines.intrinsics.* import kotlin.coroutines.* -suspend fun withEmptyContext(block: suspend () -> T): T { - val baseline = Result.failure(IllegalStateException("Block was suspended")) - var result: Result = baseline - block.startCoroutineUnintercepted(Continuation(EmptyCoroutineContext) { result = it }) - while (result == baseline) yield() - return result.getOrThrow() +suspend fun withEmptyContext(block: suspend () -> T): T = suspendCoroutine { cont -> + block.startCoroutineUnintercepted(Continuation(EmptyCoroutineContext) { cont.resumeWith(it) }) } diff --git a/kotlinx-coroutines-core/common/test/TestBase.common.kt b/kotlinx-coroutines-core/common/test/TestBase.common.kt index 71c45769cb..8b7024a60a 100644 --- a/kotlinx-coroutines-core/common/test/TestBase.common.kt +++ b/kotlinx-coroutines-core/common/test/TestBase.common.kt @@ -7,11 +7,13 @@ package kotlinx.coroutines import kotlinx.coroutines.flow.* +import kotlinx.coroutines.internal.* import kotlin.coroutines.* import kotlin.test.* public expect val isStressTest: Boolean public expect val stressTestMultiplier: Int +public expect val stressTestMultiplierSqrt: Int /** * The result of a multiplatform asynchronous test. @@ -20,6 +22,8 @@ public expect val stressTestMultiplier: Int @Suppress("NO_ACTUAL_FOR_EXPECT") public expect class TestResult +public expect val isNative: Boolean + public expect open class TestBase constructor() { /* * In common tests we emulate parameterized tests diff --git a/kotlinx-coroutines-core/common/test/flow/FlowInvariantsTest.kt b/kotlinx-coroutines-core/common/test/flow/FlowInvariantsTest.kt index b5f1bf7bb8..5f39d3200d 100644 --- a/kotlinx-coroutines-core/common/test/flow/FlowInvariantsTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/FlowInvariantsTest.kt @@ -235,7 +235,7 @@ class FlowInvariantsTest : TestBase() { } expectUnreached() } catch (e: IllegalStateException) { - assertTrue(e.message!!.contains("Flow invariant is violated")) + assertTrue(e.message!!.contains("Flow invariant is violated"), "But had: ${e.message}") finish(2) } } diff --git a/kotlinx-coroutines-core/concurrent/src/Builders.concurrent.kt b/kotlinx-coroutines-core/concurrent/src/Builders.concurrent.kt new file mode 100644 index 0000000000..8a6c09231b --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/src/Builders.concurrent.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlin.coroutines.* + +/** + * Runs a new coroutine and **blocks** the current thread until its completion. + * This function should not be used from a coroutine. It is designed to bridge regular blocking code + * to libraries that are written in suspending style, to be used in `main` functions and in tests. + */ +public expect fun runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/src/CompletionHandler.kt b/kotlinx-coroutines-core/concurrent/src/CompletionHandler.kt similarity index 100% rename from kotlinx-coroutines-core/jvm/src/CompletionHandler.kt rename to kotlinx-coroutines-core/concurrent/src/CompletionHandler.kt diff --git a/kotlinx-coroutines-core/concurrent/src/MultithreadedDispatchers.common.kt b/kotlinx-coroutines-core/concurrent/src/MultithreadedDispatchers.common.kt new file mode 100644 index 0000000000..a2b4241f0f --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/src/MultithreadedDispatchers.common.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +@ExperimentalCoroutinesApi +public expect fun newSingleThreadContext(name: String): CloseableCoroutineDispatcher + +@ExperimentalCoroutinesApi +public expect fun newFixedThreadPoolContext(nThreads: Int, name: String): CloseableCoroutineDispatcher diff --git a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt similarity index 99% rename from kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt rename to kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt index 8b4517cb22..b4b36dad34 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/LockFreeLinkedList.kt +++ b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt @@ -7,6 +7,8 @@ package kotlinx.coroutines.internal import kotlinx.atomicfu.* import kotlinx.coroutines.* +import kotlin.jvm.* +import kotlin.native.concurrent.* private typealias Node = LockFreeLinkedListNode @@ -20,9 +22,11 @@ internal const val SUCCESS: Int = 1 internal const val FAILURE: Int = 2 @PublishedApi +@SharedImmutable internal val CONDITION_FALSE: Any = Symbol("CONDITION_FALSE") @PublishedApi +@SharedImmutable internal val LIST_EMPTY: Any = Symbol("LIST_EMPTY") /** @suppress **This is unstable API and it is subject to change.** */ @@ -616,7 +620,7 @@ public actual open class LockFreeLinkedListNode { assert { next === this._next.value } } - override fun toString(): String = "${this::class.java.simpleName}@${Integer.toHexString(System.identityHashCode(this))}" + override fun toString(): String = "${this::classSimpleName}@${this.hexAddress}" } private class Removed(@JvmField val ref: Node) { diff --git a/kotlinx-coroutines-core/concurrent/test/AbstractDispatcherConcurrencyTest.kt b/kotlinx-coroutines-core/concurrent/test/AbstractDispatcherConcurrencyTest.kt new file mode 100644 index 0000000000..8fc4f4efe0 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/AbstractDispatcherConcurrencyTest.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +import kotlinx.coroutines.channels.* +import kotlin.test.* + + +abstract class AbstractDispatcherConcurrencyTest : TestBase() { + + public abstract val dispatcher: CoroutineDispatcher + + @Test + fun testLaunchAndJoin() = runMtTest { + expect(1) + var capturedMutableState = 0 + val job = GlobalScope.launch(dispatcher) { + ++capturedMutableState + expect(2) + } + runBlocking { job.join() } + assertEquals(1, capturedMutableState) + finish(3) + } + + @Test + fun testDispatcherHasOwnThreads() = runMtTest { + val channel = Channel() + GlobalScope.launch(dispatcher) { + channel.send(42) + } + + var result = ChannelResult.failure() + while (!result.isSuccess) { + result = channel.tryReceive() + // Block the thread, wait + } + // Delivery was successful, let's check it + assertEquals(42, result.getOrThrow()) + } + + @Test + fun testDelayInDispatcher() = runMtTest { + expect(1) + val job = GlobalScope.launch(dispatcher) { + expect(2) + delay(100) + expect(3) + } + runBlocking { job.join() } + finish(4) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/AtomicCancellationTest.kt b/kotlinx-coroutines-core/concurrent/test/AtomicCancellationTest.kt similarity index 98% rename from kotlinx-coroutines-core/jvm/test/AtomicCancellationTest.kt rename to kotlinx-coroutines-core/concurrent/test/AtomicCancellationTest.kt index 2612b84153..74751fcc3f 100644 --- a/kotlinx-coroutines-core/jvm/test/AtomicCancellationTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/AtomicCancellationTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines @@ -142,4 +142,4 @@ class AtomicCancellationTest : TestBase() { yield() // to jobToJoin & canceller expect(6) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/concurrent/test/ConcurrentExceptionsStressTest.kt b/kotlinx-coroutines-core/concurrent/test/ConcurrentExceptionsStressTest.kt new file mode 100644 index 0000000000..d4252da300 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/ConcurrentExceptionsStressTest.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.exceptions.* +import kotlinx.coroutines.internal.* +import kotlin.test.* + +class ConcurrentExceptionsStressTest : TestBase() { + private val nWorkers = 4 + private val nRepeat = 1000 * stressTestMultiplier + + private var workers: Array = emptyArray() + + @AfterTest + fun tearDown() { + workers.forEach { + it.close() + } + } + + @Test + fun testStress() = runMtTest { + workers = Array(nWorkers) { index -> + newSingleThreadContext("JobExceptionsStressTest-$index") + } + + repeat(nRepeat) { + testOnce() + } + } + + @Suppress("SuspendFunctionOnCoroutineScope") // workaround native inline fun stacktraces + private suspend fun CoroutineScope.testOnce() { + val deferred = async(NonCancellable) { + repeat(nWorkers) { index -> + // Always launch a coroutine even if parent job was already cancelled (atomic start) + launch(workers[index], start = CoroutineStart.ATOMIC) { + randomWait() + throw StressException(index) + } + } + } + deferred.join() + assertTrue(deferred.isCancelled) + val completionException = deferred.getCompletionExceptionOrNull() + val cause = completionException as? StressException + ?: unexpectedException("completion", completionException) + val suppressed = cause.suppressed + val indices = listOf(cause.index) + suppressed.mapIndexed { index, e -> + (e as? StressException)?.index ?: unexpectedException("suppressed $index", e) + } + repeat(nWorkers) { index -> + assertTrue(index in indices, "Exception $index is missing: $indices") + } + assertEquals(nWorkers, indices.size, "Duplicated exceptions in list: $indices") + } + + private fun unexpectedException(msg: String, e: Throwable?): Nothing { + throw IllegalStateException("Unexpected $msg exception", e) + } + + private class StressException(val index: Int) : SuppressSupportingThrowable() +} + diff --git a/kotlinx-coroutines-core/concurrent/test/ConcurrentTestUtilities.common.kt b/kotlinx-coroutines-core/concurrent/test/ConcurrentTestUtilities.common.kt new file mode 100644 index 0000000000..a4d40fb2ef --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/ConcurrentTestUtilities.common.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.exceptions + +import kotlinx.coroutines.* + +internal expect open class SuppressSupportingThrowable() : Throwable +expect val Throwable.suppressed: Array +expect fun Throwable.printStackTrace() + +expect fun randomWait() + +expect fun currentThreadName(): String + +inline fun CloseableCoroutineDispatcher.use(block: (CloseableCoroutineDispatcher) -> Unit) { + try { + block(this) + } finally { + close() + } +} diff --git a/kotlinx-coroutines-core/concurrent/test/DefaultDispatcherConcurrencyTest.kt b/kotlinx-coroutines-core/concurrent/test/DefaultDispatcherConcurrencyTest.kt new file mode 100644 index 0000000000..a12930cc12 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/DefaultDispatcherConcurrencyTest.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +class DefaultDispatcherConcurrencyTest : AbstractDispatcherConcurrencyTest() { + override val dispatcher: CoroutineDispatcher = Dispatchers.Default +} diff --git a/kotlinx-coroutines-core/jvm/test/JobStructuredJoinStressTest.kt b/kotlinx-coroutines-core/concurrent/test/JobStructuredJoinStressTest.kt similarity index 86% rename from kotlinx-coroutines-core/jvm/test/JobStructuredJoinStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/JobStructuredJoinStressTest.kt index 50d86f32be..431bb697fd 100644 --- a/kotlinx-coroutines-core/jvm/test/JobStructuredJoinStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/JobStructuredJoinStressTest.kt @@ -1,11 +1,11 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines -import org.junit.* import kotlin.coroutines.* +import kotlin.test.* /** * Test a race between job failure and join. @@ -16,12 +16,12 @@ class JobStructuredJoinStressTest : TestBase() { private val nRepeats = 10_000 * stressTestMultiplier @Test - fun testStressRegularJoin() { + fun testStressRegularJoin() = runMtTest { stress(Job::join) } @Test - fun testStressSuspendCancellable() { + fun testStressSuspendCancellable() = runMtTest { stress { job -> suspendCancellableCoroutine { cont -> job.invokeOnCompletion { cont.resume(Unit) } @@ -30,7 +30,7 @@ class JobStructuredJoinStressTest : TestBase() { } @Test - fun testStressSuspendCancellableReusable() { + fun testStressSuspendCancellableReusable() = runMtTest { stress { job -> suspendCancellableCoroutineReusable { cont -> job.invokeOnCompletion { cont.resume(Unit) } @@ -61,4 +61,4 @@ class JobStructuredJoinStressTest : TestBase() { } finish(2 + nRepeats) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt b/kotlinx-coroutines-core/concurrent/test/RunBlockingTest.kt similarity index 66% rename from kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt rename to kotlinx-coroutines-core/concurrent/test/RunBlockingTest.kt index de38df6b26..70f6b8ba60 100644 --- a/kotlinx-coroutines-core/jvm/test/RunBlockingTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/RunBlockingTest.kt @@ -1,16 +1,16 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ - package kotlinx.coroutines +import kotlinx.coroutines.exceptions.* import kotlin.coroutines.* import kotlin.test.* class RunBlockingTest : TestBase() { @Test - fun testWithTimeoutBusyWait() = runBlocking { + fun testWithTimeoutBusyWait() = runMtTest { val value = withTimeoutOrNull(10) { while (isActive) { // Busy wait @@ -52,14 +52,14 @@ class RunBlockingTest : TestBase() { } @Test - fun testOtherDispatcher() { + fun testOtherDispatcher() = runMtTest { expect(1) val name = "RunBlockingTest.testOtherDispatcher" val thread = newSingleThreadContext(name) runBlocking(thread) { expect(2) assertSame(coroutineContext[ContinuationInterceptor], thread) - assertTrue(Thread.currentThread().name.contains(name)) + assertTrue(currentThreadName().contains(name)) yield() // should work expect(3) } @@ -67,19 +67,20 @@ class RunBlockingTest : TestBase() { thread.close() } - @Test - fun testCancellation() = newFixedThreadPoolContext(2, "testCancellation").use { - val job = GlobalScope.launch(it) { - runBlocking(coroutineContext) { - while (true) { - yield() + fun testCancellation() = runMtTest { + newFixedThreadPoolContext(2, "testCancellation").use { + val job = GlobalScope.launch(it) { + runBlocking(coroutineContext) { + while (true) { + yield() + } } } - } - runBlocking { - job.cancelAndJoin() + runBlocking { + job.cancelAndJoin() + } } } @@ -104,40 +105,44 @@ class RunBlockingTest : TestBase() { } } - @Test(expected = CancellationException::class) - fun testDispatchOnShutdown() = runBlocking { - expect(1) - val job = launch(NonCancellable) { - try { - expect(2) - delay(Long.MAX_VALUE) - } finally { - finish(4) + @Test + fun testDispatchOnShutdown(): Unit = assertFailsWith { + runBlocking { + expect(1) + val job = launch(NonCancellable) { + try { + expect(2) + delay(Long.MAX_VALUE) + } finally { + finish(4) + } } - } - yield() - expect(3) - coroutineContext.cancel() - job.cancel() - } + yield() + expect(3) + coroutineContext.cancel() + job.cancel() + } + }.let { } - @Test(expected = CancellationException::class) - fun testDispatchOnShutdown2() = runBlocking { - coroutineContext.cancel() - expect(1) - val job = launch(NonCancellable, start = CoroutineStart.UNDISPATCHED) { - try { - expect(2) - delay(Long.MAX_VALUE) - } finally { - finish(4) + @Test + fun testDispatchOnShutdown2(): Unit = assertFailsWith { + runBlocking { + coroutineContext.cancel() + expect(1) + val job = launch(NonCancellable, start = CoroutineStart.UNDISPATCHED) { + try { + expect(2) + delay(Long.MAX_VALUE) + } finally { + finish(4) + } } - } - expect(3) - job.cancel() - } + expect(3) + job.cancel() + } + }.let { } @Test fun testNestedRunBlocking() = runBlocking { @@ -157,21 +162,12 @@ class RunBlockingTest : TestBase() { fun testIncompleteState() { val handle = runBlocking { // See #835 - coroutineContext[Job]!!.invokeOnCompletion { } + coroutineContext[Job]!!.invokeOnCompletion { } } handle.dispose() } - @Test - fun testContract() { - val rb: Int - runBlocking { - rb = 42 - } - rb.hashCode() // unused - } - @Test fun testCancelledParent() { val job = Job() diff --git a/kotlinx-coroutines-core/concurrent/test/TestBaseExtension.common.kt b/kotlinx-coroutines-core/concurrent/test/TestBaseExtension.common.kt new file mode 100644 index 0000000000..b19bf50ec8 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/TestBaseExtension.common.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +expect fun TestBase.runMtTest( + expected: ((Throwable) -> Boolean)? = null, + unhandled: List<(Throwable) -> Boolean> = emptyList(), + block: suspend CoroutineScope.() -> Unit +): TestResult diff --git a/kotlinx-coroutines-core/concurrent/test/channels/BroadcastChannelSubStressTest.kt b/kotlinx-coroutines-core/concurrent/test/channels/BroadcastChannelSubStressTest.kt new file mode 100644 index 0000000000..30b1075c0a --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/channels/BroadcastChannelSubStressTest.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.channels + +import kotlinx.atomicfu.* +import kotlinx.coroutines.* +import kotlin.test.* + +/** + * Creates a broadcast channel and repeatedly opens new subscription, receives event, closes it, + * to stress test the logic of opening the subscription + * to broadcast channel while events are being concurrently sent to it. + */ +class BroadcastChannelSubStressTest: TestBase() { + + private val nSeconds = 5 * stressTestMultiplier + private val sentTotal = atomic(0L) + private val receivedTotal = atomic(0L) + + @Test + fun testStress() = runMtTest { + TestBroadcastChannelKind.values().forEach { kind -> + println("--- BroadcastChannelSubStressTest $kind") + val broadcast = kind.create() + val sender = + launch(context = Dispatchers.Default + CoroutineName("Sender")) { + while (isActive) { + broadcast.send(sentTotal.incrementAndGet()) + } + } + val receiver = + launch(context = Dispatchers.Default + CoroutineName("Receiver")) { + var last = -1L + while (isActive) { + val channel = broadcast.openSubscription() + val i = channel.receive() + check(i >= last) { "Last was $last, got $i" } + if (!kind.isConflated) check(i != last) { "Last was $last, got it again" } + receivedTotal.incrementAndGet() + last = i + channel.cancel() + } + } + var prevSent = -1L + repeat(nSeconds) { sec -> + delay(1000) + val curSent = sentTotal.value + println("${sec + 1}: Sent $curSent, received ${receivedTotal.value}") + check(curSent > prevSent) { "Send stalled at $curSent events" } + prevSent = curSent + } + withTimeout(5000) { + sender.cancelAndJoin() + receiver.cancelAndJoin() + } + } + } +} diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt b/kotlinx-coroutines-core/concurrent/test/channels/ChannelCancelUndeliveredElementStressTest.kt similarity index 89% rename from kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/channels/ChannelCancelUndeliveredElementStressTest.kt index 86adfee049..3e38eec362 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelCancelUndeliveredElementStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/channels/ChannelCancelUndeliveredElementStressTest.kt @@ -4,14 +4,14 @@ package kotlinx.coroutines.channels +import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.selects.* -import java.util.concurrent.atomic.* import kotlin.random.* import kotlin.test.* class ChannelCancelUndeliveredElementStressTest : TestBase() { - private val repeatTimes = 10_000 * stressTestMultiplier + private val repeatTimes = (if (isNative) 1_000 else 10_000) * stressTestMultiplier // total counters private var sendCnt = 0 @@ -25,10 +25,10 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { private var dSendExceptionCnt = 0 private var dTrySendFailedCnt = 0 private var dReceivedCnt = 0 - private val dUndeliveredCnt = AtomicInteger() + private val dUndeliveredCnt = atomic(0) @Test - fun testStress() = runTest { + fun testStress() = runMtTest { repeat(repeatTimes) { val channel = Channel(1) { dUndeliveredCnt.incrementAndGet() } val j1 = launch(Dispatchers.Default) { @@ -43,23 +43,23 @@ class ChannelCancelUndeliveredElementStressTest : TestBase() { joinAll(j1, j2) // All elements must be either received or undelivered (IN every run) - if (dSendCnt - dTrySendFailedCnt != dReceivedCnt + dUndeliveredCnt.get()) { + if (dSendCnt - dTrySendFailedCnt != dReceivedCnt + dUndeliveredCnt.value) { println(" Send: $dSendCnt") println("Send exception: $dSendExceptionCnt") println("trySend failed: $dTrySendFailedCnt") println(" Received: $dReceivedCnt") - println(" Undelivered: ${dUndeliveredCnt.get()}") + println(" Undelivered: ${dUndeliveredCnt.value}") error("Failed") } trySendFailedCnt += dTrySendFailedCnt receivedCnt += dReceivedCnt - undeliveredCnt += dUndeliveredCnt.get() + undeliveredCnt += dUndeliveredCnt.value // clear for next run dSendCnt = 0 dSendExceptionCnt = 0 dTrySendFailedCnt = 0 dReceivedCnt = 0 - dUndeliveredCnt.set(0) + dUndeliveredCnt.value = 0 } // Stats println(" Send: $sendCnt") diff --git a/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt b/kotlinx-coroutines-core/concurrent/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt similarity index 70% rename from kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt index 2b3c05bcc6..5da00d2af2 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/channels/ConflatedBroadcastChannelNotifyStressTest.kt @@ -1,29 +1,28 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.channels +import kotlinx.atomicfu.* import kotlinx.coroutines.* -import org.junit.Test -import java.util.concurrent.atomic.* import kotlin.test.* class ConflatedBroadcastChannelNotifyStressTest : TestBase() { private val nSenders = 2 private val nReceivers = 3 - private val nEvents = 500_000 * stressTestMultiplier + private val nEvents = (if (isNative) 5_000 else 500_000) * stressTestMultiplier private val timeLimit = 30_000L * stressTestMultiplier // 30 sec private val broadcast = ConflatedBroadcastChannel() - private val sendersCompleted = AtomicInteger() - private val receiversCompleted = AtomicInteger() - private val sentTotal = AtomicInteger() - private val receivedTotal = AtomicInteger() + private val sendersCompleted = atomic(0) + private val receiversCompleted = atomic(0) + private val sentTotal = atomic(0) + private val receivedTotal = atomic(0) @Test - fun testStressNotify()= runBlocking { + fun testStressNotify()= runMtTest { println("--- ConflatedBroadcastChannelNotifyStressTest") val senders = List(nSenders) { senderId -> launch(Dispatchers.Default + CoroutineName("Sender$senderId")) { @@ -57,7 +56,7 @@ class ConflatedBroadcastChannelNotifyStressTest : TestBase() { var seconds = 0 while (true) { delay(1000) - println("${++seconds}: Sent ${sentTotal.get()}, received ${receivedTotal.get()}") + println("${++seconds}: Sent ${sentTotal.value}, received ${receivedTotal.value}") } } try { @@ -71,13 +70,13 @@ class ConflatedBroadcastChannelNotifyStressTest : TestBase() { } progressJob.cancel() println("Tested with nSenders=$nSenders, nReceivers=$nReceivers") - println("Completed successfully ${sendersCompleted.get()} sender coroutines") - println("Completed successfully ${receiversCompleted.get()} receiver coroutines") - println(" Sent ${sentTotal.get()} events") - println(" Received ${receivedTotal.get()} events") - assertEquals(nSenders, sendersCompleted.get()) - assertEquals(nReceivers, receiversCompleted.get()) - assertEquals(nEvents, sentTotal.get()) + println("Completed successfully ${sendersCompleted.value} sender coroutines") + println("Completed successfully ${receiversCompleted.value} receiver coroutines") + println(" Sent ${sentTotal.value} events") + println(" Received ${receivedTotal.value} events") + assertEquals(nSenders, sendersCompleted.value) + assertEquals(nReceivers, receiversCompleted.value) + assertEquals(nEvents, sentTotal.value) } private suspend fun waitForEvent(): Int = diff --git a/kotlinx-coroutines-core/jvm/test/flow/CombineStressTest.kt b/kotlinx-coroutines-core/concurrent/test/flow/CombineStressTest.kt similarity index 89% rename from kotlinx-coroutines-core/jvm/test/flow/CombineStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/flow/CombineStressTest.kt index 3b5c36f9e9..f262e78f81 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/CombineStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/flow/CombineStressTest.kt @@ -1,16 +1,16 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.flow import kotlinx.coroutines.* -import org.junit.* +import kotlin.test.* class CombineStressTest : TestBase() { @Test - public fun testCancellation() = runTest { + fun testCancellation() = runMtTest { withContext(Dispatchers.Default + CoroutineExceptionHandler { _, _ -> expectUnreached() }) { flow { expect(1) @@ -26,7 +26,7 @@ class CombineStressTest : TestBase() { } @Test - public fun testFailure() = runTest { + fun testFailure() = runMtTest { val innerIterations = 100 * stressTestMultiplierSqrt val outerIterations = 10 * stressTestMultiplierSqrt withContext(Dispatchers.Default + CoroutineExceptionHandler { _, _ -> expectUnreached() }) { diff --git a/kotlinx-coroutines-core/jvm/test/flow/FlowCancellationTest.kt b/kotlinx-coroutines-core/concurrent/test/flow/FlowCancellationTest.kt similarity index 83% rename from kotlinx-coroutines-core/jvm/test/flow/FlowCancellationTest.kt rename to kotlinx-coroutines-core/concurrent/test/flow/FlowCancellationTest.kt index 269805f9b6..286ba751dd 100644 --- a/kotlinx-coroutines-core/jvm/test/flow/FlowCancellationTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/flow/FlowCancellationTest.kt @@ -1,17 +1,18 @@ /* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.flow import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* import kotlin.test.* class FlowCancellationTest : TestBase() { @Test - fun testEmitIsCooperative() = runTest { + fun testEmitIsCooperative() = runMtTest { val latch = Channel(1) val job = flow { expect(1) @@ -28,7 +29,7 @@ class FlowCancellationTest : TestBase() { } @Test - fun testIsActiveOnCurrentContext() = runTest { + fun testIsActiveOnCurrentContext() = runMtTest { val latch = Channel(1) val job = flow { expect(1) @@ -45,7 +46,7 @@ class FlowCancellationTest : TestBase() { } @Test - fun testFlowWithEmptyContext() = runTest { + fun testFlowWithEmptyContext() = runMtTest { expect(1) withEmptyContext { val flow = flow { @@ -59,4 +60,4 @@ class FlowCancellationTest : TestBase() { } finish(4) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/concurrent/test/flow/StateFlowCommonStressTest.kt b/kotlinx-coroutines-core/concurrent/test/flow/StateFlowCommonStressTest.kt new file mode 100644 index 0000000000..f2fb41a589 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/flow/StateFlowCommonStressTest.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import kotlin.random.* +import kotlin.test.* + +// A simplified version of StateFlowStressTest +class StateFlowCommonStressTest : TestBase() { + private val state = MutableStateFlow(0) + + @Test + fun testSingleEmitterAndCollector() = runMtTest { + var collected = 0L + val collector = launch(Dispatchers.Default) { + // collect, but abort and collect again after every 1000 values to stress allocation/deallocation + do { + val batchSize = Random.nextInt(1..1000) + var index = 0 + val cnt = state.onEach { value -> + // the first value in batch is allowed to repeat, but cannot go back + val ok = if (index++ == 0) value >= collected else value > collected + check(ok) { + "Values must be monotonic, but $value is not, was $collected" + } + collected = value + }.take(batchSize).map { 1 }.sum() + } while (cnt == batchSize) + } + + var current = 1L + val emitter = launch { + while (true) { + state.value = current++ + if (current % 1000 == 0L) yield() // make it cancellable + } + } + + delay(3000) + emitter.cancelAndJoin() + collector.cancelAndJoin() + assertTrue { current >= collected / 2 } + } +} diff --git a/kotlinx-coroutines-core/concurrent/test/flow/StateFlowUpdateCommonTest.kt b/kotlinx-coroutines-core/concurrent/test/flow/StateFlowUpdateCommonTest.kt new file mode 100644 index 0000000000..1e79709481 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/flow/StateFlowUpdateCommonTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlin.test.* + +// A simplified version of StateFlowUpdateStressTest +class StateFlowUpdateCommonTest : TestBase() { + private val iterations = 100_000 * stressTestMultiplier + + @Test + fun testUpdate() = doTest { update { it + 1 } } + + @Test + fun testUpdateAndGet() = doTest { updateAndGet { it + 1 } } + + @Test + fun testGetAndUpdate() = doTest { getAndUpdate { it + 1 } } + + private fun doTest(increment: MutableStateFlow.() -> Unit) = runMtTest { + val flow = MutableStateFlow(0) + val j1 = launch(Dispatchers.Default) { + repeat(iterations / 2) { + flow.increment() + } + } + + repeat(iterations / 2) { + flow.increment() + } + + joinAll(j1) + assertEquals(iterations, flow.value) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListTest.kt b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt similarity index 97% rename from kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListTest.kt rename to kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt index b9011448cd..7e85d495fc 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt @@ -1,10 +1,9 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.internal -import org.junit.Test import kotlin.test.* class LockFreeLinkedListTest { @@ -82,4 +81,4 @@ class LockFreeLinkedListTest { for (i in 0 until n) assertEquals(expected[i], actual[i], "item $i") assertEquals(expected.isEmpty(), list.isEmpty) } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-core/jvm/test/selects/SelectChannelStressTest.kt b/kotlinx-coroutines-core/concurrent/test/selects/SelectChannelStressTest.kt similarity index 65% rename from kotlinx-coroutines-core/jvm/test/selects/SelectChannelStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/selects/SelectChannelStressTest.kt index 200cdc09b0..29c6c34889 100644 --- a/kotlinx-coroutines-core/jvm/test/selects/SelectChannelStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/selects/SelectChannelStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.selects @@ -11,61 +11,60 @@ import kotlin.test.* class SelectChannelStressTest: TestBase() { + // Running less iterations on native platforms because of some performance regression + private val iterations = (if (isNative) 1_000 else 1_000_000) * stressTestMultiplier + @Test - fun testSelectSendResourceCleanupArrayChannel() = runTest { + fun testSelectSendResourceCleanupArrayChannel() = runMtTest { val channel = Channel(1) - val n = 10_000_000 * stressTestMultiplier expect(1) channel.send(-1) // fill the buffer, so all subsequent sends cannot proceed - repeat(n) { i -> + repeat(iterations) { i -> select { channel.onSend(i) { expectUnreached() } default { expect(i + 2) } } } - finish(n + 2) + finish(iterations + 2) } @Test - fun testSelectReceiveResourceCleanupArrayChannel() = runTest { + fun testSelectReceiveResourceCleanupArrayChannel() = runMtTest { val channel = Channel(1) - val n = 10_000_000 * stressTestMultiplier expect(1) - repeat(n) { i -> + repeat(iterations) { i -> select { channel.onReceive { expectUnreached() } default { expect(i + 2) } } } - finish(n + 2) + finish(iterations + 2) } @Test - fun testSelectSendResourceCleanupRendezvousChannel() = runTest { + fun testSelectSendResourceCleanupRendezvousChannel() = runMtTest { val channel = Channel(Channel.RENDEZVOUS) - val n = 1_000_000 * stressTestMultiplier expect(1) - repeat(n) { i -> + repeat(iterations) { i -> select { channel.onSend(i) { expectUnreached() } default { expect(i + 2) } } } - finish(n + 2) + finish(iterations + 2) } @Test - fun testSelectReceiveResourceRendezvousChannel() = runTest { + fun testSelectReceiveResourceRendezvousChannel() = runMtTest { val channel = Channel(Channel.RENDEZVOUS) - val n = 1_000_000 * stressTestMultiplier expect(1) - repeat(n) { i -> + repeat(iterations) { i -> select { channel.onReceive { expectUnreached() } default { expect(i + 2) } } } - finish(n + 2) + finish(iterations + 2) } internal fun SelectBuilder.default(block: suspend () -> R) { diff --git a/kotlinx-coroutines-core/jvm/test/selects/SelectMutexStressTest.kt b/kotlinx-coroutines-core/concurrent/test/selects/SelectMutexStressTest.kt similarity index 93% rename from kotlinx-coroutines-core/jvm/test/selects/SelectMutexStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/selects/SelectMutexStressTest.kt index 5489ea5d73..8f649c2fb8 100644 --- a/kotlinx-coroutines-core/jvm/test/selects/SelectMutexStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/selects/SelectMutexStressTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.selects diff --git a/kotlinx-coroutines-core/jvm/test/sync/MutexStressTest.kt b/kotlinx-coroutines-core/concurrent/test/sync/MutexStressTest.kt similarity index 73% rename from kotlinx-coroutines-core/jvm/test/sync/MutexStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/sync/MutexStressTest.kt index 027f3c514d..73b62aee2e 100644 --- a/kotlinx-coroutines-core/jvm/test/sync/MutexStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/sync/MutexStressTest.kt @@ -1,22 +1,49 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.sync import kotlinx.coroutines.* +import kotlinx.coroutines.exceptions.* import kotlinx.coroutines.selects.* import kotlin.test.* class MutexStressTest : TestBase() { + + private val n = (if (isNative) 1_000 else 10_000) * stressTestMultiplier + @Test - fun testStress() = runBlocking(Dispatchers.Default) { - val n = 1000 * stressTestMultiplier + fun testDefaultDispatcher() = runMtTest { testBody(Dispatchers.Default) } + + @Test + fun testSingleThreadContext() = runMtTest { + newSingleThreadContext("testSingleThreadContext").use { + testBody(it) + } + } + + @Test + fun testMultiThreadedContextWithSingleWorker() = runMtTest { + newFixedThreadPoolContext(1, "testMultiThreadedContextWithSingleWorker").use { + testBody(it) + } + } + + @Test + fun testMultiThreadedContext() = runMtTest { + newFixedThreadPoolContext(8, "testMultiThreadedContext").use { + testBody(it) + } + } + + @Suppress("SuspendFunctionOnCoroutineScope") + private suspend fun CoroutineScope.testBody(dispatcher: CoroutineDispatcher) { val k = 100 var shared = 0 val mutex = Mutex() val jobs = List(n) { - launch { + launch(dispatcher) { repeat(k) { mutex.lock() shared++ @@ -29,11 +56,11 @@ class MutexStressTest : TestBase() { } @Test - fun stressUnlockCancelRace() = runTest { + fun stressUnlockCancelRace() = runMtTest { val n = 10_000 * stressTestMultiplier val mutex = Mutex(true) // create a locked mutex newSingleThreadContext("SemaphoreStressTest").use { pool -> - repeat (n) { + repeat(n) { // Initially, we hold the lock and no one else can `lock`, // otherwise it's a bug. assertTrue(mutex.isLocked) @@ -59,11 +86,11 @@ class MutexStressTest : TestBase() { } @Test - fun stressUnlockCancelRaceWithSelect() = runTest { + fun stressUnlockCancelRaceWithSelect() = runMtTest { val n = 10_000 * stressTestMultiplier val mutex = Mutex(true) // create a locked mutex newSingleThreadContext("SemaphoreStressTest").use { pool -> - repeat (n) { + repeat(n) { // Initially, we hold the lock and no one else can `lock`, // otherwise it's a bug. assertTrue(mutex.isLocked) @@ -92,7 +119,7 @@ class MutexStressTest : TestBase() { } @Test - fun testShouldBeUnlockedOnCancellation() = runTest { + fun testShouldBeUnlockedOnCancellation() = runMtTest { val mutex = Mutex() val n = 1000 * stressTestMultiplier repeat(n) { diff --git a/kotlinx-coroutines-core/jvm/test/sync/SemaphoreStressTest.kt b/kotlinx-coroutines-core/concurrent/test/sync/SemaphoreStressTest.kt similarity index 69% rename from kotlinx-coroutines-core/jvm/test/sync/SemaphoreStressTest.kt rename to kotlinx-coroutines-core/concurrent/test/sync/SemaphoreStressTest.kt index 2ceed64b95..c5f2038937 100644 --- a/kotlinx-coroutines-core/jvm/test/sync/SemaphoreStressTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/sync/SemaphoreStressTest.kt @@ -1,18 +1,25 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + package kotlinx.coroutines.sync import kotlinx.coroutines.* -import org.junit.Test +import kotlinx.coroutines.exceptions.* import kotlin.test.* class SemaphoreStressTest : TestBase() { + + private val iterations = (if (isNative) 1_000 else 10_000) * stressTestMultiplier + @Test - fun stressTestAsMutex() = runBlocking(Dispatchers.Default) { - val n = 10_000 * stressTestMultiplier + fun testStressTestAsMutex() = runMtTest { + val n = iterations val k = 100 var shared = 0 val semaphore = Semaphore(1) val jobs = List(n) { - launch { + launch(Dispatchers.Default) { repeat(k) { semaphore.acquire() shared++ @@ -25,12 +32,12 @@ class SemaphoreStressTest : TestBase() { } @Test - fun stressTest() = runBlocking(Dispatchers.Default) { - val n = 10_000 * stressTestMultiplier + fun testStress() = runMtTest { + val n = iterations val k = 100 val semaphore = Semaphore(10) val jobs = List(n) { - launch { + launch(Dispatchers.Default) { repeat(k) { semaphore.acquire() semaphore.release() @@ -41,12 +48,33 @@ class SemaphoreStressTest : TestBase() { } @Test - fun stressCancellation() = runBlocking(Dispatchers.Default) { - val n = 10_000 * stressTestMultiplier + fun testStressAsMutex() = runMtTest { + runBlocking(Dispatchers.Default) { + val n = iterations + val k = 100 + var shared = 0 + val semaphore = Semaphore(1) + val jobs = List(n) { + launch { + repeat(k) { + semaphore.acquire() + shared++ + semaphore.release() + } + } + } + jobs.forEach { it.join() } + assertEquals(n * k, shared) + } + } + + @Test + fun testStressCancellation() = runMtTest { + val n = iterations val semaphore = Semaphore(1) semaphore.acquire() repeat(n) { - val job = launch { + val job = launch(Dispatchers.Default) { semaphore.acquire() } yield() @@ -62,8 +90,8 @@ class SemaphoreStressTest : TestBase() { * the semaphore into an incorrect state where permits are leaked. */ @Test - fun stressReleaseCancelRace() = runTest { - val n = 10_000 * stressTestMultiplier + fun testStressReleaseCancelRace() = runMtTest { + val n = iterations val semaphore = Semaphore(1, 1) newSingleThreadContext("SemaphoreStressTest").use { pool -> repeat (n) { @@ -92,7 +120,7 @@ class SemaphoreStressTest : TestBase() { } @Test - fun testShouldBeUnlockedOnCancellation() = runTest { + fun testShouldBeUnlockedOnCancellation() = runMtTest { val semaphore = Semaphore(1) val n = 1000 * stressTestMultiplier repeat(n) { diff --git a/kotlinx-coroutines-core/js/src/EventLoop.kt b/kotlinx-coroutines-core/js/src/EventLoop.kt index b3a1364107..13c336969b 100644 --- a/kotlinx-coroutines-core/js/src/EventLoop.kt +++ b/kotlinx-coroutines-core/js/src/EventLoop.kt @@ -25,3 +25,5 @@ internal actual object DefaultExecutor { private fun unsupported(): Nothing = throw UnsupportedOperationException("runBlocking event loop is not supported") + +internal actual inline fun platformAutoreleasePool(crossinline block: () -> Unit) = block() diff --git a/kotlinx-coroutines-core/js/src/internal/Concurrent.kt b/kotlinx-coroutines-core/js/src/internal/Concurrent.kt index 0a1b03104e..71f652271a 100644 --- a/kotlinx-coroutines-core/js/src/internal/Concurrent.kt +++ b/kotlinx-coroutines-core/js/src/internal/Concurrent.kt @@ -16,3 +16,4 @@ internal class NoOpLock { internal actual fun subscriberList(): SubscribersList = CopyOnWriteList() internal actual fun identitySet(expectedSize: Int): MutableSet = HashSet(expectedSize) + diff --git a/kotlinx-coroutines-core/js/test/PromiseTest.kt b/kotlinx-coroutines-core/js/test/PromiseTest.kt index cc1297cd78..6049a908cf 100644 --- a/kotlinx-coroutines-core/js/test/PromiseTest.kt +++ b/kotlinx-coroutines-core/js/test/PromiseTest.kt @@ -16,7 +16,7 @@ class PromiseTest : TestBase() { val deferred = promise.asDeferred() assertEquals("OK", deferred.await()) } - + @Test fun testPromiseRejectedAsDeferred() = GlobalScope.promise { lateinit var promiseReject: (Throwable) -> Unit diff --git a/kotlinx-coroutines-core/js/test/TestBase.kt b/kotlinx-coroutines-core/js/test/TestBase.kt index cc7865ba07..c930c20030 100644 --- a/kotlinx-coroutines-core/js/test/TestBase.kt +++ b/kotlinx-coroutines-core/js/test/TestBase.kt @@ -8,10 +8,13 @@ import kotlin.js.* public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 +public actual val stressTestMultiplierSqrt: Int = 1 @Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") public actual typealias TestResult = Promise +public actual val isNative = false + public actual open class TestBase actual constructor() { public actual val isBoundByJsTestTimeout = true private var actionIndex = 0 diff --git a/kotlinx-coroutines-core/jvm/src/Builders.kt b/kotlinx-coroutines-core/jvm/src/Builders.kt index edb4303198..8c4b62b19d 100644 --- a/kotlinx-coroutines-core/jvm/src/Builders.kt +++ b/kotlinx-coroutines-core/jvm/src/Builders.kt @@ -35,7 +35,7 @@ import kotlin.coroutines.* * @param block the coroutine code. */ @Throws(InterruptedException::class) -public fun runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T { +public actual fun runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } diff --git a/kotlinx-coroutines-core/jvm/src/EventLoop.kt b/kotlinx-coroutines-core/jvm/src/EventLoop.kt index b17d1dad25..1ee651aa41 100644 --- a/kotlinx-coroutines-core/jvm/src/EventLoop.kt +++ b/kotlinx-coroutines-core/jvm/src/EventLoop.kt @@ -46,3 +46,5 @@ internal actual fun createEventLoop(): EventLoop = BlockingEventLoop(Thread.curr @InternalCoroutinesApi public fun processNextEventInCurrentThread(): Long = ThreadLocalEventLoop.currentOrNull()?.processNextEvent() ?: Long.MAX_VALUE + +internal actual inline fun platformAutoreleasePool(crossinline block: () -> Unit) = block() diff --git a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt index 32df8bfcdf..dc0b7e29c5 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadPoolDispatcher.kt @@ -31,7 +31,7 @@ import java.util.concurrent.atomic.AtomicInteger * @param name the base name of the created thread. */ @DelicateCoroutinesApi -public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = +public actual fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = newFixedThreadPoolContext(1, name) /** @@ -59,7 +59,7 @@ public fun newSingleThreadContext(name: String): ExecutorCoroutineDispatcher = * @param name the base name of the created threads. */ @DelicateCoroutinesApi -public fun newFixedThreadPoolContext(nThreads: Int, name: String): ExecutorCoroutineDispatcher { +public actual fun newFixedThreadPoolContext(nThreads: Int, name: String): ExecutorCoroutineDispatcher { require(nThreads >= 1) { "Expected at least one thread, but $nThreads specified" } val threadNo = AtomicInteger() val executor = Executors.newScheduledThreadPool(nThreads) { runnable -> diff --git a/kotlinx-coroutines-core/jvm/test/ConcurrentTestUtilities.kt b/kotlinx-coroutines-core/jvm/test/ConcurrentTestUtilities.kt new file mode 100644 index 0000000000..b46adda90d --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ConcurrentTestUtilities.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.exceptions + +import kotlin.random.* + +actual fun randomWait() { + val n = Random.nextInt(1000) + if (n < 500) return // no wait 50% of time + repeat(n) { + BlackHole.sink *= 3 + } + if (n > 900) Thread.yield() +} + +private object BlackHole { + @Volatile + var sink = 1 +} + +@Suppress("ACTUAL_WITHOUT_EXPECT") +internal actual typealias SuppressSupportingThrowable = Throwable + +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") +actual fun Throwable.printStackTrace() = printStackTrace() + +actual fun currentThreadName(): String = Thread.currentThread().name diff --git a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt index 179b2e5e6e..52bcce3c69 100644 --- a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt +++ b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt @@ -78,9 +78,8 @@ object FieldWalker { val path = ArrayList() var cur = element while (true) { - val ref = visited.getValue(cur) - if (ref is Ref.RootRef) break - when (ref) { + when (val ref = visited.getValue(cur)) { + Ref.RootRef -> break is Ref.FieldRef -> { cur = ref.parent path += "|${ref.parent.javaClass.simpleName}::${ref.name}" @@ -89,7 +88,9 @@ object FieldWalker { cur = ref.parent path += "[${ref.index}]" } - else -> error("Should not be reached") + else -> { + // Nothing, kludge for IDE + } } } path.reverse() diff --git a/kotlinx-coroutines-core/jvm/test/RunBlockingJvmTest.kt b/kotlinx-coroutines-core/jvm/test/RunBlockingJvmTest.kt new file mode 100644 index 0000000000..057a8bbc96 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/RunBlockingJvmTest.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +import org.junit.* + +class RunBlockingJvmTest : TestBase() { + @Test + fun testContract() { + val rb: Int + runBlocking { + rb = 42 + } + rb.hashCode() // unused + } +} + diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index 72a4a2cf2c..f089241c63 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -20,15 +20,18 @@ private val VERBOSE = systemProp("test.verbose", false) */ public actual val isStressTest = System.getProperty("stressTest")?.toBoolean() ?: false -public val stressTestMultiplierSqrt = if (isStressTest) 5 else 1 +public actual val stressTestMultiplierSqrt = if (isStressTest) 5 else 1 private const val SHUTDOWN_TIMEOUT = 1_000L // 1s at most to wait per thread +public actual val isNative = false + /** * Multiply various constants in stress tests by this factor, so that they run longer during nightly stress test. */ public actual val stressTestMultiplier = stressTestMultiplierSqrt * stressTestMultiplierSqrt + @Suppress("ACTUAL_WITHOUT_EXPECT") public actual typealias TestResult = Unit diff --git a/kotlinx-coroutines-core/jvm/test/TestBaseExtension.kt b/kotlinx-coroutines-core/jvm/test/TestBaseExtension.kt new file mode 100644 index 0000000000..799e559a43 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/TestBaseExtension.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +public actual fun TestBase.runMtTest( + expected: ((Throwable) -> Boolean)?, + unhandled: List<(Throwable) -> Boolean>, + block: suspend CoroutineScope.() -> Unit +): TestResult = runTest(expected, unhandled, block) diff --git a/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelSubStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelSubStressTest.kt deleted file mode 100644 index 221120af79..0000000000 --- a/kotlinx-coroutines-core/jvm/test/channels/BroadcastChannelSubStressTest.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.channels - -import kotlinx.coroutines.* -import org.junit.* -import org.junit.runner.* -import org.junit.runners.* -import java.util.concurrent.atomic.* - -/** - * Creates a broadcast channel and repeatedly opens new subscription, receives event, closes it, - * to stress test the logic of opening the subscription - * to broadcast channel while events are being concurrently sent to it. - */ -@RunWith(Parameterized::class) -class BroadcastChannelSubStressTest( - private val kind: TestBroadcastChannelKind -) : TestBase() { - companion object { - @Parameterized.Parameters(name = "{0}") - @JvmStatic - fun params(): Collection> = - TestBroadcastChannelKind.values().map { arrayOf(it) } - } - - private val nSeconds = 5 * stressTestMultiplier - private val broadcast = kind.create() - - private val sentTotal = AtomicLong() - private val receivedTotal = AtomicLong() - - @Test - fun testStress() = runBlocking { - println("--- BroadcastChannelSubStressTest $kind") - val sender = - launch(context = Dispatchers.Default + CoroutineName("Sender")) { - while (isActive) { - broadcast.send(sentTotal.incrementAndGet()) - } - } - val receiver = - launch(context = Dispatchers.Default + CoroutineName("Receiver")) { - var last = -1L - while (isActive) { - val channel = broadcast.openSubscription() - val i = channel.receive() - check(i >= last) { "Last was $last, got $i" } - if (!kind.isConflated) check(i != last) { "Last was $last, got it again" } - receivedTotal.incrementAndGet() - last = i - channel.cancel() - } - } - var prevSent = -1L - repeat(nSeconds) { sec -> - delay(1000) - val curSent = sentTotal.get() - println("${sec + 1}: Sent $curSent, received ${receivedTotal.get()}") - check(curSent > prevSent) { "Send stalled at $curSent events" } - prevSent = curSent - } - withTimeout(5000) { - sender.cancelAndJoin() - receiver.cancelAndJoin() - } - } -} \ No newline at end of file diff --git a/kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt deleted file mode 100644 index eb086cd204..0000000000 --- a/kotlinx-coroutines-core/jvm/test/channels/RendezvousChannelStressTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.channels - -import kotlinx.coroutines.* -import org.junit.* - -class RendezvousChannelStressTest : TestBase() { - - @Test - fun testStress() = runTest { - val n = 100_000 * stressTestMultiplier - val q = Channel(Channel.RENDEZVOUS) - val sender = launch { - for (i in 1..n) q.send(i) - expect(2) - } - val receiver = launch { - for (i in 1..n) check(q.receive() == i) - expect(3) - } - expect(1) - sender.join() - receiver.join() - finish(4) - } -} diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/Exceptions.kt b/kotlinx-coroutines-core/jvm/test/exceptions/Exceptions.kt index 13023e3122..4849f52071 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/Exceptions.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/Exceptions.kt @@ -15,7 +15,7 @@ import kotlin.test.* * but run only under JDK 1.8 */ @Suppress("ConflictingExtensionProperty") -val Throwable.suppressed: Array get() { +actual val Throwable.suppressed: Array get() { val method = this::class.java.getMethod("getSuppressed") ?: error("This test can only be run using JDK 1.7") @Suppress("UNCHECKED_CAST") return method.invoke(this) as Array diff --git a/kotlinx-coroutines-core/native/src/Builders.kt b/kotlinx-coroutines-core/native/src/Builders.kt index 30c187fa96..030e876d2b 100644 --- a/kotlinx-coroutines-core/native/src/Builders.kt +++ b/kotlinx-coroutines-core/native/src/Builders.kt @@ -2,11 +2,14 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +@file:OptIn(ExperimentalContracts::class) package kotlinx.coroutines import kotlinx.cinterop.* import platform.posix.* +import kotlin.contracts.* import kotlin.coroutines.* +import kotlin.native.concurrent.* /** * Runs new coroutine and **blocks** current thread _interruptibly_ until its completion. @@ -30,10 +33,13 @@ import kotlin.coroutines.* * @param context context of the coroutine. The default value is an implementation of [EventLoop]. * @param block the coroutine code. */ -public fun runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T { +public actual fun runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } val contextInterceptor = context[ContinuationInterceptor] val eventLoop: EventLoop? - var newContext: CoroutineContext = context // todo: kludge for data flow analysis error + val newContext: CoroutineContext if (contextInterceptor == null) { // create or use private event loop if no dispatcher is specified eventLoop = ThreadLocalEventLoop.eventLoop @@ -54,20 +60,33 @@ private class BlockingCoroutine( parentContext: CoroutineContext, private val eventLoop: EventLoop? ) : AbstractCoroutine(parentContext, true, true) { + private val joinWorker = Worker.current + override val isScopedCoroutine: Boolean get() = true + override fun afterCompletion(state: Any?) { + // wake up blocked thread + if (joinWorker != Worker.current) { + // Unpark waiting worker + joinWorker.executeAfter(0L, {}) // send an empty task to unpark the waiting event loop + } + } + @Suppress("UNCHECKED_CAST") - fun joinBlocking(): T = memScoped { + fun joinBlocking(): T { try { eventLoop?.incrementUseCount() - val timespec = alloc() while (true) { - val parkNanos = eventLoop?.processNextEvent() ?: Long.MAX_VALUE + var parkNanos: Long + // Workaround for bug in BE optimizer that cannot eliminate boxing here + if (eventLoop != null) { + parkNanos = eventLoop.processNextEvent() + } else { + parkNanos = Long.MAX_VALUE + } // note: process next even may loose unpark flag, so check if completed before parking if (isCompleted) break - timespec.tv_sec = (parkNanos / 1000000000L).convert() // 1e9 ns -> sec - timespec.tv_nsec = (parkNanos % 1000000000L).convert() // % 1e9 - nanosleep(timespec.ptr, null) + joinWorker.park(parkNanos / 1000L, true) } } finally { // paranoia eventLoop?.decrementUseCount() @@ -75,6 +94,6 @@ private class BlockingCoroutine( // now return result val state = state.unboxState() (state as? CompletedExceptionally)?.let { throw it.cause } - state as T + return state as T } } diff --git a/kotlinx-coroutines-core/native/src/CompletionHandler.kt b/kotlinx-coroutines-core/native/src/CompletionHandler.kt deleted file mode 100644 index 4835f7968e..0000000000 --- a/kotlinx-coroutines-core/native/src/CompletionHandler.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines - -import kotlinx.coroutines.internal.* - -internal actual abstract class CompletionHandlerBase actual constructor() : LockFreeLinkedListNode(), CompletionHandler { - actual abstract override fun invoke(cause: Throwable?) -} - -internal actual inline val CompletionHandlerBase.asHandler: CompletionHandler get() = this - -internal actual abstract class CancelHandlerBase actual constructor() : CompletionHandler { - actual abstract override fun invoke(cause: Throwable?) -} - -internal actual inline val CancelHandlerBase.asHandler: CompletionHandler get() = this - -@Suppress("NOTHING_TO_INLINE") -internal actual inline fun CompletionHandler.invokeIt(cause: Throwable?) = invoke(cause) diff --git a/kotlinx-coroutines-core/native/src/CoroutineContext.kt b/kotlinx-coroutines-core/native/src/CoroutineContext.kt index ac0f43913c..c3a376b2be 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineContext.kt @@ -8,33 +8,45 @@ import kotlinx.coroutines.internal.* import kotlin.coroutines.* import kotlin.native.concurrent.* -private fun takeEventLoop(): EventLoopImpl = - ThreadLocalEventLoop.currentOrNull() as? EventLoopImpl ?: - error("There is no event loop. Use runBlocking { ... } to start one.") - internal actual object DefaultExecutor : CoroutineDispatcher(), Delay { - override fun dispatch(context: CoroutineContext, block: Runnable) = - takeEventLoop().dispatch(context, block) - override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) = - takeEventLoop().scheduleResumeAfterDelay(timeMillis, continuation) - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = - takeEventLoop().invokeOnTimeout(timeMillis, block, context) - - actual fun enqueue(task: Runnable): Unit = loopWasShutDown() -} -internal fun loopWasShutDown(): Nothing = error("Cannot execute task because event loop was shut down") + private val delegate = WorkerDispatcher(name = "Dispatchers.Default") + + override fun dispatch(context: CoroutineContext, block: Runnable) { + checkState() + delegate.dispatch(context, block) + } + + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { + checkState() + delegate.scheduleResumeAfterDelay(timeMillis, continuation) + } + + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { + checkState() + return delegate.invokeOnTimeout(timeMillis, block, context) + } + + actual fun enqueue(task: Runnable): Unit { + checkState() + delegate.dispatch(EmptyCoroutineContext, task) + } + + private fun checkState() { + if (multithreadingSupported) return + error("DefaultExecutor should never be invoked in K/N with disabled new memory model. The top-most 'runBlocking' event loop has been shutdown") + } +} -internal fun createDefaultDispatcher(): CoroutineDispatcher = - DefaultExecutor +internal expect fun createDefaultDispatcher(): CoroutineDispatcher @SharedImmutable -internal actual val DefaultDelay: Delay = DefaultExecutor +internal actual val DefaultDelay: Delay = if (multithreadingSupported) DefaultExecutor else OldDefaultExecutor public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext { val combined = coroutineContext + context - return if (combined !== DefaultExecutor && combined[ContinuationInterceptor] == null) - combined + DefaultExecutor else combined + return if (combined !== DefaultDelay && combined[ContinuationInterceptor] == null) + combined + (DefaultDelay as CoroutineContext.Element) else combined } // No debugging facilities on native diff --git a/kotlinx-coroutines-core/native/src/Dispatchers.kt b/kotlinx-coroutines-core/native/src/Dispatchers.kt index 904483c2c0..6c51a03463 100644 --- a/kotlinx-coroutines-core/native/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/native/src/Dispatchers.kt @@ -4,21 +4,24 @@ package kotlinx.coroutines +import kotlinx.coroutines.internal.multithreadingSupported import kotlin.coroutines.* -/** Not inside [Dispatchers], as otherwise mutating this throws an `InvalidMutabilityException`. */ -private var injectedMainDispatcher: MainCoroutineDispatcher? = null - public actual object Dispatchers { - public actual val Default: CoroutineDispatcher = createDefaultDispatcher() + public actual val Default: CoroutineDispatcher = createDefaultDispatcherBasedOnMm() public actual val Main: MainCoroutineDispatcher get() = injectedMainDispatcher ?: mainDispatcher public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing - private val mainDispatcher = NativeMainDispatcher(Default) + private val mainDispatcher = createMainDispatcher(Default) + + private var injectedMainDispatcher: MainCoroutineDispatcher? = null @PublishedApi internal fun injectMain(dispatcher: MainCoroutineDispatcher) { + if (!multithreadingSupported) { + throw IllegalStateException("Dispatchers.setMain is not supported in Kotlin/Native when new memory model is disabled") + } injectedMainDispatcher = dispatcher } @@ -28,7 +31,27 @@ public actual object Dispatchers { } } -private class NativeMainDispatcher(val delegate: CoroutineDispatcher) : MainCoroutineDispatcher() { +internal expect fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher + +private fun createDefaultDispatcherBasedOnMm(): CoroutineDispatcher { + return if (multithreadingSupported) createDefaultDispatcher() + else OldDefaultExecutor +} + +private fun takeEventLoop(): EventLoopImpl = + ThreadLocalEventLoop.currentOrNull() as? EventLoopImpl ?: + error("There is no event loop. Use runBlocking { ... } to start one.") + +internal object OldDefaultExecutor : CoroutineDispatcher(), Delay { + override fun dispatch(context: CoroutineContext, block: Runnable) = + takeEventLoop().dispatch(context, block) + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) = + takeEventLoop().scheduleResumeAfterDelay(timeMillis, continuation) + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = + takeEventLoop().invokeOnTimeout(timeMillis, block, context) +} + +internal class OldMainDispatcher(private val delegate: CoroutineDispatcher) : MainCoroutineDispatcher() { override val immediate: MainCoroutineDispatcher get() = throw UnsupportedOperationException("Immediate dispatching is not supported on Native") override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.dispatch(context, block) diff --git a/kotlinx-coroutines-core/native/src/EventLoop.kt b/kotlinx-coroutines-core/native/src/EventLoop.kt index 925cbe9971..f4e5b8c9c4 100644 --- a/kotlinx-coroutines-core/native/src/EventLoop.kt +++ b/kotlinx-coroutines-core/native/src/EventLoop.kt @@ -4,18 +4,38 @@ package kotlinx.coroutines +import kotlinx.cinterop.* +import kotlinx.coroutines.internal.* +import kotlinx.coroutines.internal.multithreadingSupported +import platform.posix.* import kotlin.coroutines.* +import kotlin.native.concurrent.* import kotlin.system.* -internal actual abstract class EventLoopImplPlatform: EventLoop() { - protected actual fun unpark() { /* does nothing */ } - protected actual fun reschedule(now: Long, delayedTask: EventLoopImplBase.DelayedTask): Unit = - loopWasShutDown() +internal actual abstract class EventLoopImplPlatform : EventLoop() { + + private val current = Worker.current + + protected actual fun unpark() { + current.executeAfter(0L, {})// send an empty task to unpark the waiting event loop + } + + protected actual fun reschedule(now: Long, delayedTask: EventLoopImplBase.DelayedTask) { + if (multithreadingSupported) { + DefaultExecutor.invokeOnTimeout(now, delayedTask, EmptyCoroutineContext) + } else { + error("Cannot execute task because event loop was shut down") + } + } } internal class EventLoopImpl: EventLoopImplBase() { - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = - scheduleInvokeOnTimeout(timeMillis, block) + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { + if (!multithreadingSupported) { + return scheduleInvokeOnTimeout(timeMillis, block) + } + return DefaultDelay.invokeOnTimeout(timeMillis, block, context) + } } internal actual fun createEventLoop(): EventLoop = EventLoopImpl() diff --git a/kotlinx-coroutines-core/native/src/Exceptions.kt b/kotlinx-coroutines-core/native/src/Exceptions.kt index da9979b603..1a923c40ff 100644 --- a/kotlinx-coroutines-core/native/src/Exceptions.kt +++ b/kotlinx-coroutines-core/native/src/Exceptions.kt @@ -4,6 +4,9 @@ package kotlinx.coroutines +import kotlinx.coroutines.internal.* +import kotlinx.coroutines.internal.SuppressSupportingThrowableImpl + /** * Thrown by cancellable suspending functions if the [Job] of the coroutine is cancelled while it is suspending. * It indicates _normal_ cancellation of a coroutine. @@ -31,7 +34,9 @@ internal actual class JobCancellationException public actual constructor( } @Suppress("NOTHING_TO_INLINE") -internal actual inline fun Throwable.addSuppressedThrowable(other: Throwable) { /* empty */ } +internal actual inline fun Throwable.addSuppressedThrowable(other: Throwable) { + if (this is SuppressSupportingThrowableImpl) addSuppressed(other) +} // For use in tests internal actual val RECOVER_STACK_TRACES: Boolean = false diff --git a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt new file mode 100644 index 0000000000..d991fc169e --- /dev/null +++ b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.internal.* +import kotlin.coroutines.* +import kotlin.native.concurrent.* + +@ExperimentalCoroutinesApi +public actual fun newSingleThreadContext(name: String): CloseableCoroutineDispatcher { + if (!multithreadingSupported) throw IllegalStateException("This API is only supported for experimental K/N memory model") + return WorkerDispatcher(name) +} + +public actual fun newFixedThreadPoolContext(nThreads: Int, name: String): CloseableCoroutineDispatcher { + if (!multithreadingSupported) throw IllegalStateException("This API is only supported for experimental K/N memory model") + require(nThreads >= 1) { "Expected at least one thread, but got: $nThreads"} + return MultiWorkerDispatcher(name, nThreads) +} + +internal class WorkerDispatcher(name: String) : CloseableCoroutineDispatcher(), Delay { + private val worker = Worker.start(name = name) + + override fun dispatch(context: CoroutineContext, block: Runnable) { + worker.executeAfter(0L) { block.run() } + } + + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { + worker.executeAfter(timeMillis.toMicrosSafe()) { + with(continuation) { resumeUndispatched(Unit) } + } + } + + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { + // No API to cancel on timeout + worker.executeAfter(timeMillis.toMicrosSafe()) { block.run() } + return NonDisposableHandle + } + + override fun close() { + worker.requestTermination().result // Note: calling "result" blocks + } + + private fun Long.toMicrosSafe(): Long { + val result = this * 1000 + return if (result > this) result else Long.MAX_VALUE + } +} + +private class MultiWorkerDispatcher(name: String, workersCount: Int) : CloseableCoroutineDispatcher() { + private val tasksQueue = Channel(Channel.UNLIMITED) + private val workers = Array(workersCount) { Worker.start(name = "$name-$it") } + + init { + workers.forEach { w -> w.executeAfter(0L) { workerRunLoop() } } + } + + private fun workerRunLoop() = runBlocking { + for (task in tasksQueue) { + // TODO error handling + task.run() + } + } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + // TODO handle rejections + tasksQueue.trySend(block) + } + + override fun close() { + tasksQueue.close() + workers.forEach { it.requestTermination().result } + } +} diff --git a/kotlinx-coroutines-core/native/src/internal/Concurrent.kt b/kotlinx-coroutines-core/native/src/internal/Concurrent.kt index b379c6ac15..1db6c3bd86 100644 --- a/kotlinx-coroutines-core/native/src/internal/Concurrent.kt +++ b/kotlinx-coroutines-core/native/src/internal/Concurrent.kt @@ -4,15 +4,34 @@ package kotlinx.coroutines.internal -internal actual typealias ReentrantLock = NoOpLock +import kotlinx.atomicfu.* +import kotlin.native.concurrent.* +import kotlinx.atomicfu.locks.withLock as withLock2 -internal actual inline fun ReentrantLock.withLock(action: () -> T) = action() +@Suppress("ACTUAL_WITHOUT_EXPECT") +internal actual typealias ReentrantLock = kotlinx.atomicfu.locks.SynchronizedObject -internal class NoOpLock { - fun tryLock() = true - fun unlock(): Unit {} -} +internal actual inline fun ReentrantLock.withLock(action: () -> T): T = this.withLock2(action) internal actual fun subscriberList(): MutableList = CopyOnWriteList() internal actual fun identitySet(expectedSize: Int): MutableSet = HashSet() + + +// "Suppress-supporting throwable" is currently used for tests only +internal open class SuppressSupportingThrowableImpl : Throwable() { + private val _suppressed = atomic>(emptyArray()) + + val suppressed: Array + get() = _suppressed.value + + fun addSuppressed(other: Throwable) { + _suppressed.update { current -> + current + other + } + } +} + +@SharedImmutable +@OptIn(ExperimentalStdlibApi::class) +internal val multithreadingSupported: Boolean = kotlin.native.isExperimentalMM() diff --git a/kotlinx-coroutines-core/native/src/internal/CopyOnWriteList.kt b/kotlinx-coroutines-core/native/src/internal/CopyOnWriteList.kt index 30f063a517..2896c2eac5 100644 --- a/kotlinx-coroutines-core/native/src/internal/CopyOnWriteList.kt +++ b/kotlinx-coroutines-core/native/src/internal/CopyOnWriteList.kt @@ -4,101 +4,76 @@ package kotlinx.coroutines.internal +import kotlinx.atomicfu.* + @Suppress("UNCHECKED_CAST") -internal class CopyOnWriteList(private var array: Array = arrayOfNulls(4)) : AbstractMutableList() { +internal class CopyOnWriteList : AbstractMutableList() { + + private val _array = atomic(arrayOfNulls(0)) + private var array: Array + get() = _array.value + set(value) { _array.value = value } - private var _size = 0 - override val size: Int get() = _size + override val size: Int + get() = array.size override fun add(element: E): Boolean { - val newSize = if (_size == array.size) array.size * 2 else array.size - val update = array.copyOf(newSize) - update[_size++] = element + val n = size + val update = array.copyOf(n + 1) + update[n] = element array = update return true } override fun add(index: Int, element: E) { rangeCheck(index) - val update = arrayOfNulls(if (array.size == _size) array.size * 2 else array.size) - array.copyInto( - destination = update, - endIndex = index - ) + val n = size + val update = arrayOfNulls(n + 1) + array.copyInto(destination = update, endIndex = index) update[index] = element - array.copyInto( - destination = update, - destinationOffset = index + 1, - startIndex = index, - endIndex = _size + 1 - ) - ++_size + array.copyInto(destination = update, destinationOffset = index + 1, startIndex = index, endIndex = n + 1) array = update } override fun remove(element: E): Boolean { val index = array.indexOf(element as Any) - if (index == -1) { - return false - } - + if (index == -1) return false removeAt(index) return true } override fun removeAt(index: Int): E { rangeCheck(index) - modCount++ - val n = array.size + val n = size val element = array[index] - val update = arrayOfNulls(n) - array.copyInto( - destination = update, - endIndex = index - ) - array.copyInto( - destination = update, - destinationOffset = index, - startIndex = index + 1, - endIndex = n - ) + val update = arrayOfNulls(n - 1) + array.copyInto(destination = update, endIndex = index) + array.copyInto(destination = update, destinationOffset = index, startIndex = index + 1, endIndex = n) array = update - --_size return element as E } - override fun iterator(): MutableIterator = IteratorImpl(array as Array, size) - + override fun iterator(): MutableIterator = IteratorImpl(array as Array) override fun listIterator(): MutableListIterator = throw UnsupportedOperationException("Operation is not supported") - override fun listIterator(index: Int): MutableListIterator = throw UnsupportedOperationException("Operation is not supported") - override fun isEmpty(): Boolean = size == 0 - override fun set(index: Int, element: E): E = throw UnsupportedOperationException("Operation is not supported") + override fun get(index: Int): E = array[rangeCheck(index)] as E - override fun get(index: Int): E = array[rangeCheck(index)]!! as E - - private class IteratorImpl(private var array: Array, private val size: Int) : MutableIterator { - + private class IteratorImpl(private val array: Array) : MutableIterator { private var current = 0 - override fun hasNext(): Boolean = current != size + override fun hasNext(): Boolean = current != array.size override fun next(): E { - if (!hasNext()) { - throw NoSuchElementException() - } - - return array[current++]!! + if (!hasNext()) throw NoSuchElementException() + return array[current++] } override fun remove() = throw UnsupportedOperationException("Operation is not supported") } private fun rangeCheck(index: Int) = index.apply { - if (index < 0 || index >= _size) { - throw IndexOutOfBoundsException("index: $index, size: $size") - } + if (index < 0 || index >= size) throw IndexOutOfBoundsException("index: $index, size: $size") } } diff --git a/kotlinx-coroutines-core/native/src/internal/LinkedList.kt b/kotlinx-coroutines-core/native/src/internal/LinkedList.kt deleted file mode 100644 index a161bc5bab..0000000000 --- a/kotlinx-coroutines-core/native/src/internal/LinkedList.kt +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ -@file:Suppress("NO_EXPLICIT_RETURN_TYPE_IN_API_MODE", "NO_EXPLICIT_VISIBILITY_IN_API_MODE") - -package kotlinx.coroutines.internal - -private typealias Node = LinkedListNode - -/** @suppress **This is unstable API and it is subject to change.** */ -@Suppress("NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS") // :TODO: Remove when fixed: https://youtrack.jetbrains.com/issue/KT-23703 -public actual typealias LockFreeLinkedListNode = LinkedListNode - -/** @suppress **This is unstable API and it is subject to change.** */ -public actual typealias LockFreeLinkedListHead = LinkedListHead - -/** @suppress **This is unstable API and it is subject to change.** */ -public open class LinkedListNode { - @PublishedApi internal var _next = this - @PublishedApi internal var _prev = this - @PublishedApi internal var _removed: Boolean = false - - public inline val nextNode get() = _next - public inline val prevNode get() = _prev - public inline val isRemoved get() = _removed - - public fun addLast(node: Node) { - val prev = this._prev - node._next = this - node._prev = prev - prev._next = node - this._prev = node - } - - public open fun remove(): Boolean { - if (_removed) return false - val prev = this._prev - val next = this._next - prev._next = next - next._prev = prev - _removed = true - return true - } - - public fun addOneIfEmpty(node: Node): Boolean { - if (_next !== this) return false - addLast(node) - return true - } - - public inline fun addLastIf(node: Node, crossinline condition: () -> Boolean): Boolean { - if (!condition()) return false - addLast(node) - return true - } - - public inline fun addLastIfPrev(node: Node, predicate: (Node) -> Boolean): Boolean { - if (!predicate(_prev)) return false - addLast(node) - return true - } - - public inline fun addLastIfPrevAndIf( - node: Node, - predicate: (Node) -> Boolean, // prev node predicate - crossinline condition: () -> Boolean // atomically checked condition - ): Boolean { - if (!predicate(_prev)) return false - if (!condition()) return false - addLast(node) - return true - } - - public fun helpRemove() {} // no-op without multithreading - - public fun removeFirstOrNull(): Node? { - val next = _next - if (next === this) return null - check(next.remove()) { "Should remove" } - return next - } - - public inline fun removeFirstIfIsInstanceOfOrPeekIf(predicate: (T) -> Boolean): T? { - val next = _next - if (next === this) return null - if (next !is T) return null - if (predicate(next)) return next - check(next.remove()) { "Should remove" } - return next - } -} - -/** @suppress **This is unstable API and it is subject to change.** */ -public actual open class AddLastDesc actual constructor( - actual val queue: Node, - actual val node: T -) : AbstractAtomicDesc() { - override val affectedNode: Node get() = queue._prev - actual override fun finishPrepare(prepareOp: PrepareOp) {} - override fun onComplete() = queue.addLast(node) - actual override fun finishOnSuccess(affected: LockFreeLinkedListNode, next: LockFreeLinkedListNode) = Unit -} - -/** @suppress **This is unstable API and it is subject to change.** */ -public actual open class RemoveFirstDesc actual constructor( - actual val queue: LockFreeLinkedListNode -) : AbstractAtomicDesc() { - @Suppress("UNCHECKED_CAST") - actual val result: T get() = affectedNode as T - override val affectedNode: Node = queue.nextNode - actual override fun finishPrepare(prepareOp: PrepareOp) {} - override fun onComplete() { queue.removeFirstOrNull() } - actual override fun finishOnSuccess(affected: LockFreeLinkedListNode, next: LockFreeLinkedListNode) = Unit -} - -/** @suppress **This is unstable API and it is subject to change.** */ -public actual abstract class AbstractAtomicDesc : AtomicDesc() { - protected abstract val affectedNode: Node - actual abstract fun finishPrepare(prepareOp: PrepareOp) - protected abstract fun onComplete() - - actual open fun onPrepare(prepareOp: PrepareOp): Any? { - finishPrepare(prepareOp) - return null - } - - actual open fun onRemoved(affected: Node) {} - - actual final override fun prepare(op: AtomicOp<*>): Any? { - val affected = affectedNode - val failure = failure(affected) - if (failure != null) return failure - @Suppress("UNCHECKED_CAST") - return onPrepare(PrepareOp(affected, this, op)) - } - - actual final override fun complete(op: AtomicOp<*>, failure: Any?) = onComplete() - protected actual open fun failure(affected: LockFreeLinkedListNode): Any? = null // Never fails by default - protected actual open fun retry(affected: LockFreeLinkedListNode, next: Any): Boolean = false // Always succeeds - protected actual abstract fun finishOnSuccess(affected: LockFreeLinkedListNode, next: LockFreeLinkedListNode) -} - -/** @suppress **This is unstable API and it is subject to change.** */ -public actual class PrepareOp( - actual val affected: LockFreeLinkedListNode, - actual val desc: AbstractAtomicDesc, - actual override val atomicOp: AtomicOp<*> -): OpDescriptor() { - override fun perform(affected: Any?): Any? = null - actual fun finishPrepare() {} -} - -/** @suppress **This is unstable API and it is subject to change.** */ -public open class LinkedListHead : LinkedListNode() { - public val isEmpty get() = _next === this - - /** - * Iterates over all elements in this list of a specified type. - */ - public inline fun forEach(block: (T) -> Unit) { - var cur: Node = _next - while (cur != this) { - if (cur is T) block(cur) - cur = cur._next - } - } - - // just a defensive programming -- makes sure that list head sentinel is never removed - public final override fun remove(): Nothing = throw UnsupportedOperationException() -} diff --git a/kotlinx-coroutines-core/native/src/internal/Synchronized.kt b/kotlinx-coroutines-core/native/src/internal/Synchronized.kt index dcbb20217d..edbd3fde0c 100644 --- a/kotlinx-coroutines-core/native/src/internal/Synchronized.kt +++ b/kotlinx-coroutines-core/native/src/internal/Synchronized.kt @@ -5,16 +5,16 @@ package kotlinx.coroutines.internal import kotlinx.coroutines.* +import kotlinx.atomicfu.locks.withLock as withLock2 /** * @suppress **This an internal API and should not be used from general code.** */ @InternalCoroutinesApi -public actual typealias SynchronizedObject = Any +public actual typealias SynchronizedObject = kotlinx.atomicfu.locks.SynchronizedObject /** * @suppress **This an internal API and should not be used from general code.** */ @InternalCoroutinesApi -public actual inline fun synchronized(lock: SynchronizedObject, block: () -> T): T = - block() +public actual inline fun synchronized(lock: SynchronizedObject, block: () -> T): T = lock.withLock2(block) diff --git a/kotlinx-coroutines-core/native/test/ConcurrentTestUtilities.kt b/kotlinx-coroutines-core/native/test/ConcurrentTestUtilities.kt new file mode 100644 index 0000000000..639b5fb174 --- /dev/null +++ b/kotlinx-coroutines-core/native/test/ConcurrentTestUtilities.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.exceptions + +import kotlinx.atomicfu.* +import kotlinx.coroutines.internal.* +import platform.posix.* +import kotlin.native.concurrent.* +import kotlin.random.* + +actual fun randomWait() { + val n = Random.nextInt(1000) + if (n < 500) return // no wait 50% of time + repeat(n) { + BlackHole.sink *= 3 + } + // use the BlackHole value somehow, so even if the compiler gets smarter, it won't remove the object + val sinkValue = if (BlackHole.sink > 16) 1 else 0 + if (n + sinkValue > 900) sched_yield() +} + +@ThreadLocal +private object BlackHole { + var sink = 1 +} + +internal actual typealias SuppressSupportingThrowable = SuppressSupportingThrowableImpl + +actual val Throwable.suppressed: Array + get() = (this as? SuppressSupportingThrowableImpl)?.suppressed ?: emptyArray() + +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") +actual fun Throwable.printStackTrace() = printStackTrace() + +actual fun currentThreadName(): String = Worker.current.name diff --git a/kotlinx-coroutines-core/native/test/DelayExceptionTest.kt b/kotlinx-coroutines-core/native/test/DelayExceptionTest.kt index a39a59e134..b0409935da 100644 --- a/kotlinx-coroutines-core/native/test/DelayExceptionTest.kt +++ b/kotlinx-coroutines-core/native/test/DelayExceptionTest.kt @@ -8,22 +8,6 @@ import kotlin.coroutines.* import kotlin.test.* class DelayExceptionTest : TestBase() { - private object Dispatcher : CoroutineDispatcher() { - override fun isDispatchNeeded(context: CoroutineContext): Boolean = true - override fun dispatch(context: CoroutineContext, block: Runnable) { block.run() } - } - - private lateinit var exception: Throwable - - - @Test - fun testThrowsTce() { - CoroutineScope(Dispatcher + CoroutineExceptionHandler { _, e -> exception = e }).launch { - delay(10) - } - - assertTrue(exception is IllegalStateException) - } @Test fun testMaxDelay() = runBlocking { diff --git a/kotlinx-coroutines-core/native/test/RunBlockingTest.kt b/kotlinx-coroutines-core/native/test/RunBlockingTest.kt deleted file mode 100644 index c5d08af5f3..0000000000 --- a/kotlinx-coroutines-core/native/test/RunBlockingTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines -import kotlin.test.* - -class RunBlockingTest : TestBase() { - - @Test - fun testIncompleteState() { - val handle = runBlocking { - coroutineContext[Job]!!.invokeOnCompletion { } - } - - handle.dispose() - } -} \ No newline at end of file diff --git a/kotlinx-coroutines-core/native/test/TestBase.kt b/kotlinx-coroutines-core/native/test/TestBase.kt index 1b12cefefe..6fef4752a8 100644 --- a/kotlinx-coroutines-core/native/test/TestBase.kt +++ b/kotlinx-coroutines-core/native/test/TestBase.kt @@ -4,16 +4,21 @@ package kotlinx.coroutines +import kotlinx.atomicfu.* + public actual val isStressTest: Boolean = false public actual val stressTestMultiplier: Int = 1 +public actual val stressTestMultiplierSqrt: Int = 1 + +public actual val isNative = true @Suppress("ACTUAL_WITHOUT_EXPECT") public actual typealias TestResult = Unit public actual open class TestBase actual constructor() { public actual val isBoundByJsTestTimeout = false - private var actionIndex = 0 - private var finished = false + private var actionIndex = atomic(0) + private var finished = atomic(false) private var error: Throwable? = null /** @@ -36,7 +41,7 @@ public actual open class TestBase actual constructor() { * Asserts that this invocation is `index`-th in the execution sequence (counting from one). */ public actual fun expect(index: Int) { - val wasIndex = ++actionIndex + val wasIndex = actionIndex.incrementAndGet() check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } } @@ -52,21 +57,21 @@ public actual open class TestBase actual constructor() { */ public actual fun finish(index: Int) { expect(index) - check(!finished) { "Should call 'finish(...)' at most once" } - finished = true + check(!finished.value) { "Should call 'finish(...)' at most once" } + finished.value = true } /** * Asserts that [finish] was invoked */ - public actual fun ensureFinished() { - require(finished) { "finish(...) should be caller prior to this check" } + actual fun ensureFinished() { + require(finished.value) { "finish(...) should be caller prior to this check" } } - public actual fun reset() { - check(actionIndex == 0 || finished) { "Expecting that 'finish(...)' was invoked, but it was not" } - actionIndex = 0 - finished = false + actual fun reset() { + check(actionIndex.value == 0 || finished.value) { "Expecting that 'finish(...)' was invoked, but it was not" } + actionIndex.value = 0 + finished.value = false } @Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS") diff --git a/kotlinx-coroutines-core/native/test/TestBaseExtension.kt b/kotlinx-coroutines-core/native/test/TestBaseExtension.kt new file mode 100644 index 0000000000..fde2cde5cf --- /dev/null +++ b/kotlinx-coroutines-core/native/test/TestBaseExtension.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines + +import kotlinx.coroutines.internal.* + +actual fun TestBase.runMtTest( + expected: ((Throwable) -> Boolean)?, + unhandled: List<(Throwable) -> Boolean>, + block: suspend CoroutineScope.() -> Unit +) { + if (!multithreadingSupported) return + return runTest(expected, unhandled, block) +} diff --git a/kotlinx-coroutines-core/native/test/WorkerTest.kt b/kotlinx-coroutines-core/native/test/WorkerTest.kt index d6b5fad182..8252ca656a 100644 --- a/kotlinx-coroutines-core/native/test/WorkerTest.kt +++ b/kotlinx-coroutines-core/native/test/WorkerTest.kt @@ -23,12 +23,12 @@ class WorkerTest : TestBase() { } @Test - fun testLaunchInWorkerTroughGlobalScope() { + fun testLaunchInWorkerThroughGlobalScope() { val worker = Worker.start() worker.execute(TransferMode.SAFE, { }) { runBlocking { CoroutineScope(EmptyCoroutineContext).launch { - delay(1) + delay(10) }.join() } }.result diff --git a/kotlinx-coroutines-core/native/test/internal/LinkedListTest.kt b/kotlinx-coroutines-core/native/test/internal/LinkedListTest.kt index 6c1fddfc5f..44ddf471d7 100644 --- a/kotlinx-coroutines-core/native/test/internal/LinkedListTest.kt +++ b/kotlinx-coroutines-core/native/test/internal/LinkedListTest.kt @@ -10,11 +10,11 @@ import kotlin.test.assertFalse import kotlin.test.assertTrue class LinkedListTest { - data class IntNode(val i: Int) : LinkedListNode() + data class IntNode(val i: Int) : LockFreeLinkedListNode() @Test fun testSimpleAddLastRemove() { - val list = LinkedListHead() + val list = LockFreeLinkedListHead() assertContents(list) val n1 = IntNode(1).apply { list.addLast(this) } assertContents(list, 1) @@ -35,7 +35,7 @@ class LinkedListTest { assertContents(list) } - private fun assertContents(list: LinkedListHead, vararg expected: Int) { + private fun assertContents(list: LockFreeLinkedListHead, vararg expected: Int) { val n = expected.size val actual = IntArray(n) var index = 0 diff --git a/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt b/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt new file mode 100644 index 0000000000..ace20422f6 --- /dev/null +++ b/kotlinx-coroutines-core/nativeDarwin/src/Dispatchers.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.cinterop.* +import kotlinx.coroutines.internal.* +import platform.CoreFoundation.* +import platform.darwin.* +import kotlin.coroutines.* +import kotlin.native.concurrent.* +import kotlin.native.internal.NativePtr + +internal fun isMainThread(): Boolean = CFRunLoopGetCurrent() == CFRunLoopGetMain() + +internal actual fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher = + if (multithreadingSupported) DarwinMainDispatcher(false) else OldMainDispatcher(Dispatchers.Default) + +internal actual fun createDefaultDispatcher(): CoroutineDispatcher = DarwinGlobalQueueDispatcher + +private object DarwinGlobalQueueDispatcher : CoroutineDispatcher() { + override fun dispatch(context: CoroutineContext, block: Runnable) { + autoreleasepool { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT.convert(), 0)) { + block.run() + } + } + } +} + +private class DarwinMainDispatcher( + private val invokeImmediately: Boolean +) : MainCoroutineDispatcher(), Delay { + + override val immediate: MainCoroutineDispatcher = + if (invokeImmediately) this else DarwinMainDispatcher(true) + + override fun isDispatchNeeded(context: CoroutineContext): Boolean = !(invokeImmediately && isMainThread()) + + override fun dispatch(context: CoroutineContext, block: Runnable) { + autoreleasepool { + dispatch_async(dispatch_get_main_queue()) { + block.run() + } + } + } + + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { + val timer = Timer() + val timerBlock: TimerBlock = { + timer.dispose() + continuation.resume(Unit) + } + timer.start(timeMillis, timerBlock) + continuation.disposeOnCancellation(timer) + } + + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { + val timer = Timer() + val timerBlock: TimerBlock = { + timer.dispose() + block.run() + } + timer.start(timeMillis, timerBlock) + return timer + } + + override fun toString(): String = + "MainDispatcher${ if(invokeImmediately) "[immediate]" else "" }" +} + +private typealias TimerBlock = (CFRunLoopTimerRef?) -> Unit + +private val TIMER_NEW = NativePtr.NULL +private val TIMER_DISPOSED = NativePtr.NULL.plus(1) + +private class Timer : DisposableHandle { + private val ref = AtomicNativePtr(TIMER_NEW) + + fun start(timeMillis: Long, timerBlock: TimerBlock) { + val fireDate = CFAbsoluteTimeGetCurrent() + timeMillis / 1000.0 + val timer = CFRunLoopTimerCreateWithHandler(null, fireDate, 0.0, 0u, 0, timerBlock) + CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes) + if (!ref.compareAndSet(TIMER_NEW, timer.rawValue)) { + // dispose was already called concurrently + release(timer) + } + } + + override fun dispose() { + while (true) { + val ptr = ref.value + if (ptr == TIMER_DISPOSED) return + if (ref.compareAndSet(ptr, TIMER_DISPOSED)) { + if (ptr != TIMER_NEW) release(interpretCPointer(ptr)) + return + } + } + } + + private fun release(timer: CFRunLoopTimerRef?) { + CFRunLoopRemoveTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes) + CFRelease(timer) + } +} + +internal actual inline fun platformAutoreleasePool(crossinline block: () -> Unit): Unit = autoreleasepool { block() } diff --git a/kotlinx-coroutines-core/nativeDarwin/test/MainDispatcherTest.kt b/kotlinx-coroutines-core/nativeDarwin/test/MainDispatcherTest.kt new file mode 100644 index 0000000000..d460bd6e6e --- /dev/null +++ b/kotlinx-coroutines-core/nativeDarwin/test/MainDispatcherTest.kt @@ -0,0 +1,130 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlinx.coroutines.internal.* +import platform.CoreFoundation.* +import platform.darwin.* +import kotlin.coroutines.* +import kotlin.test.* + +class MainDispatcherTest : TestBase() { + + private fun isMainThread(): Boolean = CFRunLoopGetCurrent() == CFRunLoopGetMain() + private fun canTestMainDispatcher() = !isMainThread() && multithreadingSupported + + private fun runTestNotOnMainDispatcher(block: suspend CoroutineScope.() -> Unit) { + // skip if already on the main thread, run blocking doesn't really work well with that + if (!canTestMainDispatcher()) return + runTest(block = block) + } + + @Test + fun testDispatchNecessityCheckWithMainImmediateDispatcher() = runTestNotOnMainDispatcher { + val main = Dispatchers.Main.immediate + assertTrue(main.isDispatchNeeded(EmptyCoroutineContext)) + withContext(Dispatchers.Default) { + assertTrue(main.isDispatchNeeded(EmptyCoroutineContext)) + withContext(Dispatchers.Main) { + assertFalse(main.isDispatchNeeded(EmptyCoroutineContext)) + } + assertTrue(main.isDispatchNeeded(EmptyCoroutineContext)) + } + } + + @Test + fun testWithContext() = runTestNotOnMainDispatcher { + expect(1) + assertFalse(isMainThread()) + withContext(Dispatchers.Main) { + assertTrue(isMainThread()) + expect(2) + } + assertFalse(isMainThread()) + finish(3) + } + + @Test + fun testWithContextDelay() = runTestNotOnMainDispatcher { + expect(1) + withContext(Dispatchers.Main) { + assertTrue(isMainThread()) + expect(2) + delay(100) + assertTrue(isMainThread()) + expect(3) + } + assertFalse(isMainThread()) + finish(4) + } + + @Test + fun testWithTimeoutContextDelayNoTimeout() = runTestNotOnMainDispatcher { + expect(1) + withTimeout(1000) { + withContext(Dispatchers.Main) { + assertTrue(isMainThread()) + expect(2) + delay(100) + assertTrue(isMainThread()) + expect(3) + } + } + assertFalse(isMainThread()) + finish(4) + } + + @Test + fun testWithTimeoutContextDelayTimeout() = runTestNotOnMainDispatcher { + expect(1) + assertFailsWith { + withTimeout(100) { + withContext(Dispatchers.Main) { + assertTrue(isMainThread()) + expect(2) + delay(1000) + expectUnreached() + } + } + expectUnreached() + } + assertFalse(isMainThread()) + finish(3) + } + + @Test + fun testWithContextTimeoutDelayNoTimeout() = runTestNotOnMainDispatcher { + expect(1) + withContext(Dispatchers.Main) { + withTimeout(1000) { + assertTrue(isMainThread()) + expect(2) + delay(100) + assertTrue(isMainThread()) + expect(3) + } + } + assertFalse(isMainThread()) + finish(4) + } + + @Test + fun testWithContextTimeoutDelayTimeout() = runTestNotOnMainDispatcher { + expect(1) + assertFailsWith { + withContext(Dispatchers.Main) { + withTimeout(100) { + assertTrue(isMainThread()) + expect(2) + delay(1000) + expectUnreached() + } + } + expectUnreached() + } + assertFalse(isMainThread()) + finish(3) + } +} diff --git a/kotlinx-coroutines-core/nativeOther/src/Dispatchers.kt b/kotlinx-coroutines-core/nativeOther/src/Dispatchers.kt new file mode 100644 index 0000000000..517190d0a3 --- /dev/null +++ b/kotlinx-coroutines-core/nativeOther/src/Dispatchers.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlin.coroutines.* + +internal actual fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher = + MissingMainDispatcher + +internal actual fun createDefaultDispatcher(): CoroutineDispatcher = DefaultDispatcher + +private object DefaultDispatcher : CoroutineDispatcher() { + + // Delegated, so users won't be able to downcast and call 'close' + // The precise number of threads cannot be obtained until KT-48179 is implemented, 4 is just "good enough" number. + private val ctx = newFixedThreadPoolContext(4, "Dispatchers.Default") + + override fun dispatch(context: CoroutineContext, block: Runnable) { + ctx.dispatch(context, block) + } +} + +private object MissingMainDispatcher : MainCoroutineDispatcher() { + override val immediate: MainCoroutineDispatcher + get() = notImplemented() + override fun dispatch(context: CoroutineContext, block: Runnable) = notImplemented() + override fun isDispatchNeeded(context: CoroutineContext): Boolean = notImplemented() + override fun dispatchYield(context: CoroutineContext, block: Runnable) = notImplemented() + + private fun notImplemented(): Nothing = TODO("Dispatchers.Main is missing on the current platform") +} + +internal actual inline fun platformAutoreleasePool(crossinline block: () -> Unit) = block() diff --git a/kotlinx-coroutines-test/common/test/Helpers.kt b/kotlinx-coroutines-test/common/test/Helpers.kt new file mode 100644 index 0000000000..f0a462e4b6 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/Helpers.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +@OptionalExpectation +expect annotation class NoNative() diff --git a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt index b758c58636..bf391ea6e2 100644 --- a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt +++ b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt @@ -28,11 +28,13 @@ class TestDispatchersTest { } @Test + @NoNative fun testSelfSet() { assertFailsWith { Dispatchers.setMain(Dispatchers.Main) } } @Test + @NoNative fun testImmediateDispatcher() = runBlockingTest { Dispatchers.setMain(ImmediateDispatcher()) expect(1) @@ -68,4 +70,4 @@ class TestDispatchersTest { block.run() } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-test/native/test/Helpers.kt b/kotlinx-coroutines-test/native/test/Helpers.kt new file mode 100644 index 0000000000..28cc28ca00 --- /dev/null +++ b/kotlinx-coroutines-test/native/test/Helpers.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines.test + +import kotlin.test.* + +actual typealias NoNative = Ignore From 4b85eb60af16f1bbab98499f5f558264b1f1bcda Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 16 Nov 2021 15:37:50 +0300 Subject: [PATCH 183/328] Introduce ClassValue-based exception constructor cache to stracktrace recovery (#2997) * Use ClassValue-based cache for exception constructors with stacktrace recovery * It eliminates the classloader leak in containerized environments * Insignificantly improves the performance of exception copying * Creates a precedent of guarded use of non-Android-compliant API Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- kotlinx-coroutines-core/build.gradle | 7 -- .../jvm/src/internal/ExceptionsConstructor.kt | 80 +++++++++++++------ .../test/R8ServiceLoaderOptimizationTest.kt | 1 - 3 files changed, 54 insertions(+), 34 deletions(-) diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 35142854b5..70295b2909 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -201,12 +201,6 @@ task checkJdk16() { } } -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions.jdkHome = System.env.JDK_16 - // only fail when actually trying to compile, not during project setup phase - dependsOn(checkJdk16) -} - jvmTest { minHeapSize = '1g' maxHeapSize = '1g' @@ -283,7 +277,6 @@ task jdk16Test(type: Test, dependsOn: [compileTestKotlinJvm, checkJdk16]) { classpath = files { jvmTest.classpath } testClassesDirs = files { jvmTest.testClassesDirs } executable = "$System.env.JDK_16/bin/java" - exclude '**/*LFStressTest.*' // lock-freedom tests use LockFreedomTestEnvironment which needs JDK8 exclude '**/*LincheckTest.*' // Lincheck tests use LinChecker which needs JDK8 exclude '**/exceptions/**' // exceptions tests check suppressed exception which needs JDK8 exclude '**/ExceptionsGuideTest.*' diff --git a/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt b/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt index 60328ebdc0..de15225266 100644 --- a/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt +++ b/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt @@ -11,10 +11,15 @@ import java.util.concurrent.locks.* import kotlin.concurrent.* private val throwableFields = Throwable::class.java.fieldsCountOrDefault(-1) -private val cacheLock = ReentrantReadWriteLock() private typealias Ctor = (Throwable) -> Throwable? -// Replace it with ClassValue when Java 6 support is over -private val exceptionCtors: WeakHashMap, Ctor> = WeakHashMap() + +private val ctorCache = try { + if (ANDROID_DETECTED) WeakMapCtorCache + else ClassValueCtorCache +} catch (e: Throwable) { + // Fallback on Java 6 or exotic setups + WeakMapCtorCache +} @Suppress("UNCHECKED_CAST") internal fun tryCopyException(exception: E): E? { @@ -22,33 +27,26 @@ internal fun tryCopyException(exception: E): E? { if (exception is CopyableThrowable<*>) { return runCatching { exception.createCopy() as E? }.getOrNull() } - // Use cached ctor if found - cacheLock.read { exceptionCtors[exception.javaClass] }?.let { cachedCtor -> - return cachedCtor(exception) as E? - } - /* - * Skip reflective copy if an exception has additional fields (that are usually populated in user-defined constructors) - */ - if (throwableFields != exception.javaClass.fieldsCountOrDefault(0)) { - cacheLock.write { exceptionCtors[exception.javaClass] = { null } } - return null - } + return ctorCache.get(exception.javaClass).invoke(exception) as E? +} + +private fun createConstructor(clz: Class): Ctor { + val nullResult: Ctor = { null } // Pre-cache class + // Skip reflective copy if an exception has additional fields (that are usually populated in user-defined constructors) + if (throwableFields != clz.fieldsCountOrDefault(0)) return nullResult /* - * Try to reflectively find constructor(), constructor(message, cause), constructor(cause) or constructor(message). - * Exceptions are shared among coroutines, so we should copy exception before recovering current stacktrace. - */ - var ctor: Ctor? = null - val constructors = exception.javaClass.constructors.sortedByDescending { it.parameterTypes.size } + * Try to reflectively find constructor(), constructor(message, cause), constructor(cause) or constructor(message). + * Exceptions are shared among coroutines, so we should copy exception before recovering current stacktrace. + */ + val constructors = clz.constructors.sortedByDescending { it.parameterTypes.size } for (constructor in constructors) { - ctor = createConstructor(constructor) - if (ctor != null) break + val result = createSafeConstructor(constructor) + if (result != null) return result } - // Store the resulting ctor to cache - cacheLock.write { exceptionCtors[exception.javaClass] = ctor ?: { null } } - return ctor?.invoke(exception) as E? + return nullResult } -private fun createConstructor(constructor: Constructor<*>): Ctor? { +private fun createSafeConstructor(constructor: Constructor<*>): Ctor? { val p = constructor.parameterTypes return when (p.size) { 2 -> when { @@ -71,7 +69,8 @@ private fun createConstructor(constructor: Constructor<*>): Ctor? { private inline fun safeCtor(crossinline block: (Throwable) -> Throwable): Ctor = { e -> runCatching { block(e) }.getOrNull() } -private fun Class<*>.fieldsCountOrDefault(defaultValue: Int) = kotlin.runCatching { fieldsCount() }.getOrDefault(defaultValue) +private fun Class<*>.fieldsCountOrDefault(defaultValue: Int) = + kotlin.runCatching { fieldsCount() }.getOrDefault(defaultValue) private tailrec fun Class<*>.fieldsCount(accumulator: Int = 0): Int { val fieldsCount = declaredFields.count { !Modifier.isStatic(it.modifiers) } @@ -79,3 +78,32 @@ private tailrec fun Class<*>.fieldsCount(accumulator: Int = 0): Int { val superClass = superclass ?: return totalFields return superClass.fieldsCount(totalFields) } + +internal abstract class CtorCache { + abstract fun get(key: Class): Ctor +} + +private object WeakMapCtorCache : CtorCache() { + private val cacheLock = ReentrantReadWriteLock() + private val exceptionCtors: WeakHashMap, Ctor> = WeakHashMap() + + override fun get(key: Class): Ctor { + cacheLock.read { exceptionCtors[key]?.let { return it } } + cacheLock.write { + exceptionCtors[key]?.let { return it } + return createConstructor(key).also { exceptionCtors[key] = it } + } + } +} + +@IgnoreJreRequirement +private object ClassValueCtorCache : CtorCache() { + private val cache = object : ClassValue() { + override fun computeValue(type: Class<*>?): Ctor { + @Suppress("UNCHECKED_CAST") + return createConstructor(type as Class) + } + } + + override fun get(key: Class): Ctor = cache.get(key) +} diff --git a/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt b/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt index 5d60d641aa..47beb85bbf 100644 --- a/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt +++ b/ui/kotlinx-coroutines-android/test/R8ServiceLoaderOptimizationTest.kt @@ -11,7 +11,6 @@ import java.io.* import java.util.stream.* import kotlin.test.* -@Ignore class R8ServiceLoaderOptimizationTest : TestBase() { private val r8Dex = File(System.getProperty("dexPath")!!).asDexFile() private val r8DexNoOptim = File(System.getProperty("noOptimDexPath")!!).asDexFile() From e2a68272ae43ba7d706e4e5ad56922042257edbb Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Tue, 16 Nov 2021 16:23:20 +0300 Subject: [PATCH 184/328] Fix false positive in WorkQueue.addLast (#2968) Fixes #2937 --- .../src/CoroutinesBlockHoundIntegration.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index e13bc06aa0..e7fe1e6c34 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -19,6 +19,7 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { allowServiceLoaderInvocationsOnInit() allowBlockingCallsInReflectionImpl() allowBlockingCallsInDebugProbes() + allowBlockingCallsInWorkQueue() // Stacktrace recovery cache is guarded by lock allowBlockingCallsInside("kotlinx.coroutines.internal.ExceptionsConstructorKt", "tryCopyException") /* The predicates that define that BlockHound should only report blocking calls from threads that are part of @@ -62,6 +63,14 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { } } + /** + * Allow blocking calls inside [kotlinx.coroutines.scheduling.WorkQueue] + */ + private fun BlockHound.Builder.allowBlockingCallsInWorkQueue() { + /** uses [Thread.yield] in a benign way. */ + allowBlockingCallsInside("kotlinx.coroutines.scheduling.WorkQueue", "addLast") + } + /** * Allows blocking inside [kotlinx.coroutines.internal.ThreadSafeHeap]. */ From 2b1e2765f61fcf830f144651c50479f64d4a8558 Mon Sep 17 00:00:00 2001 From: SokolovaMaria Date: Tue, 16 Nov 2021 16:49:21 +0300 Subject: [PATCH 185/328] JobSupport: non-atomic adding to a Job's list of listeners (#2096) * Get rid of DCSS (double compare single swap) primitive in JobSupport in order to reduce both b binary size and performance of list addition Co-authored-by: SokolovaMaria Co-authored-by: Vsevolod Tolstopyatov --- kotlinx-coroutines-core/common/src/Await.kt | 4 +- .../common/src/CompletionHandler.common.kt | 2 + .../common/src/JobSupport.kt | 163 +++++++++++++----- .../src/internal/LockFreeLinkedList.common.kt | 1 - .../common/src/selects/Select.kt | 5 +- .../src/internal/LockFreeLinkedList.kt | 24 +-- .../test/internal/LockFreeLinkedListTest.kt | 14 -- .../js/src/internal/LinkedList.kt | 6 - kotlinx-coroutines-core/jvm/src/Future.kt | 2 +- .../LockFreeLinkedListShortStressTest.kt | 25 +-- 10 files changed, 136 insertions(+), 110 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Await.kt b/kotlinx-coroutines-core/common/src/Await.kt index e06ed33025..275db60f40 100644 --- a/kotlinx-coroutines-core/common/src/Await.kt +++ b/kotlinx-coroutines-core/common/src/Await.kt @@ -107,8 +107,8 @@ private class AwaitAll(private val deferreds: Array>) { var disposer: DisposeHandlersOnCancel? get() = _disposer.value set(value) { _disposer.value = value } - - override fun invoke(cause: Throwable?) { + + override fun invokeOnce(cause: Throwable?) { if (cause != null) { val token = continuation.tryResumeWithException(cause) if (token != null) { diff --git a/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt b/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt index e712ff1fc1..8bc2596a76 100644 --- a/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt +++ b/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt @@ -44,4 +44,6 @@ internal expect val CancelHandlerBase.asHandler: CompletionHandler // because we play type tricks on Kotlin/JS and handler is not necessarily a function there internal expect fun CompletionHandler.invokeIt(cause: Throwable?) +// :KLUDGE: We have to use `isHandlerOf` extension, because performing this type check directly in the code +// causes Incompatible types error during Kotlin/JS compilation internal inline fun CompletionHandler.isHandlerOf(): Boolean = this is T diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index 0a3dd23472..e388f8e6a5 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -456,51 +456,86 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren // Create node upfront -- for common cases it just initializes JobNode.job field, // for user-defined handlers it allocates a JobNode object that we might not need, but this is Ok. val node: JobNode = makeNode(handler, onCancelling) + /* + * LinkedList algorithm does not support removing and re-adding the same node, + * so here we check whether the node is already added to the list to avoid adding the node twice. + */ + var isNodeAdded = false loopOnState { state -> when (state) { is Empty -> { // EMPTY_X state -- no completion handlers if (state.isActive) { // try move to SINGLE state if (_state.compareAndSet(state, node)) return node - } else + } else { promoteEmptyToNodeList(state) // that way we can add listener for non-active coroutine + } } is Incomplete -> { val list = state.list if (list == null) { // SINGLE/SINGLE+ promoteSingleToNodeList(state as JobNode) - } else { - var rootCause: Throwable? = null - var handle: DisposableHandle = NonDisposableHandle - if (onCancelling && state is Finishing) { - synchronized(state) { - // check if we are installing cancellation handler on job that is being cancelled - rootCause = state.rootCause // != null if cancelling job - // We add node to the list in two cases --- either the job is not being cancelled - // or we are adding a child to a coroutine that is not completing yet - if (rootCause == null || handler.isHandlerOf() && !state.isCompleting) { - // Note: add node the list while holding lock on state (make sure it cannot change) - if (!addLastAtomic(state, list, node)) return@loopOnState // retry - // just return node if we don't have to invoke handler (not cancelling yet) - if (rootCause == null) return node - // otherwise handler is invoked immediately out of the synchronized section & handle returned - handle = node + return@loopOnState // retry + } + // ...else {, but without nesting + var rootCause: Throwable? = null + var handle: DisposableHandle = NonDisposableHandle + if (onCancelling && state is Finishing) { + synchronized(state) { + // check if we are installing cancellation handler on job that is being cancelled + rootCause = state.rootCause // != null if cancelling job + // We add node to the list in two cases --- either the job is not being cancelled + // or we are adding a child to a coroutine that is not completing yet + if (rootCause == null || handler.isHandlerOf() && !state.isCompleting) { + // Note: add node the list while holding lock on state (make sure it cannot change) + if (!isNodeAdded) list.addLast(node) + if (this.state !== state) { + /* + * Here we have an additional check for ChildCompletion. Invoking the handler once is not enough + * for this particular kind of node -- the caller makes a decision based on whether the node was added + * or not and that decision should be made **once**. + * To be more precise, the caller of ChildCompletion, in case when it's the last child, + * should make a decision whether to start transition to the final state, based on + * whether the ChildCompletion was added to the list or not. If not -- the JobNode.invoke will do that. + * See comment to JobNode.invoke, we cannot differentiate the situation when external state updater + * invoked or skipped the node, thus we additionally synchronize on 'markInvoked'. + */ + if (node is ChildCompletion && !node.markInvoked()) return node + // The state can only change to Complete here, so the node can stay in the list, just retry + return@loopOnState } + // just return node if we don't have to invoke handler (not cancelling yet) + if (rootCause == null) return node + // otherwise handler is invoked immediately out of the synchronized section & handle returned + handle = node } } - if (rootCause != null) { - // Note: attachChild uses invokeImmediately, so it gets invoked when adding to cancelled job - if (invokeImmediately) handler.invokeIt(rootCause) - return handle + } + if (rootCause != null) { + // Note: attachChild uses invokeImmediately, so it gets invoked when adding to cancelled job + if (invokeImmediately) { + node.invoke(rootCause) + } + return handle + } else { + if (!isNodeAdded) list.addLast(node) + if (this.state !== state) { + // Here again, we try to prevent concurrent finalization of the parent, + // if the parent fails to add ChildCompletion because the child changed it's state to Completed. + if (node is ChildCompletion && !node.markInvoked()) return node + // If the state has changed to Complete, the node can stay in the list, just retry. + if (this.state !is Incomplete) return@loopOnState + // If the state is Incomplete, set the flag that the node is already added to the list instead of removing it. + isNodeAdded = true } else { - if (addLastAtomic(state, list, node)) return node + return node } } } else -> { // is complete - // :KLUDGE: We have to invoke a handler in platform-specific way via `invokeIt` extension, - // because we play type tricks on Kotlin/JS and handler is not necessarily a function there - if (invokeImmediately) handler.invokeIt((state as? CompletedExceptionally)?.cause) + if (invokeImmediately) { + node.invoke((state as? CompletedExceptionally)?.cause) + } return NonDisposableHandle } } @@ -520,9 +555,6 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren return node } - private fun addLastAtomic(expect: Any, list: NodeList, node: JobNode) = - list.addLastIf(node) { this.state === expect } - private fun promoteEmptyToNodeList(state: Empty) { // try to promote it to LIST state with the corresponding state val list = NodeList() @@ -596,7 +628,13 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren } is Incomplete -> { // may have a list of completion handlers // remove node from the list if there is a list - if (state.list != null) node.remove() + if (state.list != null) { + if (!node.remove() && node.isRemoved) { + // Note: .remove() returns 'false' if the node wasn't added at all, e.g. + // because it was an optimized "single element list" + node.helpRemove() + } + } return } else -> return // it is complete and does not have any completion handlers @@ -814,7 +852,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren } } } - } + } /** * Completes this job. Used by [AbstractCoroutine.resume]. @@ -1151,9 +1189,11 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren private val child: ChildHandleNode, private val proposedUpdate: Any? ) : JobNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) { parent.continueCompleting(state, child, proposedUpdate) } + override fun toString(): String = + "ChildCompletion[$child, $proposedUpdate]" } private class AwaitContinuation( @@ -1355,6 +1395,31 @@ internal abstract class JobNode : CompletionHandlerBase(), DisposableHandle, Inc override val isActive: Boolean get() = true override val list: NodeList? get() = null override fun dispose() = job.removeNode(this) + private val isInvoked = atomic(false) + + /* + * This method is guaranteed to be invoked once per JobNode lifecycle. + */ + protected abstract fun invokeOnce(cause: Throwable?) + + /* + * This method can be invoked more than once thus it's protected + * with atomic flag. + * + * It can be invoked twice via [invokeOnCompletion(invokeImmediately = true)] + * when addLastIf fails due to the race with Job state update. + * In that case, we cannot distinguish the situation when the node was added + * and the external state updater actually invoked it from the situation + * when the state updater already invoked all elements from a list and then + * we added a new node to already abandoned list. + * So, when addLastIf fails, we invoke handler in-place, using + * markInvoked as protection against the former case. + */ + final override fun invoke(cause: Throwable?) { + if (!markInvoked()) return + invokeOnce(cause) + } + fun markInvoked() = isInvoked.compareAndSet(false, true) override fun toString() = "$classSimpleName@$hexAddress[job@${job.hexAddress}]" } @@ -1387,20 +1452,22 @@ internal class InactiveNodeList( private class InvokeOnCompletion( private val handler: CompletionHandler -) : JobNode() { - override fun invoke(cause: Throwable?) = handler.invoke(cause) +) : JobNode() { + override fun invokeOnce(cause: Throwable?) = handler.invoke(cause) + override fun toString() = "InvokeOnCompletion[$classSimpleName@$hexAddress]" } private class ResumeOnCompletion( private val continuation: Continuation ) : JobNode() { - override fun invoke(cause: Throwable?) = continuation.resume(Unit) + override fun invokeOnce(cause: Throwable?) = continuation.resume(Unit) + override fun toString() = "ResumeOnCompletion[$continuation]" } private class ResumeAwaitOnCompletion( private val continuation: CancellableContinuationImpl ) : JobNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) { val state = job.state assert { state !is Incomplete } if (state is CompletedExceptionally) { @@ -1412,32 +1479,36 @@ private class ResumeAwaitOnCompletion( continuation.resume(state.unboxState() as T) } } + override fun toString() = "ResumeAwaitOnCompletion[$continuation]" } internal class DisposeOnCompletion( private val handle: DisposableHandle ) : JobNode() { - override fun invoke(cause: Throwable?) = handle.dispose() + override fun invokeOnce(cause: Throwable?) = handle.dispose() + override fun toString(): String = "DisposeOnCompletion[${handle}]" } private class SelectJoinOnCompletion( private val select: SelectInstance, private val block: suspend () -> R ) : JobNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) { if (select.trySelect()) block.startCoroutineCancellable(select.completion) } + override fun toString(): String = "SelectJoinOnCompletion[$select]" } private class SelectAwaitOnCompletion( private val select: SelectInstance, private val block: suspend (T) -> R ) : JobNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) { if (select.trySelect()) job.selectAwaitCompletion(select, block) } + override fun toString(): String = "SelectAwaitOnCompletion[$select]" } // -------- invokeOnCancellation nodes @@ -1450,28 +1521,28 @@ internal abstract class JobCancellingNode : JobNode() private class InvokeOnCancelling( private val handler: CompletionHandler -) : JobCancellingNode() { +) : JobCancellingNode() { // delegate handler shall be invoked at most once, so here is an additional flag - private val _invoked = atomic(0) // todo: replace with atomic boolean after migration to recent atomicFu - override fun invoke(cause: Throwable?) { - if (_invoked.compareAndSet(0, 1)) handler.invoke(cause) - } + override fun invokeOnce(cause: Throwable?) = handler.invoke(cause) + override fun toString() = "InvokeOnCancelling[$classSimpleName@$hexAddress]" } internal class ChildHandleNode( @JvmField val childJob: ChildJob ) : JobCancellingNode(), ChildHandle { override val parent: Job get() = job - override fun invoke(cause: Throwable?) = childJob.parentCancelled(job) + override fun invokeOnce(cause: Throwable?) = childJob.parentCancelled(job) override fun childCancelled(cause: Throwable): Boolean = job.childCancelled(cause) + override fun toString(): String = "ChildHandle[$childJob]" } // Same as ChildHandleNode, but for cancellable continuation internal class ChildContinuation( @JvmField val child: CancellableContinuationImpl<*> ) : JobCancellingNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) = child.parentCancelled(child.getContinuationCancellationCause(job)) - } + override fun toString(): String = + "ChildContinuation[$child]" } diff --git a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt index 8b20ade1f0..4019ef6156 100644 --- a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt @@ -15,7 +15,6 @@ public expect open class LockFreeLinkedListNode() { public val prevNode: LockFreeLinkedListNode public fun addLast(node: LockFreeLinkedListNode) public fun addOneIfEmpty(node: LockFreeLinkedListNode): Boolean - public inline fun addLastIf(node: LockFreeLinkedListNode, crossinline condition: () -> Boolean): Boolean public inline fun addLastIfPrev( node: LockFreeLinkedListNode, predicate: (LockFreeLinkedListNode) -> Boolean diff --git a/kotlinx-coroutines-core/common/src/selects/Select.kt b/kotlinx-coroutines-core/common/src/selects/Select.kt index a313de3d5d..87ac94ec34 100644 --- a/kotlinx-coroutines-core/common/src/selects/Select.kt +++ b/kotlinx-coroutines-core/common/src/selects/Select.kt @@ -336,9 +336,10 @@ internal class SelectBuilderImpl( private inner class SelectOnCancelling : JobCancellingNode() { // Note: may be invoked multiple times, but only the first trySelect succeeds anyway - override fun invoke(cause: Throwable?) { - if (trySelect()) + override fun invokeOnce(cause: Throwable?) { + if (trySelect()) { resumeSelectWithException(job.getCancellationException()) + } } } diff --git a/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt index b4b36dad34..c6ce278987 100644 --- a/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt +++ b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt @@ -86,12 +86,6 @@ public actual open class LockFreeLinkedListNode { } } - @PublishedApi - internal inline fun makeCondAddOp(node: Node, crossinline condition: () -> Boolean): CondAddOp = - object : CondAddOp(node) { - override fun prepare(affected: Node): Any? = if (condition()) null else CONDITION_FALSE - } - public actual open val isRemoved: Boolean get() = next is Removed // LINEARIZABLE. Returns Node | Removed @@ -147,20 +141,6 @@ public actual open class LockFreeLinkedListNode { public fun describeAddLast(node: T): AddLastDesc = AddLastDesc(this, node) - /** - * Adds last item to this list atomically if the [condition] is true. - */ - public actual inline fun addLastIf(node: Node, crossinline condition: () -> Boolean): Boolean { - val condAdd = makeCondAddOp(node, condition) - while (true) { // lock-free loop on prev.next - val prev = prevNode // sentinel node is never removed, so prev is always defined - when (prev.tryCondAddNext(node, this, condAdd)) { - SUCCESS -> return true - FAILURE -> return false - } - } - } - public actual inline fun addLastIfPrev(node: Node, predicate: (Node) -> Boolean): Boolean { while (true) { // lock-free loop on prev.next val prev = prevNode // sentinel node is never removed, so prev is always defined @@ -174,7 +154,9 @@ public actual open class LockFreeLinkedListNode { predicate: (Node) -> Boolean, // prev node predicate crossinline condition: () -> Boolean // atomically checked condition ): Boolean { - val condAdd = makeCondAddOp(node, condition) + val condAdd = object : CondAddOp(node) { + override fun prepare(affected: Node): Any? = if (condition()) null else CONDITION_FALSE + } while (true) { // lock-free loop on prev.next val prev = prevNode // sentinel node is never removed, so prev is always defined if (!predicate(prev)) return false diff --git a/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt index 7e85d495fc..ebf9f44cac 100644 --- a/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt @@ -32,20 +32,6 @@ class LockFreeLinkedListTest { assertContents(list) } - @Test - fun testCondOps() { - val list = LockFreeLinkedListHead() - assertContents(list) - assertTrue(list.addLastIf(IntNode(1)) { true }) - assertContents(list, 1) - assertFalse(list.addLastIf(IntNode(2)) { false }) - assertContents(list, 1) - assertTrue(list.addLastIf(IntNode(3)) { true }) - assertContents(list, 1, 3) - assertFalse(list.addLastIf(IntNode(4)) { false }) - assertContents(list, 1, 3) - } - @Test fun testAtomicOpsSingle() { val list = LockFreeLinkedListHead() diff --git a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt index d8c07f4e19..73af5d78a1 100644 --- a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt +++ b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt @@ -59,12 +59,6 @@ public open class LinkedListNode { return true } - public inline fun addLastIf(node: Node, crossinline condition: () -> Boolean): Boolean { - if (!condition()) return false - addLast(node) - return true - } - public inline fun addLastIfPrev(node: Node, predicate: (Node) -> Boolean): Boolean { if (!predicate(_prev)) return false addLast(node) diff --git a/kotlinx-coroutines-core/jvm/src/Future.kt b/kotlinx-coroutines-core/jvm/src/Future.kt index b27a970845..f935c2a4dc 100644 --- a/kotlinx-coroutines-core/jvm/src/Future.kt +++ b/kotlinx-coroutines-core/jvm/src/Future.kt @@ -35,7 +35,7 @@ public fun CancellableContinuation<*>.cancelFutureOnCancellation(future: Future< private class CancelFutureOnCompletion( private val future: Future<*> ) : JobNode() { - override fun invoke(cause: Throwable?) { + override fun invokeOnce(cause: Throwable?) { // Don't interrupt when cancelling future on completion, because no one is going to reset this // interruption flag and it will cause spurious failures elsewhere if (cause != null) future.cancel(false) diff --git a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt index 2ac51b9b1d..e692cb4c64 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt @@ -40,23 +40,14 @@ class LockFreeLinkedListShortStressTest : TestBase() { threads += thread(start = false, name = "adder-$threadId") { val rnd = Random() while (System.currentTimeMillis() < deadline) { - var node: IntNode? = IntNode(threadId) - when (rnd.nextInt(3)) { - 0 -> list.addLast(node!!) - 1 -> assertTrue(list.addLastIf(node!!, { true })) // just to test conditional add - 2 -> { // just to test failed conditional add - assertFalse(list.addLastIf(node!!, { false })) - node = null - } - } - if (node != null) { - if (node.remove()) { - undone.incrementAndGet() - } else { - // randomly help other removal's completion - if (rnd.nextBoolean()) node.helpRemove() - missed.incrementAndGet() - } + val node = IntNode(threadId) + list.addLast(node) + if (node.remove()) { + undone.incrementAndGet() + } else { + // randomly help other removal's completion + if (rnd.nextBoolean()) node.helpRemove() + missed.incrementAndGet() } } completedAdder.incrementAndGet() From 9099b03005758a5ce369a5bc29b9d1d98b9a95b2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 16 Nov 2021 19:10:14 +0300 Subject: [PATCH 186/328] =?UTF-8?q?Improve=20exception=20transparency:=20e?= =?UTF-8?q?xplicitly=20allow=20throwing=20exceptions=20=E2=80=A6=20(#3017)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve exception transparency: explicitly allow throwing exceptions from the upstream when the downstream has been failed, suppress the downstream exception by the new one, but still ignore it in the exception handling operators, that still consider the flow failed. It solves the problem of graceful shutdown: when the upstream fails unwillingly (e.g. `file.close()` has thrown in `finally` block), we cannot treat it as an exception transparency violation (hint: `finally` is a shortcut for `catch` + body that rethrows in the end), but we also cannot leave things as is, otherwise, it leads to unforeseen consequences such as successful `retry` and `catch` operators that may, or may not, then fail with an exception on an attempt to emit. Upstream exception supersedes the downstream exception only if it is not an instance of `CancellationException`, semantically emulating cancellation-friendly 'use' block. Fixes #2860 --- .../common/src/flow/Flow.kt | 17 ++++- .../common/src/flow/operators/Errors.kt | 39 +++++++++- .../common/test/flow/operators/CatchTest.kt | 57 ++++++++++++++ .../common/test/flow/operators/RetryTest.kt | 59 ++++++++++++++- .../test/exceptions/FlowSuppressionTest.kt | 74 +++++++++++++++++++ 5 files changed, 240 insertions(+), 6 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/exceptions/FlowSuppressionTest.kt diff --git a/kotlinx-coroutines-core/common/src/flow/Flow.kt b/kotlinx-coroutines-core/common/src/flow/Flow.kt index 0ccd343ead..259f477de0 100644 --- a/kotlinx-coroutines-core/common/src/flow/Flow.kt +++ b/kotlinx-coroutines-core/common/src/flow/Flow.kt @@ -131,10 +131,12 @@ import kotlin.coroutines.* * * ### Exception transparency * - * Flow implementations never catch or handle exceptions that occur in downstream flows. From the implementation standpoint - * it means that calls to [emit][FlowCollector.emit] and [emitAll] shall never be wrapped into - * `try { ... } catch { ... }` blocks. Exception handling in flows shall be performed with - * [catch][Flow.catch] operator and it is designed to only catch exceptions coming from upstream flows while passing + * When `emit` or `emitAll` throws, the Flow implementations must immediately stop emitting new values and finish with an exception. + * For diagnostics or application-specific purposes, the exception may be different from the one thrown by the emit operation, + * suppressing the original exception as discussed below. + * If there is a need to emit values after the downstream failed, please use the [catch][Flow.catch] operator. + * + * The [catch][Flow.catch] operator only catches upstream exceptions, but passes * all downstream exceptions. Similarly, terminal operators like [collect][Flow.collect] * throw any unhandled exceptions that occur in their code or in upstream flows, for example: * @@ -147,6 +149,13 @@ import kotlin.coroutines.* * ``` * The same reasoning can be applied to the [onCompletion] operator that is a declarative replacement for the `finally` block. * + * All exception-handling Flow operators follow the principle of exception suppression: + * + * If the upstream flow throws an exception during its completion when the downstream exception has been thrown, + * the downstream exception becomes superseded and suppressed by the upstream exception, being a semantic + * equivalent of throwing from `finally` block. However, this doesn't affect the operation of the exception-handling operators, + * which consider the downstream exception to be the root cause and behave as if the upstream didn't throw anything. + * * Failure to adhere to the exception transparency requirement can lead to strange behaviors which make * it hard to reason about the code because an exception in the `collect { ... }` could be somehow "caught" * by an upstream flow, limiting the ability of local reasoning about the code. diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt b/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt index 608221e09f..c406c8bd72 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt @@ -186,6 +186,7 @@ public fun Flow.retryWhen(predicate: suspend FlowCollector.(cause: Thr } // Return exception from upstream or null +@Suppress("NAME_SHADOWING") internal suspend fun Flow.catchImpl( collector: FlowCollector ): Throwable? { @@ -200,6 +201,8 @@ internal suspend fun Flow.catchImpl( } } } catch (e: Throwable) { + // Otherwise, smartcast is impossible + val fromDownstream = fromDownstream /* * First check ensures that we catch an original exception, not one rethrown by an operator. * Seconds check ignores cancellation causes, they cannot be caught. @@ -207,7 +210,41 @@ internal suspend fun Flow.catchImpl( if (e.isSameExceptionAs(fromDownstream) || e.isCancellationCause(coroutineContext)) { throw e // Rethrow exceptions from downstream and cancellation causes } else { - return e // not from downstream + /* + * The exception came from the upstream [semi-] independently. + * For pure failures, when the downstream functions normally, we handle the exception as intended. + * But if the downstream has failed prior to or concurrently + * with the upstream, we forcefully rethrow it, preserving the contextual information and ensuring that it's not lost. + */ + if (fromDownstream == null) { + return e + } + /* + * We consider the upstream exception as the superseding one when both upstream and downstream + * fail, suppressing the downstream exception, and operating similarly to `finally` block with + * the useful addition of adding the original downstream exception to suppressed ones. + * + * That's important for the following scenarios: + * ``` + * flow { + * val resource = ... + * try { + * ... emit as well ... + * } finally { + * resource.close() // Throws in the shutdown sequence when 'collect' already has thrown an exception + * } + * }.catch { } // or retry + * .collect { ... } + * ``` + * when *the downstream* throws. + */ + if (e is CancellationException) { + fromDownstream.addSuppressed(e) + throw fromDownstream + } else { + e.addSuppressed(fromDownstream) + throw e + } } } return null diff --git a/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt index 447eb73b5d..ad91e49898 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/CatchTest.kt @@ -144,4 +144,61 @@ class CatchTest : TestBase() { .collect() finish(9) } + + @Test + fun testUpstreamExceptionConcurrentWithDownstream() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw TestException() + } + }.catch { expectUnreached() }.onEach { + expect(2) + throw TestException2() + } + + assertFailsWith(flow) + finish(4) + } + + @Test + fun testUpstreamExceptionConcurrentWithDownstreamCancellation() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw TestException() + } + }.catch { expectUnreached() }.onEach { + expect(2) + throw CancellationException("") + } + + assertFailsWith(flow) + finish(4) + } + + @Test + fun testUpstreamCancellationIsIgnoredWhenDownstreamFails() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw CancellationException("") + } + }.catch { expectUnreached() }.onEach { + expect(2) + throw TestException("") + } + + assertFailsWith(flow) + finish(4) + } } diff --git a/kotlinx-coroutines-core/common/test/flow/operators/RetryTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/RetryTest.kt index b8a6b198fb..e5dde1b7fc 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/RetryTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/RetryTest.kt @@ -104,4 +104,61 @@ class RetryTest : TestBase() { job.cancelAndJoin() finish(3) } -} \ No newline at end of file + + @Test + fun testUpstreamExceptionConcurrentWithDownstream() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw TestException() + } + }.retry { expectUnreached(); true }.onEach { + expect(2) + throw TestException2() + } + + assertFailsWith(flow) + finish(4) + } + + @Test + fun testUpstreamExceptionConcurrentWithDownstreamCancellation() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw TestException() + } + }.retry { expectUnreached(); true }.onEach { + expect(2) + throw CancellationException("") + } + + assertFailsWith(flow) + finish(4) + } + + @Test + fun testUpstreamCancellationIsIgnoredWhenDownstreamFails() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw CancellationException("") + } + }.retry { expectUnreached(); true }.onEach { + expect(2) + throw TestException("") + } + + assertFailsWith(flow) + finish(4) + } +} diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/FlowSuppressionTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/FlowSuppressionTest.kt new file mode 100644 index 0000000000..41fe090382 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/exceptions/FlowSuppressionTest.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.exceptions + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import org.junit.* +import org.junit.Test +import kotlin.test.* + +class FlowSuppressionTest : TestBase() { + @Test + fun testSuppressionForPrimaryException() = runTest { + val flow = flow { + try { + emit(1) + } finally { + throw TestException() + } + }.catch { expectUnreached() }.onEach { throw TestException2() } + + try { + flow.collect() + } catch (e: Throwable) { + assertIs(e) + assertIs(e.suppressed[0]) + } + } + + @Test + fun testSuppressionForPrimaryExceptionRetry() = runTest { + val flow = flow { + try { + emit(1) + } finally { + throw TestException() + } + }.retry { expectUnreached(); true }.onEach { throw TestException2() } + + try { + flow.collect() + } catch (e: Throwable) { + assertIs(e) + assertIs(e.suppressed[0]) + + } + } + + @Test + fun testCancellationSuppression() = runTest { + val flow = flow { + try { + expect(1) + emit(1) + } finally { + expect(3) + throw CancellationException("") + } + }.catch { expectUnreached() }.onEach { + expect(2) + throw TestException("") + } + + try { + flow.collect() + } catch (e: Throwable) { + assertIs(e) + assertIs(e.suppressed[0]) + } + finish(4) + } +} From ae0c842d9f5d8e4718d54960325c260dc551426e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 16 Nov 2021 19:41:14 +0300 Subject: [PATCH 187/328] Promote deprecation levels for release 1.6.0 (#3024) --- .../api/kotlinx-coroutines-core.api | 10 - kotlinx-coroutines-core/common/README.md | 9 - .../common/src/channels/AbstractChannel.kt | 2 +- .../common/src/channels/Channel.kt | 10 +- .../common/src/channels/Channels.common.kt | 4 +- .../common/src/flow/Builders.kt | 19 - .../common/src/flow/Channels.kt | 35 -- .../common/src/flow/operators/Context.kt | 58 --- .../common/src/flow/operators/Errors.kt | 39 -- .../common/src/sync/Mutex.kt | 2 +- .../jvm/src/channels/Actor.kt | 2 +- .../jvm/src/channels/Channels.kt | 4 +- .../jvm/src/scheduling/Deprecated.kt | 2 +- .../jvm/src/test_/TestCoroutineContext.kt | 46 +- .../jvm/test/test/TestCoroutineContextTest.kt | 404 ------------------ .../api/kotlinx-coroutines-reactive.api | 4 +- .../kotlinx-coroutines-reactive/src/Await.kt | 6 +- .../src/Channel.kt | 32 +- .../src/Convert.kt | 10 +- .../kotlinx-coroutines-reactor/src/Mono.kt | 10 +- .../src/ReactorContext.kt | 6 +- .../api/kotlinx-coroutines-rx2.api | 4 +- .../kotlinx-coroutines-rx2/src/RxAwait.kt | 4 +- .../kotlinx-coroutines-rx2/src/RxChannel.kt | 46 +- .../kotlinx-coroutines-rx3/src/RxAwait.kt | 4 +- 25 files changed, 62 insertions(+), 710 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test/test/TestCoroutineContextTest.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 546bfe3507..9ccef08308 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -889,8 +889,6 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun asFlow ([Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun asSharedFlow (Lkotlinx/coroutines/flow/MutableSharedFlow;)Lkotlinx/coroutines/flow/SharedFlow; public static final fun asStateFlow (Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; - public static final fun broadcastIn (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineStart;)Lkotlinx/coroutines/channels/BroadcastChannel; - public static synthetic fun broadcastIn$default (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/CoroutineStart;ILjava/lang/Object;)Lkotlinx/coroutines/channels/BroadcastChannel; public static final synthetic fun buffer (Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; public static final fun buffer (Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; public static synthetic fun buffer$default (Lkotlinx/coroutines/flow/Flow;IILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; @@ -961,10 +959,6 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun flowOf (Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun flowOf ([Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun flowOn (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; - public static final fun flowViaChannel (ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun flowViaChannel$default (ILkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; - public static final fun flowWith (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun flowWith$default (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun fold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun forEach (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V public static final fun getDEFAULT_CONCURRENCY ()I @@ -981,8 +975,6 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun onCompletion (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; public static final fun onEach (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; public static final fun onEmpty (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun onErrorCollect (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun onErrorCollect$default (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun onErrorResume (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; public static final fun onErrorResumeNext (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; public static final fun onErrorReturn (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;)Lkotlinx/coroutines/flow/Flow; @@ -998,9 +990,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun reduce (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun replay (Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; public static final fun replay (Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; - public static final synthetic fun retry (Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow; public static final fun retry (Lkotlinx/coroutines/flow/Flow;JLkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun retry$default (Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static synthetic fun retry$default (Lkotlinx/coroutines/flow/Flow;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; public static final fun retryWhen (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; public static final fun runningFold (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index b00921bbcd..b09c44c75e 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -66,10 +66,6 @@ This module provides debugging facilities for coroutines (run JVM with `-ea` or and [newCoroutineContext] function to write user-defined coroutine builders that work with these debugging facilities. See [DEBUG_PROPERTY_NAME] for more details. -This module provides a special CoroutineContext type [TestCoroutineCoroutineContext][kotlinx.coroutines.test.TestCoroutineContext] that -allows the writer of code that contains Coroutines with delays and timeouts to write non-flaky unit-tests for that code allowing these tests to -terminate in near zero time. See the documentation for this class for more information. - # Package kotlinx.coroutines General-purpose coroutine builders, contexts, and helper functions. @@ -130,7 +126,6 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.sync.Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html [kotlinx.coroutines.sync.Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[kotlinx.coroutines.sync.Mutex.tryLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/try-lock.html @@ -155,8 +150,4 @@ Low-level primitives for finer-grained control of coroutines. [kotlinx.coroutines.selects.select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html [kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html - - -[kotlinx.coroutines.test.TestCoroutineContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.test/-test-coroutine-context/index.html - diff --git a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt index 4751296c87..b92ced6ab7 100644 --- a/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/AbstractChannel.kt @@ -136,7 +136,7 @@ internal abstract class AbstractSendChannel( return sendSuspend(element) } - @Suppress("DEPRECATION") + @Suppress("DEPRECATION", "DEPRECATION_ERROR") override fun offer(element: E): Boolean { // Temporary migration for offer users who rely on onUndeliveredElement try { diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index b24658a4c4..68ed5f1e78 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -157,10 +157,10 @@ public interface SendChannel { * @suppress **Deprecated**. */ @Deprecated( - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, message = "Deprecated in the favour of 'trySend' method", replaceWith = ReplaceWith("trySend(element).isSuccess") - ) // Warning since 1.5.0 + ) // Warning since 1.5.0, error since 1.6.0 public fun offer(element: E): Boolean { val result = trySend(element) if (result.isSuccess) return true @@ -313,12 +313,12 @@ public interface ReceiveChannel { * @suppress **Deprecated**. */ @Deprecated( - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, message = "Deprecated in the favour of 'tryReceive'. " + "Please note that the provided replacement does not rethrow channel's close cause as 'poll' did, " + "for the precise replacement please refer to the 'poll' documentation", replaceWith = ReplaceWith("tryReceive().getOrNull()") - ) // Warning since 1.5.0 + ) // Warning since 1.5.0, error since 1.6.0 public fun poll(): E? { val result = tryReceive() if (result.isSuccess) return result.getOrThrow() @@ -364,7 +364,7 @@ public interface ReceiveChannel { message = "Deprecated in favor of onReceiveCatching extension", level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("onReceiveCatching") - ) // Warning since 1.3.0, error in 1.5.0, will be hidden or removed in 1.6.0 + ) // Warning since 1.3.0, error in 1.5.0, will be hidden or removed in 1.7.0 public val onReceiveOrNull: SelectClause1 get() { return object : SelectClause1 { diff --git a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt index e0b4f9d2a5..a78e2f186d 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channels.common.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channels.common.kt @@ -50,7 +50,7 @@ public inline fun BroadcastChannel.consume(block: ReceiveChannel.() @Deprecated( "Deprecated in the favour of 'receiveCatching'", ReplaceWith("receiveCatching().getOrNull()"), - DeprecationLevel.WARNING + DeprecationLevel.ERROR ) // Warning since 1.5.0, ERROR in 1.6.0, HIDDEN in 1.7.0 @Suppress("EXTENSION_SHADOWED_BY_MEMBER") public suspend fun ReceiveChannel.receiveOrNull(): E? { @@ -63,7 +63,7 @@ public suspend fun ReceiveChannel.receiveOrNull(): E? { */ @Deprecated( "Deprecated in the favour of 'onReceiveCatching'", - level = DeprecationLevel.WARNING + level = DeprecationLevel.ERROR ) // Warning since 1.5.0, ERROR in 1.6.0, HIDDEN in 1.7.0 public fun ReceiveChannel.onReceiveOrNull(): SelectClause1 { @Suppress("DEPRECATION", "UNCHECKED_CAST") diff --git a/kotlinx-coroutines-core/common/src/flow/Builders.kt b/kotlinx-coroutines-core/common/src/flow/Builders.kt index 66b55a90c0..c4b55e104b 100644 --- a/kotlinx-coroutines-core/common/src/flow/Builders.kt +++ b/kotlinx-coroutines-core/common/src/flow/Builders.kt @@ -198,25 +198,6 @@ public fun LongRange.asFlow(): Flow = flow { } } -/** - * @suppress - */ -@FlowPreview -@Deprecated( - message = "Use channelFlow with awaitClose { } instead of flowViaChannel and invokeOnClose { }.", - level = DeprecationLevel.ERROR -) // To be removed in 1.4.x -@Suppress("DeprecatedCallableAddReplaceWith") -public fun flowViaChannel( - bufferSize: Int = BUFFERED, - @BuilderInference block: CoroutineScope.(channel: SendChannel) -> Unit -): Flow { - return channelFlow { - block(channel) - awaitClose() - }.buffer(bufferSize) -} - /** * Creates an instance of a _cold_ [Flow] with elements that are sent to a [SendChannel] * provided to the builder's [block] of code via [ProducerScope]. It allows elements to be diff --git a/kotlinx-coroutines-core/common/src/flow/Channels.kt b/kotlinx-coroutines-core/common/src/flow/Channels.kt index 382953efcb..82dd8d5cdf 100644 --- a/kotlinx-coroutines-core/common/src/flow/Channels.kt +++ b/kotlinx-coroutines-core/common/src/flow/Channels.kt @@ -178,41 +178,6 @@ public fun BroadcastChannel.asFlow(): Flow = flow { emitAll(openSubscription()) } -/** - * ### Deprecated - * - * **This API is deprecated.** The [BroadcastChannel] provides a complex channel-like API for hot flows. - * [SharedFlow] is an easier-to-use and more flow-centric API for the same purposes, so using - * [shareIn] operator is preferred. It is not a direct replacement, so please - * study [shareIn] documentation to see what kind of shared flow fits your use-case. As a rule of thumb: - * - * * Replace `broadcastIn(scope)` and `broadcastIn(scope, CoroutineStart.LAZY)` with `shareIn(scope, 0, SharingStarted.Lazily)`. - * * Replace `broadcastIn(scope, CoroutineStart.DEFAULT)` with `shareIn(scope, 0, SharingStarted.Eagerly)`. - */ -@Deprecated( - message = "Use shareIn operator and the resulting SharedFlow as a replacement for BroadcastChannel", - replaceWith = ReplaceWith("this.shareIn(scope, SharingStarted.Lazily, 0)"), - level = DeprecationLevel.ERROR -) // WARNING in 1.4.0, error in 1.5.0, removed in 1.6.0 (was @FlowPreview) -public fun Flow.broadcastIn( - scope: CoroutineScope, - start: CoroutineStart = CoroutineStart.LAZY -): BroadcastChannel { - // Backwards compatibility with operator fusing - val channelFlow = asChannelFlow() - val capacity = when (channelFlow.onBufferOverflow) { - BufferOverflow.SUSPEND -> channelFlow.produceCapacity - BufferOverflow.DROP_OLDEST -> Channel.CONFLATED - BufferOverflow.DROP_LATEST -> - throw IllegalArgumentException("Broadcast channel does not support BufferOverflow.DROP_LATEST") - } - return scope.broadcast(channelFlow.context, capacity = capacity, start = start) { - collect { value -> - send(value) - } - } -} - /** * Creates a [produce] coroutine that collects the given flow. * diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt index 04342ed074..ace01e1d44 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt @@ -277,64 +277,6 @@ private class CancellableFlowImpl(private val flow: Flow) : CancellableFlo } } -/** - * The operator that changes the context where all transformations applied to the given flow within a [builder] are executed. - * This operator is context preserving and does not affect the context of the preceding and subsequent operations. - * - * Example: - * - * ``` - * flow // not affected - * .map { ... } // Not affected - * .flowWith(Dispatchers.IO) { - * map { ... } // in IO - * .filter { ... } // in IO - * } - * .map { ... } // Not affected - * ``` - * - * For more explanation of context preservation please refer to [Flow] documentation. - * - * This operator is deprecated without replacement because it was discovered that it doesn't play well with coroutines - * and flow semantics: - * - * 1) It doesn't prevent context elements from the downstream to leak into its body - * ``` - * flowOf(1).flowWith(EmptyCoroutineContext) { - * onEach { println(kotlin.coroutines.coroutineContext[CoroutineName]) } // Will print 42 - * }.flowOn(CoroutineName(42)) - * ``` - * 2) To avoid such leaks, new primitive should be introduced to `kotlinx.coroutines` -- the subtraction of contexts. - * And this will become a new concept to learn, maintain and explain. - * 3) It defers the execution of declarative [builder] until the moment of [collection][Flow.collect] similarly - * to `Observable.defer`. But it is unexpected because nothing in the name `flowWith` reflects this fact. - * 4) It can be confused with [flowOn] operator, though [flowWith] is much rarer. - * - * @suppress - */ -@FlowPreview -@Deprecated(message = "flowWith is deprecated without replacement, please refer to its KDoc for an explanation", level = DeprecationLevel.ERROR) // Error in beta release, removal in 1.4 -public fun Flow.flowWith( - flowContext: CoroutineContext, - bufferSize: Int = BUFFERED, - builder: Flow.() -> Flow -): Flow { - checkFlowContext(flowContext) - val source = this - return unsafeFlow { - /** - * Here we should remove a Job instance from the context. - * All builders are written using scoping and no global coroutines are launched, so it is safe not to provide explicit Job. - * It is also necessary not to mess with cancellation if multiple flowWith are used. - */ - val originalContext = currentCoroutineContext().minusKey(Job) - val prepared = source.flowOn(originalContext).buffer(bufferSize) - builder(prepared).flowOn(flowContext).buffer(bufferSize).collect { value -> - return@collect emit(value) - } - } -} - private fun checkFlowContext(context: CoroutineContext) { require(context[Job] == null) { "Flow context cannot contain job in it. Had $context" diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt b/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt index c406c8bd72..30512f407d 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Errors.kt @@ -60,35 +60,6 @@ public fun Flow.catch(action: suspend FlowCollector.(cause: Throwable) if (exception != null) action(exception) } -/** - * @suppress **Deprecated**: Use `(Throwable) -> Boolean` functional type - */ -@Deprecated( - level = DeprecationLevel.ERROR, - message = "Use (Throwable) -> Boolean functional type", - replaceWith = ReplaceWith("(Throwable) -> Boolean") -) -public typealias ExceptionPredicate = (Throwable) -> Boolean - -/** - * Switches to the [fallback] flow if the original flow throws an exception that matches the [predicate]. - * Cancellation exceptions that were caused by the direct [cancel] call are not handled by this operator. - * - * @suppress **Deprecated**: Use `catch { e -> if (predicate(e)) emitAll(fallback) else throw e }` - */ -@Deprecated( - level = DeprecationLevel.ERROR, - message = "Use catch { e -> if (predicate(e)) emitAll(fallback) else throw e }", - replaceWith = ReplaceWith("catch { e -> if (predicate(e)) emitAll(fallback) else throw e }") -) -public fun Flow.onErrorCollect( - fallback: Flow, - predicate: (Throwable) -> Boolean = { true } -): Flow = catch { e -> - if (!predicate(e)) throw e - emitAll(fallback) -} - /** * Retries collection of the given flow up to [retries] times when an exception that matches the * given [predicate] occurs in the upstream flow. This operator is *transparent* to exceptions that occur @@ -124,16 +95,6 @@ public fun Flow.retry( return retryWhen { cause, attempt -> attempt < retries && predicate(cause) } } -@FlowPreview -@Deprecated(level = DeprecationLevel.HIDDEN, message = "binary compatibility with retries: Int preview version") -public fun Flow.retry( - retries: Int = Int.MAX_VALUE, - predicate: (Throwable) -> Boolean = { true } -): Flow { - require(retries > 0) { "Expected positive amount of retries, but had $retries" } - return retryWhen { cause, attempt -> predicate(cause) && attempt < retries } -} - /** * Retries collection of the given flow when an exception occurs in the upstream flow and the * [predicate] returns true. The predicate also receives an `attempt` number as parameter, diff --git a/kotlinx-coroutines-core/common/src/sync/Mutex.kt b/kotlinx-coroutines-core/common/src/sync/Mutex.kt index c02422825e..d2a2fcd41b 100644 --- a/kotlinx-coroutines-core/common/src/sync/Mutex.kt +++ b/kotlinx-coroutines-core/common/src/sync/Mutex.kt @@ -65,7 +65,7 @@ public interface Mutex { * Deprecated for removal without built-in replacement. */ @Deprecated(level = DeprecationLevel.WARNING, message = "Mutex.onLock deprecated without replacement. " + - "For additional details please refer to #2794") + "For additional details please refer to #2794") // WARNING since 1.6.0 public val onLock: SelectClause2 /** diff --git a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt index 4657bc7d1e..748f52833f 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Actor.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Actor.kt @@ -163,7 +163,7 @@ private class LazyActorCoroutine( return super.send(element) } - @Suppress("DEPRECATION") + @Suppress("DEPRECATION", "DEPRECATION_ERROR") override fun offer(element: E): Boolean { start() return super.offer(element) diff --git a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt index 0df8278b77..d7454027fb 100644 --- a/kotlinx-coroutines-core/jvm/src/channels/Channels.kt +++ b/kotlinx-coroutines-core/jvm/src/channels/Channels.kt @@ -43,11 +43,11 @@ import kotlinx.coroutines.* * ``` */ @Deprecated( - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, message = "Deprecated in the favour of 'trySendBlocking'. " + "Consider handling the result of 'trySendBlocking' explicitly and rethrow exception if necessary", replaceWith = ReplaceWith("trySendBlocking(element)") -) +) // WARNING in 1.5.0, ERROR in 1.6.0, HIDDEN in 1.7.0 public fun SendChannel.sendBlocking(element: E) { // fast path if (trySend(element).isSuccess) diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt b/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt index 86b0ade61a..e5defbafcd 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/Deprecated.kt @@ -18,7 +18,7 @@ import kotlin.coroutines.* * To preserve backwards compatibility with Ktor 1.x, previous version of the code is * extracted here as is and isolated from the rest of code base, so R8 can get rid of it. * - * It should be removed after Kotlin 3.0.0 (EOL of Ktor 1.x) around 2022. + * It should be removed after Ktor 3.0.0 (EOL of Ktor 1.x) around 2022. */ @PublishedApi internal open class ExperimentalCoroutineDispatcher( diff --git a/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt index 8526ca216a..6a71a4deb4 100644 --- a/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt @@ -10,29 +10,10 @@ import kotlinx.coroutines.internal.* import java.util.concurrent.* import kotlin.coroutines.* -/** - * This [CoroutineContext] dispatcher can be used to simulate virtual time to speed up - * code, especially tests, that deal with delays and timeouts in Coroutines. - * - * Provide an instance of this TestCoroutineContext when calling the *non-blocking* - * [launch][CoroutineScope.launch] or [async][CoroutineScope.async] - * and then advance time or trigger the actions to make the co-routines execute as soon as possible. - * - * This works much like the *TestScheduler* in RxJava2, which allows to speed up tests that deal - * with non-blocking Rx chains that contain delays, timeouts, intervals and such. - * - * This dispatcher can also handle *blocking* coroutines that are started by [runBlocking]. - * This dispatcher's virtual time will be automatically advanced based on the delayed actions - * within the Coroutine(s). - * - * **Note: This API will become obsolete in future updates due to integration with structured concurrency.** - * See [issue #541](https://github.com/Kotlin/kotlinx.coroutines/issues/541). - * - * @param name A user-readable name for debugging purposes. - */ +/** @suppress */ @Deprecated("This API has been deprecated to integrate with Structured Concurrency.", ReplaceWith("TestCoroutineScope", "kotlin.coroutines.test"), - level = DeprecationLevel.WARNING) + level = DeprecationLevel.ERROR) // ERROR in 1.6.0, removed in 1.7.0 public class TestCoroutineContext(private val name: String? = null) : CoroutineContext { private val uncaughtExceptions = mutableListOf() @@ -264,28 +245,11 @@ private class TimedRunnableObsolete( override fun toString() = "TimedRunnable(time=$time, run=$run)" } -/** - * Executes a block of code in which a unit-test can be written using the provided [TestCoroutineContext]. The provided - * [TestCoroutineContext] is available in the [testBody] as the `this` receiver. - * - * The [testBody] is executed and an [AssertionError] is thrown if the list of unhandled exceptions is not empty and - * contains any exception that is not a [CancellationException]. - * - * If the [testBody] successfully executes one of the [TestCoroutineContext.assertAllUnhandledExceptions], - * [TestCoroutineContext.assertAnyUnhandledException], [TestCoroutineContext.assertUnhandledException] or - * [TestCoroutineContext.assertExceptions], the list of unhandled exceptions will have been cleared and this method will - * not throw an [AssertionError]. - * - * **Note: This API will become obsolete in future updates due to integration with structured concurrency.** - * See [issue #541](https://github.com/Kotlin/kotlinx.coroutines/issues/541). - * - * @param testContext The provided [TestCoroutineContext]. If not specified, a default [TestCoroutineContext] will be - * provided instead. - * @param testBody The code of the unit-test. - */ +/** @suppress */ @Deprecated("This API has been deprecated to integrate with Structured Concurrency.", ReplaceWith("testContext.runBlockingTest(testBody)", "kotlin.coroutines.test"), - level = DeprecationLevel.WARNING) + level = DeprecationLevel.ERROR) // ERROR in 1.6.0, removed in 1.7.0 +@Suppress("DEPRECATION_ERROR") public fun withTestContext(testContext: TestCoroutineContext = TestCoroutineContext(), testBody: TestCoroutineContext.() -> Unit) { with (testContext) { testBody() diff --git a/kotlinx-coroutines-core/jvm/test/test/TestCoroutineContextTest.kt b/kotlinx-coroutines-core/jvm/test/test/TestCoroutineContextTest.kt deleted file mode 100644 index 4a6f4d24df..0000000000 --- a/kotlinx-coroutines-core/jvm/test/test/TestCoroutineContextTest.kt +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import org.junit.* -import org.junit.Test -import kotlin.coroutines.* -import kotlin.test.* - -class TestCoroutineContextTest { - private val injectedContext = TestCoroutineContext() - - @After - fun tearDown() { - injectedContext.cancelAllActions() - } - - @Test - fun testDelayWithLaunch() = withTestContext(injectedContext) { - val delay = 1000L - - var executed = false - launch { - suspendedDelayedAction(delay) { - executed = true - } - } - - advanceTimeBy(delay / 2) - assertFalse(executed) - - advanceTimeBy(delay / 2) - assertTrue(executed) - } - - @Test - fun testTimeJumpWithLaunch() = withTestContext(injectedContext) { - val delay = 1000L - - var executed = false - launch { - suspendedDelayedAction(delay) { - executed = true - } - } - - advanceTimeTo(delay / 2) - assertFalse(executed) - - advanceTimeTo(delay) - assertTrue(executed) - } - - @Test - fun testDelayWithAsync() = withTestContext(injectedContext) { - val delay = 1000L - - var executed = false - async { - suspendedDelayedAction(delay) { - executed = true - } - } - - advanceTimeBy(delay / 2) - assertFalse(executed) - - advanceTimeBy(delay / 2) - assertTrue(executed) - } - - @Test - fun testDelayWithRunBlocking() = withTestContext(injectedContext) { - val delay = 1000L - - var executed = false - runBlocking { - suspendedDelayedAction(delay) { - executed = true - } - } - - assertTrue(executed) - assertEquals(delay, now()) - } - - private suspend fun suspendedDelayedAction(delay: Long, action: () -> Unit) { - delay(delay) - action() - } - - @Test - fun testDelayedFunctionWithRunBlocking() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 16 - - val result = runBlocking { - suspendedDelayedFunction(delay) { - expectedValue - } - } - - assertEquals(expectedValue, result) - assertEquals(delay, now()) - } - - @Test - fun testDelayedFunctionWithAsync() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 16 - - val deferred = async { - suspendedDelayedFunction(delay) { - expectedValue - } - } - - advanceTimeBy(delay / 2) - try { - deferred.getCompleted() - fail("The Job should not have been completed yet.") - } catch (e: Exception) { - // Success. - } - - advanceTimeBy(delay / 2) - assertEquals(expectedValue, deferred.getCompleted()) - } - - private suspend fun TestCoroutineContext.suspendedDelayedFunction(delay: Long, function: () -> T): T { - delay(delay / 4) - return async { - delay((delay / 4) * 3) - function() - }.await() - } - - @Test - fun testBlockingFunctionWithRunBlocking() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 16 - val result = runBlocking { - suspendedBlockingFunction(delay) { - expectedValue - } - } - assertEquals(expectedValue, result) - assertEquals(delay, now()) - } - - @Test - fun testBlockingFunctionWithAsync() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 16 - var now = 0L - val deferred = async { - suspendedBlockingFunction(delay) { - expectedValue - } - } - now += advanceTimeBy((delay / 4) - 1) - assertEquals((delay / 4) - 1, now) - assertEquals(now, now()) - try { - deferred.getCompleted() - fail("The Job should not have been completed yet.") - } catch (e: Exception) { - // Success. - } - now += advanceTimeBy(1) - assertEquals(delay, now()) - assertEquals(now, now()) - assertEquals(expectedValue, deferred.getCompleted()) - } - - private suspend fun TestCoroutineContext.suspendedBlockingFunction(delay: Long, function: () -> T): T { - delay(delay / 4) - return runBlocking { - delay((delay / 4) * 3) - function() - } - } - - @Test - fun testTimingOutFunctionWithAsyncAndNoTimeout() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 67 - - val result = async { - suspendedTimingOutFunction(delay, delay + 1) { - expectedValue - } - } - - triggerActions() - assertEquals(expectedValue, result.getCompleted()) - } - - @Test - fun testTimingOutFunctionWithAsyncAndTimeout() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 67 - - val result = async { - suspendedTimingOutFunction(delay, delay) { - expectedValue - } - } - - triggerActions() - assertTrue(result.getCompletionExceptionOrNull() is TimeoutCancellationException) - } - - @Test - fun testTimingOutFunctionWithRunBlockingAndTimeout() = withTestContext(injectedContext) { - val delay = 1000L - val expectedValue = 67 - - try { - runBlocking { - suspendedTimingOutFunction(delay, delay) { - expectedValue - } - } - fail("Expected TimeoutCancellationException to be thrown.") - } catch (e: TimeoutCancellationException) { - // Success - } catch (e: Throwable) { - fail("Expected TimeoutCancellationException to be thrown: $e") - } - } - - private suspend fun TestCoroutineContext.suspendedTimingOutFunction(delay: Long, timeOut: Long, function: () -> T): T { - return runBlocking { - withTimeout(timeOut) { - delay(delay / 2) - val ret = function() - delay(delay / 2) - ret - } - } - } - - @Test(expected = AssertionError::class) - fun testWithTestContextThrowingAnAssertionError() = withTestContext(injectedContext) { - val expectedError = IllegalAccessError("hello") - - launch { - throw expectedError - } - - triggerActions() - } - - @Test - fun testExceptionHandlingWithLaunch() = withTestContext(injectedContext) { - val expectedError = IllegalAccessError("hello") - - launch { - throw expectedError - } - - triggerActions() - assertUnhandledException { it === expectedError} - } - - @Test - fun testExceptionHandlingWithLaunchingChildCoroutines() = withTestContext(injectedContext) { - val delay = 1000L - val expectedError = TestException("hello") - val expectedValue = 12 - - launch { - suspendedAsyncWithExceptionAfterDelay(delay, expectedError, expectedValue, true) - } - - advanceTimeBy(delay) - assertUnhandledException { it === expectedError} - } - - @Test - fun testExceptionHandlingWithAsyncAndDontWaitForException() = withTestContext(injectedContext) { - val delay = 1000L - val expectedError = IllegalAccessError("hello") - val expectedValue = 12 - - val result = async { - suspendedAsyncWithExceptionAfterDelay(delay, expectedError, expectedValue, false) - } - - advanceTimeBy(delay) - - assertNull(result.getCompletionExceptionOrNull()) - assertEquals(expectedValue, result.getCompleted()) - } - - @Test - fun testExceptionHandlingWithAsyncAndWaitForException() = withTestContext(injectedContext) { - val delay = 1000L - val expectedError = TestException("hello") - val expectedValue = 12 - - val result = async { - suspendedAsyncWithExceptionAfterDelay(delay, expectedError, expectedValue, true) - } - - advanceTimeBy(delay) - - val e = result.getCompletionExceptionOrNull() - assertTrue(expectedError === e, "Expected to be thrown: '$expectedError' but was '$e'") - } - - @Test - fun testExceptionHandlingWithRunBlockingAndDontWaitForException() = withTestContext(injectedContext) { - val delay = 1000L - val expectedError = IllegalAccessError("hello") - val expectedValue = 12 - - val result = runBlocking { - suspendedAsyncWithExceptionAfterDelay(delay, expectedError, expectedValue, false) - } - - advanceTimeBy(delay) - - assertEquals(expectedValue, result) - } - - @Test - fun testExceptionHandlingWithRunBlockingAndWaitForException() = withTestContext(injectedContext) { - val delay = 1000L - val expectedError = TestException("hello") - val expectedValue = 12 - - try { - runBlocking { - suspendedAsyncWithExceptionAfterDelay(delay, expectedError, expectedValue, true) - } - fail("Expected to be thrown: '$expectedError'") - } catch (e: AssertionError) { - throw e - } catch (e: Throwable) { - assertTrue(expectedError === e, "Expected to be thrown: '$expectedError' but was '$e'") - } - } - - private suspend fun TestCoroutineContext.suspendedAsyncWithExceptionAfterDelay(delay: Long, exception: Throwable, value: T, await: Boolean): T { - val deferred = async { - delay(delay - 1) - throw exception - } - - if (await) { - deferred.await() - } - return value - } - - @Test - fun testCancellationException() = withTestContext { - val job = launch { - delay(1000) - } - - advanceTimeBy(500) - job.cancel() - assertAllUnhandledExceptions { it is CancellationException } - } - - @Test - fun testCancellationExceptionNotThrownByWithTestContext() = withTestContext { - val job = launch { - delay(1000) - } - - advanceTimeBy(500) - job.cancel() - } -} - - -/* Some helper functions */ -// todo: deprecate, replace, see https://github.com/Kotlin/kotlinx.coroutines/issues/541 -private fun TestCoroutineContext.launch( - start: CoroutineStart = CoroutineStart.DEFAULT, - parent: Job? = null, - block: suspend CoroutineScope.() -> Unit -) = - GlobalScope.launch(this + (parent ?: EmptyCoroutineContext), start, block) - -// todo: deprecate, replace, see https://github.com/Kotlin/kotlinx.coroutines/issues/541 -private fun TestCoroutineContext.async( - start: CoroutineStart = CoroutineStart.DEFAULT, - parent: Job? = null, - block: suspend CoroutineScope.() -> T - -) = - GlobalScope.async(this + (parent ?: EmptyCoroutineContext), start, block) - -private fun TestCoroutineContext.runBlocking( - block: suspend CoroutineScope.() -> T -) = runBlocking(this, block) diff --git a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api index 75f1b306d3..c82880233a 100644 --- a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api +++ b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api @@ -12,7 +12,7 @@ public final class kotlinx/coroutines/reactive/AwaitKt { public final class kotlinx/coroutines/reactive/ChannelKt { public static final fun collect (Lorg/reactivestreams/Publisher;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun openSubscription (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun openSubscription (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun openSubscription$default (Lorg/reactivestreams/Publisher;IILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun toChannel (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; } @@ -22,7 +22,7 @@ public abstract interface class kotlinx/coroutines/reactive/ContextInjector { } public final class kotlinx/coroutines/reactive/ConvertKt { - public static final fun asPublisher (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;)Lorg/reactivestreams/Publisher; + public static final synthetic fun asPublisher (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;)Lorg/reactivestreams/Publisher; public static synthetic fun asPublisher$default (Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lorg/reactivestreams/Publisher; } diff --git a/reactive/kotlinx-coroutines-reactive/src/Await.kt b/reactive/kotlinx-coroutines-reactive/src/Await.kt index fef1205a8a..da8632bffc 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Await.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Await.kt @@ -106,7 +106,7 @@ public suspend fun Publisher.awaitSingle(): T = awaitOne(Mode.SINGLE) @Deprecated( message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + "Please consider using awaitFirstOrDefault().", - level = DeprecationLevel.WARNING + level = DeprecationLevel.ERROR ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun Publisher.awaitSingleOrDefault(default: T): T = awaitOne(Mode.SINGLE_OR_DEFAULT, default) @@ -135,7 +135,7 @@ public suspend fun Publisher.awaitSingleOrDefault(default: T): T = awaitO message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + "There is a specialized version for Reactor's Mono, please use that where applicable. " + "Alternatively, please consider using awaitFirstOrNull().", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull()", "kotlinx.coroutines.reactor") ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun Publisher.awaitSingleOrNull(): T? = awaitOne(Mode.SINGLE_OR_DEFAULT) @@ -164,7 +164,7 @@ public suspend fun Publisher.awaitSingleOrNull(): T? = awaitOne(Mode.SING @Deprecated( message = "Deprecated without a replacement due to its name incorrectly conveying the behavior. " + "Please consider using awaitFirstOrElse().", - level = DeprecationLevel.WARNING + level = DeprecationLevel.ERROR ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun Publisher.awaitSingleOrElse(defaultValue: () -> T): T = awaitOne(Mode.SINGLE_OR_DEFAULT) ?: defaultValue() diff --git a/reactive/kotlinx-coroutines-reactive/src/Channel.kt b/reactive/kotlinx-coroutines-reactive/src/Channel.kt index b7fbf134c5..a8db21711d 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Channel.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Channel.kt @@ -10,29 +10,6 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.internal.* import org.reactivestreams.* -/** - * Subscribes to this [Publisher] and returns a channel to receive the elements emitted by it. - * The resulting channel needs to be [cancelled][ReceiveChannel.cancel] in order to unsubscribe from this publisher. - - * @param request how many items to request from the publisher in advance (optional, a single element by default). - * - * This method is deprecated in the favor of [Flow]. - * Instead of iterating over the resulting channel please use [collect][Flow.collect]: - * ``` - * asFlow().collect { value -> - * // process value - * } - * ``` - */ -@Deprecated( - message = "Transforming publisher to channel is deprecated, use asFlow() instead", - level = DeprecationLevel.ERROR) // Will be error in 1.4 -public fun Publisher.openSubscription(request: Int = 1): ReceiveChannel { - val channel = SubscriptionChannel(request) - subscribe(channel) - return channel -} - /** * Subscribes to this [Publisher] and performs the specified action for each received element. * @@ -123,3 +100,12 @@ private class SubscriptionChannel( } } +/** @suppress */ +@Deprecated( + message = "Transforming publisher to channel is deprecated, use asFlow() instead", + level = DeprecationLevel.HIDDEN) // ERROR in 1.4, HIDDEN in 1.6.0 +public fun Publisher.openSubscription(request: Int = 1): ReceiveChannel { + val channel = SubscriptionChannel(request) + subscribe(channel) + return channel +} diff --git a/reactive/kotlinx-coroutines-reactive/src/Convert.kt b/reactive/kotlinx-coroutines-reactive/src/Convert.kt index 3cb05b60fd..9492b49871 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Convert.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Convert.kt @@ -8,15 +8,9 @@ import kotlinx.coroutines.channels.* import org.reactivestreams.* import kotlin.coroutines.* -/** - * Converts a stream of elements received from the channel to the hot reactive publisher. - * - * Every subscriber receives values from this channel in **fan-out** fashion. If the are multiple subscribers, - * they'll receive values in round-robin way. - * @param context -- the coroutine context from which the resulting observable is going to be signalled - */ +/** @suppress */ @Deprecated(message = "Deprecated in the favour of consumeAsFlow()", - level = DeprecationLevel.ERROR, // Error in 1.4 + level = DeprecationLevel.HIDDEN, // Error in 1.4, HIDDEN in 1.6.0 replaceWith = ReplaceWith("this.consumeAsFlow().asPublisher(context)", imports = ["kotlinx.coroutines.flow.consumeAsFlow"])) public fun ReceiveChannel.asPublisher(context: CoroutineContext = EmptyCoroutineContext): Publisher = publish(context) { for (t in this@asPublisher) diff --git a/reactive/kotlinx-coroutines-reactor/src/Mono.kt b/reactive/kotlinx-coroutines-reactor/src/Mono.kt index e86d51c614..f31004b665 100644 --- a/reactive/kotlinx-coroutines-reactor/src/Mono.kt +++ b/reactive/kotlinx-coroutines-reactor/src/Mono.kt @@ -157,7 +157,7 @@ public fun CoroutineScope.mono( @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + "Please use awaitSingle() instead.", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingle()") ) // Warning since 1.5, error in 1.6 public suspend fun Mono.awaitFirst(): T = awaitSingle() @@ -181,7 +181,7 @@ public suspend fun Mono.awaitFirst(): T = awaitSingle() @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + "Please use awaitSingleOrNull() instead.", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") ) // Warning since 1.5, error in 1.6 public suspend fun Mono.awaitFirstOrDefault(default: T): T = awaitSingleOrNull() ?: default @@ -205,7 +205,7 @@ public suspend fun Mono.awaitFirstOrDefault(default: T): T = awaitSingleO @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + "Please use awaitSingleOrNull() instead.", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull()") ) // Warning since 1.5, error in 1.6 public suspend fun Mono.awaitFirstOrNull(): T? = awaitSingleOrNull() @@ -229,7 +229,7 @@ public suspend fun Mono.awaitFirstOrNull(): T? = awaitSingleOrNull() @Deprecated( message = "Mono produces at most one value, so the semantics of dropping the remaining elements are not useful. " + "Please use awaitSingleOrNull() instead.", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: defaultValue()") ) // Warning since 1.5, error in 1.6 public suspend fun Mono.awaitFirstOrElse(defaultValue: () -> T): T = awaitSingleOrNull() ?: defaultValue() @@ -253,7 +253,7 @@ public suspend fun Mono.awaitFirstOrElse(defaultValue: () -> T): T = awai @Deprecated( message = "Mono produces at most one value, so the last element is the same as the first. " + "Please use awaitSingle() instead.", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingle()") ) // Warning since 1.5, error in 1.6 public suspend fun Mono.awaitLast(): T = awaitSingle() diff --git a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt index ce68091705..912fb6e577 100644 --- a/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt +++ b/reactive/kotlinx-coroutines-reactor/src/ReactorContext.kt @@ -64,11 +64,7 @@ public class ReactorContext(public val context: Context) : AbstractCoroutineCont */ public fun ContextView.asCoroutineContext(): ReactorContext = ReactorContext(this) -/** - * Wraps the given [Context] into [ReactorContext], so it can be added to the coroutine's context - * and later used via `coroutineContext[ReactorContext]`. - * @suppress - */ +/** @suppress */ @Deprecated("The more general version for ContextView should be used instead", level = DeprecationLevel.HIDDEN) public fun Context.asCoroutineContext(): ReactorContext = readOnly().asCoroutineContext() // `readOnly()` is zero-cost. diff --git a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api index c27ef4d796..7cc594496e 100644 --- a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api +++ b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api @@ -16,8 +16,8 @@ public final class kotlinx/coroutines/rx2/RxAwaitKt { public final class kotlinx/coroutines/rx2/RxChannelKt { public static final fun collect (Lio/reactivex/MaybeSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun collect (Lio/reactivex/ObservableSource;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun openSubscription (Lio/reactivex/MaybeSource;)Lkotlinx/coroutines/channels/ReceiveChannel; - public static final fun openSubscription (Lio/reactivex/ObservableSource;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun openSubscription (Lio/reactivex/MaybeSource;)Lkotlinx/coroutines/channels/ReceiveChannel; + public static final synthetic fun openSubscription (Lio/reactivex/ObservableSource;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun toChannel (Lio/reactivex/MaybeSource;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun toChannel (Lio/reactivex/ObservableSource;)Lkotlinx/coroutines/channels/ReceiveChannel; } diff --git a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt index 0e0b47ebe8..da9809c9f8 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxAwait.kt @@ -80,7 +80,7 @@ public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull()") ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() @@ -102,7 +102,7 @@ public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun MaybeSource.awaitOrDefault(default: T): T = awaitSingleOrNull() ?: default diff --git a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt index bb093b0793..fc09bf9ee3 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxChannel.kt @@ -12,36 +12,6 @@ import kotlinx.coroutines.internal.* import kotlinx.coroutines.flow.* import kotlinx.coroutines.reactive.* -/** - * Subscribes to this [MaybeSource] and returns a channel to receive elements emitted by it. - * The resulting channel shall be [cancelled][ReceiveChannel.cancel] to unsubscribe from this source. - * - * This API is deprecated in the favour of [Flow]. - * [MaybeSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. - * @suppress - */ -@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 -public fun MaybeSource.openSubscription(): ReceiveChannel { - val channel = SubscriptionChannel() - subscribe(channel) - return channel -} - -/** - * Subscribes to this [ObservableSource] and returns a channel to receive elements emitted by it. - * The resulting channel shall be [cancelled][ReceiveChannel.cancel] to unsubscribe from this source. - * - * This API is deprecated in the favour of [Flow]. - * [ObservableSource] doesn't have a corresponding [Flow] adapter, so it should be transformed to [Observable] first. - * @suppress - */ -@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.ERROR) // Will be hidden in 1.5 -public fun ObservableSource.openSubscription(): ReceiveChannel { - val channel = SubscriptionChannel() - subscribe(channel) - return channel -} - /** * Subscribes to this [MaybeSource] and performs the specified action for each received element. * @@ -107,3 +77,19 @@ private class SubscriptionChannel : close(cause = e) } } + +/** @suppress */ +@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.HIDDEN) // ERROR in 1.4.0, HIDDEN in 1.6.0 +public fun ObservableSource.openSubscription(): ReceiveChannel { + val channel = SubscriptionChannel() + subscribe(channel) + return channel +} + +/** @suppress */ +@Deprecated(message = "Deprecated in the favour of Flow", level = DeprecationLevel.HIDDEN) // ERROR in 1.4.0, HIDDEN in 1.6.0 +public fun MaybeSource.openSubscription(): ReceiveChannel { + val channel = SubscriptionChannel() + subscribe(channel) + return channel +} diff --git a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt index 2a14cf7c6c..754dd79484 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxAwait.kt @@ -81,7 +81,7 @@ public suspend fun MaybeSource.awaitSingle(): T = awaitSingleOrNull() ?: */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull()") ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() @@ -104,7 +104,7 @@ public suspend fun MaybeSource.await(): T? = awaitSingleOrNull() */ @Deprecated( message = "Deprecated in favor of awaitSingleOrNull()", - level = DeprecationLevel.WARNING, + level = DeprecationLevel.ERROR, replaceWith = ReplaceWith("this.awaitSingleOrNull() ?: default") ) // Warning since 1.5, error in 1.6, hidden in 1.7 public suspend fun MaybeSource.awaitOrDefault(default: T): T = awaitSingleOrNull() ?: default From 603bd79c96d2473e54cb4a9043b30102554dd7e9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 11:59:17 +0300 Subject: [PATCH 188/328] Implemented `CopyableThreadContextElement` with a `copyForChildCoroutine()`. (#3025) * This is a `ThreadContextElement` that is copy-constructed when a new coroutine is created and inherits the context. Co-authored-by: Tyson Henning Fixes #2839 --- .../api/kotlinx-coroutines-core.api | 11 ++ .../jvm/src/CoroutineContext.kt | 21 ++- .../jvm/src/ThreadContextElement.kt | 63 +++++++++ .../jvm/test/ThreadContextElementTest.kt | 130 +++++++++++++++++- 4 files changed, 223 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 9ccef08308..36a516e070 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -140,6 +140,17 @@ public final class kotlinx/coroutines/CompletionHandlerException : java/lang/Run public fun (Ljava/lang/String;Ljava/lang/Throwable;)V } +public abstract interface class kotlinx/coroutines/CopyableThreadContextElement : kotlinx/coroutines/ThreadContextElement { + public abstract fun copyForChildCoroutine ()Lkotlinx/coroutines/CopyableThreadContextElement; +} + +public final class kotlinx/coroutines/CopyableThreadContextElement$DefaultImpls { + public static fun fold (Lkotlinx/coroutines/CopyableThreadContextElement;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; + public static fun get (Lkotlinx/coroutines/CopyableThreadContextElement;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; + public static fun minusKey (Lkotlinx/coroutines/CopyableThreadContextElement;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; + public static fun plus (Lkotlinx/coroutines/CopyableThreadContextElement;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; +} + public abstract interface class kotlinx/coroutines/CopyableThrowable { public abstract fun createCopy ()Ljava/lang/Throwable; } diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index 9a8f168bcd..d562207f8b 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -16,12 +16,31 @@ import kotlin.coroutines.jvm.internal.CoroutineStackFrame */ @ExperimentalCoroutinesApi public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext { - val combined = coroutineContext + context + val combined = coroutineContext.foldCopiesForChildCoroutine() + context val debug = if (DEBUG) combined + CoroutineId(COROUTINE_ID.incrementAndGet()) else combined return if (combined !== Dispatchers.Default && combined[ContinuationInterceptor] == null) debug + Dispatchers.Default else debug } +/** + * Returns the [CoroutineContext] for a child coroutine to inherit. + * + * If any [CopyableThreadContextElement] is in the [this], calls + * [CopyableThreadContextElement.copyForChildCoroutine] on each, returning a new [CoroutineContext] + * by folding the returned copied elements into [this]. + * + * Returns [this] if `this` has zero [CopyableThreadContextElement] in it. + */ +private fun CoroutineContext.foldCopiesForChildCoroutine(): CoroutineContext { + val hasToCopy = fold(false) { result, it -> + result || it is CopyableThreadContextElement<*> + } + if (!hasToCopy) return this + return fold(EmptyCoroutineContext) { combined, it -> + combined + if (it is CopyableThreadContextElement<*>) it.copyForChildCoroutine() else it + } +} + /** * Executes a block using a given coroutine context. */ diff --git a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt index 37fd70a23e..1b825cef01 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt @@ -77,6 +77,69 @@ public interface ThreadContextElement : CoroutineContext.Element { public fun restoreThreadContext(context: CoroutineContext, oldState: S) } +/** + * A [ThreadContextElement] copied whenever a child coroutine inherits a context containing it. + * + * When an API uses a _mutable_ `ThreadLocal` for consistency, a [CopyableThreadContextElement] + * can give coroutines "coroutine-safe" write access to that `ThreadLocal`. + * + * A write made to a `ThreadLocal` with a matching [CopyableThreadContextElement] by a coroutine + * will be visible to _itself_ and any child coroutine launched _after_ that write. + * + * Writes will not be visible to the parent coroutine, peer coroutines, or coroutines that happen + * to use the same thread. Writes made to the `ThreadLocal` by the parent coroutine _after_ + * launching a child coroutine will not be visible to that child coroutine. + * + * This can be used to allow a coroutine to use a mutable ThreadLocal API transparently and + * correctly, regardless of the coroutine's structured concurrency. + * + * This example adapts a `ThreadLocal` method trace to be "coroutine local" while the method trace + * is in a coroutine: + * + * ``` + * class TraceContextElement(val traceData: TraceData?) : CopyableThreadContextElement { + * companion object Key : CoroutineContext.Key + * override val key: CoroutineContext.Key + * get() = Key + * + * override fun updateThreadContext(context: CoroutineContext): TraceData? { + * val oldState = traceThreadLocal.get() + * traceThreadLocal.set(data) + * return oldState + * } + * + * override fun restoreThreadContext(context: CoroutineContext, oldData: TraceData?) { + * traceThreadLocal.set(oldState) + * } + * + * override fun copyForChildCoroutine(): CopyableThreadContextElement { + * // Copy from the ThreadLocal source of truth at child coroutine launch time. This makes + * // ThreadLocal writes between resumption of the parent coroutine and the launch of the + * // child coroutine visible to the child. + * return CopyForChildCoroutineElement(traceThreadLocal.get()) + * } + * } + * ``` + * + * A coroutine using this mechanism can safely call Java code that assumes it's called using a + * `Thread`. + */ +@ExperimentalCoroutinesApi +public interface CopyableThreadContextElement : ThreadContextElement { + + /** + * Returns a [CopyableThreadContextElement] to replace `this` `CopyableThreadContextElement` in the child + * coroutine's context that is under construction. + * + * This function is called on the element each time a new coroutine inherits a context containing it, + * and the returned value is folded into the context given to the child. + * + * Since this method is called whenever a new coroutine is launched in a context containing this + * [CopyableThreadContextElement], implementations are performance-sensitive. + */ + public fun copyForChildCoroutine(): CopyableThreadContextElement +} + /** * Wraps [ThreadLocal] into [ThreadContextElement]. The resulting [ThreadContextElement] * maintains the given [value] of the given [ThreadLocal] for coroutine regardless of the actual thread its is resumed on. diff --git a/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt b/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt index ea43c7ade2..baba4aa8e6 100644 --- a/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt +++ b/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt @@ -54,7 +54,6 @@ class ThreadContextElementTest : TestBase() { assertNull(myThreadLocal.get()) } - @Test fun testWithContext() = runTest { expect(1) @@ -86,6 +85,78 @@ class ThreadContextElementTest : TestBase() { finish(7) } + + @Test + fun testNonCopyableElementReferenceInheritedOnLaunch() = runTest { + var parentElement: MyElement? = null + var inheritedElement: MyElement? = null + + newSingleThreadContext("withContext").use { + withContext(it + MyElement(MyData())) { + parentElement = coroutineContext[MyElement.Key] + launch { + inheritedElement = coroutineContext[MyElement.Key] + } + } + } + + assertSame(inheritedElement, parentElement, + "Inner and outer coroutines did not have the same object reference to a" + + " ThreadContextElement that did not override `copyForChildCoroutine()`") + } + + @Test + fun testCopyableElementCopiedOnLaunch() = runTest { + var parentElement: CopyForChildCoroutineElement? = null + var inheritedElement: CopyForChildCoroutineElement? = null + + newSingleThreadContext("withContext").use { + withContext(it + CopyForChildCoroutineElement(MyData())) { + parentElement = coroutineContext[CopyForChildCoroutineElement.Key] + launch { + inheritedElement = coroutineContext[CopyForChildCoroutineElement.Key] + } + } + } + + assertNotSame(inheritedElement, parentElement, + "Inner coroutine did not copy its copyable ThreadContextElement.") + } + + @Test + fun testCopyableThreadContextElementImplementsWriteVisibility() = runTest { + newFixedThreadPoolContext(nThreads = 4, name = "withContext").use { + val startData = MyData() + withContext(it + CopyForChildCoroutineElement(startData)) { + val forBlockData = MyData() + myThreadLocal.setForBlock(forBlockData) { + assertSame(myThreadLocal.get(), forBlockData) + launch { + assertSame(myThreadLocal.get(), forBlockData) + } + launch { + assertSame(myThreadLocal.get(), forBlockData) + // Modify value in child coroutine. Writes to the ThreadLocal and + // the (copied) ThreadLocalElement's memory are not visible to peer or + // ancestor coroutines, so this write is both threadsafe and coroutinesafe. + val innerCoroutineData = MyData() + myThreadLocal.setForBlock(innerCoroutineData) { + assertSame(myThreadLocal.get(), innerCoroutineData) + } + assertSame(myThreadLocal.get(), forBlockData) // Asserts value was restored. + } + launch { + val innerCoroutineData = MyData() + myThreadLocal.setForBlock(innerCoroutineData) { + assertSame(myThreadLocal.get(), innerCoroutineData) + } + assertSame(myThreadLocal.get(), forBlockData) + } + } + assertSame(myThreadLocal.get(), startData) // Asserts value was restored. + } + } + } } class MyData @@ -114,3 +185,60 @@ class MyElement(val data: MyData) : ThreadContextElement { myThreadLocal.set(oldState) } } + +/** + * A [ThreadContextElement] that implements copy semantics in [copyForChildCoroutine]. + */ +class CopyForChildCoroutineElement(val data: MyData?) : CopyableThreadContextElement { + companion object Key : CoroutineContext.Key + + override val key: CoroutineContext.Key + get() = Key + + override fun updateThreadContext(context: CoroutineContext): MyData? { + val oldState = myThreadLocal.get() + myThreadLocal.set(data) + return oldState + } + + override fun restoreThreadContext(context: CoroutineContext, oldState: MyData?) { + myThreadLocal.set(oldState) + } + + /** + * At coroutine launch time, the _current value of the ThreadLocal_ is inherited by the new + * child coroutine, and that value is copied to a new, unique, ThreadContextElement memory + * reference for the child coroutine to use uniquely. + * + * n.b. the value copied to the child must be the __current value of the ThreadLocal__ and not + * the value initially passed to the ThreadContextElement in order to reflect writes made to the + * ThreadLocal between coroutine resumption and the child coroutine launch point. Those writes + * will be reflected in the parent coroutine's [CopyForChildCoroutineElement] when it yields the + * thread and calls [restoreThreadContext]. + */ + override fun copyForChildCoroutine(): CopyableThreadContextElement { + return CopyForChildCoroutineElement(myThreadLocal.get()) + } +} + +/** + * Calls [block], setting the value of [this] [ThreadLocal] for the duration of [block]. + * + * When a [CopyForChildCoroutineElement] for `this` [ThreadLocal] is used within a + * [CoroutineContext], a ThreadLocal set this way will have the "correct" value expected lexically + * at every statement reached, whether that statement is reached immediately, across suspend and + * redispatch within one coroutine, or within a child coroutine. Writes made to the `ThreadLocal` + * by child coroutines will not be visible to the parent coroutine. Writes made to the `ThreadLocal` + * by the parent coroutine _after_ launching a child coroutine will not be visible to that child + * coroutine. + */ +private inline fun ThreadLocal.setForBlock( + value: ThreadLocalT, + crossinline block: () -> OutputT +) { + val priorValue = get() + set(value) + block() + set(priorValue) +} + From fe9f50bbcc548ac19fc8fdcdf170ae76a0a3843f Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 15:29:21 +0300 Subject: [PATCH 189/328] Fix deprecation error --- reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt b/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt index 3682d5e318..0479028d80 100644 --- a/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt +++ b/reactive/kotlinx-coroutines-jdk9/test/PublishTest.kt @@ -278,10 +278,8 @@ class PublishTest : TestBase() { val publisher = flowPublish { assertFailsWith { send(null) } assertFailsWith { trySend(null) } - @Suppress("DEPRECATION") - assertFailsWith { offer(null) } send("OK") } assertEquals("OK", publisher.awaitFirstOrNull()) } -} \ No newline at end of file +} From e3cd41b98e0e1fe39003d14cbbebde8c0ecfadfc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 15:48:27 +0300 Subject: [PATCH 190/328] Use Dispatchers.Main as default delay source where applicable (#2974) * Use Dispatchers.Main as default delay source where applicable It reduces the number of redundant threads in the system and makes time source predictable across Android/JavaFx applications Fixes #2972 --- kotlinx-coroutines-core/common/src/Delay.kt | 2 -- .../jvm/src/DefaultExecutor.kt | 17 ++++++++++++++++- .../src/JavaFxDispatcher.kt | 12 ++++-------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Delay.kt b/kotlinx-coroutines-core/common/src/Delay.kt index 35e83f3aba..d95dc52f9f 100644 --- a/kotlinx-coroutines-core/common/src/Delay.kt +++ b/kotlinx-coroutines-core/common/src/Delay.kt @@ -51,8 +51,6 @@ public interface Delay { * Schedules invocation of a specified [block] after a specified delay [timeMillis]. * The resulting [DisposableHandle] can be used to [dispose][DisposableHandle.dispose] of this invocation * request if it is not needed anymore. - * - * This implementation uses a built-in single-threaded scheduled executor service. */ public fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = DefaultDelay.invokeOnTimeout(timeMillis, block, context) diff --git a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt index 6457d26e0a..7b0810c2a1 100644 --- a/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt +++ b/kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt @@ -4,10 +4,25 @@ package kotlinx.coroutines +import kotlinx.coroutines.internal.* import java.util.concurrent.* import kotlin.coroutines.* -internal actual val DefaultDelay: Delay = DefaultExecutor +internal actual val DefaultDelay: Delay = initializeDefaultDelay() + +private val defaultMainDelayOptIn = systemProp("kotlinx.coroutines.main.delay", true) + +private fun initializeDefaultDelay(): Delay { + // Opt-out flag + if (!defaultMainDelayOptIn) return DefaultExecutor + val main = Dispatchers.Main + /* + * When we already are working with UI and Main threads, it makes + * no sense to create a separate thread with timer that cannot be controller + * by the UI runtime. + */ + return if (main.isMissing() || main !is Delay) DefaultExecutor else main +} @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") internal actual object DefaultExecutor : EventLoopImplBase(), Runnable { diff --git a/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt b/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt index 6915c53972..d158fb745a 100644 --- a/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt +++ b/ui/kotlinx-coroutines-javafx/src/JavaFxDispatcher.kt @@ -34,22 +34,18 @@ public sealed class JavaFxDispatcher : MainCoroutineDispatcher(), Delay { /** @suppress */ override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - val timeline = schedule(timeMillis, TimeUnit.MILLISECONDS, EventHandler { + val timeline = schedule(timeMillis, TimeUnit.MILLISECONDS) { with(continuation) { resumeUndispatched(Unit) } - }) + } continuation.invokeOnCancellation { timeline.stop() } } /** @suppress */ override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - val timeline = schedule(timeMillis, TimeUnit.MILLISECONDS, EventHandler { + val timeline = schedule(timeMillis, TimeUnit.MILLISECONDS) { block.run() - }) - return object : DisposableHandle { - override fun dispose() { - timeline.stop() - } } + return DisposableHandle { timeline.stop() } } private fun schedule(time: Long, unit: TimeUnit, handler: EventHandler): Timeline = From 68f187b47571a14c91547aa19c58d773d3d47665 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 16:10:59 +0300 Subject: [PATCH 191/328] Update Kotlin to 1.6.0 (#3027) * Update Kotlin to 1.6.0 * Update atomicfu to 0.17.0 --- README.md | 8 ++++---- gradle.properties | 4 ++-- reactive/kotlinx-coroutines-reactive/test/PublishTest.kt | 2 -- reactive/kotlinx-coroutines-reactor/test/FluxTest.kt | 4 +--- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6a13f07aa3..ad61c7b17f 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.5.30-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.5.30` release. +This is a companion version for the Kotlin `1.6.0` release. ```kotlin suspend fun main() = coroutineScope { @@ -91,7 +91,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.5.30 + 1.6.0 ``` @@ -109,7 +109,7 @@ And make sure that you use the latest Kotlin version: ```groovy buildscript { - ext.kotlin_version = '1.5.30' + ext.kotlin_version = '1.6.0' } ``` diff --git a/gradle.properties b/gradle.properties index d2f5f30599..98e27c8fde 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,12 +5,12 @@ # Kotlin version=1.5.2-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.6.0-RC2 +kotlin_version=1.6.0 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.16.3 +atomicfu_version=0.17.0 knit_version=0.3.0 html_version=0.7.2 lincheck_version=2.14 diff --git a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt index 267953f5a5..d92a8883be 100644 --- a/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/PublishTest.kt @@ -282,8 +282,6 @@ class PublishTest : TestBase() { val publisher = publish { assertFailsWith { send(null) } assertFailsWith { trySend(null) } - @Suppress("DEPRECATION") - assertFailsWith { offer(null) } send("OK") } assertEquals("OK", publisher.awaitFirstOrNull()) diff --git a/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt b/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt index d059eb6622..f575af4101 100644 --- a/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/FluxTest.kt @@ -170,10 +170,8 @@ class FluxTest : TestBase() { val flux = flux { assertFailsWith { send(null) } assertFailsWith { trySend(null) } - @Suppress("DEPRECATION") - assertFailsWith { offer(null) } send("OK") } assertEquals("OK", flux.awaitFirstOrNull()) } -} \ No newline at end of file +} From 6841fae31f58407d4ee0c76a9a40488c1ced761e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 16:22:49 +0300 Subject: [PATCH 192/328] Better debuggability of kotlinx-coroutines-debug test --- kotlinx-coroutines-debug/test/StacktraceUtils.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-debug/test/StacktraceUtils.kt b/kotlinx-coroutines-debug/test/StacktraceUtils.kt index 8c591ebd44..9cc626f19a 100644 --- a/kotlinx-coroutines-debug/test/StacktraceUtils.kt +++ b/kotlinx-coroutines-debug/test/StacktraceUtils.kt @@ -90,7 +90,8 @@ private fun cleanBlockHoundTraces(frames: List): List { public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null) { val baos = ByteArrayOutputStream() DebugProbes.dumpCoroutines(PrintStream(baos)) - val trace = baos.toString().split("\n\n") + val wholeDump = baos.toString() + val trace = wholeDump.split("\n\n") if (traces.isEmpty()) { val filtered = trace.filter { ignoredCoroutine == null || !it.contains(ignoredCoroutine) } assertEquals(1, filtered.count()) @@ -105,7 +106,7 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null) { val expected = traces[index - 1].applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) val actual = value.applyBackspace().split("\n\t(Coroutine creation stacktrace)\n", limit = 2) - assertEquals(expected.size, actual.size, "Creation stacktrace should be part of the expected input") + assertEquals(expected.size, actual.size, "Creation stacktrace should be part of the expected input. Whole dump:\n$wholeDump") expected.withIndex().forEach { (index, trace) -> val actualTrace = actual[index].trimStackTrace().sanitizeAddresses() @@ -113,7 +114,7 @@ public fun verifyDump(vararg traces: String, ignoredCoroutine: String? = null) { val actualLines = cleanBlockHoundTraces(actualTrace.split("\n")) val expectedLines = expectedTrace.split("\n") for (i in expectedLines.indices) { - assertEquals(expectedLines[i], actualLines[i]) + assertEquals(expectedLines[i], actualLines[i], "Whole dump:\n$wholeDump") } } } From 9c3f59fb2a626b96fc5519c3e6c6c55c4d46fdd3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 17 Nov 2021 17:04:16 +0300 Subject: [PATCH 193/328] Remove deprecation leftovers in reactive modules --- .../test/IntegrationTest.kt | 12 +--- .../test/FluxSingleTest.kt | 66 ------------------- .../test/MonoTest.kt | 23 ------- 3 files changed, 1 insertion(+), 100 deletions(-) diff --git a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt index efe7ec7e45..fa039897d7 100644 --- a/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt +++ b/reactive/kotlinx-coroutines-reactive/test/IntegrationTest.kt @@ -52,9 +52,6 @@ class IntegrationTest( assertEquals("ELSE", pub.awaitFirstOrElse { "ELSE" }) assertFailsWith { pub.awaitLast() } assertFailsWith { pub.awaitSingle() } - assertEquals("OK", pub.awaitSingleOrDefault("OK")) - assertNull(pub.awaitSingleOrNull()) - assertEquals("ELSE", pub.awaitSingleOrElse { "ELSE" }) var cnt = 0 pub.collect { cnt++ } assertEquals(0, cnt) @@ -72,9 +69,6 @@ class IntegrationTest( assertEquals("OK", pub.awaitFirstOrElse { "ELSE" }) assertEquals("OK", pub.awaitLast()) assertEquals("OK", pub.awaitSingle()) - assertEquals("OK", pub.awaitSingleOrDefault("!")) - assertEquals("OK", pub.awaitSingleOrNull()) - assertEquals("OK", pub.awaitSingleOrElse { "ELSE" }) var cnt = 0 pub.collect { assertEquals("OK", it) @@ -189,10 +183,6 @@ class IntegrationTest( onError(dummyThrowable) onComplete() } - assertDetectsBadPublisher({ awaitSingleOrDefault(2) }, "terminal state") { - onComplete() - onError(dummyThrowable) - } assertDetectsBadPublisher({ awaitFirst() }, "terminal state") { onNext(0) onComplete() @@ -251,4 +241,4 @@ internal suspend inline fun assertCallsExceptionHandlerWi it } } -} \ No newline at end of file +} diff --git a/reactive/kotlinx-coroutines-reactor/test/FluxSingleTest.kt b/reactive/kotlinx-coroutines-reactor/test/FluxSingleTest.kt index cc336ba6b5..3879c62c71 100644 --- a/reactive/kotlinx-coroutines-reactor/test/FluxSingleTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/FluxSingleTest.kt @@ -68,72 +68,6 @@ class FluxSingleTest : TestBase() { } } - @Test - fun testAwaitSingleOrDefault() { - val flux = flux { - send(Flux.empty().awaitSingleOrDefault("O") + "K") - } - - checkSingleValue(flux) { - assertEquals("OK", it) - } - } - - @Test - fun testAwaitSingleOrDefaultException() { - val flux = flux { - send(Flux.just("O", "#").awaitSingleOrDefault("!") + "K") - } - - checkErroneous(flux) { - assert(it is IllegalArgumentException) - } - } - - @Test - fun testAwaitSingleOrNull() { - val flux = flux { - send(Flux.empty().awaitSingleOrNull() ?: "OK") - } - - checkSingleValue(flux) { - assertEquals("OK", it) - } - } - - @Test - fun testAwaitSingleOrNullException() { - val flux = flux { - send((Flux.just("O", "#").awaitSingleOrNull() ?: "!") + "K") - } - - checkErroneous(flux) { - assert(it is IllegalArgumentException) - } - } - - @Test - fun testAwaitSingleOrElse() { - val flux = flux { - send(Flux.empty().awaitSingleOrElse { "O" } + "K") - } - - checkSingleValue(flux) { - assertEquals("OK", it) - } - } - - @Test - fun testAwaitSingleOrElseException() { - val flux = flux { - send(Flux.just("O", "#").awaitSingleOrElse { "!" } + "K") - } - - checkErroneous(flux) { - assert(it is IllegalArgumentException) - } - } - @Test fun testAwaitFirst() { val flux = flux { diff --git a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt index 421295d115..2a5e5dc107 100644 --- a/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt +++ b/reactive/kotlinx-coroutines-reactor/test/MonoTest.kt @@ -119,29 +119,6 @@ class MonoTest : TestBase() { assertNull(Mono.empty().awaitSingleOrNull()) } - /** Tests that the versions of the await methods specialized for Mono for deprecation behave correctly and we don't - * break any code by introducing them. */ - @Test - @Suppress("DEPRECATION") - fun testDeprecatedAwaitMethods() = runBlocking { - val filledMono = mono { "OK" } - assertEquals("OK", filledMono.awaitFirst()) - assertEquals("OK", filledMono.awaitFirstOrDefault("!")) - assertEquals("OK", filledMono.awaitFirstOrNull()) - assertEquals("OK", filledMono.awaitFirstOrElse { "ELSE" }) - assertEquals("OK", filledMono.awaitLast()) - assertEquals("OK", filledMono.awaitSingleOrDefault("!")) - assertEquals("OK", filledMono.awaitSingleOrElse { "ELSE" }) - val emptyMono = mono { null } - assertFailsWith { emptyMono.awaitFirst() } - assertEquals("OK", emptyMono.awaitFirstOrDefault("OK")) - assertNull(emptyMono.awaitFirstOrNull()) - assertEquals("ELSE", emptyMono.awaitFirstOrElse { "ELSE" }) - assertFailsWith { emptyMono.awaitLast() } - assertEquals("OK", emptyMono.awaitSingleOrDefault("OK")) - assertEquals("ELSE", emptyMono.awaitSingleOrElse { "ELSE" }) - } - /** Tests that calls to [awaitSingleOrNull] (and, thus, to the rest of such functions) throw [CancellationException] * and unsubscribe from the publisher when their [Job] is cancelled. */ @Test From 9d1be508278eec32dae53d54142c5387600310f0 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 19 Nov 2021 14:13:03 +0300 Subject: [PATCH 194/328] Stabilize our CI build (#3030) * Try to trim memory usage of Dokka and Lincheck * Disable failing test * Do avoid concurrent-unsafe Collections.toList for working with ConcurrentWeakMap.keySet * Do join weakRefCleanerThread in DebugProbes.uninstall Otherwise, multiple pairs of install + uninstall may leave multiple cleanup threads in the state when the map is already cleaned up, but its size is not Fixes #3028 --- gradle.properties | 2 +- kotlinx-coroutines-core/build.gradle | 2 +- .../jvm/src/debug/internal/ConcurrentWeakMap.kt | 2 +- .../jvm/src/debug/internal/DebugProbesImpl.kt | 9 ++++++--- .../jvm/test/channels/ChannelSendReceiveStressTest.kt | 5 ++++- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index 98e27c8fde..db8a8e19f7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -53,7 +53,7 @@ jekyll_version=4.0 # JS IR backend sometimes crashes with out-of-memory # TODO: Remove once KT-37187 is fixed -org.gradle.jvmargs=-Xmx4g +org.gradle.jvmargs=-Xmx3g kotlin.mpp.enableCompatibilityMetadataVariant=true kotlin.mpp.stability.nowarn=true diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 70295b2909..0d4d708962 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -266,7 +266,7 @@ task jvmLincheckTest(type: Test, dependsOn: compileTestKotlinJvm) { static void configureJvmForLincheck(task) { task.minHeapSize = '1g' - task.maxHeapSize = '6g' // we may need more space for building an interleaving tree in the model checking mode + task.maxHeapSize = '4g' // we may need more space for building an interleaving tree in the model checking mode task.jvmArgs = ['--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED', // required for transformation '--add-exports', 'java.base/jdk.internal.util=ALL-UNNAMED'] // in the model checking mode task.systemProperty 'kotlinx.coroutines.semaphore.segmentSize', '2' diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt index ffb9c2dae6..b0b2660517 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt @@ -73,7 +73,7 @@ internal class ConcurrentWeakMap( while (true) { cleanWeakRef(weakRefQueue.remove() as HashedWeakRef<*>) } - } catch(e: InterruptedException) { + } catch (e: InterruptedException) { Thread.currentThread().interrupt() } } diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt index e6cddbca1c..d358d49d1e 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/DebugProbesImpl.kt @@ -102,8 +102,10 @@ internal object DebugProbesImpl { } private fun stopWeakRefCleanerThread() { - weakRefCleanerThread?.interrupt() + val thread = weakRefCleanerThread ?: return weakRefCleanerThread = null + thread.interrupt() + thread.join() } public fun hierarchyToString(job: Job): String = coroutineStateLock.write { @@ -148,10 +150,11 @@ internal object DebugProbesImpl { * Private method that dumps coroutines so that different public-facing method can use * to produce different result types. */ - private inline fun dumpCoroutinesInfoImpl(create: (CoroutineOwner<*>, CoroutineContext) -> R): List = + private inline fun dumpCoroutinesInfoImpl(crossinline create: (CoroutineOwner<*>, CoroutineContext) -> R): List = coroutineStateLock.write { check(isInstalled) { "Debug probes are not installed" } capturedCoroutines + .asSequence() // Stable ordering of coroutines by their sequence number .sortedBy { it.info.sequenceNumber } // Leave in the dump only the coroutines that were not collected while we were dumping them @@ -159,7 +162,7 @@ internal object DebugProbesImpl { // Fuse map and filter into one operation to save an inline if (owner.isFinished()) null else owner.info.context?.let { context -> create(owner, context) } - } + }.toList() } /* diff --git a/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt b/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt index a6345cc55b..7e55f2e602 100644 --- a/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/channels/ChannelSendReceiveStressTest.kt @@ -25,7 +25,10 @@ class ChannelSendReceiveStressTest( fun params(): Collection> = listOf(1, 2, 10).flatMap { nSenders -> listOf(1, 10).flatMap { nReceivers -> - TestChannelKind.values().map { arrayOf(it, nSenders, nReceivers) } + TestChannelKind.values() + // Workaround for bug that won't be fixed unless new channel implementation, see #2443 + .filter { it != TestChannelKind.LINKED_LIST } + .map { arrayOf(it, nSenders, nReceivers) } } } } From a4ae389503cc9b3c940e5d5539fe359b5e4a4950 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 19 Nov 2021 18:03:59 +0300 Subject: [PATCH 195/328] Revert "JobSupport: non-atomic adding to a Job's list of listeners (#2096)" (#3034) This reverts commit 2b1e2765f61fcf830f144651c50479f64d4a8558. --- kotlinx-coroutines-core/common/src/Await.kt | 4 +- .../common/src/CompletionHandler.common.kt | 2 - .../common/src/JobSupport.kt | 163 +++++------------- .../src/internal/LockFreeLinkedList.common.kt | 1 + .../common/src/selects/Select.kt | 5 +- .../src/internal/LockFreeLinkedList.kt | 24 ++- .../test/internal/LockFreeLinkedListTest.kt | 14 ++ .../js/src/internal/LinkedList.kt | 6 + kotlinx-coroutines-core/jvm/src/Future.kt | 2 +- .../LockFreeLinkedListShortStressTest.kt | 25 ++- 10 files changed, 110 insertions(+), 136 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Await.kt b/kotlinx-coroutines-core/common/src/Await.kt index 275db60f40..e06ed33025 100644 --- a/kotlinx-coroutines-core/common/src/Await.kt +++ b/kotlinx-coroutines-core/common/src/Await.kt @@ -107,8 +107,8 @@ private class AwaitAll(private val deferreds: Array>) { var disposer: DisposeHandlersOnCancel? get() = _disposer.value set(value) { _disposer.value = value } - - override fun invokeOnce(cause: Throwable?) { + + override fun invoke(cause: Throwable?) { if (cause != null) { val token = continuation.tryResumeWithException(cause) if (token != null) { diff --git a/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt b/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt index 8bc2596a76..e712ff1fc1 100644 --- a/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt +++ b/kotlinx-coroutines-core/common/src/CompletionHandler.common.kt @@ -44,6 +44,4 @@ internal expect val CancelHandlerBase.asHandler: CompletionHandler // because we play type tricks on Kotlin/JS and handler is not necessarily a function there internal expect fun CompletionHandler.invokeIt(cause: Throwable?) -// :KLUDGE: We have to use `isHandlerOf` extension, because performing this type check directly in the code -// causes Incompatible types error during Kotlin/JS compilation internal inline fun CompletionHandler.isHandlerOf(): Boolean = this is T diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index e388f8e6a5..0a3dd23472 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -456,86 +456,51 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren // Create node upfront -- for common cases it just initializes JobNode.job field, // for user-defined handlers it allocates a JobNode object that we might not need, but this is Ok. val node: JobNode = makeNode(handler, onCancelling) - /* - * LinkedList algorithm does not support removing and re-adding the same node, - * so here we check whether the node is already added to the list to avoid adding the node twice. - */ - var isNodeAdded = false loopOnState { state -> when (state) { is Empty -> { // EMPTY_X state -- no completion handlers if (state.isActive) { // try move to SINGLE state if (_state.compareAndSet(state, node)) return node - } else { + } else promoteEmptyToNodeList(state) // that way we can add listener for non-active coroutine - } } is Incomplete -> { val list = state.list if (list == null) { // SINGLE/SINGLE+ promoteSingleToNodeList(state as JobNode) - return@loopOnState // retry - } - // ...else {, but without nesting - var rootCause: Throwable? = null - var handle: DisposableHandle = NonDisposableHandle - if (onCancelling && state is Finishing) { - synchronized(state) { - // check if we are installing cancellation handler on job that is being cancelled - rootCause = state.rootCause // != null if cancelling job - // We add node to the list in two cases --- either the job is not being cancelled - // or we are adding a child to a coroutine that is not completing yet - if (rootCause == null || handler.isHandlerOf() && !state.isCompleting) { - // Note: add node the list while holding lock on state (make sure it cannot change) - if (!isNodeAdded) list.addLast(node) - if (this.state !== state) { - /* - * Here we have an additional check for ChildCompletion. Invoking the handler once is not enough - * for this particular kind of node -- the caller makes a decision based on whether the node was added - * or not and that decision should be made **once**. - * To be more precise, the caller of ChildCompletion, in case when it's the last child, - * should make a decision whether to start transition to the final state, based on - * whether the ChildCompletion was added to the list or not. If not -- the JobNode.invoke will do that. - * See comment to JobNode.invoke, we cannot differentiate the situation when external state updater - * invoked or skipped the node, thus we additionally synchronize on 'markInvoked'. - */ - if (node is ChildCompletion && !node.markInvoked()) return node - // The state can only change to Complete here, so the node can stay in the list, just retry - return@loopOnState + } else { + var rootCause: Throwable? = null + var handle: DisposableHandle = NonDisposableHandle + if (onCancelling && state is Finishing) { + synchronized(state) { + // check if we are installing cancellation handler on job that is being cancelled + rootCause = state.rootCause // != null if cancelling job + // We add node to the list in two cases --- either the job is not being cancelled + // or we are adding a child to a coroutine that is not completing yet + if (rootCause == null || handler.isHandlerOf() && !state.isCompleting) { + // Note: add node the list while holding lock on state (make sure it cannot change) + if (!addLastAtomic(state, list, node)) return@loopOnState // retry + // just return node if we don't have to invoke handler (not cancelling yet) + if (rootCause == null) return node + // otherwise handler is invoked immediately out of the synchronized section & handle returned + handle = node } - // just return node if we don't have to invoke handler (not cancelling yet) - if (rootCause == null) return node - // otherwise handler is invoked immediately out of the synchronized section & handle returned - handle = node } } - } - if (rootCause != null) { - // Note: attachChild uses invokeImmediately, so it gets invoked when adding to cancelled job - if (invokeImmediately) { - node.invoke(rootCause) - } - return handle - } else { - if (!isNodeAdded) list.addLast(node) - if (this.state !== state) { - // Here again, we try to prevent concurrent finalization of the parent, - // if the parent fails to add ChildCompletion because the child changed it's state to Completed. - if (node is ChildCompletion && !node.markInvoked()) return node - // If the state has changed to Complete, the node can stay in the list, just retry. - if (this.state !is Incomplete) return@loopOnState - // If the state is Incomplete, set the flag that the node is already added to the list instead of removing it. - isNodeAdded = true + if (rootCause != null) { + // Note: attachChild uses invokeImmediately, so it gets invoked when adding to cancelled job + if (invokeImmediately) handler.invokeIt(rootCause) + return handle } else { - return node + if (addLastAtomic(state, list, node)) return node } } } else -> { // is complete - if (invokeImmediately) { - node.invoke((state as? CompletedExceptionally)?.cause) - } + // :KLUDGE: We have to invoke a handler in platform-specific way via `invokeIt` extension, + // because we play type tricks on Kotlin/JS and handler is not necessarily a function there + if (invokeImmediately) handler.invokeIt((state as? CompletedExceptionally)?.cause) return NonDisposableHandle } } @@ -555,6 +520,9 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren return node } + private fun addLastAtomic(expect: Any, list: NodeList, node: JobNode) = + list.addLastIf(node) { this.state === expect } + private fun promoteEmptyToNodeList(state: Empty) { // try to promote it to LIST state with the corresponding state val list = NodeList() @@ -628,13 +596,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren } is Incomplete -> { // may have a list of completion handlers // remove node from the list if there is a list - if (state.list != null) { - if (!node.remove() && node.isRemoved) { - // Note: .remove() returns 'false' if the node wasn't added at all, e.g. - // because it was an optimized "single element list" - node.helpRemove() - } - } + if (state.list != null) node.remove() return } else -> return // it is complete and does not have any completion handlers @@ -852,7 +814,7 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren } } } - } + } /** * Completes this job. Used by [AbstractCoroutine.resume]. @@ -1189,11 +1151,9 @@ public open class JobSupport constructor(active: Boolean) : Job, ChildJob, Paren private val child: ChildHandleNode, private val proposedUpdate: Any? ) : JobNode() { - override fun invokeOnce(cause: Throwable?) { + override fun invoke(cause: Throwable?) { parent.continueCompleting(state, child, proposedUpdate) } - override fun toString(): String = - "ChildCompletion[$child, $proposedUpdate]" } private class AwaitContinuation( @@ -1395,31 +1355,6 @@ internal abstract class JobNode : CompletionHandlerBase(), DisposableHandle, Inc override val isActive: Boolean get() = true override val list: NodeList? get() = null override fun dispose() = job.removeNode(this) - private val isInvoked = atomic(false) - - /* - * This method is guaranteed to be invoked once per JobNode lifecycle. - */ - protected abstract fun invokeOnce(cause: Throwable?) - - /* - * This method can be invoked more than once thus it's protected - * with atomic flag. - * - * It can be invoked twice via [invokeOnCompletion(invokeImmediately = true)] - * when addLastIf fails due to the race with Job state update. - * In that case, we cannot distinguish the situation when the node was added - * and the external state updater actually invoked it from the situation - * when the state updater already invoked all elements from a list and then - * we added a new node to already abandoned list. - * So, when addLastIf fails, we invoke handler in-place, using - * markInvoked as protection against the former case. - */ - final override fun invoke(cause: Throwable?) { - if (!markInvoked()) return - invokeOnce(cause) - } - fun markInvoked() = isInvoked.compareAndSet(false, true) override fun toString() = "$classSimpleName@$hexAddress[job@${job.hexAddress}]" } @@ -1452,22 +1387,20 @@ internal class InactiveNodeList( private class InvokeOnCompletion( private val handler: CompletionHandler -) : JobNode() { - override fun invokeOnce(cause: Throwable?) = handler.invoke(cause) - override fun toString() = "InvokeOnCompletion[$classSimpleName@$hexAddress]" +) : JobNode() { + override fun invoke(cause: Throwable?) = handler.invoke(cause) } private class ResumeOnCompletion( private val continuation: Continuation ) : JobNode() { - override fun invokeOnce(cause: Throwable?) = continuation.resume(Unit) - override fun toString() = "ResumeOnCompletion[$continuation]" + override fun invoke(cause: Throwable?) = continuation.resume(Unit) } private class ResumeAwaitOnCompletion( private val continuation: CancellableContinuationImpl ) : JobNode() { - override fun invokeOnce(cause: Throwable?) { + override fun invoke(cause: Throwable?) { val state = job.state assert { state !is Incomplete } if (state is CompletedExceptionally) { @@ -1479,36 +1412,32 @@ private class ResumeAwaitOnCompletion( continuation.resume(state.unboxState() as T) } } - override fun toString() = "ResumeAwaitOnCompletion[$continuation]" } internal class DisposeOnCompletion( private val handle: DisposableHandle ) : JobNode() { - override fun invokeOnce(cause: Throwable?) = handle.dispose() - override fun toString(): String = "DisposeOnCompletion[${handle}]" + override fun invoke(cause: Throwable?) = handle.dispose() } private class SelectJoinOnCompletion( private val select: SelectInstance, private val block: suspend () -> R ) : JobNode() { - override fun invokeOnce(cause: Throwable?) { + override fun invoke(cause: Throwable?) { if (select.trySelect()) block.startCoroutineCancellable(select.completion) } - override fun toString(): String = "SelectJoinOnCompletion[$select]" } private class SelectAwaitOnCompletion( private val select: SelectInstance, private val block: suspend (T) -> R ) : JobNode() { - override fun invokeOnce(cause: Throwable?) { + override fun invoke(cause: Throwable?) { if (select.trySelect()) job.selectAwaitCompletion(select, block) } - override fun toString(): String = "SelectAwaitOnCompletion[$select]" } // -------- invokeOnCancellation nodes @@ -1521,28 +1450,28 @@ internal abstract class JobCancellingNode : JobNode() private class InvokeOnCancelling( private val handler: CompletionHandler -) : JobCancellingNode() { +) : JobCancellingNode() { // delegate handler shall be invoked at most once, so here is an additional flag - override fun invokeOnce(cause: Throwable?) = handler.invoke(cause) - override fun toString() = "InvokeOnCancelling[$classSimpleName@$hexAddress]" + private val _invoked = atomic(0) // todo: replace with atomic boolean after migration to recent atomicFu + override fun invoke(cause: Throwable?) { + if (_invoked.compareAndSet(0, 1)) handler.invoke(cause) + } } internal class ChildHandleNode( @JvmField val childJob: ChildJob ) : JobCancellingNode(), ChildHandle { override val parent: Job get() = job - override fun invokeOnce(cause: Throwable?) = childJob.parentCancelled(job) + override fun invoke(cause: Throwable?) = childJob.parentCancelled(job) override fun childCancelled(cause: Throwable): Boolean = job.childCancelled(cause) - override fun toString(): String = "ChildHandle[$childJob]" } // Same as ChildHandleNode, but for cancellable continuation internal class ChildContinuation( @JvmField val child: CancellableContinuationImpl<*> ) : JobCancellingNode() { - override fun invokeOnce(cause: Throwable?) = + override fun invoke(cause: Throwable?) { child.parentCancelled(child.getContinuationCancellationCause(job)) - override fun toString(): String = - "ChildContinuation[$child]" + } } diff --git a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt index 4019ef6156..8b20ade1f0 100644 --- a/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/LockFreeLinkedList.common.kt @@ -15,6 +15,7 @@ public expect open class LockFreeLinkedListNode() { public val prevNode: LockFreeLinkedListNode public fun addLast(node: LockFreeLinkedListNode) public fun addOneIfEmpty(node: LockFreeLinkedListNode): Boolean + public inline fun addLastIf(node: LockFreeLinkedListNode, crossinline condition: () -> Boolean): Boolean public inline fun addLastIfPrev( node: LockFreeLinkedListNode, predicate: (LockFreeLinkedListNode) -> Boolean diff --git a/kotlinx-coroutines-core/common/src/selects/Select.kt b/kotlinx-coroutines-core/common/src/selects/Select.kt index 87ac94ec34..a313de3d5d 100644 --- a/kotlinx-coroutines-core/common/src/selects/Select.kt +++ b/kotlinx-coroutines-core/common/src/selects/Select.kt @@ -336,10 +336,9 @@ internal class SelectBuilderImpl( private inner class SelectOnCancelling : JobCancellingNode() { // Note: may be invoked multiple times, but only the first trySelect succeeds anyway - override fun invokeOnce(cause: Throwable?) { - if (trySelect()) { + override fun invoke(cause: Throwable?) { + if (trySelect()) resumeSelectWithException(job.getCancellationException()) - } } } diff --git a/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt index c6ce278987..b4b36dad34 100644 --- a/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt +++ b/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt @@ -86,6 +86,12 @@ public actual open class LockFreeLinkedListNode { } } + @PublishedApi + internal inline fun makeCondAddOp(node: Node, crossinline condition: () -> Boolean): CondAddOp = + object : CondAddOp(node) { + override fun prepare(affected: Node): Any? = if (condition()) null else CONDITION_FALSE + } + public actual open val isRemoved: Boolean get() = next is Removed // LINEARIZABLE. Returns Node | Removed @@ -141,6 +147,20 @@ public actual open class LockFreeLinkedListNode { public fun describeAddLast(node: T): AddLastDesc = AddLastDesc(this, node) + /** + * Adds last item to this list atomically if the [condition] is true. + */ + public actual inline fun addLastIf(node: Node, crossinline condition: () -> Boolean): Boolean { + val condAdd = makeCondAddOp(node, condition) + while (true) { // lock-free loop on prev.next + val prev = prevNode // sentinel node is never removed, so prev is always defined + when (prev.tryCondAddNext(node, this, condAdd)) { + SUCCESS -> return true + FAILURE -> return false + } + } + } + public actual inline fun addLastIfPrev(node: Node, predicate: (Node) -> Boolean): Boolean { while (true) { // lock-free loop on prev.next val prev = prevNode // sentinel node is never removed, so prev is always defined @@ -154,9 +174,7 @@ public actual open class LockFreeLinkedListNode { predicate: (Node) -> Boolean, // prev node predicate crossinline condition: () -> Boolean // atomically checked condition ): Boolean { - val condAdd = object : CondAddOp(node) { - override fun prepare(affected: Node): Any? = if (condition()) null else CONDITION_FALSE - } + val condAdd = makeCondAddOp(node, condition) while (true) { // lock-free loop on prev.next val prev = prevNode // sentinel node is never removed, so prev is always defined if (!predicate(prev)) return false diff --git a/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt index ebf9f44cac..7e85d495fc 100644 --- a/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/internal/LockFreeLinkedListTest.kt @@ -32,6 +32,20 @@ class LockFreeLinkedListTest { assertContents(list) } + @Test + fun testCondOps() { + val list = LockFreeLinkedListHead() + assertContents(list) + assertTrue(list.addLastIf(IntNode(1)) { true }) + assertContents(list, 1) + assertFalse(list.addLastIf(IntNode(2)) { false }) + assertContents(list, 1) + assertTrue(list.addLastIf(IntNode(3)) { true }) + assertContents(list, 1, 3) + assertFalse(list.addLastIf(IntNode(4)) { false }) + assertContents(list, 1, 3) + } + @Test fun testAtomicOpsSingle() { val list = LockFreeLinkedListHead() diff --git a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt index 73af5d78a1..d8c07f4e19 100644 --- a/kotlinx-coroutines-core/js/src/internal/LinkedList.kt +++ b/kotlinx-coroutines-core/js/src/internal/LinkedList.kt @@ -59,6 +59,12 @@ public open class LinkedListNode { return true } + public inline fun addLastIf(node: Node, crossinline condition: () -> Boolean): Boolean { + if (!condition()) return false + addLast(node) + return true + } + public inline fun addLastIfPrev(node: Node, predicate: (Node) -> Boolean): Boolean { if (!predicate(_prev)) return false addLast(node) diff --git a/kotlinx-coroutines-core/jvm/src/Future.kt b/kotlinx-coroutines-core/jvm/src/Future.kt index f935c2a4dc..b27a970845 100644 --- a/kotlinx-coroutines-core/jvm/src/Future.kt +++ b/kotlinx-coroutines-core/jvm/src/Future.kt @@ -35,7 +35,7 @@ public fun CancellableContinuation<*>.cancelFutureOnCancellation(future: Future< private class CancelFutureOnCompletion( private val future: Future<*> ) : JobNode() { - override fun invokeOnce(cause: Throwable?) { + override fun invoke(cause: Throwable?) { // Don't interrupt when cancelling future on completion, because no one is going to reset this // interruption flag and it will cause spurious failures elsewhere if (cause != null) future.cancel(false) diff --git a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt index e692cb4c64..2ac51b9b1d 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListShortStressTest.kt @@ -40,14 +40,23 @@ class LockFreeLinkedListShortStressTest : TestBase() { threads += thread(start = false, name = "adder-$threadId") { val rnd = Random() while (System.currentTimeMillis() < deadline) { - val node = IntNode(threadId) - list.addLast(node) - if (node.remove()) { - undone.incrementAndGet() - } else { - // randomly help other removal's completion - if (rnd.nextBoolean()) node.helpRemove() - missed.incrementAndGet() + var node: IntNode? = IntNode(threadId) + when (rnd.nextInt(3)) { + 0 -> list.addLast(node!!) + 1 -> assertTrue(list.addLastIf(node!!, { true })) // just to test conditional add + 2 -> { // just to test failed conditional add + assertFalse(list.addLastIf(node!!, { false })) + node = null + } + } + if (node != null) { + if (node.remove()) { + undone.incrementAndGet() + } else { + // randomly help other removal's completion + if (rnd.nextBoolean()) node.helpRemove() + missed.incrementAndGet() + } } } completedAdder.incrementAndGet() From 2e25baeb29274853a1926f6bf7c3be761f306d72 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Fri, 19 Nov 2021 21:02:52 +0300 Subject: [PATCH 196/328] Update kotlinx-coroutines-test (#2973) This commit introduces the new version of the test module. Please see README.md and MIGRATION.md for a thorough discussion of the changes. Fixes #1203 Fixes #1609 Fixes #2379 Fixes #1749 Fixes #1204 Fixes #1390 Fixes #1222 Fixes #1395 Fixes #1881 Fixes #1910 Fixes #1772 Fixes #1626 Fixes #1742 Fixes #2082 Fixes #2102 Fixes #2405 Fixes #2462 Co-authored-by: Vsevolod Tolstopyatov --- .../api/kotlinx-coroutines-core.api | 9 + .../common/src/CoroutineContext.common.kt | 1 + .../common/src/Unconfined.kt | 1 + .../jvm/src/scheduling/CoroutineScheduler.kt | 2 - .../src/CoroutinesBlockHoundIntegration.kt | 1 - kotlinx-coroutines-test/MIGRATION.md | 325 +++++++++++ kotlinx-coroutines-test/README.md | 532 ++++++++---------- .../api/kotlinx-coroutines-test.api | 79 ++- .../common/src/TestBuilders.kt | 263 +++++++-- .../common/src/TestCoroutineDispatcher.kt | 212 ------- .../common/src/TestCoroutineDispatchers.kt | 159 ++++++ .../common/src/TestCoroutineScheduler.kt | 231 ++++++++ .../common/src/TestCoroutineScope.kt | 72 --- .../common/src/TestDispatcher.kt | 52 ++ .../common/src/TestDispatchers.kt | 10 +- .../common/src/TestScope.kt | 237 ++++++++ .../common/src/internal/TestMainDispatcher.kt | 74 ++- .../common/test/Helpers.kt | 66 +++ .../common/test/RunTestTest.kt | 296 ++++++++++ .../common/test/StandardTestDispatcherTest.kt | 79 +++ .../common/test/TestCoroutineSchedulerTest.kt | 323 +++++++++++ .../common/test/TestCoroutineScopeTest.kt | 25 - .../common/test/TestDispatchersTest.kt | 60 +- .../common/test/TestModuleHelpers.kt | 25 - .../common/test/TestScopeTest.kt | 179 ++++++ .../test/UnconfinedTestDispatcherTest.kt | 168 ++++++ .../js/src/TestBuilders.kt | 15 + .../js/test/FailingTests.kt | 37 ++ kotlinx-coroutines-test/js/test/Helpers.kt | 20 + .../js/test/PromiseTest.kt | 21 + .../jvm/src/TestBuildersJvm.kt | 15 + .../src/migration}/DelayController.kt | 114 +++- .../src/migration/TestBuildersDeprecated.kt | 190 +++++++ .../src/migration/TestCoroutineDispatcher.kt | 83 +++ .../TestCoroutineExceptionHandler.kt | 36 +- .../jvm/src/migration/TestCoroutineScope.kt | 332 +++++++++++ .../jvm/test/HelpersJvm.kt | 10 + .../jvm/test/MultithreadingTest.kt | 31 +- .../jvm/test/RunTestStressTest.kt | 26 + .../RunBlockingTestOnTestScopeTest.kt | 165 ++++++ .../test/migration/RunTestLegacyScopeTest.kt | 277 +++++++++ .../test/migration}/TestBuildersTest.kt | 3 +- .../TestCoroutineDispatcherOrderTest.kt | 16 +- .../migration}/TestCoroutineDispatcherTest.kt | 31 +- .../TestCoroutineExceptionHandlerTest.kt | 3 +- .../test/migration/TestCoroutineScopeTest.kt | 217 +++++++ .../migration}/TestRunBlockingOrderTest.kt | 19 +- .../test/migration}/TestRunBlockingTest.kt | 13 +- .../native/src/TestBuilders.kt | 15 + .../src/{ => internal}/TestMainDispatcher.kt | 0 .../native/test/FailingTests.kt | 25 + .../native/test/Helpers.kt | 6 + 52 files changed, 4367 insertions(+), 834 deletions(-) create mode 100644 kotlinx-coroutines-test/MIGRATION.md delete mode 100644 kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt create mode 100644 kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt create mode 100644 kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt delete mode 100644 kotlinx-coroutines-test/common/src/TestCoroutineScope.kt create mode 100644 kotlinx-coroutines-test/common/src/TestDispatcher.kt create mode 100644 kotlinx-coroutines-test/common/src/TestScope.kt create mode 100644 kotlinx-coroutines-test/common/test/RunTestTest.kt create mode 100644 kotlinx-coroutines-test/common/test/StandardTestDispatcherTest.kt create mode 100644 kotlinx-coroutines-test/common/test/TestCoroutineSchedulerTest.kt delete mode 100644 kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt delete mode 100644 kotlinx-coroutines-test/common/test/TestModuleHelpers.kt create mode 100644 kotlinx-coroutines-test/common/test/TestScopeTest.kt create mode 100644 kotlinx-coroutines-test/common/test/UnconfinedTestDispatcherTest.kt create mode 100644 kotlinx-coroutines-test/js/src/TestBuilders.kt create mode 100644 kotlinx-coroutines-test/js/test/FailingTests.kt create mode 100644 kotlinx-coroutines-test/js/test/Helpers.kt create mode 100644 kotlinx-coroutines-test/js/test/PromiseTest.kt create mode 100644 kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt rename kotlinx-coroutines-test/{common/src => jvm/src/migration}/DelayController.kt (51%) create mode 100644 kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt create mode 100644 kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt rename kotlinx-coroutines-test/{common/src => jvm/src/migration}/TestCoroutineExceptionHandler.kt (55%) create mode 100644 kotlinx-coroutines-test/jvm/src/migration/TestCoroutineScope.kt create mode 100644 kotlinx-coroutines-test/jvm/test/HelpersJvm.kt create mode 100644 kotlinx-coroutines-test/jvm/test/RunTestStressTest.kt create mode 100644 kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt create mode 100644 kotlinx-coroutines-test/jvm/test/migration/RunTestLegacyScopeTest.kt rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestBuildersTest.kt (97%) rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestCoroutineDispatcherOrderTest.kt (70%) rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestCoroutineDispatcherTest.kt (63%) rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestCoroutineExceptionHandlerTest.kt (82%) create mode 100644 kotlinx-coroutines-test/jvm/test/migration/TestCoroutineScopeTest.kt rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestRunBlockingOrderTest.kt (76%) rename kotlinx-coroutines-test/{common/test => jvm/test/migration}/TestRunBlockingTest.kt (98%) create mode 100644 kotlinx-coroutines-test/native/src/TestBuilders.kt rename kotlinx-coroutines-test/native/src/{ => internal}/TestMainDispatcher.kt (100%) create mode 100644 kotlinx-coroutines-test/native/test/FailingTests.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 36a516e070..ee4d8bfc09 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -556,6 +556,15 @@ public final class kotlinx/coroutines/TimeoutKt { public static final fun withTimeoutOrNull-KLykuaI (JLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } +public final class kotlinx/coroutines/YieldContext : kotlin/coroutines/AbstractCoroutineContextElement { + public static final field Key Lkotlinx/coroutines/YieldContext$Key; + public field dispatcherWasUnconfined Z + public fun ()V +} + +public final class kotlinx/coroutines/YieldContext$Key : kotlin/coroutines/CoroutineContext$Key { +} + public final class kotlinx/coroutines/YieldKt { public static final fun yield (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt index e17833218f..da094e152d 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt @@ -12,6 +12,7 @@ import kotlin.coroutines.* */ public expect fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext +@PublishedApi @Suppress("PropertyName") internal expect val DefaultDelay: Delay diff --git a/kotlinx-coroutines-core/common/src/Unconfined.kt b/kotlinx-coroutines-core/common/src/Unconfined.kt index 24a401f702..5837ae83f3 100644 --- a/kotlinx-coroutines-core/common/src/Unconfined.kt +++ b/kotlinx-coroutines-core/common/src/Unconfined.kt @@ -38,6 +38,7 @@ internal object Unconfined : CoroutineDispatcher() { /** * Used to detect calls to [Unconfined.dispatch] from [yield] function. */ +@PublishedApi internal class YieldContext : AbstractCoroutineContextElement(Key) { companion object Key : CoroutineContext.Key diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt b/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt index 84d9d9f8df..41f759ce8a 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt @@ -968,7 +968,6 @@ internal class CoroutineScheduler( * Checks if the thread is part of a thread pool that supports coroutines. * This function is needed for integration with BlockHound. */ -@Suppress("UNUSED") @JvmName("isSchedulerWorker") internal fun isSchedulerWorker(thread: Thread) = thread is CoroutineScheduler.Worker @@ -976,7 +975,6 @@ internal fun isSchedulerWorker(thread: Thread) = thread is CoroutineScheduler.Wo * Checks if the thread is running a CPU-bound task. * This function is needed for integration with BlockHound. */ -@Suppress("UNUSED") @JvmName("mayNotBlock") internal fun mayNotBlock(thread: Thread) = thread is CoroutineScheduler.Worker && thread.state == CoroutineScheduler.WorkerState.CPU_ACQUIRED diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index e7fe1e6c34..9cafffb038 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -10,7 +10,6 @@ import kotlinx.coroutines.scheduling.* import reactor.blockhound.* import reactor.blockhound.integration.* -@Suppress("UNUSED") public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { override fun applyTo(builder: BlockHound.Builder): Unit = with(builder) { diff --git a/kotlinx-coroutines-test/MIGRATION.md b/kotlinx-coroutines-test/MIGRATION.md new file mode 100644 index 0000000000..5124864745 --- /dev/null +++ b/kotlinx-coroutines-test/MIGRATION.md @@ -0,0 +1,325 @@ +# Migration to the new kotlinx-coroutines-test API + +In version 1.6.0, the API of the test module changed significantly. +This is a guide for gradually adapting the existing test code to the new API. +This guide is written step-by-step; the idea is to separate the migration into several sets of small changes. + +## Remove custom `UncaughtExceptionCaptor`, `DelayController`, and `TestCoroutineScope` implementations + +We couldn't find any code that defined new implementations of these interfaces, so they are deprecated. It's likely that +you don't need to do anything for this section. + +### `UncaughtExceptionCaptor` + +If the code base has an `UncaughtExceptionCaptor`, its special behavior as opposed to just `CoroutineExceptionHandler` +was that, at the end of `runBlockingTest` or `cleanupTestCoroutines` (or both), its `cleanupTestCoroutines` procedure +was called. + +We currently don't provide a replacement for this. +However, `runTest` follows structured concurrency better than `runBlockingTest` did, so exceptions from child coroutines +are propagated structurally, which makes uncaught exception handlers less useful. + +If you have a use case for this, please tell us about it at the issue tracker. +Meanwhile, it should be possible to use a custom exception captor, which should only implement +`CoroutineExceptionHandler` now, like this: + +```kotlin +@Test +fun testFoo() = runTest { + val customCaptor = MyUncaughtExceptionCaptor() + launch(customCaptor) { + // ... + } + advanceUntilIdle() + customCaptor.cleanupTestCoroutines() +} +``` + +### `DelayController` + +We don't provide a way to define custom dispatching strategies that support virtual time. +That said, we significantly enhanced this mechanism: +* Using multiple test dispatchers simultaneously is supported. + For the dispatchers to have a shared knowledge of the virtual time, either the same `TestCoroutineScheduler` should be + passed to each of them, or all of them should be constructed after `Dispatchers.setMain` is called with some test + dispatcher. +* Both a simple `StandardTestDispatcher` that is always paused, and unconfined `UnconfinedTestDispatcher` are provided. + +If you have a use case for `DelayController` that's not covered by what we provide, please tell us about it in the issue +tracker. + +### `TestCoroutineScope` + +This scope couldn't be meaningfully used in tandem with `runBlockingTest`: according to the definition of +`TestCoroutineScope.runBlockingTest`, only the scope's `coroutineContext` is used. +So, there could be two reasons for defining a custom implementation: + +* Avoiding the restrictions on placed `coroutineContext` in the `TestCoroutineScope` constructor function. + These restrictions consisted of requirements for `CoroutineExceptionHandler` being an `UncaughtExceptionCaptor`, and + `ContinuationInterceptor` being a `DelayController`, so it is also possible to fulfill these restrictions by defining + conforming instances. In this case, follow the instructions about replacing them. +* Using without `runBlockingTest`. In this case, you don't even need to implement `TestCoroutineScope`: nothing else + accepts a `TestCoroutineScope` specifically as an argument. + +## Remove usages of `TestCoroutineExceptionHandler` and `TestCoroutineScope.uncaughtExceptions` + +It is already illegal to use a `TestCoroutineScope` without performing `cleanupTestCoroutines`, so the valid uses of +`TestCoroutineExceptionHandler` include: + +* Accessing `uncaughtExceptions` in the middle of the test to make sure that there weren't any uncaught exceptions + *yet*. + If there are any, they will be thrown by the cleanup procedure anyway. + We don't support this use case, given how comparatively rare it is, but it can be handled in the same way as the + following one. +* Accessing `uncaughtExceptions` when the uncaught exceptions are actually expected. + In this case, `cleanupTestCoroutines` will fail with an exception that is being caught later. + It would be better in this case to use a custom `CoroutineExceptionHandler` so that actual problems that could be + found by the cleanup procedure are not superseded by the exceptions that are expected. + An example is shown below. + +```kotlin +val exceptions = mutableListOf() +val customCaptor = CoroutineExceptionHandler { ctx, throwable -> + exceptions.add(throwable) // add proper synchronization if the test is multithreaded +} + +@Test +fun testFoo() = runTest { + launch(customCaptor) { + // ... + } + advanceUntilIdle() + // check the list of the caught exceptions +} +``` + +## Auto-replace `TestCoroutineScope` constructor function with `createTestCoroutineScope` + +This should not break anything, as `TestCoroutineScope` is now defined in terms of `createTestCoroutineScope`. +If it does break something, it means that you already supplied a `TestCoroutineScheduler` to some scope; in this case, +also pass this scheduler as the argument to the dispatcher. + +## Replace usages of `pauseDispatcher` and `resumeDispatcher` with a `StandardTestDispatcher` + +* In places where `pauseDispatcher` in its block form is called, replace it with a call to + `withContext(StandardTestDispatcher(testScheduler))` + (`testScheduler` is available as a field of `TestCoroutineScope`, + or `scheduler` is available as a field of `TestCoroutineDispatcher`), + followed by `advanceUntilIdle()`. + This is not an automatic replacement, as there can be tricky situations where the test dispatcher is already paused + when `pauseDispatcher { X }` is called. In such cases, simply replace `pauseDispatcher { X }` with `X`. +* Often, `pauseDispatcher()` in a non-block form is used at the start of the test. + Then, attempt to remove `TestCoroutineDispatcher` from the arguments to `createTestCoroutineScope`, + if a standalone `TestCoroutineScope` or the `scope.runBlockingTest` form is used, + or pass a `StandardTestDispatcher` as an argument to `runBlockingTest`. + This will lead to the test using a `StandardTestDispatcher`, which does not allow pausing and resuming, + instead of the deprecated `TestCoroutineDispatcher`. +* Sometimes, `pauseDispatcher()` and `resumeDispatcher()` are employed used throughout the test. + In this case, attempt to wrap everything until the next `resumeDispatcher()` in + a `withContext(StandardTestDispatcher(testScheduler))` block, or try using some other combinations of + `StandardTestDispatcher` (where dispatches are needed) and `UnconfinedTestDispatcher` (where it isn't important where + execution happens). + +## Replace `advanceTimeBy(n)` with `advanceTimeBy(n); runCurrent()` + +For `TestCoroutineScope` and `DelayController`, the `advanceTimeBy` method is deprecated. +It is not deprecated for `TestCoroutineScheduler` and `TestScope`, but has a different meaning: it does not run the +tasks scheduled *at* `currentTime + n`. + +There is an automatic replacement for this deprecation, which produces correct but inelegant code. + +Alternatively, you can wait until replacing `TestCoroutineScope` with `TestScope`: it's possible that you will not +encounter this edge case. + +## Replace `runBlockingTest` with `runTest(UnconfinedTestDispatcher())` + +This is a major change, affecting many things, and can be done in parallel with replacing `TestCoroutineScope` with +`TestScope`. + +Significant differences of `runTest` from `runBlockingTest` are each given a section below. + +### It works properly with other dispatchers and asynchronous completions. + +No action on your part is required, other than replacing `runBlocking` with `runTest` as well. + +### It uses `StandardTestDispatcher` by default, not `TestCoroutineDispatcher`. + +By now, calls to `pauseDispatcher` and `resumeDispatcher` should be purged from the code base, so only the unpaused +variant of `TestCoroutineDispatcher` should be used. +This version of the dispatcher, which can be observed has the property of eagerly entering `launch` and `async` blocks: +code until the first suspension is executed without dispatching. + +We ensured sure that, when run with an `UnconfinedTestDispatcher`, `runTest` also eagerly enters `launch` and `async` +blocks, but *this only works at the top level*: if a child coroutine also called `launch` or `async`, we don't provide +any guarantees about their dispatching order. + +So, using `UnconfinedTestDispatcher` as an argument to `runTest` will probably lead to the test being executed as it +did, but in the possible case that the test relies on the specific dispatching order of `TestCoroutineDispatcher`, it +will need to be tweaked. +If the test expects some code to have run at some point, but it hasn't, use `runCurrent` to force the tasks scheduled +at this moment of time to run. + +### The job hierarchy is completely different. + +- Structured concurrency is used, with the scope provided as the receiver of `runTest` actually being the scope of the + created coroutine. +- Not `SupervisorJob` but a normal `Job` is used for the `TestCoroutineScope`. +- The job passed as an argument is used as a parent job. + +Most tests should not be affected by this. In case your test is, try explicitly launching a child coroutine with a +`SupervisorJob`; this should make the job hierarchy resemble what it used to be. + +```kotlin +@Test +fun testFoo() = runTest { + val deferred = async(SupervisorJob()) { + // test code + } + advanceUntilIdle() + deferred.getCompletionExceptionOrNull()?.let { + throw it + } +} +``` + +### Only a single call to `runTest` is permitted per test. + +In order to work on JS, only a single call to `runTest` must happen during one test, and its result must be returned +immediately: + +```kotlin +@Test +fun testFoo(): TestResult { + // arbitrary code here + return runTest { + // ... + } +} +``` + +When used only on the JVM, `runTest` will work when called repeatedly, but this is not supported. +Please only call `runTest` once per test, and if for some reason you can't, please tell us about in on the issue +tracker. + +### It uses `TestScope`, not `TestCoroutineScope`, by default. + +There is a `runTestWithLegacyScope` method that allows migrating from `runBlockingTest` to `runTest` before migrating +from `TestCoroutineScope` to `TestScope`, if exactly the `TestCoroutineScope` needs to be passed somewhere else and +`TestScope` will not suffice. + +## Replace `TestCoroutineScope.cleanupTestCoroutines` with `runTest` + +Likely can be done together with the next step. + +Remove all calls to `TestCoroutineScope.cleanupTestCoroutines` from the code base. +Instead, as the last step of each test, do `return scope.runTest`; if possible, the whole test body should go inside +the `runTest` block. + +The cleanup procedure in `runTest` will not check that the virtual time doesn't advance during cleanup. +If a test must check that no other delays are remaining after it has finished, the following form may help: +```kotlin +runTest { + testBody() + val timeAfterTest = currentTime() + advanceUntilIdle() // run the remaining tasks + assertEquals(timeAfterTest, currentTime()) // will fail if there were tasks scheduled at a later moment +} +``` +Note that this will report time advancement even if the job scheduled at a later point was cancelled. + +It may be the case that `cleanupTestCoroutines` must be executed after de-initialization in `@AfterTest`, which happens +outside the test itself. +In this case, we propose that you write a wrapper of the form: + +```kotlin +fun runTestAndCleanup(body: TestScope.() -> Unit) = runTest { + try { + body() + } finally { + // the usual cleanup procedures that used to happen before `cleanupTestCoroutines` + } +} +``` + +## Replace `runBlockingTest` with `runBlockingTestOnTestScope`, `createTestCoroutineScope` with `TestScope` + +Also, replace `runTestWithLegacyScope` with just `runTest`. +All of this can be done in parallel with replacing `runBlockingTest` with `runTest`. + +This step should remove all uses of `TestCoroutineScope`, explicit or implicit. + +Replacing `runTestWithLegacyScope` and `runBlockingTest` with `runTest` and `runBlockingTestOnTestScope` should be +straightforward if there is no more code left that requires passing exactly `TestCoroutineScope` to it. +Some tests may fail because `TestCoroutineScope.cleanupTestCoroutines` and the cleanup procedure in `runTest` +handle cancelled tasks differently: if there are *cancelled* jobs pending at the moment of +`TestCoroutineScope.cleanupTestCoroutines`, they are ignored, whereas `runTest` will report them. + +Of all the methods supported by `TestCoroutineScope`, only `cleanupTestCoroutines` is not provided on `TestScope`, +and its usages should have been removed during the previous step. + +## Replace `runBlocking` with `runTest` + +Now that `runTest` works properly with asynchronous completions, `runBlocking` is only occasionally useful. +As is, most uses of `runBlocking` in tests come from the need to interact with dispatchers that execute on other +threads, like `Dispatchers.IO` or `Dispatchers.Default`. + +## Replace `TestCoroutineDispatcher` with `UnconfinedTestDispatcher` and `StandardTestDispatcher` + +`TestCoroutineDispatcher` is a dispatcher with two modes: +* ("unpaused") Almost (but not quite) unconfined, with the ability to eagerly enter `launch` and `async` blocks. +* ("paused") Behaving like a `StandardTestDispatcher`. + +In one of the earlier steps, we replaced `pauseDispatcher` with `StandardTestDispatcher` usage, and replaced the +implicit `TestCoroutineScope` dispatcher in `runBlockingTest` with `UnconfinedTestDispatcher` during migration to +`runTest`. + +Now, the rest of the usages should be replaced with whichever dispatcher is most appropriate. + +## Simplify code by removing unneeded entities + +Likely, now some code has the form + +```kotlin +val dispatcher = StandardTestDispatcher() +val scope = TestScope(dispatcher) + +@BeforeTest +fun setUp() { + Dispatchers.setMain(dispatcher) +} + +@AfterTest +fun tearDown() { + Dispatchers.resetMain() +} + +@Test +fun testFoo() = scope.runTest { + // ... +} +``` + +The point of this pattern is to ensure that the test runs with the same `TestCoroutineScheduler` as the one used for +`Dispatchers.Main`. + +However, now this can be simplified to just + +```kotlin +@BeforeTest +fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) +} + +@AfterTest +fun tearDown() { + Dispatchers.resetMain() +} + +@Test +fun testFoo() = runTest { + // ... +} +``` + +The reason this works is that all entities that depend on `TestCoroutineScheduler` will attempt to acquire one from +the current `Dispatchers.Main`. \ No newline at end of file diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 43ae18f532..54450b1e82 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -2,7 +2,24 @@ Test utilities for `kotlinx.coroutines`. -This package provides testing utilities for effectively testing coroutines. +## Overview + +This package provides utilities for efficiently testing coroutines. + +| Name | Description | +| ---- | ----------- | +| [runTest] | Runs the test code, automatically skipping delays and handling uncaught exceptions. | +| [TestCoroutineScheduler] | The shared source of virtual time, used for controlling execution order and skipping delays. | +| [TestScope] | A [CoroutineScope] that integrates with [runTest], providing access to [TestCoroutineScheduler]. | +| [TestDispatcher] | A [CoroutineDispatcher] that whose delays are controlled by a [TestCoroutineScheduler]. | +| [Dispatchers.setMain] | Mocks the main dispatcher using the provided one. If mocked with a [TestDispatcher], its [TestCoroutineScheduler] is used everywhere by default. | + +Provided [TestDispatcher] implementations: + +| Name | Description | +| ---- | ----------- | +| [StandardTestDispatcher] | A simple dispatcher with no special behavior other than being linked to a [TestCoroutineScheduler]. | +| [UnconfinedTestDispatcher] | A dispatcher that behaves like [Dispatchers.Unconfined]. | ## Using in your project @@ -13,24 +30,26 @@ dependencies { } ``` -**Do not** depend on this project in your main sources, all utilities are intended and designed to be used only from tests. +**Do not** depend on this project in your main sources, all utilities here are intended and designed to be used only from tests. ## Dispatchers.Main Delegation -`Dispatchers.setMain` will override the `Main` dispatcher in test situations. This is helpful when you want to execute a -test in situations where the platform `Main` dispatcher is not available, or you wish to replace `Dispatchers.Main` with a -testing dispatcher. +`Dispatchers.setMain` will override the `Main` dispatcher in test scenarios. +This is helpful when one wants to execute a test in situations where the platform `Main` dispatcher is not available, +or to replace `Dispatchers.Main` with a testing dispatcher. -Once you have this dependency in the runtime, -[`ServiceLoader`](https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html) mechanism will overwrite -[Dispatchers.Main] with a testable implementation. +On the JVM, +the [`ServiceLoader`](https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html) mechanism is responsible +for overwriting [Dispatchers.Main] with a testable implementation, which by default will delegate its calls to the real +`Main` dispatcher, if any. -You can override the `Main` implementation using [setMain][setMain] method with any [CoroutineDispatcher] implementation, e.g.: +The `Main` implementation can be overridden using [Dispatchers.setMain][setMain] method with any [CoroutineDispatcher] +implementation, e.g.: ```kotlin class SomeTest { - + private val mainThreadSurrogate = newSingleThreadContext("UI thread") @Before @@ -40,10 +59,10 @@ class SomeTest { @After fun tearDown() { - Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher + Dispatchers.resetMain() // reset the main dispatcher to the original Main dispatcher mainThreadSurrogate.close() } - + @Test fun testSomeUI() = runBlocking { launch(Dispatchers.Main) { // Will be launched in the mainThreadSurrogate dispatcher @@ -52,372 +71,289 @@ class SomeTest { } } ``` -Calling `setMain` or `resetMain` immediately changes the `Main` dispatcher globally. The testable version of -`Dispatchers.Main` installed by the `ServiceLoader` will delegate to the dispatcher provided by `setMain`. -## runBlockingTest +Calling `setMain` or `resetMain` immediately changes the `Main` dispatcher globally. -To test regular suspend functions or coroutines started with `launch` or `async` use the [runBlockingTest] coroutine -builder that provides extra test control to coroutines. +If `Main` is overridden with a [TestDispatcher], then its [TestCoroutineScheduler] is used when new [TestDispatcher] or +[TestScope] instances are created without [TestCoroutineScheduler] being passed as an argument. -1. Auto-advancing of time for regular suspend functions -2. Explicit time control for testing multiple coroutines -3. Eager execution of `launch` or `async` code blocks -4. Pause, manually advance, and restart the execution of coroutines in a test -5. Report uncaught exceptions as test failures +## runTest -### Testing regular suspend functions +[runTest] is the way to test code that involves coroutines. `suspend` functions can be called inside it. -To test regular suspend functions, which may have a delay, you can use the [runBlockingTest] builder to start a testing -coroutine. Any calls to `delay` will automatically advance virtual time by the amount delayed. +**IMPORTANT: in order to work with on Kotlin/JS, the result of `runTest` must be immediately `return`-ed from each test.** +The typical invocation of [runTest] thus looks like this: ```kotlin @Test -fun testFoo() = runBlockingTest { // a coroutine with an extra test control - val actual = foo() - // ... +fun testFoo() = runTest { + // code under test } +``` -suspend fun foo() { - delay(1_000) // auto-advances virtual time by 1_000ms due to runBlockingTest - // ... +In more advanced scenarios, it's possible instead to use the following form: +```kotlin +@Test +fun testFoo(): TestResult { + // initialize some test state + return runTest { + // code under test + } } ``` -`runBlockingTest` returns `Unit` so it may be used in a single expression with common testing libraries. +[runTest] is similar to running the code with `runBlocking` on Kotlin/JVM and Kotlin/Native, or launching a new promise +on Kotlin/JS. The main differences are the following: -### Testing `launch` or `async` +* **The calls to `delay` are automatically skipped**, preserving the relative execution order of the tasks. This way, + it's possible to make tests finish more-or-less immediately. +* **Controlling the virtual time**: in case just skipping delays is not sufficient, it's possible to more carefully + guide the execution, advancing the virtual time by a duration, draining the queue of the awaiting tasks, or running + the tasks scheduled at the present moment. +* **Handling uncaught exceptions** spawned in the child coroutines by throwing them at the end of the test. +* **Waiting for asynchronous callbacks**. + Sometimes, especially when working with third-party code, it's impossible to mock all the dispatchers in use. + [runTest] will handle the situations where some code runs in dispatchers not integrated with the test module. -Inside of [runBlockingTest], both [launch] and [async] will start a new coroutine that may run concurrently with the -test case. +## Delay-skipping -To make common testing situations easier, by default the body of the coroutine is executed *eagerly* until -the first call to [delay] or [yield]. +To test regular suspend functions, which may have a delay, just run them inside the [runTest] block. ```kotlin @Test -fun testFooWithLaunch() = runBlockingTest { - foo() - // the coroutine launched by foo() is completed before foo() returns +fun testFoo() = runTest { // a coroutine with an extra test control + val actual = foo() // ... } -fun CoroutineScope.foo() { - // This coroutines `Job` is not shared with the test code - launch { - bar() // executes eagerly when foo() is called due to runBlockingTest - println(1) // executes eagerly when foo() is called due to runBlockingTest - } +suspend fun foo() { + delay(1_000) // when run in `runTest`, will finish immediately instead of delaying + // ... } - -suspend fun bar() {} ``` -`runBlockingTest` will auto-progress virtual time until all coroutines are completed before returning. If any coroutines -are not able to complete, an [UncompletedCoroutinesError] will be thrown. - -*Note:* The default eager behavior of [runBlockingTest] will ignore [CoroutineStart] parameters. - -### Testing `launch` or `async` with `delay` +## `launch` and `async` -If the coroutine created by `launch` or `async` calls `delay` then the [runBlockingTest] will not auto-progress time -right away. This allows tests to observe the interaction of multiple coroutines with different delays. +The coroutine dispatcher used for tests is single-threaded, meaning that the child coroutines of the [runTest] block +will run on the thread that started the test, and will never run in parallel. -To control time in the test you can use the [DelayController] interface. The block passed to -[runBlockingTest] can call any method on the `DelayController` interface. +If several coroutines are waiting to be executed next, the one scheduled after the smallest delay will be chosen. +The virtual time will automatically advance to the point of its resumption. ```kotlin @Test -fun testFooWithLaunchAndDelay() = runBlockingTest { - foo() - // the coroutine launched by foo has not completed here, it is suspended waiting for delay(1_000) - advanceTimeBy(1_000) // progress time, this will cause the delay to resume - // the coroutine launched by foo has completed here - // ... -} - -suspend fun CoroutineScope.foo() { +fun testWithMultipleDelays() = runTest { launch { - println(1) // executes eagerly when foo() is called due to runBlockingTest - delay(1_000) // suspends until time is advanced by at least 1_000 - println(2) // executes after advanceTimeBy(1_000) + delay(1_000) + println("1. $currentTime") // 1000 + delay(200) + println("2. $currentTime") // 1200 + delay(2_000) + println("4. $currentTime") // 3200 + } + val deferred = async { + delay(3_000) + println("3. $currentTime") // 3000 + delay(500) + println("5. $currentTime") // 3500 } + deferred.await() } ``` -*Note:* `runBlockingTest` will always attempt to auto-progress time until all coroutines are completed just before -exiting. This is a convenience to avoid having to call [advanceUntilIdle][DelayController.advanceUntilIdle] -as the last line of many common test cases. -If any coroutines cannot complete by advancing time, an [UncompletedCoroutinesError] is thrown. +## Controlling the virtual time -### Testing `withTimeout` using `runBlockingTest` - -Time control can be used to test timeout code. To do so, ensure that the function under test is suspended inside a -`withTimeout` block and advance time until the timeout is triggered. - -Depending on the code, causing the code to suspend may need to use different mocking or fake techniques. For this -example an uncompleted `Deferred` is provided to the function under test via parameter injection. +Inside [runTest], the following operations are supported: +* `currentTime` gets the current virtual time. +* `runCurrent()` runs the tasks that are scheduled at this point of virtual time. +* `advanceUntilIdle()` runs all enqueued tasks until there are no more. +* `advanceTimeBy(timeDelta)` runs the enqueued tasks until the current virtual time advances by `timeDelta`. ```kotlin -@Test(expected = TimeoutCancellationException::class) -fun testFooWithTimeout() = runBlockingTest { - val uncompleted = CompletableDeferred() // this Deferred will never complete - foo(uncompleted) - advanceTimeBy(1_000) // advance time, which will cause the timeout to throw an exception - // ... -} - -fun CoroutineScope.foo(resultDeferred: Deferred) { +@Test +fun testFoo() = runTest { launch { - withTimeout(1_000) { - resultDeferred.await() // await() will suspend forever waiting for uncompleted - // ... - } + println(1) // executes during runCurrent() + delay(1_000) // suspends until time is advanced by at least 1_000 + println(2) // executes during advanceTimeBy(2_000) + delay(500) // suspends until the time is advanced by another 500 ms + println(3) // also executes during advanceTimeBy(2_000) + delay(5_000) // will suspend by another 4_500 ms + println(4) // executes during advanceUntilIdle() } + // the child coroutine has not run yet + runCurrent() + // the child coroutine has called println(1), and is suspended on delay(1_000) + advanceTimeBy(2_000) // progress time, this will cause two calls to `delay` to resume + // the child coroutine has called println(2) and println(3) and suspends for another 4_500 virtual milliseconds + advanceUntilIdle() // will run the child coroutine to completion + assertEquals(6500, currentTime) // the child coroutine finished at virtual time of 6_500 milliseconds } ``` -*Note:* Testing timeouts is simpler with a second coroutine that can be suspended (as in this example). If the -call to `withTimeout` is in a regular suspend function, consider calling `launch` or `async` inside your test body to -create a second coroutine. - -### Using `pauseDispatcher` for explicit execution of `runBlockingTest` +## Using multiple test dispatchers -The eager execution of `launch` and `async` bodies makes many tests easier, but some tests need more fine grained -control of coroutine execution. +The virtual time is controlled by an entity called the [TestCoroutineScheduler], which behaves as the shared source of +virtual time. -To disable eager execution, you can call [pauseDispatcher][DelayController.pauseDispatcher] -to pause the [TestCoroutineDispatcher] that [runBlockingTest] uses. +Several dispatchers can be created that use the same [TestCoroutineScheduler], in which case they will share their +knowledge of the virtual time. -When the dispatcher is paused, all coroutines will be added to a queue instead running. In addition, time will never -auto-progress due to `delay` on a paused dispatcher. +To access the scheduler used for this test, use the [TestScope.testScheduler] property. ```kotlin @Test -fun testFooWithPauseDispatcher() = runBlockingTest { - pauseDispatcher { - foo() - // the coroutine started by foo has not run yet - runCurrent() // the coroutine started by foo advances to delay(1_000) - // the coroutine started by foo has called println(1), and is suspended on delay(1_000) - advanceTimeBy(1_000) // progress time, this will cause the delay to resume - // the coroutine started by foo has called println(2) and has completed here - } - // ... -} - -fun CoroutineScope.foo() { - launch { - println(1) // executes after runCurrent() is called - delay(1_000) // suspends until time is advanced by at least 1_000 - println(2) // executes after advanceTimeBy(1_000) +fun testWithMultipleDispatchers() = runTest { + val scheduler = testScheduler // the scheduler used for this test + val dispatcher1 = StandardTestDispatcher(scheduler, name = "IO dispatcher") + val dispatcher2 = StandardTestDispatcher(scheduler, name = "Background dispatcher") + launch(dispatcher1) { + delay(1_000) + println("1. $currentTime") // 1000 + delay(200) + println("2. $currentTime") // 1200 + delay(2_000) + println("4. $currentTime") // 3200 + } + val deferred = async(dispatcher2) { + delay(3_000) + println("3. $currentTime") // 3000 + delay(500) + println("5. $currentTime") // 3500 + } + deferred.await() } -} ``` -Using `pauseDispatcher` gives tests explicit control over the progress of time as well as the ability to enqueue all -coroutines. As a best practice consider adding two tests, one paused and one eager, to test coroutines that have -non-trivial external dependencies and side effects in their launch body. - -*Important:* When passed a lambda block, `pauseDispatcher` will resume eager execution immediately after the block. -This will cause time to auto-progress if there are any outstanding `delay` calls that were not resolved before the -`pauseDispatcher` block returned. In advanced situations tests can call [pauseDispatcher][DelayController.pauseDispatcher] -without a lambda block and then explicitly resume the dispatcher with [resumeDispatcher][DelayController.resumeDispatcher]. +**Note: if [Dispatchers.Main] is replaced by a [TestDispatcher], [runTest] will automatically use its scheduler. +This is done so that there is no need to go through the ceremony of passing the correct scheduler to [runTest].** -## Integrating tests with structured concurrency +## Accessing the test coroutine scope -Code that uses structured concurrency needs a [CoroutineScope] in order to launch a coroutine. In order to integrate -[runBlockingTest] with code that uses common structured concurrency patterns tests can provide one (or both) of these -classes to application code. +Structured concurrency ties coroutines to scopes in which they are launched. +[TestScope] is a special coroutine scope designed for testing coroutines, and a new one is automatically created +for [runTest] and used as the receiver for the test body. - | Name | Description | - | ---- | ----------- | - | [TestCoroutineScope] | A [CoroutineScope] which provides detailed control over the execution of coroutines for tests and integrates with [runBlockingTest]. | - | [TestCoroutineDispatcher] | A [CoroutineDispatcher] which can be used for tests and integrates with [runBlockingTest]. | - - Both classes are provided to allow for various testing needs. Depending on the code that's being - tested, it may be easier to provide a [TestCoroutineDispatcher]. For example [Dispatchers.setMain][setMain] will accept - a [TestCoroutineDispatcher] but not a [TestCoroutineScope]. - - [TestCoroutineScope] will always use a [TestCoroutineDispatcher] to execute coroutines. It - also uses [TestCoroutineExceptionHandler] to convert uncaught exceptions into test failures. +However, it can be convenient to access a `CoroutineScope` before the test has started, for example, to perform mocking +of some +parts of the system in `@BeforeTest` via dependency injection. +In these cases, it is possible to manually create [TestScope], the scope for the test coroutines, in advance, +before the test begins. -By providing [TestCoroutineScope] a test case is able to control execution of coroutines, as well as ensure that -uncaught exceptions thrown by coroutines are converted into test failures. +[TestScope] on its own does not automatically run the code launched in it. +In addition, it is stateful in order to keep track of executing coroutines and uncaught exceptions. +Therefore, it is important to ensure that [TestScope.runTest] is called eventually. -### Providing `TestCoroutineScope` from `runBlockingTest` +```kotlin +val scope = TestScope() -In simple cases, tests can use the [TestCoroutineScope] created by [runBlockingTest] directly. +@BeforeTest +fun setUp() { + Dispatchers.setMain(StandardTestDispatcher(scope.testScheduler)) + TestSubject.setScope(scope) +} -```kotlin -@Test -fun testFoo() = runBlockingTest { - foo() // runBlockingTest passed in a TestCoroutineScope as this +@AfterTest +fun tearDown() { + Dispatchers.resetMain() + TestSubject.resetScope() } -fun CoroutineScope.foo() { - launch { // CoroutineScope for launch is the TestCoroutineScope provided by runBlockingTest - // ... - } +@Test +fun testSubject() = scope.runTest { + // the receiver here is `testScope` } ``` -This style is preferred when the `CoroutineScope` is passed through an extension function style. - -### Providing an explicit `TestCoroutineScope` - -In many cases, the direct style is not preferred because [CoroutineScope] may need to be provided through another means -such as dependency injection or service locators. +## Eagerly entering `launch` and `async` blocks -Tests can declare a [TestCoroutineScope] explicitly in the class to support these use cases. +Some tests only test functionality and don't particularly care about the precise order in which coroutines are +dispatched. +In these cases, it can be cumbersome to always call [runCurrent] or [yield] to observe the effects of the coroutines +after they are launched. -Since [TestCoroutineScope] is stateful in order to keep track of executing coroutines and uncaught exceptions, it is -important to ensure that [cleanupTestCoroutines][TestCoroutineScope.cleanupTestCoroutines] is called after every test case. +If [runTest] executes with an [UnconfinedTestDispatcher], the child coroutines launched at the top level are entered +*eagerly*, that is, they don't go through a dispatch until the first suspension. ```kotlin -class TestClass { - private val testScope = TestCoroutineScope() - private lateinit var subject: Subject - - @Before - fun setup() { - // provide the scope explicitly, in this example using a constructor parameter - subject = Subject(testScope) - } - - @After - fun cleanUp() { - testScope.cleanupTestCoroutines() - } - - @Test - fun testFoo() = testScope.runBlockingTest { - // TestCoroutineScope.runBlockingTest uses the Dispatcher and exception handler provided by `testScope` - subject.foo() - } -} - -class Subject(val scope: CoroutineScope) { - fun foo() { - scope.launch { - // launch uses the testScope injected in setup - } +@Test +fun testEagerlyEnteringChildCoroutines() = runTest(UnconfinedTestDispatcher()) { + var entered = false + val deferred = CompletableDeferred() + var completed = false + launch { + entered = true + deferred.await() + completed = true } + assertTrue(entered) // `entered = true` already executed. + assertFalse(completed) // however, the child coroutine then suspended, so it is enqueued. + deferred.complete(Unit) // resume the coroutine. + assertTrue(completed) // now the child coroutine is immediately completed. } ``` -*Note:* [TestCoroutineScope], [TestCoroutineDispatcher], and [TestCoroutineExceptionHandler] are interfaces to enable -test libraries to provide library specific integrations. For example, a JUnit4 `@Rule` may call -[Dispatchers.setMain][setMain] then expose [TestCoroutineScope] for use in tests. - -### Providing an explicit `TestCoroutineDispatcher` - -While providing a [TestCoroutineScope] is slightly preferred due to the improved uncaught exception handling, there are -many situations where it is easier to provide a [TestCoroutineDispatcher]. For example [Dispatchers.setMain][setMain] -does not accept a [TestCoroutineScope] and requires a [TestCoroutineDispatcher] to control coroutine execution in -tests. - -The main difference between `TestCoroutineScope` and `TestCoroutineDispatcher` is how uncaught exceptions are handled. -When using `TestCoroutineDispatcher` uncaught exceptions thrown in coroutines will use regular -[coroutine exception handling](https://kotlinlang.org/docs/reference/coroutines/exception-handling.html). -`TestCoroutineScope` will always use `TestCoroutineDispatcher` as it's dispatcher. - -A test can use a `TestCoroutineDispatcher` without declaring an explicit `TestCoroutineScope`. This is preferred -when the class under test allows a test to provide a [CoroutineDispatcher] but does not allow the test to provide a -[CoroutineScope]. - -Since [TestCoroutineDispatcher] is stateful in order to keep track of executing coroutines, it is -important to ensure that [cleanupTestCoroutines][DelayController.cleanupTestCoroutines] is called after every test case. +If this behavior is desirable, but some parts of the test still require accurate dispatching, for example, to ensure +that the code executes on the correct thread, then simply `launch` a new coroutine with the [StandardTestDispatcher]. ```kotlin -class TestClass { - private val testDispatcher = TestCoroutineDispatcher() - - @Before - fun setup() { - // provide the scope explicitly, in this example using a constructor parameter - Dispatchers.setMain(testDispatcher) - } - - @After - fun cleanUp() { - Dispatchers.resetMain() - testDispatcher.cleanupTestCoroutines() - } - - @Test - fun testFoo() = testDispatcher.runBlockingTest { - // TestCoroutineDispatcher.runBlockingTest uses `testDispatcher` to run coroutines - foo() +@Test +fun testEagerlyEnteringSomeChildCoroutines() = runTest(UnconfinedTestDispatcher()) { + var entered1 = false + launch { + entered1 = true } -} + assertTrue(entered1) // `entered1 = true` already executed -fun foo() { - MainScope().launch { - // launch will use the testDispatcher provided by setMain + var entered2 = false + launch(StandardTestDispatcher(testScheduler)) { + // this block and every coroutine launched inside it will explicitly go through the needed dispatches + entered2 = true } + assertFalse(entered2) + runCurrent() // need to explicitly run the dispatched continuation + assertTrue(entered2) } ``` -*Note:* Prefer to provide `TestCoroutineScope` when it does not complicate code since it will also elevate exceptions -to test failures. However, exposing a `CoroutineScope` to callers of a function may lead to complicated code, in which -case this is the preferred pattern. - -### Using `TestCoroutineScope` and `TestCoroutineDispatcher` without `runBlockingTest` +### Using `withTimeout` inside `runTest` -It is supported to use both [TestCoroutineScope] and [TestCoroutineDispatcher] without using the [runBlockingTest] -builder. Tests may need to do this in situations such as introducing multiple dispatchers and library writers may do -this to provide alternatives to `runBlockingTest`. +Timeouts are also susceptible to time control, so the code below will immediately finish. ```kotlin @Test -fun testFooWithAutoProgress() { - val scope = TestCoroutineScope() - scope.foo() - // foo is suspended waiting for time to progress - scope.advanceUntilIdle() - // foo's coroutine will be completed before here -} - -fun CoroutineScope.foo() { - launch { - println(1) // executes eagerly when foo() is called due to TestCoroutineScope - delay(1_000) // suspends until time is advanced by at least 1_000 - println(2) // executes after advanceTimeUntilIdle +fun testFooWithTimeout() = runTest { + assertFailsWith { + withTimeout(1_000) { + delay(999) + delay(2) + println("this won't be reached") + } } -} +} ``` -## Using time control with `withContext` - -Calls to `withContext(Dispatchers.IO)` or `withContext(Dispatchers.Default)` are common in coroutines based codebases. -Both dispatchers are not designed to interact with `TestCoroutineDispatcher`. +## Virtual time support with other dispatchers -Tests should provide a `TestCoroutineDispatcher` to replace these dispatchers if the `withContext` calls `delay` in the -function under test. For example, a test that calls `veryExpensiveOne` should provide a `TestCoroutineDispatcher` using -either dependency injection, a service locator, or a default parameter. +Calls to `withContext(Dispatchers.IO)`, `withContext(Dispatchers.Default)` ,and `withContext(Dispatchers.Main)` are +common in coroutines-based code bases. Unfortunately, just executing code in a test will not lead to these dispatchers +using the virtual time source, so delays will not be skipped in them. ```kotlin -suspend fun veryExpensiveOne() = withContext(Dispatchers.Default) { +suspend fun veryExpensiveFunction() = withContext(Dispatchers.Default) { delay(1_000) - 1 // for very expensive values of 1 + 1 } -``` - -In situations where the code inside the `withContext` is very simple, it is not as important to provide a test -dispatcher. The function `veryExpensiveTwo` will behave identically in a `TestCoroutineDispatcher` and -`Dispatchers.Default` after the thread switch for `Dispatchers.Default`. Because `withContext` always returns a value by -directly, there is no need to inject a `TestCoroutineDispatcher` into this function. -```kotlin -suspend fun veryExpensiveTwo() = withContext(Dispatchers.Default) { - 2 // for very expensive values of 2 +fun testExpensiveFunction() = runTest { + val result = veryExpensiveFunction() // will take a whole real-time second to execute + // the virtual time at this point is still 0 } ``` -Tests should provide a `TestCoroutineDispatcher` to code that calls `withContext` to provide time control for -delays, or when execution control is needed to test complex logic. - +Tests should, when possible, replace these dispatchers with a [TestDispatcher] if the `withContext` calls `delay` in the +function under test. For example, `veryExpensiveFunction` above should allow mocking with a [TestDispatcher] using +either dependency injection, a service locator, or a default parameter, if it is to be used with virtual time. ### Status of the API @@ -426,36 +362,32 @@ This API is experimental and it is may change before migrating out of experiment Changes during experimental may have deprecation applied when possible, but it is not advised to use the API in stable code before it leaves experimental due to possible breaking changes. -If you have any suggestions for improvements to this experimental API please share them them on the +If you have any suggestions for improvements to this experimental API please share them them on the [issue tracker](https://github.com/Kotlin/kotlinx.coroutines/issues). -[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html +[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html [yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[CoroutineStart]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html [ExperimentalCoroutinesApi]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-experimental-coroutines-api/index.html +[runTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html +[TestCoroutineScheduler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scheduler/index.html +[TestScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/index.html +[TestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-dispatcher/index.html +[Dispatchers.setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html +[StandardTestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-standard-test-dispatcher.html +[UnconfinedTestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-unconfined-test-dispatcher.html [setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html -[runBlockingTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-blocking-test.html -[UncompletedCoroutinesError]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-uncompleted-coroutines-error/index.html -[DelayController]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/index.html -[DelayController.advanceUntilIdle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/advance-until-idle.html -[DelayController.pauseDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/pause-dispatcher.html -[TestCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-dispatcher/index.html -[DelayController.resumeDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/resume-dispatcher.html -[TestCoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scope/index.html -[TestCoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-exception-handler/index.html -[TestCoroutineScope.cleanupTestCoroutines]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scope/cleanup-test-coroutines.html -[DelayController.cleanupTestCoroutines]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-delay-controller/cleanup-test-coroutines.html +[TestScope.testScheduler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/test-scheduler.html +[TestScope.runTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html +[runCurrent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-current.html diff --git a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api index 707ee43df2..d90a319825 100644 --- a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api +++ b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api @@ -13,41 +13,89 @@ public final class kotlinx/coroutines/test/TestBuildersKt { public static final fun runBlockingTest (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V public static final fun runBlockingTest (Lkotlinx/coroutines/test/TestCoroutineDispatcher;Lkotlin/jvm/functions/Function2;)V public static final fun runBlockingTest (Lkotlinx/coroutines/test/TestCoroutineScope;Lkotlin/jvm/functions/Function2;)V + public static final fun runBlockingTest (Lkotlinx/coroutines/test/TestScope;Lkotlin/jvm/functions/Function2;)V public static synthetic fun runBlockingTest$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public static final fun runBlockingTestOnTestScope (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V + public static synthetic fun runBlockingTestOnTestScope$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public static final fun runTest (Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V + public static final fun runTest (Lkotlinx/coroutines/test/TestCoroutineScope;JLkotlin/jvm/functions/Function2;)V + public static final fun runTest (Lkotlinx/coroutines/test/TestScope;JLkotlin/jvm/functions/Function2;)V + public static synthetic fun runTest$default (Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public static synthetic fun runTest$default (Lkotlinx/coroutines/test/TestCoroutineScope;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public static synthetic fun runTest$default (Lkotlinx/coroutines/test/TestScope;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public static final fun runTestWithLegacyScope (Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V + public static synthetic fun runTestWithLegacyScope$default (Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V } -public final class kotlinx/coroutines/test/TestCoroutineDispatcher : kotlinx/coroutines/CoroutineDispatcher, kotlinx/coroutines/Delay, kotlinx/coroutines/test/DelayController { +public final class kotlinx/coroutines/test/TestCoroutineDispatcher : kotlinx/coroutines/test/TestDispatcher, kotlinx/coroutines/Delay, kotlinx/coroutines/test/SchedulerAsDelayController { public fun ()V + public fun (Lkotlinx/coroutines/test/TestCoroutineScheduler;)V + public synthetic fun (Lkotlinx/coroutines/test/TestCoroutineScheduler;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun advanceTimeBy (J)J public fun advanceUntilIdle ()J public fun cleanupTestCoroutines ()V - public fun delay (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun dispatch (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V public fun dispatchYield (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V public fun getCurrentTime ()J - public fun invokeOnTimeout (JLjava/lang/Runnable;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/DisposableHandle; + public fun getScheduler ()Lkotlinx/coroutines/test/TestCoroutineScheduler; public fun pauseDispatcher ()V public fun pauseDispatcher (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun resumeDispatcher ()V public fun runCurrent ()V - public fun scheduleResumeAfterDelay (JLkotlinx/coroutines/CancellableContinuation;)V public fun toString ()Ljava/lang/String; } +public final class kotlinx/coroutines/test/TestCoroutineDispatchersKt { + public static final fun StandardTestDispatcher (Lkotlinx/coroutines/test/TestCoroutineScheduler;Ljava/lang/String;)Lkotlinx/coroutines/test/TestDispatcher; + public static synthetic fun StandardTestDispatcher$default (Lkotlinx/coroutines/test/TestCoroutineScheduler;Ljava/lang/String;ILjava/lang/Object;)Lkotlinx/coroutines/test/TestDispatcher; + public static final fun UnconfinedTestDispatcher (Lkotlinx/coroutines/test/TestCoroutineScheduler;Ljava/lang/String;)Lkotlinx/coroutines/test/TestDispatcher; + public static synthetic fun UnconfinedTestDispatcher$default (Lkotlinx/coroutines/test/TestCoroutineScheduler;Ljava/lang/String;ILjava/lang/Object;)Lkotlinx/coroutines/test/TestDispatcher; +} + public final class kotlinx/coroutines/test/TestCoroutineExceptionHandler : kotlin/coroutines/AbstractCoroutineContextElement, kotlinx/coroutines/CoroutineExceptionHandler, kotlinx/coroutines/test/UncaughtExceptionCaptor { public fun ()V - public fun cleanupTestCoroutinesCaptor ()V + public fun cleanupTestCoroutines ()V public fun getUncaughtExceptions ()Ljava/util/List; public fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V } -public abstract interface class kotlinx/coroutines/test/TestCoroutineScope : kotlinx/coroutines/CoroutineScope, kotlinx/coroutines/test/DelayController, kotlinx/coroutines/test/UncaughtExceptionCaptor { +public final class kotlinx/coroutines/test/TestCoroutineScheduler : kotlin/coroutines/AbstractCoroutineContextElement, kotlin/coroutines/CoroutineContext$Element { + public static final field Key Lkotlinx/coroutines/test/TestCoroutineScheduler$Key; + public fun ()V + public final fun advanceTimeBy (J)V + public final fun advanceUntilIdle ()V + public final fun getCurrentTime ()J + public final fun runCurrent ()V +} + +public final class kotlinx/coroutines/test/TestCoroutineScheduler$Key : kotlin/coroutines/CoroutineContext$Key { +} + +public abstract interface class kotlinx/coroutines/test/TestCoroutineScope : kotlinx/coroutines/CoroutineScope { public abstract fun cleanupTestCoroutines ()V + public abstract fun getTestScheduler ()Lkotlinx/coroutines/test/TestCoroutineScheduler; } public final class kotlinx/coroutines/test/TestCoroutineScopeKt { public static final fun TestCoroutineScope (Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/test/TestCoroutineScope; public static synthetic fun TestCoroutineScope$default (Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/test/TestCoroutineScope; + public static final fun advanceTimeBy (Lkotlinx/coroutines/test/TestCoroutineScope;J)V + public static final fun advanceUntilIdle (Lkotlinx/coroutines/test/TestCoroutineScope;)V + public static final fun createTestCoroutineScope (Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/test/TestCoroutineScope; + public static synthetic fun createTestCoroutineScope$default (Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/test/TestCoroutineScope; + public static final fun getCurrentTime (Lkotlinx/coroutines/test/TestCoroutineScope;)J + public static final fun getUncaughtExceptions (Lkotlinx/coroutines/test/TestCoroutineScope;)Ljava/util/List; + public static final fun pauseDispatcher (Lkotlinx/coroutines/test/TestCoroutineScope;)V + public static final fun pauseDispatcher (Lkotlinx/coroutines/test/TestCoroutineScope;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun resumeDispatcher (Lkotlinx/coroutines/test/TestCoroutineScope;)V + public static final fun runCurrent (Lkotlinx/coroutines/test/TestCoroutineScope;)V +} + +public abstract class kotlinx/coroutines/test/TestDispatcher : kotlinx/coroutines/CoroutineDispatcher, kotlinx/coroutines/Delay { + public fun delay (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun getScheduler ()Lkotlinx/coroutines/test/TestCoroutineScheduler; + public fun invokeOnTimeout (JLjava/lang/Runnable;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/DisposableHandle; + public fun scheduleResumeAfterDelay (JLkotlinx/coroutines/CancellableContinuation;)V } public final class kotlinx/coroutines/test/TestDispatchers { @@ -55,12 +103,21 @@ public final class kotlinx/coroutines/test/TestDispatchers { public static final fun setMain (Lkotlinx/coroutines/Dispatchers;Lkotlinx/coroutines/CoroutineDispatcher;)V } -public abstract interface class kotlinx/coroutines/test/UncaughtExceptionCaptor { - public abstract fun cleanupTestCoroutinesCaptor ()V - public abstract fun getUncaughtExceptions ()Ljava/util/List; +public abstract interface class kotlinx/coroutines/test/TestScope : kotlinx/coroutines/CoroutineScope { + public abstract fun getTestScheduler ()Lkotlinx/coroutines/test/TestCoroutineScheduler; } -public final class kotlinx/coroutines/test/UncompletedCoroutinesError : java/lang/AssertionError { - public fun (Ljava/lang/String;)V +public final class kotlinx/coroutines/test/TestScopeKt { + public static final fun TestScope (Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/test/TestScope; + public static synthetic fun TestScope$default (Lkotlin/coroutines/CoroutineContext;ILjava/lang/Object;)Lkotlinx/coroutines/test/TestScope; + public static final fun advanceTimeBy (Lkotlinx/coroutines/test/TestScope;J)V + public static final fun advanceUntilIdle (Lkotlinx/coroutines/test/TestScope;)V + public static final fun getCurrentTime (Lkotlinx/coroutines/test/TestScope;)J + public static final fun runCurrent (Lkotlinx/coroutines/test/TestScope;)V +} + +public abstract interface class kotlinx/coroutines/test/UncaughtExceptionCaptor { + public abstract fun cleanupTestCoroutines ()V + public abstract fun getUncaughtExceptions ()Ljava/util/List; } diff --git a/kotlinx-coroutines-test/common/src/TestBuilders.kt b/kotlinx-coroutines-test/common/src/TestBuilders.kt index dde9ac7b12..e6d0c3970d 100644 --- a/kotlinx-coroutines-test/common/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/common/src/TestBuilders.kt @@ -1,22 +1,45 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +@file:JvmName("TestBuildersKt") +@file:JvmMultifileClass package kotlinx.coroutines.test import kotlinx.coroutines.* +import kotlinx.coroutines.selects.* import kotlin.coroutines.* +import kotlin.jvm.* /** - * Executes a [testBody] inside an immediate execution dispatcher. + * A test result. * - * This is similar to [runBlocking] but it will immediately progress past delays and into [launch] and [async] blocks. - * You can use this to write tests that execute in the presence of calls to [delay] without causing your test to take - * extra time. + * * On JVM and Native, this resolves to [Unit], representing the fact that tests are run in a blocking manner on these + * platforms: a call to a function returning a [TestResult] will simply execute the test inside it. + * * On JS, this is a `Promise`, which reflects the fact that the test-running function does not wait for a test to + * finish. The JS test frameworks typically support returning `Promise` from a test and will correctly handle it. + * + * Because of the behavior on JS, extra care must be taken when writing multiplatform tests to avoid losing test errors: + * * Don't do anything after running the functions returning a [TestResult]. On JS, this code will execute *before* the + * test finishes. + * * As a corollary, don't run functions returning a [TestResult] more than once per test. The only valid thing to do + * with a [TestResult] is to immediately `return` it from a test. + * * Don't nest functions returning a [TestResult]. + */ +@Suppress("NO_ACTUAL_FOR_EXPECT") +@ExperimentalCoroutinesApi +public expect class TestResult + +/** + * Executes [testBody] as a test in a new coroutine, returning [TestResult]. + * + * On JVM and Native, this function behaves similarly to `runBlocking`, with the difference that the code that it runs + * will skip delays. This allows to use [delay] in without causing the tests to take more time than necessary. + * On JS, this function creates a `Promise` that executes the test body with the delay-skipping behavior. * * ``` * @Test - * fun exampleTest() = runBlockingTest { + * fun exampleTest() = runTest { * val deferred = async { * delay(1_000) * async { @@ -26,70 +49,204 @@ import kotlin.coroutines.* * * deferred.await() // result available immediately * } + * ``` + * + * The platform difference entails that, in order to use this function correctly in common code, one must always + * immediately return the produced [TestResult] from the test method, without doing anything else afterwards. See + * [TestResult] for details on this. + * + * The test is run in a single thread, unless other [CoroutineDispatcher] are used for child coroutines. + * Because of this, child coroutines are not executed in parallel to the test body. + * In order to for the spawned-off asynchronous code to actually be executed, one must either [yield] or suspend the + * test body some other way, or use commands that control scheduling (see [TestCoroutineScheduler]). + * + * ``` + * @Test + * fun exampleWaitingForAsyncTasks1() = runTest { + * // 1 + * val job = launch { + * // 3 + * } + * // 2 + * job.join() // the main test coroutine suspends here, so the child is executed + * // 4 + * } + * + * @Test + * fun exampleWaitingForAsyncTasks2() = runTest { + * // 1 + * launch { + * // 3 + * } + * // 2 + * advanceUntilIdle() // runs the tasks until their queue is empty + * // 4 + * } + * ``` * + * ### Task scheduling + * + * Delay-skipping is achieved by using virtual time. + * If [Dispatchers.Main] is set to a [TestDispatcher] via [Dispatchers.setMain] before the test, + * then its [TestCoroutineScheduler] is used; + * otherwise, a new one is automatically created (or taken from [context] in some way) and can be used to control + * the virtual time, advancing it, running the tasks scheduled at a specific time etc. + * Some convenience methods are available on [TestScope] to control the scheduler. + * + * Delays in code that runs inside dispatchers that don't use a [TestCoroutineScheduler] don't get skipped: + * ``` + * @Test + * fun exampleTest() = runTest { + * val elapsed = TimeSource.Monotonic.measureTime { + * val deferred = async { + * delay(1_000) // will be skipped + * withContext(Dispatchers.Default) { + * delay(5_000) // Dispatchers.Default doesn't know about TestCoroutineScheduler + * } + * } + * deferred.await() + * } + * println(elapsed) // about five seconds + * } * ``` * - * This method requires that all coroutines launched inside [testBody] complete, or are cancelled, as part of the test - * conditions. + * ### Failures * - * Unhandled exceptions thrown by coroutines in the test will be re-thrown at the end of the test. + * #### Test body failures * - * @throws UncompletedCoroutinesError If the [testBody] does not complete (or cancel) all coroutines that it launches - * (including coroutines suspended on join/await). + * If the created coroutine completes with an exception, then this exception will be thrown at the end of the test. * - * @param context additional context elements. If [context] contains [CoroutineDispatcher] or [CoroutineExceptionHandler], - * then they must implement [DelayController] and [TestCoroutineExceptionHandler] respectively. - * @param testBody The code of the unit-test. + * #### Reported exceptions + * + * Unhandled exceptions will be thrown at the end of the test. + * If the uncaught exceptions happen after the test finishes, the error is propagated in a platform-specific manner. + * If the test coroutine completes with an exception, the unhandled exceptions are suppressed by it. + * + * #### Uncompleted coroutines + * + * This method requires that, after the test coroutine has completed, all the other coroutines launched inside + * [testBody] also complete, or are cancelled. + * Otherwise, the test will be failed (which, on JVM and Native, means that [runTest] itself will throw + * [AssertionError], whereas on JS, the `Promise` will fail with it). + * + * In the general case, if there are active jobs, it's impossible to detect if they are going to complete eventually due + * to the asynchronous nature of coroutines. In order to prevent tests hanging in this scenario, [runTest] will wait + * for [dispatchTimeoutMs] milliseconds (by default, 60 seconds) from the moment when [TestCoroutineScheduler] becomes + * idle before throwing [AssertionError]. If some dispatcher linked to [TestCoroutineScheduler] receives a + * task during that time, the timer gets reset. + * + * ### Configuration + * + * [context] can be used to affect the environment of the code under test. Beside just being passed to the coroutine + * scope created for the test, [context] also can be used to change how the test is executed. + * See the [TestScope] constructor function documentation for details. + * + * @throws IllegalArgumentException if the [context] is invalid. See the [TestScope] constructor docs for details. */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public fun runBlockingTest(context: CoroutineContext = EmptyCoroutineContext, testBody: suspend TestCoroutineScope.() -> Unit) { - val (safeContext, dispatcher) = context.checkArguments() - val startingJobs = safeContext.activeJobs() - val scope = TestCoroutineScope(safeContext) - val deferred = scope.async { - scope.testBody() - } - dispatcher.advanceUntilIdle() - deferred.getCompletionExceptionOrNull()?.let { - throw it - } - scope.cleanupTestCoroutines() - val endingJobs = safeContext.activeJobs() - if ((endingJobs - startingJobs).isNotEmpty()) { - throw UncompletedCoroutinesError("Test finished with active jobs: $endingJobs") - } +@ExperimentalCoroutinesApi +public fun runTest( + context: CoroutineContext = EmptyCoroutineContext, + dispatchTimeoutMs: Long = DEFAULT_DISPATCH_TIMEOUT_MS, + testBody: suspend TestScope.() -> Unit +): TestResult { + if (context[RunningInRunTest] != null) + throw IllegalStateException("Calls to `runTest` can't be nested. Please read the docs on `TestResult` for details.") + return TestScope(context + RunningInRunTest).runTest(dispatchTimeoutMs, testBody) } -private fun CoroutineContext.activeJobs(): Set { - return checkNotNull(this[Job]).children.filter { it.isActive }.toSet() +/** + * Performs [runTest] on an existing [TestScope]. + */ +@ExperimentalCoroutinesApi +public fun TestScope.runTest( + dispatchTimeoutMs: Long = DEFAULT_DISPATCH_TIMEOUT_MS, + testBody: suspend TestScope.() -> Unit +): TestResult = asSpecificImplementation().let { + it.enter() + createTestResult { + runTestCoroutine(it, dispatchTimeoutMs, testBody) { it.leave() } + } } /** - * Convenience method for calling [runBlockingTest] on an existing [TestCoroutineScope]. + * Runs [testProcedure], creating a [TestResult]. */ -// todo: need documentation on how this extension is supposed to be used -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public fun TestCoroutineScope.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit): Unit = - runBlockingTest(coroutineContext, block) +@Suppress("NO_ACTUAL_FOR_EXPECT") // actually suppresses `TestResult` +internal expect fun createTestResult(testProcedure: suspend () -> Unit): TestResult + +/** A coroutine context element indicating that the coroutine is running inside `runTest`. */ +internal object RunningInRunTest : CoroutineContext.Key, CoroutineContext.Element { + override val key: CoroutineContext.Key<*> + get() = this + + override fun toString(): String = "RunningInRunTest" +} + +/** The default timeout to use when waiting for asynchronous completions of the coroutines managed by + * a [TestCoroutineScheduler]. */ +internal const val DEFAULT_DISPATCH_TIMEOUT_MS = 60_000L /** - * Convenience method for calling [runBlockingTest] on an existing [TestCoroutineDispatcher]. + * Run the [body][testBody] of the [test coroutine][coroutine], waiting for asynchronous completions for at most + * [dispatchTimeoutMs] milliseconds, and performing the [cleanup] procedure at the end. + * + * The [cleanup] procedure may either throw [UncompletedCoroutinesError] to denote that child coroutines were leaked, or + * return a list of uncaught exceptions that should be reported at the end of the test. */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public fun TestCoroutineDispatcher.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit): Unit = - runBlockingTest(this, block) - -private fun CoroutineContext.checkArguments(): Pair { - val dispatcher = when (val dispatcher = get(ContinuationInterceptor)) { - is DelayController -> dispatcher - null -> TestCoroutineDispatcher() - else -> throw IllegalArgumentException("Dispatcher must implement DelayController: $dispatcher") +internal suspend fun > runTestCoroutine( + coroutine: T, + dispatchTimeoutMs: Long, + testBody: suspend T.() -> Unit, + cleanup: () -> List, +) { + val scheduler = coroutine.coroutineContext[TestCoroutineScheduler]!! + /** TODO: moving this [AbstractCoroutine.start] call outside [createTestResult] fails on Native with + * [TestCoroutineDispatcher], because the event loop is not started. */ + coroutine.start(CoroutineStart.UNDISPATCHED, coroutine) { + testBody() + } + var completed = false + while (!completed) { + scheduler.advanceUntilIdle() + if (coroutine.isCompleted) { + /* don't even enter `withTimeout`; this allows to use a timeout of zero to check that there are no + non-trivial dispatches. */ + completed = true + continue + } + select { + coroutine.onJoin { + completed = true + } + scheduler.onDispatchEvent { + // we received knowledge that `scheduler` observed a dispatch event, so we reset the timeout + } + onTimeout(dispatchTimeoutMs) { + try { + cleanup() + } catch (e: UncompletedCoroutinesError) { + // we expect these and will instead throw a more informative exception just below. + emptyList() + }.throwAll() + throw UncompletedCoroutinesError("The test coroutine was not completed after waiting for $dispatchTimeoutMs ms") + } + } + } + coroutine.getCompletionExceptionOrNull()?.let { exception -> + val exceptions = try { + cleanup() + } catch (e: UncompletedCoroutinesError) { + // it's normal that some jobs are not completed if the test body has failed, won't clutter the output + emptyList() + } + (listOf(exception) + exceptions).throwAll() } - val exceptionHandler = when (val handler = get(CoroutineExceptionHandler)) { - is UncaughtExceptionCaptor -> handler - null -> TestCoroutineExceptionHandler() - else -> throw IllegalArgumentException("coroutineExceptionHandler must implement UncaughtExceptionCaptor: $handler") + cleanup().throwAll() +} + +internal fun List.throwAll() { + firstOrNull()?.apply { + drop(1).forEach { addSuppressed(it) } + throw this } - val job = get(Job) ?: SupervisorJob() - return Pair(this + dispatcher + exceptionHandler + job, dispatcher) } diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt b/kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt deleted file mode 100644 index 55b92cd6b7..0000000000 --- a/kotlinx-coroutines-test/common/src/TestCoroutineDispatcher.kt +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.atomicfu.* -import kotlinx.coroutines.* -import kotlinx.coroutines.internal.* -import kotlin.coroutines.* -import kotlin.jvm.* -import kotlin.math.* - -/** - * [CoroutineDispatcher] that performs both immediate and lazy execution of coroutines in tests - * and implements [DelayController] to control its virtual clock. - * - * By default, [TestCoroutineDispatcher] is immediate. That means any tasks scheduled to be run without delay are - * immediately executed. If they were scheduled with a delay, the virtual clock-time must be advanced via one of the - * methods on [DelayController]. - * - * When switched to lazy execution using [pauseDispatcher] any coroutines started via [launch] or [async] will - * not execute until a call to [DelayController.runCurrent] or the virtual clock-time has been advanced via one of the - * methods on [DelayController]. - * - * @see DelayController - */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public class TestCoroutineDispatcher: CoroutineDispatcher(), Delay, DelayController { - private var dispatchImmediately = true - set(value) { - field = value - if (value) { - // there may already be tasks from setup code we need to run - advanceUntilIdle() - } - } - - // The ordered queue for the runnable tasks. - private val queue = ThreadSafeHeap() - - // The per-scheduler global order counter. - private val _counter = atomic(0L) - - // Storing time in nanoseconds internally. - private val _time = atomic(0L) - - /** @suppress */ - override fun dispatch(context: CoroutineContext, block: Runnable) { - if (dispatchImmediately) { - block.run() - } else { - post(block) - } - } - - /** @suppress */ - @InternalCoroutinesApi - override fun dispatchYield(context: CoroutineContext, block: Runnable) { - post(block) - } - - /** @suppress */ - override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - postDelayed(CancellableContinuationRunnable(continuation) { resumeUndispatched(Unit) }, timeMillis) - } - - /** @suppress */ - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - val node = postDelayed(block, timeMillis) - return DisposableHandle { queue.remove(node) } - } - - /** @suppress */ - override fun toString(): String { - return "TestCoroutineDispatcher[currentTime=${currentTime}ms, queued=${queue.size}]" - } - - private fun post(block: Runnable) = - queue.addLast(TimedRunnable(block, _counter.getAndIncrement())) - - private fun postDelayed(block: Runnable, delayTime: Long) = - TimedRunnable(block, _counter.getAndIncrement(), safePlus(currentTime, delayTime)) - .also { - queue.addLast(it) - } - - private fun safePlus(currentTime: Long, delayTime: Long): Long { - check(delayTime >= 0) - val result = currentTime + delayTime - if (result < currentTime) return Long.MAX_VALUE // clam on overflow - return result - } - - private fun doActionsUntil(targetTime: Long) { - while (true) { - val current = queue.removeFirstIf { it.time <= targetTime } ?: break - // If the scheduled time is 0 (immediate) use current virtual time - if (current.time != 0L) _time.value = current.time - current.run() - } - } - - /** @suppress */ - override val currentTime: Long get() = _time.value - - /** @suppress */ - override fun advanceTimeBy(delayTimeMillis: Long): Long { - val oldTime = currentTime - advanceUntilTime(oldTime + delayTimeMillis) - return currentTime - oldTime - } - - /** - * Moves the CoroutineContext's clock-time to a particular moment in time. - * - * @param targetTime The point in time to which to move the CoroutineContext's clock (milliseconds). - */ - private fun advanceUntilTime(targetTime: Long) { - doActionsUntil(targetTime) - _time.update { currentValue -> max(currentValue, targetTime) } - } - - /** @suppress */ - override fun advanceUntilIdle(): Long { - val oldTime = currentTime - while(!queue.isEmpty) { - runCurrent() - val next = queue.peek() ?: break - advanceUntilTime(next.time) - } - return currentTime - oldTime - } - - /** @suppress */ - override fun runCurrent(): Unit = doActionsUntil(currentTime) - - /** @suppress */ - override suspend fun pauseDispatcher(block: suspend () -> Unit) { - val previous = dispatchImmediately - dispatchImmediately = false - try { - block() - } finally { - dispatchImmediately = previous - } - } - - /** @suppress */ - override fun pauseDispatcher() { - dispatchImmediately = false - } - - /** @suppress */ - override fun resumeDispatcher() { - dispatchImmediately = true - } - - /** @suppress */ - override fun cleanupTestCoroutines() { - // process any pending cancellations or completions, but don't advance time - doActionsUntil(currentTime) - - // run through all pending tasks, ignore any submitted coroutines that are not active - val pendingTasks = mutableListOf() - while (true) { - pendingTasks += queue.removeFirstOrNull() ?: break - } - val activeDelays = pendingTasks - .mapNotNull { it.runnable as? CancellableContinuationRunnable<*> } - .filter { it.continuation.isActive } - - val activeTimeouts = pendingTasks.filter { it.runnable !is CancellableContinuationRunnable<*> } - if (activeDelays.isNotEmpty() || activeTimeouts.isNotEmpty()) { - throw UncompletedCoroutinesError( - "Unfinished coroutines during teardown. Ensure all coroutines are" + - " completed or cancelled by your test." - ) - } - } -} - -/** - * This class exists to allow cleanup code to avoid throwing for cancelled continuations scheduled - * in the future. - */ -private class CancellableContinuationRunnable( - @JvmField val continuation: CancellableContinuation, - private val block: CancellableContinuation.() -> Unit -) : Runnable { - override fun run() = continuation.block() -} - -/** - * A Runnable for our event loop that represents a task to perform at a time. - */ -private class TimedRunnable( - @JvmField val runnable: Runnable, - private val count: Long = 0, - @JvmField val time: Long = 0 -) : Comparable, Runnable by runnable, ThreadSafeHeapNode { - override var heap: ThreadSafeHeap<*>? = null - override var index: Int = 0 - - override fun compareTo(other: TimedRunnable) = if (time == other.time) { - count.compareTo(other.count) - } else { - time.compareTo(other.time) - } - - override fun toString() = "TimedRunnable(time=$time, run=$runnable)" -} diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt b/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt new file mode 100644 index 0000000000..4cc48f47d0 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt @@ -0,0 +1,159 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.test.internal.TestMainDispatcher +import kotlin.coroutines.* + +/** + * Creates an instance of an unconfined [TestDispatcher]. + * + * This dispatcher is similar to [Dispatchers.Unconfined]: the tasks that it executes are not confined to any particular + * thread and form an event loop; it's different in that it skips delays, as all [TestDispatcher]s do. + * + * Like [Dispatchers.Unconfined], this one does not provide guarantees about the execution order when several coroutines + * are queued in this dispatcher. However, we ensure that the [launch] and [async] blocks at the top level of [runTest] + * are entered eagerly. This allows launching child coroutines and not calling [runCurrent] for them to start executing. + * + * ``` + * @Test + * fun testEagerlyEnteringChildCoroutines() = runTest(UnconfinedTestDispatcher()) { + * var entered = false + * val deferred = CompletableDeferred() + * var completed = false + * launch { + * entered = true + * deferred.await() + * completed = true + * } + * assertTrue(entered) // `entered = true` already executed. + * assertFalse(completed) // however, the child coroutine then suspended, so it is enqueued. + * deferred.complete(Unit) // resume the coroutine. + * assertTrue(completed) // now the child coroutine is immediately completed. + * } + * ``` + * + * Using this [TestDispatcher] can greatly simplify writing tests where it's not important which thread is used when and + * in which order the queued coroutines are executed. + * Another typical use case for this dispatcher is launching child coroutines that are resumed immediately, without + * going through a dispatch; this can be helpful for testing [Channel] and [StateFlow] usages. + * + * ``` + * @Test + * fun testUnconfinedDispatcher() = runTest { + * val values = mutableListOf() + * val stateFlow = MutableStateFlow(0) + * val job = launch(UnconfinedTestDispatcher(testScheduler)) { + * stateFlow.collect { + * values.add(it) + * } + * } + * stateFlow.value = 1 + * stateFlow.value = 2 + * stateFlow.value = 3 + * job.cancel() + * // each assignment will immediately resume the collecting child coroutine, + * // so no values will be skipped. + * assertEquals(listOf(0, 1, 2, 3), values) + * } + * ``` + * + * Please be aware that, like [Dispatchers.Unconfined], this is a specific dispatcher with execution order + * guarantees that are unusual and not shared by most other dispatchers, so it can only be used reliably for testing + * functionality, not the specific order of actions. + * See [Dispatchers.Unconfined] for a discussion of the execution order guarantees. + * + * In order to support delay skipping, this dispatcher is linked to a [TestCoroutineScheduler], which is used to control + * the virtual time and can be shared among many test dispatchers. + * If no [scheduler] is passed as an argument, [Dispatchers.Main] is checked, and if it was mocked with a + * [TestDispatcher] via [Dispatchers.setMain], the [TestDispatcher.scheduler] of the mock dispatcher is used; if + * [Dispatchers.Main] is not mocked with a [TestDispatcher], a new [TestCoroutineScheduler] is created. + * + * Additionally, [name] can be set to distinguish each dispatcher instance when debugging. + * + * @see StandardTestDispatcher for a more predictable [TestDispatcher]. + */ +@ExperimentalCoroutinesApi +@Suppress("FunctionName") +public fun UnconfinedTestDispatcher( + scheduler: TestCoroutineScheduler? = null, + name: String? = null +): TestDispatcher = UnconfinedTestDispatcherImpl( + scheduler ?: TestMainDispatcher.currentTestScheduler ?: TestCoroutineScheduler(), name) + +private class UnconfinedTestDispatcherImpl( + override val scheduler: TestCoroutineScheduler, + private val name: String? = null +) : TestDispatcher() { + + override fun isDispatchNeeded(context: CoroutineContext): Boolean = false + + @Suppress("INVISIBLE_MEMBER") + override fun dispatch(context: CoroutineContext, block: Runnable) { + checkSchedulerInContext(scheduler, context) + scheduler.sendDispatchEvent() + + /** copy-pasted from [kotlinx.coroutines.Unconfined.dispatch] */ + /** It can only be called by the [yield] function. See also code of [yield] function. */ + val yieldContext = context[YieldContext] + if (yieldContext !== null) { + // report to "yield" that it is an unconfined dispatcher and don't call "block.run()" + yieldContext.dispatcherWasUnconfined = true + return + } + throw UnsupportedOperationException( + "Function UnconfinedTestCoroutineDispatcher.dispatch can only be used by " + + "the yield function. If you wrap Unconfined dispatcher in your code, make sure you properly delegate " + + "isDispatchNeeded and dispatch calls." + ) + } + + override fun toString(): String = "${name ?: "UnconfinedTestDispatcher"}[scheduler=$scheduler]" +} + +/** + * Creates an instance of a [TestDispatcher] whose tasks are run inside calls to the [scheduler]. + * + * This [TestDispatcher] instance does not itself execute any of the tasks. Instead, it always sends them to its + * [scheduler], which can then be accessed via [TestCoroutineScheduler.runCurrent], + * [TestCoroutineScheduler.advanceUntilIdle], or [TestCoroutineScheduler.advanceTimeBy], which will then execute these + * tasks in a blocking manner. + * + * In practice, this means that [launch] or [async] blocks will not be entered immediately (unless they are + * parameterized with [CoroutineStart.UNDISPATCHED]), and one should either call [TestCoroutineScheduler.runCurrent] to + * run these pending tasks, which will block until there are no more tasks scheduled at this point in time, or, when + * inside [runTest], call [yield] to yield the (only) thread used by [runTest] to the newly-launched coroutines. + * + * If no [scheduler] is passed as an argument, [Dispatchers.Main] is checked, and if it was mocked with a + * [TestDispatcher] via [Dispatchers.setMain], the [TestDispatcher.scheduler] of the mock dispatcher is used; if + * [Dispatchers.Main] is not mocked with a [TestDispatcher], a new [TestCoroutineScheduler] is created. + * + * One can additionally pass a [name] in order to more easily distinguish this dispatcher during debugging. + * + * @see UnconfinedTestDispatcher for a dispatcher that is not confined to any particular thread. + */ +@ExperimentalCoroutinesApi +@Suppress("FunctionName") +public fun StandardTestDispatcher( + scheduler: TestCoroutineScheduler? = null, + name: String? = null +): TestDispatcher = StandardTestDispatcherImpl( + scheduler ?: TestMainDispatcher.currentTestScheduler ?: TestCoroutineScheduler(), name) + +private class StandardTestDispatcherImpl( + override val scheduler: TestCoroutineScheduler = TestCoroutineScheduler(), + private val name: String? = null +) : TestDispatcher() { + + override fun dispatch(context: CoroutineContext, block: Runnable) { + checkSchedulerInContext(scheduler, context) + scheduler.registerEvent(this, 0, block) { false } + } + + override fun toString(): String = "${name ?: "StandardTestDispatcher"}[scheduler=$scheduler]" +} diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt b/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt new file mode 100644 index 0000000000..d256f27fb0 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt @@ -0,0 +1,231 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.atomicfu.* +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.channels.Channel.Factory.CONFLATED +import kotlinx.coroutines.internal.* +import kotlinx.coroutines.selects.* +import kotlin.coroutines.* +import kotlin.jvm.* + +/** + * This is a scheduler for coroutines used in tests, providing the delay-skipping behavior. + * + * [Test dispatchers][TestDispatcher] are parameterized with a scheduler. Several dispatchers can share the + * same scheduler, in which case their knowledge about the virtual time will be synchronized. When the dispatchers + * require scheduling an event at a later point in time, they notify the scheduler, which will establish the order of + * the tasks. + * + * The scheduler can be queried to advance the time (via [advanceTimeBy]), run all the scheduled tasks advancing the + * virtual time as needed (via [advanceUntilIdle]), or run the tasks that are scheduled to run as soon as possible but + * haven't yet been dispatched (via [runCurrent]). + */ +@ExperimentalCoroutinesApi +// TODO: maybe make this a `TimeSource`? +public class TestCoroutineScheduler : AbstractCoroutineContextElement(TestCoroutineScheduler), + CoroutineContext.Element { + + /** @suppress */ + public companion object Key : CoroutineContext.Key + + /** This heap stores the knowledge about which dispatchers are interested in which moments of virtual time. */ + // TODO: all the synchronization is done via a separate lock, so a non-thread-safe priority queue can be used. + private val events = ThreadSafeHeap>() + + /** Establishes that [currentTime] can't exceed the time of the earliest event in [events]. */ + private val lock = SynchronizedObject() + + /** This counter establishes some order on the events that happen at the same virtual time. */ + private val count = atomic(0L) + + /** The current virtual time. */ + @ExperimentalCoroutinesApi + public var currentTime: Long = 0 + get() = synchronized(lock) { field } + private set + + /** A channel for notifying about the fact that a dispatch recently happened. */ + private val dispatchEvents: Channel = Channel(CONFLATED) + + /** + * Registers a request for the scheduler to notify [dispatcher] at a virtual moment [timeDeltaMillis] milliseconds + * later via [TestDispatcher.processEvent], which will be called with the provided [marker] object. + * + * Returns the handler which can be used to cancel the registration. + */ + internal fun registerEvent( + dispatcher: TestDispatcher, + timeDeltaMillis: Long, + marker: T, + isCancelled: (T) -> Boolean + ): DisposableHandle { + require(timeDeltaMillis >= 0) { "Attempted scheduling an event earlier in time (with the time delta $timeDeltaMillis)" } + val count = count.getAndIncrement() + return synchronized(lock) { + val time = addClamping(currentTime, timeDeltaMillis) + val event = TestDispatchEvent(dispatcher, count, time, marker as Any) { isCancelled(marker) } + events.addLast(event) + /** can't be moved above: otherwise, [onDispatchEvent] could consume the token sent here before there's + * actually anything in the event queue. */ + sendDispatchEvent() + DisposableHandle { + synchronized(lock) { + events.remove(event) + } + } + } + } + + /** + * Runs the next enqueued task, advancing the virtual time to the time of its scheduled awakening. + */ + private fun tryRunNextTask(): Boolean { + val event = synchronized(lock) { + val event = events.removeFirstOrNull() ?: return false + if (currentTime > event.time) + currentTimeAheadOfEvents() + currentTime = event.time + event + } + event.dispatcher.processEvent(event.time, event.marker) + return true + } + + /** + * Runs the enqueued tasks in the specified order, advancing the virtual time as needed until there are no more + * tasks associated with the dispatchers linked to this scheduler. + * + * A breaking change from [TestCoroutineDispatcher.advanceTimeBy] is that it no longer returns the total number of + * milliseconds by which the execution of this method has advanced the virtual time. If you want to recreate that + * functionality, query [currentTime] before and after the execution to achieve the same result. + */ + @ExperimentalCoroutinesApi + public fun advanceUntilIdle() { + while (!synchronized(lock) { events.isEmpty }) { + tryRunNextTask() + } + } + + /** + * Runs the tasks that are scheduled to execute at this moment of virtual time. + */ + @ExperimentalCoroutinesApi + public fun runCurrent() { + val timeMark = synchronized(lock) { currentTime } + while (true) { + val event = synchronized(lock) { + events.removeFirstIf { it.time <= timeMark } ?: return + } + event.dispatcher.processEvent(event.time, event.marker) + } + } + + /** + * Moves the virtual clock of this dispatcher forward by [the specified amount][delayTimeMillis], running the + * scheduled tasks in the meantime. + * + * Breaking changes from [TestCoroutineDispatcher.advanceTimeBy]: + * * Intentionally doesn't return a `Long` value, as its use cases are unclear. We may restore it in the future; + * please describe your use cases at [the issue tracker](https://github.com/Kotlin/kotlinx.coroutines/issues/). + * For now, it's possible to query [currentTime] before and after execution of this method, to the same effect. + * * It doesn't run the tasks that are scheduled at exactly [currentTime] + [delayTimeMillis]. For example, + * advancing the time by one millisecond used to run the tasks at the current millisecond *and* the next + * millisecond, but now will stop just before executing any task starting at the next millisecond. + * * Overflowing the target time used to lead to nothing being done, but will now run the tasks scheduled at up to + * (but not including) [Long.MAX_VALUE]. + * + * @throws IllegalStateException if passed a negative [delay][delayTimeMillis]. + */ + @ExperimentalCoroutinesApi + public fun advanceTimeBy(delayTimeMillis: Long) { + require(delayTimeMillis >= 0) { "Can not advance time by a negative delay: $delayTimeMillis" } + val startingTime = currentTime + val targetTime = addClamping(startingTime, delayTimeMillis) + while (true) { + val event = synchronized(lock) { + val timeMark = currentTime + val event = events.removeFirstIf { targetTime > it.time } + when { + event == null -> { + currentTime = targetTime + return + } + timeMark > event.time -> currentTimeAheadOfEvents() + else -> { + currentTime = event.time + event + } + } + } + event.dispatcher.processEvent(event.time, event.marker) + } + } + + /** + * Checks that the only tasks remaining in the scheduler are cancelled. + */ + internal fun isIdle(strict: Boolean = true): Boolean { + synchronized(lock) { + if (strict) + return events.isEmpty + // TODO: also completely empties the queue, as there's no nondestructive way to iterate over [ThreadSafeHeap] + val presentEvents = mutableListOf>() + while (true) { + presentEvents += events.removeFirstOrNull() ?: break + } + return presentEvents.all { it.isCancelled() } + } + } + + /** + * Notifies this scheduler about a dispatch event. + */ + internal fun sendDispatchEvent() { + dispatchEvents.trySend(Unit) + } + + /** + * Consumes the knowledge that a dispatch event happened recently. + */ + internal val onDispatchEvent: SelectClause1 get() = dispatchEvents.onReceive +} + +// Some error-throwing functions for pretty stack traces +private fun currentTimeAheadOfEvents(): Nothing = invalidSchedulerState() + +private fun invalidSchedulerState(): Nothing = + throw IllegalStateException("The test scheduler entered an invalid state. Please report this at https://github.com/Kotlin/kotlinx.coroutines/issues.") + +/** [ThreadSafeHeap] node representing a scheduled task, ordered by the planned execution time. */ +private class TestDispatchEvent( + @JvmField val dispatcher: TestDispatcher, + private val count: Long, + @JvmField val time: Long, + @JvmField val marker: T, + @JvmField val isCancelled: () -> Boolean +) : Comparable>, ThreadSafeHeapNode { + override var heap: ThreadSafeHeap<*>? = null + override var index: Int = 0 + + override fun compareTo(other: TestDispatchEvent<*>) = + compareValuesBy(this, other, TestDispatchEvent<*>::time, TestDispatchEvent<*>::count) + + override fun toString() = "TestDispatchEvent(time=$time, dispatcher=$dispatcher)" +} + +// works with positive `a`, `b` +private fun addClamping(a: Long, b: Long): Long = (a + b).let { if (it >= 0) it else Long.MAX_VALUE } + +internal fun checkSchedulerInContext(scheduler: TestCoroutineScheduler, context: CoroutineContext) { + context[TestCoroutineScheduler]?.let { + check(it === scheduler) { + "Detected use of different schedulers. If you need to use several test coroutine dispatchers, " + + "create one `TestCoroutineScheduler` and pass it to each of them." + } + } +} diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineScope.kt b/kotlinx-coroutines-test/common/src/TestCoroutineScope.kt deleted file mode 100644 index da29cd22b4..0000000000 --- a/kotlinx-coroutines-test/common/src/TestCoroutineScope.kt +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlin.coroutines.* - -/** - * A scope which provides detailed control over the execution of coroutines for tests. - */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public interface TestCoroutineScope: CoroutineScope, UncaughtExceptionCaptor, DelayController { - /** - * Call after the test completes. - * Calls [UncaughtExceptionCaptor.cleanupTestCoroutinesCaptor] and [DelayController.cleanupTestCoroutines]. - * - * @throws Throwable the first uncaught exception, if there are any uncaught exceptions. - * @throws UncompletedCoroutinesError if any pending tasks are active, however it will not throw for suspended - * coroutines. - */ - public override fun cleanupTestCoroutines() -} - -private class TestCoroutineScopeImpl ( - override val coroutineContext: CoroutineContext -): - TestCoroutineScope, - UncaughtExceptionCaptor by coroutineContext.uncaughtExceptionCaptor, - DelayController by coroutineContext.delayController -{ - override fun cleanupTestCoroutines() { - coroutineContext.uncaughtExceptionCaptor.cleanupTestCoroutinesCaptor() - coroutineContext.delayController.cleanupTestCoroutines() - } -} - -/** - * A scope which provides detailed control over the execution of coroutines for tests. - * - * If the provided context does not provide a [ContinuationInterceptor] (Dispatcher) or [CoroutineExceptionHandler], the - * scope adds [TestCoroutineDispatcher] and [TestCoroutineExceptionHandler] automatically. - * - * @param context an optional context that MAY provide [UncaughtExceptionCaptor] and/or [DelayController] - */ -@Suppress("FunctionName") -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public fun TestCoroutineScope(context: CoroutineContext = EmptyCoroutineContext): TestCoroutineScope { - var safeContext = context - if (context[ContinuationInterceptor] == null) safeContext += TestCoroutineDispatcher() - if (context[CoroutineExceptionHandler] == null) safeContext += TestCoroutineExceptionHandler() - return TestCoroutineScopeImpl(safeContext) -} - -private inline val CoroutineContext.uncaughtExceptionCaptor: UncaughtExceptionCaptor - get() { - val handler = this[CoroutineExceptionHandler] - return handler as? UncaughtExceptionCaptor ?: throw IllegalArgumentException( - "TestCoroutineScope requires a UncaughtExceptionCaptor such as " + - "TestCoroutineExceptionHandler as the CoroutineExceptionHandler" - ) - } - -private inline val CoroutineContext.delayController: DelayController - get() { - val handler = this[ContinuationInterceptor] - return handler as? DelayController ?: throw IllegalArgumentException( - "TestCoroutineScope requires a DelayController such as TestCoroutineDispatcher as " + - "the ContinuationInterceptor (Dispatcher)" - ) - } diff --git a/kotlinx-coroutines-test/common/src/TestDispatcher.kt b/kotlinx-coroutines-test/common/src/TestDispatcher.kt new file mode 100644 index 0000000000..3b756b19e9 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/TestDispatcher.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.coroutines.* +import kotlin.jvm.* + +/** + * A test dispatcher that can interface with a [TestCoroutineScheduler]. + */ +@ExperimentalCoroutinesApi +public abstract class TestDispatcher internal constructor(): CoroutineDispatcher(), Delay { + /** The scheduler that this dispatcher is linked to. */ + @ExperimentalCoroutinesApi + public abstract val scheduler: TestCoroutineScheduler + + /** Notifies the dispatcher that it should process a single event marked with [marker] happening at time [time]. */ + internal fun processEvent(time: Long, marker: Any) { + check(marker is Runnable) + marker.run() + } + + /** @suppress */ + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { + checkSchedulerInContext(scheduler, continuation.context) + val timedRunnable = CancellableContinuationRunnable(continuation, this) + scheduler.registerEvent(this, timeMillis, timedRunnable, ::cancellableRunnableIsCancelled) + } + + /** @suppress */ + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { + checkSchedulerInContext(scheduler, context) + return scheduler.registerEvent(this, timeMillis, block) { false } + } +} + +/** + * This class exists to allow cleanup code to avoid throwing for cancelled continuations scheduled + * in the future. + */ +private class CancellableContinuationRunnable( + @JvmField val continuation: CancellableContinuation, + private val dispatcher: CoroutineDispatcher +) : Runnable { + override fun run() = with(dispatcher) { with(continuation) { resumeUndispatched(Unit) } } +} + +private fun cancellableRunnableIsCancelled(runnable: CancellableContinuationRunnable): Boolean = + !runnable.continuation.isActive diff --git a/kotlinx-coroutines-test/common/src/TestDispatchers.kt b/kotlinx-coroutines-test/common/src/TestDispatchers.kt index f8896d7278..4454597ed7 100644 --- a/kotlinx-coroutines-test/common/src/TestDispatchers.kt +++ b/kotlinx-coroutines-test/common/src/TestDispatchers.kt @@ -11,7 +11,10 @@ import kotlin.jvm.* /** * Sets the given [dispatcher] as an underlying dispatcher of [Dispatchers.Main]. - * All subsequent usages of [Dispatchers.Main] will use given [dispatcher] under the hood. + * All subsequent usages of [Dispatchers.Main] will use the given [dispatcher] under the hood. + * + * Using [TestDispatcher] as an argument has special behavior: subsequently-called [runTest], as well as + * [TestScope] and test dispatcher constructors, will use the [TestCoroutineScheduler] of the provided dispatcher. * * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. */ @@ -23,8 +26,9 @@ public fun Dispatchers.setMain(dispatcher: CoroutineDispatcher) { /** * Resets state of the [Dispatchers.Main] to the original main dispatcher. - * For example, in Android Main thread dispatcher will be set as [Dispatchers.Main]. - * Used to clean up all possible dependencies, should be used in tear down (`@After`) methods. + * + * For example, in Android, the Main thread dispatcher will be set as [Dispatchers.Main]. + * This method undoes a dependency injection performed for tests, and so should be used in tear down (`@After`) methods. * * It is unsafe to call this method if alive coroutines launched in [Dispatchers.Main] exist. */ diff --git a/kotlinx-coroutines-test/common/src/TestScope.kt b/kotlinx-coroutines-test/common/src/TestScope.kt new file mode 100644 index 0000000000..ffd5c01f7a --- /dev/null +++ b/kotlinx-coroutines-test/common/src/TestScope.kt @@ -0,0 +1,237 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.internal.* +import kotlin.coroutines.* + +/** + * A coroutine scope that for launching test coroutines. + * + * The scope provides the following functionality: + * * The [coroutineContext] includes a [coroutine dispatcher][TestDispatcher] that supports delay-skipping, using + * a [TestCoroutineScheduler] for orchestrating the virtual time. + * This scheduler is also available via the [testScheduler] property, and some helper extension + * methods are defined to more conveniently interact with it: see [TestScope.currentTime], [TestScope.runCurrent], + * [TestScope.advanceTimeBy], and [TestScope.advanceUntilIdle]. + * * When inside [runTest], uncaught exceptions from the child coroutines of this scope will be reported at the end of + * the test. + * It is invalid for child coroutines to throw uncaught exceptions when outside the call to [TestScope.runTest]: + * the only guarantee in this case is the best effort to deliver the exception. + * + * The usual way to access a [TestScope] is to call [runTest], but it can also be constructed manually, in order to + * use it to initialize the components that participate in the test. + * + * #### Differences from the deprecated [TestCoroutineScope] + * + * * This doesn't provide an equivalent of [TestCoroutineScope.cleanupTestCoroutines], and so can't be used as a + * standalone mechanism for writing tests: it does require that [runTest] is eventually called. + * The reason for this is that a proper cleanup procedure that supports using non-test dispatchers and arbitrary + * coroutine suspensions would be equivalent to [runTest], but would also be more error-prone, due to the potential + * for forgetting to perform the cleanup. + * * [TestCoroutineScope.advanceTimeBy] also calls [TestCoroutineScheduler.runCurrent] after advancing the virtual time. + * * No support for dispatcher pausing, like [DelayController] allows. [TestCoroutineDispatcher], which supported + * pausing, is deprecated; now, instead of pausing a dispatcher, one can use [withContext] to run a dispatcher that's + * paused by default, like [StandardTestDispatcher]. + * * No access to the list of unhandled exceptions. + */ +@ExperimentalCoroutinesApi +public sealed interface TestScope : CoroutineScope { + /** + * The delay-skipping scheduler used by the test dispatchers running the code in this scope. + */ + @ExperimentalCoroutinesApi + public val testScheduler: TestCoroutineScheduler +} + +/** + * The current virtual time on [testScheduler][TestScope.testScheduler]. + * @see TestCoroutineScheduler.currentTime + */ +@ExperimentalCoroutinesApi +public val TestScope.currentTime: Long + get() = testScheduler.currentTime + +/** + * Advances the [testScheduler][TestScope.testScheduler] to the point where there are no tasks remaining. + * @see TestCoroutineScheduler.advanceUntilIdle + */ +@ExperimentalCoroutinesApi +public fun TestScope.advanceUntilIdle(): Unit = testScheduler.advanceUntilIdle() + +/** + * Run any tasks that are pending at the current virtual time, according to + * the [testScheduler][TestScope.testScheduler]. + * + * @see TestCoroutineScheduler.runCurrent + */ +@ExperimentalCoroutinesApi +public fun TestScope.runCurrent(): Unit = testScheduler.runCurrent() + +/** + * Moves the virtual clock of this dispatcher forward by [the specified amount][delayTimeMillis], running the + * scheduled tasks in the meantime. + * + * In contrast with [TestScope.advanceTimeBy], this function does not run the tasks scheduled at the moment + * [currentTime] + [delayTimeMillis]. + * + * @throws IllegalStateException if passed a negative [delay][delayTimeMillis]. + * @see TestCoroutineScheduler.advanceTimeBy + */ +@ExperimentalCoroutinesApi +public fun TestScope.advanceTimeBy(delayTimeMillis: Long): Unit = testScheduler.advanceTimeBy(delayTimeMillis) + +/** + * Creates a [TestScope]. + * + * It ensures that all the test module machinery is properly initialized. + * * If [context] doesn't provide a [TestCoroutineScheduler] for orchestrating the virtual time used for delay-skipping, + * a new one is created, unless either + * - a [TestDispatcher] is provided, in which case [TestDispatcher.scheduler] is used; + * - at the moment of the creation of the scope, [Dispatchers.Main] is delegated to a [TestDispatcher], in which case + * its [TestCoroutineScheduler] is used. + * * If [context] doesn't have a [TestDispatcher], a [StandardTestDispatcher] is created. + * * A [CoroutineExceptionHandler] is created that makes [TestCoroutineScope.cleanupTestCoroutines] throw if there were + * any uncaught exceptions, or forwards the exceptions further in a platform-specific manner if the cleanup was + * already performed when an exception happened. Passing a [CoroutineExceptionHandler] is illegal, unless it's an + * [UncaughtExceptionCaptor], in which case the behavior is preserved for the time being for backward compatibility. + * If you need to have a specific [CoroutineExceptionHandler], please pass it to [launch] on an already-created + * [TestCoroutineScope] and share your use case at + * [our issue tracker](https://github.com/Kotlin/kotlinx.coroutines/issues). + * * If [context] provides a [Job], that job is used as a parent for the new scope. + * + * @throws IllegalArgumentException if [context] has both [TestCoroutineScheduler] and a [TestDispatcher] linked to a + * different scheduler. + * @throws IllegalArgumentException if [context] has a [ContinuationInterceptor] that is not a [TestDispatcher]. + * @throws IllegalArgumentException if [context] has an [CoroutineExceptionHandler] that is not an + * [UncaughtExceptionCaptor]. + */ +@ExperimentalCoroutinesApi +@Suppress("FunctionName") +public fun TestScope(context: CoroutineContext = EmptyCoroutineContext): TestScope { + val ctxWithDispatcher = context.withDelaySkipping() + var scope: TestScopeImpl? = null + val exceptionHandler = when (ctxWithDispatcher[CoroutineExceptionHandler]) { + null -> CoroutineExceptionHandler { _, exception -> + scope!!.reportException(exception) + } + else -> throw IllegalArgumentException( + "A CoroutineExceptionHandler was passed to TestScope. " + + "Please pass it as an argument to a `launch` or `async` block on an already-created scope " + + "if uncaught exceptions require special treatment." + ) + } + return TestScopeImpl(ctxWithDispatcher + exceptionHandler).also { scope = it } +} + +/** + * Adds a [TestDispatcher] and a [TestCoroutineScheduler] to the context if there aren't any already. + * + * @throws IllegalArgumentException if both a [TestCoroutineScheduler] and a [TestDispatcher] are passed. + * @throws IllegalArgumentException if a [ContinuationInterceptor] is passed that is not a [TestDispatcher]. + */ +internal fun CoroutineContext.withDelaySkipping(): CoroutineContext { + val dispatcher: TestDispatcher = when (val dispatcher = get(ContinuationInterceptor)) { + is TestDispatcher -> { + val ctxScheduler = get(TestCoroutineScheduler) + if (ctxScheduler != null) { + require(dispatcher.scheduler === ctxScheduler) { + "Both a TestCoroutineScheduler $ctxScheduler and TestDispatcher $dispatcher linked to " + + "another scheduler were passed." + } + } + dispatcher + } + null -> StandardTestDispatcher(get(TestCoroutineScheduler)) + else -> throw IllegalArgumentException("Dispatcher must implement TestDispatcher: $dispatcher") + } + return this + dispatcher + dispatcher.scheduler +} + +internal class TestScopeImpl(context: CoroutineContext) : + AbstractCoroutine(context, initParentJob = true, active = true), TestScope { + + override val testScheduler get() = context[TestCoroutineScheduler]!! + + private var entered = false + private var finished = false + private val uncaughtExceptions = mutableListOf() + private val lock = SynchronizedObject() + + /** Called upon entry to [runTest]. Will throw if called more than once. */ + fun enter() { + val exceptions = synchronized(lock) { + if (entered) + throw IllegalStateException("Only a single call to `runTest` can be performed during one test.") + entered = true + check(!finished) + uncaughtExceptions + } + if (exceptions.isNotEmpty()) { + throw UncaughtExceptionsBeforeTest().apply { + for (e in exceptions) + addSuppressed(e) + } + } + } + + /** Called at the end of the test. May only be called once. */ + fun leave(): List { + val exceptions = synchronized(lock) { + if(!entered || finished) + throw IllegalStateException("An internal error. Please report to the Kotlinx Coroutines issue tracker") + finished = true + uncaughtExceptions + } + val activeJobs = children.filter { it.isActive }.toList() // only non-empty if used with `runBlockingTest` + if (exceptions.isEmpty()) { + if (activeJobs.isNotEmpty()) + throw UncompletedCoroutinesError( + "Active jobs found during the tear-down. " + + "Ensure that all coroutines are completed or cancelled by your test. " + + "The active jobs: $activeJobs" + ) + if (!testScheduler.isIdle()) + throw UncompletedCoroutinesError( + "Unfinished coroutines found during the tear-down. " + + "Ensure that all coroutines are completed or cancelled by your test." + ) + } + return exceptions + } + + /** Stores an exception to report after [runTest], or rethrows it if not inside [runTest]. */ + fun reportException(throwable: Throwable) { + synchronized(lock) { + if (finished) { + throw throwable + } else { + uncaughtExceptions.add(throwable) + if (!entered) + throw UncaughtExceptionsBeforeTest().apply { addSuppressed(throwable) } + } + } + } + + override fun toString(): String = + "TestScope[" + (if (finished) "test ended" else if (entered) "test started" else "test not started") + "]" +} + +/** Use the knowledge that any [TestScope] that we receive is necessarily a [TestScopeImpl]. */ +internal fun TestScope.asSpecificImplementation(): TestScopeImpl = when (this) { + is TestScopeImpl -> this +} + +internal class UncaughtExceptionsBeforeTest : IllegalStateException( + "There were uncaught exceptions in coroutines launched from TestScope before the test started. Please avoid this," + + " as such exceptions are also reported in a platform-dependent manner so that they are not lost." +) + +/** + * Thrown when a test has completed and there are tasks that are not completed or cancelled. + */ +@ExperimentalCoroutinesApi +internal class UncompletedCoroutinesError(message: String) : AssertionError(message) \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt b/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt index f2e5b7a168..24e093be21 100644 --- a/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt +++ b/kotlinx-coroutines-test/common/src/internal/TestMainDispatcher.kt @@ -3,34 +3,88 @@ */ package kotlinx.coroutines.test.internal + +import kotlinx.atomicfu.* import kotlinx.coroutines.* +import kotlinx.coroutines.test.* import kotlin.coroutines.* /** * The testable main dispatcher used by kotlinx-coroutines-test. * It is a [MainCoroutineDispatcher] that delegates all actions to a settable delegate. */ -internal class TestMainDispatcher(private var delegate: CoroutineDispatcher): +internal class TestMainDispatcher(delegate: CoroutineDispatcher): MainCoroutineDispatcher(), - Delay by (delegate as? Delay ?: defaultDelay) + Delay { - private val mainDispatcher = delegate // the initial value passed to the constructor + private val mainDispatcher = delegate + private var delegate = NonConcurrentlyModifiable(mainDispatcher, "Dispatchers.Main") + + private val delay + get() = delegate.value as? Delay ?: defaultDelay override val immediate: MainCoroutineDispatcher - get() = (delegate as? MainCoroutineDispatcher)?.immediate ?: this + get() = (delegate.value as? MainCoroutineDispatcher)?.immediate ?: this - override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.dispatch(context, block) + override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.value.dispatch(context, block) - override fun isDispatchNeeded(context: CoroutineContext): Boolean = delegate.isDispatchNeeded(context) + override fun isDispatchNeeded(context: CoroutineContext): Boolean = delegate.value.isDispatchNeeded(context) - override fun dispatchYield(context: CoroutineContext, block: Runnable) = delegate.dispatchYield(context, block) + override fun dispatchYield(context: CoroutineContext, block: Runnable) = delegate.value.dispatchYield(context, block) fun setDispatcher(dispatcher: CoroutineDispatcher) { - delegate = dispatcher + delegate.value = dispatcher } fun resetDispatcher() { - delegate = mainDispatcher + delegate.value = mainDispatcher + } + + override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) = + delay.scheduleResumeAfterDelay(timeMillis, continuation) + + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = + delay.invokeOnTimeout(timeMillis, block, context) + + companion object { + internal val currentTestDispatcher + get() = (Dispatchers.Main as? TestMainDispatcher)?.delegate?.value as? TestDispatcher + + internal val currentTestScheduler + get() = currentTestDispatcher?.scheduler + } + + /** + * A wrapper around a value that attempts to throw when writing happens concurrently with reading. + * + * The read operations never throw. Instead, the failures detected inside them will be remembered and thrown on the + * next modification. + */ + private class NonConcurrentlyModifiable(initialValue: T, private val name: String) { + private val readers = atomic(0) // number of concurrent readers + private val isWriting = atomic(false) // a modification is happening currently + private val exceptionWhenReading: AtomicRef = atomic(null) // exception from reading + private val _value = atomic(initialValue) // the backing field for the value + + private fun concurrentWW() = IllegalStateException("$name is modified concurrently") + private fun concurrentRW() = IllegalStateException("$name is used concurrently with setting it") + + var value: T + get() { + readers.incrementAndGet() + if (isWriting.value) exceptionWhenReading.value = concurrentRW() + val result = _value.value + readers.decrementAndGet() + return result + } + set(value) { + exceptionWhenReading.getAndSet(null)?.let { throw it } + if (readers.value != 0) throw concurrentRW() + if (!isWriting.compareAndSet(expect = false, update = true)) throw concurrentWW() + _value.value = value + isWriting.value = false + if (readers.value != 0) throw concurrentRW() + } } } @@ -39,4 +93,4 @@ private val defaultDelay inline get() = DefaultDelay @Suppress("INVISIBLE_MEMBER") -internal expect fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher \ No newline at end of file +internal expect fun Dispatchers.getTestMainDispatcher(): TestMainDispatcher diff --git a/kotlinx-coroutines-test/common/test/Helpers.kt b/kotlinx-coroutines-test/common/test/Helpers.kt index f0a462e4b6..a63311b7e4 100644 --- a/kotlinx-coroutines-test/common/test/Helpers.kt +++ b/kotlinx-coroutines-test/common/test/Helpers.kt @@ -4,5 +4,71 @@ package kotlinx.coroutines.test +import kotlinx.atomicfu.* +import kotlin.test.* +import kotlin.time.* +import kotlin.time.Duration.Companion.seconds + +/** + * The number of milliseconds that is sure not to pass [assertRunsFast]. + */ +const val SLOW = 100_000L + +/** + * Asserts that a block completed within [timeout]. + */ +@OptIn(ExperimentalTime::class) +inline fun assertRunsFast(timeout: Duration, block: () -> T): T { + val result: T + val elapsed = TimeSource.Monotonic.measureTime { result = block() } + assertTrue("Should complete in $timeout, but took $elapsed") { elapsed < timeout } + return result +} + +/** + * Asserts that a block completed within two seconds. + */ +@OptIn(ExperimentalTime::class) +inline fun assertRunsFast(block: () -> T): T = assertRunsFast(2.seconds, block) + +/** + * Passes [test] as an argument to [block], but as a function returning not a [TestResult] but [Unit]. +*/ +expect fun testResultMap(block: (() -> Unit) -> Unit, test: () -> TestResult): TestResult + +class TestException(message: String? = null): Exception(message) + +/** + * A class inheriting from which allows to check the execution order inside tests. + * + * @see TestBase + */ +open class OrderedExecutionTestBase { + private val actionIndex = atomic(0) + private val finished = atomic(false) + + /** Expect the next action to be [index] in order. */ + protected fun expect(index: Int) { + val wasIndex = actionIndex.incrementAndGet() + check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } + } + + /** Expect this action to be final, with the given [index]. */ + protected fun finish(index: Int) { + expect(index) + check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } + } + + @AfterTest + fun ensureFinishCalls() { + assertTrue(finished.value || actionIndex.value == 0, "Expected `finish` to be called") + } +} + +internal fun T.void() { } + +@OptionalExpectation +expect annotation class NoJs() + @OptionalExpectation expect annotation class NoNative() diff --git a/kotlinx-coroutines-test/common/test/RunTestTest.kt b/kotlinx-coroutines-test/common/test/RunTestTest.kt new file mode 100644 index 0000000000..e063cdacf1 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/RunTestTest.kt @@ -0,0 +1,296 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlin.coroutines.* +import kotlin.test.* + +class RunTestTest { + + /** Tests that [withContext] that sends work to other threads works in [runTest]. */ + @Test + fun testWithContextDispatching() = runTest { + var counter = 0 + withContext(Dispatchers.Default) { + counter += 1 + } + assertEquals(counter, 1) + } + + /** Tests that joining [GlobalScope.launch] works in [runTest]. */ + @Test + fun testJoiningForkedJob() = runTest { + var counter = 0 + val job = GlobalScope.launch { + counter += 1 + } + job.join() + assertEquals(counter, 1) + } + + /** Tests [suspendCoroutine] not failing [runTest]. */ + @Test + fun testSuspendCoroutine() = runTest { + val answer = suspendCoroutine { + it.resume(42) + } + assertEquals(42, answer) + } + + /** Tests that [runTest] attempts to detect it being run inside another [runTest] and failing in such scenarios. */ + @Test + fun testNestedRunTestForbidden() = runTest { + assertFailsWith { + runTest { } + } + } + + /** Tests that even the dispatch timeout of `0` is fine if all the dispatches go through the same scheduler. */ + @Test + fun testRunTestWithZeroTimeoutWithControlledDispatches() = runTest(dispatchTimeoutMs = 0) { + // below is some arbitrary concurrent code where all dispatches go through the same scheduler. + launch { + delay(2000) + } + val deferred = async { + val job = launch(StandardTestDispatcher(testScheduler)) { + launch { + delay(500) + } + delay(1000) + } + job.join() + } + deferred.await() + } + + /** Tests that a dispatch timeout of `0` will fail the test if there are some dispatches outside the scheduler. */ + @Test + fun testRunTestWithZeroTimeoutWithUncontrolledDispatches() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTest(dispatchTimeoutMs = 0) { + withContext(Dispatchers.Default) { + delay(10) + 3 + } + fail("shouldn't be reached") + } + } + + /** Tests that too low of a dispatch timeout causes crashes. */ + @Test + @NoNative // TODO: timeout leads to `Cannot execute task because event loop was shut down` on Native + fun testRunTestWithSmallTimeout() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTest(dispatchTimeoutMs = 100) { + withContext(Dispatchers.Default) { + delay(10000) + 3 + } + fail("shouldn't be reached") + } + } + + /** Tests that too low of a dispatch timeout causes crashes. */ + @Test + fun testRunTestWithLargeTimeout() = runTest(dispatchTimeoutMs = 5000) { + withContext(Dispatchers.Default) { + delay(50) + } + } + + /** Tests uncaught exceptions taking priority over dispatch timeout in error reports. */ + @Test + @NoNative // TODO: timeout leads to `Cannot execute task because event loop was shut down` on Native + fun testRunTestTimingOutAndThrowing() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTest(dispatchTimeoutMs = 1) { + coroutineContext[CoroutineExceptionHandler]!!.handleException(coroutineContext, IllegalArgumentException()) + withContext(Dispatchers.Default) { + delay(10000) + 3 + } + fail("shouldn't be reached") + } + } + + /** Tests that passing invalid contexts to [runTest] causes it to fail (on JS, without forking). */ + @Test + fun testRunTestWithIllegalContext() { + for (ctx in TestScopeTest.invalidContexts) { + assertFailsWith { + runTest(ctx) { } + } + } + } + + /** Tests that throwing exceptions in [runTest] fails the test with them. */ + @Test + fun testThrowingInRunTestBody() = testResultMap({ + assertFailsWith { it() } + }) { + runTest { + throw RuntimeException() + } + } + + /** Tests that throwing exceptions in pending tasks [runTest] fails the test with them. */ + @Test + fun testThrowingInRunTestPendingTask() = testResultMap({ + assertFailsWith { it() } + }) { + runTest { + launch { + delay(SLOW) + throw RuntimeException() + } + } + } + + @Test + fun reproducer2405() = runTest { + val dispatcher = StandardTestDispatcher(testScheduler) + var collectedError = false + withContext(dispatcher) { + flow { emit(1) } + .combine( + flow { throw IllegalArgumentException() } + ) { int, string -> int.toString() + string } + .catch { emit("error") } + .collect { + assertEquals("error", it) + collectedError = true + } + } + assertTrue(collectedError) + } + + /** Tests that, once the test body has thrown, the child coroutines are cancelled. */ + @Test + fun testChildrenCancellationOnTestBodyFailure(): TestResult { + var job: Job? = null + return testResultMap({ + assertFailsWith { it() } + assertTrue(job!!.isCancelled) + }) { + runTest { + job = launch { + while (true) { + delay(1000) + } + } + throw AssertionError() + } + } + } + + /** Tests that [runTest] reports [TimeoutCancellationException]. */ + @Test + fun testTimeout() = testResultMap({ + assertFailsWith { it() } + }) { + runTest { + withTimeout(50) { + launch { + delay(1000) + } + } + } + } + + /** Checks that [runTest] throws the root cause and not [JobCancellationException] when a child coroutine throws. */ + @Test + fun testRunTestThrowsRootCause() = testResultMap({ + assertFailsWith { it() } + }) { + runTest { + launch { + throw TestException() + } + } + } + + /** Tests that [runTest] completes its job. */ + @Test + fun testCompletesOwnJob(): TestResult { + var handlerCalled = false + return testResultMap({ + it() + assertTrue(handlerCalled) + }) { + runTest { + coroutineContext.job.invokeOnCompletion { + handlerCalled = true + } + } + } + } + + /** Tests that [runTest] doesn't complete the job that was passed to it as an argument. */ + @Test + fun testDoesNotCompleteGivenJob(): TestResult { + var handlerCalled = false + val job = Job() + job.invokeOnCompletion { + handlerCalled = true + } + return testResultMap({ + it() + assertFalse(handlerCalled) + assertEquals(0, job.children.filter { it.isActive }.count()) + }) { + runTest(job) { + assertTrue(coroutineContext.job in job.children) + } + } + } + + /** Tests that, when the test body fails, the reported exceptions are suppressed. */ + @Test + fun testSuppressedExceptions() = testResultMap({ + try { + it() + fail("should not be reached") + } catch (e: TestException) { + assertEquals("w", e.message) + val suppressed = e.suppressedExceptions + + (e.suppressedExceptions.firstOrNull()?.suppressedExceptions ?: emptyList()) + assertEquals(3, suppressed.size) + assertEquals("x", suppressed[0].message) + assertEquals("y", suppressed[1].message) + assertEquals("z", suppressed[2].message) + } + }) { + runTest { + launch(SupervisorJob()) { throw TestException("x") } + launch(SupervisorJob()) { throw TestException("y") } + launch(SupervisorJob()) { throw TestException("z") } + throw TestException("w") + } + } + + /** Tests that [TestCoroutineScope.runTest] does not inherit the exception handler and works. */ + @Test + fun testScopeRunTestExceptionHandler(): TestResult { + val scope = TestScope() + return testResultMap({ + try { + it() + fail("should not be reached") + } catch (e: TestException) { + // expected + } + }) { + scope.runTest { + launch(SupervisorJob()) { throw TestException("x") } + } + } + } +} diff --git a/kotlinx-coroutines-test/common/test/StandardTestDispatcherTest.kt b/kotlinx-coroutines-test/common/test/StandardTestDispatcherTest.kt new file mode 100644 index 0000000000..d66be9bdb6 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/StandardTestDispatcherTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlin.test.* + +class StandardTestDispatcherTest: OrderedExecutionTestBase() { + + private val scope = TestScope(StandardTestDispatcher()) + + @BeforeTest + fun init() { + scope.asSpecificImplementation().enter() + } + + @AfterTest + fun cleanup() { + scope.runCurrent() + assertEquals(listOf(), scope.asSpecificImplementation().leave()) + } + + /** Tests that the [StandardTestDispatcher] follows an execution order similar to `runBlocking`. */ + @Test + fun testFlowsNotSkippingValues() = scope.launch { + // https://github.com/Kotlin/kotlinx.coroutines/issues/1626#issuecomment-554632852 + val list = flowOf(1).onStart { emit(0) } + .combine(flowOf("A")) { int, str -> "$str$int" } + .toList() + assertEquals(list, listOf("A0", "A1")) + }.void() + + /** Tests that each [launch] gets dispatched. */ + @Test + fun testLaunchDispatched() = scope.launch { + expect(1) + launch { + expect(3) + } + finish(2) + }.void() + + /** Tests that dispatching is done in a predictable order and [yield] puts this task at the end of the queue. */ + @Test + fun testYield() = scope.launch { + expect(1) + scope.launch { + expect(3) + yield() + expect(6) + } + scope.launch { + expect(4) + yield() + finish(7) + } + expect(2) + yield() + expect(5) + }.void() + + /** Tests that the [TestCoroutineScheduler] used for [Dispatchers.Main] gets used by default. */ + @Test + @NoNative + fun testSchedulerReuse() { + val dispatcher1 = StandardTestDispatcher() + Dispatchers.setMain(dispatcher1) + try { + val dispatcher2 = StandardTestDispatcher() + assertSame(dispatcher1.scheduler, dispatcher2.scheduler) + } finally { + Dispatchers.resetMain() + } + } + +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineSchedulerTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineSchedulerTest.kt new file mode 100644 index 0000000000..203ddc4f11 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/TestCoroutineSchedulerTest.kt @@ -0,0 +1,323 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.test.* + +class TestCoroutineSchedulerTest { + /** Tests that `TestCoroutineScheduler` attempts to detect if there are several instances of it. */ + @Test + fun testContextElement() = runTest { + assertFailsWith { + withContext(StandardTestDispatcher()) { + } + } + } + + /** Tests that, as opposed to [DelayController.advanceTimeBy] or [TestCoroutineScope.advanceTimeBy], + * [TestCoroutineScheduler.advanceTimeBy] doesn't run the tasks scheduled at the target moment. */ + @Test + fun testAdvanceTimeByDoesNotRunCurrent() = runTest { + var entered = false + launch { + delay(15) + entered = true + } + testScheduler.advanceTimeBy(15) + assertFalse(entered) + testScheduler.runCurrent() + assertTrue(entered) + } + + /** Tests that [TestCoroutineScheduler.advanceTimeBy] doesn't accept negative delays. */ + @Test + fun testAdvanceTimeByWithNegativeDelay() { + val scheduler = TestCoroutineScheduler() + assertFailsWith { + scheduler.advanceTimeBy(-1) + } + } + + /** Tests that if [TestCoroutineScheduler.advanceTimeBy] encounters an arithmetic overflow, all the tasks scheduled + * until the moment [Long.MAX_VALUE] get run. */ + @Test + fun testAdvanceTimeByEnormousDelays() = forTestDispatchers { + assertRunsFast { + with (TestScope(it)) { + launch { + val initialDelay = 10L + delay(initialDelay) + assertEquals(initialDelay, currentTime) + var enteredInfinity = false + launch { + delay(Long.MAX_VALUE - 1) // delay(Long.MAX_VALUE) does nothing + assertEquals(Long.MAX_VALUE, currentTime) + enteredInfinity = true + } + var enteredNearInfinity = false + launch { + delay(Long.MAX_VALUE - initialDelay - 1) + assertEquals(Long.MAX_VALUE - 1, currentTime) + enteredNearInfinity = true + } + testScheduler.advanceTimeBy(Long.MAX_VALUE) + assertFalse(enteredInfinity) + assertTrue(enteredNearInfinity) + assertEquals(Long.MAX_VALUE, currentTime) + testScheduler.runCurrent() + assertTrue(enteredInfinity) + } + testScheduler.advanceUntilIdle() + } + } + } + + /** Tests the basic functionality of [TestCoroutineScheduler.advanceTimeBy]. */ + @Test + fun testAdvanceTimeBy() = runTest { + assertRunsFast { + var stage = 1 + launch { + delay(1_000) + assertEquals(1_000, currentTime) + stage = 2 + delay(500) + assertEquals(1_500, currentTime) + stage = 3 + delay(501) + assertEquals(2_001, currentTime) + stage = 4 + } + assertEquals(1, stage) + assertEquals(0, currentTime) + advanceTimeBy(2_000) + assertEquals(3, stage) + assertEquals(2_000, currentTime) + advanceTimeBy(2) + assertEquals(4, stage) + assertEquals(2_002, currentTime) + } + } + + /** Tests the basic functionality of [TestCoroutineScheduler.runCurrent]. */ + @Test + fun testRunCurrent() = runTest { + var stage = 0 + launch { + delay(1) + ++stage + delay(1) + stage += 10 + } + launch { + delay(1) + ++stage + delay(1) + stage += 10 + } + testScheduler.advanceTimeBy(1) + assertEquals(0, stage) + runCurrent() + assertEquals(2, stage) + testScheduler.advanceTimeBy(1) + assertEquals(2, stage) + runCurrent() + assertEquals(22, stage) + } + + /** Tests that [TestCoroutineScheduler.runCurrent] will not run new tasks after the current time has advanced. */ + @Test + fun testRunCurrentNotDrainingQueue() = forTestDispatchers { + assertRunsFast { + val scheduler = it.scheduler + val scope = TestScope(it) + var stage = 1 + scope.launch { + delay(SLOW) + launch { + delay(SLOW) + stage = 3 + } + scheduler.advanceTimeBy(SLOW) + stage = 2 + } + scheduler.advanceTimeBy(SLOW) + assertEquals(1, stage) + scheduler.runCurrent() + assertEquals(2, stage) + scheduler.runCurrent() + assertEquals(3, stage) + } + } + + /** Tests that [TestCoroutineScheduler.advanceUntilIdle] doesn't hang when itself running in a scheduler task. */ + @Test + fun testNestedAdvanceUntilIdle() = forTestDispatchers { + assertRunsFast { + val scheduler = it.scheduler + val scope = TestScope(it) + var executed = false + scope.launch { + launch { + delay(SLOW) + executed = true + } + scheduler.advanceUntilIdle() + } + scheduler.advanceUntilIdle() + assertTrue(executed) + } + } + + /** Tests [yield] scheduling tasks for future execution and not executing immediately. */ + @Test + fun testYield() = forTestDispatchers { + val scope = TestScope(it) + var stage = 0 + scope.launch { + yield() + assertEquals(1, stage) + stage = 2 + } + scope.launch { + yield() + assertEquals(2, stage) + stage = 3 + } + assertEquals(0, stage) + stage = 1 + scope.runCurrent() + } + + /** Tests that dispatching the delayed tasks is ordered by their waking times. */ + @Test + fun testDelaysPriority() = forTestDispatchers { + val scope = TestScope(it) + var lastMeasurement = 0L + fun checkTime(time: Long) { + assertTrue(lastMeasurement < time) + assertEquals(time, scope.currentTime) + lastMeasurement = scope.currentTime + } + scope.launch { + launch { + delay(100) + checkTime(100) + val deferred = async { + delay(70) + checkTime(170) + } + delay(1) + checkTime(101) + deferred.await() + delay(1) + checkTime(171) + } + launch { + delay(200) + checkTime(200) + } + launch { + delay(150) + checkTime(150) + delay(22) + checkTime(172) + } + delay(201) + } + scope.advanceUntilIdle() + checkTime(201) + } + + private fun TestScope.checkTimeout( + timesOut: Boolean, timeoutMillis: Long = SLOW, block: suspend () -> Unit + ) = assertRunsFast { + var caughtException = false + asSpecificImplementation().enter() + launch { + try { + withTimeout(timeoutMillis) { + block() + } + } catch (e: TimeoutCancellationException) { + caughtException = true + } + } + advanceUntilIdle() + asSpecificImplementation().leave().throwAll() + if (timesOut) + assertTrue(caughtException) + else + assertFalse(caughtException) + } + + /** Tests that timeouts get triggered. */ + @Test + fun testSmallTimeouts() = forTestDispatchers { + val scope = TestScope(it) + scope.checkTimeout(true) { + val half = SLOW / 2 + delay(half) + delay(SLOW - half) + } + } + + /** Tests that timeouts don't get triggered if the code finishes in time. */ + @Test + fun testLargeTimeouts() = forTestDispatchers { + val scope = TestScope(it) + scope.checkTimeout(false) { + val half = SLOW / 2 + delay(half) + delay(SLOW - half - 1) + } + } + + /** Tests that timeouts get triggered if the code fails to finish in time asynchronously. */ + @Test + fun testSmallAsynchronousTimeouts() = forTestDispatchers { + val scope = TestScope(it) + val deferred = CompletableDeferred() + scope.launch { + val half = SLOW / 2 + delay(half) + delay(SLOW - half) + deferred.complete(Unit) + } + scope.checkTimeout(true) { + deferred.await() + } + } + + /** Tests that timeouts don't get triggered if the code finishes in time, even if it does so asynchronously. */ + @Test + fun testLargeAsynchronousTimeouts() = forTestDispatchers { + val scope = TestScope(it) + val deferred = CompletableDeferred() + scope.launch { + val half = SLOW / 2 + delay(half) + delay(SLOW - half - 1) + deferred.complete(Unit) + } + scope.checkTimeout(false) { + deferred.await() + } + } + + private fun forTestDispatchers(block: (TestDispatcher) -> Unit): Unit = + @Suppress("DEPRECATION") + listOf( + StandardTestDispatcher(), + UnconfinedTestDispatcher() + ).forEach { + try { + block(it) + } catch (e: Throwable) { + throw RuntimeException("Test failed for dispatcher $it", e) + } + } +} diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt b/kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt deleted file mode 100644 index 4480cd99a3..0000000000 --- a/kotlinx-coroutines-test/common/test/TestCoroutineScopeTest.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlin.test.* - -class TestCoroutineScopeTest { - @Test - fun whenGivenInvalidExceptionHandler_throwsException() { - val handler = CoroutineExceptionHandler { _, _ -> } - assertFails { - TestCoroutineScope(handler) - } - } - - @Test - fun whenGivenInvalidDispatcher_throwsException() { - assertFails { - TestCoroutineScope(Dispatchers.Default) - } - } -} diff --git a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt index bf391ea6e2..66a6c24e8f 100644 --- a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt +++ b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt @@ -1,41 +1,67 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +package kotlinx.coroutines.test -import kotlinx.atomicfu.* import kotlinx.coroutines.* -import kotlinx.coroutines.test.* +import kotlinx.coroutines.test.internal.* import kotlin.coroutines.* import kotlin.test.* -class TestDispatchersTest { - private val actionIndex = atomic(0) - private val finished = atomic(false) +@NoNative +class TestDispatchersTest: OrderedExecutionTestBase() { - private fun expect(index: Int) { - val wasIndex = actionIndex.incrementAndGet() - check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } + @BeforeTest + fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) } - private fun finish(index: Int) { - expect(index) - check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } + @AfterTest + fun tearDown() { + Dispatchers.resetMain() } - @BeforeTest - fun setUp() { - Dispatchers.resetMain() + /** Tests that asynchronous execution of tests does not happen concurrently with [AfterTest]. */ + @Test + @NoJs + fun testMainMocking() = runTest { + val mainAtStart = TestMainDispatcher.currentTestDispatcher + assertNotNull(mainAtStart) + withContext(Dispatchers.Main) { + delay(10) + } + withContext(Dispatchers.Default) { + delay(10) + } + withContext(Dispatchers.Main) { + delay(10) + } + assertSame(mainAtStart, TestMainDispatcher.currentTestDispatcher) + } + + /** Tests that the mocked [Dispatchers.Main] correctly forwards [Delay] methods. */ + @Test + fun testMockedMainImplementsDelay() = runTest { + val main = Dispatchers.Main + withContext(main) { + delay(10) + } + withContext(Dispatchers.Default) { + delay(10) + } + withContext(main) { + delay(10) + } } + /** Tests that [Distpachers.setMain] fails when called with [Dispatchers.Main]. */ @Test - @NoNative fun testSelfSet() { assertFailsWith { Dispatchers.setMain(Dispatchers.Main) } } @Test - @NoNative - fun testImmediateDispatcher() = runBlockingTest { + fun testImmediateDispatcher() = runTest { Dispatchers.setMain(ImmediateDispatcher()) expect(1) withContext(Dispatchers.Main) { diff --git a/kotlinx-coroutines-test/common/test/TestModuleHelpers.kt b/kotlinx-coroutines-test/common/test/TestModuleHelpers.kt deleted file mode 100644 index a34dbfd6c7..0000000000 --- a/kotlinx-coroutines-test/common/test/TestModuleHelpers.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlin.test.* -import kotlin.time.* - -const val SLOW = 10_000L - -/** - * Assert a block completes within a second or fail the suite - */ -@OptIn(ExperimentalTime::class) -suspend fun CoroutineScope.assertRunsFast(block: suspend CoroutineScope.() -> Unit) { - val start = TimeSource.Monotonic.markNow() - // don't need to be fancy with timeouts here since anything longer than a few ms is an error - block() - val duration = start.elapsedNow() - assertTrue("All tests must complete within 2000ms (use longer timeouts to cause failure)") { - duration.inWholeSeconds < 2 - } -} diff --git a/kotlinx-coroutines-test/common/test/TestScopeTest.kt b/kotlinx-coroutines-test/common/test/TestScopeTest.kt new file mode 100644 index 0000000000..7031056f11 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/TestScopeTest.kt @@ -0,0 +1,179 @@ +/* + * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.coroutines.* +import kotlin.test.* + +class TestScopeTest { + /** Tests failing to create a [TestCoroutineScope] with incorrect contexts. */ + @Test + fun testCreateThrowsOnInvalidArguments() { + for (ctx in invalidContexts) { + assertFailsWith { + TestScope(ctx) + } + } + } + + /** Tests that a newly-created [TestCoroutineScope] provides the correct scheduler. */ + @Test + fun testCreateProvidesScheduler() { + // Creates a new scheduler. + run { + val scope = TestScope() + assertNotNull(scope.coroutineContext[TestCoroutineScheduler]) + } + // Reuses the scheduler that the dispatcher is linked to. + run { + val dispatcher = StandardTestDispatcher() + val scope = TestScope(dispatcher) + assertSame(dispatcher.scheduler, scope.coroutineContext[TestCoroutineScheduler]) + } + // Uses the scheduler passed to it. + run { + val scheduler = TestCoroutineScheduler() + val scope = TestScope(scheduler) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertSame(scheduler, (scope.coroutineContext[ContinuationInterceptor] as TestDispatcher).scheduler) + } + // Doesn't touch the passed dispatcher and the scheduler if they match. + run { + val scheduler = TestCoroutineScheduler() + val dispatcher = StandardTestDispatcher(scheduler) + val scope = TestScope(scheduler + dispatcher) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertSame(dispatcher, scope.coroutineContext[ContinuationInterceptor]) + } + } + + /** Part of [testCreateProvidesScheduler], disabled for Native */ + @Test + @NoNative + fun testCreateReusesScheduler() { + // Reuses the scheduler of `Dispatchers.Main` + run { + val scheduler = TestCoroutineScheduler() + val mainDispatcher = StandardTestDispatcher(scheduler) + Dispatchers.setMain(mainDispatcher) + try { + val scope = TestScope() + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher, scope.coroutineContext[ContinuationInterceptor]) + } finally { + Dispatchers.resetMain() + } + } + // Does not reuse the scheduler of `Dispatchers.Main` if one is explicitly passed + run { + val mainDispatcher = StandardTestDispatcher() + Dispatchers.setMain(mainDispatcher) + try { + val scheduler = TestCoroutineScheduler() + val scope = TestScope(scheduler) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher.scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher, scope.coroutineContext[ContinuationInterceptor]) + } finally { + Dispatchers.resetMain() + } + } + } + + /** Tests that the cleanup procedure throws if there were uncompleted delays by the end. */ + @Test + fun testPresentDelaysThrowing() { + val scope = TestScope() + var result = false + scope.launch { + delay(5) + result = true + } + assertFalse(result) + scope.asSpecificImplementation().enter() + assertFailsWith { scope.asSpecificImplementation().leave() } + assertFalse(result) + } + + /** Tests that the cleanup procedure throws if there were active jobs by the end. */ + @Test + fun testActiveJobsThrowing() { + val scope = TestScope() + var result = false + val deferred = CompletableDeferred() + scope.launch { + deferred.await() + result = true + } + assertFalse(result) + scope.asSpecificImplementation().enter() + assertFailsWith { scope.asSpecificImplementation().leave() } + assertFalse(result) + } + + /** Tests that the cleanup procedure throws even if it detects that the job is already cancelled. */ + @Test + fun testCancelledDelaysThrowing() { + val scope = TestScope() + var result = false + val deferred = CompletableDeferred() + val job = scope.launch { + deferred.await() + result = true + } + job.cancel() + assertFalse(result) + scope.asSpecificImplementation().enter() + assertFailsWith { scope.asSpecificImplementation().leave() } + assertFalse(result) + } + + /** Tests that uncaught exceptions are thrown at the cleanup. */ + @Test + fun testGetsCancelledOnChildFailure(): TestResult { + val scope = TestScope() + val exception = TestException("test") + scope.launch { + throw exception + } + return testResultMap({ + try { + it() + fail("should not reach") + } catch (e: TestException) { + // expected + } + }) { + scope.runTest { + } + } + } + + /** Tests that, when reporting several exceptions, the first one is thrown, with the rest suppressed. */ + @Test + fun testSuppressedExceptions() { + TestScope().apply { + asSpecificImplementation().enter() + launch(SupervisorJob()) { throw TestException("x") } + launch(SupervisorJob()) { throw TestException("y") } + launch(SupervisorJob()) { throw TestException("z") } + runCurrent() + val e = asSpecificImplementation().leave() + assertEquals(3, e.size) + assertEquals("x", e[0].message) + assertEquals("y", e[1].message) + assertEquals("z", e[2].message) + } + } + + companion object { + internal val invalidContexts = listOf( + Dispatchers.Default, // not a [TestDispatcher] + CoroutineExceptionHandler { _, _ -> }, // exception handlers can't be overridden + StandardTestDispatcher() + TestCoroutineScheduler(), // the dispatcher is not linked to the scheduler + ) + } +} diff --git a/kotlinx-coroutines-test/common/test/UnconfinedTestDispatcherTest.kt b/kotlinx-coroutines-test/common/test/UnconfinedTestDispatcherTest.kt new file mode 100644 index 0000000000..ee63e6d118 --- /dev/null +++ b/kotlinx-coroutines-test/common/test/UnconfinedTestDispatcherTest.kt @@ -0,0 +1,168 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* +import kotlin.test.* + +class UnconfinedTestDispatcherTest { + + @Test + fun reproducer1742() { + class ObservableValue(initial: T) { + var value: T = initial + private set + + private val listeners = mutableListOf<(T) -> Unit>() + + fun set(value: T) { + this.value = value + listeners.forEach { it(value) } + } + + fun addListener(listener: (T) -> Unit) { + listeners.add(listener) + } + + fun removeListener(listener: (T) -> Unit) { + listeners.remove(listener) + } + } + + fun ObservableValue.observe(): Flow = + callbackFlow { + val listener = { value: T -> + if (!isClosedForSend) { + trySend(value) + } + } + addListener(listener) + listener(value) + awaitClose { removeListener(listener) } + } + + val intProvider = ObservableValue(0) + val stringProvider = ObservableValue("") + var data = Pair(0, "") + val scope = CoroutineScope(UnconfinedTestDispatcher()) + scope.launch { + combine( + intProvider.observe(), + stringProvider.observe() + ) { intValue, stringValue -> Pair(intValue, stringValue) } + .collect { pair -> + data = pair + } + } + + intProvider.set(1) + stringProvider.set("3") + intProvider.set(2) + intProvider.set(3) + + scope.cancel() + assertEquals(Pair(3, "3"), data) + } + + @Test + fun reproducer2082() = runTest { + val subject1 = MutableStateFlow(1) + val subject2 = MutableStateFlow("a") + val values = mutableListOf>() + + val job = launch(UnconfinedTestDispatcher(testScheduler)) { + combine(subject1, subject2) { intVal, strVal -> intVal to strVal } + .collect { + delay(10000) + values += it + } + } + + subject1.value = 2 + delay(10000) + subject2.value = "b" + delay(10000) + + subject1.value = 3 + delay(10000) + subject2.value = "c" + delay(10000) + delay(10000) + delay(1) + + job.cancel() + + assertEquals(listOf(Pair(1, "a"), Pair(2, "a"), Pair(2, "b"), Pair(3, "b"), Pair(3, "c")), values) + } + + @Test + fun reproducer2405() = createTestResult { + val dispatcher = UnconfinedTestDispatcher() + var collectedError = false + withContext(dispatcher) { + flow { emit(1) } + .combine( + flow { throw IllegalArgumentException() } + ) { int, string -> int.toString() + string } + .catch { emit("error") } + .collect { + assertEquals("error", it) + collectedError = true + } + } + assertTrue(collectedError) + } + + /** An example from the [UnconfinedTestDispatcher] documentation. */ + @Test + fun testUnconfinedDispatcher() = runTest { + val values = mutableListOf() + val stateFlow = MutableStateFlow(0) + val job = launch(UnconfinedTestDispatcher(testScheduler)) { + stateFlow.collect { + values.add(it) + } + } + stateFlow.value = 1 + stateFlow.value = 2 + stateFlow.value = 3 + job.cancel() + assertEquals(listOf(0, 1, 2, 3), values) + } + + /** Tests that child coroutines are eagerly entered. */ + @Test + fun testEagerlyEnteringChildCoroutines() = runTest(UnconfinedTestDispatcher()) { + var entered = false + val deferred = CompletableDeferred() + var completed = false + launch { + entered = true + deferred.await() + completed = true + } + assertTrue(entered) // `entered = true` already executed. + assertFalse(completed) // however, the child coroutine then suspended, so it is enqueued. + deferred.complete(Unit) // resume the coroutine. + assertTrue(completed) // now the child coroutine is immediately completed. + } + + /** Tests that the [TestCoroutineScheduler] used for [Dispatchers.Main] gets used by default. */ + @Test + @NoNative + fun testSchedulerReuse() { + val dispatcher1 = StandardTestDispatcher() + Dispatchers.setMain(dispatcher1) + try { + val dispatcher2 = UnconfinedTestDispatcher() + assertSame(dispatcher1.scheduler, dispatcher2.scheduler) + } finally { + Dispatchers.resetMain() + } + } + +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/js/src/TestBuilders.kt b/kotlinx-coroutines-test/js/src/TestBuilders.kt new file mode 100644 index 0000000000..3976885991 --- /dev/null +++ b/kotlinx-coroutines-test/js/src/TestBuilders.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test +import kotlinx.coroutines.* +import kotlin.js.* + +@Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") +public actual typealias TestResult = Promise + +internal actual fun createTestResult(testProcedure: suspend () -> Unit): TestResult = + GlobalScope.promise { + testProcedure() + } \ No newline at end of file diff --git a/kotlinx-coroutines-test/js/test/FailingTests.kt b/kotlinx-coroutines-test/js/test/FailingTests.kt new file mode 100644 index 0000000000..4746a737fa --- /dev/null +++ b/kotlinx-coroutines-test/js/test/FailingTests.kt @@ -0,0 +1,37 @@ +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.test.internal.* +import kotlin.test.* + +/** These are tests that we want to fail. They are here so that, when the issue is fixed, their failure indicates that + * everything is better now. */ +class FailingTests { + + private var tearDownEntered = false + + @BeforeTest + fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) + } + + @AfterTest + fun tearDown() { + Dispatchers.resetMain() + tearDownEntered = true + } + + /** [TestDispatchersTest.testMainMocking]. */ + @Test + fun testAfterTestIsConcurrent() = runTest { + try { + val mainAtStart = TestMainDispatcher.currentTestDispatcher ?: return@runTest + withContext(Dispatchers.Default) { + // context switch + } + assertNotSame(mainAtStart, TestMainDispatcher.currentTestDispatcher!!) + } finally { + assertTrue(tearDownEntered) + } + } +} diff --git a/kotlinx-coroutines-test/js/test/Helpers.kt b/kotlinx-coroutines-test/js/test/Helpers.kt new file mode 100644 index 0000000000..5f19d1ac58 --- /dev/null +++ b/kotlinx-coroutines-test/js/test/Helpers.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlin.test.* + +actual fun testResultMap(block: (() -> Unit) -> Unit, test: () -> TestResult): TestResult = + test().then( + { + block { + } + }, { + block { + throw it + } + }) + +actual typealias NoJs = Ignore diff --git a/kotlinx-coroutines-test/js/test/PromiseTest.kt b/kotlinx-coroutines-test/js/test/PromiseTest.kt new file mode 100644 index 0000000000..ff09d9ab86 --- /dev/null +++ b/kotlinx-coroutines-test/js/test/PromiseTest.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.test.* + +class PromiseTest { + @Test + fun testCompletionFromPromise() = runTest { + var promiseEntered = false + val p = promise { + delay(1) + promiseEntered = true + } + delay(2) + p.await() + assertTrue(promiseEntered) + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt b/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt new file mode 100644 index 0000000000..7cafb54753 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines.test + +import kotlinx.coroutines.* + +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + +internal actual fun createTestResult(testProcedure: suspend () -> Unit) { + runBlocking { + testProcedure() + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/src/DelayController.kt b/kotlinx-coroutines-test/jvm/src/migration/DelayController.kt similarity index 51% rename from kotlinx-coroutines-test/common/src/DelayController.kt rename to kotlinx-coroutines-test/jvm/src/migration/DelayController.kt index a4ab8c4aba..e0701ae2cd 100644 --- a/kotlinx-coroutines-test/common/src/DelayController.kt +++ b/kotlinx-coroutines-test/jvm/src/migration/DelayController.kt @@ -1,25 +1,30 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +@file:Suppress("DEPRECATION") package kotlinx.coroutines.test -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.* /** * Control the virtual clock time of a [CoroutineDispatcher]. * - * Testing libraries may expose this interface to tests instead of [TestCoroutineDispatcher]. + * Testing libraries may expose this interface to the tests instead of [TestCoroutineDispatcher]. */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 +@ExperimentalCoroutinesApi +@Deprecated( + "Use `TestCoroutineScheduler` to control virtual time.", + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public interface DelayController { /** * Returns the current virtual clock-time as it is known to this Dispatcher. * * @return The virtual clock-time */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @ExperimentalCoroutinesApi public val currentTime: Long /** @@ -57,7 +62,7 @@ public interface DelayController { * @param delayTimeMillis The amount of time to move the CoroutineContext's clock forward. * @return The amount of delay-time that this Dispatcher's clock has been forwarded. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @ExperimentalCoroutinesApi public fun advanceTimeBy(delayTimeMillis: Long): Long /** @@ -68,7 +73,7 @@ public interface DelayController { * * @return the amount of delay-time that this Dispatcher's clock has been forwarded in milliseconds. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @ExperimentalCoroutinesApi public fun advanceUntilIdle(): Long /** @@ -76,17 +81,17 @@ public interface DelayController { * * Calling this function will never advance the clock. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @ExperimentalCoroutinesApi public fun runCurrent() /** * Call after test code completes to ensure that the dispatcher is properly cleaned up. * - * @throws UncompletedCoroutinesError if any pending tasks are active, however it will not throw for suspended + * @throws AssertionError if any pending tasks are active, however it will not throw for suspended * coroutines. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 - @Throws(UncompletedCoroutinesError::class) + @ExperimentalCoroutinesApi + @Throws(AssertionError::class) public fun cleanupTestCoroutines() /** @@ -98,7 +103,11 @@ public interface DelayController { * This is useful when testing functions that start a coroutine. By pausing the dispatcher assertions or * setup may be done between the time the coroutine is created and started. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @Deprecated( + "Please use a dispatcher that is paused by default, like `StandardTestDispatcher`.", + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public suspend fun pauseDispatcher(block: suspend () -> Unit) /** @@ -107,7 +116,11 @@ public interface DelayController { * When paused, the dispatcher will not execute any coroutines automatically, and you must call [runCurrent] or * [advanceTimeBy], or [advanceUntilIdle] to execute coroutines. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @Deprecated( + "Please use a dispatcher that is paused by default, like `StandardTestDispatcher`.", + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public fun pauseDispatcher() /** @@ -117,13 +130,74 @@ public interface DelayController { * time and execute coroutines scheduled in the future use, one of [advanceTimeBy], * or [advanceUntilIdle]. */ - @ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 + @Deprecated( + "Please use a dispatcher that is paused by default, like `StandardTestDispatcher`.", + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public fun resumeDispatcher() } -/** - * Thrown when a test has completed and there are tasks that are not completed or cancelled. - */ -// todo: maybe convert into non-public class in 1.3.0 (need use-cases for a public exception type) -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 -public class UncompletedCoroutinesError(message: String): AssertionError(message) +internal interface SchedulerAsDelayController : DelayController { + val scheduler: TestCoroutineScheduler + + /** @suppress */ + @Deprecated( + "This property delegates to the test scheduler, which may cause confusing behavior unless made explicit.", + ReplaceWith("this.scheduler.currentTime"), + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 + override val currentTime: Long + get() = scheduler.currentTime + + + /** @suppress */ + @Deprecated( + "This function delegates to the test scheduler, which may cause confusing behavior unless made explicit.", + ReplaceWith("this.scheduler.apply { advanceTimeBy(delayTimeMillis); runCurrent() }"), + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 + override fun advanceTimeBy(delayTimeMillis: Long): Long { + val oldTime = scheduler.currentTime + scheduler.advanceTimeBy(delayTimeMillis) + scheduler.runCurrent() + return scheduler.currentTime - oldTime + } + + /** @suppress */ + @Deprecated( + "This function delegates to the test scheduler, which may cause confusing behavior unless made explicit.", + ReplaceWith("this.scheduler.advanceUntilIdle()"), + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 + override fun advanceUntilIdle(): Long { + val oldTime = scheduler.currentTime + scheduler.advanceUntilIdle() + return scheduler.currentTime - oldTime + } + + /** @suppress */ + @Deprecated( + "This function delegates to the test scheduler, which may cause confusing behavior unless made explicit.", + ReplaceWith("this.scheduler.runCurrent()"), + level = DeprecationLevel.WARNING + ) + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 + override fun runCurrent(): Unit = scheduler.runCurrent() + + /** @suppress */ + @ExperimentalCoroutinesApi + override fun cleanupTestCoroutines() { + // process any pending cancellations or completions, but don't advance time + scheduler.runCurrent() + if (!scheduler.isIdle(strict = false)) { + throw UncompletedCoroutinesError( + "Unfinished coroutines during tear-down. Ensure all coroutines are" + + " completed or cancelled by your test." + ) + } + } +} diff --git a/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt b/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt new file mode 100644 index 0000000000..4524bf2867 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt @@ -0,0 +1,190 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:Suppress("DEPRECATION") +@file:JvmName("TestBuildersKt") +@file:JvmMultifileClass + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.selects.* +import kotlin.coroutines.* +import kotlin.jvm.* + +/** + * Executes a [testBody] inside an immediate execution dispatcher. + * + * This is similar to [runBlocking] but it will immediately progress past delays and into [launch] and [async] blocks. + * You can use this to write tests that execute in the presence of calls to [delay] without causing your test to take + * extra time. + * + * ``` + * @Test + * fun exampleTest() = runBlockingTest { + * val deferred = async { + * delay(1_000) + * async { + * delay(1_000) + * }.await() + * } + * + * deferred.await() // result available immediately + * } + * + * ``` + * + * This method requires that all coroutines launched inside [testBody] complete, or are cancelled, as part of the test + * conditions. + * + * Unhandled exceptions thrown by coroutines in the test will be re-thrown at the end of the test. + * + * @throws AssertionError If the [testBody] does not complete (or cancel) all coroutines that it launches + * (including coroutines suspended on join/await). + * + * @param context additional context elements. If [context] contains [CoroutineDispatcher] or [CoroutineExceptionHandler], + * then they must implement [DelayController] and [TestCoroutineExceptionHandler] respectively. + * @param testBody The code of the unit-test. + */ +@Deprecated("Use `runTest` instead to support completing from other dispatchers.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun runBlockingTest( + context: CoroutineContext = EmptyCoroutineContext, + testBody: suspend TestCoroutineScope.() -> Unit +) { + val scope = createTestCoroutineScope(TestCoroutineDispatcher() + SupervisorJob() + context) + val scheduler = scope.testScheduler + val deferred = scope.async { + scope.testBody() + } + scheduler.advanceUntilIdle() + deferred.getCompletionExceptionOrNull()?.let { + throw it + } + scope.cleanupTestCoroutines() +} + +/** + * A version of [runBlockingTest] that works with [TestScope]. + */ +@Deprecated("Use `runTest` instead to support completing from other dispatchers.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun runBlockingTestOnTestScope( + context: CoroutineContext = EmptyCoroutineContext, + testBody: suspend TestScope.() -> Unit +) { + val completeContext = TestCoroutineDispatcher() + SupervisorJob() + context + val startJobs = completeContext.activeJobs() + val scope = TestScope(completeContext).asSpecificImplementation() + scope.enter() + scope.start(CoroutineStart.UNDISPATCHED, scope) { + scope.testBody() + } + scope.testScheduler.advanceUntilIdle() + try { + scope.getCompletionExceptionOrNull() + } catch (e: IllegalStateException) { + null // the deferred was not completed yet; `scope.leave()` should complain then about unfinished jobs + }?.let { + val exceptions = try { + scope.leave() + } catch (e: UncompletedCoroutinesError) { + listOf() + } + (listOf(it) + exceptions).throwAll() + return + } + scope.leave().throwAll() + val jobs = completeContext.activeJobs() - startJobs + if (jobs.isNotEmpty()) + throw UncompletedCoroutinesError("Some jobs were not completed at the end of the test: $jobs") +} + +/** + * Convenience method for calling [runBlockingTest] on an existing [TestCoroutineScope]. + */ +@Deprecated("Use `runTest` instead to support completing from other dispatchers.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit): Unit = + runBlockingTest(coroutineContext, block) + +/** + * Convenience method for calling [runBlockingTestOnTestScope] on an existing [TestScope]. + */ +@Deprecated("Use `runTest` instead to support completing from other dispatchers.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestScope.runBlockingTest(block: suspend TestScope.() -> Unit): Unit = + runBlockingTestOnTestScope(coroutineContext, block) + +/** + * Convenience method for calling [runBlockingTest] on an existing [TestCoroutineDispatcher]. + */ +@Deprecated("Use `runTest` instead to support completing from other dispatchers.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineDispatcher.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit): Unit = + runBlockingTest(this, block) + +/** + * This is an overload of [runTest] that works with [TestCoroutineScope]. + */ +@ExperimentalCoroutinesApi +@Deprecated("Use `runTest` instead.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun runTestWithLegacyScope( + context: CoroutineContext = EmptyCoroutineContext, + dispatchTimeoutMs: Long = DEFAULT_DISPATCH_TIMEOUT_MS, + testBody: suspend TestCoroutineScope.() -> Unit +): TestResult { + if (context[RunningInRunTest] != null) + throw IllegalStateException("Calls to `runTest` can't be nested. Please read the docs on `TestResult` for details.") + val testScope = TestBodyCoroutine(createTestCoroutineScope(context + RunningInRunTest)) + return createTestResult { + runTestCoroutine(testScope, dispatchTimeoutMs, testBody) { + try { + testScope.cleanup() + emptyList() + } catch (e: UncompletedCoroutinesError) { + throw e + } catch (e: Throwable) { + listOf(e) + } + } + } +} + +/** + * Runs a test in a [TestCoroutineScope] based on this one. + * + * Calls [runTest] using a coroutine context from this [TestCoroutineScope]. The [TestCoroutineScope] used to run the + * [block] will be different from this one, but will use its [Job] as a parent. + * + * Since this function returns [TestResult], in order to work correctly on the JS, its result must be returned + * immediately from the test body. See the docs for [TestResult] for details. + */ +@ExperimentalCoroutinesApi +@Deprecated("Use `TestScope.runTest` instead.", level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope.runTest( + dispatchTimeoutMs: Long = DEFAULT_DISPATCH_TIMEOUT_MS, + block: suspend TestCoroutineScope.() -> Unit +): TestResult = runTestWithLegacyScope(coroutineContext, dispatchTimeoutMs, block) + +private class TestBodyCoroutine( + private val testScope: TestCoroutineScope, +) : AbstractCoroutine(testScope.coroutineContext, initParentJob = true, active = true), TestCoroutineScope { + + override val testScheduler get() = testScope.testScheduler + + @Deprecated( + "This deprecation is to prevent accidentally calling `cleanupTestCoroutines` in our own code.", + ReplaceWith("this.cleanup()"), + DeprecationLevel.ERROR + ) + override fun cleanupTestCoroutines() = + throw UnsupportedOperationException( + "Calling `cleanupTestCoroutines` inside `runTest` is prohibited: " + + "it will be called at the end of the test in any case." + ) + + fun cleanup() = testScope.cleanupTestCoroutines() +} diff --git a/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt new file mode 100644 index 0000000000..ec2a3046ee --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.coroutines.* + +/** + * [CoroutineDispatcher] that performs both immediate and lazy execution of coroutines in tests + * and uses a [TestCoroutineScheduler] to control its virtual clock. + * + * By default, [TestCoroutineDispatcher] is immediate. That means any tasks scheduled to be run without delay are + * immediately executed. If they were scheduled with a delay, the virtual clock-time must be advanced via one of the + * methods on the dispatcher's [scheduler]. + * + * When switched to lazy execution using [pauseDispatcher] any coroutines started via [launch] or [async] will + * not execute until a call to [DelayController.runCurrent] or the virtual clock-time has been advanced via one of the + * methods on [DelayController]. + * + * @see DelayController + */ +@Deprecated("The execution order of `TestCoroutineDispatcher` can be confusing, and the mechanism of " + + "pausing is typically misunderstood. Please use `StandardTestDispatcher` or `UnconfinedTestDispatcher` instead.", + level = DeprecationLevel.WARNING) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public class TestCoroutineDispatcher(public override val scheduler: TestCoroutineScheduler = TestCoroutineScheduler()): + TestDispatcher(), Delay, SchedulerAsDelayController +{ + private var dispatchImmediately = true + set(value) { + field = value + if (value) { + // there may already be tasks from setup code we need to run + scheduler.advanceUntilIdle() + } + } + + /** @suppress */ + override fun dispatch(context: CoroutineContext, block: Runnable) { + checkSchedulerInContext(scheduler, context) + if (dispatchImmediately) { + scheduler.sendDispatchEvent() + block.run() + } else { + post(block) + } + } + + /** @suppress */ + override fun dispatchYield(context: CoroutineContext, block: Runnable) { + checkSchedulerInContext(scheduler, context) + post(block) + } + + /** @suppress */ + override fun toString(): String = "TestCoroutineDispatcher[scheduler=$scheduler]" + + private fun post(block: Runnable) = + scheduler.registerEvent(this, 0, block) { false } + + /** @suppress */ + override suspend fun pauseDispatcher(block: suspend () -> Unit) { + val previous = dispatchImmediately + dispatchImmediately = false + try { + block() + } finally { + dispatchImmediately = previous + } + } + + /** @suppress */ + override fun pauseDispatcher() { + dispatchImmediately = false + } + + /** @suppress */ + override fun resumeDispatcher() { + dispatchImmediately = true + } +} diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineExceptionHandler.kt similarity index 55% rename from kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt rename to kotlinx-coroutines-test/jvm/src/migration/TestCoroutineExceptionHandler.kt index b1296df12a..9da521f05c 100644 --- a/kotlinx-coroutines-test/common/src/TestCoroutineExceptionHandler.kt +++ b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineExceptionHandler.kt @@ -11,13 +11,20 @@ import kotlin.coroutines.* /** * Access uncaught coroutine exceptions captured during test execution. */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 +@Deprecated( + "Deprecated for removal without a replacement. " + + "Consider whether the default mechanism of handling uncaught exceptions is sufficient. " + + "If not, try writing your own `CoroutineExceptionHandler` and " + + "please report your use case at https://github.com/Kotlin/kotlinx.coroutines/issues.", + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public interface UncaughtExceptionCaptor { /** * List of uncaught coroutine exceptions. * * The returned list is a copy of the currently caught exceptions. - * During [cleanupTestCoroutinesCaptor] the first element of this list is rethrown if it is not empty. + * During [cleanupTestCoroutines] the first element of this list is rethrown if it is not empty. */ public val uncaughtExceptions: List @@ -29,33 +36,40 @@ public interface UncaughtExceptionCaptor { * * @throws Throwable the first uncaught exception, if there are any uncaught exceptions. */ - public fun cleanupTestCoroutinesCaptor() + public fun cleanupTestCoroutines() } /** * An exception handler that captures uncaught exceptions in tests. */ -@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0 +@Deprecated( + "Deprecated for removal without a replacement. " + + "It may be to define one's own `CoroutineExceptionHandler` if you just need to handle '" + + "uncaught exceptions without a special `TestCoroutineScope` integration.", level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 public class TestCoroutineExceptionHandler : - AbstractCoroutineContextElement(CoroutineExceptionHandler), UncaughtExceptionCaptor, CoroutineExceptionHandler -{ + AbstractCoroutineContextElement(CoroutineExceptionHandler), CoroutineExceptionHandler, UncaughtExceptionCaptor { private val _exceptions = mutableListOf() private val _lock = SynchronizedObject() + private var _coroutinesCleanedUp = false - /** @suppress **/ + @Suppress("INVISIBLE_MEMBER") override fun handleException(context: CoroutineContext, exception: Throwable) { synchronized(_lock) { + if (_coroutinesCleanedUp) { + handleCoroutineExceptionImpl(context, exception) + } _exceptions += exception } } - /** @suppress **/ - override val uncaughtExceptions: List + public override val uncaughtExceptions: List get() = synchronized(_lock) { _exceptions.toList() } - /** @suppress **/ - override fun cleanupTestCoroutinesCaptor() { + public override fun cleanupTestCoroutines() { synchronized(_lock) { + _coroutinesCleanedUp = true val exception = _exceptions.firstOrNull() ?: return // log the rest _exceptions.drop(1).forEach { it.printStackTrace() } diff --git a/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineScope.kt b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineScope.kt new file mode 100644 index 0000000000..45a3815681 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineScope.kt @@ -0,0 +1,332 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:Suppress("DEPRECATION") + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.internal.* +import kotlin.coroutines.* + +/** + * A scope which provides detailed control over the execution of coroutines for tests. + */ +@ExperimentalCoroutinesApi +@Deprecated("Use `TestScope` in combination with `runTest` instead") +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public sealed interface TestCoroutineScope : CoroutineScope { + /** + * Called after the test completes. + * + * * It checks that there were no uncaught exceptions caught by its [CoroutineExceptionHandler]. + * If there were any, then the first one is thrown, whereas the rest are suppressed by it. + * * It runs the tasks pending in the scheduler at the current time. If there are any uncompleted tasks afterwards, + * it fails with [UncompletedCoroutinesError]. + * * It checks whether some new child [Job]s were created but not completed since this [TestCoroutineScope] was + * created. If so, it fails with [UncompletedCoroutinesError]. + * + * For backward compatibility, if the [CoroutineExceptionHandler] is an [UncaughtExceptionCaptor], its + * [TestCoroutineExceptionHandler.cleanupTestCoroutines] behavior is performed. + * Likewise, if the [ContinuationInterceptor] is a [DelayController], its [DelayController.cleanupTestCoroutines] + * is called. + * + * @throws Throwable the first uncaught exception, if there are any uncaught exceptions. + * @throws AssertionError if any pending tasks are active. + * @throws IllegalStateException if called more than once. + */ + @ExperimentalCoroutinesApi + @Deprecated("Please call `runTest`, which automatically performs the cleanup, instead of using this function.") + // Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 + public fun cleanupTestCoroutines() + + /** + * The delay-skipping scheduler used by the test dispatchers running the code in this scope. + */ + @ExperimentalCoroutinesApi + public val testScheduler: TestCoroutineScheduler +} + +private class TestCoroutineScopeImpl( + override val coroutineContext: CoroutineContext +) : TestCoroutineScope { + private val lock = SynchronizedObject() + private var exceptions = mutableListOf() + private var cleanedUp = false + + /** + * Reports an exception so that it is thrown on [cleanupTestCoroutines]. + * + * If several exceptions are reported, only the first one will be thrown, and the other ones will be suppressed by + * it. + * + * Returns `false` if [cleanupTestCoroutines] was already called. + */ + fun reportException(throwable: Throwable): Boolean = + synchronized(lock) { + if (cleanedUp) { + false + } else { + exceptions.add(throwable) + true + } + } + + override val testScheduler: TestCoroutineScheduler + get() = coroutineContext[TestCoroutineScheduler]!! + + /** These jobs existed before the coroutine scope was used, so it's alright if they don't get cancelled. */ + private val initialJobs = coroutineContext.activeJobs() + + override fun cleanupTestCoroutines() { + val delayController = coroutineContext.delayController + val hasUnfinishedJobs = if (delayController != null) { + try { + delayController.cleanupTestCoroutines() + false + } catch (e: UncompletedCoroutinesError) { + true + } + } else { + testScheduler.runCurrent() + !testScheduler.isIdle(strict = false) + } + (coroutineContext[CoroutineExceptionHandler] as? UncaughtExceptionCaptor)?.cleanupTestCoroutines() + synchronized(lock) { + if (cleanedUp) + throw IllegalStateException("Attempting to clean up a test coroutine scope more than once.") + cleanedUp = true + } + exceptions.firstOrNull()?.let { toThrow -> + exceptions.drop(1).forEach { toThrow.addSuppressed(it) } + throw toThrow + } + if (hasUnfinishedJobs) + throw UncompletedCoroutinesError( + "Unfinished coroutines during teardown. Ensure all coroutines are" + + " completed or cancelled by your test." + ) + val jobs = coroutineContext.activeJobs() + if ((jobs - initialJobs).isNotEmpty()) + throw UncompletedCoroutinesError("Test finished with active jobs: $jobs") + } +} + +internal fun CoroutineContext.activeJobs(): Set { + return checkNotNull(this[Job]).children.filter { it.isActive }.toSet() +} + +/** + * A coroutine scope for launching test coroutines using [TestCoroutineDispatcher]. + * + * [createTestCoroutineScope] is a similar function that defaults to [StandardTestDispatcher]. + */ +@Deprecated( + "This constructs a `TestCoroutineScope` with a deprecated `CoroutineDispatcher` by default. " + + "Please use `createTestCoroutineScope` instead.", + ReplaceWith( + "createTestCoroutineScope(TestCoroutineDispatcher() + TestCoroutineExceptionHandler() + context)", + "kotlin.coroutines.EmptyCoroutineContext" + ), + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope(context: CoroutineContext = EmptyCoroutineContext): TestCoroutineScope { + val scheduler = context[TestCoroutineScheduler] ?: TestCoroutineScheduler() + return createTestCoroutineScope(TestCoroutineDispatcher(scheduler) + TestCoroutineExceptionHandler() + context) +} + +/** + * A coroutine scope for launching test coroutines. + * + * It ensures that all the test module machinery is properly initialized. + * * If [context] doesn't define a [TestCoroutineScheduler] for orchestrating the virtual time used for delay-skipping, + * a new one is created, unless either + * - a [TestDispatcher] is provided, in which case [TestDispatcher.scheduler] is used; + * - at the moment of the creation of the scope, [Dispatchers.Main] is delegated to a [TestDispatcher], in which case + * its [TestCoroutineScheduler] is used. + * * If [context] doesn't have a [ContinuationInterceptor], a [StandardTestDispatcher] is created. + * * A [CoroutineExceptionHandler] is created that makes [TestCoroutineScope.cleanupTestCoroutines] throw if there were + * any uncaught exceptions, or forwards the exceptions further in a platform-specific manner if the cleanup was + * already performed when an exception happened. Passing a [CoroutineExceptionHandler] is illegal, unless it's an + * [UncaughtExceptionCaptor], in which case the behavior is preserved for the time being for backward compatibility. + * If you need to have a specific [CoroutineExceptionHandler], please pass it to [launch] on an already-created + * [TestCoroutineScope] and share your use case at + * [our issue tracker](https://github.com/Kotlin/kotlinx.coroutines/issues). + * * If [context] provides a [Job], that job is used for the new scope; otherwise, a [CompletableJob] is created. + * + * @throws IllegalArgumentException if [context] has both [TestCoroutineScheduler] and a [TestDispatcher] linked to a + * different scheduler. + * @throws IllegalArgumentException if [context] has a [ContinuationInterceptor] that is not a [TestDispatcher]. + * @throws IllegalArgumentException if [context] has an [CoroutineExceptionHandler] that is not an + * [UncaughtExceptionCaptor]. + */ +@ExperimentalCoroutinesApi +@Deprecated( + "This function was introduced in order to help migrate from TestCoroutineScope to TestScope. " + + "Please use TestScope() construction instead, or just runTest(), without creating a scope.", + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun createTestCoroutineScope(context: CoroutineContext = EmptyCoroutineContext): TestCoroutineScope { + val ctxWithDispatcher = context.withDelaySkipping() + var scope: TestCoroutineScopeImpl? = null + val ownExceptionHandler = + object : AbstractCoroutineContextElement(CoroutineExceptionHandler), TestCoroutineScopeExceptionHandler { + override fun handleException(context: CoroutineContext, exception: Throwable) { + if (!scope!!.reportException(exception)) + throw exception // let this exception crash everything + } + } + val exceptionHandler = when (val exceptionHandler = ctxWithDispatcher[CoroutineExceptionHandler]) { + is UncaughtExceptionCaptor -> exceptionHandler + null -> ownExceptionHandler + is TestCoroutineScopeExceptionHandler -> ownExceptionHandler + else -> throw IllegalArgumentException( + "A CoroutineExceptionHandler was passed to TestCoroutineScope. " + + "Please pass it as an argument to a `launch` or `async` block on an already-created scope " + + "if uncaught exceptions require special treatment." + ) + } + val job: Job = ctxWithDispatcher[Job] ?: Job() + return TestCoroutineScopeImpl(ctxWithDispatcher + exceptionHandler + job).also { + scope = it + } +} + +/** A marker that shows that this [CoroutineExceptionHandler] was created for [TestCoroutineScope]. With this, + * constructing a new [TestCoroutineScope] with the [CoroutineScope.coroutineContext] of an existing one will override + * the exception handler, instead of failing. */ +private interface TestCoroutineScopeExceptionHandler : CoroutineExceptionHandler + +private inline val CoroutineContext.delayController: DelayController? + get() { + val handler = this[ContinuationInterceptor] + return handler as? DelayController + } + + +/** + * The current virtual time on [testScheduler][TestCoroutineScope.testScheduler]. + * @see TestCoroutineScheduler.currentTime + */ +@ExperimentalCoroutinesApi +public val TestCoroutineScope.currentTime: Long + get() = coroutineContext.delayController?.currentTime ?: testScheduler.currentTime + +/** + * Advances the [testScheduler][TestCoroutineScope.testScheduler] by [delayTimeMillis] and runs the tasks up to that + * moment (inclusive). + * + * @see TestCoroutineScheduler.advanceTimeBy + */ +@ExperimentalCoroutinesApi +@Deprecated( + "The name of this function is misleading: it not only advances the time, but also runs the tasks " + + "scheduled *at* the ending moment.", + ReplaceWith("this.testScheduler.apply { advanceTimeBy(delayTimeMillis); runCurrent() }"), + DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope.advanceTimeBy(delayTimeMillis: Long): Unit = + when (val controller = coroutineContext.delayController) { + null -> { + testScheduler.advanceTimeBy(delayTimeMillis) + testScheduler.runCurrent() + } + else -> { + controller.advanceTimeBy(delayTimeMillis) + Unit + } + } + +/** + * Advances the [testScheduler][TestCoroutineScope.testScheduler] to the point where there are no tasks remaining. + * @see TestCoroutineScheduler.advanceUntilIdle + */ +@ExperimentalCoroutinesApi +public fun TestCoroutineScope.advanceUntilIdle() { + coroutineContext.delayController?.advanceUntilIdle() ?: testScheduler.advanceUntilIdle() +} + +/** + * Run any tasks that are pending at the current virtual time, according to + * the [testScheduler][TestCoroutineScope.testScheduler]. + * + * @see TestCoroutineScheduler.runCurrent + */ +@ExperimentalCoroutinesApi +public fun TestCoroutineScope.runCurrent() { + coroutineContext.delayController?.runCurrent() ?: testScheduler.runCurrent() +} + +@ExperimentalCoroutinesApi +@Deprecated( + "The test coroutine scope isn't able to pause its dispatchers in the general case. " + + "Only `TestCoroutineDispatcher` supports pausing; pause it directly, or use a dispatcher that is always " + + "\"paused\", like `StandardTestDispatcher`.", + ReplaceWith( + "(this.coroutineContext[ContinuationInterceptor]!! as DelayController).pauseDispatcher(block)", + "kotlin.coroutines.ContinuationInterceptor" + ), + DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public suspend fun TestCoroutineScope.pauseDispatcher(block: suspend () -> Unit) { + delayControllerForPausing.pauseDispatcher(block) +} + +@ExperimentalCoroutinesApi +@Deprecated( + "The test coroutine scope isn't able to pause its dispatchers in the general case. " + + "Only `TestCoroutineDispatcher` supports pausing; pause it directly, or use a dispatcher that is always " + + "\"paused\", like `StandardTestDispatcher`.", + ReplaceWith( + "(this.coroutineContext[ContinuationInterceptor]!! as DelayController).pauseDispatcher()", + "kotlin.coroutines.ContinuationInterceptor" + ), + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope.pauseDispatcher() { + delayControllerForPausing.pauseDispatcher() +} + +@ExperimentalCoroutinesApi +@Deprecated( + "The test coroutine scope isn't able to pause its dispatchers in the general case. " + + "Only `TestCoroutineDispatcher` supports pausing; pause it directly, or use a dispatcher that is always " + + "\"paused\", like `StandardTestDispatcher`.", + ReplaceWith( + "(this.coroutineContext[ContinuationInterceptor]!! as DelayController).resumeDispatcher()", + "kotlin.coroutines.ContinuationInterceptor" + ), + level = DeprecationLevel.WARNING +) +// Since 1.6.0, ERROR in 1.7.0 and removed as experimental in 1.8.0 +public fun TestCoroutineScope.resumeDispatcher() { + delayControllerForPausing.resumeDispatcher() +} + +/** + * List of uncaught coroutine exceptions, for backward compatibility. + * + * The returned list is a copy of the exceptions caught during execution. + * During [TestCoroutineScope.cleanupTestCoroutines] the first element of this list is rethrown if it is not empty. + * + * Exceptions are only collected in this list if the [UncaughtExceptionCaptor] is in the test context. + */ +@Deprecated( + "This list is only populated if `UncaughtExceptionCaptor` is in the test context, and so can be " + + "easily misused. It is only present for backward compatibility and will be removed in the subsequent " + + "releases. If you need to check the list of exceptions, please consider creating your own " + + "`CoroutineExceptionHandler`.", + level = DeprecationLevel.WARNING +) +public val TestCoroutineScope.uncaughtExceptions: List + get() = (coroutineContext[CoroutineExceptionHandler] as? UncaughtExceptionCaptor)?.uncaughtExceptions + ?: emptyList() + +private val TestCoroutineScope.delayControllerForPausing: DelayController + get() = coroutineContext.delayController + ?: throw IllegalStateException("This scope isn't able to pause its dispatchers") diff --git a/kotlinx-coroutines-test/jvm/test/HelpersJvm.kt b/kotlinx-coroutines-test/jvm/test/HelpersJvm.kt new file mode 100644 index 0000000000..e9aa3ff747 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/HelpersJvm.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines.test + +actual fun testResultMap(block: (() -> Unit) -> Unit, test: () -> TestResult) { + block { + test() + } +} diff --git a/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt b/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt index d06f2a35c6..90a16d0622 100644 --- a/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt +++ b/kotlinx-coroutines-test/jvm/test/MultithreadingTest.kt @@ -4,13 +4,14 @@ import kotlinx.coroutines.* import kotlinx.coroutines.test.* +import kotlin.concurrent.* import kotlin.coroutines.* import kotlin.test.* -class MultithreadingTest : TestBase() { +class MultithreadingTest { @Test - fun incorrectlyCalledRunblocking_doesNotHaveSameInterceptor() = runBlockingTest { + fun incorrectlyCalledRunBlocking_doesNotHaveSameInterceptor() = runBlockingTest { // this code is an error as a production test, please do not use this as an example // this test exists to document this error condition, if it's possible to make this code work please update @@ -22,7 +23,7 @@ class MultithreadingTest : TestBase() { } @Test - fun testSingleThreadExecutor() = runTest { + fun testSingleThreadExecutor() = runBlocking { val mainThread = Thread.currentThread() Dispatchers.setMain(Dispatchers.Unconfined) newSingleThreadContext("testSingleThread").use { threadPool -> @@ -86,4 +87,26 @@ class MultithreadingTest : TestBase() { assertEquals(3, deferred.await()) } } -} \ No newline at end of file + + /** Tests that resuming the coroutine of [runTest] asynchronously in reasonable time succeeds. */ + @Test + fun testResumingFromAnotherThread() = runTest { + suspendCancellableCoroutine { cont -> + thread { + Thread.sleep(10) + cont.resume(Unit) + } + } + } + + /** Tests that [StandardTestDispatcher] is confined to the thread that interacts with the scheduler. */ + @Test + fun testStandardTestDispatcherIsConfined() = runTest { + val initialThread = Thread.currentThread() + withContext(Dispatchers.IO) { + val ioThread = Thread.currentThread() + assertNotSame(initialThread, ioThread) + } + assertEquals(initialThread, Thread.currentThread()) + } +} diff --git a/kotlinx-coroutines-test/jvm/test/RunTestStressTest.kt b/kotlinx-coroutines-test/jvm/test/RunTestStressTest.kt new file mode 100644 index 0000000000..3edaa48fbd --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/RunTestStressTest.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.concurrent.* +import kotlin.coroutines.* +import kotlin.test.* + +class RunTestStressTest { + /** Tests that notifications about asynchronous resumptions aren't lost. */ + @Test + fun testRunTestActivityNotificationsRace() { + val n = 1_000 * stressTestMultiplier + for (i in 0 until n) { + runTest { + suspendCancellableCoroutine { cont -> + thread { + cont.resume(Unit) + } + } + } + } + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt b/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt new file mode 100644 index 0000000000..174baa0819 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt @@ -0,0 +1,165 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlin.test.* + +/** Copy of [RunTestTest], but for [runBlockingTestOnTestScope], where applicable. */ +@Suppress("DEPRECATION") +class RunBlockingTestOnTestScopeTest { + + @Test + fun testRunTestWithIllegalContext() { + for (ctx in TestScopeTest.invalidContexts) { + assertFailsWith { + runBlockingTestOnTestScope(ctx) { } + } + } + } + + @Test + fun testThrowingInRunTestBody() { + assertFailsWith { + runBlockingTestOnTestScope { + throw RuntimeException() + } + } + } + + @Test + fun testThrowingInRunTestPendingTask() { + assertFailsWith { + runBlockingTestOnTestScope { + launch { + delay(SLOW) + throw RuntimeException() + } + } + } + } + + @Test + fun reproducer2405() = runBlockingTestOnTestScope { + val dispatcher = StandardTestDispatcher(testScheduler) + var collectedError = false + withContext(dispatcher) { + flow { emit(1) } + .combine( + flow { throw IllegalArgumentException() } + ) { int, string -> int.toString() + string } + .catch { emit("error") } + .collect { + assertEquals("error", it) + collectedError = true + } + } + assertTrue(collectedError) + } + + @Test + fun testChildrenCancellationOnTestBodyFailure() { + var job: Job? = null + assertFailsWith { + runBlockingTestOnTestScope { + job = launch { + while (true) { + delay(1000) + } + } + throw AssertionError() + } + } + assertTrue(job!!.isCancelled) + } + + @Test + fun testTimeout() { + assertFailsWith { + runBlockingTestOnTestScope { + withTimeout(50) { + launch { + delay(1000) + } + } + } + } + } + + @Test + fun testRunTestThrowsRootCause() { + assertFailsWith { + runBlockingTestOnTestScope { + launch { + throw TestException() + } + } + } + } + + @Test + fun testCompletesOwnJob() { + var handlerCalled = false + runBlockingTestOnTestScope { + coroutineContext.job.invokeOnCompletion { + handlerCalled = true + } + } + assertTrue(handlerCalled) + } + + @Test + fun testDoesNotCompleteGivenJob() { + var handlerCalled = false + val job = Job() + job.invokeOnCompletion { + handlerCalled = true + } + runBlockingTestOnTestScope(job) { + assertTrue(coroutineContext.job in job.children) + } + assertFalse(handlerCalled) + assertEquals(0, job.children.filter { it.isActive }.count()) + } + + @Test + fun testSuppressedExceptions() { + try { + runBlockingTestOnTestScope { + launch(SupervisorJob()) { throw TestException("x") } + launch(SupervisorJob()) { throw TestException("y") } + launch(SupervisorJob()) { throw TestException("z") } + throw TestException("w") + } + fail("should not be reached") + } catch (e: TestException) { + assertEquals("w", e.message) + val suppressed = e.suppressedExceptions + + (e.suppressedExceptions.firstOrNull()?.suppressedExceptions ?: emptyList()) + assertEquals(3, suppressed.size) + assertEquals("x", suppressed[0].message) + assertEquals("y", suppressed[1].message) + assertEquals("z", suppressed[2].message) + } + } + + @Test + fun testScopeRunTestExceptionHandler(): TestResult { + val scope = TestCoroutineScope() + return testResultMap({ + try { + it() + fail("should not be reached") + } catch (e: TestException) { + // expected + } + }) { + scope.runTest { + launch(SupervisorJob()) { throw TestException("x") } + } + } + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/jvm/test/migration/RunTestLegacyScopeTest.kt b/kotlinx-coroutines-test/jvm/test/migration/RunTestLegacyScopeTest.kt new file mode 100644 index 0000000000..a76263ddd2 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/migration/RunTestLegacyScopeTest.kt @@ -0,0 +1,277 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* +import kotlin.coroutines.* +import kotlin.test.* + +/** Copy of [RunTestTest], but for [TestCoroutineScope] */ +@Suppress("DEPRECATION") +class RunTestLegacyScopeTest { + + @Test + fun testWithContextDispatching() = runTestWithLegacyScope { + var counter = 0 + withContext(Dispatchers.Default) { + counter += 1 + } + assertEquals(counter, 1) + } + + @Test + fun testJoiningForkedJob() = runTestWithLegacyScope { + var counter = 0 + val job = GlobalScope.launch { + counter += 1 + } + job.join() + assertEquals(counter, 1) + } + + @Test + fun testSuspendCoroutine() = runTestWithLegacyScope { + val answer = suspendCoroutine { + it.resume(42) + } + assertEquals(42, answer) + } + + @Test + fun testNestedRunTestForbidden() = runTestWithLegacyScope { + assertFailsWith { + runTest { } + } + } + + @Test + fun testRunTestWithZeroTimeoutWithControlledDispatches() = runTestWithLegacyScope(dispatchTimeoutMs = 0) { + // below is some arbitrary concurrent code where all dispatches go through the same scheduler. + launch { + delay(2000) + } + val deferred = async { + val job = launch(StandardTestDispatcher(testScheduler)) { + launch { + delay(500) + } + delay(1000) + } + job.join() + } + deferred.await() + } + + @Test + fun testRunTestWithZeroTimeoutWithUncontrolledDispatches() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTestWithLegacyScope(dispatchTimeoutMs = 0) { + withContext(Dispatchers.Default) { + delay(10) + 3 + } + fail("shouldn't be reached") + } + } + + @Test + fun testRunTestWithSmallTimeout() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTestWithLegacyScope(dispatchTimeoutMs = 100) { + withContext(Dispatchers.Default) { + delay(10000) + 3 + } + fail("shouldn't be reached") + } + } + + @Test + fun testRunTestWithLargeTimeout() = runTestWithLegacyScope(dispatchTimeoutMs = 5000) { + withContext(Dispatchers.Default) { + delay(50) + } + } + + @Test + fun testRunTestTimingOutAndThrowing() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTestWithLegacyScope(dispatchTimeoutMs = 1) { + coroutineContext[CoroutineExceptionHandler]!!.handleException(coroutineContext, IllegalArgumentException()) + withContext(Dispatchers.Default) { + delay(10000) + 3 + } + fail("shouldn't be reached") + } + } + + @Test + fun testRunTestWithIllegalContext() { + for (ctx in TestScopeTest.invalidContexts) { + assertFailsWith { + runTestWithLegacyScope(ctx) { } + } + } + } + + @Test + fun testThrowingInRunTestBody() = testResultMap({ + assertFailsWith { it() } + }) { + runTestWithLegacyScope { + throw RuntimeException() + } + } + + @Test + fun testThrowingInRunTestPendingTask() = testResultMap({ + assertFailsWith { it() } + }) { + runTestWithLegacyScope { + launch { + delay(SLOW) + throw RuntimeException() + } + } + } + + @Test + fun reproducer2405() = runTestWithLegacyScope { + val dispatcher = StandardTestDispatcher(testScheduler) + var collectedError = false + withContext(dispatcher) { + flow { emit(1) } + .combine( + flow { throw IllegalArgumentException() } + ) { int, string -> int.toString() + string } + .catch { emit("error") } + .collect { + assertEquals("error", it) + collectedError = true + } + } + assertTrue(collectedError) + } + + @Test + fun testChildrenCancellationOnTestBodyFailure(): TestResult { + var job: Job? = null + return testResultMap({ + assertFailsWith { it() } + assertTrue(job!!.isCancelled) + }) { + runTestWithLegacyScope { + job = launch { + while (true) { + delay(1000) + } + } + throw AssertionError() + } + } + } + + @Test + fun testTimeout() = testResultMap({ + assertFailsWith { it() } + }) { + runTestWithLegacyScope { + withTimeout(50) { + launch { + delay(1000) + } + } + } + } + + @Test + fun testRunTestThrowsRootCause() = testResultMap({ + assertFailsWith { it() } + }) { + runTestWithLegacyScope { + launch { + throw TestException() + } + } + } + + @Test + fun testCompletesOwnJob(): TestResult { + var handlerCalled = false + return testResultMap({ + it() + assertTrue(handlerCalled) + }) { + runTestWithLegacyScope { + coroutineContext.job.invokeOnCompletion { + handlerCalled = true + } + } + } + } + + @Test + fun testDoesNotCompleteGivenJob(): TestResult { + var handlerCalled = false + val job = Job() + job.invokeOnCompletion { + handlerCalled = true + } + return testResultMap({ + it() + assertFalse(handlerCalled) + assertEquals(0, job.children.filter { it.isActive }.count()) + }) { + runTestWithLegacyScope(job) { + assertTrue(coroutineContext.job in job.children) + } + } + } + + @Test + fun testSuppressedExceptions() = testResultMap({ + try { + it() + fail("should not be reached") + } catch (e: TestException) { + assertEquals("w", e.message) + val suppressed = e.suppressedExceptions + + (e.suppressedExceptions.firstOrNull()?.suppressedExceptions ?: emptyList()) + assertEquals(3, suppressed.size) + assertEquals("x", suppressed[0].message) + assertEquals("y", suppressed[1].message) + assertEquals("z", suppressed[2].message) + } + }) { + runTestWithLegacyScope { + launch(SupervisorJob()) { throw TestException("x") } + launch(SupervisorJob()) { throw TestException("y") } + launch(SupervisorJob()) { throw TestException("z") } + throw TestException("w") + } + } + + @Test + fun testScopeRunTestExceptionHandler(): TestResult { + val scope = TestCoroutineScope() + return testResultMap({ + try { + it() + fail("should not be reached") + } catch (e: TestException) { + // expected + } + }) { + scope.runTest { + launch(SupervisorJob()) { throw TestException("x") } + } + } + } +} diff --git a/kotlinx-coroutines-test/common/test/TestBuildersTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestBuildersTest.kt similarity index 97% rename from kotlinx-coroutines-test/common/test/TestBuildersTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestBuildersTest.kt index a3167e5876..6d49a01fa4 100644 --- a/kotlinx-coroutines-test/common/test/TestBuildersTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestBuildersTest.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.* import kotlin.coroutines.* import kotlin.test.* +@Suppress("DEPRECATION") class TestBuildersTest { @Test @@ -104,7 +105,7 @@ class TestBuildersTest { } @Test - fun whenInrunBlocking_runBlockingTest_nestsProperly() { + fun whenInRunBlocking_runBlockingTest_nestsProperly() { // this is not a supported use case, but it is possible so ensure it works val scope = TestCoroutineScope() diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherOrderTest.kt similarity index 70% rename from kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherOrderTest.kt index e54ba21568..93fcd909cc 100644 --- a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherOrderTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherOrderTest.kt @@ -8,20 +8,8 @@ import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlin.test.* -class TestCoroutineDispatcherOrderTest { - - private val actionIndex = atomic(0) - private val finished = atomic(false) - - private fun expect(index: Int) { - val wasIndex = actionIndex.incrementAndGet() - check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } - } - - private fun finish(index: Int) { - expect(index) - check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } - } +@Suppress("DEPRECATION") +class TestCoroutineDispatcherOrderTest: OrderedExecutionTestBase() { @Test fun testAdvanceTimeBy_progressesOnEachDelay() { diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherTest.kt similarity index 63% rename from kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherTest.kt index baf946f2e1..a78d923d34 100644 --- a/kotlinx-coroutines-test/common/test/TestCoroutineDispatcherTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineDispatcherTest.kt @@ -7,37 +7,10 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* import kotlin.test.* +@Suppress("DEPRECATION") class TestCoroutineDispatcherTest { @Test - fun whenStringCalled_itReturnsString() { - val subject = TestCoroutineDispatcher() - assertEquals("TestCoroutineDispatcher[currentTime=0ms, queued=0]", subject.toString()) - } - - @Test - fun whenStringCalled_itReturnsCurrentTime() { - val subject = TestCoroutineDispatcher() - subject.advanceTimeBy(1000) - assertEquals("TestCoroutineDispatcher[currentTime=1000ms, queued=0]", subject.toString()) - } - - @Test - fun whenStringCalled_itShowsQueuedJobs() { - val subject = TestCoroutineDispatcher() - val scope = TestCoroutineScope(subject) - scope.pauseDispatcher() - scope.launch { - delay(1_000) - } - assertEquals("TestCoroutineDispatcher[currentTime=0ms, queued=1]", subject.toString()) - scope.advanceTimeBy(50) - assertEquals("TestCoroutineDispatcher[currentTime=50ms, queued=1]", subject.toString()) - scope.advanceUntilIdle() - assertEquals("TestCoroutineDispatcher[currentTime=1000ms, queued=0]", subject.toString()) - } - - @Test - fun whenDispatcherPaused_doesntAutoProgressCurrent() { + fun whenDispatcherPaused_doesNotAutoProgressCurrent() { val subject = TestCoroutineDispatcher() subject.pauseDispatcher() val scope = CoroutineScope(subject) diff --git a/kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineExceptionHandlerTest.kt similarity index 82% rename from kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestCoroutineExceptionHandlerTest.kt index 674fd288dd..20da130725 100644 --- a/kotlinx-coroutines-test/common/test/TestCoroutineExceptionHandlerTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineExceptionHandlerTest.kt @@ -1,11 +1,12 @@ /* - * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.test import kotlin.test.* +@Suppress("DEPRECATION") class TestCoroutineExceptionHandlerTest { @Test fun whenExceptionsCaught_availableViaProperty() { diff --git a/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineScopeTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineScopeTest.kt new file mode 100644 index 0000000000..1a62613790 --- /dev/null +++ b/kotlinx-coroutines-test/jvm/test/migration/TestCoroutineScopeTest.kt @@ -0,0 +1,217 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +@file:Suppress("DEPRECATION") + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.coroutines.* +import kotlin.test.* + +class TestCoroutineScopeTest { + /** Tests failing to create a [TestCoroutineScope] with incorrect contexts. */ + @Test + fun testCreateThrowsOnInvalidArguments() { + for (ctx in invalidContexts) { + assertFailsWith { + createTestCoroutineScope(ctx) + } + } + } + + /** Tests that a newly-created [TestCoroutineScope] provides the correct scheduler. */ + @Test + fun testCreateProvidesScheduler() { + // Creates a new scheduler. + run { + val scope = createTestCoroutineScope() + assertNotNull(scope.coroutineContext[TestCoroutineScheduler]) + } + // Reuses the scheduler that the dispatcher is linked to. + run { + val dispatcher = StandardTestDispatcher() + val scope = createTestCoroutineScope(dispatcher) + assertSame(dispatcher.scheduler, scope.coroutineContext[TestCoroutineScheduler]) + } + // Uses the scheduler passed to it. + run { + val scheduler = TestCoroutineScheduler() + val scope = createTestCoroutineScope(scheduler) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertSame(scheduler, (scope.coroutineContext[ContinuationInterceptor] as TestDispatcher).scheduler) + } + // Doesn't touch the passed dispatcher and the scheduler if they match. + run { + val scheduler = TestCoroutineScheduler() + val dispatcher = StandardTestDispatcher(scheduler) + val scope = createTestCoroutineScope(scheduler + dispatcher) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertSame(dispatcher, scope.coroutineContext[ContinuationInterceptor]) + } + // Reuses the scheduler of `Dispatchers.Main` + run { + val scheduler = TestCoroutineScheduler() + val mainDispatcher = StandardTestDispatcher(scheduler) + Dispatchers.setMain(mainDispatcher) + try { + val scope = createTestCoroutineScope() + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher, scope.coroutineContext[ContinuationInterceptor]) + } finally { + Dispatchers.resetMain() + } + } + // Does not reuse the scheduler of `Dispatchers.Main` if one is explicitly passed + run { + val mainDispatcher = StandardTestDispatcher() + Dispatchers.setMain(mainDispatcher) + try { + val scheduler = TestCoroutineScheduler() + val scope = createTestCoroutineScope(scheduler) + assertSame(scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher.scheduler, scope.coroutineContext[TestCoroutineScheduler]) + assertNotSame(mainDispatcher, scope.coroutineContext[ContinuationInterceptor]) + } finally { + Dispatchers.resetMain() + } + } + } + + /** Tests that the cleanup procedure throws if there were uncompleted delays by the end. */ + @Test + fun testPresentDelaysThrowing() { + val scope = createTestCoroutineScope() + var result = false + scope.launch { + delay(5) + result = true + } + assertFalse(result) + assertFailsWith { scope.cleanupTestCoroutines() } + assertFalse(result) + } + + /** Tests that the cleanup procedure throws if there were active jobs by the end. */ + @Test + fun testActiveJobsThrowing() { + val scope = createTestCoroutineScope() + var result = false + val deferred = CompletableDeferred() + scope.launch { + deferred.await() + result = true + } + assertFalse(result) + assertFailsWith { scope.cleanupTestCoroutines() } + assertFalse(result) + } + + /** Tests that the cleanup procedure doesn't throw if it detects that the job is already cancelled. */ + @Test + fun testCancelledDelaysNotThrowing() { + val scope = createTestCoroutineScope() + var result = false + val deferred = CompletableDeferred() + val job = scope.launch { + deferred.await() + result = true + } + job.cancel() + assertFalse(result) + scope.cleanupTestCoroutines() + assertFalse(result) + } + + /** Tests that uncaught exceptions are thrown at the cleanup. */ + @Test + fun testThrowsUncaughtExceptionsOnCleanup() { + val scope = createTestCoroutineScope() + val exception = TestException("test") + scope.launch { + throw exception + } + assertFailsWith { + scope.cleanupTestCoroutines() + } + } + + /** Tests that uncaught exceptions take priority over uncompleted jobs when throwing on cleanup. */ + @Test + fun testUncaughtExceptionsPrioritizedOnCleanup() { + val scope = createTestCoroutineScope() + val exception = TestException("test") + scope.launch { + throw exception + } + scope.launch { + delay(1000) + } + assertFailsWith { + scope.cleanupTestCoroutines() + } + } + + /** Tests that cleaning up twice is forbidden. */ + @Test + fun testClosingTwice() { + val scope = createTestCoroutineScope() + scope.cleanupTestCoroutines() + assertFailsWith { + scope.cleanupTestCoroutines() + } + } + + /** Tests that, when reporting several exceptions, the first one is thrown, with the rest suppressed. */ + @Test + fun testSuppressedExceptions() { + createTestCoroutineScope().apply { + launch(SupervisorJob()) { throw TestException("x") } + launch(SupervisorJob()) { throw TestException("y") } + launch(SupervisorJob()) { throw TestException("z") } + try { + cleanupTestCoroutines() + fail("should not be reached") + } catch (e: TestException) { + assertEquals("x", e.message) + assertEquals(2, e.suppressedExceptions.size) + assertEquals("y", e.suppressedExceptions[0].message) + assertEquals("z", e.suppressedExceptions[1].message) + } + } + } + + /** Tests that constructing a new [TestCoroutineScope] using another one's scope works and overrides the exception + * handler. */ + @Test + fun testCopyingContexts() { + val deferred = CompletableDeferred() + val scope1 = createTestCoroutineScope() + scope1.launch { deferred.await() } // a pending job in the outer scope + val scope2 = createTestCoroutineScope(scope1.coroutineContext) + val scope3 = createTestCoroutineScope(scope1.coroutineContext) + assertEquals( + scope1.coroutineContext.minusKey(CoroutineExceptionHandler), + scope2.coroutineContext.minusKey(CoroutineExceptionHandler)) + scope2.launch(SupervisorJob()) { throw TestException("x") } // will fail the cleanup of scope2 + try { + scope2.cleanupTestCoroutines() + fail("should not be reached") + } catch (e: TestException) { } + scope3.cleanupTestCoroutines() // the pending job in the outer scope will not cause this to fail + try { + scope1.cleanupTestCoroutines() + fail("should not be reached") + } catch (e: UncompletedCoroutinesError) { + // the pending job in the outer scope + } + } + + companion object { + internal val invalidContexts = listOf( + Dispatchers.Default, // not a [TestDispatcher] + CoroutineExceptionHandler { _, _ -> }, // not an [UncaughtExceptionCaptor] + StandardTestDispatcher() + TestCoroutineScheduler(), // the dispatcher is not linked to the scheduler + ) + } +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingOrderTest.kt similarity index 76% rename from kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingOrderTest.kt index 5d94bd2866..32514d90e8 100644 --- a/kotlinx-coroutines-test/common/test/TestRunBlockingOrderTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingOrderTest.kt @@ -4,24 +4,11 @@ package kotlinx.coroutines.test -import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlin.test.* -class TestRunBlockingOrderTest { - - private val actionIndex = atomic(0) - private val finished = atomic(false) - - private fun expect(index: Int) { - val wasIndex = actionIndex.incrementAndGet() - check(index == wasIndex) { "Expecting action index $index but it is actually $wasIndex" } - } - - private fun finish(index: Int) { - expect(index) - check(!finished.getAndSet(true)) { "Should call 'finish(...)' at most once" } - } +@Suppress("DEPRECATION") +class TestRunBlockingOrderTest: OrderedExecutionTestBase() { @Test fun testLaunchImmediate() = runBlockingTest { @@ -90,4 +77,4 @@ class TestRunBlockingOrderTest { } finish(2) } -} +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt b/kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingTest.kt similarity index 98% rename from kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt rename to kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingTest.kt index c93b50811f..af3b24892a 100644 --- a/kotlinx-coroutines-test/common/test/TestRunBlockingTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/TestRunBlockingTest.kt @@ -7,6 +7,7 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* import kotlin.test.* +@Suppress("DEPRECATION") class TestRunBlockingTest { @Test @@ -128,7 +129,6 @@ class TestRunBlockingTest { @Test fun whenUsingTimeout_inAsync_doesNotTriggerWhenNotDelayed() = runBlockingTest { - val testScope = this val deferred = async { withTimeout(SLOW) { delay(0) @@ -195,7 +195,7 @@ class TestRunBlockingTest { assertRunsFast { job.join() - throw job.getCancellationException().cause ?: assertFails { "expected exception" } + throw job.getCancellationException().cause ?: AssertionError("expected exception") } } } @@ -235,12 +235,13 @@ class TestRunBlockingTest { fun callingAsyncFunction_executesAsyncBlockImmediately() = runBlockingTest { assertRunsFast { var executed = false - async { + val deferred = async { delay(SLOW) executed = true } advanceTimeBy(SLOW) + assertTrue(deferred.isCompleted) assertTrue(executed) } } @@ -366,7 +367,7 @@ class TestRunBlockingTest { runBlockingTest { val expectedError = TestException("hello") - val job = launch { + launch { throw expectedError } @@ -436,6 +437,4 @@ class TestRunBlockingTest { } } } -} - -private class TestException(message: String? = null): Exception(message) \ No newline at end of file +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/native/src/TestBuilders.kt b/kotlinx-coroutines-test/native/src/TestBuilders.kt new file mode 100644 index 0000000000..c3176a03de --- /dev/null +++ b/kotlinx-coroutines-test/native/src/TestBuilders.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test +import kotlinx.coroutines.* + +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + +internal actual fun createTestResult(testProcedure: suspend () -> Unit) { + runBlocking { + testProcedure() + } +} diff --git a/kotlinx-coroutines-test/native/src/TestMainDispatcher.kt b/kotlinx-coroutines-test/native/src/internal/TestMainDispatcher.kt similarity index 100% rename from kotlinx-coroutines-test/native/src/TestMainDispatcher.kt rename to kotlinx-coroutines-test/native/src/internal/TestMainDispatcher.kt diff --git a/kotlinx-coroutines-test/native/test/FailingTests.kt b/kotlinx-coroutines-test/native/test/FailingTests.kt new file mode 100644 index 0000000000..9fb77ce7c8 --- /dev/null +++ b/kotlinx-coroutines-test/native/test/FailingTests.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test + +import kotlinx.coroutines.* +import kotlin.test.* + +/** These are tests that we want to fail. They are here so that, when the issue is fixed, their failure indicates that + * everything is better now. */ +class FailingTests { + @Test + fun testRunTestLoopShutdownOnTimeout() = testResultMap({ fn -> + assertFailsWith { fn() } + }) { + runTest(dispatchTimeoutMs = 1) { + withContext(Dispatchers.Default) { + delay(10000) + } + fail("shouldn't be reached") + } + } + +} \ No newline at end of file diff --git a/kotlinx-coroutines-test/native/test/Helpers.kt b/kotlinx-coroutines-test/native/test/Helpers.kt index 28cc28ca00..ef478b7eb1 100644 --- a/kotlinx-coroutines-test/native/test/Helpers.kt +++ b/kotlinx-coroutines-test/native/test/Helpers.kt @@ -5,4 +5,10 @@ package kotlinx.coroutines.test import kotlin.test.* +actual fun testResultMap(block: (() -> Unit) -> Unit, test: () -> TestResult) { + block { + test() + } +} + actual typealias NoNative = Ignore From b14564195d27e0b03a21422a5f36c2e1be3e1687 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Sun, 21 Nov 2021 22:11:10 +0300 Subject: [PATCH 197/328] Version 1.6.0-RC --- CHANGES.md | 48 ++++++++++++++++++++++++++++++ README.md | 14 ++++----- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 59 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 611e9c9c74..17805e5b7b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,53 @@ # Change log for kotlinx.coroutines +## Version 1.6.0-RC + +### kotlinx-coroutines-test rework + +* `kotlinx-coroutines-test` became a multiplatform library usable from K/JVM, K/JS, and K/N. +* Its API was completely reworked to address long-standing issues with consistency, structured concurrency and correctness (#1203, #1609, #2379, #1749, #1204, #1390, #1222, #1395, #1881, #1910, #1772, #1626, #1742, #2082, #2102, #2405, #2462 + ). +* The old API is deprecated for removal, but the new API is based on the similar concepts ([README](kotlinx-coroutines-test/README.md)), and the migration path is designed to be graceful: [migration guide](kotlinx-coroutines-test/MIGRATION.md) + +### Dispatchers + +* * Introduced `CoroutineDispatcher.limitedParallelism` that allows obtaining a view of the original dispatcher with limited parallelism (#2919). +* `Dispatchers.IO.limitedParallelism` usages ignore the bound on the parallelism level of `Dispatchers.IO` itself to avoid starvation (#2943). +* Introduced new `Dispatchers.shutdown` method for containerized environments (#2558). +* `newSingleThreadContext` and `newFixedThreadPoolContext` are promoted to delicate API (#2919). + +### Breaking changes + +* When racing with cancellation, the `future` builder no longer reports unhandled exceptions into the global `CoroutineExceptionHandler`. Thanks @vadimsemenov! (#2774, #2791). +* `Mutex.onLock` is deprecated for removal (#2794). +* `Dispatchers.Main` is now used as the default source of time for `delay` and `withTimeout` when present(#2972). + * To opt-out from this behaviour, `kotlinx.coroutines.main.delay` system property can be set to `false`. +* Java target of coroutines build is now 8 instead of 6 (#1589). + +### Bug fixes and improvements + +* Kotlin is updated to 1.6.0. +* Kotlin/Native [new memory model](https://blog.jetbrains.com/kotlin/2021/08/try-the-new-kotlin-native-memory-manager-development-preview/) is now supported in regular builds of coroutines conditionally depending on whether `kotlin.native.binary.memoryModel` is enabled (#2914). +* Introduced `CopyableThreadContextElement` for mutable context elements shared among multiple coroutines. Thanks @yorickhenning! (#2893). +* `transformWhile`, `awaitClose`, `ProducerScope`, `merge`, `runningFold`, `runingReduce`, and `scan` are promoted to stable API (#2971). +* `SharedFlow.subscriptionCount` no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871). +* `Flow` exception transparency mechanism is improved to be more exception-friendly (#3017, #2860). +* Cancellation from `flat*` operators that leverage multiple coroutines is no longer propagated upstream (#2964). +* `SharedFlow.collect` now returns `Nothing` (#2789, #2502). +* `FlowCollector` is now `fun interface`, and corresponding inline extension is removed (#2790). +* Deprecation level of all previously deprecated signatures is raised (#3024). +* The version file is shipped with each JAR as a resource (#2941). +* Unhandled exceptions on K/N are passed to the standard library function `processUnhandledException` (#2981). +* A direct executor is used for `Task` callbacks in `kotlinx-coroutines-play-services` (#2990). +* Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865). +* Default `CoroutineExceptionHandler` is loaded eagerly and does not invoke `ServiceLoader` on its exception-handling path (#2552). +* Fixed the R8 rules for `ServiceLoader` optimization (#2880). +* Fixed BlockHound integration false-positives (#2894, #2866, #2937). +* The exception recovery mechanism now uses `ClassValue` when available (#2997). +* JNA is updated to 5.9.0 to support Apple M1 (#3001). +* Obsolete method on internal `Delay` interface is deprecated (#2979). +* Support of deprecated `CommonPool` is removed. + ## Version 1.5.2 * Kotlin is updated to 1.5.30. diff --git a/README.md b/README.md index f1a80d41fb..91cbf5362f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.5.2/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.0-RC)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.0-RC/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.5.2 + 1.6.0-RC ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-RC' } ``` @@ -127,7 +127,7 @@ Add dependencies (you can also add other modules that you need): ```groovy dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-RC") } ``` @@ -147,7 +147,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```groovy -implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2' +implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0-RC' ``` This gives you access to the Android [Dispatchers.Main] @@ -180,7 +180,7 @@ In common code that should get compiled for different platforms, you can add a d ```groovy commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-RC") } } ``` @@ -192,7 +192,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.5.2/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.0-RC/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index db8a8e19f7..1d64c83611 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.5.2-SNAPSHOT +version=1.6.0-RC-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.0 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index cd71f580f0..e02db4c93d 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.5.2.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.0-RC.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 54450b1e82..91d2b07652 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -26,7 +26,7 @@ Provided [TestDispatcher] implementations: Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0-RC' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index 71b2d69c5c..5b5522beae 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0-RC" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From f8935d481cd3fc345112cd69899bc93107936780 Mon Sep 17 00:00:00 2001 From: Danil Pavlov Date: Mon, 22 Nov 2021 20:41:57 +0300 Subject: [PATCH 198/328] update: new screenshots and UI changes for IDEA 2021.3 --- docs/images/coroutine-breakpoint.png | Bin 106968 -> 116316 bytes docs/images/coroutine-idea-debugging-1.png | Bin 248706 -> 329126 bytes docs/images/flow-breakpoint.png | Bin 111598 -> 114426 bytes docs/images/flow-build-project.png | Bin 44472 -> 70187 bytes docs/images/flow-debug-project.png | Bin 44199 -> 80132 bytes docs/topics/debug-coroutines-with-idea.md | 4 ++-- docs/topics/debug-flow-with-idea.md | 6 +++--- 7 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/images/coroutine-breakpoint.png b/docs/images/coroutine-breakpoint.png index b547e77da6c03a63182bbed4c5be4100d0eff288..d0e34e89c0186d6e1ffa15f39202ff7fd7f3ea21 100644 GIT binary patch literal 116316 zcmeEuby$?qwmu?Ai69{gNH+qCbSog;-67o)149Z53P?zIcXtkq2nqrN(lNkD=MY2p z@8g_%&bi*Jf8PIoKF>TeeD3+az1LoQ?e)Iv-4m*+EQ60rj*EtdhA$^8rH+P%NrQ%l zo`!t~xN_1$@)>x$<)$w460Kr@avk`?%Tia)N=XTg4fu?WhH;A=4fCc6@DjU4@$b*C zZn2=<{>OE6G_()4Xc+(1Mj3d&`4cQN(yohs`Dz%JwKOZN75nUSn}ZamLK^ zk>@+}wrsPS&a>OaXB#s<4UfeAFRVIg&~9N%prI4KMZ@?XAM*kwf_dWPKL6pr{_6{r zf$|xWs{`qmYzo*Gl!42AiPnaxwom`(jc!`A^kG=_C(SDp5cJge#tZWQ<(Y9$Z(;Nh zwWDbg{JB?wHHv7rYMz)F4dDN&%fOQuZyLPkLK~C(;EZn#q`ti@x~3VL;BuP@ZGKPc{;Xy_UWOXcU{Sk_?qi?MNEX6a(|4AY5K z7`2W!Oj%JJKYD5^k>RD3AtLzMdZy_OxR+R|&ios0>v}=z)@CKNLB|-(=-njSAbz?; z?6VNc?69}+4b0}ezXEHpf|0|k%p^00R~d)W!26D~XNO?9jbRq#%qbo!E#v*4T_#zE z28nKAd!O3FmZ1gQx)>=O({OpUhWac+CAWpUs+0SUSFT|lv6`fm>Y;1CLxTP%3(M07 z%C9?Vei-La%pA7TC{*SJ^K7@DZ?mR0*p0FIpnfoGPz`Pd;*zpWCOvzd)@U|XqP3sG zQN9jI+DHs8FMIRujL&)w-Jsevo|snH)4^GbO(&8=dm;CIZ+xk?0gQaC-0af3dVLb- zPfw?bKE)W`zNMFPUv&4&Z9zWgUtacMUv_49kubLdSA&2|NE~(1n`-Mz;`x7zu3NuS&Nq-iW)94S!hQyH2XUSWD!VFK*{i^=UVv4 ztX*v`t&vPby*zgEQ?|MmV3UaY`sx^(8e+$9Ki(gji&BIvgt2d>d(QpP z_B8fXOcNLyy^3eoNy%|B0Zmy}M5gfCx16$QMNU^Z`e_E3al~V@?(Maj4#;qct?)>- zRyop$|8XHotkbG`eJeglQ)t&;cvpFGj<{C78+eb5W=Cr3aKeOoE?sxxO=v`6hIa|Y zfXM6bcMTdGlG`qi;G8hGLD59nRCsS;roY`WA^^%^(mrD~n1SpS+$hR5e|c6=G(-RDlMCEB-6H`$-mYD)PnuWa0A7%i4UJ;It)?Ye zcb~eJ_BGa@`pZ&_(OZtz+<8xUa!7{S(QT!_dQj~A$vV2dZbOK*{aOumNm?AuWYf{K zJu=m~z53SeI|4f|0xp^sBWt&3ThC!49AlBti)AkDVs&lBEd6@BsoW^B4HTP~lE2cv zZ128WP(knMrpa{*f(|!bjP0fOUNyU$*n<=f%s&O)Kt;OfBbG^U@SCsmqNtR*o?$sD zN^Xmfvw&?tzXGwCdgG6CLaa^v4#${iIR=(E)~>=s%JtlDsU26xq6FEvnNkE z?3a2z57=wWC0(8$H;Vb4NriKMM>@uAOfyZ+P+t5c8|WnnRHv6nz(C!;C-5bO&(ZE3 z7C}R^+iD7gj zC7d$nY@Z?H46Kz#6ON<&%>5xBv65RU*KfXd(YUB|A4#=y9J(Hf$?sAZ>&k%I8>V>R}R4M(kT6+hl^j^y@kl^vy99OcApXxPk^lu|3 zZ#yY6n?U(pYC#xy{A3OE z66q`^*N`7#px~?7KHvEPo+BM@sG1mf8*3T}0Om%mAXq|S6UatcUb@X`swSUUotHU3 zB$g}@yf-A%x;syH_rs!()CB7GZ!iPl`FrgL1 z{xe^><;PwFf~%7|&}*kggnw%)aSeEXr2*l89vsV9&Slv2)6xE3Pll)u)8i4!Xlmcx z7sKs2bJ1uUZIro|JHRfXO;30#cD6=es$HG}Y)`!v%_}K3HC;zBj0!}X!A7BBQA63| zLtl8vBO|c&bT^hh{3)TzPnCFu8%>H1tM2QFFaI$ROiX>5-;C;IpWWbSoLNX9PbitWD!SX;Mo1<^Q5+wtr6)kM6&0L*ammNSbn~D@zz@B)8 znZL)>;lB1WJM@%IOUF!vCe;C&UT-@_r?WRSu_G^LQK_$O*{|61j8 zx77h#!A^ehhslMmDguxX3W;pE4Ib1E5$#}W$VNqdPCgT)l0QX6H?u( zAC|bA=ScPBaO2ZX6teU^DQQ@)r-ZeI{^em*=+CYCT_RYM*v)X#y1(OF;aOY5>UGh_ z3d__pe1Yxz3E!R?KC4}}s&TBek(InDCrB|8t{cc^Z05*^XE5`$sut zTK}8^_Yw!@;N_AGkVKf!`qs?3EZ+_vd%T>Mq z)4C*lE3r-=4I=2d$Ux2em9FsPt^fJyG-!e9@-&O0GzzRbDVTq@$1Q9O0P?Kg`STco zM@?hXNEG06{0%Fhp<_oM{O#5fG>*W{M?w;U{@Ot)lC5`FyyWDBJ-X;ShEue!;mVzV zYAm70^cKrPue~LW;xCqyPeMbtz%fB9`C~8xMgrUcO)sI6bM?-j`x{8a6rFUt<~{ty zAt4J%Ab`?I*u<0n)EP94VM#QCo&%SB&A*^w2^yN{-M0*3PcO5xFm5uQ8qmgQah7y6 z!Jos#r~64y&4PsKMQHjagO}a^22WFf$w(+DePQso2H$TQRO9uo|0xv#hMmQ8AArb8 zI`10(*5K1kgV$tnBY}VMJzF}!j42g&9RJqf5k1i0J10xw-=O2L6ae&jjPR%bhitWwBF>*1hi(j<6J7%L@m=wiqUf0QPluiOb)XgTxCQO*WfXs24Pk zF`T@8!`eg~BH6vWlD>gPKYrJ4v-{?*DV>bTunQp2={_##maB>X=`xVB)}tqA`c5Tq z7+Bpvj$T|mSE}#_95rqOg5B|g7CnT(&XR28yZ4QC^A{QhuH@S*?T6k=!M~YZK1CuF zFS=BxvH`%#!uNRXMpgBh75Dh!*4g+NkQ(4gEU?SV!yf1KAKC3Il)V^r} zNLB0s1e5G{b-KD;>wAhC?hOTz5(na`*lc5TF_sQacc zF}2gz7}l8V!v}UgEl^5z=m^5xu63GifmlDuiBn4DtEZ0?_{yeTW^=eX(HN^NRQyrC zAgM-HBB=RnbKzS!p1b!!Bf1$q@o!;4RUSL;Baq$2C;>2Nyuv8;z1iaT2syYzoH)7+ z5;2(&Aw;+9J7ZIC7bkoCB;aRX$0N^;(I5Wj$i}?qkHvhO(mlrYK6@f(P-+ofBbcl-Y2< z#e`PY26tHZ^`o(>TOr!~JDJY?ro7>VqXw$6yJz-4t-!nqWU5Ua=)es!`)U;uzgbKHoFx`56Q{NQ`j^jv2EJWn}O z@h=lNGw`2|Mbt5lA>3i^Fub!IRW8b9Ome@yB*Z?K>=}C{WEeJa_JcW-gh3emy9?0K zsBWR>q3f}Fyf_a5Eawi9Quan~zZ6CYuC30rwSnj+T zXMta-Q0u4P{xFTVb8UrC*0+O2T}`IkvE&yyxb0&-df{NnIvKIyG`2~+`sTE<(7(pf z=UzSX-uV}Dtjq!#e~T!n7`s9HZlux+lkto2)=a_PlI`=1F>$XXt#!UG5K?rQ%HP9k zw<<&b6J!g4Xg%X<-uKZs*bzTGpDx+CZinlXo}YtE5nK*4aryHbGc8T;lSR+Bxty;1 zn@eMk&UqTe1bGb}tSkXS1&9Zv#NqQ}@X(Nm9$s>)5sFj78u zo20>TG3wJCjDPJFL39w}LpWaYt(?0rAr}?YWvBPX90zjBTy@H(O|9ny2K*nnesnbO z*-VRJ*Kw8|_0v-QPJF*w?UW0@t0OZ&&-U0jo^*?0hAK3w(3pSR_}a_K%X3%N>8P`A z8T3t5d@{9jb^7Or<7&3}TKmiJ+s<kOuxMC610^*=jGaJ zUd^xvCfW66o(NgnkA1uEpC0)?w{3Qre>uWzcX}8Zz7pkB8mZ|Rji%k`G;5R4)c~RN zo1<`Q>VVKJ6Dy|j!Mu;R9f|4~)`F2a;hZ&CR9;`e_-v-iQBhh4MA3OAipMye1cB$bF))%gvl z1A1wG(qxiI$Z|wPlj*bF%uuaHw+}E(;uJ#eMG=plf5)*9%S^yTI`@_yo!T?0j0sfg z!Pbj-h+;b%EPljD&F%VwiO#q?&kx%|_2mxv>*<-DGzt`-9ZH7A-p0D;?#DR|f_YBm zE0Be!!u0}G+qd7z?6injzboZUa zp&ep2)`Hww2RMS(g6!O^(Atqvbr26 zCsqB(xp&91m4SB?%XH!l}KgYdX@*VHgD#@ ztBl4^WFN*%XihQ+dF`nMeNmHnylgBh8wcJjZ$y7Uq3G5iy4OW~v?_ir__^M7xwioz zvltqd)%XGA+&EjN_dHfdYm&hj*o1f?r9U@?cOY)+6ibH!VAPUtBKw{i)i3KzzXsy| zr7;25C0U&TfU(=@l4{G^D?q?xsK8w~Z;8Gx?M*-f0sH~^7VIk-O$h3YO_Y^FRpg4?4<2LW9Jh@my(+rn39U~8|m%ed@n|s~VJ6$3;Ay<&) z`<}ZUSi%H9T;_JqG*m>FLktzZ%mEYaFpwt5SyR`=S--cE>fCU?0~JsE7HWvO?kpEf zV*0u;9VEZOzJahSd@>W|Hxw56xISjX+3v$x-YVd1(5u7B@d71^ZoP$U2n8e6rm+9s zH!_*j?TU9~)Q9{gev)$~X9GopMNm8AabTx~I|19E!zo^kBo`}Z>lSw`e+k5jm%mgo zBax_jIe1-(s`adGXh%L%%Sh> zp`haKNBV5lCx^Q0gHbR&C+NloXxln9u|hXffXV{y+nF0n-0h4vHcxzdR*Dq1*x!8? ze&N(eDekepa)yQPak_a(nd08>d~gMICSEqV?#Y9djKEtCDfp><#@4#_2B8KE1eOLz zt(!iH6&{r;HIEg#BWYYOSAdkHS>@M{I8A99U53bX@Jg~=_r)uk_9mVV!WkGblj3gc ztU44cFlj9kOD!NaQkwtZau11(-YZ40+LAs3UP=KgpkIQ{_%O`nBd5@vtEHwT-oh!d zi{#dC6MX5~lgLvNDv0=!>gGnXz%YE`b}!_>>7JBmV?ZOYrBQkzE&B{6A75XriW48+ z`D(5HCUC7*kT8p=8(@s~^A-cK>jih;dvw1u+fTh6)d5^sHDB=hwVn(N^+YV&6`e~D z3g^)BfBI=Ep4w~J@gBxj-eT~&bD)mh0tEdtZ?Pft4UBi9i3bRUSqReBgS#FPxOU&B z5JzxlaZh6ogN7MOFE=J$!Cjl#GW+88N_%4K*;Y@_?qh&-ahQ;rSOdr^Im)O$lW4!( zR}rq3B}N^1p|C)K7Qx-KP`#2PJF%X55bDnHW~ImH@Tv0I3PfTh0d;SKahsj=xeTHqVHuI+(d3$s z3sUH@ckSI;I;$mB#|8D=E;oVtS1_jRb2uprJa$w7i6-It5FcM z^OW21GE#WkB|~Q()Ti*1K#;7j=!d~UvUP^s-DhIJWTa1IuR!Bg6H#_oiaUp-Fq0%C zSNq9V%Zcb|35XnQi$kO8Kr2$Zj?B>VR2zCF%9d8~pi!ACY2b zHgEtn#Kzd%Qv*lzlKhgA%xN1!)W|M1LPOz`)vt|KfH*J?Yg|vZD=sEoa%2lnJ(D=U zOe;!R96q*3Cfc6ABM@`xtc3#9Z&|wZ?lll3GFhZ0fAPi#`oH$2$n-z6U3Dzq3FQap z-^s~CSo~hS%DaJuDPPnbtnRN-KDtveZa?=O1gj0fQ_wJ^fx}}|8=HDS-KUtj@hV%G3CsM;0<4QB>|>&jkcXuFceTK| z=&?ufym*k_n)H~E@N>aCqTM!hp`JvvmgMLZUdfCh+1Ef_z*W*B7aV48U>^Bo7ZuK- zjEp(S&EEe&?eC>dE`C=>nDN!OIZO!NBYV9m6HZoC=@vH_k}RZKe>NS4R`QnHeCSH2*T?&`P@prZ?R z`bUd3X5FzlZ(aY+w%O8GjV-e~YNtDgF@Y>gNUHwg{k!CI-Xzs?a;hPltrvqPSAQFU1I-~o1ull&~;l)ykkp2jE z=MEsgk6~W_^bO~h#(-X+`bPZiP`(P5qCQ8TL`m9LiU%rRMUZnk3pg5@6`zH4al#l` z@CNtEIHRr-(rrpM@2?azQ}C*oj~)!uGHXPWOZ)5Sr64q@4}EYFi3YSPFdV6Am(^mhn7*gFYi@GU>Q#_zt z<<*K*Bb_Q{Kl2n2YQjyJD9#C89MiH$Vzt2wyeUaNz{q1IB!G1kHOuoh7K(-GU&Htj zP0b2gSq)>Jq;joAN^ViT2D%w3%xNw`sf7peI>v7f?Wr`%6_Wm^m1qHyMkK8`KaN-z zO3N<$sxH}n!Z~c)6+VwOp=mpw-$P+w8nS(t?wlzE(!00@l+x;HT&pnerz5GaPh=Wu zaou90A6OT!h<{QrpgNv)A5mg@Bh92Di_beo8A0T40wlk6bU1_f56fjcJKo987MPvR zOFW;q&#;?xA}pRHB~zy0fYQL{QMkj1ucsRIvxyYS2GI=(1tRlqf=83D9T9%V94`Aj zWMz=Yho6h1Sc-;N3)9R4F7`g8%1dx@g}Jgc_)Fd}IAn3M9&@gJ92F)RK-xMEWHLUh z>7F;~cHaY4IooHyQFOqRJPb;ws)$Q5!(bZhr?S*nt1Wbxf;u9X1b^CT!-bp|Pm24@ z2SHy|`d%Lw+OINElQJ8TE~!_b3-Q*IFc5^8AgXqCe$%3~OHT($QkvZ>8j>ZglfDi)6#>PqN76GnkfTMY= z++ZUA6xGM|dW6%Up&yfA8YoO4BlzcJMgKpf~ zCk_F4gJ40+-nhwvo?Mj#ogEDvm;71xIpg<=9&-R$1mdDN_)0s#<8F|-b}DZ(`g8LJ zMOelbrN>s4OPwjHn#51G1F1pNM$FMHfMi$T<;^Vc2FK0F(z^jlyoNvt@Ko+}@^`L% zSO)DDx1R&6;5+P@i!KraD6QT@uY-EM1`9oH%~fq-E6g9eg_^bA();HbUau1_1vvB^ zE-bI?T8~f5u=X_r9enkIjm9VGLaz7%B48#p4OQPr1)x-0Sa%=(Lb305=~<`8lN@Se z@jQXc47Ocgog*hq0+dQr_WNhOH_M$&oPw0Ss2U+3ZRAKXDU3Bot^n}N<=r&usNf~I z`02S}D?^!_M4arwuXhCcZQh47{-GSr(lOdE@qNagZVPWWb$TCdB@@~k(muOJ)=wBa z?W_&uzSjG(IA#FI11?Jp?BL;gz!TfR&N7*@oh~LmNZv-hpV{s0WotE6mp3py)TVbM zk!beo5x{{=0=wBPCnn#I9}q%epvGJW^GVXUJQXZBmGYdjBuiWdd@+>tl0@^Bt#6CV zDc*x8Ppd~{5c>iY&#gYe%Uiy_e8YoG6LeD?8XVJMB<~G>#(yIonH?nrx|*B%VYtwF zvMM{3SRGFE!f%&8AdT@iek)oG{hJtufiaGmbAHw8(5FYwW2mGUG)b1L$_~u(mV$_y zP9kvtDyeKfvHer%NDbt^OoV}Xw;}KJ4yey9%F&9Mx<(Qx8csfZW>t*@eJ=#fy@8d< z6W;gfY7F0sP+4IN6PwRM5^wr1*Jv0_nouX%^yxTNRai&XjNG#~=eV8iI=4`Nv~Uic zD&eIt8piYH-PaqgaX{20uzMQOWPyY%EeM~rR%n$pc{tUka@pDYkZO=PijLa*^WuC) z>BoG?Sc%3rK*i0doQiC4&2nL-ia&H_H4)`MXM;?AK< zF|M97Q+4N%|7OYJd?v%H)19jaBdwat!ADpNN z3VuGE&q7?_CMwq++JgB>q8^|&?AWb>Y2)Ro9Iy&K-)_zGxzqOKC*D0SJLb2++V{jx zOh@9-!pXRly+qDBH=w9Gt(3Ih-F3Z}zm)-{B~3R+REFXb?ODA|3Bn`i@2U-^^Epm0 zotP30^m$tmJv>DcrE;^M?^>tBE+l#=P*Xv9#KJC(cjVyG^>0=_3r|1axiAm#aWQY8 zWAxr07V@!}WmmSh-SKPxB1YB5g6&>4WsEJ=UF6}U(S3EedNedE-QtJp5T1lZsqli0 zIE`BdLj0Pa7GEf+IDM{5-;MxQ#YD*6M+@)ogc9JQ4dr|r=aVfOqI4j7dSLMD-Nbu1 zBSC?EMKcqG9c0wm&S>?60Xta9a*08r_k8_E)^o#KTE=3N@y2s})?|7nO{dRx4#bF> z$82o3Tqmo{ln>M}iB58iO=YP4>R30bntIt)_GiGHQ{<#uAHDsTmjVkeh`w*PY;wlZ zu=`vdPRw>YI-IJQr=N7iGt%lCmxRfSIL|>GURH$t^q35|zU-8K@Wb2eJoP<)s4)=+ zBdGgO0sJ=PTW3=UHK0~t8ZrpVI8%2oYI#54@`!N?F?t2mriHUrJI|JbAL9Gw@erX# zCvup~c7Vta@>2(jg&$L?B>Y|>I?|p{N*k;%ou-k^t9~9j41FG&{ky0@6@n4whYd2O zq7(^AgV6bsCnPIn$uE~@c!LFFd!MZ@S3j(0i?7)UFTim|oF_(thC*TG<~?pz`ti6& z$6~_pSboqwW~H*eK9{x5^U3tfX@imPV>4I3n&EnFrUO0pgSL()BDK&l+z|W15xa>p z3zI_x;*4@+w837L*GoX9f&=;~*3BBx%h6H~Nn;S}Swfbf5t@xSe<`hOw~G=%eXMtw z8h(s|;*ry_s_g+qch{Ga0wyzOH)+#*%1~GTkEJSP%M)#iZQ=v1EB6Y<(0%1m(wvea}_zhjw;0E%vgkiH&I_T@@5# z@*Ee4fOGw%g0kP&&v=z0HwaK@$cf6#{kp@|ok8|#XbxP=sKiq3h<_~msO@AS-034! zguIhUP4#6NByB8UK{06a<9&K_Y0G$yYQ4|Zo^Z#;rmaxFGbf}mq(oe}*WWm+>N6SARM|Lpa0RzQO3E5{L6g?_eYkEWgS9 z+nv-ac&{n88>an8S%_9?3jdz!p2>sD>VX8z&g#-TUoB%_X_dd+jgDAWHeK$GFNl)j z$I((VV>%|1RU zXUq55)c7dP+Uig_M!!)jU$oJQnJm^hfxXMeo>=!CP{>wo)MkX28)&J|g+M&TVJ#{2ksJ92~z*QnMC`p7V zSF(6tBXVN`lKT6Ch;GI}@hkJX4aO$?Me7R4jwOI%BSx0S?;GrY6s^5@w?a%46WL*4 zEBc=;wo1Z_A0N;9W5#v-20Q*;QVz=iFzC?p{I0vSE7R{=1DtGcy1&wp-EA{(b59hCmL3 z9licq;m2<-@}D*=$G`~t{K(M$bLn4$|EEd*m61OBqk#Y!$IVnU@1Udo{8 z+YrUU_!r;Enz_-F9~+^e{iTPp)PRW&s`D-WV&XU-V1&!~Is#2Y1kjQOa@pOTQ(uuyNu(qBVQ%nWqYQl$7gM)2(Zk zXcn6Tj9T3aER`8){YOpRjidD_qJQI*;MA|{`5r~>3`m4~UpW8@Pd>|D5_r>_Tw=Of zM$}W(qd@2N=!eRbv@HoI_ zcfHa6w^#fRZwu_FS1nVk>U0y^t{YLFvXP4`Q>87H18Vm_KxvQv;uvowtnRaD6Z8P$ zQ9S@%Jf;N;zfu~iI{bVeUs(Qw<6q2fK^16DN&~dFKg;8W-CD=&5eVeg5)Kh{_p(ce_Q<)d^c)Ppbi|hvg!x08jp=Ew)$TwZ2l#L z0P-PP3FTz&Z_;h!%h-d&KbC*rxBi>SxKnR*3L}LojZ?MO!eLq^n$$8cU#9T{Dm_EKDHFiTAfDRprBuOF}FDI01;^J=7}MwaeB-s5gPa zAzzW}gTKwg+ndu4OF@`;4#RnJID2mZC22J<@2+zHt?$2m1hgkvlbAiPY?)`3PB_1ezbe z-2yU8Gq|Gv-|SB#iT&$VGA&t{)$b_a-`1od1~w6^1+84zzc2kB%6bTa2=~Y}+lJ|H zefA&rBcWHqT`2V}`|E&P%zW(D2St9pOkd25f;Pk~u(dFdl*3+ovzSmLJ z{}k5@OPWsASn>s2`KIzaXE@G51V!Uj+5Y2!63L9J#r+w2DasC~E%8U2HG<>WW~n@5 z64it(P>k=9kN4rdmLptXEaPO;aB6Q@-02*|3RxNgd-w!VK01=QHYFL zMKt7>PLTM}A4dBCOw}|X{MhM|;iX|FpvVtcjNmWxJ3l&F%Z+;A<5NtC&M5cmvr4-w zV!|zh+@eqZ*SUVos_~2mkg1Q)0i1x(MscA7fN}+|I7vO>VY%%$>a!a;IK$qv^ur2+ z#sOg8h$W;6&*3zZ1dsLkJQpv3z5w*jwSfL{iJ8Jy;Z`6Zyn+J^hpNM614)`|vRzOB zPBsGllF9TRK|vJ+1QETr_Qk2g1lFHwSQQGUFpZRJk@mct608<-(!Uxp?YGj^_8pHP zV-04D<7URB><+K5+aZ1>4qIF_fyv?5Rei=@-OE&B;1=H5hR9j3trwV2IIgD{m~IGN zKs8?3-0!^z6z-hiK>5fVPxx#t_a8?$XeC3EsJO4rCZN+dIyXT65~egbF#N(41qnXt zFGN_`E7teMJ9K+{l=-AS7_XMQa9)pa_P5#ObLdZKR70kKVE1Qhkz9_#RMgL=3%Cr; z9UJUT$*3M8D)*;XRG5?+{khsxW&L#v`9MeQM#OMSGt2&@XMCR9hNULZb|2RJqRjZ1 zRD!N~@HXIxn;u}cT)8lZa{zNb_p>0X)~~ZM1C&1OH7EtQ7bw|@@Qej+oZvGb)lsHf zdq5$+5fI`4x{XVe;l+C#Vu#&d9h{dq%xR{Ng+cvpbMB0W&93?DE&V{^b08Z1gSg(Z zFQK82vsD+6D~@P+yo$fk1i^uGHO{2$+I5>1trePee!X$5d|;HtO~yn#1*o#E0J5k7 z(6Top;?;+G)F-jQlAFz?0Qs9=<-vpVkNpFsaI@t>W=uCiXo;_W_8Xt2&R$JPg5 zQARE9&+x0A<{;o+JC9m1;HVS@zf)SeYcH!ZiPu{8hnv%KAV7*z*xwx(!}wH$aA5n< znQdf*K#Q9&h1dGJcCP%gln{7nPRvWnTo~dik($o^@~!51z@=Yt`cSz-HfB#I*^_(p zRU3hC4aTbwUBQmoPM%HQQW6I9fzE|>C9is}kcw^AwUQApODS9*s zv0~?4XTbP?{74^JRXZTm7itLP5Cqh02Q82^TsAQ~ffE(+OAEUZfIBi?YdArNd?`c@ zKi$~{=;B%ITR7ZiBd2{D`v93&D@hT;7; zw~H)?*UcGU%qyLn&68}7oRXC4HNPshH7MY<_*Q}sx+-6M{jFP3I8o8g`NLy!y(ka| za-{fqx$J@ml? zgXIV|E{`@EPP_e14m|w|skHm_uLKCXb4X|oYZP9d0C;4v;GD(gJd7^$Y8;R$jgtwW zyd6f1KBrQvya?1T)15y{5#bv{9C%hg0nBYUNO(4Iqwru1dy(PeUCg#)s|Tpfmn(PbqRj)I7Y-2X9QFY%IaAdu#m3zGSwr<3=(Q-E!qaQC#G0olg;vy8ZSx7M1 zoUX#*cFPV>YNsdmS)ufQ{BVDs85@yW)1Oe@<6VnbO)3D*HVYd>*hybk#cELWE>?$i zNFnGekoH9KC3l<=>{?ISi_LZb3Kzo_|8w8Y?la7+bp#ZOC!3pXn^K6}D6LeE`yszh z`wLSxbe79xM!3|h<1U_C0%zl@7_~hC);{@$8S<3t`;??Lj{ z@2*!bs%MVcF5fiHzWH!M3lHteH?`D%dN7?jkY6?4ynfWMmQCRRJHyu&CZu~ldvI*r zaYw$C*J1Lf(tZ|#>{3kblYC-4-vc5!$oe-Ip)Q$t>ch2tkAwsDoXsigOrv3#OJ_MC z$#9#v2Y!3Gt`bmlle`a+9kv$FF964j0{4kV!bNbF?E=8{z*d(e#^`v{`lavaD89^N zk2qp#zt$Udsn0%)f0j2x;7ty&cl!gX#^3<8cyDcnArS*9Lr-c2!4_GzloYkfSl;CiUByxyth zaK5lf*<8bg9%?H0v_DrJvs9c#vB~K!Rqra7ff>Ht znBo>Zh2G!MOf{s;AGX1y_6(|BYuE9iLBOd``_2qo%h|qqBgCF3P9NY63#SHzchV98 zl9CcoS#Fyt?u**?yap4~d^4Uf-rB_UD-uw;bPufXSq>Y|vKl~4>;$B*rZjXbD>-~< zsV9cbn8BwD{K9oA8pxn$-;Gn5{`Fe`057M3US`}l=Nk}5I0d1>ba+c%d}RG z+iOze8o$p_rqQOKvjwSO*$tmA-f<{5Z0C<%1u_k|(|Jhf;ny`hwcs#}R~Js6yB0^)tI|)#NS>qfLPk z7iAb;u~_yw?6K#}5V-NxNQse{O9W(m;pS|0g)+ERK5P7d)@+`SQ^o(-4>*@RprHKn zvbZo~qu?=iV)j)ra1<}h7dUxKiRIULPyAxnrKYQ;B0uD5cqVG?LZe>K0XXxA99|dB zl3hbh6L;Rgz^FQ@j*c)07w@R920;%TI9=>rap6J^t)Q)6V6Nl?yM0fF2zx~3Ey^cO z*l&->mD&BwdXZxTmM(E@*(S0XyK{&MjNrF2es{3(WoMpw0mWJchYx<_xgx<^>sbWwW(JlZimu_7@cB}c-tkf~2}{+Ses06~T}JoSlj zz%LT1mj$WWGa}1jSV|psL)2R}KB34l{C(3V4 zaCKd)RG-vmJ!cN&ka+S-*hD$iv9V2fhD78Ql^QqZp+JQ_Rx9$oWH}PF7t|emd#)}U zaZLhW7~(g!BMMfZV$Wrs=yEE#m69r~+R+arb@M)zNgsFHft0EYR zvDKS_YM_;5>lVuwS0kMhKxuvx66d~Ok@yJQEXOHp#F)N{++os#lFi|ZnDl?g+S;My z9wzB9oGazVbUU@Klr*1W$Ci(3&2U{eZdudZoNEX+Ah`D2hf}voJX3n-+76kI*`;mW zt~U#m5SY{FEwO&bDcV`_=%Bsr;?TS6QYq{zT}vKyO=O4VD>iVoKeWm>KXJNEtIkS3QEaJ0SyOp= z*>l_N;40qc^w)<>cx>+X$$n`lGcJO4Z6`p`H=tF7gwaId=`OJ3n)s$$A=JscT z1A?GYi+I7M5;sNT$T{Vcop3%YtMOe?=pa}3oNqGm?MsmR>GsKwqt#W!o7TfNfAgia zUl-6SacxW3>&Yx_{MPxkjEc)4h`&Kcz_zcmh07cwi7epT*43PhUMEce;>x)t4?5#h zJ{Yq&j2C6%yBD0Q!_|njMu`_L$kMU!jm*SdM)~IGd&A22kp!Y!@vT1UMHTxY{ z)SuF$RMAHm6Bz=y46_ZcM(_wl-F@~wHX3h!b6~%fSOHf2@T#@s{KNW4VQZAgq`dye zyLizl8eB$HDMC9zNkQHxG|zgujs`{cKe5Xj04mrjP2ecYnK&kLZFD3zH6IWRL{!0~WQvb7V%Eb_!5623>;?}(j zTULYu@Y@n>*q#a46>r3umLNVh%^z)8OMbZLA=%2P8&VD&^{*&b3l!^L>7kFR1LPL` zv}^3pc4pMVDERv&NZwaFosIbk$p++j@-;!XrX|UD+%p5UB%vSwJi;jbkL=uL|L}pf zTjp9+nA5fgvF?MJO&nF?w&AHpW|*!SwSU`~@Y={5gAZ(1JFuy7nq7&z2EjDAAgG1` z1E?Giee8lUi6r*;|q>0NUE#c11(``o(hmu>*)OSiga@Np9OH^Q+^MOYa>- zxl@;h!YxrA6XQ_^se2bIK0eHZrLPQqvXLVtwmhN4?=%C_IPjfI=h!1a7uoZYa+^eVAnPl2PeEU9VKLNf2EP)*kQK#V(Ndg{G%R763k`W- zYB^ITSb?x9x_G2=w=P>;QHf0&{qy7|)Ahyem}L2;{RxOZOOHa+Tdsf%`cCg8(dslRgSh-xnSKHJRg zg4~TxeP`!idq16Ewi^=qDw(G6j*!)i!GVZ3Oz7lOFIQ1fbfQ0*6STrl*H_bjtUM|x zW!<;cbBAhxsI_AAXjp-Zapn1hN9>2h3g}rTgrGj|FKzJMp<3VtdGKrpp>>ycAw1w7Hje_e#1chG&ZOG0fvp2^NT0X!c} zww2~KAcrzNn2T#!p_hrQyG4x_1f3yw8(N z8C!-6vGc835O5x=+uNta5U11F;t+f&`nif7B&32oE;w2j-rKA+*va)1t5^A2*G}F2 z*fVWVJ3m2Vey&A3Da z#8Q9sy9cI!r36$C&@B$U%o-TQdKdSWBtcdBylhiHxgJceQP;lj5YD`u;uOkm7B)^2 zT0m70K*H~sfFoIJ%DZGmclj&YIzo*6G9uErJGUQle+`XBxrq2TMuyV)pE$Pf%Z}We zU3xs7UC$~I+||+8t>pSL^nFilCb>J7e!)4FdM)y%?3L!(e$ zB9?MgKzRU zpUgBeDCV#+zD&8zZnrmk4V*PI@MfAD7m}|X54QrxGIC}^TRrR2gLd8y$QkE*7l9r7 z2?j=71|R&OVxb5+x?I1y3f<{G^01#8N{3^O(2rt!4b}|$rz}rj9u&Ub+W11uy)l2< z>5MnCXY?9<#qbe!qA|(VRC~OrKdAC4`RZ618If=>01?N+alpkPxxvhqGd1();R7m% zMNmq3eVZ_1wf$s(2?n!+&+bIk2;4$lSevMPjKcNJWtkIpGU#qkxe8}B{h9SPxeR>S zVqn+b{(x&7oFt&e`XwyHWR*beCAlquB$dcx5JJvK()pRmxXUFu#c ze(eXu)y_f{^9QJ${S0$6GodZNb$Ei^`a8Z7lYH_Oih)w7s9B{{fFd%cDi7h*R;7{Z zfhdP|k}s6+1a~Qi9=$=}%vRb9)MM~~*Vo%;C+J`Fg-4+T;*JYLxHpCKe0;%b@)xA5 zH$P~T&z$9KuiSTGysv4w-pV?p8@S1E^+Q2*Aq7LUUTc;30Zp4s_JF|vQ485m%Gh4! zC~;V8u`iMN`N4W@kv3G6J_t>YXnrZQ9Kj$BNnkFmuvWfD)?&=2;!#2!S{h`&PTt$8 zj>e!8!aLG4hJ65Q{$`)v?DKZ)-SKgTRk% zEp#pWdW}QP!Q|9C$fpXr-t-Q+t1JvR>rfrPj=1>FW0Jb^?rtj81#h0_kv!qg#nCp9 z66MwLj{w{d7x5hoGH`~RW|+6uEZN=6yYP<^TOw=QW%JGRm(AtuSv@{FhjQ4o{8)}q zrrlnM^Q3i!-;Pp}UE;xvaKppdvc3aT(&MU!sjT0WMG3w3p{)L`MF}nIgQd&Nj>dhO zEjx|a@AaXVU7cHJrYB{M{vX`&LUhH~F`j|9yXLyq@kpi>cx8*|<6G)$WRU6P;rJCwlZMi` z$?{<}#!L~~sbcg*qX|{O;Grnv5JIakq{HO;J645v=#JSfSIMU$vp!+3;HB9=qc8$J zEy&xiw4u*y@o!DI<058Vn-vzXH+@GWE2y`~$qSHC(uu~Z#?Mc$nugbqN8;RDzHNv0NlXXvgobYz#lvfry+UmsYk_W4T6l zr9hc^eM#A`tL(|6vRcQtp*#i#GKhIWFD>hBH0cHlF`-qz=?1^PqB4V3 z(gh&;`K|t5q$pTpm)4W^rGSEC$7azoH0{F&Zs4I$K+^t8;Qb!mH!0;rB-9Rk9v z2Y~j}q0{~P@wW-)qY9Ohwr%Q@vZK?h(X3(75nBUjE3a2i9je8S?)S@*x)cEAT6J>V$2c>|wY-q)KV)(>y!1$JT zv+iMwd||@v@YiI`R-En2*@!54`|f71k<40g|00?9o8nJ0{Ygm?a5l>%5LJSn(*k)& zG)}7k3@w^8G6UO^08cCxDf4~h!LIR;N#T)Cb19vO4W`6s1x16b4&+Ju;xm&qu$Cf4 z&L3^I@v7gM|IFi}>Vui2mVCjlARr*~O*xJJyU=mRmV!@u3*A6CS3Y0ZYLgy;$@+vO z#dx#cDZ%e>Xn9g|?vN#EsFoL#Bk=Ove~R3ViB~(r$!t|j3XsZdrh{FsrN3UWNy?k; zrumsx`&ott%B6j#=o?&CXBoMjNhkEhd*HKPpCICh=#UIcR8PT8W6hK8^Q93(0ZIy9itFuQJ`0ao7!}K zJe|L{7+{CW!|Y%jg0S}u4TkguZuXOHqsO7^E8C?{$c&7kQFGqPBQ1Da6oeWZG8@P! z`au$?f)o8Y43L<Y{=ZlK=K3}PuD`#XKL3WZItU5G14reUG79s@JDei z3{DrDYQfWw9|$p}SHA@WuU=VthiL=+h3qDWd3F6nnP@kl7B3^26|9)o zN&)fy9=XNkT`)j?mPPb7N4&@=HgBHZUMufyr(YqQc{KSiRY-bZ3r z|15(#wq(Ht(NepkqfGapn){?5zEE(z@1>rUTF2JtlJ8K97jRF)yo}p?H)X60@Ej`-L-dxO2ud0tn348#nRsV2fBR9wx2hA63$q>m zekF%fdYdbrj5AI4DQQ|E-J&ZnAW@Fk>4!VmbDfvLplbweyF0Z0?A5L(W5(B5vPZ3n zjh8M^yvfx7fs3*GWPz#kD-oC`_q{q*!Vl{3)5F;BDyp6f?k;YMefQPl`4^cPcx#@} z$7KC4ebo>&O=X0)gtQNlP_~wO>bO?9P;)$LPo4Y6Sna&jOZrLZ?Gh)NGmgNqh*i}C zcNo9a!%K_$sxGkva6Sf`(5{QLcrzhL3O3);zO$!Vy{Ec4e!I5PsIoE6y9-e={88A1FMo=A+H8J_l&x`>-~S)dGLajG==(0^!PocfpwOt)atRp1 zd9Rjt@ZM_lN;e0V*Ld}oPw^2dOqia z9UY#HRthQl=D1gI=~<@axCQ@fuS0xVYL=mE>f^}QhwuHmKF@kF55pbRQVV)ZE}?Ns zIl&9*n|x;$;cg_1?+PR9QP#7|nhFNuk}{E=hw?yEqAHp8sDR1@8IcAczZ+ILW5_0( z`N=-4It-#M{!lZ_!Q34x;%$k|rf!u5%7Bh8a?&-k>Hcry>u^ZxN__=ON1cvXD$)2y?l<{sjW6(kO0~kJ zK2D{pNjw_v_}TC+9xokz66H4r93&; zowbpKe-_f_28)EEM?c1YrTq?7ItTICuS#6?emcDOk`7l)3LTK-Ce>V87_NBflxAvp zX5q+8|9vHf@$srV0HVrlZJL>yFh1m#iH?d#*ehRp^|8+~?IRSl&h5?hX$FHs4U}?d zt&=RItP)LYdr+r%seX3%pfq1^K9q{1#PCB#yd~$I(aI4TE*p!T0*+svtFNMATGkg4 zlfI_I*)zq;?pGSKO-u65zUEv+CKK-C(_17wF!V|HB!wE`2oN5;?ybZ^BO^^Xo zR)(3e-YyUl5ypE`sE9dw)>v0zaoNoQN;?v*VglSY=dZJ~SpphhaBJoTJ?U56Kq z`eP+FjE3w|oh1ZRQ!}w|nYuJGqQWdHlbHyVd&o=RdY_L;9RLzurgM*$SYR&g8&i$&%cr#30m?}4ETF%_yXkys;JSFZInuYMq_oc|K@8-<$U>0rn7dw zo_dYpX+^7?g?Ev&X{?!1kz?Qb10Krlr8g`zsxgJ1Hu>tv=N-S+#CX;bi}#7Ie>2VC*SU^!7k%PXJVOp@2z(C9#Vhlu-sG|6 zp}J=nzEi#k7>IIXxaGx2C|htoS>4)kcddJBM|!ho#(hTms%JuXT~*hK8K6HcxOF1i=6TV7Y*%^7FdVwz732&>Ti zVUP@jmFqByvSVAmD^IYgqfhUy&+nRbTa)$|-yEDPKj4J}nKyArZ-d0|?R&Qy>#QK| zJ=>oG16+#Vk?vI&-C1-x6zC`i!VmAyMqDOuR(fu+i`by${dPL{%n-xouuZPz7?i8I6I`;0G{d$yoOZUxP}TIepPA9E>yzIcIEB5lT0*;V$eS)l`h;6swljqO4Q38oXnu&YqA*gm>oRq?2BCYCdrLm z=P?^It*qhvc-|9^h5b_%FT1St3M{f!DuMg?h?VM4Ig-Y=HkZ1Pw(QiWqd4q3B36O! z_o+fhJ_|$MZd>D3MRZE$Wwf?#>@42`8Qf{o||9eybj zhEhn%>jf|3v$IHAxYi(XY8BnkwuIz!@k<3X$~ab)S#N|9mT38x;z)hilUHssaceKq z;=aHj6HYSLBk8;Qqf=BHg-xR|pp8PAu);Jtw#UHh`wAYXZM zH0T+m>(!8~k!y|tLbMbzqyaz)r~B*$E9IRT=NKAkew8+BL4Kp7_v!tLa+c1+UyAHs zA?wg@5{2ScCh#9eboa}`tO0*zackHe>}G9>ew*o8s$6HxCYoG=zNo_egOetm$}{{> z-7n(0)ZA!303z*YvACa^W{5Mt->}4R0@k3pl0fakf*6-&5=Mq}hT(pat6EB+hTps zJ$VU^?{AXSCQ4c_u=bZ=hNCylpilA5j<^;;f1fu zX76xu3KLWH>eeSY`rE+RMu!@TGJcPF4A|WCJJeD9cNh4!ir>hsdyf`5><`wtp*{G| z#TVluJpau6B%;|^z`qQMPtG3SbG?sq`R-jiEKwx1p>P_(*4)LEWg<_ekj?vJ$T1>>X?zxSzTg|XDCR$|8Wqa@rLGm0#%@YT9j1ROA96nkTaUq?dtLH@P)&W$dNxW2ZOu z4_Ux>58RpCcxBA311f@Z6cy#=d$RZXHJ8vcTgeA!3;o0z5ze0(b#v2(!KCWksFYRC z4-8H2?Ogm9qYUch!|E|BlQ>(+0Ww-Oik0$Y+ya|mm_t; zCo&%nKH|{0IhOs;1o?|h`wNr zmm=+DNE#8+I2w~-)&4%Uwj+xUnMCfTaz=}kX;HP8H&5l6rIA;~0QTV~P6~}~*46o5 z=v&447M0ax{ge51nVZRK{aC~vX&%A5-=b*twHnJC#I;$SXEs3sn1t1vn|dgWr;GQO zy_a)YBdBH(pY-cJOvIE9>cxk%m+qJO?p7wpczHcnR@%i#|4`OWMeL>_=^($jHDBf0 zb2x)Jn^TXn;sk_)@$*t|W9n2l?$*3gK7>qM34b}w8yon5M(@@q1n~IrWjYtN=SU!O z>@oEL8qLuxM|7bai=3=#Rdnpz_r|vrXX2$Qp-6@O%ta4hq9AC*$TyysH;&px^UYz^ z_8Wa<0~lJT3gc2L-Q)mH!TvW!i=yB6?AW{3?G_Xmvh4R0J%c%_!>yGIyG+$RJ_r>5 zRcFQNhruKw)AXH1t+QjO?{GdZ0EGM`6#5Y_={z)5;&(lGV(jafb*OPLxkCs>KdrL7 zs9JX3qsRWQUWN;BMiS4>jXXVNaH$FC+sAB=biylc4V_7^PtPA%f9EJ?RTNTD0p(Vq zKgRhO5I%NRAgMt?k;EJ{>GT#YI(0TLy?l$7FeY#MUzPLxIt7q(+@75bBU1p!gXZ@S z*fcYOM&}B^%Of0KopKV6`+zjf5qe`t)vG`LOyc?L!lP}0iv^XZcxf{3i#Sy$$??27 zg=t%*qT88&I+eUv1f)XJ4<}=z*bgUDRNO5x<1l|40U+IOi)zxSJT_#LrwK*l!ruyw zg>!$*{His{Lb#u9lsXq@J6yZdR$7Uj|E(fi!Q2KuS^h;|?s`Fw@=_;zSEx5JgIeU& zCoTjWRWqRPF-;dqKK|3Q!j^2@!`-Dtn1xyMJz{5K0$cu2EgU6Edai{U1Zn=nwfv@7 zrL<`2>p+J_W?c0r0VGTxz|DNRGoN-+_vPE z*<0X}cUv&>GWkFblDnvl>VAwOO4HL>rOKn9jnPW7PHlST=?asgu^f`zJ3? zr`Ixqvo_T+b>Qs-r;p>2ANJ=sQO{T9Y4+->ysFBEQfE2|Umg4`?`b-UjJz_R{)2r~ zU8R_+c}Rvd1m#<%n=a`eFZmdU-`=Bd~>+isCWB^VsM#y8GB=0;fR(0oZW?tLHW4a!suFZ9sjD z^I95J<2!Sv1}cRzirW?va@V2$j|oTEJ@-U}H1z8d@@L|1%2GJ{r_`}h2?DNMTPak- zg)7jST}$YG`hqIB?y$K)Ja_eaQp~#9a2{i0E4PjTl+!vl+83j-%!i~ zMETI*TFzq~yahe$4gaDA6dq^8fy(XWAfj+5)!bva7s>Qt{kwqi;Ay8%BfMMW8dgf7 z)rF&b%k*}oRU~TLcAMm|CH&*QzCY=i0p1^!&o=MfN-eo<~drLje4gzC#?6wnwu6D7rtp}8o|Q; z?t$rFaxPXdMm|>go}>=cc;|GvelHCB@?`rx5IqL~stcE@r{WE}t&jH^*5#4#FEw&A zf78H|!AG`Nm=6=k*)huniZjE)pK;tbtJWbKkJs~`U2C(=^D7mf<20;R0wvq?lwQ{c zE-GF?aY5q>FKKInhC9HRlSj;zgIv3PXA6IceHzOWBB!vm@QS!-2`IY-3d5ka@2>S0 zA^TNUzbEr=0|k&g5rqR9E!dmq+>vgLw1=@bgH=;13n24sqU>=_zFSFutG~uio@V)R zu9=F;BB-=c1%J5so$LJ!CBU_y`KT)LYY*d6Pk+GdXrm@Pi~{MsQpGbCYHDe~rQ{_l z66z1ntA@0ul#C2{XGl|;{3*HDz_3EY)v&iIBmYQxwwdOmWwyk{(qYr$E0i1)LP0c~ z9y4!eG{+gD<`VUS_ioxR2BkK3i|4pvjvmz@%DcA11zO<~y3Kz|Gf#KPA)Q*+t$Cju z9~Q*Cq+A7Bd7YeZgDg~-{+w>e`!{cvE4(5_QWRT{t|k>5%Q~EvFMB$7f2cd&0XSg9 zuzf5Y&ihEQWA1FWxtgt^^DPf88;3CU($5sB?zbnhP0}Yb#GVO0Lv(0vL{qfkteb*p*4bFaACzk2bULo``zS6g3Zk z;h`i=OS&91@1_#zbbzyc3`bd2t$);;>rI+9+Zz%(9Rg1fOwTHjd6ALE(9YE2Vuuqs zEUqMLo)L=;y4|1jdcKQzq;lWqDBl1Dd03-}g1l`rila9ChKF=`a9~M`| z*E`1Sp0RuM`N8%BBfcS1VfJ+pT)AQbK{a>1d5hZD8p&JhOB?u5 z?@z^Z`*t6{40)SqadbxUKCkD*FF7KZn1lq$kQ~LaY$Y|sC{rs7lrY8?i7cREe}6*V zk#&Y+{g<&c*Mv6=u3z+%mxLP%+b>AAXH%Ab=?#}T^ma_}INMX;wf{r!{25M~5Y|^k zyZgIhvBOJww0&y~ig9xAM{HN{J2BlVSjc5*X2G>8?|U^9pG;34U2 zybgcX(M#$B&#nTh0AJ1TdpXusI2^l8nK3IU2LL;*;7oWm4;LZ{ROwaB1B|)IMZCN> z_aWYZjAUU^`Z^|jeUoHiJK5TCmA?oNwv4RF%X<735!C$Xam+ySI4MEWrbH;J1Yz&d zRxN)Wb$&>vk$L3t23~eb-nqXRVR|PRJYK#Ax-Y4{tFWA(f+qJ|2`VrlXHRdn*RnmD*qQNc*cOPW|hYrlM7_PrIfKyqP!Dqb6YcdFV25@(O3Ink@3Eta@!~MjZj(c(_310%}$YL7hejiLOBD zZFDHh_G}_5a&q_1^L%ItR`Ody0)a~@1eNFnnSH`kO0thF*{-h(vKuSxHHzf0U-E}j~55~>rc`~S$kf<^-O7WD-Lew zuphK|Z?tjF#OX7aAqm{7kQ||m#Fgf=ixx+1;Zf*uJnR(+wq)bYI|q+A=a72xC3oS} zyQgS}5jOk%`g|9_bSO(aVnu#!vr0(~f_a(#9Qk(J>1s|Vf(RVEX(B=iJlad4d=1CJ z?$b&KxQZLcTsVsG%H33|!;|a>e@5)zTe7{I4Pu z7#>yKz7Rl>8`;&3o_zJ<@;OhuQK+g8s{KMq0I{pt4tnp0be4i5tSv6_tOua99{Z8_qJl zMHrO`kM9-En|q|?!oY0Y>n2->>$1r@ubIAZ)d+W3w zu5#W$CN#1kt^{t!m+|b>{hjj440H&+xH(9H_w~bu5Bt_SyK@C%QL zJ;O<57LptoTju#kZ!D22)qDo$Myt#$Rhx#36H`!AGFFZB1Q{AE+LQ(HkQu0%BFTCG znAMXC*u}{109wEpK>Rj%l%CrVN_Z8B)G7b{scFeLIT(-fyNmw3&^+w(-K^Yq#Vnyl zX<~s9WhNwKNos;1mh_oM_xjp#{68N8#_2%3hy~ai^yQ52f?^o78z7 zJZc2I5Nt$cTt5m5CY~@6wB=qOL2|NekO0x!0UQ!@eO=)rJUcupQP}i-vuv2V0^$!w zJA2q1UtNg>$<15K_|Uk#BD_nVL@Wx7qhzNW1w<{d&k`|a-5|QCjqKmv{PP%-@d3|_ zL3OjeRGo40p66W?Uj#=yr$YeRZ$tHP@bqq*TKn+t|Nh?}mT`R3HCU&!T2}dR!Jj3h z$F;=75YJ9Xh&>qpe(}E?qex65rxJa5z--i$d^Q%n%#RlR?7tm8;OH{S6yE>qiTGr?I!WL+$CB+W=zxDW^!ypoZs^o)-EB)^Oaly;- zK8U#x{9*8a8{vO8g^G)S9t}qPZTkPX;AS)>pL5er-v2os|GFiBzk_K+5Z+2q&tm@H zFW3hHw6rM46a3#s|DR(+ErEm{R6z0XF7ZaT1L7ijUS6%?Ou<(GcOx-5Ihni;hn)R? zHY33goP5kHfJf*bgX$ZNp9~;I1OQ2IrNhPt7dRm5OZ$2_Kl{Ktfe+#Z9_G?+1-Wsc z&!;ba?{Cg9^pG)LP8>lkj~eR!-Aic3GeE!U^}_B+2Dm)xC|qLhFY)uvaBJL!y@?6c zH$p*`<8h3N{eXK{b+YmgG32&1A(z8+tGQ|!3~B(*aPH1umi&MOsATB@X(}Q45y06t zdGg`$^Fdwi@P~pBaAPT_5mwgv|J@>QI?y7y*E3!ZJk)^pEn(ZFgtS-+hy|QS;e}K2 zdi^&}8R|Naw2Vv)py`BUH$DGx49IxFM~;9M8-?FCVDd-D!J&No5Ec=U0BGiA0g4J87z}3VA&&6(fpAg2AYj$y zAr0>3i23(JD$<805%DaPs??Qbkg*di++!7uG>;^yFvH-ONa^5R3nV_<_>iSvffTkr zARgcQQ=69niYy1fo6yp>5@7o$&w|~9w~Q)Q*IGUAi~&oxkGayg7Jx#(ug4fkh|BeS zdn~$!%t{&U&xxgIeD$lZq-zXJY>QH-Y+!0C~k=9I8a% z7TIR(00uVUN$rqSZV2O352zfSM+F|~D zhBi_SFm9wImhYx!EBWj5o+i253W`;_w|7F z+@X`>nuKX@GhkMNxKeJ|9X8u|cRWwV?_9D!-=Gqeqx3`UW8p`7X6@<%A=4S0^d|t( zIkiP1U~Mssw2byUJ$l%RC+T0$8np{<2s#4Z3jZ}ncp7*!C#)6U3Q+QTVfAYdc33>0 zKmSvi)PAj@J@8v4vzv{TR7m69Ax~n|D^PWJIfxp;W>_YvTFA0F2S#+zEYvATk=Gip5o2c8{6~=$fj=u9!)No{J zSA%4`3Kq2@Xn0w8GNGKG3*-Ib=1Vcgp=|0BVN5vLBAD~obW}-eh55N6j~*ZMT*rLi zsJX)VP9xhVRB_2-$hmUAvK5N2(_Pjj!pLQKneE?)OP_Rd2u)*L_yI04?p$cLm2XY@ zT?a8HQCxkHjgGJRzivm1boq*=&$PJLWd;SOu#FKIH1uIuv?{hf<{9d`UmZ>!bXX4k z#-oJ7xRp=_>x&VUA%G>iu|=e;Mmvw+0|~nE_j#V{=3?y3Vo{LSEBB;vs}F zyuV1_UboHX=%>^HB=;3qmsHK^m{yAEJU^ykynrmi>rJAs0RRkW5er)J3{_go&873L z)A#Ubwpl8)4*9u^QvOaq&~SMn^oTvtNYFc~K?}z);i9=4`t8>WAG+^LqxOdA^z@SQ zVu0xs2Rt5pSkr5B43jb;aKM9b-^@q0EtG^D+b z;kz+50f>z+ov_-*_c4Beuw<5reRg%^%K{fK%S0>(?=| zKm;k-_?2<-yz5V0-f&_JCsBc?+{k#6k3!n z4dyzbl;6NC?F6A6mmmQ^yu!IaPzD1eF%243AbX|goKbg*iGG8#X>ZX3j#h{5LE-lOnGpBGfE_u^;cX$ttDdI&0K(e zc=3C&D(pq@XouxEWrOb$HvmZ)U)==6<0cDTf)7BfdUpr#PSOfDd!%$EaPMdpvxC+4 z0BU|Pz;Gf&jW~eUB>@G&zm1xCysY813E`}beO9X{*in+MsbZ+rq+!4RdZ_R<&+#qg zzHL9bbQ%OB(w>uMGk1M%y4l5VLjg>F_la$y&h`Ph`S_28OMzrGG&HvoXWzyCJU~`_ z3K&f{A$xv9Tf%p>Hx$lzJQVSe%rfs~Auw#ysrm9VB|D--vtl}|%qFWVA`zidRb3hgQs5cNEcS z)h?=G)jD$@p;wf9{8Fa$GOO|Ad?OK=R;%Nc*`V=wTi;S`Nq$tL;5^(OF*T{7|0YK& z>XP(Dv+Q3$#SLJIVGLlG!Dp--6yS7x!${#EcB%DTteO@<>&W@yE~z~%Mv3O~M=hFe zBa8uIvN{X_jEsQ#8h32zrY+%USg%TRP~c@=`7B+A9w~EiW|Iy}FVu~{6z(qKO#a~y zy!)j?>-kfaL7HB^hs@EL^|0i0u95D|w>gM)4&=JV~+Yg5ez}K`)Sgd(}sx(b2ex-@K z21Vk}ASMk<0C!U~>d6W4t6hQMgO5hu6;GO5K+exT*jeY!?>Km)6|-}^GZ14TTpph6 zdjLpN`44uICQ%A}DIKqTtniOf(*YN~OP}gU!rlXb4Lp{ab}0b=?4w(tZa>6@5%s6M z?NPg|0uZ0V07M}F)-cPn0c}0&mM7v zf_`A!JxUqzubawx;uhctiae8%5LNX-a^OeUY8pk|=k}UdMIK-pWJDA z6UuqnmzU971A-pl%Nh?|vql=Kce(JDimS?VuhI&9TJH82BR*dKYZ7%a1a=4#1Pm}v zJ2BV-z9w&5-kffD)!YF3;Oz>fHuX!#pEvz$V=O|QM!&+{D0uBZwq`a-xKoLF1aKFq zE*4LwNk+JYN68ndMpH)YZ66bJn1TDs+2U-8X` zWt3IuR$JE*ejpDhoo&%y^3k8n3$5laZ`>DllUsbUETbgqc|4?YM5ats7cYQDL4<(w z6Uq`M3CZv6Rh;mW)%KTM=v?e(J+_D(s$@oEy>dTls%a^a)9J>j#*ctJ0!zs$N^c&G zm4p|+wi0!0#+tB{M{PnFd>}6aMB~J9CtJO5Hi+ItiqM@)`E-eQbV($MV1jXx^{KB# zlW%|pDe^!P>!%{YR^Tm?NK)mdp9*bVlozglagBafV}lVTQLK@z6=W}}>1RFxu;2tu zLk3X`B|{)Z=HmNZ&#?&XevwH?1gMCM_$N^!F^=OPy`dHATmvm;9kU03UX&}kDvRAC zZvn&;;~nsq@4fS_RGXY#+#x-lx94Mep2v6r^)EzmjJh9zG~}9c$U~3|y8z$GF*3Yk z4JUJV23u?&KuDW4j!jz;Nc*7%vuuC}lut-AOL#I#HaNRZ#N4;>w{YtL?wk^pxNH4t zdhd(yq+pH6$7xq2N~oSZ;{vGjjTkNNn0FA?yBt?X%^!-fbt zGtB9tlTdZ-?dji$7-sd#!#C(fI*C@B3Y)lM-$ktEY9lL_zp-+>EEzB|JjZymQFOQi zZPaTmZq;=g@kn{=(pIwMC6`z(%rdm=<_6mds@iE&6uObP`i6p2-%+FP=n3SI&m)+` zn3n*yax_LXs`&YIi5~l-P28;8Q@&Vw#4@sCTNDsWorPK8x z`n_Y^l+rG~nS?D!498Q$hoy?N7mw~18ilv*0}lJfMf*Y?6NAoe<%=7QH>`L$MUy=V zb|Vn{-!rVgYcf7P6DV+yr{wbzE7um`NWW~4(B|QWFP2>9Jg(X9+MRN{>pmo#xJqeW z6@6kw`1-k6@^oWJLt2>|+lWme6C4$hl`T9BuckFdq(kBeLF%E_YX+wI%^WW&$~tq- z^nB2!ocXKa_a4K2)T^3-^!K0Mn{#wJmC_hUTDPZRy)eiF=wgRzCk=pF{jJ$BIZhOJ z$+HzyM54zsS|qr>KPs|#vQ5PjcStY;9a(3zn(_N>_R|lmqKKytqC8G`)L`{&YMdSe z2!0}#0k$5z$Nl9hsiycg>^Wh&87gBC)5{WM$3f2vWLp7=g!W@H4Dewe6isv_#LiU5 zRe1GYGbkaU>Iit0)$Fbg+AZW@X@4TIofug>qnu|J1*aMRnooU@ z($S2=pP@w|xmvYHTg?kB^xzoN$p?c+)Fc&0FFxEyAvrMl_SAfkrXWW;2L$;EXPPu#sEbKpNLf3o0UjU7fE91tDLK77UojS4^6i;y^FZ}15+ZK5dcl=Bnr-)i2)~sPpd+~I`pc_D{Jtt*Yy_T z&ECZh?>qZnvTf1}89sV9R@-Al_r}+$6<}un9{nNi`OXDM6Pri9%X+mQjSNaz&M>J9 z2tc|k!4yvOdjra4P)IL;>4VohsD1c0aJo)cV1j3XrZX~gVyA1p$8XexvxL@Xhg?b}h1j0w|oxha@P z!cw&_NXdGT9O9bJ7ePoFbX*&-^>YVj^}9@xkCAnk)HuT;ZW)%M#(9*H*#Z85y^yY5 z2XgW`d%7@)VMQL}*Bo&(yL^2uH^KbtUS}T2aWpK`d!hv9@~=JW-x%XpL|h{3ljnc# zm0;r*d-z88GhK1U#F+)-($o-qpNi}A-aX?eJk+O8&>32dwJ7g{siw%|T?8ViMxk|i zXX(kQiF(v;PK(Ug)~Sed4@O)V-wSt9l)cIl1-Pwr)tnwRoK0h8h>7Pp*`M0NwLB&P zB!6P9j~o8gbA?nXwRkJ!&BEw7utv8%f>t_8kZrVneIynaj`we*Ic*JPd?a%D!h zP7Rp1p6mxeQY}VWg~akAR<43S`J8v7Qo8iWveB|>g_wh=hcxB%XD@6VIOp!JYO)xt zDE%@P_-CpOB4fsdR>63k87FsG*3=0>xKt*3M=Y$$z@-ZFsffk=pu zD_;baL;Y+AzJ>NM&9bf9-sfV|t=FU-QO-(rAGCcWFqVq5Ii?IbjPi1W^)=ock-IgR z%2qaWyHyS9#WJC&{+|6FwbqqGm6hAlNe0dtCfat35{lc19r_Z@3@OU9OYe9qx@8h=8B+Z zqjTWy9F2@CRlp~~HOx@zQJH@?FzQWcQY8RA!#hFu>J6 z;2VPY5evlP;;yV4Y*%MEQFgu2lpMpG8g&XWek7gZUi2dgEi=`kw!Y&J`aE^!G?>xF zS#8^c1s)2qXuTaW=Z!@08ec(%L7$I^-0S&(LX}KuS!k+B6UXewUuiya_L7P<#m(5L zb6clAygfUyiA-?HOmWsWz3t*-_|jWq>%ArJ$dBvA@Spg!Eg~)xAM~fI2pu)J|Ta4J0V74Akj@ zVQuNltP;%v;XE^b?PRwgghP;28-$Rhyqpx|O06Ey#~Z-gbT4cyIoQLtPbwG@kBbQ5{!I^IAHy5R)cT#k4(uzzJp$5AcT1B~3mGn%IOuU!MU`EliTEY2H zF$TF9XW#~F&A3y)Oi3#w=Ap^Wz4K>oWVbMS=~O@5bmynV)r$lKAo~ zP3i~DlwaSU4Th>FnMJE0Ta~yZoZ{{02vFpg&QVvXZI}nBJvBjtb)t3au6%%MfW~I- z+$an6Hl6qFK;UJB88yYb)PBRy^5bL^;=9gX1BJz?WZM80x#=pknOZlmP94tJ7YHQa zlpgj60NPfMEIn8kq?LM+eXwv_$NA9+c7=a)a4h!JR|;|3RsD29oNcT=PC{Kml8yIx zNUKOK@p;dwy)}!;*>4Y}dD{l)MaxV88EqSF*XuPki-oCmo&XW!sXEpXb5fe(-}0Z@ zygbX*I*^V0w2-xEB@LFS#pbRs#J-rmEHtv|!Sa%pT`pfC#S$eAG%x9nDuEldfwjea zxa2D4$x+D3_Vb-mW+{PXpD-9Ks*%B}Rur$5dnV79;l2FD;a+VwKJ}?M1 z^xQVKey*1^6)$Sa-wGs!|DD9TR;12G%yrW2!jdvP zStamlag~qV7u-e{^f-yUJw0|>ghViX#*aXx6XPF>;6}o7Etti^VeF(AnY#;HH^c9l zuaq?DwIQ-~+<52`BM3V&>Bi_q4Vzg;=FdTjwB2M)*b}}Jt>Vu7Hg$kQ$$$8`{k2Ni zWaIW6WUUjz-C116*jPk+hrU$18B$`6PZDvhrKPsW`f0E#wTWcn{tf>|F3TU4AIA1* zb2JYlrmx4YvCCOqy-Wz)NW<(EQ@LceI0HZ?rA!fyFU07?Dpp#|F7{zpBrE%< z&>CU6K6AO5B)~(xe}A^B#*Fq9snckfb?OHe0WXJGmKvQn0)9!<$!Du6mhKsBL~5~p z1CYQ$uO3_9vT$`9V6FQwnhiv?^pwef#ET=w%#?kKfIl%&Gyeg2ul~}+G=^`J7(&@E zq8bFLXo|;C>{~cea-&fD0&RAihfYNqpj4w5QQpCYx?+^(T4~EF+z6uVD}SAh3vwRNEdGisbkK!LWj6wP zDIF~E!nCtF_$eQK+-fdsn@}ji2}1{cviW=f6M95Sf6k#zXE^daxf0p2xVgiNtY&m?W9laWl?VbT}w|nb@O_xSG43j>szkm?gU~Hh)&a53_O;S&s*i{pm zEjQU0HR!A~gAupwoS-@)7d9P%9_Y!1*CK_o)wp1o(6K!|&CkPil%0jlj(H7_XF zzN~%k7%*GLtq?O82qRwM4=S1gY0I}tS-L{H#AzACKoUzlkvy9qu@&6#J%qWpevCY8 z#GUvrfn?Bxy#Twjt1YW$g-AYnyBl$uT6&j&5nu)o2RL}|onaoVk;9;dVimur)L}Q~ zMMgkhw;Jd89=$~8dw7E#aZLXpYSwLV{b#a>_F?o5L65H2@*(nNgGD)>RnJfJr7I#f zL_F)P$hx;HwVJn=TcoVgT5t_*{H-xrPSIKZ>&Tw|Pg^bLON#hgv~I!ZbUx4FPxC!S zzEL z8J6)ybeUxs?7q^Y^d)|HPp;#m#qTc}FkFh4Du{YNKhg`_Ql3mov^2||WLIt^ptMM| z?pQ)BPjJb&RT6$3Ol7@2a5fdm^9!NX`j4*P{Pa5cO#LtHI>od*4Q;EUE-@T=vPDdz1`_;WVm5 zddUheaQN3(I1w|nwqj*j$Kayze)R!K3)CO@0+ry?Ro+3;Q>8kPPw^<(q+vxfSTyQO zt)7AcyA}G&TmUjUgCBqO*W{O}lAV_WC1)HIJ4TVe4DWeffb3SrLXsx!DE~(2Dfl8x zKsVHw;!1%i;E!h4l|TkKw1$*7K=S-=X6cQ3=Kuj)aR)FJj%426L(b&0Kz3kqg=F@Q z*A8v85=%*_ktU$Cm~jHOCNP%If)3#p_9gz3V0sqF;vnd(OC#&j$KB)ZR+{_!0L2lNax z)!o(A)m3+0*Li;qY`yK4x?8G{g{mGa-!;qb$Mt`t&N}JfqjPWluEM>~%bKLGDf(<< zgwDEwW`L;#L$&u}dak6+oK@X_#SgD|@lesSyyM4nd>1e*J5tWf#B9Ttixqp--eBu7 zvIJq^Vm3Jjv}{E=Fin3Wuq)EcuJ$^ye;_l@bQZiFTI+i+ex;bit(~6QYLpgn<({Hb zWVNUC`Dq8$p5cij-^1+XX7F?E5;3lBl+4)Y4F?JK_gW=Mou$XA7enW@=j~JIYA(GO zf!(ENHi7Tcs&-T)jq@$y`A-(xS+U-?T;^+G@$|xrZxh|Pf*ja^aFuTodfks>9bw@1QfxFz=Zh$uA3u1)~J@JBuw1f1*y;0``Z(GbVO(9Eaw_ zTZ_})%ptsJ!M=CrNf)}c!878uh=rz_5IV|wQ7`O{Rh(zpbF6zNBo3nV?UOe+r$(Qq z&(KF_mgs(q7S-th#PYNHql&jn<(jDQ$M;{!N7y9P=sKHRCe<`{?z)9I&#qNq0)4srEU-kH1oe>kW;!euB5YyrONFN_9L`;)lC`BYdbQ~nn=}v0J z?5>-#0{xzPvoc@0Sy!oRoIftdqpSWw>aJFgE%i*DXlJ|{I&S5;)Fxg$X4Cs(*7*lM zqqRY``lRu9BY%YXTpRPR5p2>`*?=kmy3P+XfHe#;{5S>wkfZRT#(C+tB$L^S*D^n5 zcH&DkgxR?_)Ytipukv#AL_ zMuUx)d@h2L;l+m=k{HAB(w^>d(rsBea4N<1;b}6CwC&4mvgpLo)30)MWBI1@rC4C* z&JY$knX;>2rJh1Pk;gh1O(bc8=fWIK( z*@@@+Sz%o?iZ{8O(caPf7j^DTg5n(9x`pHwS1+5(*8RVQW3P+UbIeO$C+8X<98rZG z1_vE7mTD}bmlXHdq6oTd0yAz*3KVMtOb+a`cwZg8?{-H*G4amu?L7=dlEc=fsOog^ zq3~W1e0^D0?t1$=YX=wU?Zs%;ewpp>)E?ej&oWcDBnKO=8og3*ky@+;GNXlZ;mMm z#)$5Q-xyFP9{S3DwAGxwDQFEV(Y-s>o9+jh(6)dG%0nJC5k6EJ@HDBY^<9|tl3f{& zJU<_38wQp|`VreOyLq)_?!mqmoYPBUg-iO{5PK8wsu+sdMef6>30dKZuD0X^pc>u? zYt!2dj$(23kuM{&tI_yD!f6^hOoQsUwi-fq!PpU-cnpYN5+4y-IwIX&F_8z!1^!%q zW?f|WZI9yFY_$D1Thm%0((tF(hIo|u?Zo?#KiBd>B&vmwtpWiESD9WvuU8CRBSc>( zj6_);5^*jz7OokyFkkQc#FzAMN+COPY&FuDrpKS`7EwJKMFIoe190$;pDgvIcS#!{ z_-#kP_qZajFKE?{uYZSeG4hyF6zj51QF+fje5Gus9me$-`caC!#PoAXM#^VH3&9}? zMz))AS9)%zAgRM?4Vhl0;b1AE~sul*SysPVdO>C3gveGqgL>tDQsk|*#lNE%{u zwtb9z7@T!RvX>9^wFvq7WDGC5>f!+i%I-MGA)sXnoh?kNl&0#ij(u5jwwDekpCf27 ze?t-gE$v&570rKkI!-)(MQ5J}7kiyAmVS12lPSuCN5_JOQJ!tY^H2H{WKjxek1RQi z2LV7e^J=-bXPY0kvA*;>(jlAd9(YzK$TOs<)MT^z zn9pj0J_X2)mF&;d>-riqV44?1(JA`XHcn&;jPkGW#=D3#38|0 z)IV2yg!7{g7t87>iU3&QB)7-;5ught7h3!GDGb=}k$BZ52 zIb$eJ+ME3{A#;=Y)_13ZUysE-&{pR990rc6%u4@RCx35@ ze)vopGYav}@pMsFlzEY`W}-^QiW&8U`Zz1qL6tlJM@oG1c-Jclt59hW)QW z-aiEnpOHI6fr?!H*3bQa{O{kj_!iJ<3gY~GjsC}WhZLZWo%!|M=pT*gU$Mb|z5^72 z`X68W_m}^-6!Fb)M%%p82bVX^`@I6I4n-liO&k|0?xxKcPM=0?C?36*$}?4Zx}Y@f zuVQsp*NdbYe`M5tGPt~{>C7RRbh76qYLtubZm9lI1-;$Ke}u55Qx)-2=LlIqPv~@< z=`{W4+<}|^+oP07*yZ37Bu>yME{|ECHs`)-ZeMjS!lYdx5$V`brB)G(!AaDsPvdh` zshj%kdnD=@5c0*rJR4iv)mLwhYk?-8ZEWyqkVTCJ`Cj5b+CRC*OBs->9RJxiiyEU^ z9PF@NqoU22Jg8R}oY(a6Ps7c4lvuXM+W{Z8Ts>YHXOrvipov<`g=kt}l6=iI@TChI zfl?Q`AJnsLSpcWUj6LJD9jg1VsJe519L?!-)x%ty(7=7?vo}%$W|lTuP2-x79CCT#c^+)5}q~b6RM6Bx*x`NB`wFO@EBBz)exafKINf&{PKv} zVSk%}(>)ClvUmL?#7rb!JCjM`XJM1hWp7tv8nLv~hXK#AB4a|B*=p)lUy{K9%F^-yKguCMT5>R!4cszKF-6_CdNp>X21MiAyYOn z2_AixdiZvIc&n3Is6KC;@)C-b6d4PFVaYB2Mkds)jP??ullc+$V}$4-j%O?oCR{(1 z7^SA&cZHwETiy?*#(s&!P^j2{sAJJL*EJO9w3R2FMwN;g>m(`fH8@a#HC{g)%hy66 zU-vR`BUtLmck9=CJRvw}7Y!osv&Bv}#Ibr|2Hp%_s>riB`2!pNnMwT-vbZVNG$9#J zh*{BNM3(+6jc~qur>2l4ltFP02&3g~Y;1xN8@)mOryQ0WaM3T(=2;{8=?Qt!LW#e< z4r9dXM!0GKuK+bRwO`#0R#OA>n~%L9l7p~^G=9Z<&33&v>hvsRm{9u81KP3$diz1$ zy+(z~>vzQP5bLdoS?7f{6K`FHtCN7syi*hs&b@=_A+Altr0`A*1C_|y)0@PrtnK~l ziM_RtpWh-(XZ*Bz%S7AXqx2>{kTBdRQp+8tW-y4DKYbg*ChUC@`u1Vhsg)qh#aDr~ zBKDYXx3)!EB_3o>_5rkYoI;lKMT9;I>~=6ZMb)wqM`o9h(dR`H!cn9UU4<6&(}Adz zloZmkWnpPh%!eWa%k554K=!|5`Rvt+deHdcp!xh2cr7StBVa_T572rv*=)0?@SJNf z=r&e;bWfN5t3$>%L#AXE0n%S7xG`N`MU-h)8;@m+ukbu0tRuu2h@(@O>NXeS`08A! zFtCaxlsNVPQG$oOkW8})Kt5sg(?7>G9gK5T$x{*q*GspA8YS0y)-W%+ii8tH_0^8B zghXBI7Anm0W(|n7lD|7oSa5-ZnrAi71AO~`JE~N=?JK#j+f^Fghd!h@T@Hn%e^@E= z+;(3HM68OHJj=)IAy?I4y^r1Fa}(L^p3b{8VaKLw`~cJlatLB_a?uwA|LA?D%@@e! z#NU9OWB5^7fm{ki?Q^w5hkR)7`@7m^?z`mD{ii%ZmuV7ZAty{=qyh9hkB}*SEZh|q zu{R{ef2ORrKj4h%345It4by1t23w2Gu@V6>WvP|Z(&hnyB=@f~{wVoMf#HIy!S?$? zNxWl?##|QwS1Rbw$^nE}4@py3vF#=j| z_^rwA`?&SPPwxtMZ~7Q+MMb!?f~;<>VVMooGBsTQ&NxxG_d}cTXgs62Tp6UF@LWx% ztojrBhqvpiUc+=sZJ!9W+&d4Q_9h(9^_X%#qHWx^u8{(9?{N#o0kV1cZgyS8FU_Ua zZCM7LuG3YOS<2&4UYDpaV2n9?j9|!a zV8Z#R+rHlZl4GZXp^L;oT{KLjCytq-8vjdTVt99dilh-lm=3<7Bp3I_*^wb(D-o<7 zmV>HD{FOJ+eQfYKoE#g|TWm9gsklce&+xiw#XbwBSV;f)!$iGbKCkGEqYn)>K@D+k zS3;*;RWv?Y*Zms_!3bd>2`%0c1@FzgdfqgXdeNs}dd6At_?;pnxEn}aSNbXtMI?~9 zDArWHk$MziJ*eV>qQW8UTN|0h#3hq51ny8lFoNVe&l+?`buyKyVoce_)(b{dk_fnp zfj&8c^4eRkCdV3WNPKxBQ_mH$K)F$~Mi5)9v-Edxc|upnk8|3%g38TZ-7hTIRNW@w zPhA!Uc^x6ap~M=ErXuUGCZ}7~aJvGJ_c*S$?|o$~<}jxPh8yx!HC#}7NFq?KK|}ra zj}gDI@|(LovwG1?4kSE-LLhZ#AkVl&|1XOheL@mx*4OyWq$> zW}*1R>a=0S;@j5KSIiS+s94)JhRXMjUgG z_69;15rYxZ(3_@58c(nVq5pDGu7c!Dadj3)pvr6KuX{hf|D6e()i!(IJY70g?s*e~ zbrtv$Lm6^alPJ8+Za6NQ%jvo?{A#*)^898Onrhy5N7A&R)CGrOjMsh+-!%MHsm=r5 zzD?VNs!Z;sZ9~&@Rejy-8r9W_HR%k>Qol_TF4+}cs1+D!^lMSCxfOSeT(*I4F_k7N|)Ez;t?2G7qu?~q1|Iw8V@V3 zthKkz?Jwm%4i+3-mUJ`qPl)C&WM$B@zUGp6&TcqXYXfTXx<38xP+7W7EU`OarAJ*^ z3}H<2qni)z)Y)9xVe301Ijtp6R0J6{7HRA3<6KVVux%s_aV5YHuTC5hT85p_KY7U4&G*Kh~J-SkUg8~Ba!agmZS{9Wtpm9nLNo8L(GYIg6#D@bwlyD{P) zD}=snCyyXyLk>+vo&s6(=B|$=V6tfi1EtS}V$F8>-D&qdl`CW{o9c~(ArKeOBg2P^ zl{Z(v_jpj?LS+fpMDEt{Oqb@PiPybNu8WSM!e7Hy+n9Y3I6WI$AL^wVMQw2x+hK_vJI^ZbkFe(`c1H|{t3 zEU#D>suh=Ry{gld_&$_hz=QY4?$*i7CZBW?i|4>?W?7ENnGK+!B7+NVGp@PTbDFiz zSuSK(xr6Q2RTFH7gx~AEM;^D9YfWEg&YD?fl*B~(7?BO>QS`2Udgt-hhub%iI+K^d zq;khhk9xrE=HN2)CFk*X?UbA)<1j7ERotZkm{!-?#tgzNfdLKUA zSTFNH#$(3reClV3h1Kid1|qMvD|(?HpB7gyPpI=L_v4M%1jeSDYp&ZvL=tj0g(0>C zfb`RH71z-E5}k~S_0!r1qBOP4+buuXabk#pq%iF`-QO&(15MQgJG8#Yx=6UK-?YE_ z4j+gj<&jsNJl0>gpIWcs{(PK6j?EbJ;4mwozt(Fs$#!wGNMq1)Ni^@<=n_#T)F}HU z`ga7;1w4`c`D)#V?tK4I*>km}_) z9TE_2V|$g{rRUSd^@J!b@SQ^vE#~u*Fhi9cRcPI z_R+w3L*-N5+HbGz_A3v-jZ3f7$^tn;J>3unEnWpd^?UQY5KJ1L4UKMbbY1(h;M45W zMkCIvlW3Q74+Q7?_3L0~&kt*~(UPx;NF8*!9RqI-LIgJN)p_RNPHIBYnCtrJ=n6}Ky!3FY5>vT}$FebT+aTEsQNjr=VSUS=Gb5=zX8#sU%hl)LS$84&Umi zSL#{p2ao?92T_(IXGE519PUhP`_|w7m1uvW8N+C?{I99?8bzPM+>JSH8A*-fOEmu< zTU}Ikirvf8wuv46)<@c#=vpiaca1{n%*)LBxjrjd@#Q7k&!Chy++{nH1O2TPL^a(4 zmx!Zvrqrp?r6|}(#erThQ!P1q_Gx6wmyLDNObR}ee?P>G5)~qOLXFwBn^F+{aRG`+5UqS z&a3PkaoXiVXJYMc!*Ogow^cI@T5kP&u6Vcyi&#X2OQ4I5J>hBz-(vWc5qn38znHxuA$Y+ryXOHa%PD!XUe z-C2K8K@Grt=W6=jrfQ#EWJhZs2mDw+-hB#5{ATdptFr@vd$A$>5HITLRdgsybH}F& z)8%=!;p<*}Sd2sFD0E%|&R*fKFdY*}05>`s%-F}fG$a47^IzSVcL z)+pAJLGD#@;v#KZoVY)Kzn#}E@LE8^B-FLx?%4Oc%Zvn@;y&s`lO1q;3wp~{?G;C@ zHV@hjmx%EPC{sp40~?e<+|r;jbNdz9^U^8=)9ytA|M9!COT_$SJo4(q(TtDVlGllL zVF<(xgH0+Ai?E==h?mZB(07Ji(qP$q@3)4}((giDyHnG^U$@GsKccLaDpND^+87;z zcHYT#^)zAH@mf^aPZ(s$zZQX>XSodTUaT(vYFM zDdHgvB2V8(5}Bg2ozH*dDRIpz%bHK}~=gsDux6 z7JO@Ny4&CK8QXy}9_-s&jVtZ8UngGB2ZrP?+97_a9&vJOp@-eICzlCNu@G1Q!Y32K z9?!{2ie4$Cz0!VZ`lS6 z+O#jN4t*-C$ilCx;dC3Hwxrp9&7>@-r~B@d)3Z`P=li!Rq%IPZUb9dzwiWgqF}k%{ zTWmAmd@eGkz0thJL&H0wl5PPskLBW+cW4$5w(e<|O#4OQE8b9>GEBr0e5HD$bZBs^ z)9d*XJ$ooeJAh095}{36dpJELOCDC5M`Zd1NS{cVVM zw6DQ=q%_*fhe%Y}Lo)kGBu24E;xr;(qar^-AczB!t0$$=dpW}Gi|39cWBdBaKf4nA zvcSwiJmU`x6x7(Ae4yj+mmo2jLtAibEfFLUb2Rv}SnqRJb@F%D`hx=- zK$IQ4e*SAv;|ZaZ65^@zAh{T!Bi?dSk^pFBI5)(>B@f5Lcz9l0({Fkt~z75AiYK@1wjljL`bwLBxB*!IR^7~gmo?sZk*u52fcZA2pw|l-L ze7rQHZ=RfkZ0EV|?12p1A+C-^O`s*WMrp>Uc_EG7Ya~cGn51wItxnHlY}D1Rs*2s_ zYw_iWrs#&E(0v3EMoiQ)#^^Lp`eiO-+iMll<+6LNh7f2-%~M}Mkt4S4o@S4_lR%)! z283d<(5oPcYxoQ6MD^uaXK5a3_b)_8fT)k$LeU6n8G8xr`7VVd)@6P2Z^!^M;qTLo z>+8@%d}KMz4BqKh9KqV-&*;8f6vmxz=pCIFS6Ki84u_+2Dtp*lZ1uD@NapK)8NF9q-)g(;Cpq z>O(!qu%Nx--pFBoAFNvZk||jZ2(64e{ai%J{4>?OyFAU*C|+;G1oGKd5@_D*#H)wB zsj*7x)BLPk4WkhebCKAzp%O~nddgF2O}nU{c|cf?9^Y9Vo5e?5o>r-F`iLb)IBP;l zKlxsh9u{?v^da|gw%v82L7y|h!a6A{l#BhalBvz*3;scnQL4yq+Ur{Qbbpb6wX3bi z%Z`2m*Tu7My%IrhN1D0dW6qf76PdyTQ`7};6tC*_J5s12M~gG2h}9QD9#^SuMIt@ zkbfDtX(pA}g1V$59>a$nXbOIk|Cq6zu7+s4{J51?Ypi&u_jn7#o?oKDZ^uEK9mbq( zs&-{C{jfV7&)87d`n#WmrNXTcoxP*65+Z`hfAa)=gRJ|>^O-jxr;8dotC`W&$*2f6 z7wCw%x5V-j)!wsi%O)fEzSb^Bx@W$1KQm2o8bDHuq*%^Rv4^<#&sx>@Rk(Zb&Ufa; z&f~+YIH(lTMoKa5CXC+-2^W)Y%|yF*a@Hki7M_fn{X?9S>@Okb#U4|eO_Ga z`3VV!Bsc_#a2B+CZH`Y?&8njEI{HI=bLX7Ycbdc}f#NOaGTZd1_GyI%AT<(fAGJ{48Cp<`PMFJ)ABR=?-3f#pFlF;gb>JO6r*yN2F&C%fI?NS5cIR--hQ!J zO(D|-%qy8Jt=T-F(deK#SI3=dpmv`hE22Pd*j1ylo4$X5ZSF0nM>Jt?W2*qhF3;}L zC`RH|_!@UXEjX<5Zq5=ksFOh}@|8_rRj#L5u*oh{(!2+Of0Xv}F#+ zQi8o#yPbK{ax4rdI8D|=U>1YtwxGWv{wC2U`Q^0ZDT+uAVgM;rs`(T#g$o)pSC0GA+L?GI%jCBe>BYf6ibt9 z`I_`#?QOw>$P$i_4FPs_Yuyq0iIMh@C**W9(hj=0zfiW1ECAU7>zy?{W3#8LiCVO5 zN`WKhB6Q2EROO?zYa+phK_d-CZ(jjR1W&yNQcCJUv^1v4C&YtX z{_q}ZjW@63d1iFi&!u+TsqwWjOUt1Qk#wi!4Z~%$l5`54$1W%M?fxei zX3FLl8e*8XDA@)Bq!x00aXU)_M?QhS(Hu_z0)g3i8vVebIZB z9pcXE=Q^~0Ww@HLv}<+c`l4WCu<#SV#sbnK>r%CX1dWg$6PzY0B2@=)_N>O6iQ4+w z5^eq4V(eDR@>G}H@L}7O`smE}_^NTit}+gb$jN3~i?t|v1qClrAzJJ}H)Ko5F`9MP z>6T60;!2#3N#^Iw2+QG69e3qiptf+!)nyJ?6OtVJs&(VEOUHC-{G3;qxQ0NgSB`A7 zv3z_8)D!lsy=~Bw*qFE^z@$Z!MlNvPA7qZ57&Cv+z{2I447W_%4(uPe*Ayj#->{T? zXLl+SOaJofl-FEnOeR?{w>K@7XlO4BvV04gCh}ey5dXxrPfkF=th*4?emRc6jDXhm zUVS2_{zVtw_}k>C_lQn$dKETCL$P3FZ56(uc>ah$h>w zTFd`&wE(|xDtlBhz+H)pi_2*xD_^5(2Jk5bm;*i0kILe8%0#-K87(Gy%MG$9)!S&^ z7_L)eKSQGL`p!MH{woQd^-kKjR!DeprZbBT@%cI^^(E5_h&9`j5D*7M@6Suge5%byAk2lxYhWlwjPJ0Emg7i6m zDMQf6%bHJTtQWxKouVj41+@#(kJb#Nz8avMg#bDQ6n*{M%XK9lgoYRP0qy03riQCD ztAWW8uSAp-G&AF}4O$VtJj2w(qu!knBaYt$D1pVgB=nc$x(9Ybhzdk7PTqG|m97aX z1XJ>)fO+S}>3Qqc-?EJ@kB=9ETCFpBy1;+;WTWEbYe=Tm#@)zlbmB7H`bFW8i#@GE zHKz?|#|NUmYJ-A6+r6OOsjuEaorm~1^(2O!;NVA$;%U%`^M07XK?8cVluzfbBMo$l zgVKOXxSOZ)DKnQF8K|J+N>^B)3-@%2MCNkonC4CD?m`Nf_RT0R>9?YLl2BWr1bxYc zBy1~tHdT}8FxmEDV*VF6b-}Gnf9x`7ai7nFmpy!E)A)V(`N@WbI1%p}e$U8)%_(43 z#ji&Ymk=&}r$LD2vb4{z4zfPtwkm;jPr&$_>FSSrDRU_-eSfwgvSJPK=0|ulVnV~W zyIIv*EwB15O5S)imYElqaC-HA(yDb&WSyw_w9Kd{>NOCX(JYS^cscB$?8T=&&iz*A z^j@#9#LQl!dt#-^PcTkKS&4^LRJ}xQ=14*chj8OPi%!>-`>SWEt$9w*ElgeU4;gQV*e~4Q3JKBZ>nEp?vEE5jjLLM8PZ*EMH*#3ON$o!8M1LJboa9D*0XTqX524Pi;4P9NaCYTWz+pQ(rj+!6|E}|MsI#rVf^|qz&wk@?*OM@;yFR^i}!j&(S z)W;`%)Lgv~qk7j=C1C<7Y!uHCnS$#E$=M%U?uX?;i1g20)85uCbZYq;bT#mJXKgyV zVJ3BYkUg_t?jD$YBwc{1AXI|)a%8&t_#N4LYU8mYh#GI`x4zn2H%`@`nB2=nAH7D| zN3sr!uP}o<d@~F2f(?S+Lq?2?N7l za+~4Z12aqOsGCM=JNGx|?Ff$hHrKEHVX20%S_)Tp8ac|rhA!LxU;+G!=*tfCj&8TT z(g900-_!o?R}AZ6e8s|~F@@N)Wz!-p|M!`1=moZ{%OByY~p20lGcU|^}l<(5OrrZp6N z_{HkPJGWoOILPTdjtOdkM225wINg$6NZiY(*WyY#cx^&T!mU_-8>&lCVB@iW4m#cP zO^jxoKAQ0BCb$?jh}hj`xA{_w;igl_7)Vs(#Ce*&L=h+1GD)vBoALaxsfi4&3(W-k zy}q)(&JFYF;CH2VRL{W`Ta;)PO<%S1**@|dviImC;+lo`>})S#P>=V@?w4(CgZPwJt?N9lnSXP&ZiV6_@md=OS(4Y>?LwlWfHD1LDRQZys{0JB2!m`a08#>4JHZcsWPXH zi&zRnMupslN`ms^?Xz0XM;ykt1|?Q`^7PwkY(Gu-gvtiQ4kRjjCSH7uZ7I6ORAXFy z2}+;pgeF>cTX_d*=mh;76vTBW<11+CqgTwUbR?FQb!D52SI2{aI$;t;JyFk6K&;I& zmnY-)?E`*Y5@aAJH+A%hI*(StVnNs*PiZ5=gZE@~bJ|>fiI?m2+w!;_EgC53ZbX38 z_(k}0Xw%VicT9Ezo>l$GryT3$k_JW3DlO*AGo_s#9nDe56@00?^x z&-L{Fww-Jj%uA*`G?}Eu^mJsoW^md{nTsq4d_B2a01H^3zb*CQ^q%{8@?$W`)u$T{ zhZLPG1wUBme1i>YD{YVLJClI_Ovn>`sBTFcVuiMjgt!vJk3luQits({GUtoOa)|H` z#Iq8egEG$Ic4E$~?VJy|=ih#wK7Kr$2!y_4>zDNzG(I%*+hsQ1{)Ng>SC&7`R{JM}^@s!WS{xg}3bH z-gI1Tq(8`_;LDls?N>yXj`(>crtatNknlBQ4~NGzci*VX$Fp7c1Az%Sd^JMX^8SaQ zTT{a)Ep4NZDzgoATU&=8P_W*p(q@(i#>iW{DUYr5r4$RA-p{s5*at9Hv_Yq!Z!nCX z+Eu0bP8u9oalBtO-+`YalRl_wq*&-x8 zRWHPM;VlsS`c&~kw_Wn;>B-SmgGX5wK&W!_lp)s^^#>wMmb+7Y z2jJCYw6kO&#hWHP`$^&9)O`-9RH^z+)6GgZx6>8xmFwxC!;8t%A;YL94XVe3^o34) z=gP~avT65mL0%fWhYXCbVa4G+N7N+kMkO~tuOl&+#~(F6LzKjBsq=Fyu$H>UzMo~V zP&-k!<6jiuE&S=jXeYCNnR#`V{g#2h1RWws$})cjfaThC8&!<@pOp|mlA_(D40$mz ze^x1ztgLZif-)6Zxkc|*YRK>6^a10^`eaYnysk-&O&4lnUs5VV!DCi?Re2x18cEuU zg**fG7v09s`Yt;?1-7Jgn}7&P4)2H9M}odMJy+fSlTIpXF>ag^;QO2&lREj`01vy5N+drHDxz;)Lzi&o@zTNhdYH+iN;L;*);`%aPX!Iu1E{eny~u&&Z#9SdLmmfq19M|m2;Gb6NfixXjom{F zBU6Wp4Lod-jf80aseolYqbQ_|ga_^13nmT`-_8HBX%6l-Hrp&`jqc0v6)LreG!Rxh z`u=7Le3?U6RzqA!X3eEbZrrg4mp^^Wri=(KB1Is)o%snAuX-IVZMkB0!o20%qI{N{RMrYR<0K-jF1q&FBgTilzn#j8$+IDC-g&SJCN8eo~^j4#>}~ zTM0Qu!IDmYu}lcv3zqxio=xUf&o#y8DqhYITz|gFMs0Epr2zRf$_gXDX*l5dIbb(k zf^dVEz~?Qbhu|9~u)NDeapc1)`29^09=#H|RS(SXZ+q@T0Hj&SR<-y@I$Crx~SNI`@7@5(I?$I&cC{z_>r~;;T(nwB69^u3) ze56ME)~a#Ua;D6MUHm5W2V*t*7+Q`GlVf=*%^GQ1QI{mL(&sP{XSy5%gSFf`2%@%5 zt^qxz#|baW@%z5zQevA}ZTUQO;sy!)%~@XWG0}}}U2w`q5OX<{#v$Za7V0*Fdq>der57dq{?cG|??8JOA^C~Lv_zTiU$`>pnwHMI!Av~%+`Fu`FHnp$R6f{V3l5s-5%ZPH)VmIt?d(;uRpB2#d ztK(~(9-{VRi^6Hy{7fNgY1;l}GiWE);^keg+zFoAqYe!(9(wy~**oDA#xA4-an;dq zuy~K9BB__}#R&Gxw(YAp)-xpuu!J^?R9LOs7xbe>{yHQ3@$1Eetrd3qQ-5uxBrOA+hP*xDtc$ zV0zc}FN&OHr9PN85AIctpFbWbcyayS&fcePh2M@RUHq~Zs^A0N)6*;JX@eT2Xdh@z ziK!KBW7x6R>d>+*=X!0{hH>Mk^$YJFiV>V=)Del*w(s1fHk%8Z8Q|e(jimEYeJmV_ z*&=XDRI}E@nrL=CpbkJiiw-|_#Qu8-k%HUX;IgB#d6U~gXgxLPy^me#c(NfYtDrEY zIQYCYO)E4W+^vKo0PdicO(~6&?7Zv868}lK;T=(5Wxa6_ILShml13%0Bss*0s?ZXw z!hQ2D!NvkfvHkh7`zG=APH>yHjl>cx5;cCK_L*aa8n=RfUs&?Kz*lKhcKe@VI|3VT zWR<5KO)eLO#4>$;i=M_FQcyoqY*}PXcx^O|JyuepWD_qwlx3%)CTaQc7r6rdXOUjB z#upR`k!{<#X<3{{Tr7b(D?eWWbG0Jv9RCpVlv!S-7pqnM15cF;wZr6)4u_#u8Eq}v zuNdrGmKbeb=I9qOC%|6lo5|8eTPdTHW`K7*C?a^2^GQTDt?`OPvvIYzkR2dDzyS!N zK-mqUx0H5UI;ibWE2N9wL^|wwOtMJ`s1`;gq@1Fx&Qz_*c{5i^bjj=qT#Jhm=gErr znyG3+aeh@Z&oKk~&h+V=I%2+EPwdF!I%T8j_#W?dAM!W0CR=}D+dm_Zp_eVS8u<3A zYa!=Q>4Qg~b-`qdi7H}^7hC$nw466L#x|X{zA-^3`k&}W{RvUbs1MQ9Lx?;<+N%!y z(m0yd#k_hNVUbn-C36sS6dk7tg{|zL^|p(0TOV#d*fpP$YE_vQFP-M)QGr86Ox^Lb zohK82zbgBQC~!JH`DvHAxxa#8=9GXk_gZl9sGsR62leEuxeOe@ka_bUsF`D8Z94DXBv6WcQJ$LS7JVc3NBRrId{BDn`6p21V9)i3XQ4Ttz7an|M;0}lYzy#Y+E5Ba zlN}&IUJ3ivDsOS;4}bN?-(rm%Rj9^uIoU4`UuL#dBjtJXm#iHhDd-t~+&Cy^cpvb&h}E^#A%D(}JE%`8Fb8a1oZ`^|t`} ze|u5>{^+b6VCbk{vw;8WoB#1Kpdcl{F9l2bzoQhqK_Ed<>lbQ2u}wzF?=9)0(+7*5 z>89~qm;}(4YDN ziUJVxXz{?1@ZUW5|9jixC4iXk3&{GPQvZ8DpOM96fI3Gr`p)oA%gldoC<1!|fsg+3 zQv8zz^1n7j(17dmg5o{5@Y=<$9nE z#!#W<6%<$(u5I)0rudBTc>O)-)o zKo|6!fcE8oo;10it_Yw~>P<+%Be|EUOwx6bawL!;7eNxZ$Vvwl4#CnWV4my6=%Ru$USDWiGkU`51 zUXtG?!NZQJ2=x#DoD+(2!#brleNfR_hN!3@Yj#tfM)D6u$!C--Ia~6gi$O+{McWh@ zY2xE?rgOHpi_?jRZ@Q;6Stz7E3}y@pp0>g1kE^{?UiuZ!WWVCt%Iz%hrV%B+0bHaD z6bnaFHvqF2neF2zKPtl>_zT_0vatWUNyv$jJ6J{RfVIJpIinN5uC6WzcEdE_1dJ$; zV8P5+KKccAt@5QRP9L&>Bu!$!o&^r2a7hCYZTft<#JE^0X{$pRkfN+Ff#D;PG6+$H zjW)qiquQtT-`52j7tI>&0$|Eh)6hsBIsvJI^TmRmQ7l2Yf%b#ViqvnZlzBz{p%tK6 zDOZZ=w{bOQPtS~q47#*>UD|0iI%M}uHP{>c8GXNa%`Vb*ccG)z;#U6Feo0rm!EPUy zsjDA=Cd+twHj~1u00g~CtEX$0nL?%@1ArCAW9HyC&fs^=lS^bIHN*byz0r%45zK#V z4C}i%T&|1)j4lJ{Sr~6UmsTeoG3zEgY?h)X0gFRY zUZP?NE}q#)Kab&AzEgmu{YIryAJnv4Qkn;3I3U#vK zRTu0Jelv+o$h+~a?c78ztGD0L)vQIibI- zU`M;so1mqd;R3aSBSH>3O^4n}rXI-VpU`ad5e)?AX$0Zdm=7jrOLD)DaN11Nu!Hg`0MnQVXxp=mO%N zu5=(v1+!+=57qcXGoxs&HX_si?nnJT?!2!%ww>LX5KSgrLAU1Li>4@n20>d7&d<+B zhcX)3&eh_CrknLAjK(hyW(gZ?0kCdZP9RUyu^W(1pj<)Pm%>w9Qenb`_C^dMMK96J z5okB zJJWiq*L=HAmBd3m_GTh97ABRDXaormpum{xj}|oyJVH~(M9PU5MJ5*XsQM$6Y1ggZ zV$i8CbJ?F$d+yrmdG2H{R>a*C6Ual=qx;r`mr~rys$^d0J3vUWTV>g>eVbUt`*TJ#zmHWsj+`ogTl`7czg(7Pv1O*wy)V$|xD%YqLLb3`p@J zHj=3=h{bT3icFdGC=gc7#kD{pSZP_dAW$1YzUO(lT65AjvcqYSFaO!g?R~25LUqD~ z25GEh_sUhP)gbhpZ=8guLuOJ-7cH)zB{?ivgMLpzK^tkD-?A z0Zg=_A~IARm^`*~dEx{d2ZVwBKzEOSnA_P(_y4f>mQhu0f4sLM!lpMNA>E=#N_R*% zO0z*yy1PVLI;2xdy1O?G(jwj6-SsRy=XlQl#C=}hG42?=Si^yfx#pT{&R>2%o@650 zml2BA*BQN62Z!cXhYRUXD5+fPJ6VH;>FP*ilF#S8U0ErGm}HV75z3fW(zdMYAEe{K zw{dziste`cOr)3;)`&1%pmconh9_&2&>%jD<8i5MM#5m0Rxfy)r{sM7+60#sT14u+ zI2m|A+z@wAcw9LXZ(h&BNQ3rE9{ew+VLdu1=RrU>N>Da=+iMeca_AAmMhhT%ULgu5 z8m8fQ<}#I{_FShZwjD8=v09O%9+*?=f5{u)AaFTnPDj1u-uE45IoGW4+Q8)%J)rNR zTy^emxgxyM;ve^wv66x}w)inw+DtJDv$^g^9RHAg(>7Ro+(7iP5kOv96A&k&0gew_ zoOW-9*e-*e$%A~0VZzw=ZnPeQyXZS+Y`beIx~uHMD!NQ5hN<)tdtDbW}U zE>&?$2A%y8wy)Wtz#H$b_ueA@VN0E%WAvsZQt`HtfQliQL>jk}Z(%Gezey7Gl|jnh zD~$!5YgUDV&$_sm{!d!fGiTURFJhrGT@bOi06$qXF7q>UFh))8{{L8Oz#EYtwnwlz>%xX_6f?bS>50)p_EMeePLv+)`#G%8<4 z%x-o~dZ1*FHufFU&Y%{FZG*aj_zS%dmzqQF7}tLwg4dPzudjs-D$0_ z1M^R-IGh@+fF?%HtwSp&RsSHAs4h+%MGA6dfBz8v5SWU*TC8@gl?iqa>1bPvge(2F zRUSjVz{}=MC3;Roz0c3z!b0YeuxSTL$M!+q&k)cAs1H!Di1G1X#Ja)}J93?_4++Vk z2_}=u#D|%AYfquf`r~e)x2gd^B2kNu@i5#+Ome<>l?xT92ezx<;+(N9q=LLy?e}J1 z9<2?GL5*sxR|pKdQQz>Xp#5{~dYHg!HG-ZnnB!3;wn*jw2;<>yi${2xSno}SPkHYq zhT(WNu61@#&1G(xhSs|X-k#aMHd3G#1y6Y_=il#k90@xlPU6|kGUgw*f+MT6AvdUP zr+|IAu|P?}sZ%eSNBRnHiAnH%`BUiEd!6tSKJH^8FzlgP&(WFk$EW`qQtEunN*Cz_2Y)v#JunT)5%&z*y?)(&& zdv<}QUgsbJZf7Mb`fpf{qR{xU(C~+v)-K{WzGCc;#k_gZh`3c4@cMvpP1kwKZQL6z z1Gd4!dGm0ddmZ=|QL1GI8>+<%9OlRi-@#ZeC!3i(l+v|!2z$aBx{U8os4jEWs|xMP zTxQCRqIXfEpD=S(^2h?8C$M{)hXb^E=_VB>%;2ZAs}1^@^&Prr~eW z|8NPx2(S|Q8Z`=hJ2F}W8Lzzv_QbMXFQi+A=^G1qE((fBE*3nU zj@RX9LIJU9!jK(V9`LCgDp3^f3!JoZrvRHSF6ZO-Jg9mpylxr5DSi9u?L7B=f<7oR+k!6Jum|WcjHr13Y0dFNEx`YqoP z*Vh4+O0ju+{NUhVQkSaMs`Lz4X18FmXIg@g8$~ClgOI~g`i&q0nYTnX2b38CeGxF| zOe%2b^cccj+B+#ZX8?9{5OX#W@MEbLoC9&VhYZ-2sE)ZNFZ*x*?hXTz3Sdy+1Ecs( zsWE``!>UyS$Wc5qfYo{HZRZuwxQSUy=odr8U39RR{`D!YmZOR8bP5d;WJ0&phu@Tde|^F+Grfv@W0sMO%5&l-7q zXX=7}``%t>tC`pGl(fqf9qfWW2pDbfn*XPD(I9@`|h8H z=daZQ7$uLpx_DT(@&2)E{Sl=R<^kdz@*bd?M}L2sUvV#R4ItzqvRm?Q;Ma}+enGN% zAMv{s>LUDQf&Bf#vx^dlUs#8txcs;LjJzxm3HnYfxckTG{>K*k`H#YMp5t9RPl1~Z z$)*CrfJ04~(~tgPfc~7-XRr^Q`LSV$0{^*oe%<$+ivQs-8?pJ{-@{*C3ve66FrN>d zU;cA~_+c7>$3O1#Q~y7_3q%3n*+}P0p8e;m2>WmkQgl07Q2O`hxt~!_L2&8=RgfdC z#6PyQU+-)F9u7I@TK!8D<*&=;x9e0etPYZV^lNdTN0etP%kuKrC?I%+W(96hmy(%T zF(NXOr3i@VNN8vzhE7laM+k68@?MI_Wg9wc;~xr-Mr3;i#5923g@|Z2Phgjq0KDXT zf?Pyc7|A0zh#!NMI16RDjc-;}~fnwS^U=WIsS}VHORL2YaGumduz(T7{ea zL$hU)hLc0V#C_GFpeA2<3Slw-@E>OHHqF~u>+a(&K!{~~vO*H#exd(zJ-(la!&o_u&UsH3AZJ*!34M|-w2mHnD- zIqfyv!yswU!O+~GF}dI{=5W)J!}YmUXb`ab6U|-t{3B@g^F@D&<5z+00$6PlWd?oL zR$Kt%@g5MEtqequ#_XxQ{T>Ley}Q608=@05pRSglEH}bTCiLG|QdCfw=7D8%=C8G~ z{MTEjg24V?0XYGeGsOBGZNQy<3F8>}gKpV@Ta;W7`z501Tmpc>bjSouMe8D)f4#*A z*iSH?Vb1&j;!YC`K|~X)OX9E*xkukcVq#!q08qnI+G`>M7%m{j_AsF@( zg(n=!)9N#%B~ys&LA&*srb9qnVwP|K29x8yc1y&6?3hC$fXS9Y&wh2bH;`HAQ^;j~IQpEXg(yHb@b0q(R0U7(}8ylzn>2 zPz-C(pGX4~cjXi;MfHb>)QMJ@3yA-=9rKrCg067G3=ZRf(ghh_%pF6_D=iWjU}f)G z$9e~pY1aMsDg@;{2w>a`A>_(pRLWD5CTScLORYvPM&CeVhW z^e`fF0BeCcux^#j6R;Z{ApW6oadEqQ8vpUS-ctji(nBEBxZ7>Wu&W6y?k`D{SF$jV z$$$!Y)lln=jg9}~w>S>8Ir9m6ds`jGz325AKZ9c2lW0YsAh(=0x6uFVfd?qr~;cZ352X#gcT=@!r>g*xhw|jW6(7O~U}otX91Z_7xB=vGG{@ z*SQ8vB`(imgfL+7ezLdU=0m`WZ3f(C{riw*4}eCfP^h)t(AbdrwaNd_h39)pU|&$9#9q`o9j#*E z;7|jubQGzOFQ|byu%l!J^6OLn>&5T6tvN9g3Rn`>MWKHh$M<9P{PJ_gaO{ew{~0O! z^Atk|bmEZy{c!xbbAG&+nj0J})%o|M@8_)i|47aKzgzryDE(hE7oI9)zpr@DMTvO; zXKB6IhQQ%+n*Sz8;q~I;;-?pgyKH~oP+)@r!#_3c4;Lj|Li_S~<8V1rwr8@!WJWWQ zN&geDX>{K348HgSFr9x7nEr(037pM{yd@T=V7iA%d{_~0z%eiA?7 zc{1vDbO8`O%;ARnW@&8VM-%T246=Ycl@Vh)5Lt_gL}4qrc@C;Ao$@((+%?#JOZ_(fOozjvn6uOF0NQG^l0q}*1k z|1jrTP{}Zvl3>c$GV3(+l)Bz78(41kd^B97#kVnCV?&Z>ph*!%?HLq=?6jWdclZsb z3mJ?E)COU8J-5>YILa~iKt>Dm_CbadXBqby7 zdDKA8ZF#&zw>A#($#W3wFi?Xo0oa8fM{VDXUIFU+UBDhi2}G2W9Tx-q*STPafDNMy zkg0#%RCIpsm?NL=TW&NWf`N%i{v|Yg9Klg&NuM9EU&%{cw*QjEhE3!LhI!R4Ju7zK`VOA2b373P(PPGpyV%4TjVjW}M5P(l0N2W$nbqD&rwM>PCU zW;4LExZE=Z@>fWc4IiQsm<>a|C2@^u;?xtNs|5iKdo;l@QTw@Gom9}!z}hieNN2rd z3>|=?1|lWq1`8^lYqP+#k>3N2`<8ACfWt}wI3V4=6%(`HjTLDX4KO=S4kscsV@Bu- za+bY&{>KN!KSXvP|6e4Z{j}8a-5k*S6~n7n-2WgPhzwI_zjK&J{-c{95ph43Qy#%= zvdzOj`Wx-Q+-!R~cFzwUqqH56I=LqU`iH89QE(#xtyeKPz;~k2qVZz2*a3xX6yOos z^36ZA2aw(f^>TekV*VN+oD^2Gcz*U|K*<(6aOiH)xG$as(-mr_UTJC-2voE;-e<$k z-(P+PB35&5XGs8)8o;#L?#*h3svA|>Z2V$Uv;A>UczzMR&&EKzfi`Q#j|^d)v)5T! zS(^+*{$Y;Ka)6*3kZ8+UM_(ff=Ldrl743**?49i27N|&|=+AEpXp|Z6mSinTaIB#S zvNb3L_|ZFZex}!IRPotNQli&ECFCOg-1|A4smJRXADk7{Mw>W?({o83iRiH0mEP65 zkn8fbsI#D5kNCFFpTcujdN}nD;_Yd9ghKT7Br;3&Gh8>=i!NXq9PIjm#M5 zWo9h~QZ&KX7Bv0hyZIG8?S$my!lQ*mcGvUb#^lNU<1 zn}u8`H^0NFZ|pX|TUk^U0&waUFL)EGA3N0^fV~u3f7H*#`3?7kQ##6<6@XK-wh+19 z!>JpQuY6oy(=rM_+&ra{nwm(Jj`|%=ZJ}S_*1U&!6?_1|sY!G?rvR68ZNOOoU{inZ z7*Cyg-OKgmx z9%laBmngi_alU=b{_5EhZ7J?wm+Z zkFt}JM_d=0)x#WV(B++JvMekj!_L?i&-?Oew>o)Y*y)M2pCOSL4=GOlxt8V}d=+xI z=T7`u?$yMeVGp%Uj6_4v6aAKvbnZ$%#&@}{HI|vL3L&Z;b8cSToVPd^&O;L2oJ*X0 z@niW^d(*a`HHK>gL^-x_{4?+3cx8DL%Y=7y`&BYf@{}U{=ypiY&g$eO;GE7;uJou@ zEg~vXJk|UL<-x5PLW}oAKRi^E zWAY(+6L(4Ew2U4q&QNRyHyv5Z1v@B`eSH~!xkd@Fwf zt8wTwzP=WWgqH-_?oXBvP=xHC0{Q(dlkrDr+}bY}A$R9Xp(mF~4zoG!%pRc}R6l{$ zLaMqZKk~yjMzT%P4gh3s6tVkxOL`N#JCJPs97x|dj&+~{O-E180>c#e;6^ zo}Sq-5Lj4r5|A+n7Lmqt22{*WdTUQ+%My25x+EGZW=RbJv}!8`OiWBWtsR(#&wap2 zz5-Mf*&GDn`=gIj>Sx|)SUvnqZLw0UNvHN(#0E#7DO6iEj4V@ znV0*twit`7L}C%<^i3~lsF|(pkWTt0i>00KmV{K#hP5(eC}l0OrQsv>WUX`QaI|_Z zhMTl|>5{TV+Nam1t_upyR+g4B#`t)_-wjz@iT78tOSdOn2p`Lp&zx0+>TN9~E}8Z0 zaYvA$x$~$h?QuLKo_RW5vN-=zpJmIN_Qx@QzIv#Y`(|%Z>_f(`=e%FICp!!Q4_Xbh zHJYcKtl7M`msiwieMiMO!o*#_pWwLI%#R&Rgv*;1-MkduO*V%bX$=@a2}uv$X(UY{m((G-6J7 zw*bWvRtDf+x$vu9eOjv2Zh_gUaRP8YE?Dr7f_#jhj7h;cM!6rf<1kq-i~WJBz7GKc zERWw%)g`1uvL*>xO<-CpnFU^O=QM5z^(D-nylxh9qtH1avq8|b`_)d!Z1PteXfe8~ zwCc4C$@WLWQ_PKyLB4CM)9ne}h-3RGfjbhZr8Ca}dqmx@p?`_9yiWRXr1(DU^ywnm zEOf~iHI4q%k^qEWE#S@3;Df4ArSkH=8ZIxLeMzGp}rX67PmOlrM6r`+Wm;6~VOA{dXGP#7d_PlWNQnhLi=`)=U6UWj;$IGV!;7+8IH0eaq`A`11 z1b=|4y8|qF6P6yzzB#&jt-c>2y#A`c1&E<+p!GXM{Ryf@+iaJEWe<6eLq_iYV&C|c zuXFIZf8)G^_c{Tn?3tepY?C5EleV;h{w0+1599S`XeA6W%+d1W8o4+(>cuT(&Yt~SjwRcMQ+~;s!xlchNoZ@SlS6#|tg8m+tFvR@ktco^eBL}y2k=Hd zixRuN@e3l0I!q7cMXY`hU=rM9aPsk>N(yq3tW4T3vi~uAj}D zj!FhCVH^1#VL=lS%-U=G_ZpGOLf)zf;xfAHg2pO7c{gr;V8cg-B0~^yTh9c%;JN`( z@{0F*!zJF9u%1XCp9mJ;upE`5zpH(GQy{?oigW_(n@{#a(C+}|Aw9;v;3H@b5I!!! zz&uPPwr74f0bXTz<$aLsQw{e6d`Tr0o2nI0l8F07MWBGBb6Q<}zr$p>jRgy4w+_4* z!bnfLj)&eK<#R^fk5vm!-tLG?y?j$-8$c#!CgII90Dp}ys+V9W%6RkVU6|$pYiN! z4Y47H`96>N(-@tXy00~;{ZO@9ebCk?NY<+VhZX=SoR}Xt0R9E@IIp>eRk~r*JG)(8 zMR5{NgmNMpd3OCSny5Rtj0RL4N1{ zu9-TLJtI|Yqc9YWd$J0;Wh+FxXbDi`{Xx&M@X`6c!(mB!BUyaMRoF>}-6V9?!`wOs zosWt$c&gd@my<7@N5YQOfwD(2Z{_(>!l|zZ=y!uofDl}6%xcq)pG}9sm0}9gG}@ej zOJ?bT^>RV>N`9iEuEgqT1oLcgfwA%#`4fuA*0PJMzK%%)z+!9>#UlZJAAy6^cu7_YQI*F9kgE>tnQ5!wo#joz<+wIe|As+DqH1^+;vE%t^OTCuS4 z>C|dF-;4~Y-;apLStW4Y?w|Z>Q&EmYe8=v0#2(+57b5-)-ieX;@pl1nlQ!*Xw)#xp z<_GkkB?M1%fz)Gaf)|E3)j)Ds`~h^)hS)UXkpziGJ!`vee#f5sRFQ)O2XFT%&RTNj zso)dy;83C^LjkY{$>$dyIE1Gp8#w5 zV0fd7eA5;c0sxH5vSl8#R_cu5nk z;&SYebA!-#kxRgK+DsJWyijJ0GpATE{JUL|`B!E-l_nMjhw(cAKdv{}O@({yJRxYwbg*p(A>m~JdEd*t4uos0(rpu#o zmhMQ2;4=k_V&&@;1yUhGSUPZ>J0ww{XoC3%EwP_sX~w78$YwX~Bz|(N8GSP& z{n8XUOyX-o_wD+MA%>QB3q_Q_{BPtpoi};%XK6B3~H@C&N^8mBWS}3F-E>{^KT03aINasyi zPWFc*irm*|gU1}uwvMZjy%ygtQ?cNU#e~c#_-J#*;iZ>|pFAgmeD11ab+LXLWfz}> zzp&6@)5YtaAv#r&IAy;nOEL_GAcfNEf^uAUYu1i~hQwMOEpS6oF~xxLEwBO-I>xLP zXyEmG8ehqlIkRhbaC|U=a=p*XtKK0gLBBcjj_uywBfL)3WHWFqSO%H-OXk5FTjQxs z4#PvPm9p%(IX-VntywdJ1jU)zLY8m}B|J~;g{4`5Ek0Fk$hU$eY5>UtI-BXAgcgc0&qx@f39Qkd91#M(8y^3|gGvnwAt zNRWje+GOXr^GLSr7^WA06z#SpoZ~|Td4yzrTxu{`G20%`HX9XJ3$FM6m%5wNDHcRb z^PmGlQUkmqi5Jw&9i*^ik#n^(W1PZDL9)R>Aq1K(o25XCwvxaPfBA7X|FF{=rZa)l z%ltVZyKmA>EoiM6=OzHt+ZQ{75k1)Mkle&+n@v~}6y}RinXvRh*XyR-oOxxz3aN#Q zkx_ntGx$nK*HLxH_SQ2GZ)q%kF3Jn^DfA>>yE5*m?Q*zV4ZfbP;4D9j;4c;sP#1^U zb%V9-G2y!Q%FBto?J3)5`_^$qs^dwcYohz&UC;N_9~ew^0kpMSB+r%ISmoz-nrr6^ z-!~kNZ7c%4d1n<-^bl^XU7{ay=1sYcS2j19c2X7Sb+(A%LWXWW7q7Sb&xaTRxOGX| zQHg3}uidr$6RJ-K1}l=C2vj9bH?^KjCks;);?mql6NIhPXa^mULu$8T@g{=g85}&@ zvg&ml)WTEPI>Gy!GoqShup2D60<{Wh!)ietoFr<+z}(vV1^ zpv)PY9&b~)^aB1-grY*ZYdZJK4Qf2V6;IA@n{-HI29pJ|>z-_TeSk$1@t#y0DOgGR zLAtKZ{T|nwJP32WfSc+!qID}Q6}V;)-rH{q1?CT)^=$Io?Tl2|#~AF>iS%%Xp)aq^ zA5KluGxw96!kccxF|yGkjWV*`_Xlk~ z3ZvQvp)uQsJ{Wl&X?_@Q zODCTC4CDPw^~dt}DiGFPZqm71XMUo_k`mgtztgMN_A~q)nPiOBqVm$wY%1PWULc!<`=q(m?APe935bMdvIjxw3d}Oo%S8q!FpK~bNcOM z`+%9TspwJj?n_sfokpQr*O{Itk705~6-G35oa&tqmi6jFvepl1hdOj0x%8T}(%JN2 z7r&}g(cx}}`N99-1=IhMtF;wtpMwl=QT2g<{p3gqkV$gZ5Ce&Wwf7zHJen8}{27Bb zu8#)zwu-vOfX1{kngL1!3J8$ENH)TSp@P~mUL&5O=}>dy%QxYLVi1MI7L4OIdLj6l zd5ZZDYFwKys0P%o_9d*H`j*vA@!ZuP#oNoj5#k?GddM=)da(wS3&>`uk@%IE3b)KLbfmcgVAL2lu;Gp0K z{%*b`!8VT<4*=hlLfdE1v0kjh0vYlNtk&lk`okaFKlv-t8WOBPdGM0IE-EP&QAssX zDjhjYx-{U>L%$H*L#ziK94!|25V+sITTiIMK}ujXivS!XwG_jz#A~?yn3x}fZ;GGx zi!yVaW~aF48mjv#Q@5EV+OVH#8>l=mQ7!yy4Ur?peQ|j`+WzWOG^`)^_O?iD1)xz+ zr#h$a_!qoju&`v>e#OUZ|sO6uW* z^GDXEBc~iq_YX6jGub`odcU=cN4RoJK3BHH{#1`eZ^^{1vCm+RlG!RWV>7^$y@lMt zGVhCT{>;(?NqtZX_2_6bSWSu+Kc@A<@5$B)Zpi!eM2vl7>NorEcX#jHimH@fYAM-Y z9}Q`c&E*GA0g{h`gx|l7+jBJugp94Ylwl(s>XH%odo<C55{->7GgH3 zTGnYdV;}!+YMZ)k$Vc5lvWkkM44_yyT(lnSp2DY$^}N9=&vcuv(FW+kTluC(b&C5P zOoG_;Bl|62Tp?fNZi~0>D}E&Y-A+MksRu;m*uMO__0X^ou)gjOyU10O0Jpl`+O1>c z)@OlDcl%Jl&VQmqz)L=4MF%gBxQM}P@AYg0OVDh<@D4RRU#rR8S%GLeMO)!X zoj}{uSMS683>i<660v~*dS}14qbW;}n^_x^3Fi+Xw{Jtr$HZmaLd`y+!6e2!6`zt<*qj0!Bp!7Lii7JcG>z0qk*j* zF5LUX{qH}iUopGnnFNco_l=v?tuUj#t7dTn;o0J=YuF$->z_^@Qp0NMV!DHygX@YW zsFQL*ug6mr>xQCy8B9T8#bdlvxiK@7Z=-7=22JK;Z3cjxhuk&n`mgJ&8^*Q0@YQBWdUsA-pHyhK3}v)7)osY6?U}S%##XJPntJlU!DMAHO)Umjc_2_^fT% zZFwYNZfzFti1&_d==~&Idovv{rD`(cRgJHB8l5%1y4e3PtrDzd#Kw${I-CUCh4gv; z{6Hh7%B0D|jn-p#lb^?y06N}kd zcY)BFoK9M4zHh_ooRvZZu&qFEM4wxzL61QB)<|~fJ>WWx7qqYs@{u#cISq%`0BQwS z*pt~dSV%XdkwHp5@_%n@wP*))~}Zkq#t<;zKoY9rC+GzZ5MkrQ@>wDG$K^2K`wYH1JrP zU53rMWgN3!oK+XbDUbM3RI3X~lTJ+4Wh{gpMg+H`&mM?!%ym9S%V3|~&;7ubfOnQ- z*+3JYsg9DcLi#ksJ-=YuLG#O4lG|~?$zjo5O`AlvR8`IaN#}L3y2a%NpXTzX2trW|3*h@UIQ#xfur6HMJF3}$mmVS6BD?{R-WS;yx2>tg)+Vap_t($}1Z z207Q1YSRLZqkiQOX*&fNQYsUUa4QM(y$NyN#vS8O*St|Z<|K%tXlegBYNW@-=I!D4 zCvH4F@${+^`!@r}Kwbs zK&CM2@-2qm*jA{MX=@CjgqZ2^_!cMOjmTX=bex^qB+r${qKRuK>WNABH_=@%dAV9I zyfYzbBp5%4lz>@<$Y=i)?YkuI_s0U@v3JaG0w(;lX@`jFF-V8`v6wOa*emqC6QQR_ zV=#`D0u*p;-YUA=A|4HCE%0BkE>Q>C_+6@?%vf$-DzH|434{9jumVr$)sGZAqR>tl zMeBYnp}Nn<#F9K=bvWTO zm%+yMolQ+^haYL>p)ThY6Mn;tw+&*?aGbz62vJ+mU$4i$Q0A8ce1D*3r zM_yOmcE-`B7QP4M#Ds&A9@|bow(X>kKiF?qs{0tVCf4JJyOU6^ahjveb({`o>gdl# zdi-!BF6yW$|Md0bId#_@ye37}$@bUID&br01UI;8p!asYWSK;U`}TZkIQQ*5wAm^N zIqCtPu@&^1=XA{x_IKoUA)lH05kFQbvDVfpw6IkXHRT#tSi-}H-K8OoclA9VU+2s* z&f@cW>;oGAC*{)qi;dn^T5c^C%uV#w#VI~U%tg27ll^9Yz9u;=koWYXVMG**2F881 zdTh%_YJ>RVCP^A-s1JdfnBN%K4FO>?i|JMMEgNPBIVa!ZY)Z}M#5v;JMS@XOB{tuL zo`F(A;4t=|x15{p(|yDVRAkqEwe8pB_Dzn+QyrCX=wrf2#!IKsGWwNRRCV6W!UX-O zYGtmpFNmG}Q zg5*#)FSB!e`0yFdWS!zEy&GVvhXfu#>gv%#LUh|9zdBa1lKH!Yijn5@e*j_+P61&6 zKH5%ioDSif>cL)z#97m`{l;ShP5iMDT|wt5NYpUqC^%zGC+Qj0Ui4v%S90jZQv39;7d<3Pl21B56k6oC>#4}jDyHo! z7K9n6>~DXN(a}KVxsN^`nfUyK_#%4@_1HN1+0q^nDa+`$$@2Mo7B;dJF3PG`TTmJ^id@-HOhwkL0V z6Z9$v^0t=Ej0C5`bh{*2>!Z+vF&STVIKP)Bf9ulmH-$O=5VXC7In+?*EchiIiAm|iDD&6fdlmuoM`3rj_9XqMu8e2by?6^#$Rihl|Log&9RbvAk~yjT#1#L} z(0_IIfbs4-u{x}@>3=QXzh9(^Vfep{aA{9MMDomUy=omcr(lb>ogA$*zRrAo_)cf; z@BiVq;$ktNl}Et4H}~JWVu0UCtp@ItBazt1)>^UrqgC;W{015oMyUw=w~0+?`rOI4Qt94(duP+%H(h1Y!Z z&qnFrU#}+#hChnVO#Y-SjG=6X_-ZaoM1_7rB8T;x{w$(M4Enmh+`Y4e3hUC>~GkO9& zfV8lvM4YrmjTgih+gn!FTPWnqeaaAINxt#Fwwdt{krX>^vDWByu~@rb*&hz9rFE%D+pzNB-Q-s;E z0-(;jXyn^lb0?dP?AKN}H9v)ufW-hVfsHOwdwJuB8d-OD`Bg8O^GV5#UMH|9uF3h) z#O~N1(~i}AQ;fJ=z_MAbvRuOu$ zHbeV)=>?~mb#_CQaXta3lW@GUOw^XT#)1sc6v#|@`Ceol6>Li`L>}~g(+17(UkCG>pbT!V=fs$zfjF- zmTF{&^;lQJN}xrDq_c>xE61(+M5&wK_3;VL&sK_yxcj*$goQrmPnOg5U9eGd>IZ~~ zM1Z>J483l$?Wi1XVnx2|^5(^Kj?8|bN^|pySaQX0H&Q_wKSA$a=LAtqduc(>p}W*7 zb9$=<;^clw7FXj`RbHt2dbVy=C#6qXt?un?Y}qv9Kyx$-;fU8~c9&UKfQDS7@X_^l zmuom%)FGwsrqnIOwd5AwEz$_KD_FFum+$UeET-;@yjBrRM)y+L!-|7dC9fka5-s)X zGy)mE=P_)XLJyhfQ{@|ZD34+j&zeY`>3KKrA~c2v&+hTroia)LV!ZCp`Bvc(rSiw@f9v%6P?MqF#%qIsQL zOyCLK@4ZHKZHBVln!OV0mDZ}+V#75Dpc~{FDHywA z5Ac3V-w%nGxshmIJs$-45X%CasoN2cHp=qE)- zIq+e78{B*Qh@#rsy}~p(vyIV;i%Wqqb}uyaFP`0uT<%OBSu20a?pk=$9S@rzakK$E|%nENj?BIFf9S zMeH>b_k(DPfGrnREZoMc3EyQNGCVj2TRVh-QH8?&)@LSO2M=zHD|Y8 z^{$h;QSh=VN%*{vpyqyN!M%J~Z>pXrk?c1=lSdyhRq-#L8%*d9+yj5vw$wBE!2%a_F zRg3l8VUe0kzbm^Rj4=(*8{Pn9?oIup)%S-$6Xz}Xt9)gyX{}iI!V0Bv+?k89A{=U${easFm(%QxlT3aq(GsOI;PopMl;i2UCo@b(6A^T$JH; zmhMIj=xb5x@;Pg%*>2DQeSwG5CPlsUOP!Nt2V6i`9TwQqeGy5ab6~;KWl4n4I+zM5 z*Cqoro+E(DWXV=v6iTX&6K&`D=7$qNL^aGAJ=s{+^(-=xE0VcTGSxY}WFL*A!O$W# zSCQNsbII6rtRZ(V`#bNsiHoAFSclOV zOWNDudY`f$eF@1Mi6_%3Uev>OiUn`ZD_aLSZtaB*r_LCSp?E5NPe=9J816bH^Kg{~ zV)DSs5c&fxpK5{yti=$vyd2?FwUyj0+15{XGZV(2^Hya#?YH_0xD-Dq^>=e{#D|lq z8rt;JJ5FhD)0wD!h_}gyTWE$KJ^#Fs%}iLe_SsRvX{vdNs>!!lH)u|erI_FCg3;e` zUxXV|A0jc{X`R`Ft>W5t@Vv_@BCV$;#Nn2GZ7ue^ClJAr0b(pLz&3qEC@zccf?HR_ z+E+PZH~{LevrKyNey(Eg!Z7scx|nkSX(`xnlb=t}%;zGB%8&rl6|r`2zvq!d&<(z{ z?`^VNC!q)Rp>8)`&hB=omSxNh#ePzzgaLx_oV`mTsr&rEK{8v(+RV@3u>5c} zq0}nd`MuSQzvgs#<5SE7GV%Ov?le&ST_dDKygyG-dKS+)ocnr7Bd**aug-*(&d1hHiJCQEmRG$0y5G7sL)idap6pmdh=LxE+TF%+6 zniQ@~J}Sg7s&tp(Rg7&+=qQs(vG;4x@HmkR=yNyHtGrU9in2!t{ak9n8D1rrL-4RP z5$)lya>K=pFTQrrLsbZZgwsT-xI=Gr6yc%4T=w$k*L&TiLR%DcSy8U88!v{xSbssj zSb$78EQVn#G~u4t9-COcgS=gJ;er+V)_C1LX|ci|-+P4hxjbi5YM1Yhs-|Rxq_bs8 zTF6C~;Ctk`Yn8q)2Aswk4KA|zuq;vCyo^zz+?<{rJ>%*s?&$2Jwa_RQ@r30vyU628 zdBVaN!@3!2p;34G=_Uo2V%{{O_>}EKLkHFTZF#fP6w5rBEBnEz(xq`Cr^7QgJ(C`~ zB)C(D$~vXwhJ6T4W(P*ulv`6H3A4k?!6n<veIGpZ`-{rp+C^tq+5wmt+*=d~OatR`hY7aN6 zAzk$5$LMbejAhv14(#Mo;q*3r=Y31BI8nllQI)YB-$9hO|r9p2S&u;#0X%JQz5EK--B^kr$;PW7S{IqbRA<@T)< zo{n|DEbv>Gb2ORqa7&IlGA?JDuzuOHa~JJKM_hon zcbf!lz4{n$wvt1azPt!GWBr*CVWyF&u+3lh(0afx6LJx6z4r|V7SpyxqO+~Lc=ge8 z1;pdY5!j;ViM{IhT#k`PO)XtxZU_>3lyMvxUv@zVEvxN6fMtVKk7w6L+-Dt+v zr7!TcC_Hv->*gIo55Vu(*IY(-XzzB9s);W7sSWPfG=mAxnl0#SB8N+vrnhjOM|Vuk zQdH&-t2EYa5+1Q=OKK#D(%%X4Dvxy%c4~w?I1fI{aq#3G-%#36FOqDWgqEOYJ&vFH zB(#NO>-OTCMP{)p)XB|@KbY}V)9ikvdx_rZ<2B?CYWJ+EhT%dro5=i_f&M!_H|e(X zAF_6YE3-c?dQHk5UFMwFHnvJ91{H5^IKDtoZ>>*6Yup`>&WgguM(vzx<86CEjh{yy zbJ!|sB{b7-w+{rzzx(M6cx3kz$xHeq%u+20^*w|F{rUp5x=jhEr6h-w)wjl= zDt9+$m);&*z?1<|&R=*FEX!nN)e^Zg3`yO$^j9bWU2HD}1-}a8+RK-Gdutp`?-zE& zzoWJKX%vg((c{Py*d+cej9KhG-mmS@Oc&Jd1e=((L+5L|Uh|E+7KhT^@C3pJjJ3US z`hAjo`NkjsG5&dxgLkpC!7t;^Z?2mdO@scWi6ifN5pP&VFXztJR+|dZN@-(X({dyi zkAM&0*zh!h2>c$Md%;>25CT6*U*VvY_~be0S|T*JhI%Z#*oOGy_6n_5+z2K9k4m^i;4=0i9VhML5v?SyBbY&=8r3cJ{qh#AY5 zk-J*}Ot?uhN}WZ4ZaQ2Fnj(%UHnfwhL{;dE{_iR84x&mcO%CHJxmiP3*RiN3Zb(*T z;DY|0t5)2;O-jS-6cS99fAjUx8UyX zn&9s4?(S~E-R(BdIq!MT?~(iW{oS=@WeuH~p6=?ZU3>4U{rzmS8;&9asPUbTYY`Y} z6|3fHq&7FSvE33mg**5H<}%Af+`TIq7>V!jhqT`vyGu-&758LzwUALDagW(6z)Usw zF8}Ux(>=GRx#vTDI;@zr4qPFV$!!ep*R^@h4|@;_KVHAF*#&gmFJRI@_MJQ{JVz96 z(rUE?IGwa>tgPaJUaKE4i$~&9)Mxo{Y^nmS1PDqt9dxUCKNQ9BY+A(i3$DyoW~kR{ z;{bb~li@{colFH*@u#$|o|eyDZyu`qb|MKLU_m--k16>+U{V3PS8{%a%klfQ_sPgN zAH&ddNmcqE8n&nW(e1HZ+C97z#Q*)mb@_Jh7b!HuJEZ={=PyaB$I7#&jf%9X-()B+ zZ>EM&tjil%)E`15&al!mL1}9jtjy&-D4Ne(;~$@|hZa&VD$X42Xg>RW;=YEl#lIH3 zMDT%(TKss$kpEI!>ylFVtg-t3L7f85-x9QX%22d=s}AW=d-TpcA;-e+{^^D3(rxc+ zZZ@Z+@YTl0-FrMJ<;KZ1ZPOCwV1%M5mu-<|cu?%l0%W*b;kt8(N#63QoOPA+*UO`w ze1?N{1QcbRbs0IYp!UpEE`{gQva>tOTL{!;f zP$Sx|v!O?=oj9bItK=o9O4}m`P%7L>?6QB7>fTx3y(2MAiB2`1KywuSV7yGOENOz! zfZGy(!d=uEUTU@~<-$q$c;6{(@-MJC`{0(h_7m3tkwT-}QA*h_Cg%Ks8KRPSA}3z~ zb;CiwTWEwYj$BG#b=H}x=_Xm~xti8OVKOVs1*GffujdzNn@DB!3@E}Iq9llmH^xO> z>#Ll+HH=8LgOLS7=OLA%&9y!P_MjwYO4mTqm^}RIF~R8~H3BEdy8@t_R{(T#fTXb6 zgg%L|L;UPm_%>@3L2xD3jG}QnbH4Pw!NM0_O~pV%y!W{H1ReZS$*mTN8VhB)wZ`YE z?k^T}KrIG?G4+s1k|yO9)zkz+b9Bwn)W&=c4P#XTo1BxsD!g0Eac*l}x2RN(wbhgP zf;S36nr z2kkL(f@}6o2g9;@(Mf{3Jcti50P%e)UZ;C|Fl_JPBW5vV2QkDu=wxX6ZuSdQz1NozX~wq$)=jSJ6uw*=M(=B~7#r zIIE??_5u2HFE8YDouVA8$F!Jvx?%4_bB%eoi`nqYYk8pXr#2zqEVLT#TvVLzoY(}G zhUe)TKzNeIV)hjm`@iqW*0giXz7FWJIID-WkhIvYes3XRaUFXe;#K#72gjr)@`>!j z!8u};)rV)d74>uJR>NjAIt6FIC?uoBlkGgK*9Pm(wDLR9pb{3@M*O=K*Ck!WYow(qmI$yoGSwY?KdTYahCTJP08FTtiABI<}Nu68rg)rq+3G^XH6r zC1`x{loKca`J+SrGAK;{SNKka1ObtVcsVpaACte zkTf#EusA?3DGst$;YdoMo^g@0xJv|bg@{hCf|yD4xb*XIq?w*%Im--;n(J7krEV@v z?!3_($gE!T4nuxlz!(yIR2?#)O=|)SnH3YxQX2imvnkP*r*BM@w9GL$zj&-#{{Bu2 z#vtzW{L`SW1f_f*lVN+LeWKB7r0$1+L=m&=VMXhQmV&oc%%xOwKo{8M-HQmFF8?u3u#T%H8 z?%gHEA>xN>AJ**h9ruwRnm{a4BTdEMtKxgkzEL24QEe)l8D^`r9)Rc&qNu={A=deY zULaXeJJq-fiHn+l>2&sZ&(izj3I1ApAymiws={{y0SK1@aZ4VRtI!VzJUJb#Z}m?D z1m>9F5T@m0ax;)*BK`a?T2_~e@WxhE&tm5w#T*OPGr?Jk=Jn58kdeOx;5E^w$q|g7 zg1jv6Q_ra@<3-sISK%qUu2N17LA-rebb@Z=M><=SuFgx7Fm zsKOzQrwS*7R?|h3@%aJSv4+FqaI1V=uvS05*4c9Zp#F)wSg>Ik%dJSNaR(*57+T#0 z1S57wpE9|sb)^+Pw&>5XLJ3{lUGCea^9kRI`d9v`9D0X{;fDvQp-v0|g=VMZ?Od&u zbAe0GT1+@XjHZ#I4eE{)xTV(u)0?RWP<(8kmhEq4QBeh2EKr9eQ8;;nP ztd7t_THD+_}Pdk#d3WjnLxS^^CO)7=vu@lI_-BNj8@sYTIWh!IoATgA=R3 zYs6y$2F%VuXrItdTDe(&3#ccpk!mSn(@vM--8!UuhoDW?Uo(ZjzL#w8*%)rcXW}_K zsuCVH_s$(uBR*6kyIJC@bMx7}+9|I`X#$2M*^yE@4?$nK8@t+P2Q+Etr!D^~$B@lh zad>^t&+cU2r#d$un_eE1x8o?n4{VSLnLrxo1V{uUGppiHX z4eoZu?q9cU-C(yYx~uk17?x&h(Tv4l(EappH+x|Ag>}rrOL(syl8yUCU&+`If`SE$<7)(R&9ikOh-SG(qH;duPujsBEL_7zvFYB9b`AS zNpbKF%V}G+(%3wmXmfU}oQYmt&9639XV!x|zWUsgU(R7%2a{tbm;R`BWvp2J#t1w4 zTs`d$Ncwh2;@5(scRd3#Xz$BAA$4bI<8vdb*+UQlRV%as!HjD2p#7^?X8X6JzC^?- zq@tF}l?~x<&B9#|Ye~TXtURLbm!>=`BBOXPCx5Z2_yE!+!Ee=W(XB$Il8|q3;tBFj z&F$x_eus&9kyBL#7GT!HVDW7b<4BB#SZCu34o^<(nFKw9lctq)!{}jVkJz2#YVK|| zP~WBcktfCm*%D_SRS@)6zv7u2T<9Y18))9}I_39zAL}^EhgYqZJTJ4Td}xw>j0K^;Ss3VJ{Vw2ZQl8sDRpk~_6)tPQ6*e9y{TSBuxsiD(CO?c zuy3)hdJ5j}tz^XuAGNkzH8=-^&+(>kW-lPjHU{}yH6BTFZhf>(Q^-sfab>y_sm9AZ z_`LeIp898#DE-RLi{>TkUEYf%0FGbq^rs5LGIglQ4Sn7?U4^AwLKn!Qe-yzza?M@z z9tPp2)nP@|?j1VRG|vD(O(>Km%DI|Zn`|X@760bNpGWX_HD(Wacll?78$L}3y+Zf8 z-fP1tNtlP=m>I?7@8Mrfd(ll>iqerk!|O&P=;p2`L3+Q@#(`2Id-uB)7$NIt0TRMipQcGA_(~oTT)bM;CA>>SoD1V;`=*Lt{42y-Et;0WDXx zYD974o@TwJwGf-U0ai$8TMOffcP^~M{f9`on|_G14z5nE_KGouh?}6{jf*~V-^w>0 z*gB*FbK7I_R=hYcv;97xzp{o=BK=i$?pl;TTl}(qau(_GaW5PRue{k4nevPkdl&1O zr_HihXu;BsmS4rkfqUptWI_1`75~$rji!TTQ_%*|z&Cs2kV#|HpU&lb!|yLRpCo%D z?^_0&nuM^HjUC2}O0S%|)T2R@sXYYONr_lMmYpz+PmCMiWV(Pvy|y5k84VOl!bL!j z@dXe?#0F$dUiJQgY%QjoBJ-r;*K*{aHs)R4)iNZT-m4;I_alIQDHu^2NuEtjt6+jv zTmui^qSy5X(}yhP7{|J#ww`{53d4z#9D}ft!5Kr?2kC7Vn$EphJ08AbE_cr->-QBR=HHrn-(LT`g9ScO$AL@zx<>HtK+iL@Of%_+nh zyy4I@pY{Zv!o~`T1cW6+$R@Pl@A50po-JS5i5fLVocry|vhU}2YWEk2Yi1i^A0+rv zo6O>{mDiJm$2kfS)yPbKbun4kONCMy7THawe4;0XZ{nmx0Bz12PrNPff;+FRZSFBt z{4(Vuj2@4G(A+ZA--zBx!&l}1!hjP|TLB?5Qjj{uJ1 z=)AcH^QTmfBi4b=1FTK94x5p9rwfPHj-fEjpdkc*3JNkysl_XfogZTVdnyC ztn`&}0579ZX@A<6hA%X`4N`A=8D(G$0EWCwky#XX+%H<_ywDi7-^1@2{IaWQiAe7& zJ;*=xwWvR|U#%gr<@TsB`B}B4z#$MRS#?p!u;WEP#PqKim<{HKb>wtYg(HwvB1E0U zkR?r~;F6Z}LbqQS%xog=e&%Ew=!UZTr4ho*ChdDi=!&fEK4bNH+^aq>8#6d8Cv8aG(}?E>PP{R z-WE)*nn6CL>KqCWCGc3BFmS{9!t{$YvZX)L1Bww@IrA1M?ng3i?IXI}TB#5wRTd*Z zo5GyR9x#jUn^Oxj?~76OT089A1hq=dXS6^Xms(Hf?@%Jw-+GIMe?o|7KFl<1Wc>=` ztb6TYR>(ZNLFDJbhyIk5^ToL4@T1o!fzQz4=(q;W=RJPac}psEM=#nb$`4!LNW-sE zSd6aqtDdBfp8i;@>myiuR6yx^W(K6?Xm~o_PM`~kZazVmidjTYB|MH-h2+OBF7re@ z(IH_`(N7mZR!GbUgYy&oDBB91$Ms*~dU>swutQ%R3$UOmP@b^}P2~s@H+!UqPBk#? znqhW@jhGp;us~@|Xkk{M!#P}^pLsUrO4)c`7}CaD#==pO&hNMT9Eng={RwOaL>=MA zYWL}9V8;-Tl{k2J>>I8JKUa@ZT&SWt2J%C9yg|VXntXwASe;WH_d_pESUILVeRoAh z8{I=;A3vzhHMEa`4>%!iH0E~i4r(_-b?ZtkLSt2KhtXal8x47K$p{#qd{`e^P+AAV z)jeWc^TmI);5}-Q0Cbpmokt-d*tMUCAcJpG3L)JZjjnc20)tYrmD2F=Z%m9avS+Hi zNd}VQ31(~$oZbCr_~$Jjr7J74Q;OVnIe;~+OGKay5QYf=9DoxrFf%LqYwMc!0fMmK z0klF?C?<0du9y2|mF)vd)OF>7Sv=nSMe0w5i(hhCRVQQPuF3;IECB(YfUyuVIF}`& z-}_N2fVqd&R5o9rgiB=0WHa|Rt`JKp?HfpEth8K21M*7M(1EQp%)6eh03t4G(F6P%XvgiFRwtZ=VV#f_|1ugKYT6&s`u zNAZ4nY5a&spth7pTDTA7Wkk{UGB1fhhOS|CI6D3U68KZCv0`;CnsIaTEKB#nLyDCx zo8B0c%6a{5|E@LP4zP9OAqpr4r0BN-PUw&HO5M;cgnedKl7 z1;bU0Z8-}^mLM1Zof$vof`W=Di-d?K3x;%1Qg>a^u z{1(;Vbv?Kls~n6rp+p_sIFAkOmuo5{lpV9XYToD?I$u9geS3pA_f7Ls`HlFCy-#|* z^s_EpWb`(=B80el%l2x1Y0F%PxLNGO^Oq<^^^1&JCo7FI95p5;erq-nFmv5`OyLPm z26+&%b}pm&-p-%qiBpG?BYYe334+KB(|g%T6xb4LtzDKC=+YF^tZom@I-IbqkV6Ru z>kYBRs0lRO9h>u!r*?rY7h_KZkzE_=J*qH4hu%ZHb%ey=IZxHcPf47uVTTuk;bsp@ z>#-1E_}IgX598{0e%Xt~K5V7=#HxKWM@FZ|&iCQ0+`*mhtM0?iZY;^8%Y4nCPTZ(Y zn7R7xD;E-8-ql0$GQAgx*bHa{^f(?11$vy9#|PfaiTzH)uzu(2@VfFIDUC0V9E6h0 zLtV+jO`>{$y6qWvn|jmtDt?WP%r6hRj72o6dys}BbvhkNBV$M%_daY+$mCuSOCHO+ zZ{O&(uwaw}a`&a&L>JnanK*JVA0yx1`{{)s$5M$Wmc;wySlCN|x08P3dKshBVRK%9 ziA~U78F^~Bop5I6LKqzBBBtWWsU=xb#nhKCV{fj!d`P0AyDXP*;9KB0wJay3lBZ%%fB>mGYwrW8r z0d7__4o7OnipgTvqE#-7ljhFJ!<61uHvoMZo3v^WHHA^art--c)64z9KdThKEh((F zxWbdHOkz4=H)NPNo$Z$735J1!U&`|9-#~X zgYBF+n8qkAeD}557K4jm{6-@d8*V2CH9x5#A40v9$2(={O7mOtbI5tf!+`>C>tI}o ziqV%$qfIuGWGrA$+`1tCDx{dp&VfiMrY{0Juc2Da;!ioC>^Wn@kX5xH9?!NIHJDrj zH(OOY3ewl_M?YIA%Dw%zLG6V^qb2|GgHesz#P)lQ)m9_7+ReH7q~N(gRStPbQX+>O zXM}Dg%RpS|E7=+XBGu5^?P+`M&t#)rx6!oWCx;tC&dI&~F++3p{tQtYj)f)z-pmfv z)dw!!Xbp>6zoetH0|O19d7u*cq7&|w!bfRbl_R((%@G+}me}||bqh~d<4r7@F>sMb zplceGh6wn$}ynd&PmmZJc_4)rC9bD$Z4>jwwYB)yUEI% z6-EwrJP6NQKa5WTP~JiJnY5h;=%60w-aiIgl^V-$IOK#+Z{-rDi%O3qhCV2JH z$pce?t$`zIuKpb&GYG^$DKkPp5%(Q7tuvFwF+EYm>DKh>(excc*P*xFdDOHf-q0?u z(=ZM1D%IWHo!{Wn^CG|8ZgiUU)94MmfluwKV_;2l?br-;Vb9BX;G&^KsI_7jv6YEh zKU#(9QXEAdB~76o+Sbs^&7RB0pvi}~W@mRky^n9HYdrQp52z@GQ$sCHds(r8(&UV1Q9OM-hgj-r?uWvvN|UgT(qYv)7ty&)M= zufS}q!`zK%R%ac#MbWIO;^TT0NxhiKCd;wb!#Ma1F%o}YAGfRGTNAqQHBs`hp@mnv zVX8Q?o9JSfv$R?b!sVFAqE(Sp>i$db;nPDf-C(bUzkMLiao;L4%_Qd=tEdp}+Eea) zT-ENwfyUbfs!Pb%d**_W=+_A=Xc&yZs8`Zm)aSr*NgX z4Nmoy2>l)9d=gLqr0=a9UNH_8>{R%M3D)I=WXlePMWC?6cQ1nEy|p?X)di@+wYhl| z2{9~cgxc0GFP0q)6)(jYGzJ(~W51p%;Fxp7dGC5V9Bg~W{0&=)ZLaCYRe8d5Q({JE zUcNa+U6p#&54=A_9;vX+dQT`BH?E7z;ij;ncJ?!jM8Tm0yK>69ypUbTu5GM1*v}RydC8eO>&aT$22ry|+>3nNu5!pK8_9Y@E z>%xI`;MCx4j;F-Zo0E16RBy&zP08curTt%~{_tB#hKt%Cpdw@M??sfM;~Y1@EcAwu z2*Fe~nrn}`aF++G;a#@J)Sq##Z`>B7^cRGCHZNiK&c_Zv=_^mT@6BfT2T3Yx!1f{P z4nL4i8BTxh6olJ^OTEmqEuH4q&m4g>{LFSti7|7Tl<_6I;9dhKgGZ9=D20aVgT+|- zFl*r~l@F0))N_?vL)fH0*vr=GJa$#!Rz-HxPF(s)?BlcR!Pmm*kW~)FCp-{Eyt_x` z(o|jP^NXvRTL}$!m5BRD9fAK#Z)o;`VSPoP54YheG7UaqTn>G-WslF!_g`Fu+(%&_ zy|-EmTc^`kRp>omx>E~kX9RwyxJh2UC{(o%CrcVvotc6%u6JoPh#7ZBCT%cXkKRyx zO56+8$RHi)2Rt)9NqjBHK0p?0&tqaCn1J>`GuhM-*AGf^CMY(q@gyb(fj2r>;H1sIF-jyuSuGanxkY zRp-U0LAF-47I8VncSdA_EQkHZJob$Z;=hy=-JGgxyXcY`HaL_hl$G#58yK>ZTU~g- z&hAr6UgKI9Vk-WMS!~%ISyKw#%I}ATNQ=mo8|@DFOS~r>uVi^n@`jKIz&5by@@W=I>)S90kMu9EvmuA z$jpY$f)di)@O#!ze(;zQLGaor$M{p%WXyX%|i%=kU zi4Dw7!taCe4-S0}$?nrD1&B@l6a>BIhzQQpdnwx-a|c@n52MBYeKE@yRdw%2w5SN? zCM}!O_N>zlt>WA~N}b|9JW@NB-tbmA1}FF<=A51~K|^~SImR1WdCuS5xT)2fR&kY# zKnW04d~2;a)O{*TNAyuy`V3t?tt4=VPr@MZM&z(N(dAPkyit^69omlduG`go<$j+C zdxn6nfX=Hv3#j|+_{%r1m4p5L37kMW#9;;G~DG z2(BHo693XWWRBj$O*TlmPorhyq-pIA{i)AQt_V=1IE#OK;Qz@}*HCV&F6a!pu?kca zB2TERNHT*VXdUnV<)Ht*S5)j^PO6l}27B}&T6#~@LzhfP!(t=5+2f&xTe4P_A#_s= zdsFX$p^2)QX1u1>=_twkTxj$I$6J<>MROYK09aLVC&`h<6H<(^rj{-?=v3Tg@v_}8 zx`OnV8%+xN1(J&AgV2}0vBu*#?uY9|8KUot*QOEt2UDYA5@_Ll6NDXcKN$ww@zL5~ zt?vTTt3=U+$Q#%FI~X;OWBXZMi@3g3jv(0470!b`BH&TYvK$sS$IAL0_>11C;poqN z(K6D8-Im^&DwR)^SC_Z1Jm)krimlqGINROUkJ{7E*Onil0qbuYhJW`TyN_JGE;4Lkb$4hftxJd;`UT@C%`A_F6 zw-Sqy0_{7*} zbbQ*OX+MZyZ8+Gj3K~@$RGQdja_O5jp3ix3VQZwnxL3hHne?!&*IFw#iK|Uw@4UE2 z+g5!n9mHi3R;^Qk@~S!$UR8!5M2I_gacAMwtX%pKeDk{kiMOxW%%TQ@=)$=hn`iGL zOI?FktEaMc#5Er;grj{YZgN-My;=GE;i9+&`TeI4cto=l7Dl79WF@-G@5}G~7NS!% zz>{~Y&AzfvR*t8oz@0gtVZ7~h0AE74tPtf`qSbxZR2(%sHELbw;XSw=p1BG+Ey*^B zUr)~FwiDud+Z}JcH$AJ;ZwPwseG&Ht2%6(m$v_fdi_BBUWCqxH#B0p1>;3MIJ)Dr0 zg+Yhxg-cxSV_{pnW$Sr+gylPWJlKT_lW3tl@#?WBwsSBU&mwE4&hcuAesK0?u2fX6 zC+Ek}ZTPc6%~_*zBr7}zY{@95>aO~)vEQp9a)i=G0=*%nzxAJ^SudZelaMeo=5%S{ z)yaSy_bogf2I4?4ZIiSh8j_wUTWF)|X*p9Amk|@9MKDJSZFUxFHIk7wxoKI9xU`x_ z;~&S*H(0#00^}9l$4c7?qDSwimm&I7b|N!&+z3g;Vdd%w5Ffi|^z5Q76*aW4l&--Bd+b~iIMJP6+Nz*yAeW@PXST>}|d*MY^9aD)6NLF$Y z)paC9(dO!*4%~v~Y{l$-ZA6+Hj3vnFz83v{q!X>k7D6)yUx^o!MLCL4p+YY$?wAq% z*W(+0q~pn6p{qOdnhoaWm&q$-9N}G;%2Lx;kn;~B?|YG%wOF8zN2mi$m=?anyS+%? zn%;duGL||7bms9PAXvJ|euF52ecqJNX~qQv#^p7d$6C8N56<5Olh_S&i1Y5Kfs8E> z=z0T40qHkgP70enl1t~R&UJegq&b~Iwq>Ef(6T7X09$Do^^Sew;4!^M+kJ9L1F2YE z-pf2{t!9yQC%K7!LLqz$8MGDM( z!EoUhfGTmK$0)7sGE#aY;qKA0eeVm@a}=FrY&;1odJ3= zd{zh+9D64%e%m4}6h~;Ur6Er| z<>FixJA6MvAu+Xe{2xCf-JGwc5FE|Nfdv(7 z(KnJ86^z7`zvbF0V+~k6aQ`iy;+XnOXE{%qx-vJjAx`)uk!PO-aLf8%-7_}kuqm(3ZFaP5p z7`%&wr20n%o0L)FH9D{snJ1E-dtmZ%692JEaS_GROX%4|)JDwY)Y~u?)2_d>=S24uMRU|HN55 zqkJDO9qpaO@w1FgK_5Qh>UQ@YI7NMN)Sw;tZ@s<$+%SFs#0Cl=Q1b(hP~QF@C_b+Z zxF-DrJckqE_7K+NEWyl zssD>ECL`y8_U5$%W&B30vt0Me0dUo6XBpdgo`AF_EG~&;+|=kDD@vHuf7J{EP5N53 zWeN-n?=LY=K(qQldfM!c7@g5mld40I8VP-a?m#4v1PDM7BT2dcU2gctSB1TS(#$NY zRHry%S$t?IEq7^y61Lq7jSb`Yh(@TGtNNBwG5^nD0*?rJ~8GyDA!)7NOA0G$m z%&AJR9NT!o5eeu(P2>Re__~z9P!kamxpAmMzj;mh z)4#!eRlvWjFP3>*h72qRcoLQwt0%d#Gk5Q@UwubGvIRp<3vWlnBjA!w_{{I}^&^#% z)Icm189XM_>D`hFy$g7qNS)H9&rljl_*m89LSgr0*{uu-VpXAdq=Cbaixc0LIY3byY3*{Q+dHsIY^-tuqrdjkbxC|>@GXG)p%0MT7re*A@X1aH zq2mBf)T=MeyRnW`uhab=K$BF)&|p3Oj8}c94+h+R8Vb3pfZj+Web{EnQW7abtAhj{ zPb}J5(6OPdIzBGw*l-6gWbLY2Ge)h&wk(VFd!_4e?#`i zzy0&L@L~1*0oezzU$Hh1|e?#itc074IudQ*zqugdEOSik^nB0E;~_ zK%J9nZ@DMQ;BAO+ri?|J_s%<6fDBb#2Ng+2K)}D|3(6LOf2t2F4+DVi4*{V-$U9xI z=idC(4o~b@oegg;K#(J{++b(t2ybELN`cVBe4&p$^H($$G!D=TVvmkJ2-1&j!b^#+h~QQ1hX z*2mTuGg8y8HGG|siWPv=&T4s}1?T`M^U1V@-w4`75k3Y__g4$B$XPk^=$KQ=bEdt23J=W5(pcewOs0PmK{{IRPSz#wQSV*uEP zuI}#n!UHo`dylJWWoIBLv6uxfXkKoTf0s??=)ghZ*AAcm%BT(wzXmJE zZU(rq6M!hbOS#r!eY1f(e9ypNyC?xcL}8nn3L!jFxpt=?kIV-c!*7VVM;qCDZ$R8- z0Nps5kOvscsL0^8H#9`ipx~%LI#JHF@j7-2Ytm^FF};M2Kc|M++2e4FeE(sH2Q!L6`fIMw7q#vxI}WlJA<*7fp69_=^5w-iQ$yz`BKW8mfuW(MC~JSZ#^1b}DG0SUQ=AO?<+?vbk;v=O@)2V_5IPfKuueNyCVd7J zJ7+#$@sn?>D-_RBm{y}s7SQNGzzMbnm=|%iL|pV=!|paNW@xRm@Eo-|#?q1A+wu3{ zQFr%DSP$U{ki{tq$_l%Jx*nVF_X~?}n-I|nBy_MHMXvWIMd^4&TU9#XOU0@>U4crl z;%@l|m8Ji1lKx$)4phZsLNrlzWdz^{M6eZ-;WTxxVEy$7(gL-WI@RSCY%tO2C<260g9)E8zgMc05PGjS;j=ko?pXKYIQ-sX6Lb6< z+8cQi#JT1VArVz-#x9~pyj|go^V1^njPHnSk*;4!X}EG_YP5%uCyEs<0m>h0kP1h$ z{gK)cydwbgI^u@rN9Z?8fddBtHl=#Ze|r(o!kkIly)6=AuQ1CF%Uw7403kN2KWA`P z%^HdN#C8Q0ZWoZLLTk=i8E!he0%t|>Hxra_GGCiynYZt-<9PZxF6$d8It@ zb_&(q5DkGCk33?4K+(hHqzpibqTu+jx!&ntow57HmC2?BptD>}7+l;1+>7xr0`P@b z^5QFXNufFo80RJN0*mq5x_8V%GMC=B;VVPWiHF5u6s#*r^)S8K_Zy6Vo}421)=45x za3fT3fz8}~hwn$RTplYsf>R9v^ZSkLRI}&&0QxGBsmQ_TAyc4|+hm6N-~xUycD+47 zYAT>Q01CN=kNA=aTd>EB*wOP8dQ^nik)K+mOHT+q8Gv!YZk%HZ3ZN5L%$I3w2R_Dr3n+LtsNwFIa+V zjvYwS>lY-y}to5eo?igou3ifo6Aqbi|29>d2vB zb<@FMfe@>NTa4eH{Z(8#iYTis_SxoaL%6qS0cf$0dV_vz`&CVgv*jv(19WzU*;=G? zdsO-P>NK~_PRapA=pWm*7-zPu>$T&kIu{ow*HRNABGy!?Us2_BEw=*hk7uG(ST*@R zU7txKLne2PfO23vKQro15KveSa)%EWb`*Ix2w=5}8U@Z%0N2f6?_<^hz&s;veY#G@ z=CCCnwEFlrjRFtubPQ&+5j@YBzwmXlmjO;3;X5$5_$Kph^usbZl~aL9rW$wuRBn{> zz4oC}EXavAqfx68qpSB5#TOEHgyslzc=NSFPn`c8gKO<*4q#dE^QxS~Sxr#S_aK|f zbQ+TDaMOaCQ~)W*Tm&MPoIsL2Ro)0UpRqi(>Vl6lh9fEYm5xO8AA0z_%6(x!8Lw9X z_9aZU;w?tB*0SIutJQ`j|F>1G0lZ}rt+#gL=EZ;4+ z2QcdfLNFL@6E!Wp+gNqFpc4U38X#o|>UCj)w_=3y(h0}quFB1!sO9bCELW>G=Fo=c zkq34->hqeKCDRXA+O^ea^K^0_boKNM;5aO0R$5yCkpNi_{jg<`!^z4-2LD_6t((eS zM|X#|cYk#@?xZskkin`SB3pS8&%EboISd>~n}O8Yg}bL?pj62U9B&b@E##0?$GLFu z{E_Ti2}zvG#1c$bZ|?y(G(D38xJMB;onV^Ggs&LS#nq}N%$Fq-NC$*K(8R=q*J6Hp z^ZJe?pbM8Ks-O@93Okbgbc!g->3SSTsVG6$JtCeWxO}tfp@q1R_39Y`VxU@n@9RF? zrmy@XUgDkb|wE?v-Mx|Cp0fO&=aPkKg_*l$i-{1C+@N7iD5QdPia=Y0gMgX1!FF}I@kfKcQkw(m5hi87J$XP zIPJz)0odB=!Qr=DM|0)bbi>w)Pyz&8wBAN_2Ed-d|511T_Z!bsQp8g_PRGfuo``ld z1ZrWQS-3dN4qZ}0LPFN%3K}44NI-PlJGS-`1z`#`dEpEA-KX$A-|D8G?f^Xg!0%e>}!AO5OF)Q1HQ1{=|y1nLgT)UwAYs;|HUVxUv9H+0<8-Zi~t z@Gq6tyxstKw(w0R5+WJH5*+K#x=W6w63pHIqAmUFxsSZgb+&0AC0`|j@NFT=i0kpY zyy2!Xu1{9A96}>L0t{yO>CXfQpVGon@dW+iasC`K0&!5ro5bBdc6{LO`0?L(4pR4u zGzoFN54Hm^#fQ?6lEuTwPPC058V7q}{_^D-AT?kR><{&-N5TjOt$A5RHKd%d`-l9_ z|IssL5us7(prhBY|7tk?bL2hQYgXo>;k@WShyMH~gYT8Rj!*lR?4Ko^e4~LVyTeJ- zN$LN%f`0|?|N0k*z5$LVV!UVcpS!?+dW2_(IDmRxZz|!U`b$6gpAV5EzDghk47Q2? z)q4N?2;VxfY=vdo$I&2&_wPLC=H|TUkw(1!J~4G3_=X$*0*1@~PYPTAdySr1e85G0 ztsCGH{l|;yBLmVC|9?9R$%T=|2X!%MjXKMAj_9f?CJNOkIto}Z7OedId~0C0#Bd=% z2A2c;MpNSp#J~7Ff4CYxbYRYWekav~H;IC-TmV;)IefX%0TxJ+jzIJPQ4^5ohycVK z!~nB)c`z$8Q>vA2BRKQFjsHJS{q>0FXCgq^YKT^aKd}S}Z#12k4w%+wa9vOLv!VAE z(ZE?7hf_I~Y3sL;Rja;7HYY6peOE-h20D=66Uop6%8y&etv)3B4c%AIlNHZLEGWWL zD?IoU-GJN8@+U_q)Bgc={^?AR5qx71eU*lz1Hd$M*_nRf6QIA~`e;8H3kCZU_ z<>ch_`N3lm)6iL?NI%|wRv4Y^iJlMFVHT=^+H2=HSy@pNFjDAn3Y-e{w5 z5H(?161WHg-9h32tSQ4|z4hl3e zow&60j2)Fy5jlX`K38qJGlG?e2#kyE>*iqQ5Hhk>fEd2&ET3>tj zciowf0RPpGv7uA1DXIdJDVQv#zdr>5V?Z2e|DQlk5*6=>Fupa`=G^r%B^8N)d$9gQ z8lQrqpE4jUtfuCl9<;9~Uz_-M?ZHW zORDa>KRb(mm<_>`Ky#JvWyykmP z>!efk2}nQN>`1W#+2Te)`hB0q-aPse zY-B>hcRT3Jvsh)2b_Yf<^xqGfj?_20e0~pTTaTS-e2EPDMK%Ee0U5X7$N!-pX#<*w z6`wVP(*#ve%E;3BvHJj<<9BsudHyFu^Y1^uk@0~|NP905M<77FX7Iie@BkcJwTGpD zFqD>Lh?a1DKt>MO!QNo^ygQm+TjOxFKmypyn(Jg{6VmSB#;Os(+X1$X01?M{W3F^+ zR45j!n*SPx5+Jr?l8!|ziw+|sBGQmL1L*#Dw@@!0;XC|;!5D&upyuo8?G4tntxB)u z&ZZjx3PDU^BFJRYV%|c1m@8CYJbkRd^JYbd6oW-zeNW*Dw@(e6mmrLWFgj;V9 zsQ$k-N!c6VRz`n}Gy^B`f(nHQV(qU*G^4~7Yf4$ch!T$zK zJ|oeS!;qd0b_WKF&L=C)_m03ott{^Ko<|7?4vq#OhO7?~ToQj-zWC!r+OHh@1kKOV zwU&r{I|rm+lEm`me&&Fhof*E5;b-3HuGiIY!T#-teidw7cCrkIIQMzeCBpR@k^ap~ zb`A!W?vSkS;;&x*e>zGZ@2jU0&Mo@aG}^yE<0&8mTxVu$7Z?BEUd!vj|Le|@p_j=k znD#9Vi7g#5-B8yG{~vD6^Aw*C;ScliUo62tIhsBsfQ`_0nrAcmhm!!SxClTicW!c6 z#r@4=`q#5VjC*xMw)Ho2Uc-pLec^Kf9y46{L6_>Emwx^*lCPJ=r-BSDN5{p7M*s8k z1a1k8fvW_?@E^Px;1adPGxStOIH04`T1?U&%l258fg z_VC%(#YBVqU5Bk2*QfuZ3Hs#0h2?&P$nX%Nu*i&Om?($D9wcj|=8kbgHAc9q$<3C; zUo1LE+?Na0N7%{*3CG1Eqfto&?koPZO;$o4&+{~7Jbq2de+K_V2a5TkUMn$K$42or zO9(6(CszoAVCKK8<9w~`+DsTot3q+e`pjtT;2 zf6|&Oa|&h(G|2&}3!hUttv8}W_9!i2Bxi@2W-V%pUl|rr);bZR>12Mj*}etl#@e& zr!64xhW9fWur-(CxDa z!Q9?^tgq)j(_X37#(x66)TVq9r^sP)RP#-3E3iA*x>q-k-O;3tz6(y}UG0&16yC2f zCaYb&$-w5a?V}@}<*HRmT4`1(fJ>$`JJzDq8a^#;*79ao*m;-&dmsGT1@Yg2-(@#J zejfkETu=T3HvWe*P8>y_!tx9FAF zXaz-Ay*+CQ?@l6KgYx_uJkvj&{z&Z*no3J1KXNx-@muK&hm%|ho_pbv)r(+-+bk_S zcsk>24WSgcmRSn^TQWc+XUIh}YBar{OBSLAp9ge3_dcUc(;=W#>QV!DE6wdo`z#MPm)iOayD=E}=0;$-q0 zioORhFoYxdRvyZB8MldY!zIq^C!If*Zx@QsN9k9jezmr)h(Y+4|D#r#?pIoLj!cWJ zWC^QdVU(FulG;MV?Y%m(-A$^ok^P|Q!8tz6t>Cxou&49Bu6m{D!lbEKq@!fD2T1+R z#n@#1P69)OPQ#LYYM^RjYhFQyn4~}UtwoF(r^7zIZdUfzXzem3{rEU&_jD&{bo=tI za)S6*%hHnVj}lg=Sq)X7K4-pXJ z-7C~cXB7mg(ka&jM=q8Y5q#ZteYwBf_`PhcMAPiYT!Kd7O;=1vk9K}+Lph7zQRJ-~ z7-&7~jc}kUlSnUb+}ktI$7w!TS$TT%(vf|$OjO$X&{DKq_B9NfoASwjiCUNUMd)7B zNjPnoy%dTgJ&yDwE4C`IBDF*>KSOM)v>L(CN@OOnM6g*aJuSGrY#cD9&2&fF5uw1Roty%OWYmt+iI|yI9Y!nzS2n8SGpyi_4%`@GV(7)i0y>T%UrCO@BEQOcTwN_Qm<#bO486?$(Mh6+CQ zz4#v7U&Wd{fM|5d9;p!?kBn%BLh5#TR9P+@j8t0FrX92w#1vMa(w)xq-6VhwRyl7l z*1Cs>P2Bo}Vi|O{nw__%J%-}Ww+HUHgFT)ezDT;7PFDDaJZ}-@t2f5Yx~nmnQR?zM zsVJ4I({-La2V)0>$G;TZs4ptf=+CY3gBI7@ij}9z!dfq%%9ZKib z`be#kftM>?-(u>LOm>`Lw$h{ur2feYr&G&-CBy!OY7_nS4&MrZ?aXdNYCBjt@+-Ca zmtu*+wE!5U0Pz#RW7d1PK2mDrV~rwv{uMn8v9Pjoym80GPQTCCK4FRp1L4gV&oTW| zU{8*c)R=y6CF9rsL)Tk|wbgaq!c>8xg;I(;6fa)f-AZw%xKmt$7K%e~m$taO6H*Gr zT@suYhX8>9!O6+}obSD^bIx;rfA*iXuO)NsC40^>#yoe+5RwcOq}E9L4ItQ83=kak z852HM@p{dDFsPF@!xYqo<9ahPe&)LwqT`Ez?s1*`zD8eNN3;UR#{HaCAOBVPrsZY2 zuUi(E*hXpE`D10F*ey&V9aCcAfLS8oJ)>&ihH!`8Zw65xM7QRyJJ@ z=!2Mm$7RffB3nlpU^9~wnMfZj#cZf9WTnub9P$nI7 zOY1_@>3^eD)`X5R?Cc1sfK;LxB`?I@YT>_ZM7R2nNHmAHhw+C_Iom>(kAYq6iQHcZ z=@jGNysT$oB$~*}7UXN2^>qr7#s)<*k$FRFT(?)~!lba86Km+B3c8Fx&dj6}X8Vpl z5uzHt`wneanJ^oMJ&4H6IGbkxg06}VMUy#d9Ch%wnx8m^bHh+N*iS6xt8~)|9_|A& zY-ZO)xRR64E9Dy08s^fztGlB^#cAVYhy<0q?T3zl^)XWGn}V-14FRfTqJLa;ijt+m z7%_k=%Ha}eO>D2EDu|eVKP++E6R(Bv>-H4F5P{AgisIw_J4?E6&w{02ABvlsGHV8Q zn#QG~^`bL1%YKh)%O33bz1SYzsDcO|)udY4=nV-xihjBYzEg|yV^T>=+E9re!xvtj1I)MxR_!0Mm7^oJ?zr*}2D)M11~4T0o4PI>)) z+pcc?idgYzGIdI;%d!eui?P@w@>Vj#6TaBQ!gyFIH(+potS&-J%G>zK_^X*XIsz&2L`UQm=au5R;E~b<` zA);~5PyLvB(Wf2Vc1aU|Bp{laE|dgoI_rzdQMpyf9<8p@iBFoOabljgQrZ8$Q*-I^ zOr``;3jncb+@b=0DGhqXeQAMwFzZFh-k=rF7@kM>cLJY_WqU*%PX5+KhUF`hu6dO}}o8y{E+x^vOUC=SZFw*eA=}ythtRW3{ z)-6+kfEXa*mRI;YRolC_b5P;N{{Sdo$^C=N zSr3p5*NQU8+`zE?>8_iLtIcvvp70zZ3g)u^T zGnD3c)>Ms0!8c}=-HDBBPVM`!;l_F(au?qWh2<@Lk^H#gaDX-nf(L#ypcY596yDcWHrm%=}Y1DAQ_{~_A+7ivt&N@0M? zECI z`zD{!5)*#)qJGc=*VOj))V^6Ci0!k!5z z-7>h&M60a|)Vb^fg-5aKv21T2homoUSHa}oVYL(VEeKU~fY&zNd49ATZ<-v73GV9t zb}F#qK8sB7+1%E_uB+n~ykjha1accE!W)CLHgnqQmQ0u$I#izznr_eW>)T)}?^Ywd zt877ZA4Pt&#Qx#Bja3wLVes{!xz?zlkc`szD{Bh~Jv5pG_I6dZ%7B+@k1ZpPLohI5VnCbF^u$ z`Kxw%9h46yN_rXGtnur(h16O0v^ejm*hdzVf$C^DNOZ^G*V-mA>|RV4m>Z*qk~^d9 zZeVtHX!ShZ=g+uiJ80giI`#FaQXRY1!zrQ)F`8CU%HFms$y}9APr~=r`nFd{cW1w@ zhsKJ8N>!}3t?g)q$))qMd1QPboB_pgx#Hfn=na@apF03WEwqQAj(XK*XT_g4C=rIL zzW4jIJOGdO#~~dK*OcJQZF8M1!+fsEMu$AbJjTh6rW}GDC0stRuP0K}rH=o-us>|< zd6E{IRlNfMukZwBu|kv&h!UyN*F(s;1u8oR+t#{Wy1FaPVA{Grikrw}0E@gf)_Z@# z5M!G_n+i7(yz`dC!-LC*3+&m1Jc)d=<4UK(hmSK15$aVt<6dftRbehqJQbta7C41g zEkrlgnI$IO!2Z!13Qed#(!#+Ta;?gDYH*)Njh5CB_+V+luBVPe=7~M3R+ozTdiv!9(llE6vI(xj!gK3KZ=VZtWkEt1k1 zK=o`WX&TRT&=^=y-!FsZM=W&cMS=U}&B$b>U!gfJY|{r<)R;KY_-H++O(l4>eY9qR zY#x7`kPYl*FX_AcNcCN_kj^@$=NKdCz~T!vg*UwLoiTdHX*7Q8=9l!$_9;{6;2K2X?D_Un5F=33fUJLtk6r&NUR%CoI84oJ5it~p+}f(R%F zA6g1g^r|%E%mx|9)&L~c)Nec(G&AdMX8V@TWW|`DXpY@nMb>G_dp6llEv@J5gB=HAsu28m)-oJG2 z3{v!)oCks~hZBU*3rzwEOMl((`3-%FL|Y}OZl+C^2YOEy^;hw`4vOiDA~)W={od!y zQZgr>9WmX1S5U5%uW<;WNX2ds0rK3OQpY-!4b7r;V#4EgN&d(@{kKRK^;=UjzazZ1 z+Ek4KG+gQ7!>_IW>GgKd+6vqAcH%u4UL8X>SH{o3^s=G-x3-{I8v^6%kpzsGb(~SX znwf2z(RQ#cn3_)mr}pOC5kbTddRt=OWLBGdES^H=Z}bg)0eSEUP%jFJ4k?Jds#rUm zN*>FF9(j_{e>2YHg1p1rAh>3fDiF!t@1-&9Y@e4X!#e|wVkMWucODte+>30_nFoV3 zJ#$Eb{{T6pq?yqnL_;*%+oAjmekR*C;?KziBN~TP0?(26zn)Iye%4!$2I|}FKleOZ z19hQu->BOjn|%{2o3Vi$U(a+s*mxK{lk`FS5wpByaS}P#j}QZUcR7%!?4Dc2cu23d zaGMR^W`0e=9nV3ds}k=YBqyQYE)`5*s#Ie&Y~D>8TROhsxd0(10Gmt4hGIlQ z?2l&N^eZxc>L>})t{~IZ*kMn0JItvWDU!23ujCxTX{?&l9nDCfo3H}CIkd|-Qd3LW znmhX_TG?GRSmF?8$Cw!QJp}zHJs+3;XdG7ctdf4cW`%>fb~D#gKh`ujeC|^JJUIn_<`bz=6qGT`$O)DB9Fl zBgiP2;!ex8Y!C8q_w~$UbZe0Fw83V3z{6Bl{|k0>YzXBC$*1Y!5^(Ph4Szm8VD%wn z?J#~3k^ArxV6|CQ64dfqg;tEi+~v-2qMT`dNaX>MLa=>ghO(w7|Ku2hSHk?Z)o)2kGiW_U$3sV_jtb8Oq&DA z*xPVBv}!+?dGt236r#$|rYSd5ccl^3snn@0?oS^_thUpT8KB~oq+SRQaK;$8Tq zJ;{~hx>~^c&2_1BK4)iQ6>#oT=HpVs>#UZ=zeq$gT7DwdR?(2#FOU{Kl8QKUQ>@xv zV6llqbjqxBgh<>M8yg?~v7KU~5;fQ^?a}>X^Mnj=bmRkHtRnXO)(KkSciW)F%C_pb z23y>`n{1e`%2n@ev}T!}uO$5W+)R-`^4>S!|EiHIQ%RYGoj4MP$HOKvvRwh>^{dgy z6Vt8t*l+!0=!W>F;d+SYtv)KRaIlc+4Vz20Vb|Y>z7Hl)%NJIq{XqZ3{T=5N)VOJ& zcGA9^CH_eAjhmpZk6os(_zQg2zm(72%)2mp;6J7P?qV`*YZk2?*@lw(i>E(R7 zC+OtXeBk$udzY++{ZJ`$*vUc@xRiJv{@kWWhtrSwyl#ksy4BSW!f{(3if-l4E>4HU%tR}IWz+%zqAS5AE+cgxU3K$ z{Esv18{tcI6jp9*K&skxwR2IhX)tQ6)e;{w|EUsxFRxpF{vqYE-fJ2I*1?Dg3pFbtj1>XHHs5DRUOO5T^Ur3d|!6(!6zmA1I!7ejV8y=bFQFm@$8@ z)~-k(?mjri@py}rB6#i#K`_U?;GR`Sw-1X`&ShJd{6DHYKbwdiGs`hY+w}5sWD2VO zhPwgcx`VHYN6to>wk!-U(3(GUqdD%f`)&E2Tbea_eOeaB#C52`<&^C~krh^hQe5ud z(-GMz<AucgD?2Zneg*3-0+fmR_v<}CrMu%?tfKh03oGUERHFYPQ z96LkWO}xh#$H~5#wXd%sTf`REoq5nD|A#LCy3ZzQc3BWWBj1kCZVI2s5K_8q=xf2c z1`8Bz$C20Nlo}Sy>WodWhD#e0m)cs!MZ|4^cP% z+ul(n(E3sCE*)kd4MR!Vp4DM*7m6dlcCSc&$ZaqYrxGKEqRJ{AN`h-S)DQ1*k8=UQ zO?_2>4^SieV$)FP>EamIHh0z1srFB2uQ|JQ^n?_kt_$VB&B@m!l9Z5A8=QORhrkj! z-8bE}uQdxdTJO%?2*hdg>)MUD&mInQ;grvYSZIPjoV;sw-DKW}xP>lW+{ACsA(`g6 z!Pl*?g>!`*IQW>`YrjGVs4+dxLVAnXnJ^R#<-@Gswvq!D4Vs-h0{MKpgF~;IH1Bld z;)XQ316BhZs(V=ajE{eZfGgyAytLJ^|1zYVP&vDeA=n;nM>?8{jdY>0;eg|I^6q4#^-fZ5>a5;UJsJ${Wo4!yI_5(67=qpztrXlP)9Y`H{ibU ziK8Y}?Waq-aon97w|e9Hns!>-mE&W~?YZLsaLu+xNXiOVL7SA{w~KU|!x<4It#)=1#8Zn9=6Ywe-doDAm) z%*TOUD_F=XAkt@4aPNHl%+bI#@fC6`J=7OdKz`&jVP-o3Oa3xPTJ4I=Z=(Y2Vu9u1*SM{}oyWMy5?AAh8%Xb4@W|+$ zRcVN)4(mA=gYOXdt{V&kk@m~qGuSnVyMsJ<13z6rsrNs3jgj3XIvJ z`i|w=#MYS?tF-{q7VJAtxpF%X|LgxAdRtg2$LHQk(@seA2@h_>_@uy`UA0XFtVjDH zqti9fm) zas`$}a{TVv#gJo7Gsg(_estdObEoB^OeTpRh~y$g5ZB)p5gd!nMV7+)e#KeJA5%)9v2Xa=RwI(aUXfnYC%d2PxN`sJuTw;Pd~oz7;%P+xMgS8-!dP zEL!PT%p>k!Eu$IlcDK42Il7Ll40>k<3+tW(v?eCAFLmk#CEOf^_9q(9meft&9m;2? z{zcLDIDzJlv|#TtEQ*|wNp($u;CeRyWh`sN+Kr{~KLHLjm**MU3#6keMvIoZ(dld* zqyk%*62yn$F1N4`sKiy)(nLr9{%VlqveZ01>~%+0)nkNAO(oIx#gcXTJsJ@l|DjM; z3l`G%T`p)uU#KGYch^hIk1jvxQab&XZv3E`E5YMBlrorb$*w&EEl$|P1d^#kj6|!< zPym`K;&yRa@ZN^Wne2N;plA?EBtS%7Xs~^NeYQff371OQCuw@goUb4Y?GWeA$q7FC zvO9icVkWwis}jf)Ol#_twYbv zk^VJb#~ml!L1098+AQJ3nSDM3Ct#t! z3a6nUM9$w_B>QyZeZdAtbhhA{m{WpMYyj&%SDo1`vt(hFor&hyr>%24o5Pt{?O>Z1tWC=92R2{lZ6LQhglepkO1XX&t4$&Nrls}vIt||j!o&n3G>}~{4PXjP*JB z(!H4|y5*Se?j`#LrufH;M7z>I{r&!QQPdq`lv^U%zS^>P#Usw?TE+)YMNa<})bi`0 zhO<$Odmk7XI&*Q>%fc4Fm zyM2;ylaQFuFg>~dHy4Iw@lz5N1{R$2?w3}ddsIF?(R#*%c^bMvUY3#F=XtRd33^8D zPe^|RL4!HgR#Wym8zTLZ-bKf7vJVa$q{mRM^>*=zX)NowR04A)eG10Ghw!(}bji4f zGWds}e9>PRw8=Oe3(EFhWse^A%OhO-m-`VX0@%4WQ{1(}^kEnqzR1d;n3Wah(1}B; zKZL@9aa!3`l78P}x_vSc{6RLLv5%@1s+DgN9rh1K-qIns;cm$p7bB{>%-N%_i$>*# zP73C0V9C`)OdKm&#hD(GsG5<=m2cg+?Toj%On&)vxqOyfzl=|sRlZpYF{)#ye>yZT z(@5o!RR0iT)jCR+-u%mTZD4>`&KfSiA`+cI!j=YIKFN_=5q^`RI;YL!`L_dm`h9Dp z>O$Kk*zri@`aIXo=J$aB+s-DdDuyhTCO*<<1zCt8X4d6<^n->5bWal$w065ke7!eX z=VeEtV*;Ko417z7d2g5lL#d_BhH;LCf`Z5{a$b}?y9scri|}T|Tq@c4YH4`J)?y6` z->{ZLxQP0wkdgrB`ePzOVGgHJ1ndy=(Y$M%Eu~*tAm`;dY~=W}S+`FC3Pd@C%^s!3VA^k7D!6luoZyj#_K^~A_rVTMDtq^ zvw-~)$}aoTr-Pj&P8H6@nATRm1Q$bi&Hf=L+`mishc6C;)(Le%nqJbl3-PnC|2>fx zEfaj8 zEQ54dE%IBw-w1mual)AA(KqNyZzg^LewI<4VP@su_L3f^IRDX|cGJsTae^{EUm4&n z?p9Fo-aaD?7K3hI#U$@ex0(dd>42Hu^hu~*%GWQrTs z*R+nD_!*{cH&Zga8n?YrafY~tpDw;g+GjI6#%o)r(=MHCz8R~+Tfv}4mL(%@4~2sX zVlKsqra26IWC)w^H%M>`%(h25x-)z$(^-^?A14!^lBmxR^DT(d1anM+5IKu@uw9Eg zb0uva;j@uH_pvq?g+aIZucI2y{Z}T5w+rh~#--)&i@#2LoCSpI!+~Iplz*^WOwg`5 zr`ri**Vp}`oE1I5++tN`WW_0=AZ2E?L4_4}f%e+3zpl~Y*~U2iqi4P(MVCX^q~K}I z)+CBfn~+rTHqUd21owK`+Rjgp|HKA_9$&LbZ4`3%D-vHebdKDR+I!?m_4-!LDkELr zf4fuU8lgFe8b8Sh_c$D(IenR*?mGKXL-Rp=F!)Ig;WVR0Y`PE9@kO&{D-LHECw8_O zhr5|24S7SgO+qy_9}*dcK8D0Z`Sj9^Mt~7qi;DyC3+V>0kDJeLl@Nx)=?6EKds{a4 zHwsjKJil^w>kpTk8zh%AwQol-lzl8T)U;eTEG)Z}N#KvII~r?g=A(d=()09I;_16& zysUP1;?CHPja9p_hO%AMAQ26>eghk374E852`^}3YSMhSr&M0T{Pw(UO*>z4M7$4#y0=%iQN!lDS&i7)L}^C`%3hcVA$a%J9 zk;cTnB(J@Oj=F=Z5@F7w%YpHA4@Tju^XZ+&0L8}Ybx$MP+KI)p*N<%{1*Z|SU!DqQ zW!>{$7N(Vd>K|lg!yaN_g-xA?M!eG9%(NE!QcNf2?{<<_O^|K03|jAlnhZ;{5A7dD}|+s_t9GB}IMq71IylSWLu znA2F?=nOcEyf_qn@Y}I-0Bab682}K1`CzjiO<8aJLv%*p(5HwTsUGYk151q4m!ox` zltgCH*!gaWkP4c7GJX4+8~4;yjQzT+XyRD=59TWUayY!YQNKpKoJnI{7wxdH7p!O? zKzB~9CW5H3=>gFx2iAHApxQ*iXw%XCRj13-p}Y*WBFU=S@OQDBKJc;9MXWec9a}f6 z@gNf!mxIm4cP9eDj2Ze25T>yh){&zhwnffj(p5S>L4Q{pSJP{R7R*AjRHga*wJ4XG zLkiS6P5sF=R(Mo_QPvESexwLTV5)iwZ;;Y5hCK z$6Ey8hsvl*!=gxzyC8I;UBX8o^h~(oEq7W)xyH4B8LEw+9LU;xE3J1plFqg-qNHIZ zgjGrCZs8exZ)juTYA;#c#y~%pa`l)?>iHS!7c#$g3h$(xkB7WT3R~vU)8brIAh6}d zeg{~bt3k!D=YHoq;v&o4QTYLmsCj|;dAXiW`ptMp+?m6~TETY&;n)!j@3FXZU+H)w zI?Z?ZYTDlxad(7{u-{&N?Pm5P3QKs{m0!>y2x^ur8c8sV#w8GP;dEj+Og_Xf)U`N4 znhU>}FW>T7I{eT|FFBf&8v z>BaG#02LhW$IOrLY^lC)ybM@c$-mu>CmORbJ+Mtkw~_m)kX}T!3_xbiKHT8eDYzAc zA(70kMM7|eTcV@GZmc7BmY@rZ=1Hs3mzm$-PIp83t=sc!88vPrLzSl5O#Q6pY`-M( zmVI(F#xEp--_qjid}?z{=ISM(&q<}b#_7g5eP+p=r;I-Wru0OU$%GtrrNeKrblI7&hZ?6W9?Y*!GnH?= z{%YC1kKDLhr@lyb))ktu2T_>KBnRygM_uJy3Dj{3gwirIpXF%lY|TBFxM@=0OA zyV7bTX_#X73uel`wOvOLXuftowkx3o>clIEyCsy>O=93K^e?tTjp=`x&sQIKh5|D z+OPC2lxXNW*At65F@kR>0549<{QWXo>g6%!?x@bwY*njK{iX>-M5gnPM{z(h@ysKi zinQ|-!x?h1&;&$yZMx+MU+8PIr-Ig4!6zfPF0-y}!!(k)Yy|3ARimFX+kA_bTn8Jh zIGON&dQLU*F*XTTq%8gPFnW>DFKp}IqR%a3{3BCjdMz{3vZA%&BO7fGI3sPt=u2vO zquw%KBmg!TLSgF|2G(nnNG;XOjOh#|ZD&JU1 za*w>iQS0*VO5Ki&$6XjdNYjQ6QJy{o(l1^-5iXTMqN)<6zVyFhW-SEiGnQQ2jPL`J zp+|n(Ve>U`4F9A2%jQt8%RXR0P27_K(Nmzjs?HCp%sn?Z3?5GeobOQHb@>9;(H+1u zsCyu423U^G5acwjEEY8Whh)&H&Hz*!;hCYWBClvhSxJ$wPFvi~1ndxO;XXWz?hD_frXsFcFTC1e#xo`um z*Qna@m{h-zUh&(PbQ|5DJr<&c35+l*EHK>e!qDt4SO&+%-Sh9@pe_Jox7L>*!$T#B-W<%s3lOzDI9$ zII?PbR%>z=o-1c$e@WE7urhKZ^ndc-)49)+t_RimE>~p$*Vw#SPh6ce^{oCl-j_c**6?r)Y$jyH1KCEv=LC^Eb|*7k)1t^3vc zOiisjWX&}o^`B&eR`w0vp|L`T^eS@J`yy={3?dw*-77ziJ5-6xLsYqJu~-bBBbvTB zw{d+eRV^jlu=CVI=T_OBnRzy>VPPO6ez?r)fwHO5<;{5`?1yL$Y`4#+)c!$!2*Dp` z)brn59A8_@CH(>F2?7kS$s!J_w~_SeTB6$B*Pl-VvKw3qmro1f-H@d=yPwDm&SgKl z0M&C#kt+K*tZh@&j`Qy(cKOEgy9&-ge9Bjos60M4YkdcCMff4d^^oJ_fGMEZ9-{4G zd70SKS#uz9+?hM31{+M=@~x(5o+69Ur^#O^?NN5W+1Vb6fk>U_?4PXzC0X^&-Lto- z^v`HMgIs@*P+guTPZqX@TUb4O?pWd9@*rEgcq+<%ax@;d6~kT7l$%$O!p!0=+Ay87 zJ|I%~{8TUF9xUK=j*bpPp?N1R(>w$Mx9|p=$q@?Jx=Sh+2bX2zGTpw*{- zN2H3VX~T-R+r-pN$isYad=T!W}zKI)ENRpQC@JxNx zrflAODUD)1N2^Tr8b0Cw(>X)Clc0g+a(dV|lDk`qi{^v#GiSgM9s8`$cr6}cZbUyX zD9VTG4~NjeuNJ$@B&cLX1*|Qk$D~J?Us3R=`r2RYC@dW@qFCb7<^+OV?4HN(rF0=7 zcR@Pl&$srp6=HoFAg)21v6HE&ZWw--(e20e_leyeHM}utGjQKjvQ=dTr$PVa zRcEJPP6o9@4vuP1{lO@>uShRZ(`+hmOdzhMK%KeF2Sp_oP#xcBvO>JGa^Ghx7xI9~ zo^T3~M%DIg9|Q7cH9>#G>^fLq59Ik&asW_N*Okthsi*d}o@>RPa$QRY65rQ^Y}X^j z-0C}dLaeslcEB=dl-juRj~0tAf^$&%ChqR5t|P}V2ju3!xN)BDjoEbVH1nH1=l7jc zQaJYZ zh3Mj)?bN&}3D+?4I`!XuKG*t?*+gAnH|}SCc6oB4uU>@;EdsRj(Sp~^&z@=aV+#FB zJblO$lt~wU_85!y4_R2&lceQp9*Bx#MJH?TSPi}VxjPHVbIDWZ512Ku0q^E=QICH*Um+4YC z&BHQNVXdp6J^>bjG`q~&27MRKb@rRjnLj&o4S#$4e5MlOt#@7nL5GXut<^@dFCPq; z&G_dZfEWEZWg~z(Fk8Opyq7M%SlhZe>GsxWP*E_gFIZBsvXWrrP_wXlmhqn8pxa$C z1Lo>Q#8zxJE`5EbSR97CvGb^8|OnPL1D<@3M_i)u?k)mxGiaLu7 ziI#XAXUq0*IM-1Ahkb zC;7wb*`MeO!JMedPJxiDtnVXT#*VyyWn94Rs6|8-)8snYfkOX;? zS~D|$ySs;G_T_=zZL=F!?S9R7?t&orLa{cQk20LTe)xL2qzZrju3J*a^o;W0TW&2# zA^1M`*$=DApsV3BM9rBKu&YeE2YYj}d0^)@s9gI!Y}vs4xHC?J=p|RQSKqw;qG^kO zU(--di7&#J%aevHzvjC~GXUvU2>1>OIFmsQu(NSA4+PxJnAto=Yi1T+*fg?!)zd%v zsjSO?yw zB{`jH;Jc6h8x>zYJdIj8_b z3pCJVDZ$*sT@LmqAHx?!`r4m&2w2Uk{j~PEdk~nFXUTn`M}7vX4XLxA`Y>2fBlcNp z?FzQ;XzCFzYLeXaKU8+dd_fqV0J+++fDFLem(w%ilZr^TNyzG)R8d z(Cq;V}pmeb(xG#pFLtxPxZQN ze?GL$J|B*6Qc%euiRP2fbdzwY=jhzG9QLrm&N*5}Qo>%pc8!;B0^b^jJ5Q(m#2w{S z3=cFKEYPFnuD7?Cn{$(bp7gdC=-KYVX3K{5x~WsL^+eAM_+)Rruux=VR^I9%f4g>v zPS#9oYU{iual*XUySsKgsoA>RyGC0=c5}GG!j3$_5LEx3)V$iCGFwzcHbV8(v2cm1*ExVLv?T(&N0J)duI$=`BqAFH>5V5w}H@;`gQqBKj80l9K+gmZt^*S-|-|4X1Tk0=Sajb)8ue-*zUZ8@vfjS zB5qnT4Q$>l^%(q~Z%_#88B`i}@uJ)9=7yV8f>j8=hu>bxm@4Gmc^AU+l)<~P;K?M_ zC`@>rJ!yT7M@nO?>XxroaghIdTi|}{(ig9}$3Q)H?>v8LK2X7%`LF~gi^7FCH%(R# z+c9gtubS|m%=KywyxO6d0e>q5jjxUtPfS2w;61h9`OeDsu!-OF=DZ`^`{)vNm!sDF zI4{fw5#ctxel+~av9V+3%bnSbRb-yuA>R*aF>Q~UeEzPI-Gl&UB#y>@E1LYMTMIr=5q(Q^)mEz!NnG2H07!%5pd|Bw&PfvSn0?}KK4q;fm_z(^rk+>*~+7k4cFchx6=46`VN^e!$~&}!M0H>RJNCo^B);i zRGwfGu-VLx{m8Blp z-+HIe;He!fM1}Rf)Si?JfMid3e|aA?=`hWW-DS`V^=kpGBhG*IU z6tJaf?DZy#{IO?UY1O%PoDU+Rpiyp<+AP-3Q zC!=-(!P%2#wlt0>x{|wQ8Vgt#kgVH1E04*^htb7qBsaH-h3~4b9<`}oVDGF43>bV^ z4f(S<3odX=@D^D!Bz2UI>Nfy+gR7U#=+bos41uPi#UnSUhJgh)l5K+R52V;l1(ObM zCzNq8hH<8Aob0dUBJS6Y!9c& zlm?Azm0%Ib{HTd}6QwaJGWGmZIMaPv>QDgxJBeUHD@GsJvmnv zrUMbd1wNo88-ej^Nw5ek(ChU>-F3^h+ltN*?on0v%iU& z6%yefUc}>Q{!+6tY5v}KI{7D$Ohus9R`Qp@};I$3Yi%j&;<@;}I~43Dwc*2eY?L zJxPMwYE?K_#02BYd))PE#!m{34XsLY7mJ^?$sbA(M9PNdCdr+?uiN zFg=C6i?&s+oYnF$T`EyQgT)}PZpGD%!d!OE@j{m4Q_FBFD@e^k^CZ4h4wTHH#=6&K zJzDidt8RFAZs;r?<1rS$+BbPjTJYQJk9rxkEzdBGiLqX7Z3(FHMHXoXT%=W3kS+in zod{3*AVmSb9gJ<`Nn1X8%z5b-S!rgopm&k8p3#`kGT`Od{KTKn|BT0cSIKGk77}V6 zF#QbqUQeW`D3MA@8spJZ9Vt}N-EsAI#I3LI$S6(5Qtx0;`urcpdMSP|DKFphNLmw1 zY~sByqW(K}wahG$uEkx}tj#qhe3)+%{8m#8GJ8+Ki^XFpCi0mDh~dIsvxQ+8Efj9C{amH zkXL;FAz){jxNgNd0reg*vo}Owt7(q4*M>^=K_TSB%NZYYnppf@_Z`AyAF)|W7#z@X z{>#WOsS@@XO!~_u4#9hv7|QZg22>_nb17E>tB5FsnQ6{0{A1C6`B1I}_fI?YSaYw- zB?9Fp#CvRMQP}sMPHtPeGFXIxYSGI|41}Mba#1boo=Z#9>ivI}UIb7^NqN4A2+)i& zTF>)NIA02`1r)nj|7Q%;k2yPWe8fUKo@u98ze?DlxKl?&3 zlRTwf>W)Q=URVG1Amo1ZIO#NHN94as{&~Au3SG*1QaWq>f7SXwjchPUVep#Gm|*_j zjsEZAu-9*;FdCn&dFA|Li2rI_s{1LH)PQOZ?7vF>d3);dvyVm=xegx0*v-c)pqPm< zhks6o|F;)`EcG@0wY+3WJzbtUZ~m+JA4{OH2t&^&K|f0Wy9?-st~5e1is7zgBntms zIiVCfZ^BdBd(XOZ)_)lQ#^WAhT8#ZJV}-B()-}QtAjTsl)C#*}?7s~^6pkML&2fg- zr~h|M|Czo!1}Tgg$;;Rr`hT0WKceUa-t$>604je@{`P4E;Zun)va(KtN>o%;OFBD^ zmYN+H(An)%($co_fY1J|0TfQsqkR-$!I^XF&n8+aJrCx#P%q7oMdl#vu@#NZZ>s9* zTI+SRq>F|HF!9+FLA&sNw(q{d;4g`n>Ydh0MRyQf?lKVSTS~_>%TpZ*RV+?^1RwdEgxGKzFy8 zC?T0DA@84a1X^2v)YuI~(w+nTx7n0oJ9N{_jCw-B7g^%p>-&eVA zx!4kVy1I*x6!9bu+JQGyHh4-3ion0WzPO+ zhV9wnV$TeWjHnp)1a{b88fq&fQaWh9wKVH0L@Vra76u`+0lHJ$(&5jQGr3H^xLVnq zVMV-<$XUvwE%xaXlvX1C#((=%LNn`KubF_&$ScEE=j?m48ItYo?XWHc`M-R?KcgPw zjfBpT#S3VUQw8cg$)9ik{uOs9@`d2>X@I1PiVEYqGoBMRW-Kyw=Hdd`Cc4!}cKIZ^ zU;eHCAz@j3w9r~p_MH7vJ~F4_v9UA|;1a@~Qc%E^Lqcl6Z{J}v`uaAIJbnh_^>2#D z0YHJPa>E4MF-1K7$p2|V^~q8xIx9t%e8Inc^?@9OBC$G}MQZi$goPIiLW^ai@DclE zg%Hm)B?X1ZSFc{pEy1V0%QpI*TC!X%fI~v2&$PPf>iy4byXcdj(x@jq2~R>pXH&wS zVCIZV7p^{1Iu7|julFy@poiH01F7>7v#9kD;qc@nu;cGii|=p>(?nJXS_?CE4Fnhr zl)!fuc{FZy;N09?R&JFk z06mij@pKhoV-~ATRy`P)f|XMIy^5ZH?GxRBw`grba?cn4f41<%Xe=);?;SU5bIliT z{Z^pV#OfWWgeT+B=BhGEJaw5iQC@3<77_Ka2-utYt^wKp(;I$t{J^Oh`TAda_dpUY zjIsDe9YU6_UQu42gigycbaMeaYIsccWNN56Z}<9acl7FX^Jv)B%VY|ZCa_*_6W)EM zaXqXV{LzVu`~N%`{$~aLulBC=sp%_5dj5?)nRFqh=HgeXr@NfRt=~S5JdaZnf62T`X89@ zdD}hjo^#*)=AIs_k%qdgiBtxmku zkBXK1`H`@}2%3~gl<;*;2%>FBai=bbG2@-l!Nbj?iO%R~HDZDm^21iuN`6$%_0^`Prh+EN2hXm0UnzZP z3FDrHeMFhc5HNDtlaSEC3JZIjhuEKcJ&>H1ZkPQjFl^`6khD-1Yvakxi1o^>FoMSZ zM%6eYi0cKocrV@Y$>97v=uRnL1WiyY9@C4u(7>D_*3h5Hlv%bz@JAFMNbgc3jtYfQ zjY6T1?QPnf&ZKE3$-<)j0LR|AnynH4=h$#W%Q1q3MF4~l@iWy3FQ~=8F_4{9ZQn>u zo~fX(;>S_aX+d;f-;Kk=TUx#NaZ8IYn_r8c4HD8U9mh}MjOM4G+AungtR~AtKzb;9 z*E(W{1#MlVl=G;nUANK7+Z0Fs{Tg}Wux`@G{l<#%GqOsuK?#agPEB>~1Wg4WYr8Zt zIt9JgdK-#j3@=q(H&#jAapL29saIw~>DMci2jp@;sRnB!G&1dq2GzXKT4$}JFYuzV z0$o;j!~*dY2}io8z=ipMstcO&Fs4dn5+Rqa#EW)dJlXPYPsa z1(cjO0L@{tHG`wHJq4NMp8{G)_f3;<6J!CO|Evs(&jdUE0acV>h3k&x9 zx6gh2{9aHFONP!CT)6POCzo|-yp8SS;}bmX2wW6~1%h13X1Sv5gz%q^CdCXz4-7O1 zt(9Z!^gW%nl-L%xr7k4`angM>EF4?~x%c{`Q!jp9O%NYJ)n2#2o_`ye;umzEljcSQP+U9hsTDFkFbF&KekGnvdW zsTc*@Iu<|Egz!`pV#nj;$-b(Znt{oi-vB>oU?O7*IzG!%8t*~56^nN_R;2&d#BTd| z&?k2lpF380n+K|hVozs?YyrzhGSu%HbEDjs6cGdJOirR?3b()E0qYkw*tih*GY#|k zhlkh>deAUoi|G|~biN_W84%jkZ2u8pA~b!2Y?45Wf{_V0o&^T+1-&KYaH5At_N&S6 zQL3|(6C-6_w)SP6gEo8)XKVaCN&t$pn)F3d&J1wkEWk z@Pc=7K5*ck`U#QLWxr`Q@^^(_u5!SKv+q|{EkdtOG948Ch11#z(8%^n0nw$N#MDut z$H3GBMgQ|#yQZMgndwG^1*Us)7kXCu68;Bf<_NB8ceIuWRs|!(FR&j~We0r(f~<$u PDDd-e^Kxx+IhgSm%WNbZ literal 106968 zcmeFZRa9K-wk`?;f(8l+1TP309D=*M1cJK;O_1Y2^!oXxVxRfTx;(= zv+m?P-FBWft*TW~HO8;~@ACDp*B3b%(N_pK2oMkuuf)ZKY`h3s${{3@v zty$xgS?he^<*eKNM_R{^Lcw4k`|W0b847rOfy3)f_GG5S#MA|Imc|+B6FkqsDyF=< z(LJNh#7l0g%#FeLJVbQ(2#9AMeBLB-b$k~|sbr97;Ab9k&=jB(f#<#jdqYWmhSG&3 zaCc0F7W@3qk6;eeD)X7K`j9!2h%IQxnV3 z0eVp>>q%}VeP#i{khs85S@7ondBVV5-af*>8n)wDUBo>*Uvprn|1TCKSVYii+H&@t z^iFSK?j56x2%j|0M6D>_b;6ft$0pXs>K&vG62Oz1joEAT=Mn&9_?ZWY1q$^w93^sq zg@!8qGg1iw4=n`NgCgo~|J)Op`0UDqi=c^#LGpM=y9pK6&+ai?0$&ND9|o*&jpf2S z6rQV$yQ{TuNR*HC*tJ$mw1+LXCGM9CPVFfpcF%Q$0O76iG-TJ3@9|o$;)`yF-1RE~ zxFj?*H0JR$Nz7*JnSlgR%33a@<_-pV%Q2db8)u13km){6`Hh#*De2hH30H+Icp6$D z*f-I4yhM|e^5gdi5;8K0nF>QD6ruLn5V{tM;Uwm0S>F5i*~K#^LB6}JR= ziI8cvo0X<4W{D{=-~~A_sYCyHZ;GIU)mS^~7qdN^mODvK+FqdaF;8o}RV?@z+2L;| zo%ITidp=6nrOxg0;PVM=Qoh=TL{x=YI3Bm7#uq=DWR|$q?%?_~WE+scYWW&@wtfDa zeEIxuW;_QZ&&YZoyZ3MTJlnR;e#n5SM6~7IF8+&}XEy!9HKZZND0d2=$!Ra$aT8^LC%wUsT=OlO@f06@D@x44+fN)U?1I7=`I= zUb?5ear5a2rz!41k7zi-xq|$1U?mQ}G-%5kzh*FqQjbL7Io7^o_!VYsX^Qze>If`Q1fUJs|~1ux3Z<{F(! zIcg00(NycKGbf5v$M^7xU`ksbToc)BzRfB(Ioq)7*Y(q?l<|2)Jk~CGMx&8Rd|!h_ zA$Y&bipZd3-&mkj{4U+=p?+_+T2d9e!^e7|!QrIuZ8*jBQp!twes&P9WIQbmI+>K5 z2fO|62=m1zRhd){!G_Hq%jP_(s4Ola5sb%X%_kE2 zCUX;UzTPgc4eCeIqSvDbDRPG`NMJegt!T{epc7E&`Y7)s#>DGSNeub{F;vPjm~>jy z{tT0geW!r~dkByYb--@|i&*X%;AFkGHSG(Zr&!^NUS$tx3 za0ykE0vJsqf9zNmb@T6KvAvO)r4IS$4ZB09_yI*k{h~LVknR=Ed$}ol))uCDM_4ojVC=g^yariBSR^G*UB*lc2 zyzr}dG@1BZjYX^uJnCVxRZFCNfb&bIjqL2~A{i%cWK7&iPyr3@*WT;DvQymH2OO4wB%8c088jDw>gv;9Zl@Z zqa5N}hDoi^5L0D3^~-vLwqU+q9d~!CjkIr2=s6>-1+^%l?!1fGaE4`Aq|toC-q~F9 zov5e%h@o;j5)Jkzb{*Po1}O-E!7GDVI+3xv0Xy;>huKuj+`K4QYra^Wm0cgsN?F^Z z8cbYSTIKcVsU7IEc!&X;`ZGAyTT;hRERz1yJXhpD9}_6zi2Mqe7;eTy0uEk5OU>)1 z6khdt5UeB)u`YuGNoY1398LljJrNPVH~++1rSWKiLy$Ev?OKF)-yHq6c~$6aP?7fLg1M|n51Ux_!G3OE z?Vk02It0N5FdbAQMbUY2Eo8>BSkZP{dPuq;LP79*p^k4054!I2zOe@W1=hNHB8oP)9hxT`ep@t8+@8xHPD}1t z%~a$d1jz#?1DngaY@{HLBVB99Hs3T3)g~8i!MQ2XCKoD}YJEVS9HFQGJ1ld@c-zfL~{a!hk!S zk0@_{cCH`};1a>!DAH$};Y)kV=S@HQ3L97I*%@a(U1CqIiuP>m0}Ms$L#W$>8GqU? zG|-YN>YH1+=%R`vwtv0_Lky}4OdZiVA`|`G{5}UlzzAr;KRY$K&+u|!>NelelINS4 z#`6;rfVz%si=$CL(XahQ{?8KJ#{j7Y+I&NV_^hybH%Yb)`b7NHIz7+{Xxso!uY%%x z!0DS;EO-CsHo@NXs4C@p{>29WiwXQ;QvZz!yk&*on{$#yvnnC}k2b`>R8Yc|18r+0AY>>eW2@NSfYMn1+tGgi za^a2CmEvrN!lae&@3iAw)_+q@mPU~VOO)#gcP#cslgkbyG8up5HXMw5<>sNPXuaNt z8k=L#A0_e_ay=BrGMdV%Jd(<}m6Z1sT@@{(a2pfurQf70^)adD&{4BD4IIxCubGjLFseF&ZZ^vX# z)k1yLp_G~KBb&}+K|u47q82Veu^?8dSWSF?wtCWaJXbmghz>50=7}K*p#^O2Pi{^j z;~W1Y3I?LX4_IrbTcd*w4!Z_hBdJkoX_k)PfJh8#nm_kWGDEi1m9f~yaHeIgY(n-s ziDF^gNNcL$D6vR}$XA?-Pd|y(?|-#yrMa2kRy6+1lO;@Ku}A{^f5Dx}LSv0q#Y%PP z(`ddQ(9ZWTUu9D3JZ>GIf;}~>9~s_2482~&m-eSxzy8eE1>NBbi}KD!ZnQfFMWq69 zhD4641^^y}pjL?G8thF>riv1auYkaNuEuwvZQj3qNc)Ys2Uj?B5zvdOiGkI9IPXIQ z5GrY>RyppgeF+aA)q))Qk8UD>ZUlzzbGrG5NR*sA`jmBO3 z*$ih0eJNG{d484Mk83!Y^g_N`LOefSPK)fZUSSM5JyL6-a4_}-?qF!5y5T@5hWLVq z#B6N|xU&bM}eg)Zf2DQ3_$~#30vM=WYeL3+Y zVyUyQ&9~TD9don$553G|EjYva62Hw*XuFq=l4v-rq2O`T;IY(xJHn)~&D}^4KHrGi-=% z-L{r(KWPc1C=fd5X_5Wzh>DIrFIfH+ip?}+QN+iF&1ev0p)JD-02X9~9%qrGdL{Ln zIIYB;0BB*V;T0HLO;pqhVl$j9P^_@skTCRsqskqmYn@lLPI+$+bLy=K7QBXe{2s;sz6XEF{O zN@A9DJY1wnP|FsJB;HAqm6D19ur(D;$*G$6Py3~0N1+F5ZGp6F z*{Gp~-7oUD*G>9p3Kc=~?t+r)HVVf3(I2Q}2aeje3?IFjZKq*5&3lE%*2gH_HoAM0 zB?2#O!t~RId2=nJlzD%Bno3XH{$Ado{J`Q7&*iR-DCk!d<3gctaoDnE^vLkIx_ek0 zSBhzj;PGt=Wx%5HasW}bx*9$fmnAoGiv#gtx)e60aeV~QRvX-P>2!6p!svEkexCZU z^!TtfNvpEobhA_VE_|9_zcJ)x9&|)ycfwsH#)qZfWyHQhkZCWz%s_ z1frkuXxjPA%ZU&^iifd@e1+Jy^C6~Dip=duQG(+EWN$!|YDEE>^j8?s7-Jp($0E5* zA2j%4C=5og`}1j^ipYoKa4$b$JR!aW022}Pe7H7N3_s-!vK!^OEgHRk7XEsVw;9OLg2n^l_n^$y`wR7_IHZsd&PmbZtAJEhuAD||WYdGa zw&(r1@-+bD>@v~+kY-&V@p`;nf|)L4($&%pooRi%x7s4I!=;0d$OERa*L)dY6qWOp*W>-A^a_fA;_b!0 zMRhwA(kiMCh)C0E!C~P1vg->v6e4?&Y`Vuq;tjX+My#^=mH>t?eb)G5vzy_~*|zB^ z09BnNJ<{P>wt`TLEciCce0(Mi9OdQZquPQIh{@g%>A>8eK%zon&ORJ89?nuzGW4#j zh4a!XYdXXxvF# zw;0n_B&EFes7taMzB-|PyR{#(M0^ep0c113%M3273@#u@rAUP#R`&67&Z;$W73|zL z3lg9!@rvO#8hWD&U@bVTp)@7eaybAh{C&4VAx~yg!*_N7gO0p7uBJ>z}Zm%_wWO$b`faq@r7zW>%&(+WnTLcNUp30{NNE&ePWJ+j< zYQ)j*_vDWT$L8~d+#ij18?|g;U$@-r#?C5V`W$c1IpN7~wVbvS+iCBVbk>}dG;g3( zhQ@0>P~9IzMsFVDbE4!dUALug9``G-B=w#R96b&(hi7q<%cT7b9AmYdjpx}5que~+ zW~xa5zTIn$8eaQ-TDlf>MpUg)_DR%rFb(}9!CC)|r`hJAh|5iwEhhE6B{xQmLnkA} zf;FKOE5Tm#&eduN-2?-k*G_)k*w;YMQmz1p%*3ru6kaJ-KNzM_K(mhrzQQ#kVC~{P zO_&=1z#8LCW{sqUimL@y!1FqF?_?aZ((-~WzGv~1^->)NbcW$MBhR-# zzU*H$xttE^PrXio?YVkG{EfpvWhw{vVAwPrHG-6z{Jwl@Lxa_iwbC-Qe8tkti2wH0 zpzJBz35SAA?-EFH_~fToXVS0|Oo=ZLo)mB$A0Kb$=U*&Er%ZXxS=8oNywV*~DqXzV zEo~jT_=>|UapY7bMT7k1W=yAEQWytMUqhG>J zGE@nxEVQf<0u!o0mZO6I@=u z0%8fMQ*{_vJ@1@jVM@BOw45_X2*yY^uLT7@eya0P&tl2C|BW6-#GWOhuT9bW2qeek z?OuJ;Nae8q4PN&3tKYB6N#-FKxN%5yvBBOuH=d{de$Wv-#okIj@N~YV@d6->OLkum zWqwxxkn;0_dOtJ9mdh)oH}q}u>Ep4al5rHfLNPB2^`&$_AI<{%9n;7&i#%wg($xZ> z_L~m+a4qb`Nn3w}vOs9Ab16M!H*D;Sh~}*)jKpgw`fjIUG_t#9CYK*RU%i(TB)%4) zION{wnErmc-1g`Pd}8ZC%p3|lf5RmGT5b-f7^1Tr?+h3W*val6Z;0kQGBRZt0D zQsmH4eWmcHhypRzWV<{=##?c1S3gAw6=@Se?MQ`Gs?Dy|0|-A~bePpeVZs6M_wSvD znHmdq2I{SK!1}Trqwm9?Uv*Yb(qPB=ZdwkhepmRuJH4^lZAd>&sIk2Q74FAJFLSB8 z*PGDh@MgLsxeXr|H^ls%F0EkD=c#-MaDuw9T`Fsyq(*!KFB%zE0I-1K?Xc%Ns935x?Gqq@5SeR;Fqo9J^(t~L z>+#0MJtsHH*kqv_HOV>qib}^A zY@A}k64D3z7vj!WkE31>Srr`!uqg9lWm>z7&5deK55{%l?+R)6rtQ4gPjv|Bhd2Xt z$U%uGW@D!>Ic@_f4mhwkS6wH~zATd@XrmC)%znnD&H~M_YQXCUtry<2y`^f=P1?qzU#EBuQjt}c6X=g1sCxRy-1J&D^q<;soi+Qd6X*T`kjNoXM&-u zFJ{=^@cabeLhC%|yF@*-$|Qqkui8#9>^`jezx)=w`~6p)5jcgo4q;Qoi1_ail(&yW zn|{Zs;LuqBYR9EBTj$%6g4ByleQZln>WCknE4uKyelaidQI`=N}; z{w<$a9h%SV-N_)G1m2Tlrzmt_)p9KY59GZ&g;O`8{ss)KzkWix2E@u!NkDo~)>JHH z8>343v#(Id+moz2{NUf+P|QmLY4HQ|*zTcrRC*tFz%)u+J=`8{R1DIh*C{YY^0C3U zedR9P9opeAw?N#?7b4Mp3r++lvF5V2aeTvi+x`s&bwD)qO=NLA<`hST+GFeEEw9UQ zH;#5-3G>I~gUxX8pmlR*gYo+up->xiFPWm9<$XHU_|NBYW7l=n4H$Tp(t%QC^YJNFzT@K!|l>zK_w9atyYtYs($nR#oRzanO=7=f85?s#)J z%%aCTm&?Oe-dgKNgRIBz=eI#v2<$GX5Ug76_8jh4Wy?t{-(H5GE~pH@4uT+>DL0)m zG_1Y@%)$g-S|6+ZZ@KN6%Dg1E^U6^kg;w1sQ>W4@s9GJ~`$q&19)o6#4Hv8RJCEk0 z1*tS%$E2|9r|W|zEf;OuQjE)NbI@wyCcbMax%RkJo#E$SK#*}{o!=EG?rrUIU0cAH z%Z-W#WMBssAtHi}1*~7u;N2kbLB$KkcpH3;*rlezm{V$h;jMNe0hRvbaohNiZjHFeDLC}nXhedLkn&)J+kx5u`VYQ z7Mm?Nllnsr&0`gjr?0{XEaJ*<7#q&iJ<9m< zENCOpEj#T6GQY%ZwHY}O0Vy1Gf102wZTd!BZ8XUjM8)yx1$F+z{h^n!L$JxuYQ1iR zb~a9QKM}Z?H`+A0s;7Rocf}ho8`8#ai28_$plH9XaG?7*{l>t;%2U>iXK(h@M0~X- z17|W@{A>CWYiav($xGYA^YPwE-Au<2>GdQH9c*30BX3jtX^X>3{z^iv+jWyLn`*I~sR~JU?u4kcDrmB;5 zBO?PtGn7D_OF&hC92+9m$g()C-m1mCk(wVE8@r6$Xg?pguA(qa;zGbr;sT`Cig+Mh3F-U8ccOz zV6K&$Ny{aG2b7~7M)5XbmvwAf`*5*&a{lvGqs9FL0jHxBXc%ubBTe!LC5ZS6R-^JM zqV)$2xt{&bEXf0)vjIQ=g|&J6eq@WI$Bs^W0YY#k({_Vt*`<88E#fmvgX^UXQv3@4X01O%#n6ZA+IBt>{eW8WwRPoaaW&gG+SpagB4P+D!RYrdNr6 znl6|^y{5?4+X*9&g-C_*j|37QKRJj2YprNL=&TJoNp@?CkpmusN{vGO6_tD!r`I;x z;%$Zc!A#}WMhj`2ANxyD-X%UuoXtct$-`RObkCx!yE}~+*byr84eC3X zbR=H8s!E>DrC&AX=W1Wa?Pudza^2L{oOBCTZ}d1aj8%o+n`u;i_uvdv%pWiICYT@C zohnXdCtTT^snp!+^yRx6W?c#zZvb^5KtrpbvWM4C`g?%Tbh+7_k8}*b7z`^{eVRJt zwroCEy57!9hn5slav(GIdOE#X7mbIOW2yEQbLQZ2HPXg;Ajh&%Xg#S74aaTxS`b_) z``yDuZL97$)e7fJUC>mZCEcAho>Gu3_xZ;-D6_KZQsu0=|KOLliDX1Dz$!O5gs0{8 zHiYkzKtMg^r@#QoFK+9zhSM$vcJ)d2{9JRW`_+_i!M$i$8sq%j1$b<28iN&Xgu13(DV$#xz9WOMPfseF*M6SC&#?z?hYQ)^vzr8iZ z&{T4+$zY|W8~m8b3WhAVn-Ua!`F<3{hNPCI{FY&oua z4s$TWhIOzF;<4c=X^$eUyu?k4-eoOhIr%e9hye|CbW~1;;HQM6aVg1%2z4zCKATe| z_>c6;zq57T?hu?qsjeFbufx zLQLMtrG-?=nvQA%xTmlFl>fiErUp-~_WPJ!C$s_Z`sUhVx!E6)$A5E5L0pgxZ(v8m zjQ{S~{y}o)OCx_u#i9^#{`XD)pEvF38GLWJIMc-czySZ=qe~hDOa~XQ-`?K_`A0VZ zQ&kpV?jG$qll^mY7Pxxd<;mf`164eqMhE7D;MZQcmiYJ1|9B73rscpxr-FUR|Iz>d z{L6O)Foa+J@1p$AiU7Oz|JR~W;N0bBvNN%>t0LobkUS9yfy|p^e-vqs`Ah}igU|_w zh%~umZj(qp%g^wpAO$hN92~85R=A#<0uI;rSFdU=0V-#s(_x&^aFY0wo$9UUe^wev z00si84MRZAGTj3=5?zI;xw3A6Lvm5pkxrRHzffv9KC?PusFIH4{ddS+%t z9sZz?^|pp4vsL-FG(8vj3V8+qBgpn>nLif5$hqZ<)tK@0o;}?Fr-H#dNCjkS1MK-NCPOH0o{He-p?)Pw+=O5(O7PcT`oqp8YNU>R2v z^FQWC*|FCC5k&u4wIRRf55Gn=UH(M2? z|BC<-kbqDTJIJJy;CP;;umRdSl9UgzqwmCc{}0Xmce4Zf0GNWe!RfJoV3U7e13m*l z&xcZbP5nn=@^7u6k^+|P+m$N&vm+LY1I*U{4&-m^`u}W20gC4SmEpI z2H0%Y8A$jXA8#)9sQ`-o(Lg8uzs?5`=K~QtqvbpsV7F4u0e@E&(&1oU^{J9#TI4r7 ztR{*rIiT&l$ubtcGO+$zBl4{S=yNEZ+msX(Drwna8_)T8mItXd&S1{ff!fqV=FvGaM8=_2cF{)7}MSy!#xXN;t9zz&b zqX)>wZj|>DL=Pvk7TQ@hY?EQr>wMn5W;UCOsak67OH1mhkR+ZhL6NruHUFwF^6kltae97%Rs9Ag zpwH!%hUI#7V;_KprSb-Oxq;6_Bxix5j_lmrf>xV45j}nVNpdnWGPR^P%=WJ3fTrgsg9wi_rDOJ9E30Fc>EdT_18(s?}G)3kCVUIUBm_Cz#`1(@g` zwOqGJuK_@BBb%tf{c0spzQx@oed~nJ9+c2%kYj(n>^9w_p_X4nqEtxXG0Pke_&w(X zOsnxp_COkGYzHdkaWu~e-WlNMk;uf2FwL0D6c`b$E^Aa6Osb+NX zV{n*GLtfYFO8)}4IQqH1X)$HkhbZzxLqmhs3uDU3&Q2iy0K~2yEuXB@u=ZFsB_>Y| zS6DyY-<(4t`jsW60c@`VoL1up>H{AO?YdFHbOusCnQF6XrE%W(KxtEfVqvb68x2v4 z0lDtbF)>_+HQ*j<%KB$m1JyAO)SPy>9Z>S>?*$BkUwT{jhT${1oEVTIH#pR2HM`mZ zWC6@Kk(3d~;Wak%mB!&uC3jGW`n3}Pwo(sp^A?b8()q!St*Cw?e|ftg*T39_B9+Ju zLZ~KHtEnQ@-)^a$XqV}16jnpGDmSdZN#mJ+)A%FWw1n<~xouWMo9=GVT&!jz_fmSA zh)8}E==zY1sONO~*N}#Yhjd+m;tpCVxHJG)RQ`*v^RmlUs?+)tUBOGf=YvWh*WFR4 zPhiJNXW-!PpII9~+9aMxFaX+~heQx257p!T=VNsp_eJqpvd7sn#k6|21e(LJ zW>|~4sjn{s$`Y`~!WP_yji!pw5@MrWd8KbGG|fWj70p! z_Vrf=cUdNQsABu^+MWztdL!QtRy}h}CkvoLbm0Qu3<8t}O2{{Kun4c;VIal1d&oF? zy**(@atwR2IK+QdTt286od<%Gw*1-SJ+*qQ5{S(%E##*BV)ajY1PfYskyr=4vnLC= zEp1y)j7WEAHPcLkeP5u34CXW!;7ma})|SgNq@ed2Nj9L~NyH=B+s zh_ySs@%Qfnh(;L=$3P(>G&S;$XJ^hKfTbz3&H{EWp04FeK$UP+B!$uyUInJ(@zrly z2JF)fi=}4m9y)Ehab&l7v2@Kck%n4TGAu`P3&&j9z__sjetf&zwv{Z~(e-Q7M#std zM#tfo(B&0o+PQt$2;LxR=f^LN>uKl7IU0#$J$QaqpHTEvd^mCd+8IX42>l(d4hhi|*7?MfGH&JvpLCqKF9euy$1?%Ahg@jm)CVqsC7!ejNNd><7~ zkhEsz9bBhKa5qAQjQOWc&d&L-_-ZV#1kLPP#Z+dfHR|LPQ?S0ptoaLBHpjHh7t*NL zVALIn2-?bQXK1=-Wm+`6DqHozbq1)m=Or0&b+X(*n1&#PPRnmO5JQo+ zKi8Ecgo7ZQuNQ4T%!TpgI-f7ra?~8rg(Qc(ejm=K#H24=_`T!xG+s`PN#%R9{K^-` zYYU7*Z5Bx%pkxEOZA1OG0wk>SdaQt)fGUFDC#s&sr8gPo#smFzZ3C!2_VlNkFFX2Y zlq~<{Z3_`Tt+zAhj#OQu?{2wFy~AnoE~2B$>Yh0NQBDw+)r6R!ISKE@DBi|jmXcTN3G&7-WG9{)Oy(Not7WE4 zgus6m{q!{cuqUZ0g=$)3UUPL#FST)a zUsm*Mbf?JYFRs<5V(GN|FsJ>+vsJ^^R#LI18xoSfYLn|H1gVu6c*mF?5ANY*c0dBp z*u~eJrOhzsi8-ewwUf3qz8Y(0n8a}5AL=DYw@VuM>Vt*qn22h%OCSmEs)8?0Y>q{i zYl+>J_pou#n_O&tl`MIf`juc$tvYLqdlTqV{)QqqQIoMY%Y~znzV!9b>6qqyTXyYkBUBo zw^j|VmS|L(l6t8&hgnE05{-v?S}s*;*Bo$@zq4)?iapK5wFO z>&a@9RLO4I7<3GBsbt8F4PAPpO_{eAXp8#Ea5dDWqUY0EuI6oyQMc_F8G{x_)u(I? zX0L?znu<$VnjxS4C25doRV%u#zVhsmhJA;!yCS4^0_(NYpsyl6C|NAEXiD2bK*C?* z;Bz{jQC_WR#H>&`?9VE~5Lt6ROlx~3c0h&^awV9EH#i^bO=9l4SWE6r7REco+tT=h zp+nwQF^vfjQIjz^QEzGqb-W2+1dgOs^WD!=E@DtWz-=oofbgX%sp~Ly&}p#EIli2L zJAus10^F|w9F)@*fD@AXR8b6g?$xtRyCsbuc|4E?0Rnpd?FW@F0tUW@ghj%Q_S@fX zEQb-T0746#fNn8>?@x2wd}r@a#23gYg^qMyY;vgp5D9+Xg@ef>{HH?c3OT{#Hi&6% zYAu_Vab|26FrOeqBan5U#0yfdF^|j=4VM5w1;Za1{56{fweEE?Z^76?v_o(Aq;zfp zqd*l-TqiSKpeR|v^w84tbG8&X>&m$@sqYd>L6NDLCbU9@e&pQ|wXWWtqwhK>}zvWqK z7_@GtCSyg}v7*98*(CI2RU$}kp08P|EbpYxRihC!rjEk0Y!tyEGicD;88ZG#k@v~B zbfQ#}Q#)|tAwK|-!Uv3W=qz%9$F`17uXm1#UFKZeWPchvmYZl5A}95-lrX@$GBx^R zo(%r>M1C|H-f2z23QQLfOB^G=R-6Wy%v4THog!$$UiRCSiPUeQp7Qe4G@ux1Gz zw20imhacR`HhaAWE?Qu5KhXd1?aw4#00Mwet&&r;;#qCkU2)VtLcY{|)%Q6z@L z(eA?aRw`EG%^6GgOC^gq;oX{nL9fOc$z`4dM-|M2Q!eL;{GEr-(J4{apA|#|08`9w#l@d=-(GS_W8DwFgqn zy}d4;dOwM6rhyXxYdWr}+P`y@4>W%O&@v*zoatC1S(3TIk)aT>Js z6UkkLNL7$bb>#>Vdz&<@w>z6*G}w+IkZgp>;gGI0eImTCrHI_w(S?w_=-OthOxC!% z=S9F|+FJr;)?{#OGTw3_G9b&NFE2Aer)%3wwkpW}jQkNcarw2!QT@t3^tr`y4g^8* zAQPe?;@K*hI!yaS(9a@xJIEb|&U3gyhWV^jVGJm_v%{q&G6OF_$4glE9P)IC%>M9pR1zJpk_`H+y_Y6aE0hpg$E?E& zi{}llvjp2Hijl^9!XPh@?0JZ~CLJ|=ISN$9xm#AaJ~k5h?zIN_Ul4PU3{)b56!ctR zGUVOy)GBzF$ z7EDf#M{;nF^doyBn?>tg&30AjoVA*sXi@y7R-t7R!*JDm>l&J0`*fi?P~q?MscJ8G zD0oLy-(_9mMUl4>&|$F_y+tAE>W?4Ce0K~Y9vlvnXu;*3#DHD-HdDx-GEt%=K6Utu z2AwtMyUyFC+`V|lrLfp(!j@sl49bsn5%X`1)3dBDf37iJ%UuxcML8bC&V)?&r@}Mm zcyu<{-VCWG)|sb*`?~7x14%EYDNnSrZnQA<8aSQJilbXU#dF9iNzVJNkzqpd)u9m- z>CB*hay{uM2iys5r1x%Z*N#Ri8T?4D784|t>P_F97Hi65!YGNTYW8Bn!M51j)!UNU zr9@X`J<|+>GAv!BLB3)(iVHCBxJ9)b*1YRVbSX`xK?(Lajn>sgZ1xkNkYuqURCE1W zqBmX@*2QQwi%VsKHzV4_FI*kQXC~3k1+N4;*hl=}S_x&fvmK{thkw zW^GOU;CpBxC%O9daCwY|^2DQ{_uYn}Ahl%5driywg4XkoGYxNrg%Nv4IB4&%N>tv; zdfg`L`5j(b3x0A!xEBpiKf6JeU96XN#6|gqU#M*Vn$+Q~Er+Kl(x5^i8{EOY`b2z1 zj>JGfsvAZt+W6-7PPWpy6lBMIV)<&-n+X82c)8o+xPRAL^yAuBRe+5j3>jqY+}9(> zSVJV&W()h%e+B0^hBkPXE$jDcCKqUsT?IjP6v(|}a_ThywkM=k9+^Y1|5c_dapm*L zA1G}`^iSY@MH|JzF9m1V!3<%>+VuVbAe6-<(-*Zx6nzV=lnL^^O8$%`TDIv+!Dcc> zLb}+FhO~;T#d9lp)jYilrXJG458j2u)U!VHUk=%YZfE#`2^UC#1^*3Qi%b=U&C6jW z!9gOG?}4m?V|ZBLl>jz1q|H~s3_pJl-b@+KePSw6hLZ!(q(WuvE867-DBiPI z9%U6HCfBMqWdtaWcg2Rk9jb6gvC3|IArOgB)?jQvYyOlHa_NqQFJXh)K(It<{75}` z$rP|k9-wi0ZPpP&0Q)NuiB+#Ok~XYIAi9p0<@vC&s!A5YF5%D&f<1P7G008BC=e9b z_x0G<`D=Z0bwtXzP5UAIL1vW$wN}$ACj_Ee)BEH1PNihj}|WhkSi$S`jEw`D9!dgrTsH^PXOs zz{4oBg8t6n;zPZIYJvUE@*@%PFXRPV7dn%fI&X;n-`ctTY2(Hli|z3e8pAskbo)V4 zi8U%c7BZ2>7YFe;id2QB%Mv$U0q0oqwPU0ksg0$vHJDV*M3)MTFwXp!TJVcSQ4m6m&p;lOJ9E_$%JPT|51L>CL29P*y2Y z^T*lRPv0t&2R#=!;dwY#oH94E9#PrjY0nGYLP|IY zqoW{tSk}cWiJgKbLP6P>Is>ZbsGMYXd1@WDxC*@LB63aYq67Ph?YH>dA){$ahdcWT^zn8Od?XXZIXc)jTm{B^R zu$CmDC4JivKPbAr=ewJNyak!O871L(0@Pj5mN}6E0N{_wOZ4cDQKt<;k<3q&Yh1@t z+`Wxpl=({2M(uICqWD~3zB&vA+A8K4Ad2Q6cOrh!FcZssgEb$LS?by%bB4X|XGq<` z1mMhov=r|TBa<&^)BYjWoxDit*Mf^Qu)t2=vjuvt0$z+1lYM zE%gfXbS}n@HKn`G@$+nvb9pU6l^Q8$0t|G0B*_LMX(=1fYyHLc-I7oy=#H-i_>}ns zPFSTP8`iMYtzcy0$%0MP$5}<%ye|H|kYSJv_z3TPmjDf@Cx)6xo7)k$LM%TaO1?5_ zfdiKKry`akJ;8Es0arg|V>7gX0~q=-6NMG|w?(io1)8@^$?i`rk$Za8$%qPag-`_k zSX4SF*3mi!l=mC!M5EgHg-k*W>)57sc0hi6j`V9#TQg@3qpy2VREAAgv^=%lMYoZL z+f9O2Nx!vsv6V_UyFvlOVVaCnwUr(^Y&qenJj=aFa1jHw#3;5;EK`n}hL84xOK=mX zWy3(lb|3sWv6V{kJ6pTf5?h<;u#s_#Im!TViKaV)lMdLVWaXxi=8e_%&nYtG)jO(N z`*_Jbx{q;Xc^c3w-Gxyx{?sQtKj+=jdQ0}z29|RQ4g2R63qn7xaq8Ts<*Gp|?WTO; zL>e55Z^5%r`#*fWbyytB_J)fLF!&HWI0Oq03GN;U1PL&~CAho$AVGr!hXe_bAi*KH zYj6whI=DNxv-du~v(LTHbN?Ke>8`G>s_t6r``&fZ%v)G+b})uG`99U~Q{io%zmQL6 z;`niTw8^EfEzo8I!u;|anr&1F*O$ehOl?-^Q!34XLLO6FxK~1B^BV-IwMVOdCqF&U z{cy1vXKU9FtgB5vLD(^ivr1V!O*8xcQxy{mBINXb<>}-!qx92)TfY8aYBbc@?<_@v z#XZ&M^qr*Ub0yam+C3SO@(#}3=PR!vz7Bfg2-BXKo_EoeqKu3iLhykSTV3Lz_k<5e zPU4ub`pgk@F1U75;PY(Ien5DI%Y1af{JdSVn8hMQ%3WZcU97Vc#v zVMB=KI#b2~+hAn9EGGJJ)0h#3x!E+a`la;Eqo#3|vTp8nq)tCWw|D zqFvr<+VsXQVcAB=-L_aUcYQSBo~~!HxKN)wsW~K_mWv~@L6hA={oZv$ux>B5s zYQ-0%5F>@&x<2f&&b?(mq{msln|=8`t&5zSHT^^q!{yGQBZllor9d1m*EFYwRa?`M zMr7KroZND*@u^PIOq&$SCv@aU9=4!Hk(D55hQB;JFL3cXyl^k_w$lMowVt!mQ z+?tSeXt%I_&44gnf$LD~Oiz?Rr!G4lXr9?z_?h{qcx)oU$>Mm=1-P%>z)q1c5-}1? zcd?`49s*@aWGz*8t@O}OOBB$Wf7#SD-18yW%QeofL?p?du;26{YZ)3LLtXsI=-hL8 z#K_aMb2#7oB+OT^fBB*5qsW)_f#>7<>lsm0^Br z3K!8X`PpFN>p>9275ZBIPCwxh!G!aWyvhEVR1WQ$YL!AZjFl&t&2|3mQa;p3Ms9xo zKIh(m)m5RY3S~89UwKvv!>9hFu#lpxrEXPMr(~e^yC4fhtVAq`fwVavCzD#)PDST_>k4NE)sLm zA{nDEZQ&WF(#B+`do+R^jU1e@P->(UJ9A)coe2zWI1h^yu#zr$tYLFRGMO*V|GuCv zHI-`&P6-#Mbf5`4e+GioxxfX8X^7fI2&Z7#@;CJSr9$CyB;$thH9qIl?7mn;wso4t z&R99h{uz?0ew_ChT>>*d*?FgF2GebZN*eyA5m@`sx^Ob=qM8Xtk<=2zXsi=_1tH4CxiDh zCKWI_x`PS9G^{IGGrQe~HuwiW;;1Ktx+Ki?x7?HmF3)QPg>q^tl~#U-rl7_gVL761 zI!vL}E{fy(A>$o^mL~J^o)LmUL?N@YRKpU5S`GAQ+IGr4DCgq*E)54q>DZ2tSCLUx zbS6UN87|klf9qeRWB$B-nNJ@B3=_(fB4j>-y6iqhB${FrqnBWKTVvKqyeWXw>$rId z(JIZT!9GoF65e&^32*yohCcSq68W2zBg>+-bUek`{h>g~^Svz-HTTS;C)5S6S|+=7 zZuauUdvNU}0dy$uvVj-Q~jkWrh^IR-Axu0WqM(oTh2db&j?{NN3F})bq7)kT% z3vlP+Drx_b`Jh?!7u|s_`Z@p|y0cJ|O8SbQh1heSJ<^Z_z1qZ;*oR#`IzUWtvJ50Y zdRsRC)B5wzovMJ~je}pgj1$NFRCm7;^fWI>f*5Fh=-PrR{ZNBF=iG}9&%8RE93Qh^ zFdsT7x-s|Hun0&|!!+{KHS&fs#*gPdZ(0iVS3YcRpOouX*j4_t%rsFwgnh;8EdHvP z{G0=^t_X-j+wUF<>qZ}E9-D6D4lIvJA!wS_i3M>MQY|`yBv7d9Y5+tE^;=*_i2p7_ zwQUpJ6@Q^YF(TDKhWgf#vL8f)jVO8~p^^e*RlfybLspi#BfKXw@&VNa{R_z`3C?gp zFP75wZoa=e!vVs&VrEw@-oY#VIy|cR$wLwijlG+C*@iXElY0QyGhy3r=iUB^>K+D; z>fHpJJ+WvPE&@Bjz9>FyuEQW`fskQ7%|OUOM|fe(lB@wb(#xU1uF8idEH~X^*DuO^ zfg^&vLuS z+net-*T_HR&le>D7&@}9AqXp=-Tal zGW1;LcIc4GtJ&e?!LHUbdh2f5^KUYzLh7T`xKdkEWunEOJjA;tyJCi}xGnn8EypTP zwbFP|CCwG9hEhZ==M<}BQxS#V)Xj|vny)TnYNz7G$i<{S2@^Hb-7nCQNmNH|g*Ty?u)eZGr3qf<|=-DW^gMxLT zL>R|p2-%QTnix}hg4LDZY%=MD@j7JA^|-~Y=;PYrHlxf9?O#MW7!|`&%ETv-vc;w+ zGA42dLZHF7ZQ><#&T5P~1i7M6Wm-;{GFU%o84q&&@yNX`%}@!2g>%6S&gBn>j6h6@ zO)!t$|JW=0Yvu&3r;1fiDc4AvS*G$HYgWIK>Y8K*3UKyhK6rmS)gB(U()*mSaB@x{ z$wX!AAbT7F-DI&$`YG_B4es!e1i3BhET@8|5kR8g4X+1L@WFBk)3ei1(?#5>ZuimjPZ49v%mXKDFl@derj3GVf#k};KUtfLh zIqVvKn)&LHtRR&fFhEI)A|#HT*YY-gy?A8y<{ z&sa^*wL9)yF907Jm~$8i<+LFDN=t*KP1+uz#8_lnw@4iE6^9*371VN`Ddf%@>;=4p z)^byiNqhWTqlfj4%D-5mv2ECx3m0nVm4+qg0SH{AanOY=PC zmNW<}NOwDc=_pU)y{^wkhiD--nd4f*b1C`IUa(mT2i|?_Qa`|%{k9|)rNOyK)0TuA zDOiPg$N6LJla~IsO^P0OPe9{lb?|zUIr)*6>j459!cm-3fHN!EF{lZ|lkLUtw0d)(`+BN&zFXJ{M?n8ryRIXCu}G zn*Z$9KCge*Hoz5?xV`1b6O!eGDx( zYG{f?XyTzm;wbJ|UE^jGKfi{SzCH)i*n^HKR^jr3la3$02ye!wo?J9eKF7?#a<|wq zc%~@2RZcsX>GqbG?8xc5UTLiU8{@}F(VeZOf`KqH_wR!bY`cmxW2r$TZtW=A1skC+ z4+9ocaYKHKd5=1IdiEpH$74sIMQf%MjBO4kRb&+_)qeM1MmZDfq!Shy|sd zFK6Lll2@WSMcR!3qTQKXl=zQoT}>4}xi;SC>Xtej%F1Ld*OgQBWJISj&ql9oIFab- zQJD;H@iC57b_u}e!a5!wL#%C!G)r7AC&r$>ZWSyjXH!qKSq?N{3>R=<9(*Yb>Oj!|FF}GzoGf8HLe2;kEg#@`p3^mMjUB?0ys~v{k5@3!)`_uv?iO zzZ3xQnormwjCGf1BVos|)|3Tij*%W9A+1dPLh>0bgiUlgLa>A=x32j|^NrOH0g$7C zFQ9oD2*;zFxPQ4B>cXJwUD&h#wUOtCv(WDot{%$G6RGzWVC&C5Cm*aD{N5o;VBEgc zv2KbZ@wXP^A`*MJ%C+LSLF99O7H$ebC?P6=ICC_esnK^DH&TzS1}_OhTXqjQhQb`S zu_i!xgeJkq9o48@cvKT8qj>0^5b7Q)ej{6stfC-NcPR3jyB229_ll@TYVOOunelqX z5*;`YBKr~akH?I97c4DJ-KnGe>o`y>r7pEyM|xgm1((&1;4IzpPNGJ6nOy1Y#F_d@ zc+GKlBYzz!`m>d8oGlnnwQY#NrrWpY`hMP-dtwf1tMJ5xar2?RUo+oM#yGN=zE0P& zGM~dWFwE7Rn)X1E1DltpnhHP106m%~9W$Z2+LY}ggP8JX4i=surYo!Yi58;%EM&^K zS6lB|7CP|foRdo9G{|apr9ug{*es`M;b>Z?Fq>jsfbOb5-WiDi#TL0*4xZtkOCW3^ zONm5B$F=r2%`{N2zk3 zoe@Mz7sNWPQS`t`!;M`0*-dLd!6FY>ZwF+qxDCf)c#S|_)$Rp2xZYoxXvHfI6Awqz z$Ac6U$$n>NVf3oD%WCGm-gHkn!15idAO4Ahh=V9^=!n(^Iw-l?29zDq?_~7A^pIj2 z-L>XE!Dc3*5m533z*v(RbOr}LxzqqOojh;QOnh(w;kLE**HknfO$XfQ<>z&!4sY_= ztjnorRRDSEP)d?|VPe^c&+(Bb2&Vk+zfTdX1Xx&lU~0J?X|Fk(-}hzC@fZ;tg$eOpN?SV2BP+ z8Znr_#FVUizUJdYz1RNr65tTImGJ#`9JLM5VC;0Sn}(OSo#W6{0yIbcwVYwhqy*8= z|JeXPgQOr4tk$fBV(?M@XmfBK5B^m(MU+T;{2W& z{SzSGyS2>bQKu`?;9kP=NLsI$b>sHqwX!H(LYVjBZ=E@VS`Qk}<)P4S9rswpuyd%s ze%Ra!3-JrB(KmRkMw>r)q>uXKA)3wgu3v=jCPD9@@9u8$ z|5dyHa1%jkgbzMO^;vEW+*P{Nv2XfHxs8TJVpz1aglaeS2cSOQM1ref#|MAt?^Wzk zW5o;dm5Do_{(KWUaIjC2*01iY)jz-1Eqx_s8u99;5r?a5Bb5wQ0lVkUdkWn7VRFGg z(ss&*-TAC!VIS|%(H7^vYb~b$KB*WUHmp0PbaPoJe(0n}#G|i0zgS((np&^&A>Y1u z=6O&o{k@N#ffV(x`O#c;o$I+Xl#|7qeFbQvW3jpZ*I(p0(mljsx)+ass@4!{++0#A zfb%YupLiWMxf2kgNJz+ZYB)~o!DscRYwGL$UC*nNs|}@!<>T@Rc0|sUy$)%_3lHyx z22+JD7k~2A(qA%o;(Q*cQg1Og<33H_5(pElRvJ4Xf;$v6+0IjIR~df&?PsxIM|=0H zT}xdSKK1y%+WQJYCg5eQvdzw1kl7n@<OzcLB zel857Xk*GFHEcY{n)`}9HbW#Qu19uAQNE@PPwd(rFG$>HqKc@h@{SgVHNO}g_8a$7 zvIPq}OHpKB4iX@b1GW6&h+jN|(v&07A_=|bw&cr@1blg#yv&awQcmGpgBHgon zbx2sew>$|)Gk8n^&);5!y?bn2+s^W|LyiN?tPNM$cl4efO)C1)tgVabK@?mE<36@A zJM_d3#IM|-UDgg-HW@I64BJfcZ%@vR-kDMYnkt675r!j}M%nuLWy_(7g{0ri2b=0t-_yl$-0uiVu9gU_#wj5%kD6~K1UpP}r-#*ZE=bfIAYABU;=!j^^ z$4bq7!*e_9e~GQ7F6}_wbbjkL>pb+^4a(c5ok|>*x4K_U zIjKw_JXfX9d9>SlJ)rHzKb+q(xkkk16v^S_T=ZQm9NM=$C}5}*n`<2kyw-7!V3T%i zdgt=F>DJ7u)`H%*!tuweTcc?HCU?1d$5r`-i-8;E2IChcD!Q>tI*p-z-`y^|xx!Ct zU0&r_nxKx3G(Xj-5Ts$ipV6Uci6*=};*z=2s(8{5HAx#P*(^Xg)E9+R$K1tg^34!)(_}K=2MTtEy!%d;uyJV z0P_4)l;@I49OtvQ$ywmM+BZMQf8x4U5SBI^2y$@&rh|3NpHV-Or_wtmCh+aD4cQoV z16bIDGO7@hln-#0X&1Z}GHXljsDI7S4ZSKK(A2-642FLf60Mm!yPR0OfktkZTDd8lmV#p{4SBTuCP zl*VL-hiY0{PyR+YTr#RXnHzLxRJp~XduOO_E?8KzkM!lLm;i6uK@ zUOgh+)>%d#C%;T(+_6KqZ!Ue@I6idZm(BB%!aPn>tjcv5NjiJ#;yh8*r_-YjTzuVV zyrc7{?b%iHBU2)bjA4IhC0tjvQL#VvhJ{a~NW%5VlBY}X17v3UqHLbCvlN7n7;>$# z7XN;#D1PgBZ)lwK@r$_CxZqGbeH{Z)s(>f#gPhMN;<~AFRb$q+w6PZxYw2$LU$gCp zi3ih3$&{Dw2I^&Egh-d^h`M*;r!aec}3E7KPt@^pBE?E0oap)PdJKy3!YgTYlU zOi5cI8c9z$GrZm7QXM+!#2ipUr3NCL$sjS3K29RhkNLYONTdf!| z`^Z#8H_10X{g+d-MvF@b=+EfsKdex4`mw?!v51i|C9K(3#RIl5JeV8|kzTh}f{uhy z;;4ei=Tn>Lmnqu<|6c!u6}9s4E4fy?gRexmuIu2`w@aT4sCihrhb$ zJifJE!++%6Mh8R^f5X5bfJ#OVraIT@(at(do)XXmIts+=Nc?j}0q7R!hQ`G96=oAt z(bK7a`WHJj;HP*mdpGva+Jy<;9Xl*cc90v38$NU>^shOG3)bcHlNKqY*D4o<1Rx;1 zfkhH?Ooi<_Q2;+LL`F(+i0En)L>QF$>(Q`B-5Mu?AJfv<_h;=_ho(}rEkN>)`=pcmR5NfQ}1(J@G ztRrfvOBQy~5hL^6( z{?)R-4u}myXdvPH7_)Bn-@pB*b$@-~uMg(H0k^SUDtG+%cz+&y|NR2+;VBrA2uvm~ z=fv|rfBxSO0X!fmwM*#J0;B)yga7@)UpD}TfCaC7L{>OV^=a3Mm0Kz*mt5KLmQ;vGM5_z`~a z3)|VmBkRS+pHSWyO=p(B#>rp38mbJOA#|~0Ui9xXI0yv-`Ve%-k$qC8XAO=!A~h0`$1260MqJ!$HSlF zi~BORA{qG}N|cKIJ&Gns5urHxjUMGg{cAx$PagRp)iEwFw*E6O|LWWGRNxj*Z!NCX z^Za$w0>(iR5fK)E{niC=yecRu5o(G9?4^7;D&Mz!Zv-~K97rto0q4qPpay)WyfkS4 z>bnU!px38*^w$LcIhG%C3`B4TSg()?2z*()F)pk7_a zj`L*M53m3d%k_u^_0XNI;;eoLCiOq}ffv0@+yWn$>OInVdh7KmvE_IYRu}zAg`Je3 z8#wo>&Tzq`F#-L>dnDjAkF1?-X|pu^aGUHF$qA*s=KR-$otF(jk*v*Lk4g!+#FHOp`l^b%SE*fI zZSP_pIP#oAbVLOmus$1wtcaFUh!s|=kqgFOVy!^2|o&V~>?-(5IjHA2?&yfQ(piL=qw*qNGiTJSxkJ@Ki&b0i~l0REhBqW`c>G zfT1McPuS~>2>`^tae27&994!^%F4=)0Y%8r+i7l2fafLz=_s0SQC=zSg=4s!N%-Ej zNDde03NNsX{WCbu!veGbEnRi{w2N>?J0UuU2KjCbf~K3IoOT-O>uVeTkuOCYnZ{7`gLs46{;uADVH`O5y*+qiW22oGpO#uW z7ogn5dtDx|&3{%EgTAu+T_zE(SXOukh`eEjR*SfcBT4n8!F=ayfGcitiv#M_zN(H2 zT>#81Fo1(14a5lW6K<+3$7Lxu>HjrMfRj=$Yp9p3z+ZMsG#XafFJ+;5*J@U>Nf z?(TI|YD-5MTE2WC$|@m99s&u!rsn_cGOx6=3SY5GC5UYa`Sj@%!)?Y)z#KQIah9CS z7I1idpPT_UQs3;Cn!odh3rc}u*1La78KwoeQ28z`%eq07kz2OB zNkF!yxF8rd(s{g3FragoHRu9Nmp|1H+M%W-2vqDgBzKfs^ML)E?C$sbEkewqt`_?* z_l!K-7Rq?lkvO@cnX@Aw7Z)t&7K5uEr3F!Ls&g95b*)D)oqEy+g)C2-I}&x&ls!#9 zO}rNPu__f@sHjG+_tFU>BeVU+>3AwxOzjhGUDccLugv(YJ&-x?D}J`6Iz0j&BL}M8 z$*;MrYOG5cmm-;3o%vb&3EvDZm8)EbB?KL4gD>(nR9-tExGKfuep6_cKtx4sdsc3i z`=t<;^kYfk+fS54eHDe|M92GC*)U9;1X=9S&f=!Ykr9>M-{o`^0#4EdNHiUpMu3yM z%53ndMq;4r9hrS2O+>)tr0cYvd37CNh8h8I#UW&j(jsDFVn)$nj!T?L*;v3*cLwks zBL)FBNQB1;NfMCaDiHC$08gs`kb|Sp50arc6whZ%qcLmc!=@T#C%}bdrA8rl8U{ZD>MA}5Rfs)a4>NcgA=@kg^-Q=f$aM?W z*4Fys9%`pzXWi~MIQ+ALe<*oCd$*p2&qGcOzkMSfQJ%M^>6CN`mXCbsx#j~znUUUX zy5Xh)-gWw|Ke>R+4wop+kYZDSvoBER0CZ`^tPl!=f!Y6T@r&Uoa=@9BwKIBQl+i4-#?fLnqEo~IDo;HAz_1Ri&2J9<>e4A6Xougo7$I9?>}-a-JNsqQ zRA>?g&g9QpK#7b2VBg7@8xP;JncE6tCC{&zg>CjwX-n&$GeSILQ+h40Mx@(05UGz0_+3bFwv_Wl*Gt~ zV1#1qlp~Os@RrhN(FNKjo_pGB;1vdZ>@twVHcQ*(@!>ZbqKfx|1)V_0tMshDHw=F- zlOrQwsA#tLmkFB{07kLyx{j zlQOaMJv%Fj+rc2@@BIAKjik{O1o9SyqL3_-6=Zr`R`ER@EkWPM*pCKS{w zFGA7A7YdG$DHcGPL&)&~VqusW?2VvrVf6E4x9CT`>zyhXv&^P~Px#`u$=P1z@GRNF zfd`e(W6^UQWvt@@N4+^U#U-MumE~7AK5LW_$2{|wv(Gg{yjJ$FTMAc~12owz-ly|h zk&(R;=rXNZ@n9%n7gG`=OdS2V0pE@j8|3VxRl;L54adg)RKzf_*Z#y+h->KVE?AtY zgJbSuJZnt-ti6?;pa9CUNtir_Hix4&+ogDRG5R{K&XiG!Qb<=;EBVi6|F&6ML5@S0 z;PzomG%G&0-D0}WChZ4QowhO2DN2x4N6NYM^RpUjc+14ZTYTbIb@cT-f5?f@1_13a z(*KDC-7d8ZNopj5d(%{s9LC85lz}lCL{oJD@BxyI!Sp1Z6t5ReS(bg0|CmEUvB?-Z z`Jv&!(3FQBlmh!=P65>2pq8dyV#FN$PL~n{^CDLAgoFsAg(<8N{+Ix3-QmAYA~ZOX zU&w*dx`Gp620n>Qnxs{Ir`!Enopr=E0Bv%WZEF#nR9$pUW@W$hICRmXe^AKRDKXDS z(<<330qa>5}->;TcG+oEEKFG)* z5BhiqfDgibj4UxD=hA{$iC3w!HVl6<%E-=d(KzKkQtLnN+xx4Byw|!#F=mB{TT-N_ zq%d{9hmN%0;7?<-VmeY-1Q-9v&8YG`68!i2_Y^S}6Xr4U$sqmMDKJbJ=k*sFyzM#0 z7_&<;>C>9e`38O*+1{I3Ks-ntv&dG+iD`e{baaoagH9>UK;JJ(G|NDQ_w8#QuTz7j zLVNo)*Au9+fXL+u&W(fA*Q*83Lh)&lnP=mI^8qM5K;05n1(@M6@CKCz<&gLY@NBoX zfuu1(i_l@CdLvdtQG^HLxyzO7J_C(kHl_1i_ZW}+(3d(3DY4U7WZ#!fwA4n=a`!~H59`O*OTq7NakD-#ik zSeKk;gt~V>tv`T_tvE9eh3bL9_!cN5gNK9*OHTty3JCG^hso0+p9Fa`&EMfsN3<&u zw2uL$JVFLIiZ3bf(BfjNqJl}nXpl3o%d8S4Hvnm#(gC7FZb(2#EV%A-E6Uuw70w1w zwP)e`ZH>@LZLMuZ3&p;_^>s(}Qz_0~1U{qJpws=@C5%AgobNtvL04>yy0B+OFMc~+r)3n|2ddvDx)yadI+c_YNtljWb7GLj zxSl`x{u|tc4EZ;B?q`?`RZ=<|SK$^syXXT@U7mDa+X@J{`rH+ku!pSw-&b>B7(F>E z6bIKn*&o276vr#05(8=J^Gl=NQQ;pUA+5>EK1VWoYRghDuTx_-n#b~bVVlpM2h9J9 zEp23^P4*a9qo*#&ppi$Vs(pA^j?|g6H?IeoQRF`?02#+}377lzsR(`#`Moy-g(@J) z1SZOb)~Iz4RjB}KL>5BZ)<`yK2p9(TFoIP_H6ZCz9vfTP7e;#zCEcSs;<}~?xP?E* zF(xxXRo)vOXLUs@cXr}i-OXnA34Zd989j96YAYPPCd<1 zRfUDRdtO!EI{1zdp|ErKE55ziH$r^-xnH{o6B7*N%T;Ch)Z#|^9;rcwV_4Qkz*`sq zn&Gz&gS&`<*qL$qgN$s^9C1xbC91wL%d27_QFq_Mms(nOhcM$%ry4d9gUCt5pErih+Co)U*vzVH?24z~IJ1 zGhO`0AW%j0fjg7sJ_y|*kDqBE*bqDW$(qY5xs1+PziVg$YjE=aZWUOUp25pP99R-L zh*P-U;CNwcF$wSz=vt9iTNHLMIHpXP= zKZvKqy^|Fyei_ayQhG(+S^|EF_(2^l1@;Sxj^bVVhgmtn>aPaV#@@;-zrali zC{QC^!^-{;(_IB0aeUc#=9skO=&<`c`$eNWF&@V=Ch=%{+b;cwsWFpBfbdN%jalMg z$l_;9#q&8pDv43giKcXdKoBV1#Zb_CW#zyaV$E1829~%2qqXUB@YCVYQu!c=x2_YE zO-+*Ns7M#Ch%pnqGYMF)d-MAVxcU3s_0~Icz$tSh&ldT|-@%Tg5kw!mlhsQ=w_WQ=;_%D+Dx#`k*GkK#N`5M#P6lNPUkW7P~kjDS&e(ZQC zEK>>M4|9BY_!f0}*~G26ROjYMKt(C}fh%sJNs8Oma!JJKH&Or~WHLz~aL$-{%U1DAc9 zKXy3{m)P~}rEaVd9#b%Rq#8?mpGi$pMRSGy`D(w()XhTLBwwd>lqGh#?$n!2jsaIR z##Ba*{|i$BG2tb24{2)H2AY{@rxXKg&pPzQIR(S?5*JdLZmWQyU7Mjj`#IZvZ?>u= z^}M>@D@UH8eCr=O&(i8m!`hna>@C!vax+QPUKdSg<@M+bKGRKfrSmW>pu6L0L+F0` z;&b-oCo3VfW|j@8qP6|CL-HpYS#uu=@_|A(#O|x0IKhPQ*4@JnogdkZn~%@CcjlZA zg!l0(X$ty^cT)W_w-0u--qmdy-?fx@qGF1_#>gSAIE`|Rihe%83jbJLxXUX@7?&P&CpSE$)*=hFtnw}5nqcqQU$OYHGo zwEB{kp{xG@TW$F9Vjgv@;}Z4BvOS0H0}y5?iV@pV@UGU>zS`a@76%)l=U{h}R1tCV zQX&-x4R%RbTdwsj>LDJ8P ziA*zp4V+H!&Z6U80hNSceXsYh0rWdQk8W64*c^ERz9czF5}dCMXwIETcu`9mr;xI4 zKca3$Rzs1FV#6$^WknATY%yB!Bhxs+hAU-j?`&OYZUP1MSiU z_R9OGaf>F_`0B`um9poyFt;zo=>2p#i)!OG-KHK-H8CZ_C1=gk*gwRe#>3cAX7`Xw|{P=aSch=okAyls1 zIR+G`C1!8$L(j*rS{9d8retFgpkJ*jl@JdmE1&vAVuJV3?8&%rGawk}x0e03-k_ND zu}E!}qvKuI$%yctfJ>CtF_B;8UjUDWT+FGatpv@>JQ#{#t`}u(In8=>|MAAxQ@LF zaq4XuQiAIgWo0!EB6j6oyC4aBw_*}&Hc(z}o1v`on1w>lHSoCN%+ zK<-CfxO*FZwsRk4V{ox?)YhfQ`-oS0hEPsFm>m_P4QQ+f#!9GFCGU{$6WcZcqD<;e zJ8&%b7xM5dutoY$cx7eA`-jGVCu*dgEjtE|%*{JLHD+{9ZwzZKlZf!h0mC3DwKfC! zdfr%5rfc}V79*`53lW0DLM?Ly+zxd2WAzHFnaX(wENrzM zBoeOyfl7&G^}dEXt|zt3PY2VARB`{@$%5jp_-dW?=kJ^)H0e@GI+=N%4A&oEXqOq) zrqEx-pQzbT=AjT=aLl-dmr}-kiwL-m*jUnPDb?t~-J>w~^xLp96OZAk#7Q*$s`bX$ zNdx+&3u~aDNbe3(8^T>4q<`hmMyuV_L;WDkWzBuQXCpXJtN&E%vMoXhRX`$X-fdb< znH{MdDd*R6Tkzy7k$H_!Pf^GY^@w<5+urhtPdA9x;ao1j;VZ@EIe=Coobq-cZU$_o z6h!E90EDx+pEHZByEKG4_!av)jL8AJ`&Zo+O{+D+Y9eoIJ;_E#5QLU4#i&ub3OQ#L z04l>!sBZd6;cn)qVKNlE2!15fc&m)kQeY#XCQmk-PSo^|8WHHF^rI96=E_^Vs#iHuixaqiy78X^9m*67#L$H|4I4O zxXM^zMn`(Br>2^8X);**Sf;tm^0ae+LSNgOWf|o$5RJ01WY7B7rSbV*v(Ru>K?(D% zrQr`dtF#2tcW0wiLX-O>6qpUQ&3AEbpL?JEa=E+OgR>PwrtRNkmvj-*#^yN;aCLDW z_hfW3-LQ&$)=bnK`@EDPmn%g7;R+s`pYS>M_)a0BiaeLIsFm7SjwL5P3*{O2Y`RGq z_g*m%dPK`-qa>Y9MS&!RgdS2E^gXG21MO;!@I=0zoi{;29tT)un(_(eltw!!{%uHHpMFSBArJfWATNsn;G4DQyBn zwx~I+79N$jYbyeIhf=tLsb8!fUIJv@PF!78hIwbxfKRJHvW2x90)xDC-h6Gek9mx3 zB9(>~uEf;iBP?+0;Wan38OwFSnY08T;zPFQGfXPnZWaNL(DyXexFp&c z+nCmm2{VTdY1J@@d|wXJ);DwikMP+(a&d_`{Fh00)TpLLvGoA3O_q^u4F3112@g0P zEW;rS2~!gud51ZM(l_h4XwU%SJT-N4s_;muEqK;QLW3QahF*21q5rX4nhD8>*Z0I4 zeM9d>9x2j*BulnZyy{tM3)ANyq)XMu=FxskKTJWNyzpk76j|@sjOzGVCwC_&uq(EO z0-Ca34sP>sK~6mOM2T}5_wUBhnlh7H$nLb(QqCy1+?;n6yB$F9C+5h2a8av}i~2wt zTa9_)p-q_k>+^e;%Zvs9u*we6laL=pQQ6vXCHuHl?7Xv5p3*vy+n;}{015cm0Ue{IW54QTkmJ-9O$0>y)<0?eJ#irq z5~ykx%->_w^{28adL%oTUJV+*@rv)QjrH_~QJ9WE!9{R;0zD@ah%brLSCW$@#$kR`cmR91ksuCPq1fU$t5x z!E)mXEg^$epa$hbzId-ptDi7WE7FV)7=aBfHMaUI&ovzfr$PlLfg_(ibp*1=I;uR>MPCgW` zFeX5_NX+4yji%4fD%~wXV3{CTo zn#*hT1EY)jatHytZP`f&i78;M5g5!8(c!c6oli|mRT_V|&rb3E-S{vq7cw$ltFP#* zpKk87z3%LxHUx)BF&S&{tr3PG;d~VBEhDAve z)wVgS{c|yH2V#<1gFH}&(s~n&Xfi?Z!3fu|QEiaC374YgmjC>y0j7__Er7nE{E zuas^4cwDgt8_gPp^Vt2N&7t`m&~J9|5}%i*FBXJnE?mDP52gCnnOn+K00o<3^*uK} zJ*{lNvK>NwJw)9@1M^VTLR^LPcP*)wY$SPJm$3(bT#E@fIjRM%KIwiY7lV`?n*Zj_-4*JM_peL(#__QE8|z`^Bx)T=w&Fd1guNSfsp(f#m`F;Ey zF@%gECZ@PN(|u_)fwmoIT*u)3c$U*zU0{Mx)fWLCe9QJaH-fwG+@qb$UC~9UqfbV( zyK9$bBXbhpeN1K@&bjXy9;>%eCq6cFTQ_2}Z@LHaX0;HeMK3rTmtArc55P}0as>@M zVWw`yE}=mI`yLK91?t~;p|i2F;wzDjd`F3fkEEHsCQ)u`aLapBN-4W!KP&Z((447Q z##w`0dR=ruaP;wZ{QPV(;{0r}oE7s$ZKvEw)rzm>7}MO8yTi-wVPQkr_oPpZbJo8@ zH`j>^+w-bP!!Z>VCSR0mb~9zTby;Yy9LgQC=}UER5L)O(gnXQ;)kn3dExn3q|1Ra(4P9hk6=MCn$ z?%2f=lM4o9o#!sHhF!iSQ)!z-=@&I*!}vqmxq{;yg~Xi}Sj;On4xtH^rjCOD+8TP$ zA^xZWh~O&!4_{XSlxMPR1HlQwEx1E)cXxO95Zv7@5L`lVg1fuByK8WF_u%hi_wL<& zyZc_%Ulcz~jr8=)^z@uQ9bO<)?%*Q^6^djY=TG(CZ6_?hm`k+4ltf8GMOZ(Bnu47| zsp7yUaz<9W8j2J&(sp^40GuP1+;3VN}&UV&J0XbUqMbnXA}=KhS^ zbG%py*Basj#M_1l_~D>yF3A_XLNfK{&2Vwu_6Xd79G4@`p_XBXkn!U0f$ObHoKGrv zhOzl)avZ!Gtf^HdYrRp&Kk;wLWOB4rP$|~9c@B^uY8>q;{YfMQp?)XnM_Rbg&(!&v zb0)h;?))F6G}eaSW$VZ})+uEeU>zEi)m~ZhSI8r>42cJYlRj#}ArRG_a`Q>D9HDIB zUtmpD`4!DC#I9&tmKV`sMeUGpZg=EpTQj^fA2_=h0|N9pn$v*O`NnPC{!chq{utN? zfX&_W1e&&}i8%^k#veQZ+a3W;4{n5HdZ_VBQ5TpNY5A{PxU11gM>8Hn&~P@74i{(S8ldPH1^^#j*Qe5*9are1PB3jszUv64b! zvlm+a)5lR7rt2#BhFL&N^?`4S^Y3`}aO09;k@HW%Y-roLegBH4Jm3VW#VUKk1zZas`3wWZgQ*Ap_RTS*QlxSatkIu%JRhuAoFha~ zGWhTEV&VZsfcRNbetykam+%*J4yc?-2=wUF5`uf|;(t)NuMPeev-HQ8BVs@tAbhLRzDTItJ^R2m>2M-@;&Z8S&>^2k$Zh z(^V(ca`~&R`A6HYdY}Vp!N1qy*~M(||5RP`3Sra`9R~kr|NorfQxae#w>NNee?^%6 zrK#W6^fU*cT;@3R=>Ht$pKHE39zb`lEV61b{&&j%I?&(ilsg23Qta5R^$$V(rA=UX zR0wX?t2QIQ_47KQ{SFp=@8>}Db#5zgU-+{VE{whxAut?HU(!mN8zSqi0H-#ho^N@^ zHF;g&>#WHIg4tbOnm$MJP9(QIhOgZ1c{{2xp!fU7hjd*QdhD{Is4aBkq~ z6Q!`I$UCkJ?ovZ~a$X%?HAq}9Eo~B~zE_J{T1{CW7iZ9*We9DX9Jz>x7SJW#HFM=A`pc>k@=myJA zC!iW~ax!&7f#Z4bqm_w^yF<_EZI)c=SjKiiyiaGpjvM>T%y$oXXQx(iJ(JIrn+%$2 zuLkYM#_OYqEYRXLzRAoLKmQ22JeBcQ2JdwD@(zj6rOKw@7c7DCFMGU4Ye_n<8F}39 zATe0YkY5fMlwRIOUu?^Rzw|=vi|D2{@Rf^K=vum)n$2-IjLQ?+RFS=pfv7$`wh^q$ zIY!&SN3ts55LuKtG4dVP4@s45f7)fgA!n~6PV-u*h?)Itk)09?NwIrD5ee1E<^ zI2dkIN+n`01ihWK=kC2q;l3SLcCh#11I90DPVWs@<$i_cPt`2n||A>fwCuXm`iO;8b z6f~2pxBx-*9#oahYWT9nz^=l=kN0*R&H~sL(J^9WPlv7_n1^fejcYDE0H-{?uRZ!$ z5ebX@9Jb~@=4vcbWT4!Aj>5q#S43kUR0$ku&5nL`$_L**lAiybT8gZgG zmcC_qs%LMbodc87`Qv8KpbP)Lboh3KQnJ zpVYU=bazlTMdWl0JWVfHb2WtPj3v|7uAW|^2!r_-^fi(?D9pKjg`S4+wdEEWAFQ_~ zFJk+#AVebn*~Y~ZrOR~|3FM?r1Jqo!wn_1}U}FueZH1{|L=EN=mRWp%SMyfTC_%}G zHNhty>FoMCr|r@7z2(p5ud^SK<2>%KS(%)sp+es6w(;vM7-~_I%F#l*Na1(?)P$;^ zuQ8jk!GoaNNpG?0sU5}N@@;-3lP*UMk9-aNc;l^d zJQ?Wb>n;fn?{mUyv52hal*P$fzrKAr5!~Z}kLfmTanlquUrKRi0|^DLz^hUMWyX`Z zMZ2?c8T;O4hYT{t*m0%YP`YMQ(9|EJIIr_qZtfpscsee|D$7Z&maY`K7pqU@GP!Ta z!N9?cb4R2s+}|Eg2h`$m@k27$nWibcV?j`5PP?FO80DmA(diiJhhkZ4 z$O19xpdd4i=Evx7{cDR$^|;GiQepgit4rU1gq@z`=-O{)(}6I*<7o4^{jiW`A4K@J zvp`yiu!N&IVz6+~)L~KIVcCb$blF$>>LKbnMln(L$-sS5TClXNh8}K6R&~5GX2v0t zJbZGHac^T=G6n-fHYICeDz>F}R*eQiLbt*i&M?M^VxMtfwJ%ZwvPV9CFTz3il)f># zsXprouk1Nwa7;yRF^D*6+yKRrr!wXJ7H&q&<6D#+EP>;$#qsP^gMu0cqH>*Ic2Bo4 zy7FR(&-zU6Tj6N(?}6CS9Cy{=C%=WO9Q_o?Lfg0_E%Ct1chQ@AWDC??8=gS7Cr0cP zsW$x#OnT)McUNzbdX=5CvkzGoG~qm@~{{Iu#ay_~=qWOq!sK_%Z+F0wI0 zPnA-=#@5YR3#vUD;1TPSRHW#o{qEN5l*J>yO!1NJ%X8f*orrN;cPev4M?pyw(P6?8 zWOL=9J^8H^$k%%a#bR$J$MAjf`JTXylan$n-t%dSLLBV^E#3r^0Tr9;d&e3NO~LON~kF%POjMRc|=jg50)A+VvdA~kBa4lnHPPiAGjswcWw@RnKEeRT>th9KJ% zw~;&2Nx=`IklW9^t&8LmVN5MA)|`!@&uq2AHq8cGBL^1e7uHDchd*#=FTIqv?w>g= zIDFy+|8+mLR8jXSUfd?`W#S0An%wYfzq!DiJjxNe5U1kp_)4;$Lnf8Goh$<;cRF-WK}8 zf_b{pX3b(HIRbi`)OYxi@cyB;D>Dcl^wH$_mU5q0v{EXRD^+k&=JOOIt88Y%8N!so z;4Fb~n7hX=eTBEp?q|2FK<4W0BUgiFuAYz9x*u8!plrPp8Aj{d+~BNQ7+UT+ZU8t) zifSa&YKfKk;Y+JGrAEswMvEJhCbvw3#QfmRO*H$}hGq1ChswILyX^Q&Wk}dLv$=K3 zu%gsPOd2UySy-S6Izbl+awhSP~dfRxT^58lM>&``2A0|rxp(0woq}@kf%Jm9=&a3x4`yv+#}QQzDZ~E zr>~A9r-hMyImcUY<&i#mD0D%sxiS^6i>T)(bzZc)9q_#B#lxGtHS|u{Q7^Xm*rV&b zr|S0U$a9*zqH6#AphVeycA`jgMfI>uz&6fy>`CD_^uPPNy80U3%`t67g3ev7^0(1fZO!t#N@fv5V#(Lif^ zmOn&(W)it=g3;hbre)EA6}L#okNo`L!ddz-^b~H8+F@@c;%X-wefquy?^lelo2s+k zQvI!}w~Q>Fr!H?%w9p(LhKy{a_cxC2nwiMWP917q<54`-2Y6-OYESm3)tlRCb8SnR zjLO_4BxAf3G5CnqMY9L(7B6jT-IB6s%Fz{GyBKJ3n4xg*2N+q*xy#rm_o;Wcik3AT zA9v-XKNYdGmN)_jKf}w8^pAU}_M5mFsROyQ&kUJl4`VZjs_swh z_Ai}MGiB87X*v>5QX6zM=Ov1+F$Yd(l=ox(c~U%9O4@9BD|4lLEF!2-b-Ab6s*|k< zu3>w0YN$}~JJ^WlWw6)+_5(`z4qv_Xg)21R!*uWO8*lfUCLMcO*0B5W8`&+1xIKIP z8u1#Jo*t(-cv2y*_KA3Y8X1|V3WwKhFuz`mfEX}f1xcVA~ z^$lXqGWdpZZAx}jdXkw4ij#1!u={QZyhXJf3Av{SHGnTIw{?6Am#|_(SvW z%9pv)QiIP~=~CUNlg*gd%7ZNMI4I^4ngm%I_}J^ak^>dYn)>w`-sDZGk+1EAc$HhoQgWyyc+IRok?^y_7BS~Ma0=3zN@MxbT2{R#&@~5KFjjfe(@LA zXjqT9!J}Z8(an9K@^5{nZ-JuqDXL;{?U&Q>lbm#xhz zFBFOiJf<&klk+dz|7C0o64%Mf^I0HyI^eO8P{X}N&2|s@=$wg~;>?&~U2V9-CoG4T93N_)_n|%onZKCAFHIm9<#9#EWL3EhdZO zs#@2N#mZIOw3rLM*6? zKb)UBaQm}Il8L4qm7Csxutyl9c(-sgC2tRWXwS9h3xWWSR^$kHC-hr)BrgU%()Cta zFA0Z4lsVBwtHymH0&qNF>6KDq6?GxjUeu~_o zOPHMW&&MF(N(#sJR6mdNYiN|mrOFi>eG&+#Wo6#hoH{q8Xe)~IgYRAyyN&!&Bok(< zJE47bZ+$ui=?V)?I5GptqNdjF*=A7j@qO#;HGdMLUBJiA9n?&%c?B4%$atE4 zyJ1QE_9g)zwil&gO|NfSK0PE(!0&5N6-E`QuCd(gmslqqJ$o$IRkQTa`yw2_i2mT6 zctSoQ+>dbAo*;H}n7HihytwQ%bXW|=GSv&@AvNUph+7XtEQ58nY2YTYN8&y^I z_7+JQ+oS9@niQ?G3f4M3UZt60;YH_UjA_4}?Zcu$y?D{@3n-gG#-iTt<*b_ChqKf> z_#Ga-g?3vS3RTWLnRPka3-`SDNwZfQVYs}FI0`Mugz!hD4=J_f_mNab>kTgGnu2Tr(Q?bJMv&TZnh9$h2YHK;! zifof#edpQp`DnN(GBU4W2rsJ({c^8mQ+Hy7WKQ$(sVsaq?M$w#uVe!$A=>^ocVB%Z zaK9Cp2a}p>bv#u0NJ$yp)XkvOaPD|8U7!Q|6m;Z5*35>=|4{SN9sKpMXywP_=RpP*9AA-9Dx|R+M->) z&cc~D@diP`Q01SiQSBt(eZk&Xn&+Mu!tQRZcxsf7H`LruCw$f}9z}k*7SOQbu~hBm z2QxOpAElwn-QG49y6?7G?92_ye%u`e7D9@8tNSG-+Q2i*`TJ1MnihjWA94RQB7zFj zAbxBmq@J%B#l!da&WONMLoghJ8qtmxk8n;%PZ}q9=jLF7UuGC7h(lkwrV@~&k8ZxR z_<3qCKBoyBqrl0U;hZi>rEUUd|*Gz#}P`C6aR)-%_ zu&h`-bXzeyNlLUW_>zvWfox$Fgf$uV0`83^hj7(iyO#^gR+`p1Kr%O$ZRseyS%VRO z>#!!4nnh(M>lFR4(yL4=Sl@2#*z@VTXax^GCJ>cu#y}ZnQ<*P>pOzL*A(HAk$DhNH zdQKOq>fN3iHCojju~!_npMB{U>1cA_H8I>wM$e#qO@nhu&GeHhNkOD7k2Szc`@B-q zQoVaW@^K*N*$DOg^Gn0!eNEoe&Mj?vK9{!!2}AWJpQCmu7u&g2WIB*%LJH zyn8T*jLpHo*e_;>?bTnT^x4@6T-cu6%s97Wu!Q)DIpm{gCPl!LQWa0OyuBacNH_3d zj^;|yM@)HBQrR9Oeqkl6$CNzWu4<-wgAqUfM%1I{_o|S0%JjUvx~_?BR8)}q(oh`; z8A5l2mDZ~~9~gvIzjuiI_$9|pU?YS0h2i3&z|jGvMs7(M2QInw`D~~ZFjf>w&&?q* zOJu7(Pj;uIELf&6+UF;3Olm6Hd?sBlHj7^o zB3Y#nbXWhptdzKwU3tHfqv#p^YaYC}tYvhVFF6%f6-zLvg#TyE`I5SKqOpPIJrjMZ z?&L*FgHc)*7j}cUKE8v$F9^5NA&jMK`QH7`V4eSv6{X=jAxm;@Wf4tTOsbv6Kxb0# z6mj)NVh5$@&*nPy(h)N@nnWC6Dn+pZP+bVi;-2s^6UQiM{1O!Yf%iwkT zmi^Sst#9h!Bqwnd=Awy;Wxr*LFlbiXK3G@2y7NbL09cKhB@^e#WkwLHG9=r+LPvo-?b4_)A+`|@9v`y5P>hwynqd^M#WZvVLVCnlEvVv$CRAr37h#(lImB^)$ zHUs~2>)2wVxB>lM_ws6|Y201MSF@MTlTgoN^IWea`ulfs9ZZ`VcbPxFf=z+`g?&qhr zt=xf1k~{K6Wd|Kh)e)|GyQju1kIQ?#MV;prhnMkMV4BUR>Km<&AFCXn+!|j#|5&zt z;+XP^;U#Y$(lZBnH6+<>9w+!>+?o41L2T9s$sH3cJ37zl z)*-Cy(}Ad->b^(shfeSb@FCh=U3kLk@#mu0Wn^NnuRRdED~;W1owhM0e&j+~Qup%Q zD(lg~J3K9TE($+XT|{Rti9BHO=OMp?d@>$;_{7z*i4MD8&!9tr83rnRamWIf;U2ic z@5gz=I3T0(7MI;o;V2$$2LXfta3=JYN{@`C1C(RiuEh-RL=T~Q4&=z{quX3>mZLe4 zy&N&K$#k^i1`GiQEI@z)IBLTpSivk%h&5(ZDF&VreWg{ruPf^^TQSnuUe2~wElc#0QldE|j z20Mk$CJi?Hp%}5MaFHQD2fik_$_sD0i19|;S%26k8QYix1AwSH&$cN`W<8iS5GLE% zr1})y((X#`#9Rma$TF(sVhR|>+EURrzz+>p-9OaW4$mEPzc7T_?X6<1qD3#QZM%ys zDKn)z;)TG3$W;xi8ey~;ULqgVa#P;KSr*Cri###kThrce<7HiiP)ShmlJ_DD-G4>>k*_C>_(Xf;i0n)I zaoi?tUcoWUE@q$&aO3%N@(S^>V~W>qIBBVw{t{c{P5&`~QMb_85Z%V2D_eq28SPFe zWD;hPusIdU*J=k@pc7Q?#<;TF*B@Dp#8U&vqC~U0Nju$RxB| z1Ar%+43u3sAP{4EKFM)8*kZHZpn?P0`m;(T2;0JHJd&l_!~769%?QO;h{LT2=3%{L z#n096!)geLja290x5;`jbd#?S?CTqsa1rl6W$Ao4=GmuN;w6;Btm~V^(ZoVOJSp}r z-szIz*Uxa3Z`PIs+e!#jjvr;$5@0m+kix7!DFikU+8Fv;)=qZ?pW}8gCs`AW?bD8@fD(!gP zy9wM5tsA{KyK6`uKexXd!iuy2QU}sxpGwS4^cE6TpYJ&(WmLQgo2`f4{V1@uez7^- zri|WM+&&qLZq?V52RCLa4w5U_?vm7IVQxtknL_u-Z4&*tZCA>2+V2tofv2w{mOm4p ztkuz$?XI*VUU5 zVlaqd*-L-@IgaddYUZNriE4Rg`==_IOx_SN>CktHP0^q?BUA~bQ3v}X0xne2XNS~g zFDf^;)h>M!(Q!wTyh1OWXW;`p&Q|RlasfQh_ju%&G3Zx~P@}25rPI_5Y{_nS7|*2Y zO=}?1eZzasLoxo zd|c70w|oBexri7f63U;Qo&A+XrBkt3fA!OCT8EbE*_|roNKLReW9Ftnc%p}}0Do7)wxa+=m z!{Qb92B;?`wJ=9Ye#(0D6j_w%H$$~LI3>rDZ4T<#gOsd0hSW4SO;yh&D3m)Op7%i; ztq*tT9Jx}2JsCI9#1L4$N}U)sq0UJ#Lgb$7qlQ;s8PKN2wy`LRW7iEOG>dQvw7Yj` z@7gAA44P^JyYI^$ycBQs$A2xraE|3oD5Tt%ah0o3Gmw%?Xvb4R^F!20XX`raRV|g! z)EQ$0UIf8c9dGO}E}1y~P>CtnSs$USYLrzhVzuAQy1E4)o7AM_$wl{aO|eqfJR7*)-&0f3qT!Y8cwN(RpLd1&TVBek$!DK1 zc+*^1?~4MHyKeFfT@hCH?2e%7SvFSCpLHbBb<`{Gn>%Kbx3-;xy^#q=I?k9$# zyb^aix_zDUNGTDC#BBH5WT4c-A zw#a;Eme0B8cSe5cJ0+g?5Snw*ge<+_pw%REtZ zO-pftWczK4??Xw~e=)y>qy4nNlDmth;B`HnS|Ovh{M71+he}SE#e%KeiyA{f-R9r= zWEs7b?KD{L_0&|YST_|4XBz1LOVPz9y-~L`d3ZD{-1r^Z*tv??Gs>ZDL;?YOO&aRa<3zLxI>1?p3zW=jjjyf6)J8!j4W zmjZ+Rqq&AfURiC+j(HkRmL(Qk)!`B{Sf^6D5To^iAorwY_7%Y9)@_5_^8DlT+L0 zzIg~`s?$TOQ8d!#vOl3J;cQKOPPuOg;>cBoKbWhnlTx7^+O2C5&x@(Ja;rU&FdkE# zz!PPi;*IpgAN-P|lJ;4WvSy{E2^rH0`6`3~SEpj~Ir|KZ-r$IX>@=$b)0aKmdiMWe~Qr8lcTYrFOU#}3*Y zywR_(Cif@Lt_NynLmR7gCXGdNWkuVXO8p%;fIVwdetNjos#j3clG62l$?8YMvk-lUdDOeaPWc<6 zDeBy^=Dn#N=y#{%g^4I4(Qc~R#E=3euN?wX(g3<5TTgg|UjlgEK@zJ^K{VOyEGh_8 zkOXvu@V{+z`5exvPRg2d%S$;m7vS|VJEe<){%Pti9zyUR#%o&UbuulEF??j8{8z14 zB=L+tw8{NIKkF_vAZpj< z-m;8CcF`Go1~)fS^tO@$;hr2hdTFKX?eT(xTu^R*;MtTvpwc0UY)lz_8j^L7r^nLHmB~m)#UezQzkawa`#Wh zZq0MLP?pkdN)qtL-YNZ)zfx0AZ=Da8MG&WkL4mhv*)(a|yb+>zH?4*bRYvqN6^y91 z=g+>*3R-H%>O{lgt#LFutzyon_vjNep&!T7nwBL7t zducS?iMxtve*z76hZrGHOa2M-v~Zm%ie#PfBKa~%w=<*PC7CC6X*LHSK06)zSk<{- zzMb%21(JG9-v_{&LCPAu}>8cK~mPKYQuGqcURIj+514?>*Vf#4^P*SYYRZfT%p$9KcDpC$N z+FRpJS=uFJ#@GNSY&~0YmUcbm)>?-jY-q@ztC5bdr&DLqtd&o>Cpvl!7>Hyq;vH?~ zDvO(wpC3lu3*FBxS(n8YDl(Rp-|qr^kbIk@Ye2e`eq>~1=uKFo&!6RlzwUQgN*d-4 zgM~TH8)%hj{-;7j(*ADbsTrM%fksj~LG zP*`u-;;Q)YqQq>zFl@PP#t37wAkjoI>xrEoFZ>D8d5P)BO#&)BYs{G@eLDxMV9PEx zscS@kb1!aX%0#J-;DF~cwy(4`zVY-(D(zIAk5cwj1zu3CiPVm1nZ+icw4R)(G3yDP zMmya-U{!{H5p?giIeg$si&0DjU%IXK~mS^+Eu{noVZ@{ZhyTu#sXgq$!>V}YdsVb~>@KG4Y zTIFT{fAxl`X!F`ZIxV;n&n0`&X4J5&O2s1RoJhq(j|zvDPR)7KT0PU~3vyyx-rbN} zeIr+Dk_6t^!}pcDpL*h6UoR?d3N@bD4$V^7xdGh3bu?deOiawsLZQ1r3};ER7LZh9 z(N<0l;qGB>R5G_VB~`1fxcc_!q{YE%%!?x}Q8<2ZP{=U}0y0`wfU9P2UV2#N$P)Q` zb{!gYj zwJ@n>;H=-S_pF8K|EQojl02H~ew}aTp zcb&4a$f+cv;YGSle%<#=1EZUVDcx4{XItf#rQ3S<3s_eyGH+$Mj{{U`ct3!MR5bH~ zh)pX*%9mk~556q48;<^SckdSfypw9aZq?`}-eg`H0Q0*KB^DT1J^zDF{RQ_x^$a>k# zIRA#Kpc2n8*a5RI_Q<>5igl48E-1fWw)t&fq`K@;ppQ>`iQa7jO}EE+Gl#5li(AB> ze9LbhP&PT%cP-jsF}+gXfs{O&@8>1S`mKzQ1hd&>*F4)URrF$V_JhWjc z)mgM8@v^Pa#QPhxaQ#7Z=klEoIV2)1Thl5*WK%Red!36Sn2ghJ$Osf*42Ja&&-~F4 zCDqOdHd#asCHnB7AP}>CWS3fi8h;=I>SEJkdw`NuSl^7zX_Y)blVWJ21K8UL+q&cv zJvQ2F2=|I@KTNbD5gYql$zI_%06u)DC31Ez44~m`P?fOX*(kYl6euhWss`v4^T@B<{Z)mjo-g$%$}$PuFTop z&hD)~;pGes^7@kwwymk~`>S&9^%kS58YTW&w% zE6W{$H+ncP2r`c{R$0q?9j^r)))znURl6Y>GgKz?uaFP;3o z+wJqh={@r^+Bb1vV)!vo*gSR%7BWq>;kT`sg@qC_saypIR?Cew^AM%~Qbqf`m=Eas zyvyvoF%lFAfbh@%me%4SRkO9UWpvSNfJ4%#y&2@M>vflNwA!XS!wqD5$7HckgF?_p z{`+Ww@#C|B2}s~CwR$$SS3%BJ8Oxdi6p=RhO4IdffoaphW-XW984_T6zSK&V%7!!0>wV%zf95$xML9Wq_uCWHt+umH*c^b*xKw=lXW?t~ zI#gJxiiSpEx3~+v%nuf6=&!R(d9rCNhhNhRT5wBD%UfM9jhKbr&JwU_z=4_o+}}u| z9Uz}FXXu*W-qRWMzN@>{tM&xQBEQ^dlw@ZMN&osn|2c}6grvtU;Xm1^|GGZ)`SAA$ zdK1J^HhuM}=z{#tjxwU&Kr?ZJ8gA!p&5Qvw(8NL^OSalr!9gaoCOBVx0@vT!lwmTN zd@HO29vQ#L8DMZd;5*IFhoDkQMbQuv3N$($7Y_QULDKSJa2>Qh-DoNYnqwZ$m9h5l zPvapY6FoiL#`AdI=T{&^Jp*r&pw|3PokH>S08#FYk%eIQ6f*n%rdp>x!e(9P+Sfgq zY)+T6bR>p#dZ=8eaoOsw8Jppc?+M`pzW87iKEQ(@rG}J(W}2%nk^W=d zL2-lfU*ijj;o*MN2Y68x^xZN7gQy8Xkf6YP!B=sjXYL|`#Y;a-38+|e5x~Y_$IH;~ zikZ!!G3ZMbK_I^)DD3Ehn=R2~C6nb3`V3G8Ds*CT9RgIr2h-aAGoNw|Fa$!3N0PR; z3?bzaSA3!7dLVC^&0T0O_Q!RLBe7UzdL!{7m8Wq<5>I*jel|#ykUV#VPc;D~m9q5GJZ05lEOBN9ntHF9Bh|<=tfhztK zdKL~vE0D7c%GP7H-4HT&Dvkcfp6}1*n-1fzuC5LfdBX=JvJGdlUeOAN4G8=+%pgGo zjNBWP1X6ZD6ZYdsMDrPU^K@~lSuBI`v~9z~PVFQ&$(aFCr@LHRSo=>um9B(5gc&*- zyk7KIy3l>)K!-E4RBrd$K~Qk+mFaN8~2lxPeWG!%kqPesiwdy#K3B;9fIv3`~ z56y7bLNW+%OF#*PgoE7ZmUxc`=eE~%IQ2Wh6tTO#s__UZnj!Typp>v?yvNBfn(@e_ zleQeJMV>1R`UZE?yi1!qu02~gDAE6_v%miiXs!uC?^%8a-xFO}#n&@7u681@_qc3l zY8~Ha9f0H)AN(B;pv{_(DJ}!y+rCOh4BiU_-r|p5rY9KLUH0$T_4w={X_i2?)||v} zou3i~km*WuSeHRN?_X2(oGAtT+%eQ1STNG@r52)A7QOnzyH_!jw*zJ@lVc{-L}XXpmCS;48vt%HBuO}sGl~-Z`-sjn-2I7BeEix$oC4P7MuZ6V?KS(8)wl#iq0Rk>7 z1hc@vom$JqgKRAp0#Jltg5GvYX#L2Q53i$S)--Dd_vR)NuxcqS>F!}s&GRr=u)W(Y z5;YX>HNA5=q)4pzm9IrlX%ij4rt{^SdXQRz<=m)(qGGHuwvaJ5X_`5Ql*pH0zB8n^ zw5(^J1OengM6l{r?O`RbSxLO>^YW)BdWSB63&!dqA?VTV{N_`3iazgsx!bjwGHqvA zja=YEc5P#4Xp~4G>fx1}Db53`L1$yqNm|pR*y#cDz6M0yKTQmQc%P>!lecxZz-eg4 z=b_}M&K?MdwR0sG5vc0|ztMrK?^sIU3%A6DwkifjSNfqFiprCI2Oi!FRaADUko!Hz z@x}9QKX+X%qY-?mtqv|vcI*e{K+2$k_v z>X|3v*Rcl9*aZCuXzQ486>xamMj0~j83+cq4X}v4o;F-97j(vPob%-yn`$Hu*Ve{*LuIAHQRi~=G4WI&DToX8-KJyr<9dhn zZYuJ3b(|UwTNnRmw*0c;3L?z`SM7+w+xa|0U72v>R36-6lHS#a=ZDi+I!Nm|8tuk> zIURE~TUXbHM<58>k;VREYhX|kftGtM97@*I#h}ZRUEm^oGCa8H|f3&yMP_>o?N6UwQ zrH^J9b{Y79Ln>K;3>5{rNk+(h1f2bY$nusL-de`Evkz|@rZakdsiF;mqvmgh99SA3 zK!=?T{Kre*`?#EUSILI~B%i%5XQ7%%oVd0(sCc$rf{m4)ukOW*(bd2=4HUtozbfxIH z-GI%~yVr^F)kSWW(J_EaoaGysSbH3wkPu_T<%L+oY51lYRi`^HC!w>J3Q3ECCKM^% zo&GYkt5bnN+$KN$$W~`TiRBRV>?n}eIW$$c_VEa=H%oQ$bIr3THiE7fGdID zE$wTN2JBm0u+mmGiP|F$ikG|dYztlokrVH#o1d8}aN1`bKQtxH=Egs$yjgKgkb-1{ zG|*CV8B%ZAJ0mn$s5Y&1*jLD-2PrXzs3NBYxU^l@_z|ivlSS^gwzk}QT7l!A67l`5 zEQUXaKL%^IJ_CinK-MZ?mZ{uYX}8s^0H@W*^Qp$je=)E!Wbw&C3Ci0;5#WNO!A#S3m*05l28Ej*d_L2P31tpG8=#RxyD6Yk$O-Lc_qI zAkD{MHch^rn19=(c_6N6!-atBKJsJE-%)d}^821cuB1!ViGafojvxXFUU zcn^vO*pp6G6Nd&L5nukk4BkNdqkzoim#4cTXcV+pY9*~aHS#dhf4P^aphVUT$ ztg}u_L^dFr{AXdYc3n^us3(&C$JfH+!0DBUY$OvvP|b?43D2T1r4IKGHRppuhHArT zLkJkiecc`T1d-Ykz9vv$1O)TH?#h4vAOK|TP;dF83}1)OM})99T@bw{2$*<(zo`52 zA?XF#;+s}d{o`MM6oz61>gqc3uW0ytEB|d5LF~0T@qgR7|093C1jKYc3?s6z5t2XZ z{gz{%F;o5O9@bxTyRj{g)-PEKLkl8%%tLOcq$z&x$(V88k@UM%pdA+oD01B`?nUwDUot*@b zv1NP7ek^u>DsL`2I`E%%+G{iE>(FxBrY^nux^KHXzI*|#!rR~9|DKd25j9S%a0}z# zLEH9Nsgn7cIOU>g^{I5$>*Vj#|GQfF_7b-vZ1!g31UQ=7mIK}$LL#CZ!=X3@b#)2^ z=yh?i%arz4;wRureB1J7=br}hYqh>_5CBbj6C_;&732rxkIC%ecY!11LK7eW66%e) zUG9u*m(;C%2dI2xO52{@^1^@}(qUl-;@_2uiN!bFA7giSm-B1!?94u}=}Q8+JPsr} z4dD3rLjA~OlI6anGiPHQp5aduW?ZYiWgZ(8Q0Z=vmXIz9 zY3UZ}mTpF*rMp28LFsN7x=Xr;?xDM8Up&wEKKK2-@BQxm@Afa4AI@BJp66QUienwe zM1K4L!0C0i8Y9aRU0L~N1}GWL4)yn=-Q1Tw`Nz#$mItnc}X%wg5uEO&N|{ zRPx8ce(&DB`$UJCO(>@%7CpkVbaZs|;K5bM1%N?%yQl1U|NPv@!4EN$)f~kmO60K# zOfsQDQ*Y;mVR#_jBYQBAkxG3UKqyEGD8WU&LOtuC0g64NLA6fe)pK_b z$b(&=xcmR}a}oMJESUd`hQOD*&8B8%Osw42Mq()1tGHj5HjA!ey65;(-d_VCgueT` z8#Pxz^^6{n1ZzYm;Zr^J7XS}ZjQ*3af3OaAkXs2d*XM%clM^)za2h~~KHpMR=7wYL zg;cZXQDD8;s0D~0FoW_CXC)B$crZZYrt z)LS7P@$~Z%`U^li>Y*~$I*Nxjb*qx65MKlH(E$wFXwJreX6&DR!uK+ee;kUTf(kSMXAjkcO)Yz@8|DQ+q$@hi_c2S*ZSDB5tQ!$^Zme`L0vb8mP5cZZ%ijlH+bo7Nw@Wb(AbU?QG*h;2C%s ze)CK6-;9LZ{y--ankV)v1q{D==_Bbs`_#h_ksgqLQra58Yn+dZii#@a9GHwG+oCZn zqNwwjqR{nVF@v@wo`v{CLrtx>prqOId>t@G?69}e|8NmLxQ&n4pk#Is8XDS5zu;hy zf&xxqf$teN?_*sUzJZDk;0Vtc6aSZ!2u$WsfZIF|r^}360-MfIg|5VYMj6z(2`ciiIlT`RQfvuE~+=*>T`IEdEw`|v09R^(R%1PprhPN=kKlX~(Wf!ek)_D7^luj3H%I3FNC zF8981sc;G$2Y599(V>8;AIheAa>+P3#TD8(=EO+&W{0_{w&g|E)1`*hH+8Z9i-CrU zi~tg-JM_E1Gru^y=rxQ3|I3vkNh#u68ZAeRT1e~|hLlejO&ocWzZz-@S<|{zJzZeDKzhKROuh^1{%0e9 zaB(5HK#bI($krhB&sPZWfX+Y|rHMyE`u~ST@qOh?vi8@Scp?E=TLKUUJx{nC0lwrA zCemh_W5m)JP~xi+;P)8RkNK}q?~OAM$E98qm?HkY7)T0BfXjVPjPBO@8c3eW*HE_- zk=#TdML&2i3Yh6bM*Z)w>kGh*4g@#Xpd;S@v*(&1Rdw|b#Fd9jjHqdY$mBRH86tnJ zj_+qWARe3_CZALM*P4!)BQL#m1EvWj3nE_vd*v_mcpmq&-S@w?O@tR0h~{}S1*?IC z2KdkxGb9=s8V*1ZW2VX~F()sNiS@hvYFDoxmXNtlE~(?lIk_wF#nL8_ood;;XmkGl zP7j6>VHR%l@5=dMXbYh5ur>v~uX?Rr+4DOMxB~fYba==g`NvQcVtkBF6i6ADcLm&0i6m`k&gE65Yd5Tv-;y0ofs`spT0@?7XI;J`S^yx;~AF9_oeL zL_T%c1d`_QBpWbic6K(B)|-CH$C;p8K-u6o4d$eVlK6nC7og$_(2i=TPSnghgm!dv zj8CCE3s6ysFM1vb(twB3`85FXPl3KE{168R2cWE@*w@z=rx}x$_WH6C$dlRgu?qOa zjs!A*n`cQcH8YbH&;{IS1lCFB(Zx4H~8I2vth0%PVnQCOoVO*7u`85MycnF<{4Jt zf?o&zbLbvgrpS8a{)wW>%F#={7+6w(7S3p~9>0u?jA4=_y&i)#8tSE}2!I%Q(OO6i zW<#p0t1E{fd@35Pit8jFwEi6D7QWSBApqsY#FFOg_jig77mJ5C z2Y0r2l1GYPt=3lDcm9}lc&JK6(l$y2mtu)8LLWdS3)&46Su!ylzciU#L`n=Ga%(!lCTS4?7t zbi}oz{?hu^?!^qQ!VvTNtG_Oq_yCLo!5@fl0M@OCOjVALxEYA0iuV>)IlhDXB;M_X*kflw08c@l5y6k#L zDT%KGEc$wOC`$}r?=$5Vj6k&?tAG`%LotVG+?&yevz-j4YQJ$wbPU1(#0Ok@s_&9V zi{-8AcI*4+UEH@LiPpM{8mOU_y3hL0mWtQ+c7O-$Q}3 zTR_VgV3n5wa)hG%FHzXi?aoa=Wl|-sRe~CEJq1;Ld01b6d)&XE9)y7CR9h<>rh(6Z z^5u`lBes1a{agzsAhvr*18f%EH`5u@g#y>>op-63ndJil#i%=6u~?UZZe+=|t$b)H zprM-N-=-bJ72eKx6S4NgvP8~7t9eGK;|?Vxw+Z2AeT`roQHirnb$uyXmZJ2p8k=7l|gic)Kor6@i-S<{%%)OsUR>(>As1L=M{& zdEwpN1lHPiI`{JO+rZLBXQ*zSY3MDCbyNENCN(FS`twk%z9!kp0&hk6a#vzlYz7VV zibDS9m7%n7)i|X5`1xA13DLv`Q{bb^h3lf@%Y+p6TjV>o9fKMsJ<_{%#T>o3Cb!bh zSCPl3c(TTZzx%xf1r3bPxUbqb(vO4YN)qYCscp>L5d_TEqLr9AqEYtDDt1%r%1;fg z;j>i=@~sG2&<>ENI83N%BzJ>{3i_SSFgrBATnAwIw*v4F#xk4=G$W*MKsTC!RakFY z$F7M6Xi)Fe2TiZYZ?Q@+1sj(>fHL@5NND{;8;%4Wx!imxZt=5|C)ffhgunujSn9=s5o%pWq6FBp#By>fLWb%wT}W;Ja! zOpyBnElQ{Tx}i3{ot7LWZ8-@cU8*FBXJm4gekUJa`W3Y;0KJJE05qb|?YxjQf%)tvP$}Kuc~G5#v0l%Dt5+=f{GZ+wS?G<~ry{rcw)oozYMx{YOpH(LezShsb{h8K z>QjLDn>riaICO%zt??>X;c44%em{&-`zy=fIaZt8<(@EXt?nDL1Xt9NC~3luY#;F#?v9?}Ip3FV)j$`;?|B*| ztt@R#GMjw3Fy4+HmpR5v==}zuOLA_1d1w@j6IOkg%O{1R6AL`cgwM?4>HDweP@vMS# zd<N%Bc-q9OK&;8Y&Fj0ap*42>*utkHMo!(*{JwqOPDSQEjG26RCDzTWgp zmpy*t*q*>Rd0Z%Xn zuw#;t@`~DG{*0o{>A5Yjkj5D?2*|7>dv8yv?F* z+{%+Ff|3EWHs*PmW`N!xu($%V?)tyI=I#I5`{Ug-OJ7xZ6 zhpv3tE#9lv(y`^K*shx^SOa{I8cAyd)e01TV>J4R7i; zGgKb5RIic61o=64f~0?7m{15f0i_g6y!!)6IY3P{iQNd90t!02kR+B6o#n**L>!2A zII%R58_;($EDY<7#m~wHmoB|T0g|qd4IYD8z##myIt&=5#8t+*e5Reo>z{{e4DXLB;QmuA{t7MD=0dD#yx7Me4Nzf+p9X*fj zpZRj2$V;2RGMb~up21b18JA5#^CG;J;l3t-AO_+}dpr|Mgl0~=ckrdRt?GPk}`pnkl@&?<45%4;?3159|eQ*6OJ%~); z5n7m%8U(V9<9SE1A;~Iyzm=y_?$;ZCx5A96(^)U@3!*70)r?trg3E|S@hH}`wxZ5)v+qG=h{SgM4qRKw`->^ChNMIA*1+Ff zCDY>HQmTG=#h9A`(wsK4mD=w_qMkf45IC>8py?o(s-DXK6+z(Z$m$97- z_T403!A8NQ*B;_mhdu2mNXMOc2D-ApCeK!W7ON4DpS7ieGcph7D?F%oyzbNRuM1M9JlX>!3dX_(p|*XW1bP1nyt^zbfU)h~ z>2fn8fo%LP9yOXexyA7aqUYV>qW@w2X_9-4b8BxC9V?O)uSZM9>KIH{ktZR0p=#z! zOPO7Fx~II#Y}!pPRNO^%v{lx1lynjxEVlN!S+59aX>73gi+Fs>n2bbG7Z`aqD^P^^ z+^Kx!AyuD$AF(gPaW+4@Xo<~iNt-GCt;DiZMNwfEvnPF!*=Du!Y9&#Wc~&VKcDrQZys zSL96%Mfzzd5V7J0ooQ_INz`zSHRv40K^tzT5kRFyE##H@^7rCX4DSJFBuu?b%-(?7 z51Gpi{=E!`#~8~wAh<*@gFm^OuU4nKl~yyrAyq=x(1Ngc+qGmL)vl)7)uwmoeqVvq->+Ag8lgnAaL*HFD9X^yR8XY_kcN2B?AsG*^8a`*A4UuT}hyJzvS zRapPmMIuISjzrNGdh`TCc<7_sTqqXl^=YJ1qjI1tHZw2sDX;q3ge?!QiMRV_Vne0F z4=sKSq`FO2pZoqLry6UJ*lPwO;b;rPk`?pfpIEQjbr?KcIT>=sWUc0C`4cMD%Yh_3D5iOx01mP%G?7i9qx9{_cAhN)o0%$`5=w#KgtW>Lky}7 z#axZJQdk5_9-1~6@My|QH_MFUl7hw{QV(hQ=f`WYij&8|`Ai1lB#v~&?o^ASa{h_? z+3!M;7h^BULXTdZC53{~urr?9wTUF1&$k(qfFs#(%UN^j#(x#)UE>SPk|(V2_)YAr zya+xna^~8o=a~xFr$g599$KiHAT+g0d`22@Nsdf1g)Mf1ogLvAK4RpCY&mA6to@GH zyRi7DZHZ8gi^Unc>*hlG)PtI;BcP^QqnKE-i-An1NBg%%2Y4U(D=k>et1VK{4egUa zI#7wCPq_T^4D0d0^I-cQhum{>?9pv^Icd!BpiLywH@brO0&qy}dgdD;eN=yo^}KMl zRo%M1nCAR~f+_yCP$?$?sUecN&gvW41d=G2P`ye3{TwZ*O#yOsGq?8nH`#LeERIbV zUPoEs4)|jj>vXRv4z}A}lfWj<)tx8WIIp(_T|Tw^U|?ESXo7I$9+T@}^DlLCmM(;j z%F^MZjvR8A1RbTZt{jCS%1;(rb%o363djN zYuY+Vh8SUR$5oK{idO7MjoiP~AA!I(8c8>_7Qk=(s@Ey%>VE12>F-7`@}G1RjIkJq z!~K$;MI4U1q$jmkDKz?@jgwa!w&6C;1G#VBbH%QHT@rQ7Xw0*nQe(ybvx~;>q_+u` z4f}`Xs4L`hp<$LkJQ^r?w~zk@3ibU=4SwMZ&LX`YWZMBGv^~DJM=B01 zO8c_$CMJ|*_-0hUGVHwfj}FrD35NVIx?qa7TTh{+0dK4)_UFlxU^OKw?wY%ePGA-d z3^Bw?WiA#S8-}$JnN}v2QLUm6N2HXFWoQ3zST{KL_$EZYeY<{OM_MAshX)zR=!+#TkkrTDX9tJ|bELF(Z>KkzZ^mUEcMN{$qVmB?i;-h1XM#?b%n zK1nCL>#qGsYVsf^0-n95;aJ?2YjM?uOyjY!REvpOqIUA}tS?aSW>8NLJyN2;WPDXG zxYB)6s2&uyJ>y<}8{DqaD4W-U>Yo7!sXjhXwb3LKa4SubS5w@|YR7O+$u0Mf3Pcq; zY_%?dK@d$TrH?6z#UzWe?wZdDR_C{sG~}N7B48fG5)B;ew8Y4=VXW3?BJJD~a=~Hy z=rEHcRwLXS?dDgM6x=iJ%sbq5R*psoQosX!Luu{pdNVva@u)8qmc$vo@_RFo%xy}))Rf%?yk#g#&KXdnZu{> zWT32mc+T}j|H=SkmHTFV*>MmoY%FMCJ$EqT@%ZWs3&_15!80X=@_eVEqK0iGqF zH9Q6dyRl6jP&WQvdYU^|crsDr|0Ph%1)#Gk5DVKJ&SV8j-vKt<=oDY<%?!aSMbBEF z1u7}|chxHl__FVli?ljvS1m7-rFYLA7eSRrp6%9p{v!O8%s=*;=;YRl0(}#gva~=t z7^YhLjQmiPerokX^fQWqSBw5Z%{hiUc=_=Y6y{??os-T3eqFR;+`%OiRsjv=u6PZ7 zi*M(AnKheFoh=`9G;tb=NXveqWYeL0J7RdB$Hx}O%Kp__GynF0M${Hvks=O99(sj@ z+eNq%LID9}{bygN|wIBc40So8YSjZKAG-HLZDJJB+ z?Z|||yndr^ZwmC+=#fG$T0`ZD^rgA{w|n0mLNK!jYVB7CWCRJbh2lc&A5j2Gs&za0 z1#+x5a^&U4y*O&j{!F{IB@eLH<3;h>LwF5rze<`H&_kn%GZf%K2kQFIVs*DrmBEBz z$@WLShVx>mlE)8|1f-}Jw z6c2sz-kk|9n1L0flr-!FOBB5Ntj%+OHBvaCpQSsaFbX1M%^lQvzjkX8aU={Meda+Xfg|v} z&9B4K&22nakpHwADl4!A17zs#U#&Xct4KlKGxkflz{-)w7CkeuKU#+SU4AHF7nj{t|?2`^D63oS?y|4YL)7Y4yMQ=csAC)P1 zmn*lOnmvjrrBj)e7}qsmNVkksPEuI|m*Ju-_YOV5d1}+^=tgi}k&H}}FFz>gb+YJG z=j0Ji@7rjO_z^lqAAQ_qd?TY2#S-<*js`9m>~JPQUI`*JLTju z*PMVAX&Sa3l$=FT+H^W9n-BNc6P3#eyh|yn+W(jau@bgt5xPATpU^*j!fN&r98B>@ zTTq)~L*MDoyZ6DJS6`(=vD(I$?<~)F13rWP3|fMf?QQjW8msJ!MCCeAoVW2>rTtJH z3R#&8;b&)!?L_#WzP~~)f`9E1aNbefWvQ|)nj%uDdcK1BH~%7rY?*;hRHou4(h|ve zyEHI7tg#Dl0a=ES&4TRz2-6oW3x-d3RMh96o;tN&wM4orqGL(+h!jP`jxi3JYM@#)a2?5D z{1po8_95@Ci{d&QY^r=HB)&`hu7Kd_j$6lEX76eAlb>caLk_=gOZRxAXbg(ySe{N~ z_>D+$!1YzDiWc*f!|{J1{CVB!3K&_Na4|~-1CpyCA~HPY zG7_s{uLfaGsrb-0dMlP>WFP(C86C&F)2ttlq>$iD?1&R^{wg6BbkXI83y~YxE*g2T zEqdM81%h{Gyiv}sEIrE6(xF-U63Zs|jh7G8Z0mml5LVinqt3f*s@6JFXZE{3yY{ZT zmxynu(o6Ozt;owomm=hC{k(4BhG`-;mj+=6D?sOW!W*VzuaxK)HLhb@_b%Kq7;JcJ zFv5Br^$gHl9ZGvUcKUwI{p{bGs~V*Dc_KXlhQboxv8g2K|ET44kM_0J!)zB4kCic# zvV&>kUU%4{(7Yp-+>+ie)pV`(fKN}0hoN6Ey#-?a8ufT*) zxIYN5@jId z0O3_o$<*evDSrO}G?v=$lkR`6yw-D09A*B3e#nQ5aIR*xFm&M=;)NT|%*J~p;2 z*A(#(33`6a@w)6ncbv0bFQe1wKY%%-j~sXiWYzWPM4l(!+}F#7_}B?VQ99Z=VZs~- zPiA#e*Ygz3>h`&7VE37-b=w}EWxaB1ozDeimjG@8sz~~*HDIixYVhu1%woRI(Izrr zcj$Cax9*yZl?h91N=Wx5Oq4XmF&Q0lET1QiLV6XjT$EUNZZlskYYVy8o4cKqi;N_D zeSt8p*73EOx<}WlvS=_SicP4rT6q8Lbj#HL_&g3{&ZYmIozL%Y+Fo-nIlOPpE2dZD z>5SW+MCR9%5s!F`@=Q>perUk2A9a(J)X+n^Iy%?TJ&47E@xo2OK}xLp)mnlzy1O-K zcdqiQ+uS?t2%KQqU$`q#Je(Ul9!oP%Tf6ZhMfD{0WDWYHGDn2NEH?R6#q^w??%w{8 zPkMn#+(cl6gP2=Z{xHM4BQkcDCDj=PCG>6@Tn-kcZ?#zVYMNk#M1% zW)DvvuXTT~V$<*#d%-T7zuXmw1__^|+Y;j-->_(~9Fqc7cx!3-3z?r=e_^L6NFFpN zY7Qzo0xfwhiDK%ffo~7NdWq6ojF^-0)khxK*IXDxDb&IwbCUXcaD1K58*$g|SNrug z!5y7@F=mT>@s-CZ_D@*h3mzS>m?%GwW8en?O5g_Br z3C2q#UCbvgi3ecCARp01EI%Lgu&8a zE}iZdH;l1Z?v^ozk-!5HHvcCe$Bbad#bCX&GSMx@`|cYna4zAf7Xz8T*`=FRD<8r< zj}?iD5(K6Uk7Nz>Y${p&)trV`iT$Zk*l7B?trw4b02l`UFGPRVdvbG9e|7R}c}`@y z+e6!5N8byb9To&1yYY!o`%8uJD~f&d+rQ#ki~jZvHzq@wF{qD`CfA5bMt7bMaod36kx zhZ97epkuWdbt_8G{hI8`p=DoTDbn+q@}@tSl`@D?lVV!G&e3$gu*0gQMZK)v7tf&} zcar~>7y)m>(?R+}?^YpnK5bO>&11b?OYOn(G z*H@p26{3c^s_Su4TamK5JqAPrUuK2_Y_i0*$j!I50Rk5j4iz&d@oKqj!Rf;CGEoI) zX=bFtMCuUu1LN$ooYrEebTR^K)kqzsr}-L9HvBQ8-s_)NZylz# z?j70-8LBy7G*H_)q~fO@Y^2(q*Bam_Vvvpl7*gLQU`iz!U-r%T|M-;q7}P1wDQURN zOH^g%&Q{53{HYAXEUDC%*E=--W7DIw?K9h_J78Wkkrpngq2L2cOgF`;z!c z=A$-(Wf||CaRvmM5h}3U@?RgBDq;Rq+N6CPpZ;%b?E@sz35odi&p**YW&x8mE9hCM z!;U@bz$PIFK5G2sPKJ&yn;?d?tnlapX&(1)<2OK|Y)ce>-z*CLZ}chfHixgivVCDk z1;m=@SS?OfTAs_0n0lMA-@c+T8!_^1pw0^X>u2xT0l} z`5!y@??1GNBN6+Jh%3pdi+|6jFERDAQb7Ku$j7~UIq0y`hVf4y?mI#wg4H%6$YcHg z^2radRg8$Fm;ddF{`ys9>j8dPzZuB?I^!urm%58@I(j^}Gt2lW>sRU*MNkTJ2I!(EW z#Aib6+^YN19Vz#o%RiMqjww5>Hasx=TtUMMnHGMe&UF-;l1h>KPUnPkM)eOWVuGU$pvsCifb{?m`M_L5Xy;~%#&<~lv z^J9L5Ccf`%vs)V|TdnHjQ`4lrB!-pBVAj~uDB}%9ac?R{n_|CUwrmA*8_*-)DX2CJ zLbpuqJcEz9Vs*CH>SA%)oYFAB9t!|3guMYKJF>$LJoVJwv)_Z;c86xGE#Uh~esF_R zIF9?_vecT0WN!ZIhLu@=C#P9`5o;c`!TB0orF(U@v+sMHkEM6#5SJt@pPGa6!w{Um zj~h|ex9YHS$}neC%ul5w`Cj6r9#Lg84}I4ckx)?h!viz6y6A^4z;2IA`*}?>U?-h! z>KjQQnM+{;jOC`my0|Z#@3k>6%&C zy}s4o*Q#6K9{fp?y|xNlu=FgRoz)Zd;}{ZO z*Gc`nl7bl|AuTV!?v&5d855YYyBl7D$P5m{1ftIr(${zWPVxllVo@TdQmgxGCcUXy z@w~Dk;0pTEz9R`A#^$fKQ%a17c7*eXn3K;^!uGiab|Z=hrvV73v94a7#w6*qgzt#e zx7OaJ{wwH76C!#Tt0YEe)wGwBM}RObkS9y~>JD|kcYu{SPH_rCBU_=~7x;}N#&siD z#qWHvQ5uK8iyw|Q{tQ@c%3g;?ilyO$;o2npy0JsT#*J_NYwSGYE?)AAV`{r;aNe?^Bw?F+2;2hrO2OG z^LknZ7*(32q@br{?R!99BS$=HJePE_w0m{g6SW^siqZfEU+&dm&W@iG!}7j|pfJ;s6PnbltT zC|(l=g9g$L920#L>Bb~k({Np&fVeFQsdbteFh>Q1Lal!7XtJOp$BT>zfD{Rr9RQqe zEM@zXr-m-G5yWpPJ3Bi+03SEq2@_Vcl>UjyyTKG?4UUINhr_QTyFCdU`4B}`2V`0cTbXdF z&!4)lpSJb3qwuOVT2r-!lOP#>phELE@V*PTL~BGbQ%KzzFAki=pUMNU9waE=NLEQd zc^mhEw_#OS>OgbA9GS11_PNl*kj??%omT}bMAmv32025owo8fDMx!|gZ61iQ#uXn? zbWZ8J*WrLPinW;fH40-2SQ~Qg!{kJf3?&{=K8?tZj*c&Lfr-Zcku33_dJQRT4e+@d zSzrzf8wSxG9UJ>;06j#9wOV&3MNumSme0y%w9JG*c^bF=hSAqd=w31(7!qy$-OG`0 zfTh)7l({#+7*&}@8DcZ`{+hPC*913ERu{#y6{zXlmA|p6Nf}?g{%y4Oxs!dSkyWLd zz{D7zqE;~c^YXGFUw`MS)bu%1-q!a=w2@~N2DPQ zP4f?3L6gEUpeqDu20ek5^~NpuDotW}G{Ad7oEZHY!-0`g*ZSw~w*k zql1=Xe?Tj^ijU0&gB%oE^b!S9c&6`q9zZ25u==z*j zOFqvA$uR0`ALjxK*QG|qnlSEm;TNxSBW$xIab-X3v6?bVqZ1moo9|qB8YUkf8klBK zvJ~8$v%VkY9W+W)CQnBY^F}E!4?X7c-2OOo{oogE_#Su8B0F!9&4npR?9CSq1^0|K zGNzb_XgCc6qv$j0bLGt{XXC+(K5g6Y*9ZM)M8PL^a5P%YkxkaYTAx+z?q9nXD_NY> zZ)saoDknWW3=>{2R_m7cJJ76tuCBDfHt|C6$-*u(9I}q?+9l*&s_9&z19P`kd~b|e zj4fca+T1yLy$OvZ<Z*~tZq-tg~eE6Wy z3q{E86#US6yZ`J!8}HuCT-K7TM1#nB=0!8a_bcw+&1PS^)q0S(RnGTp>E~fLuA!!b z6L$?YM~I7C-`JlzbejmM)rEE3!9}t90@P+Sd{n6KXigVF+v1zrJ*~L34k@Unu5o;gp)79LL67G&O({L&TcKbL{o}(x7t{Rm=@mDD(P25rX2ix^lj0T)t zneM9%5>un&nE_f;jnv+dMR&z_HO20qZRW~NCzm?ZyTsqG+giZNH)@MZvJ(D8N08Nv zQ`Jx2h@|VsFhFK+V&?HV_3j%^RIZjUF(+R8TMY7$j+0&AXO?F%iov*QQe z9;AHX@gDOnIxaadNQmrfc4fKwUS^>Rxf*(Ud}DFZ_ucj`EmFgdSwV+IvC!v_H8dGC zTbY%)PG2#jQnP!>MJuH1*O{VJ}P@ zX}MR0ZXv;!!wfU&Yk*G0Ihokzlevt18LN3dYQ?pJJ6K<4-ko-!GnuMmp$A6xIBsZ$ zt1asy4}Q(ak!h*k5%<)uWZn7FqXyWv_$G|CDb{oR z{i+>8`FqKf9r+M+Un$fvrQcK7hxWq8TkHU*EDb7^i;xV=;q&y|^*@Me047w zx%oM*$!YuB@nRtECU4%PzvS{z^yC)!#(4=)dNNXN+gDk$Q8W%lUGLquzTPZ6hjS4$ z>QrP18#F`jeIO&+kV}ex+m#g2ExSPpLcmBYX5}~qM%pQ5If)j2r^7*v7%sHgHS!8t z2$`64$|&RsILM^CD`b){J;+S@eccPEknR? z(Uk?Ccj5(T%Gfrln{)AlN&1v$8UuL0XRc_}U~yl!P9^QB7^GR)w-)jA`oe5#DBa}r zaCs-d-KDBs#in*%93VJ)xEkAnsyb&o;5Fud#Fn%`SOEBCf|17#!);8N_G#M}BNJZ? zIr4(<8&cbCMK>nzECOze4e(_4rxlK|NTMMJ0|{bAuRjEvt8l}kc5^dz3f|RC=sSW> zGLoPlvZ=ItR-dTQFmi}h8^7$6)p8rfad#M0NM?8Va=No4Kx7}lzKU;(UOmebV3NQ1 zrwoo9n^4PXb+h>s9?KjQ+1u`?5`HcvD>{SiZqom_SHN3RzlT09naH)L6IYV=<-|&w zse&`aKs9&t!tRf*B))Tlwq1K_IZJ>3E6}hNF2iq`GtbADb3O~Nc2h?c?44_rH~;iU z*jP0tb|`ZXZGvb@JB*^sYE4>@MTe{@5QpZlea6E{AFpFc}^fUyW`Y zLlf_0aQK`YcBb~{y^lBJ6_Yp*^rsBJp$G3$b>~O)Pu2CunLlpjw0uW&HKzu3?JM9x z`h!^bd9wx|7>*m^VYL6X^w?Nt=)IPMb*Pu;8+pFF%UprPQQ?nRdFGx$lW;Zfda};= zpZP-8iZ+6pE0pQou=ln)I+wNpO{NM#kB+7mWq-umw%amzNEV{R#ETkCAw`Q3kDI5^ zlO6Um{{Tk3K;0{RuW>&CFR2oE3!T3VkLA7WUz>>;%?c&vQ)kIEWsbwssK2m1&Cxsi z=}Vv6DH^<^veGSs*M8zO-1?-v)V!|#UWnmFbe6@23ekA1Xe+4Y4TlQ<%g#0`5Yo9` zT9xDQt6j@9C|!flhuvGzv}^cI_Y1nXfD;&9Zr=4h^Pmm`Q#c;AU4mCpGbB>~tXuoa z`A)Mr@jMv^<=}m-ZoTUkBT6Jm%tbj=)nt`_*3O32{o~|tp%zm0{_e#T>>v_)d)oxL z)`3FlS~7PLeq5RTWUj(?bN*Huw~_FBk)coX_;1>HT4@+M8*lil^AR2VU zk)r}xMJUEwGtSax#+Ss|&^fNRu0s+pR`l5naA;kAUD;@p1 z$YPUP*n|vgXBmtFH$-&A;|R96%LQ;g(|p7T3E;h4JR37v8SybKFDu~gThA;}nqzV` zn*j(6CpfS61)a5XYpj@|P}^MU?zfGbjEbr#7fK<*NH>Z#3#VXk}zNMXwAuF|YE?lW!LfXQlTvPgd)j9d`MfKcBefZZ3JJm&6;$ zL&wtaR~KXW*M8d>#3eo#!V7+bXJ???|78EinL*0RQtXrcL>*c^vu~ey)(jXRch?MR z_fQ9+sN}i4o}9;3PdzIC!0y{`j$9cW*P97kQz%EBX*7CZuLNoA;=QO2;#s11T?-RV zf@&`|iX!88k924a=xTbLH})?yyjf%?ZItIA8OL9Wy0epOJ)Rn-mJGVjT3itI!xBwW zn{YvY5QwR}yyF4_*I>-i)*@?%B%i?vPkV@$PMt_G$cp;Ai=wdq}xOGXrKb+a8tzX_sRt(7%EDXdih}AUKn& zyzAwN1e7(jtU?ZY8dk|%3HkR|yf^#PLw%SU6khfK%q&bi3HmQbZX#{{OJD{NponvP za&f{3THPaY^X=bqo4B)p@a7oIY);YhtJ`GZg_CiM)d3y+uD6f8oP z0Qp#*+r4?(R&3upTH&5Xh?IK?5_=i;5v!fZzJFP7v?!heOv;Yjc1-BYR?>!z8aq9C zRij7_6>eTc5UyO9Sxa^Iclt@HQUgXq=`I9+Qdxk=jTJtGg6C4d{R7dP#QMpdgtCQ zXAj<{)RF8t&GH_2oe=V8(7Tuk^foXF4HRxC`wB;5HMZu>`uFJjdySmq5Ji;`%H<4Tw zFwPV1ssp+}^9fCt&MmF{p&%B|mQ}`v^s!b7Ov1M@{Jf0=k`iYcfRL%oHw7h=_4K!t zLFkcCky#<50a48l71a)N{;9y@-mpz027eT*cb7H^(P5y`&8e5m+8E5*7S0P8Rx@CJ zG8^tttuv9pxCx6%VZSa6K+ZQlvR5`Zuakk(s)*-hJuw?p7Ts^A;{rlvn+=uV!y%3G?PrylJ z%8y7HB!!uU)fH>(XSyfuW!{8e>vDJnE*AOFq1#zCg1HKR&GNJTpx1H7JhwT(e@|KR z|FHI!QE@d}*Jwfr5`qSICwK_%8VK(05Zpbu2Z!JZ?(Q126A13^ZjHM((06m*_nhy3 zCwcC#JH{S8nx=d2sJcR3I^BJUW@BK)kI{P)G$tbqNh-&)q%XL~oI%y$WfH8#uWT!sk3nlFRL z*~#>@@Yizw2X}PQ@)-1)Lgl!onthpO+G&}(gRF|3bNq*vns7Bkd67zs?;O7{_3PqO zfk_LB$ZW(qc1{tGeO5bDjNxLG-9ys^&#s&7`tWZ4vK$W`)zod?{1L_y_XRLuf!}Yt zOx-0f5mI>!Nf#;y_!g4Thb$|Yg9d+TXeGZSe1DJ?HKPPY^W0Hhvz7J> zMhc^+7Gy)wf^^EIdnlc7I=+-A`4(+IFO!f7zx>*ifxqJufXNy=5MDT=FLsVSPBGT5 zr~9c8tkFg%Q5yYyzko5%pWPo;l?o=c9t?j>{)HzWj(qx{QS^quU|KhZ~>Wu*CRrcb|ytL{9DJz zmx5KP6bvdesoH8zg1@{wZ3orU8!GY(4=YPw+rcDv4QC@QB|z>3 zIEd6L9TD6%C#EyRhaQ=FMi^`?wiX|-s4Ug>iZ||dEo7|U=e+AmyC~hX9~vb(J+yoz zfxUygDS~7kkv#1RzXG-(eLjfc?9~fG1~7JXT@PlngMZhy=Ih*f*r1oojdH`}gU5F8zE+`w`=tZX^#wiwzZZaR|n>N+ppFzxLh_qFI_P z@#gnJub_!M32280zl@WY7tUkeFQ$XO-2X@Y$EZ++=Ew4fldZez?Q4^zrOTObD}qb5 zb`X*>2+ce%hf7cj0^=RHv9UYxajPSw41}ZfT4Si(?oR!!MoJBrb+7p;;MN{Q!rqlFE_nvVaIO#qIr{DS%frNjLe?BL9$h?v4vsn!GoAGfFP0v)uR)v-| zR*3z%T?NQwLG2aw=A2IA2Ol3a4f{{&2m;6kfl7CX0vRcsJ1Z0K33zlx&(8A>{mTRi zZ?*A)jUj<9j{)A$G`m^pWuX^$_C;QuPOs1^3#N6|l$B%~ zqFu1G-Zq)P0u36QKbipmQ!)w9ij|z4OwaNTIE;@Ngup2$SSldOb z(FE^1?ryzRXN-6Ir{aUfM+38JUuaxvj2C%Yu9_AKJA+xa4J~WV4MttvVdfsE%Pl+9 z2awkiwt1iX9_zQy45qD#k>+so4G^j+YO*FJEQgqMIY1tsil!NQzH?OWXEBK*bPi~! zzB5$%l({V^$v0rG+FlXkF9WGQ_iar>Se`K7@+>|ZErHf}+|1LGe`aL(LNZ{@?5b{G z);!v8+VStN%|05WffSm2m)TA&@g|IaSPw5!^CDeKZLbl|>9mVR(S)Ag-L9!B)zyhT zzBx~b|B16Q?2xGstP`C@_RTo);T)L3LZy@FKk%w?U89f76bU zQ)3?|<6jIzow1kzvDoVxH5vW|vYShM-@aXk^`M*5zN2lRC?_`@S1T z3*0Uwn~H0`jTeUj1W@_=R36jDbw{^Ru+em}nld$vv!=A?SsDfw?b6=K)p-JvND3zo zZ};7v^2qCMcPjQ}e@WY*--~-!*^jni?5M-8hjXgB$E#eP)niOCE}1Ae#8@)`K19Kz z=O@yI%ulV8V`?foW$I1V1~49jo&6Iutrf*hECK}_RzFIXL$;olDKF|apa~TN9()S> zNAq^&&@@x_LznWIB?3=3i0*mFhO47Y&fGy8JdqyZcJyB21vInm+^;fc@bU3E#<=G( zB9VwBnDnDvxYeM*Q(1qT|$`b)I zThpV(lvM3FV3p;p>HBxHjJtHl<23FO?yczB170IraV^iju@);DDp+G5w53aPHI{54I65=6V4;4FIPc;ps9Rq1?6tBi4ik3x&&U*+ zlmnI&F1o6Ne!oH@bq;eMnjZK4=G9$`$1@G0YQDt$TLHPyTCeRmiaUQE;h*TRGEfXR zF)PzO21dsGb)zWM7j|}beG=K<588}op2^FfX_Z7Fm{=7yF;%>QfoTg9s+Mx^_JO&~ z&#Os!bUO)3;F}vt>_!>m(M~=$b!?%;<$J+fh!A*@j= zd(!l7Jq@L=;2m;edT~~ZfN!X+hC3=hbOPk;8Ui0QF2gB{22ci-XOg-Ul*JKt$s2|y zZ!CWyspO~fDzot3>+|kq8d9A{J!4DbV1{J$TlOYKfEh~n>Y2$}m+q$BJ~=DEGM>rA zbwfWHQdKj`UbOHsL`B;Ush%qRDz6&K!06S@2Z zE#7<0*FybNoK#30AGV&U6xAeS*uQ$YriuQ*%F3#ICedR@@Z~ig`3H`pd>NPK!zO#C zrr&sUe9rGRtA4rI>!P87ZD2QP>lcr6o4&jX*S{iEBgbTxLZA_})1^7UGPATWQ*C3j zwo0(<{*2{J7FV_C8~u|I$8b^IP%A`rwO6hTW@OT$5T<0M41YhjxNfm_Cr_7(eZE;{ zYs=a5YDH9oMP5=aDFxy&72_-=mKMU5Ayk&xU5EL7`117P``oEQmu`E z;b#-vo@&G25!9N$uXcWODCqLBOC~w;a%0^}5e>IGcFqnY9_iNZlX;w!7J`Q^ zNk(f0+r?)p+mpX|bkRZ%+t!O;WjQu?C-+E?A7kvE-dwA59M)&O_=U*vFYPw}AMIui%%9&k)-yLG9ox<5%dZFySkdJthq!rN z;dpE=?1VL5=C?M8NRC5w_qL8C3HejDK3OEyMef}QL?7H#FqSZ8cX-G;Zzzx~t@IAt zKYUDYI0pfo#c$cggZAk@Bob*n_t%s8Nn3!M$>S2fx3@CwgJIVI-tCQrt)n-!C(FKIGqpC*&4s+5r_Y=xn_h#ksDvfopsb`GY z#6IMG9@**RmNGl4(jLn;cCxaCg!u>pec2Jmv7m^FNMBJ>d`D##19!ga#a6-688tGN z&jWP~af$Vgnq~j+$#o8?APJSOULO-fwr*5Pai$`50qKDIoLvlqAmIo_W93Y&hs+q+ zbLZt7MMvzwEdvMCkHiP$FP$}&RX+H7LbX%SNPzS9C<B%-0WRe#R``h*2IY=jbi zBj(sQkuC_7>7baqD`Sj&I3k;0dG4FkJz{rf_By?+>Z>|-6j$al{jG4#IAmdaXE(Zr zz`Q8bV}5pAY=QN9R8X!mp=S6TS0erkWnULzjhE>PfeMY+Zd44OsBHOA-Nq)d$NHqF zlD4%)BB7mmei9~Y(nqJ%tmGiURw-(;Xk6VlK`De*D!+B(e+leMD{`gih zOecDKzQrdpEWsXDOEAB~J^@-1fbiz#T-6{0-oK@yi<{uLOqk_>tlNxRx5VR=1A6%?AX1IgQP>z-r%P6{kD*yQ<_ z$+I=qDM^L6EV<+w|0d|QY&M1%l0Sm`I%|8z5?DGfl)_$32|O!TK=Y}ki4y3YX(yYq zTa8Un=8@FbeJ87k<_I;>5AKxFfX7a-T}&HIe*ES5YxHkPit5;nN9 z+3GUsUrs3`OkMUgj?=qm(l6{KE}#mOF6XhIuk1O!>Zq>H1+O8xp~tXaTeI_jeZ-GN zZ?qec@%S2t5%gYG{xkkqXA|dm1a~GHFTqL+l(vnq!>vGp37{gj!NddqXk2p(dWfDM zsh>!v9YN2>b@qS!`XgXnwEh(>cTd^a1i0^D0lYhiYOZa}W3zDX=AK-$`3&DpzUBMu z`mZz@d>;Qtd{6!d)@#f6WE1fC2fq;c9(o{)|<5euE)=2GDV(q=)-v=WkMUmY%fe_a57FGFS9LD9E^uP=Z3 z+CDdC#P>V#&84QKfBBLzi2Z*pQ{t?pPkJ|_71N^>%o{&L(s(*vB#555KTJ2R2Wrq0 zY&fgEe6+BFG!V;sWbTa3ErzpTZ z2tS$DxU?%>ra45qp3*{$J|hxepz~EedNA~v_jdfi@BPsGP}Or5iBNQRr+xf(BEqiu zicSe2?vWrUdI6i}FBC(M;BM*AQblP5fFqM#3C`jKV|n?bE=eF0G%7vJBd5bLt@%+N zIDIX|>U6AP&Om=KmMM&oqAgc-@`iW!9A9+k?DL&5)QT^Rvi7pb;#^{}!(jYoWX}CN zfzEOdOGELOe}8j6z2?;XSyBQb>VO$=ucr+D|Ox2Ya!Ijg1V#mU>`ip zBcqP`9bNIU=dpEXtLk+X9yqG$R%(_%nCzeHW;$~ZNv37z?N;6&c6eGG{8FqtJ5jI8 zUi(^;ie)t*x;-wdT**q-^V%8rJU3^ zgvS7_19M0rMCPK73#bQ}+Ec43=%Uwz+NL>Topyesa$M=)efuc%+Gc3(1H4rX9V(~J z^lXzU!;lW|i_2l*2Mg^x6L%AlV}rN!z?HC!>R=aIU%4co-S;087Y@ z=ppF+Jg*GShx`MA(}Gj=v4GQ^_!TCH!^UKSEwh-@1&_xPJmEMr$72Qp$FFY*V^(esPWwfYOq$Cz-C{_Ty76M;Bqx zbeT^;FO`c#x~E5Xi=D>27)5)TQA2eLjB&M6D^L~WmY>nY6%B_!%)!`sR-1eWui>EZ}r;JMbXrQo-SR8 z9@;ijea35ZKSWX@aEZEfW`M#1*nP2zoz0WBauxzuVUM-GG_E%*6;hN_+V!X;wiRiCBI~l^U>!YO{uhN-*lI}ALl(Wy$-QeuqO;0 z9)j;)D%Wv^q-!2{Kg{!}Y2VIyK(Ok&Wx0P;6}5j zgXsxpvxV7|6OJN_2X|A^Kk}K%#S1LWGNi!x+tMiHg&Po}=hY7ycai#%wk7}kAdM5> zm`uZe8n^*YJmPna`m1 z&3oh0U?rBVb(I2+n$ibtktotp5Mn}uD&9-`>XFxX4|!G=zkbY#UsIsN3O)PRm9-Bm z4#3asgPF;-U^6i|3}e+f4dia!&UBK*>DtQtv5l}@4zOS_wf z?)X1q`LEXthUX8YR4+Umc+H9a-If38(Es~2iw03hcsBlGjN^ZW`(Jl?68Aemd7d}V z0792%&;NdbC1DiMt|-0hkYPxl{r%#XdG@MDG=3C>00;;a%_)xb$N&D_RUX(Z(#c=`$bT0O zAT+Q(@Qnlg9)jGL{~*C<&xrsL?ydfW`)55cKMA>VBWf(*pXB3*0;tNx-r&U_9sjq^ z?{J<*;>>Bcx$wU~`d>5u&!0jefEswXs-FL2e;*?Jq@nmsPZAk@18ccIthIO`bUNQL zFj0NXq@}H0TwX4_7atN5(&a5G{uiNuBc8+&A%SHK^PGnKYuvQhKt@sR4+)$Y;*ZB| zXyy(+R_`nH+EQw2YVvZBuo<%Q@+hrJgz^4%t2eL*C8P{YOa*aq7>I*@&tI4W^kbVx zN4D51hK6K`$;ryf%5Ul$8>MgC+S+KDn4;lOiLDzLTmcz!2|jnwdP7011nUi3yL%Q?4CM zMvpHMh5zB#uU}H$Pd5TD!5*a?0(D!wW!KMIr@Ski6R}c<51on>veMG=N8CO>J}Sz} zqW4A{0LJ+^60$^nn8#l<^Yc3*u0XL{b)%}PYMf(LLqmf!m3%tS2LOmc2~S;J{nhK& zc|dwBiF!~*X>Dzt2LP?dfk1*yKV}z)m@bjO1Ggj;H4qCx(!J%i3+!(^wpB?83=<`C zYpbn)Pya&m=B1deEfc^=HwLh8WRbFQ(S7`Ltb>_ht$i>?1_voMxpDFFr7|)yobN7n z-?Q3c(!R^hBf|wZW6Jq2%hx#u7 zxjYYt#LI5u>_zZy9#Gc*M9Xix$hGcS)c(Zq(Lb;Y^t<5X#QuR{oFgU*D}w<*iO2(* zBfWob2f*&d5x_U}5)1mY8l4VdFB0YjPuvO+Vq)ecurzdd%SlScmbI3amSRZ{R#m+# z=7VX+&Hcjm-!^CO1H%Et`Jwk!{GWQ!!U1X<D-h4?U)~mR26aeO0L%isO2fVJGFj zNJhmV>NpzOGyi32gWsdSE;crnf5(S(2EgOJ-uzvReP@|Topa*S7ihkS+w&ITw!O2T zA6qTsB`oa6{%U~UOY#~o!^2uicy@77hJeHRE2h=m3j;R9q*!qOkgFO2u`G;hdKf=L3lo>AQ!pgd{34c5yWZhSKAh)vdO-B=eHu4Z?Jx?~It zZ?PuR^OD-=C2N6>TGCA??mvF-85*DNuHUpDnmN@{cDTnY=GJ+RqgGWQNN6nAH zTCve$g1Q*_fd_?t|XhDKA;1=S@tYOR;Gt3+CKo~JS*Y;0__@X@)DzPVj<1h`7Z1KH)Hlm(qj&Rv_xFoEG>ZwZq) zb$D@zG8Ex2nf=22${97}B0160dab*I328DZpp25&8T>Wxv++Q)`}y|ng@56cW1cZ~ zhEl8b+88VJeWl@LTJ=&&q&1GwiGG&! zzj}K=7LNc7BXPX&83ltAK~v-q)lD{KY`@l+M7Oe8V`&LuB&2I7fI*qe@VW^KK>or# z;<{^9m)#g|fdRnwU}1%_e9>kbqzTeC*EK6PHx9pPV`!t+1QQ@Zh*gjvOYw=8d@sM3Z%uYg z4+5}4FLm9PT*f7a>37!7_JAq`!Uz3HHQ$=993E79B0GRuZnqPA?yh6{OHEOte_FTH z2erLw`z#vcOKILNK_4X)>dCv73`n0Hx(@5IoopAuhMeZseRotxH(U}=U1YA6Ferq3A%>@{nxfWUad3M zGdJXySPg?tX3cJwm{nYYkZWUr^d`38Y7Zv?>ytHOZ@*Z*J*EqaNC!yUWC=@f_#UX`m;4D-qbZ!Fmn9J-z&+u6)@!)Ii@6-1|C*-yY4!q z1T??-xA#hk5*N-lD-QQaO++v?f2^rUdv6k+7D@F-03gInW^j(Vq4!?Sc>)pfq)u9` zyGj*9-t(X&%jaY@b)`Ff{+Zah8J9SB?+z9`mLbSDJ&b#RQ|*)8Tuqm` z-`C;2tp~t}up$lyViIlcW4*Eaw=@-d+aWTt=-b6(@TkNIcR$qv(;AD5!{j0mx)=x- z!x)jt{%iv2s49$HHt8n(XH6N+(OyXP0Wa*VWgm7aMZ$60eT|dWZiH@%c~fm}uzssW zG@_hQOlk1L@gZ=sUTLtpo*tfSt+;j1qKloK{Q{s1O|h{BU_;^(N#O|$t;DXvdP%q~ z-&Hzce#$r+P|m&#F2t=3CWT0D(ss3eijZ)ZI{!*0>gToPD&{MZhP1Vi zqwa2Ti<0!>VR9f^&$2_Ct*Z^AWBV0haciya=ti(w_hO^yx0juf;maie1=M;}o%>_x zFO)Xe=+R*k&Dj+a`a7=h_mErTh@SujSMDnjrp{kdT!PX-VDl;Ltxc#e-^;l%a(Q-F zXWk-`Kcd4dPsEGR0ENTjk|s^oAqArRc=TRHK|{saHX2y17tbZ$6qWNzuh>n%(jYof zr0o1$rM$w8Abj|?5BNV8EfW`)`mu{)40o*)Ac)BacRn5ItEpwrp*5rzzT)o{mI@CK z$Mp3l{2cT^$Row|1JP-<{j^Qf=5om9tQ}x8mxRp1oB_1VE-LB@%zv1_-wT9`kC?{M zlic=M1r`tH8GPc=($dZ)q!ZCQVj3-PS`2QBT`Be+PS4CpYw{w= z8C3{KU!C%&1}6qWt`1q>c32F4!3zFiMzAUj^WUxG;(ziCb8#OS`Ap=neco-;I@RQ{bn@ zvlw@e0zm%aXKhLP4Zw`zv}HZlbLq7CDZ^+mHbIl6Z#rQS{;If_1p6q09lg(Hm!SX8 zRdwq=DA9P&e%$b%~L=l zu_|Qw#yftR$;GQrVFyKye8Oa(uU+3^)4(KA0G+fO{5dfFLEE4#LOBM@dBp(lA_uP?){As1xW}keZr`>GuiXfQ~cCX)ddF;WmGDTpQ9wtZg-rqnAAK*&T33 z(&$NZ9VAEp!9?RYVMt#U4=JU?=0+ZYG;*HBw9l#Fe!0l^!stvjiA~}Sru7LPT zy|-T&+b6qIs^bV-yJvLi;e+R&^Y1p|)9^jl?a=$5SXvo&mNAgwfB+rl|3n%8`Bei@ zSQ%9dc#Hb zu)|;YFaC(s02Roh=L5<2p7I-iTT(O(43T^PKjU0KKYm1m@M?aG9H#$H0sfO2flZ$B zSQGfyOaGkKdp>n2gG~|Vzh{pBJo4iGQ(j;5;>*#WL-T*X1hhp+*jzrP2B1 z2i{YaX70JD+n;0Qf0g_*16Joi6K@a3|51*VoID3aVPA3z4+qDi>O1Vqq0xhpdK}c`$r+A#R8>`;m<0gH2-^71Gh9s9kvLOhxlmXHgK*bEw@l9C4iP4s^ZIJz8Nj1*LfOh*Em+y*C#G6E}8?h(UU-SSVs9tS|s!mHpA!6LaWv^>Jlr9^6!$I z^#=st>Nl%iYOrNsVF7T23OC?y?pBw*4T>8*%M~ymCA|ZXeWZb)99!3Eh@I!9vXYW> zL-jw@f|g`|RwzeCL_{PO7rlUc{REo^_%F{wZd){iCvmr=l?Dkz)>K`d|+P%1m1iZchUYgDZ2MgRQ5nFDEy!)T%D-|3pQW5LkflU2deWkEQL6=if(e76HO+8EKufRQ01q z8DpV7YQv$tAC`|UmQ}xVeN=m#?|7ahpbsi!Gk~e);%dQ8db&|SKtKr}LiPJ{Og);T z`)_77ET6TXLb^lp#sdLHPIfg(+ctZ0QiaE19d>JLYYZUPE1FnYux*K2_BxkMXS4ph z68v%zX1n0Cb9q8MARPWlN!UE@XOySo_`Bs>J42}wnLc;4u;;3|NW%!-XD?C*kF zMR=M3VW$L?%sf1rKTt@@$ke^f^r1$Xj!jAue=>N0xNP_M$hoC4X{E)DnIAy6t^;yv zxt`G1|8Ph1r^zto-5#eTDF;UqKwl=&S|{#dbxY!Vuc(OfB_w1bH%36Judk01Lb?fF z2C7GYn^wR~z-?S{cJ*eX>y!MGP!h2WJ3~+#*;<6#mo?gf$>9k$(}V#4QKq@#eyYIz zu}`1!YNE0JCSRZkhWJz}#9`1dPz9AUnyDJUg@xh&==bni z4**0J_XNn(KmDWWjq1W$tD(87ON>QtAQt8B<6ALua;i(o$;hxZ5LoC^o&XSwqi0(K zEgG-p{_gO9wgc|4j#+*Z4n`c2L9<3o3Kan%>*nTjihwsypM^LQ>3>$Z{vAX7&oFNe z1AN31EdCI%&PG`O8K4$mRoM z`8kV#(43Dp0+;_W)OdG7wT15Dd&q+)5i*Ry7ZF3TbDL45rJj-~2_z&Ox`3jg} z>R|B0|89$pF0j0{vQRXAq@13J}VnYhyUY-{_i&zSb+Sl5-GwQ{^=Wj zeppZT^8ag7z;DcLta6p-=I;7tf$#_%2-^;!iuYOeYDSHIExLyYv)wLeX=$~qg59p| zvHl}#=!k4IdBj%-wB&@6{WPc`=(x@RxG;Zy1rsT$P}^MLjG(;!2k0^s-DYG-TA3og zcd4sfK4xb6S2{p8T0-7C&^cYAKn#2L+JAjqNvqA4zwN$~a~FL2TC3T>ClikV4#+tS z(tZZPqbO^;ztC-G>;4Rfq&#CYkPUtKCaZs+AWaV%$uIZX*Q!|}tNLv~Yt;F>vyKRBEE`UeE;Qb0jEhZhg z(zVW!z}6w_Hd&b@P2v(`tEXX`8EnyTpFLc)Ge;GmRA2SAgcE@+x1V${n~+@(L8N84 zx0Nl|qZ`bvAK{fyrSt9D)_CYGh0)Q#zOemPbj3v_K}LbOy(6WNcA&y`pOE zyu9hd_-&f0(r8x*W-D?1o*sKA^JZvkXMuG`U%g#Ws=ptsfBY!8>$Ee(Ij(=y7SbUi zLiiCu_1XmHVfTK7$tGVHYrQ>XjvU2;-}^-RWt)c`3}YJ6f=vkSj9p{4xF|5jTuDdm z7!g4H?O($8r21xtLTm|rsgMcZ{Y2p!Qg^7RPsE?LE7-dh$lHFPom5ki+1U&3ZqW5| z2t%!O(yCP;=CFpSmJG5BB*BGpb`O&RzW7V7!HR&_{kiL1=ZrSE>jj?k`$Jg9%(Rb8 zOU~_6oE(Y~Kd7}9<}Ip9Z{4tl7|SOo7s<~W@g82g9{O}`H_K{+A09-{R{-~`JXmXC!MsZPy7oOTCdM7RzkbYNzP7sH#}N`ps4MY9 zVq5?Q?V@0v`a267UTKNwlII z+uZ(au6cr8;&;wX0+>~4&*-;p+pY!fdO*ur`fkVhc@D<3e3NJAl@%2kTEE@K{rq28 ze7(`2(7k=cecK*yOimG2NVkoHJ?1Z3tfHnTxACUuE9i6e;!M8cy_&hLEj9@2_q95z z*UUA0`@`WqiOi6*-o3$@wPj)Co-3Ul1zmqxetxY;??h+Kis8tu1XGsf>EyE#4kmd zRb^Gv(UAdaQsX-(Yn|&o(g5rrK<}J)?|FTcztrNU9DbAS3cz|=zOj1+@VU#@tE|v5 zTnCAL4*70l3IKPRUTfFHCkCoAx0_ZwD(KSCV>U6&Jb(V&6XWE}zEF}(Yd^5ChsHV8 zu}WNHfViwI{>vMj*`|6K;ruH@t;}ClSx4!_-AS)AeJ<fjbGLm_7#SP)EiK(l zrlzFeOUcU@HuFTq2{HX%*fQD^laxfHqNa`m-3WiOvoN1%ec176(;0%?#$yGY?`Y$E z_AA7y-O6HoB`|mQ?j##x{;WWK7UB$^xomUT!E%;RBfj+%1m|h*wrA&|ngO z=~}UxDrm?R6)_B!*?Cu$D`~aM;yhIh0R9*JoXJp%H{eD%poK-P1 z;;A&tXH~|xmA>%aZ6Y;z3mW&blK3p@hM^4ch5G<#|or0$^tyLS_fSaKPiZWPs0jl zV=qVdxFUDw^^Bcc6xJaS|6J%j#pR_XC6rqRPT4@E`=>j-nvxJSw;?-{E-N93hgEZ?iP-oMZ4ze~wlfr)N+?^Jup6LMoif%ui`HJ-c+>M}B)J zLy}AW`<6yviSg>@aW#uhUDu;Jk96^JL14b!i4(wc+FIgBh|+Ex%Ov(uu{=JhTzD(M zQLr#CE_y{asy_n#B7S(lCXaepo8?`kr6w(}4@$bkXae$uJJ#o^$I;)vf2X8}7Y&X# zlSg;I2AK0qzhh%zp=+bnz=m-)8h1x3G9bI(ebCavuU?NmPe@9_n6Z*Sb;B782#%|| zEIScawD~SCWR(y^SpLJOT>QI1%%hWThSRX9v$5yT1Am_7d)Gh&j4`>5bqb5KBC@(; z4Qiqh`s~h^CYYPMaugJSyKXyF%2gnT;JIHLnst{ai1?&1dpfLkbW_uuN|vTf`4K#h zzcClHjhgMxzP@d?-xkZwrGHzR$J}^t>P*6`1#&o*d3AEh(VY2a>LHWsz5f--Ku)fE zm$TS~;ABsHw^;CKS1nC!WpcLaQKR;?l3Z~&OvpZuZbdpr3p;;=9CngJ4Y@=1bLU%~ z31;|k`ueTT7xfc)iLWBdX2*S-c-jT4L399IbgLgmP-0#F`caAMvmZ_7Go3mxR3t%q zOkWlm%3J7f_we^EM*3bP=p_h;NXIBuNsuBVNo66?Fy!1KT55^>!Z;Hzb<14V{pz<}(R!THE4217ijLp6f=X#n zryZWfIBC#>(3sDU?^oAEm^&Z@gbv63@O>FP9VQ6V(-so!dx>0*W))k zpkyv+@Cd*6t|i3r*5g$Bpe;tNKNW6ZfJw_%sjptV6|JAkU5Yk7HM6p;Qm;{uhgd2= zBP={L3qXSuOV2A?ID5!e8LxitHtjB@lx=@JK@#K(IjLTx7>>>D@FTtKRa|$n*ARhW z)UNY0%5gphU73zgoulr6j?nGDoP&xrd3Bd2md+#$JfS}OF*B7%bAF6Ka%4traJw`% z_!ijECL{Xgb@sP!xc&Y8@8gwgrPWZ*rh$z;SX-oawYM(L&UJaDn>K0!^V-6_{lC`y z5uNMqDbodVAF6u}zsFb5A*PD48KH0(F|RfMkc;_VfJJj_YZZi5>T?pM-&3mY9 z_&PoYCM3L5YpFDj%KZpxzS8wryXb*~gt|Sew9lxmKO?M(Hua+jNvDuavYd*w@`Ae;oA+dOd&Tw!6P~ zIA8tl#c9PsbDHkOO&sI{n+-(3yfF+s_a5FRcfP*Mc-xXQvP^Se<)f+^RbM|}0~()u z^ZZW{`^6#yp39{)rm4d*L*d@wJpz?$2MS=9%Z!`g-M7c9NmlVI%eacB0|02O5_Q}j zovm+~yb-z?!JJxl7l)LDS2yy?zfkY4P{p(_;5IzK{@6e8VuW)gZrp4nE&DA(Ogb0s z76>@lL*M00t4y^15mSZYF>yGiSM6}xloq4D@ zH1Ig6xHUZtyOe!el;MhCAjp`?n=R5hI=`=H8doNCQ6HzW`b>~;KJKh+Zc+w%H&APM zKCa!*P#wSC@fFRL5(e*4H58FK}lpl9?ewfC$ZHF>0ER>g&p;WGGmY$_lE@y3=MN^3cOqdF9Aj3&9a z2sUK1tS0ADb^X=#5;f*#s{H(XbSdO7yn<}YqXoD!}JC>$0+XFw;S@-jMMlbi#=6BKdfIH5e%W>yM zuqEh|OeE&;Xrbn(fxbEB+WKFRtfZXcX0l1s4tK>*(bKhY7v_DNm@TEFzM_=kxa*q@ zJhMBzXE-Yx^V{ejBv9)a!5_g=*m_5+h{zixQ}##2_wjbyRzF+blVsMvgLU`Bg$nQ} zCQ6cQc^Nz2#~R&3!@Z}opdiBevbXRr;C_r@K)k5} zUCXvsG~1GnVxm^}RnL{yYe^izs58h7bwzz%Fk$2s6@dvZ#`OAL&^BO8<4XkX%##<} zk}QG7hXq5U8;(hF*5J(deusqz zmsG|yP7=aBN&uLPaB-6iy4E}_GUFPp`fxXM*Hx9j_EVX<*rz_2&gp-BYk z0VNFIxgTLSytm~nxm2PrJnH~Bg2UU8bA9R}O`gtM!C9BA2IY0m#{Bir6}u&e2Q40f z%@5Ss(| z^Q(RhX{;#KIsvQHJW`z|N2+u__i<8?Pe8s@hbs$m@A7&m&*759q}fLyeyXIzKz*HB zKT}!U{7-2OyunP5hJ|%)`(hc2FAeo1C|8sZ%`E(5;Q1Xdjly3~Ym5NBQJPh^+QkFr z!El}okFrWq9X1!fQwi*7O1{(En2%yV(Uh5yu`V42^hzKj{l7*k^<|XbgwSht|0c{D zP`4sZQIf~Oe~Ylvx`R(;XQjA{4kjw!l28onC-4XVl38VUWTF# zVV;>Q3Lj(=r0j$6Xv0C^#-oHIinpxkUls?1zefF-Wu>*F80q`TOm((36U#q_>OSMK z73^xlbJT@30M5?Lh-EksV1RtL9c+)IMxChdxH%fd|G<4CH@;%gbwHokzNq0t)mHV0 zEGc{=cS@(_>im3&gj0IXZeL1Pl+oMy0I4{IHZWw=Dk1|zdAEml>M_42C_@{PGATe$ z>#J{HE)3loTuGZVbiJn^m>HMVR3DpM`+wRy%djZBZt*LMlnO{mmq>#MNS8`?H;A;9 zbkC@ibceKbcSuW1$IvM;z%X9k8Z)D(b zueTWw(=0=cV8({ziS#*>M&^5`^0%=>d%(~u;XLd3!aX4!Ppar}+=0hSHc1Uf$&l|e zovCbDyBSYg64PWaVlmZ{u!}le<&rqS~RPnDCv!S6xOcb-!P*Z4F=ELgoC~EO1g>f9WXN z_wehsiFc&SQ%Kc75TSC57|jOVR}E(E!{o65{h5*m(5q@$ZRGuCdRqmHzM>zVVFlvHPpUMb{+ zlE~hG;8F0|p7$~Le;@T&;Q(j5e1;fF)S#QSR^~w>J7qijFz0#h-LR6n?Jn9!=I#jrMsMaLESkN1 z*^p}5%w;tT5i`z8(8j~mdHFDx7~Yl#9{HF=GIF>tR~j~ZSyY9rECC1A=c)1QY$M$q z+f5Gktx+y9kS$e(ya_wtirtr2vn%S%g_QB>>lzE(2>~24uj#lrD)Zd=BQ>t(=uX3w zS>u0MkD-R#4Ql-m&B^z}kj}^D_iUpSK2z_g3Mh3LsXufPp<-Dd>p$c=Nt5oF+AqwZDF5`N^o4E-h#I8U^n-7Mpr?JUm6#l5#Hwn|<2+N$HT z6-jLHLf}(@61Fbcgg*FqU+bN%82fTEyqCDKTVJ`Z>09Jm=_ea46%kLkc{P`RF~J5K z(VWx$6L06Yvkm5^ZzEn=V$$OoI?roL{n!WFH~2dvLof8DidMy2BIHRGp6C!HY1ovw0s3=i6p`-F$&W?!77$9*JfKNI=;R`IV;Dx}UFBiXpmvGcf@& zb8W?XwG#MD*r|2qT5S}*n`0^X1EWLIIP{6pI8VNS&Xn)KFpf+7U|izWIfJlJcn{22pH+y{Tx5JNOe<;yxZ>Mnh}h50n1m%osN0&=ONY1on5Hc! zi7iZM$)63sx#ld4{!FDHdfotRb&!-0o3xH4==mT|+_vf0oC``~CtvvmBp@G@Q$VZZ zvJI;3ZwxHI8S!-)vVeu}BS8xK%$RQKvOl3eSqd=n-rpj)(A3kZtj=aDnPhn#9QOSw zk>bYZLdsgLDV>R=K0aHqDOnL3-&0yb`=tySzc&$6FVOMj)QNW)*^_7_7^Pd%E%3ma zk?!^AQ>(u57SzER^4iY_9R7ZU&e5|lb!@_wa!f9ZnUoAd>qI4u0v+5_u0WOtduZGE zn+}j?wg|;>nb_Z$X^nPYp3@&^q@zpp$sc%}`40P6)%!OPTTCeNkRGUr5PvG$lcz|N z6Y}<+M1>8q^*&eKZ||JB$R9i&`|yEjTf(r!5!gm&Wx>Yk2mH1}qVgcLv_7v(4m0p2 zbatVzK48Nw|BGhfWJK|GWlDnmU>MUr`xg^uj{q`pwt~iOwg? zsf7|@v~~sll;vI%S3UO)bq)WUOq-70u8Z!M{M$8Uj}!bKy7;UYsn^-9irX$Yn^n)8 zu(#$$G^1x4Dl6{54KR{2(VBr{il`;ueuu7YOHwEa@i-WTAV)r75Ug!In+XFuGQ@29OyO}(Rr>ct}0{R|~e)KCcDy8XOQj>b4Y#hGbr?rU`q ztzv#viOv88nd9|it=X9gah~%pOr3J8f^FGGb|jBiLMJQrrX3S72|qW1>Wdg3%ii+@ zMOS&Er~P40a8ahDU*=e_!SfbQe=?+he|W+|N%f1GSEt4$Z&lXs`&91o_*@;e#7T4x zU$_hsqaMne6SGXaA0Lpr9S$4XUVoMsb|0Ggz`R?Nf408x+;%`gQsFMCqj=Ouw!u>f^PdaURz(U3alz5Wg7#QOjfz=>O%E` z!RS9`$nrDghZJS) ziO@K7Q*U}p{g~XwsIxft`(6)4b+$PNWXYJ7USl>ZsT#CfH~WQhxiB@VOghn`a~AuJAG$E&C853K6w0W+TAV(gIN zkSSMXN1ZHserGdyNQS^LgTtFg^W9rSJMJCKub{=Rotb)?cEL)MA5i1^J>g zbxzJuk6|15@725Sv-Gu_G46M2!hHP2r>oHlR#;_oE=b{Qk)lVx4Ju*`u?o6jGGJrN z<-MU{T3(7dln#pkrXqh79ZMWoKjNNXs43|T3f5$4lK9<6L6>>XTI}gzS+()1*|&25 zBH&~THnFxAJM{}o<7DlkYMS*3LKzIFP0wGq(&12NM;`L{XaJ$7jS}IIemV*F3(G5-zO_H8%n#Px;*w|+(jnCaNn~i)m&z~Wdck32i zwft)-Er7ciCHI&{DDW2}o~+)A`&(N7FBfkS8?&-lRJRHIdO!5!tuiefv`+b{S)oJhZ=9zKO` zRvQSj^!UvY73PDrq)`w}TH5q^Z{*+VyC zg0qCGSiO*+UT$8$=4zxZNTvS{3FlSG%o&g;%7Yc1h&Qm65sPE%ufKhpmwz)ha{={9 zH?uuFjMmhrD7Aq>!M3Oy`EgVIdEYx-*ekTEl3 zTifa3XOm9Z>NkBAPU9?~IocYr-kDQX@%|=NL3BNL;QldUAoVmWKw2nV4+6G^iChC7 zz2l8IbC+p#;bqTxd11efH{x7kI;KMKX;=0Kr4C$L)d&VP7S`lUR+5s9wI8}P-OkM1 ztapnw3K~(Y2!{s(@x{GtP;vy$RC3(lyX)0XB8?LZ0bL4_*S_L|-nGJINEy$Z;rLU} zhCPKRX6|U^E4E?yMiH{qex+=8#R?AVO)sc@#^Kg;ya#*Zo6ZYlhy-w?&10m}eyC{wV z&>#hg&#;_)=mK0(g4U^YG0R38A!?j*N3W`iemB#r8LH{j{0(y`YT=CWgM5;zZvcK@M?%gq=rcC6~@HWFylrWLwh5D4^L! zGp=h!E};-nqaoWFj;4ndc#{b1ADZu)wq;!(kZ^SD36;HOF-ag$0j-z_2b2kFDvFfu z=JNqGN#R6yd*c7$Nq+UthE(#FceA~>VAlC)y;}znnMzW>KL4^fDpq>jqNR~rK4b*? z2T$@?<-d87Y=-8YW);Yl_UJoKPXI<^_pfTLyKchnKiNI;Odtv)!g<7aG--#jM3(Zh$HaCPWDfG7Oyo-48J~sWzCu#WcEzN>#HPL z$q%uZj_~dMkQ}KgY6!%IE9Uus6>px^Q$0-c`qBSxKA zd(TE#Bi$iC1O>uV%bccAGe?)a#(j`i2*hR`HbD;eG{d*W)N{(Scx6XgA&+z`uBI3o zuQMEj;}G8+X&(Ri^rFS>Tdda%^&OpV2$S{vr&!f*gjh{*Yk%OD|9IF-sw&2{_t}v{ zbs*t+7`UN=1vxBte9LumYj+RWYN6ju$IW{`0gRt2p8^ z#P%Wrrci9CyCew#FcJxEer43GzCka~tQohjgE5A-ZimPA zKK`b`d@L&+ekC%5xiprJ&O(VE!?NL3UAvB_C`PTP2@&svSZ{C#<1`JVO&u3FohH@R zW}QxK9JEH36qM)5Q6|Kj+qs+Zx;1!;HoCc6Yl4G4#1=x_2;*oLZRq7xmz1L|PJT{(QZ|pa+I$TaCUcDO4O@!JN z?-)@d9ZpZ(Wal67X}xYMcXE89v(T1-3SAF(a+qrI==}%4@#KF1jxmL4SeC?=la02e zFuBMriW<9a>cnHMpSA1Ph*p>Qgvo}ANGoQgLi(@HTE^huD3XlqO4V|mR2mX-BmHFE zxBfi|=Fa5Q<>Pv|A&6jw7686zTd;`DR>WPfp7flRvqu(gsKT`xe*+btt656FU{9QW zcPL~uJKz#olQ8RPeUN+hX`_{G;HZlJ_a?pVGR=)hN&P!Qk^^P@k>jt)jnk7WB_7S^ z)d6n3FC!^~PEtL5wmV>FSNF;%y<}>hevr40@)6aivI zCW(zzRh>~;kG9d#66y;R<{A8jdlK*EX1PzW7#Q}&8dnuwZEPfp?vi9&bfDGGrbC{F zvUcrWM7vFb?3L=Ym<&HuzYcUyM-#5axfDz4k&-5Rq@$^&l=C9iv&0s*fy;Q-3e`Dl zYT_Us=!UGxXxl@2s#wqUyCYYHT;1^9TWp8^tr{#Z!t+_0UBqeN5v=i0<$!##c8S5D zj=r&uE0vNoQ@vsmk9!Xm=*@sLeB|ku!aUnvyzSA6;#kgITEx(uNw*D{RbRR0kKjma z6HwyrF5K4dEdxJJ2UNskzaS(Fq*LNt^SL2ibmfc-xFuUVEQ_&%A8apWLJ%InbI<pxJgyuiLpZg>($5`$3t@d4uPpmVw!#ljeXx?oYMz5ZXY$MrXq zzLye~bxz!o*F+-}Vk0}^c0}|j3%?z5^5iu9I#mgw6&I8wCT`pkN-g`t%nH`ZYqk>|hGZouBD-rj9v z2z63e?Y^l)Y=-&7bu3{SCN1)MLI4hDTG=}4Y}W0fP2$*DTIz?0J+xA@iG;Gzm^Wgw zHhMgDNyk8UTn4W5j-#_NsR1%m$rr|1anXc#XQvAjhqQitvZOlDk%)AHL_3n0IJ=%$ zOZPh@EX#NA@NCYNdpv5{H!s=;T$EDKakdLbb$sl~=(pcP4swGd4U0kh!76u>-%CEa5c&ZLGZWhR%s46L zp2@|QU#ByIA4lh;nkwQbcy%bOWOq^*8_E6PtUzQ-IR{g-k9=QCTDdKbhQ$7hdzgk~ znT599P$@*YJOt}q;ncqvngR=fE;V~f85)VKv_T5@s!z5Rx7B|o`PVVG$fXK%8p^t4 zVrwt%KHoi0OB#L3?J2O}AsTX#I6clIR%jY^AfcMue4JWp+v25X-JyRec9OD5hXnYU z?m12+2>V0#|+ZbqH|bwp*RHZ=5$Q<+}YU4J*!N}rau8i zRkZj`F*LtfeB1C=8Iv{6b?ev0_#V0al!=sg6fJ5 zmXYd`Tg)z$Vk4#pA@z#p{XIs;ceJ+!wrdkRni@Ff$!Paw55+THua*rIWO?d9f*Fj5 z;<2m|n#om1-(!9fVJx^pW8@t@M|(sFz<3arxXlM%<>yFIo!11$U;z?ythOcMKm= zePuFrO7ywxoh){nUn-vTk^CMIZV$B zbA)Twk4{!O1=Mp6pKK?RsYzM#JfPWB_zLPI=EQJz3z-t&A4fYKnwW2toZR_<&IqB7 zzk9+*4;PdtqOx9ofkT&Q-$=q&&QLdxKdnK+s$5@GS5o2_8`gkPO`=xbP*V3uo6ufD ztM1Wfd}9*&yT*0+i6qkvTG(+3f%j5-db}m%m3}N1k1elss_cdK^JbDqgJoT|R(ub< zkq57X!J|!u+cr+=LbGJ9)}x{Mc#BvbH5CWo&8!^}5-hAf&~+_u?5A3XJCu=m`CXh4 zS(B#*wrK`ex;|9q#g#NS5=*XZpyM@%a$|^ z(7tI~GWrZs8*4SZB1({A;*J=MYk?z7pX*EGX`Ld_s;lTMLD25o)^iinn>Xludn(F~ zXPl^G5zmJ$?EcbN!fIbSIuc2>X>VgBlK%QRzFlgju^cZf>D7dG@w=2ji(h~yDcQHU z!ev3w=zA-cIya`P>`2L{8vYo8`4Z*HptIUv*Q%g)nv=pbF#8O8vSgB7J;xCfwOLP3^e0TI#3~GV!@qG_N>X9J7z?xL(`l zHPDa-U$!_L_jg?O^2`?h>>+%-e;8c{cU;hWstUUt7C`S&R(qujFb^!A%D)l4TXK%< z*oHgxj;Z*y*Lk_yX^J9`xO<##-W@}C5-Dnd!o_Lf-^SQrdhhU|s?MEkW4e@LIxR^| z>>3bX9iEzTA0tF1ll4ACsS`uGn`#MRXBx%rQ684{kb@sFON;zw)@Mm~7dxWkdt-a` zi337cSbd`*?&tL@S zvB~S!eYpoJW;z%W=1p7Oe8HtNm##5|xt*)*a8v%Sz6U?XQ_q%-j zSpEkH9C0W%E)=R*ZnVVMvsmHv*p~0vg~^N24`G{}G3K{KqO73}(KWh1|mC zYyDo&i;am*iHg;A`~WnnA?l|@Lto+cXn)yE(l;k$^CY|4r(3r%?qUvEt$0l$?Jf7d`Oo z|B=riPiNmpdX!-xk;tH&WNuS{bt8kG76POE?B{EkDvX*Qxo(d}LWh$3ug~G;-N6rn zgsJ~5?v%`%Gxf}cGu2Xex|mM^vQbp5XL*H%%t@SvFLvq7aPPNYEZ7B|Ty+wuiV{YP zU)z9ohYs9_|DE_9?2A|f@Ky-LI3MBHXa+RDoLNr z{wV73wNC-CcH(cG{BkL?t1~mC0M|~JUeYV~P|{?S`HzbE{tG*SnoiVxSBsQt4-RK9 z4gp}MKRoKGE5--nnL}Fk3=;2ZynivzBVX!3GjCdGROK;*l98r z5y@{rMAnah09%haWr5`cPKmY&wV4WI-(^nQJ_7?#YGDu_*;a^nDP7D8i5CC}p}dE6 zS`oo7=e6Dw+8UO^Z>O_1cl!@fCC@S0YUJe?<{L^&*=Nf1iCBN|B_(_cSZr_z=VRo_ zzqs%?q@}{MAh*0YSQgp+`DR6l=E<-Cm%QSLQ^LjmqVBi+`uh6!dw-)Rt}!gJupt_2 zXDUrhib)Yom$u1Ee6C0Fs^SB?dd+UOWhQMt!{@AencwAx!emSM@gGGcnC@No(}ImS z3~Bz5^t&KlLR*g@X8fSMH&Ay}N+Ps{*E$tO`YMToNvts#p!@=j!6onQjB4w#%(75{ z6)(n2--9Om3m8zhwRW(!K$tJxpSmuhLlPF7jeE)37R|MqV9^&ruD=hkNTd09)!!+7 z#G>_kW~hQ%3!#+(E;tfB`N8<=-u3t^{9fKMQQpl|qCfQN$74bk-%w|!7WadtCb`4T zMF0g)DoN40=)kn7uIqq#01N`J<6biJp(M_3kGzf!@En}$(H|OE%Orb?7aMYq`O3bt zPF)@s*97o-1W+ld{wvP?)QPn96tYZJ07O%Ld3JeOtORkAwgN)zdz}n0Z;S}64s%~U z`L|yD@1%=jB}eWA0ug)RXYqxQLe+ktYy<$%BsPimaJ55XaYAtHQs@}d#Q%Ky<@@&& zInu|!Hlq8R-Qf&iEHhjR#lPv5ghk#Tjuy;TT!uI&rl&~`TTfMt+I;vmzE`!iAr}_Y zb)~YWzI@DuX)GjcU2SJ^FEs;TFS$dig#SI4{Zr6)jB2`vbi+7X!(WI1H8c;i&hk$( zy_mm+0f zsp45Hp{$=6)YR0m?RQvlZmAxH6eIppkne$HMFaP{&Z3%ltw${+#KgpA=`SuWWEQHP z5^z)y@*<}gmT$GGo*SDD7d{bO`~OvO$R3pfITCtnGRd&%hGVq{8y+hej`D25le{coIhe4wve!fVfbp5@)^L~Jq~~jf zKU*$Ca{hMLHDVQV%C#eW~owh^Yi2)o(BjWerx016N#L$oP>`9P&{*~3sN?FA<=%+omeN8xgp z`IfyfF?Yoz4sxR&=fu0fZItTANhY8xsGu8wK|ma|=)VzkdUL$qd-YZI&v8KUTLmrw zUV|wu8A&9CS$JezJupaNt&i1M=6+j%IcfRWCzx13nt&5cgR9+a1@%R9_+MHEn6Rb^ z0mY{m>ex_M=QaC=iEgNjab$rb>BRGuho>i5i^G(6wAh87{X(7X)MZQTpEKMEhC3l$ z*-h1yo)ZQ@Cme3(^E_D6Yp~Z}^1ob;H7#vy-vzAG|IGKza~x~}m4ZU!-0A}3a8qw+ zB1L_L{$E}KjGea_nqiiMjDIv2U?Npx-o>UwTv1T}HErOt9AMIv_O|$Q%oEty16Efb zs9i?(Z?tLAhg)XqG++Kx)PKB3VJP{bsyeH3;!ov9z`_RDcnPvk|3;2JQUW^ry=^vq&E~kmfibmW|Fp3JGhXRP3u+h=c6drRKc>s-c z(FfQAwa@qW_j$mmo4CQ2FMmn=x0d@jfv5FEa&C2%w#8#V><-q$p6OCuymC)Bw*+E3 zz`O_tqO|+-6_a!7>-mAfWn47$=QIx_oA}#?@B(xqhhWMlUuXef6|&$xESL{r*R6=y z+S+m{)yn+4+!-(|I|81K{2B@faBy&_2CP(uk;wFVr`2{r=k?bf-Q|rd6ycm9b4M+yKSn6f>2vmOt?4Bb zZ(krT52Jzk(z4Jt^kls^{FEc>?}Ux0{jF(Tt^p;{GzUy6I?{@YiVZyS!t%2aRRv(~ z91=%L{W&N;NJ24F0gkpu{mFF6pIQiL!caQ3SY?H$U6SX2`xp-Bi%J3Kpg-&XdmbSH mT{>U%f+WtLcC!)p5m?K?gz%ZvtI}J*PhMK(b;Zj!pZ*IFREnqo diff --git a/docs/images/coroutine-idea-debugging-1.png b/docs/images/coroutine-idea-debugging-1.png index 0afe9925157e44d5c03e5811e7703bb6d6642ce7..c824307290ed668de89716fb67200914f80d8c0d 100644 GIT binary patch literal 329126 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 Md)kC|h!+ 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

FyudK9fJ|H_ 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

n(FXD7wTb)KY6-ADyY| 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 literal 248706 zcmeEucT|(x_AMZ>pn!#P01+$*gr-ylX(A%MB%xO&ARVdFn}UJ@N|z22AoLbWC;}oF zszB&PPz3V zYU&#NnnFZXBqzfUg~;1675e%OH4FtIlDly;;ci#*uTsSDUZs5>{^&&ewRT6*#10>? zBzG69m6FcF?ZKIZnoc*#x^WBTPWQeNLk}C*rJA}00zB@Xn?sWNc_|W7^5g!K3q5(7 z)t7|qxc}&ppU#?8_;0=eLvdcMDdWHRiqqD#S#(_Aijl1Y2=43u#T#igjQetR)MsP^ z(HvBC#~p$5QYrjr&#NKgjJ!ISk3Vo}U?74gjY*IH4rmDpDI#hYKQnUS*yG2l;OqPU zZ|48~%t)2tJbxv4Op*=zXo^fEKKvNQgv_QVBpwO?Pm&UQH#pG zOrTZ#K3A=E1_h0#i8}6b?3M;I?)01%`jln4!=tk!$t76F@G<)%GxX=`thdM9sNtfd zf%}SyY&Kg#)$FIzmS`Jx_#88clJqA*v$7%XghTJK zG^$?+$kr?{v{~pc2)hfTJMJ#&)?r1;9Ja^aZgg;rde2eSn+$y7>lLwx0S|_4{x$KRXFMBu-xtZN%YC~JsIhRM(J6TymDR*Z|;4cG@ z6p^>0>ZqJYh3v+vD-6m9OU#D@DVcJ0%PcX?S3GDu>inT9vA61Zt5@&0;&8Yn|6&P<~9A{>%zqE!9O-lyr#i)dY1h}xWUK7nz%$x|5xJ@`>v_kka zDwr~f>rNIlsvbU%uA`#;wEdMmS-Zx4Gx%P>RBMdhc&(Ssk1ua|S63Da>UbTJ)1Yry zB*!36v&UkLyyJ>}p+4RsBlZCvd`(+2D*>b@P7ZWR9xeJeUh&?U$nu3E+cgRiZyANS z#l*y1T%(USS$+z9YEYR&POh*+wB~5venH)#Wtik)#pYa3^TW4{h`9+anolUCu=Ac| z-h3b;I!23YC+C7`8ihalm*q(xX%xDeH9{j{;z-z)@v)VdfgzLzC%oCGXGfc}G|?D@ zHAX*1@S3qfo;oiMe5-OIfyS%hDVC^v~WH!-Cf@eL6w?#&Y9ed)&4D z$%#``Z*+~`zid*B(NVctA6aCRv-}>}`b4Yb&GEL|$Cpw#e)w+58S{?8YPS;QWQoz6 z${$QGv8$9)OYV2|QSO?(RspUemIOSIOCs*HCRZMMeX>Aq2D>|!hWyTn~bK=|S29k

gYl8~3?t?Ee@ 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

xFmWv3f&Y;2fKQix{;PFy}WRA_96 zM1boa8JfKg$EgV3V~IG26A4NdVYuE)K5fqkx>p}83A@HDnB_RTw&;C9|(tD#dsn;BC@g4p(%B>_qxA`%5P8J@j6HUNng}LUsFarJ~ zB-Tfa8F@MMzHOnE&=q2FFC}<Of9c`y9c!~3L0*4CjC$YdsI2kyZaSQ_2 zl@kW?{%l7oMpDBEoRNez0UflJHx_FQp0P3`Z=%6qH<=WPz$o^7eqqoz_2>fjH2L&h zz@r;|Vkb+eIQ8B9h6HK0%Mm&GU0_yDx;)sbVg2T0jtuplIFj;#xLo5q{Bo5O6dMhh z=dH|VkK8qJ8?hrCfojgnAzBhoZ?F2JJfI3R_sv?f^~iNzva~DtnlZa- zj3(#zg(x_@JKV=yma^9?s-MorvVi4_q&~B@tO*0U+BDmv!40yuZvE!+npVza`a!5< zQtoxjl39H%_m_`+1j~vyrUAWtvDKI&CyJkNgM=47fMojy`g0{XvCmP#MUC~^gW&)( z)b04prY8x563aMXR4PsZPot5fmzd-`7Mv|_?qI9@Elfou0ulQ2*-{-K;;$$RK3%BK zHBr995x9`*A@i?wnhWkDIU^w^8@3%dio1*`$-~$t*KK%Y=yH@s?Bc^@H3bSqu=sxvuv?iD7BcHA&B%26O zVeXrS^kI;h5F?w@ihbq*T$HGxY!yoVw*y6F~gOA{*&3M8ZR!AhQ&uwD4eM7+{{h{TZR#9 zmTYwTv0EX7XS1D*&DZadb&fCH?Tl4Hy$Cnv)WTqai0u4qh^e}rERssJSNu_G`3*AG zuVhqaf)vplwqEug0Xk8OYk9D4>x_k6=G#!kkfP6cbs`%EW$HjH`nHgY@xX~fAF|dM z^`7@Ro6@)t5cYJ@bpTPI+X4g^g)tM2gf5yu-`@2~obWLvd8It%1Le6JTGDt^fW4pu z;Wz`b45rH5hjk&mq<2sacG_V=!DN+Zn+d;6E5vbJfRw3xoqODZCT1Ckj%oZpr(-hC7z0`SK(>y}*DK+G)Pa&Qz#Z)M$qshq zGcP~JHcJ@fKRF zupG@AUv^lOKky2QTg_POY?$vSgQv#tdI^SK)IJD{_!y(k>*-&=GJIUc9mY*p0>4=m z@FRq=Snc5q4I??!oG5&kIr=u}K!*CA3ig^_gh!NXM)Fed6`!tYsGtlU9PDYI2g2x~ zuFSl6=_A=5Xw6@e6O^_wjGx2*3v@77&oa8^4smP%TQ<26r3T6*up~t9Rxf|a-s^eX z_LgRAgLi_W)+*Btt(b78l2u;bcWytIZ@9+Z!MRS~;`iHyuJKrTrg;pO#O_YE+xSfl z0e8AM7gMR6Z>2*jq{uuI!&wHbEPDBcsRc-!%=sul*A)Kg-`if{kY2+YG0ZRh(VQ;= zqfRg|Ds)>cgL3R+m@z}euE%>7<~|Hp2dshT1#%8EaE>D;RF^e%GeneTBW^I9)F?k~ zE_6k_@*H(r-oq?%Vyr&te;ed<6ZQPZOz`}et1UH4G3ET%;Cn!~ediWUjk>Q`>#8Il z$htL2PDLK$b^Yf1=iF#6N->369ZCn2Fz#-#DKzl%CyCp{AMcK}h+d1mF1I-C$`DMW z7?V(V#)Z){H>P~FjA-lN2p8x=j>$z1c9kCxM<|;ZSf1jcvW{w`E_fAEM0xyK?Ksg*?p^oJ?cMW6GW)H1c0-F)3hG0@DQQO(XHgzbeB;}x9SGwbNFJ+_6Jr$wlxrjd z94H8_yU3q%oxdR+?%IEB507G|C9c;gm@HB!p)O@;efnhqJ?AiPZ-i2x8o zv(fL_Z9_O&q$zx$$4hAN{I2wSGwqsqa{ z(0RR+z%pruB1i;Qbb||JN_IT<3MHGocBWTxK*q^vc2bH`frQbva*a89{3a5d6>AjN zvXenQnydGbD31Ecvi$W{N4m@WFC_b2tW4v8AC=R=zpQq5wLD7x$pScx-^s)gR^xP| zU`Vfw=QX15`PDRCk|vWJJfaFKs~~WjJBmmwQ73R7KSFijJuguDNO{0IZdV(xsIXcw zE^*s7hujqPak*^*OvdtSQeL&YiR*m6jyJXTL2W)U*a~B|PWh>LE*d@WTV7z%#bGg4 z!&QU8D`1RH>U7C3Z5na>GQ+V?9QA<>6lMgTW~;C^{4oVnsyEfL73%I}b-l^uuV0N=j9@!cT215( ze~xV8R&@RLRs3+9ii|ceeID?sOK2@RR@yGjThtnK+sAvk$aaC4^I}phJp=~5ly&RL zM`=;JA7#GkJ&2@xHf&&G;fE~6!xB$h)CF|Z3K;VPyj?CuQ^A(r=txqc_SXGg&ZEFIbB=}ICqs*1HD5!)0DFxTth?P6Cvw(9Ap zw$k+1NFf^qm9Q%ND{aL8@r5Tj5#CkJRZf^jho?Bob`aU2hGgI!DwSXZIz@qExo{=M z8Lf*KTYNfhL1Qgm(+lzWUT=7pA#_kB&stT{9($N`EBaEKzAS!X;%OeCJ2VSjja(ok zrCU{r;*Jr(3=Y7e$C45C6q25_=A~g=ru`n+$!rM~B6u~R3MQR13?_bPmG???;Bz+M z4S%si!)tF5=f)%iN7Y8Zl8`kJS@3OzKd}+RSNnU6e<2sLzERv3PW#ExgzN%(aqA8_J-3YJe;(tEk~285LWj+S{CNb(W<&JOX{}%bmcaH2_%1)Ld5k zJ&*m>Y(m+W5EgSXQ;6Nvb3{ka7gV!Fj7ecX4>buWmb-2V7&4-qPlJV4`6L}DF5g|T z>Z1!^KeG#CYc&J*|E1iI-{-g9y5`0&&NT29!r1O2j|#P(ZhT7^XDdi^2qT^L?tDXi zbJ^&GpVukHlz(X?;7E9jjf<1m6!FkoD64K2fhCII-ivPr#{DJxnAjH<#mvY&ohwew zd_HwP#HMTmBnzCAbWN=Hq14RX9VE7JxS$&cWWG7oOspe$b z;qm8!(#e0YiG71G`i~$vhFbfd-$d#zG!6G9=0nMjm0uj$@_6 zWmUa^IFPvN{_sx583Ng@_B_!5tLjPw=>zETV$!?KwOiR~hFzg~_;yM!1u$o=)mZ}a5^MHD(MG`oUP=!j7=X)yKB>%tnAY@+JT57=)JfI_JAnE zE-|pK?oF=s5TPx}mSwsCOGNYTO=n}y!E|nq$FFURK4S@8|LC4k0gq_byw^q(QJ+JG zZ@$+t`C9fUO$XU7u^)qY?)MaY_B-2098GyKG5RH;e7Q(G@fbY;YW}SS)Ok-~4&W=` zrFg~L0fuMUwFLg>#H3aM%MYDzztP*oIiuO-O0d=o zzBySt0-_boHL^+*`d%XKfHViLQKHjed!S8fcMM*Yk zN9>S{%7N|aI$!P{h3VWtYTuKlRlQ!mdmyW=88?)zX9ZhBcgqWrn!-7#5aCH8z}tLBOP#eG~$5Qo;cc4s5-rV#;y5`RjXY z|HcbwD5JNdMV<95puLcsMCAAQ^q+;5r}~VH`!P|pOGqL5=M%GDeqZo=G(s_U)6&$A zAf9~;2SXqXJF2|_UDI&f_@Ni>VO9&`OCxBk|4yWZGtKL2uB~b<#j5-iS{&9*sd+a$ z{NVy`C(SVmS1C{=)BLv_*V2?8kio70fVq@-$u)Whv=mAC0!?PPJMF~#aC?dMD&8{& zWPt=W`dJh2BY8ao8u5^v3Q)0`L}HDF9efq$azHp;lb&B=trT-1jXN z>sOM|#|)!FZ_i_d=YQB&ndoYk(?YsgKxE`b5$s2#0U9rOzjpZbPL@bGXvTcET31<) zw5=Y%*|KH}@qx`WweS1=K}Y*{qsj6O1By;>p5a1uu8E1M6$Er3eVtwI=lTJ4cN&yhTW#`-augnynmY`4ty_*)FCkt|g( z=fU#9?x+yKIl_L>Baoz>?*T*swQA7kV;;^{Wav1Ji?>!XVcCCR5KX7adWoY~NbP@1 zPOb~U3bnY*$1>%e5_-}RnHE_C1j;^*JE+$Z%^*d@DL1OTLM!3w1(Fh zv9ExcV%RX+Wa5Vby7*|q_~@2B5Fkbp2#fOe+1bk6_&4GDg-u9_QF(QvUL@%H&Sl^~ z5ZXdju%+HcRh9#Sl;izWlaIezPE3+b686U4p}$=PQdhcPfWwlK%fN(c`E}f`^r(f3EA67ga<(H7OPbjcByYXKH-YY-`522*1*;D%agiuTs4Eve@RTt%u zcHT4gnBK*as&N@HXD}7}=;uiJcJ=};@X4o_yG`2{YO;W$xYI*V5=W&DT4qc5pOx!x zYUh7_%;X0+?DOp7I2eT~9YD<1!G}dVQNhFM7c!)o54-7*T{uH^2qBOa|9sHDo?M(2 zhq}Ac-ku7CjV?_UsSqzKomkcYDYwmP>RLTscY6i;QqBPNsPTHmXGJpFjQMX+x6mmp zZ%!YHm|FTzg1yjU_LB*oe;4F`Rp$SAB1HKz_8|;N=g6S%0)g|QnmrkR2%&*+8NUU~ zlCniWZM5;iZhO8SUY@f;D3b@BiZyH{=t#KkHT;iy{~xdV-+ttX>mWjrlM4j`Oq_V2 z0rq13_3t`BzwzTWj%McY?KQwXFKd6gJL)C0bpn#8Eo=S{GXGx_*Z=+`6aOV!0Dmez zAHj(g8U`NKNhM$Q)a)_i`Ju1%VnW6S$V+kpBE=4k-Z}mFPr~89Zs`B^q)a~Z$gfx_ z2PjuDoVxk_SW>{%YVw8w06s?v{y$RE|9MDiDPGCl&W34-yS@F7n*RUrqdB7Q50662 z0WIv9-5mfq?tb-0OGq~Ce}|6%M`vGXb#gY{W&q&59ue70%X zKmCBOvq>LmmfT+aU!eB?_PK$Bl%5Cxj$^GBT0LC39Jgh!Us%Bl_zr7yU0lt^PmWpC+zj=h@k& z_j1JR!NGZ)qCCahx~RG)$x*c4xqRngnz&-@Ki-=-i>F2GH7uO zp_71W{35f&eUp{(?^lVD|5_aY zQq5zZ(8n-$h6Xg(8P}T44`+j1f+Yx<`Fd-M8tmsgTZ0OweVl*pM~1n$eLVB<^Z_fo z>orDjGo#FL+ifC=mQ)%s=QlHNueMYzf*5wYGS0=XN;$my7PW)dFOdYmGLiop2+M9% z)6kn9W|cgM90m*)6^np;1?0`NT$*K9Ws@v>*u>E|NhG}%tqTd7r zHSE#JIX(dV`kPl)j>DXZgxq$S&x7BOEu&ijVD*F0UvuOa9_KWP{_M#|w~hHU=NYXd z09o9?2j~fwfC%jUlxX!xT_Wwv0U86~(@&$D=eY;|MXU#WC)0~>hSBcTiabw80WSZt z&yib0Cpo5G2351^ZFa1NpMb;dbwR-^eV3ukSjsmM)@rIl_0`NNCgevlTdi zTZ0|vEH4>DE5JkaUw6SvjFGtPme3n|1^&x8APhOhr~U=n9-vrf?R_<8wgku}j?g3? z>IRvbr*M=ymB8gsqdrd?%bw?Ql61p0C4V&I>0hUuR_1|Z8VDOOJEp3aKvBMDR!h@7qNn90jqxn z5&*FRx}y;OuGPaCKyl2@tV@aZ@G@Av)ZL3d$~!H9sIx#U%IkACnK7_{tMi5Rdg<7E z_Hu8sprtG&z6+Ia$RHfZJ(#nu1wdM$m-N~kZXoYq3CKX07wZ!^8*Wp_RHfQFd>J7y zspT(rezH3PYuP%U0{7<^eEbr9Maz0c!4@UsFs(}d%}(_F+gLomc8XFO)ahk*@l8GZ zmlF#Gt6i*rdPzkqts1W(>kJ5YZ=Vv0U4H+JB;*?L89hv8x0ra>(EV0s_dQ)wNBHc@ z>XE?3C(;8Sne1ZQ6%UP{v>fk$L>qYi;&*s>W3&A%;CRji4BpOXqw`dYrS}It%IP=N zgG`RVwbJ;~xoX`AddWY28M+haUZNPf9qwO<&V#dq3^fsat6yQ}(^Z_hoM-iRj#|#; z4VbxsGmSZD;CAK&7!P=(qS@yKUeNA<+vC8E8r$CRcLI*&1>XLjUv7@z`}qH z@3;tTcpkm1N|avc)aAA-ZH7)ow^{l%QhN|>AW~})aN*FSzN>Dj`$)DXIp5SntZc2n zzCQL3x0Vr5YvVg&JHPUZVy>Fk{JXXThs? z_J`_gRk23KhDElj@pfg9{XP8~?vwJ%7pT3chPDM2Gjv!u^0(lWdB^G(RgK`e)^QHS89pxH zp#i2Tg*QAI!^q8Qf37bb?G+=NPPQxyv3_PvlW; zI86>8ZI{(EaT@tdA2miVQXeI!+Bj7#Iz=zsJqiBsrHbaNo`V&jl}o+u7*#kGY^xiY zXJjtSri5BU3eq$OXoIvK`DcVWf7)L%Ja#bFFjbnx4*|E-#X3#>##|^yyG1WYFh|S= zK4KRP79{Nki0}ZmkzR|5A;b>pVCIaq1Bm;^r^kD0iAb9L1RWb%q`|i^-mNe{u_)em z>+!o^oXq+?P*S*WC!0NRQjorg4HtZ#AH9+qxlfmY^)IYE*wW~ZzeSQfx04X#lq}3J ztZA3STXw+}7}VXPRl5Z}Z|qiRznU?&xbOozaLYP#FVGA=q7MsSY8*bCY>NY^xV(@b z{aoqd;7B%GGobxozV(9N%Gu?if(@QVC_Y&Y!b4&uo~HEv z-NlU+bc#5AI|}lu5Bv>gIpGra3GDrfdtUMd?0|fME{n+}2YB_XuTue&QnF{^%E_0$ zkG;)(KI}S9iFlPC`3ku_k3ClCM_t$f@t?ty@#Xqz!op3U(kc8gv$NKhw~r zHoJ(EOg-=b%oSXC+QGlY-vwRk%p}h{0rMx9mp}why&@tO%`8+-%c;UoGWTk5C%O0} zS%rygF;o@e=jYFJ&8RmtVayM^{8`rlz-*&6WFnO!1ThTZ4E|MfAr`ins-jp-R3?@% zdfamE^)eqhtO!!;>zj7lqwQ+fx#mSZCY0q3*FVdD;(%M-#>J-nmPCZy2sOkF<1V1- z1Q4`W#KEyjig=rCYbI(5Xm~j?kP;gV%_ndO3!$UK!usx#lLZv-u2JW`e)acn{`GB@ zR*X!)h_D1iVrr$tQ5eB541X?fsP;0$_%6dC6tvCs7I5>1-%%vYus@tUe2o-H- zrq}GE_L-{h0ih;%`iwv)KpIwQKk#=svKpQ$v$DCNof(X2wzWQiTPJb zmgn2U#dvX*s~M+(Pu&OXnz zG1v-x`xY|CN{!F&&LPY>ZEoOs8t7gR!wQcil&QQGg&1Fjs&MVKhuP^)iB*&1tN0qb zU~4dup7T>}5wS{}xv>-b}ELX2nr z);Qd}!=ztgh2m$r&$dqsPQ~1x(YFe_0#r$ie1-9utGFdwHW5eGIc3Gce_RIMVP0~vc=3G|Eo=-?%)-acx-}!FA zC`qMeWMnKyUNT~(S1RM}OH>(>aS0E<`Aml%=zg)g7AO1KC-X|R$-!iQuBL!O>E{Zt zyVW&iKqF?shOKVqdN9MNjDToNx&|Yq%<|BG)L4wq{DpwS{1d(3^s#9W_C_Jn6_EHf zA6pa?&@z$O+h>OS7^-oZ~dq^d@!N&*K>e_-)#W9?xc_5V|Y4WL;c`-JJR&& zNB28$z>o9p2oqZ(9_i@P0DFafA^jl(CZ6Q>n_?6NudvVu#h@QUqk@pth^7T=NVDFV z(UIv)uxR^(C8dg*X9;|rU`y&l_%_!d0kwspq2c~5dZe-bs#LxR?=~`!E0KZZ~XchpC+P+==J|p8A$=Ya{rL9-mW^i`O-#9-=_jM2cLJl=$*)@zp75h{}Q> zsT5zZw?YF?e`Y;aX|!7TXtS#I4U2TzqOR`&sG+rd1sfI+53xtzFeyaWzV!3#?{*lGF-W;(E<7fg?u0 zI2)Yl^G*V78K09rzUFP&ECshn!P`^kqXZOTP)Zbns z(WgsAXOPt7ZA~)1M*%zc3Ez*c2MD^eeHIY zUA>u);I1rGJrEJwfj}FUzU3asn$ldnA{JxC!}3onivOu#&D;J|-cV)Fv{%14Mb!l^MfXg|Wm9McAHaWuBnrlFsrA^) zYiw^2>oYLpzJWG=9rr*DR3Seh1`2eu^Dxan#xut2J25GY?Hib7Nh4ef8@8x+jVxx55Xkgx_HredL1LF zK(j1x#u=lID32G*5jzC8rH&{ueco$kN<%UP5f8Cp*P#gXe}0d`KX_I-_On1_4r_<= z9%x{uZ@rMWe470CD>i&~pXDLVha`8zqe~Pa=d?V=djekAy(8N;g$Ia&gSkWB;wNCW z`+0irCKVklK|ZLj>%SPvUhO>rnR#lvHUYC&-4Ua!J>j^n+E}9tNmie{{mp(Q)&9PC zGtdBLdIDVbac>!M3dOMXmr~pOOY^6lPQN^LA~6^4fNl333Wk7XV|Hh|53p3F(&;?k%Tm~Vm}?ISUB8{874t(D3j}0g3xBRXM_h3~ z#NNFk6u!%Tmd^}r0SWb;D9Az+`{zM8Q%+;{CEVyU(&BU zoWfZXn=f>v-DsCZQ3!N4!h+C9%hhQpp8;P+iMmM+D*7j(5ntcJ4JkV4(`}&oxrECG z@+y*saNKZv@W8O4^sBN2pgVEIe03@mpge`&l27B#Vu3?d(z^OHr-p;>qBt^CsZ9ho z5tqztYO>CT!aSTg6c`f%#;66K8u77Vdv<|Q2srwI<8TpN>KSYo9tr#txxKF=E|SP9 zKIE?Dd{p3F`VxMwKI>l}k$>>hr6&v<7J3~={VU515+@@%^yxZvIV0~AZhE~XQ=o2AmEDAmFedm!uu2+qB!Q8F1N)o2{nzOA_ z&ZPlLs49+v5`w{##-6sc^T4>tkb#hT=MMU)f%>N>BPtc1?aO);Z=uS%)9xOS*u7y| z@TYRacPbVcPRrCmJVz};#0Jeg7Op)R-$`1)7zBXCO-pIaL zsh}rYMaKpNHf*-F1$9VsnG2h%C}jBABQam2RO3ly5 zr8>*$Li6!#5_$~bblN88ShUV{a%2d5NxzpE_i57m?e2O7vU4jw&zs8S%RQWMUckiu zx$B3=_0fk*gNzTK3z4&)oI)G|IJ-NO8-dYRM%R$+5D^*}o6t27KsAVJte2Af<#5XL z*#9x(X%U8+I5$$FL_eS(Aa%bI)%$ei6w9kb*6}ufGrt0&krKF|arDoy}7_hVFC_!y4hB;fIfbxY0lwCmLr8PjWT8@BWA2E$-oWm0QPG z>dbG|+vdLWW>ldIIn5>g#`$x>=3JtYSbnsk;J8q$E(f~aFh~4ymNu`DPG2B7EMiSV zL(_lArYOSp)NyDdEXfwryyY2-HlV8cQ?K3IYv4O|bg{$na%-(&7o2#bc9R3uT8fjI z375!L7HZ+9P%>iB^pJKSLb1mD#W5^+Jj;h0KFb)myu&v0&dF7Y5g2HYOc;&1MGDQx zKa+JPlgmPswG{E=tLvu)0q5=TJRO?iMI$2~Mk-+>Q>R z^d%b|Uu=vI_L_tjNV)YmjM_9tc)d`YrPHPPnWyxlv$S!I*=&;8imJDlr^~G#nCfjB z4aGyg;45GiUf5-dx9iZ$7&j=CFM`ku#66a_NG65B>8LpvnWh9vx6<4X1Tz<-n9HN z0Z+~wFak}joENK=6uX@0zE(z(6?`sYo_Wq>s&o7n*#Digk|locS#UtB0#$FWIa+=s zxkO57)+TUlJ>Pn7tLAF-WN2m-$KL&fz2vVj=W2w-Y-msP9gdOZpxH)XOlvQ7 zjO+!?_FJc0<(}D<`{p-1oDk=2Lq2@!VP1tjdaSZ&A5XAtSNdG)YwcL8uY zVbL#mJ05G3DTkjV(Wa`}RnB$$sxS=9D!*5aaO^JDd(U&$$rBQ`u0vRmFFlBd-@-mf`V@ z7pUbZx;hbu+KmRJ6Pe_IR+s8%qb9dsAhn`T}H@Z~7;Rx3* z)s_AT7NFslW0g_Qm*5Y!%U>u}rZ*gm5QB|hS-j4gxk{!XTcv{5hxU^-My@j~ z84KnskWW_zXAV5vo=YO~2RoI?2YR8OW_E6xgL$CNaPF0qSzBdEL=CXW4QZ@yk|M;sWXbjX$dC{d&!>-GF2p{7mujs1zkS`!V%{nSY~%p?6{B(80|6~!lagwZw7liu5FU@UYz66ou5jY+SrZp zWY3h${@$NS_M8hUpIl|omAk{_6A;#?e{|Ni) zpt#;_+aL)R+#N!22=1=Iy>ZvzZo%DMg1c*QcW>N-h2ZY)@BC)&yt#AdzIlIjoob5e z`p&m)t+n?qwevQBL0*nF@?1cwA6vV;B&a-~d1}!DGRE<0r3ioI<2+ejS6a)IHgn>L zTX&sOb`Mn2NypWjZ$7~FlYnhK_q;P%`R=0WInvdTCqHFSx-c+HtwaqT%FAtH?SbK zYt9gos&OzeiB?T6ZbzYu3A(w4Pw!@2y?CjUr!yrf;h&%pN?TXB_@r8PvWvF+{w%nV z`EMuwPt<_KkHi;y6bPX2Hle*MpyD7u`vck=+MtXQ=|Q>ZC*)pgkQ9QSRFhlGtUh%- z#k3^<(n97vtx36d*z3{s4;#h6$N9oP=&YqGlHjy95)eLnDEwsvqMB-n3BEEjCRls9 zaa^^2&~^RSuo5>a15(*X0>QoI22goHHDfL*ExL}rLdgu)7y~b)uA8n8Xl3T*35_3a z{+z6fa#zy3gvoCka-Ogq#nGZ-5G@^>@FK9CRBpe}=|rG96DVJe5>P@jpyX1yCY|34cFNC_2S$)-6&LN{u3}76pFhcR96*=E>tyN0Uv%!?N9P75r3i z@-PqEP?SLf6@`USXEJm>K?Lp|CgPrKOZ`IKm`7ZK zjecOUZXUneDZtLDnRoj_BmyJAaLx>6o&v>iE#3Su5_fugdsTcg#wG1g9LWL|T}?>p z#KcN^A+bt^HwhUIq3t_?616BoSi528l&O*?^f@IUHMRQDRJDm|oKP?F!9?%x09Q8$ zkOBtMtanp30EOq@QLuk}bk73SPy4k*TJrw1S5qz@_V;x7_nHy}ty5tnqcLeq%;Kou z5v<(}WvZxeZ?#nFSMZ&@2c*)>5h-)aVfkD$u-a$Bq<+GyB)B^|ITTp?I?uZmKxLq` zvTceD29z)Euf`X~)$(m8buE9fUNl>qG7lzo8AJh&Y5fNjdLZlK$v}RGxRjACi7u7!({_c8G$9c*wEr z9}qDAB~(~Ezz|(mNst^oeNHAIV@nwG_3lYlRTb(24krh(;#&L{2Mf!iFA4>$m|ByK zj+Sag+7Qf(ZktObya|MV5?L-hgCwvD*jBk6G8IvjsvT$MGjF?o3X54Zy!A|#4v!Xo zG|xE%gTA2ZECcBL67CShWZwK^>p8d;ccKuJR+W<+4;M~}8zU~?mL$X=i4zu-=DVLl zS=1%MG(H9i328OLska#c0AX7QHk%`UIxr#m5JE)|5bkRR#yhVMl=F5yU(vki!;LiB^gVAttVx zVK?uxfc3{4Fbycs5r)6rwh#-KEi#@&K_P8JH}|9hyZolRqn)Yq)w8P?VtYxI|CObj zp}3jCfx`HI?ekz1Qv90-{q%DW^NKhS?VGFTsY^!3wZve5+>_es>ExqMPaG`h?S#7; z{DVGiz?tvcD1vmqlw?bmr3_*)QhpKvR{m*DPdgqjoHZe%dJq)v`C@jW*>QEar-`Z; z8q(3m*cTkt;7OZ>ISqEL#~qzE>nHW;)#I4d`pX>~r-V0Br=cKMdQ!0&1sa;!F6^YI zeW=;_gGMRiuc%IVY!(=nU?K70s6Yy%?=rzefsbfoIKfcxGT)uKV82EOV`G>GmaR0= zZxGfQhixu9R!l{mo$moPbzP|*>2*dqHnJu?0%+^KZ=8&Y71Dv5BIJ4l&5w(FVxQ;S zpT3&7x`CW%Mt>HMm+C;j1Os{crIChsTlrCLPz;ej)5qQ$j=sJ=*=i}{n0<}UI3YRv z=8xg&TnI!PTVR)Y3_L;@N=(%y-qGEBCyPmS3PrK|k&p1z;)=Hv*WV6!3?;PAJt&n0 zj_zdB6d@NJ^9JvATNNtE$fY7gN*z^{=eg9XT}-<9`&dfcuB=)`(4ylf6-=Z&f|j@i7P$e;nYNXSK;G#hz9#eJXP(}eRy zAS`C$%qc|j+8#cN8Ct7_IL#VUu|~f7z4K4%?(UnG%VO;k5AgR_QPo2)JBR!LR^gr# z1)@eN(Ebr^v*g8rR+dw;0~Yk>_PhsX^&>FIvic#On7?NTjAkK|D%`}5%;a{?v+a6O zEtU6EF-b-~sn%|ZXSe#5qwVKILVwVx{je8dM1tqX8{$X+)`boDhJ}T0%_mq9!trF~Ho^fABt? z-Mv`9{`F0S2b;KQ;Z-D`?W;YC* z)wO!R&TL%eU6OK7>YY9oc=`I<0dkWYwT6LDDFCmaI1*2;gI0PB|8S2WY-hXLtQa>3 zr2L{O#1G3Zr>o}W%w-RW^hO^~`YH7cOCps1?prR+Yp7Su}5cClZL*H<-!&gp*^rD?_q~4g&Rw11DMn5&mozg>NBl`eD2pN zmrYi31Ffzs^hvqKaA3to=FGK@q$(m#t2D~8eyb#!sp%wXI010edSje+sRma$Ej2BC z(#yWcjeEBg=iXvPVMo6BYz-UjJ_NSr@|88bXD3|YIDV=z+Ue(v)wL<jHgD7DnRlyhL0A6~K;73TNLEKz;fjrAv#NJ82*c~wIH0%jZ7*!Rx ze}Rb#!EY`=fk2!Y73eNfXmCB#z3CM!H#0D4@m}(a#a@m@k~tUd{}D(Nc$Cg&nf!?- zmp*XZk&+-^k!b`cUgXKLQH{jkQT@UF^A2sc3e+<(mhSb@qP$NOhZb)>8J&Bb z>G)h;bd^q9E8m@SF**)1FM1!Nw>x2PcbjrZ^(Al1oP8=8KRIOt zO(-IHc4Gj++$bADrsBJ?Zg`ST)oJ7NehPbc+x(CQ4M@c~KPV!dBfV)$h(4; zvqD#{f&Wo7$#d*2#AeB`oLubjW8=%pp1<|eVCEEkvK`qVtL-gu-AruLhxfV8M++@4 zObF{(pp|>xwUM8ukDR+jlBPqgncWNN(#Te979G}d8@*s1ZCV8d zI}>2*T$9dQ5PZwmDQ8f2(-0co;O|>yFdV?S^a_*cj?toF85jLFE!7@L_BOb|Tj{jl zBNZ?rzWP%ug)QaL-tl#J^sUhN zV5ZdRMenf}mEl?0bfh9-q)Wm;YH&S=&B?-8)3%Bwr2mg>x6<_IKM z0m)+ibwN~FPBP9mt??Ly*<@o2IvHLc(00L)=VsxN+_Pz|4`Cda~MZ-Q{gC*VU|wa2wch%p@i z>tqgfi>>^{Ql$uyZAcOGc-+$Iw7V&Kv1w7qKn*&MxJ4gu8yX?_%rwFFrD{d+p*_R$7u)gfkFnsE749s+>EgNrY5Sgy7Ju#7+M(QIs)NR! zO>3B)H#--bC41qnS%UT?+hAWKKL)K9FTMc;)Go7|>cW+!E8bU}gKVEy4U-o@aj*{v zE=lMV?CJrobty5}zFp7{(nTX@mHRJ%djZg|i_I`2oDrg-<#`uR1u0HUd+sC{bzIy$ z0jiI=_Ky}y-!H_SJO^0546A6CVn-mdn$vRMd{<`Yf7pzAQxgB1k1mD)vIRcGd@8Sh z6MjHsllm%X-a}yK)^0}11pU6pCX+%JbmAE{^QtR{bph-!W!C zgW7`ANhO|?v^n+Hwbn*)^cr}@+u9_mZ+GnTO$}?mi{km(l+lokTAQ+~%&(xA!wH_v(Mg03OWb`f*Z|;v`TPF*mMb&}+M3a1dTEj+-$)kgW!5sy zhBD2}s2`|mRoaRMP)&7G?{ukp1r?Y*m{4Y4F7ED{*dW-bV~tRX5D#EMFy)}~WLa}~ zch=G}w60L7i)}!i8ZHP$PK#nU<+DoJXuTrtCImU7`uhBUsW?RVY=zYF3&PJ5$d74Y zgf+LvQWJ7qHpc$c8Lc$O7$orwzJu3Nxa?^*h!pgN^s_orjd;`qWJzQ}XwZJhpP4Em z2azA$rUQQBb&G~bio%8$O8;11?R7^<;(EjddFv5c8QI|y(ee3B0cMIpNo%Jup5geqS8%s4~&JF@IX4!0D#V-<2;kH?I zs~&P8Tej!eDEsM@|KUx^@sk%7rGT{FoIMVzdqG1!yNOG&oP{5Qrk zU!@A#zSYB)y)4J1foq&yMmL-HM5krR+>Ze$w<$;ZHi3*AnuWMmVsj^l4{J4FSSWRF z#%nyCJee%DX8tQf%M0;EDa#AVPQ?1Rnz9%L!WQJ^i6r)$UG%FPo5MZf50FQ@FNe9s zr@52d4U<9Xw#FIp*B;NS5@J9tpc6%*3_80b0`2_33X2!I8sRB_99L-dzQj1m=1HHh zS{F52{;KLKDHc|GL7Z^BOg*(h4t`mq;%>5~%v`-E&NQwSL30s8@A`w-Zo#;v);o%j zKmWAz^)X+Qtx)Mb`4`Vf)!iMr`n?$3!Ou;12}N?UL5J)GMlzypBX7yilW55~1GclJ zQ?!|@Rg|43R!g;o@W?R2ND`o`-T+d9_rm1gAeF6d$#JtIz7aF9+N`yT{RJRcbOPap zebZQ+0(NtNQbGm+`-{ppUgZR|Fe-m^F!S%{{WJBLCD(g6$VB#v#^Bm`+JM$X#ReF6 zp+oca&W`VX_AiglVp%iLG)6jZlDN+fC!F}XA(x(t zD76&#fcL^Ag5OW{X3ce-dXt#ZA1#4jpk{`U0W_r+3wdGBit_!ucVKdI@*?)TWU!+V zP!G~LnNDUUW7h*Mb_$|Z67LO}dT<6&o}vS3njtp{RQiGC^OX{yY_Ho?Wn>}FfUWfR>iug&5z;re*a*wA4%%spclV&MW=C^g3y(^S4Huy_zs0dvf<`b(H=c?%pKv-jB zP^FlA|ik?`u+-OPFPST6hK#|Ynlq^jViLvGWmQSz?5~39g=;J z7A2b0MFcsyUe{Pk9*U>GIWq`eO7t()+QbvGLQgb9xzXTT?awkfeAOB- zsN$n?!za4;XA5tKmSwl&j9P}DRLLAz2~$4Rj4*AB`IKEBS}zjE3{BQd<2)kOMzT}g zH#1Y23iVJ_il~e0P`r7na|Us?8g#6t_ANk&9lOk15byu*45a=q}T z)_~fq8)}E5!YbH5PBmoa!K-8bWol)A;p`W&4)J4P(w%}N^C*-UMF|3FcB)_VOpBvg z*&xH?HK&00^Dprt;Y^J>QxNTT+)yg+B)Q(rl7<$yPKd{xR%Y}GF#FjEAr}^tp#%;G z5&k_1TCS}))Ipi`N@Km}gF_*nDX-}&4DJzNG9W2a?zPaaTS;4IBK`a;E+Q6hj?<&s zUwAcaqgTMXlaix%ThXy0rop#>5{eR!-6}=KzdUV(q6Oz7Ud*q z1Ep*Z9YH{}G-$-_!G(6CnJ_{N;w zPED->QjevHi!w0ZEMBqe>=eo~Zhmxf8t#JTkvT>%VXgEM<=2!tOyf9 zZAdO8gGCPOneO_Xg`o2nG;a;95M(y@+G+(eVi^`QltTiExA%D`^hA+%O`5AjsNuc z#Ze!x7Riy#8wB6=n$|YJ3%=vz&9KQv%zIL+RyZW!lGStJEI$XDpq!4jC8c)v} z1lAF|97C#zxr9evW|f!Q-9G_%mE~ln(=}zrd`K1}Df#=iZ}`NBVBW2vI&QobpjWI! zcvWnNQaC-AKqb~@y|YqR>JN-hVB~C>fZ{wV{*VwfqyhYET1Q}W&)yhNhe>~Rdp1z8 z5)S2ThZgct_~7hI;Iz^E9+Q0%GmMJ;aa$4}nV7#IHWsCj8@d+%u~=lSMQd_AodZPZ zde1H7PUS9CNkaoAgm|dO7|1BJ9}%bz^tkArLVFDe)QYKnZR!^ z2}2IP!e($;#pSprhSxEh%mTri;BaU!!kQa>rW!Qq+9Vsa4-2WMhyDB+`u23Ke04zD zib<%O5IXC8y^u#{qQ!%HZmY$whE64O#)0#&faqEFZce~-slq9da1 zo=wdC60~UPehEPv3;)EW+ojcZ1yZK>?ig-w2jXNjpifZC?Z3%`&ZI1(&+0lqCcwZj z_IMS(w|(B-7{B_#;291!N)c`VFClba>d+1Z%TfeJ~!;*UZ&(+BRNO#$tW+_JvpW7$8zDie5oV9~Pi zY@}RnqpwN;Je_Hha19;&4)!Z-P%!;m*m*p<0sQ5;bg|h0N-fmJsvr?Fp6aInoP0#u zF+dA$^a5%`g7s~7NfUVwISH`q)SvJsN`YAflSRGT3Zk8V6O923l?d!UHkNS7_uvmY zt$#(){|-0wD??vDi?;3I^U3I>Tk(mI*nfJgSCylQr6xzzbIn51`_2su`g)ebM^5I6;cw!q|wZ1<^nn4A%?YlojsfB_&x(xleVvw+7OMAe*3E8P z5I0(52Ic=iLEFE+>!vXeF%so?=zKiq_Nk!Z9+^QM3L%jiazuO+7AJoauEq$l=5@bDhwQ)F@Hoy==axAhjIrJhK++{9g;uS5i6Rc3 zMg#`iiOjxs*u=KxdwERw6$faK4qV2j)tP3_QwyG%&!j8uLmJj zVVYmNL6}5@5t1MI96o26-VV66t5UE;Stxh2XBAhkq6>p~32p7AQO>dafV9C~Ypz}! zKu~37$)}+qPzujSY#e0bp&^J#6-pFHd%wy6e+MBTAaDo_3uziC%=lk)WdA%%6iV1% zb#j~iL1sX5lhZDym+6M>^v;H7 zl+0(Mg~l97PLtY|k>&aRqo`Nl_?DW9OmjloU=Q}Qv~c=wYO#aL&n-z6;y07I<-AqM zC9Jfu&ZY5D4v&<@9Azey3Z<h{M<90R;J%yh*kZY@rg{Ltiw%zQfrB&F7bsELS5Sy6J>~TjwWc60AS8_gwZUKfx-LyuzOh12sMAI*TgIN0*wUjhCi{)E zF&xjH`bqQ@S>`K)ynt}I+&UxC?RSAMOxMc?>NGef7ZO>4ru7r@gtW$CvG7lsshmm^~W~#6+fK0!71yF813DRAIYDBHRgL`yg`MKh0P034O`5 zQ#CN&@xJl=t9;39eZGucZ7@!4?)C=K;(K9Z3yLYeP4B2bvAF{&@0RjZ#2=IFy@$>D zxVDW{yNp?@rJ1Az+-Omo2(2T?KIWge%BZ1?Uz8;CAj+Pp1YVj+mGbiSlQJuRmK1#; zRM|Cb#aHV3k9X=XK;)k{?60TaB(cBJg_S6fQ1w539rvvdWYnxNq`OTd^MWtKOi2!R z{Kh7QC0+cnTxMr9Hr}ERPZpv*wy8{x>x88o`@qhQXX1CbOp$QU`OsYI2)ltRU70ZK z3wHkCHUx@1*i?SJSwr}T`y5e>a}Yr(+{S6>k;4k_z(j?i?Ia7oz|=Z;)wcT4YIF2z zV5VFp(Dcb}r$xfJ6rn#(j;U2#& zX)NO!lbWBvcZzgiWfjE;6&Z<8b-M(ylz0`tiQPRqYBDKObZsX)W=MWD#p=ErJLE*p zB;cSmlD@iaZ35}nZVm8}wr)*VI=JAcT5J{}r~m^}oEAcI@npYKOaANG{(qnDKl-sn9{DcWI$GQVPH2k+-8MQ6wSt*Att=)YPu~eB1&$@^r6}0cy+r`)3YB zC>2h&Se1IAsNMB|#r-~Vv;FhJHtwYpdKGD`4n<+qPd2|jL_uHA^2vT6-q^K~;k}M8Gy*}*I>B*x2 z^Hrp$Bkdh~2jq+SW($F9_V+PYmmJ}WE}h=`XX655$^@qZ+_o{{OZ&wx57u|I1tRkn zA83VperLF^R$284qxRRqJyn?7JiW0pU8|N0)29%s-NIiaU@j9>goFaO?2I?(kvHKFyirlJmgD_^(6_=on3+0e$D@{?zgBko$j6nf~cV zyTb*cjl@X8yr5GIaz_*;2{A&?b%@I+MFW~FjblUyhc~h_D4gl~jm!I8!e!coPp3+0 z?-C7_M`v&|(aJQFCkmFkrO$#WPew#$SFm#A2=FGS|6mK-C7Bs27BW4-9Ri&&N!sT7 z>m1T0=hh?=e!q;r7Hx)SG$62LxLWKK9Ls$BcK0+bAxqTZA|Hn>sBW&xOopkR88659 z!Sr@r<7&!SGHRk1IF4I%#6Ta{tUr&Dvzl)3SGOP+Qe&W-n?Y;HpKX zYL4}`P#7bYpBzygw*XnAanNzW4*6oFdAX?oV`#y#gs&3%ZhnU3(Jv_^Lj!HMf$J8= z-5IZnJYT1gW{9-XGAxqS{0E%haSs`oGgjniX(UU3NZ0Aa92fJjVO@&v9g{4URi6(_!-L%1Cp1)~}DOm~(*p{$*j88IS4YMRfx0}+< z%H?tMNMX8Qd9GvU^E zvcbF}5!zCb8Op>sK0CETmxjgMxk-;bD8)q4Tw{i!*qjid{Azci@9SK4pOWgcK@;9n zkMsmu;=X?Nc?$$Nqx|@aeS>Alkg3LAZ#Y5VHPg|=R|?l9OcK0~BW6tE&IsKsmwuOR zFV%WsJbv`srE-Nz9?ab98+r+s3cIA41cg-o=2xrev|}f;89lpSP=|wHP0lVR_Pt7@ zfTx*voeVmDpU^{S`@J65+$lMYH|Rm=7#*$2u0)1&D@VWkWwn%?&fumAW0qt*F_@FA zIgS4&-1yi2@Bi?Gh68z8V}Pb!oW<^X_LD}sE)2#z|7M5xvFU1kb~~FH&bcOdusn+| zY3)MKHF#zy%2C-+RnNV}32Pa(m$dZbLZLB*^G8W#7xiJ%Uz5FMYA^WPyjsasS((Hw&C*jr@R)P7}k;^~@ zy>FsQ34A_iV8m3u);<(!QWdb(bCPbI4b5S6HIXB z>#QaN6eheb6VLZaS1x9d$&Hm2Q}y@5Y)EYC;YyBO!K|YqWbAd!DCi#go!v+`ZjM=) zBN^epH>ctlQG6`qIYrgDj7hC{p7`7+$u%Fu?aL-Njx(0pJANcR;>;E9rUrd)!qgN;{9Md|d-v;SoEC%9+ha?jg*LHj?xP`S+cF0~ zIK@Vk zdyOx>)_NNu{?FY)Ce+In&(yRUFkI*w%(e{Jrvn>9; z*Ows+S#jp1;7w!^iHc9DN(aUb@8Qh*BqKHvgs-_YEz4=9HX>Y)536k54%S03Ygkjk z>aRCla??ThSTi#2BHl(s9mviVg%vV8;W9z(h|NTSp#ffvfg^gV%t_=yZ)OgIcb5M1 zYE-!Mrt!)7e$9zTA$->`<=@s!YNOao%!M8-@IngP*m6F-fcpt-6TO|hCK^i<#I)s{ zFIPgkL{f9#GKm@yM8Thn9x1wTK0Zwaaom~zFe6^m?Q_!;2yJHrgb6`9}I zSy53iqQV`Oay9QO!iqQ4=Q7qh8}X!-1*iO=K4STsl%hRVoe0Sp2P|3%vv36|DkNJZ ze4Fs&Y+AD7uUYC2ph#U(C(81*hB zGO;4#ek#XdKnYP|swqRJJ!GZXoDAp5t-p4|Ie{|)5k=%Aj#4xVw~WG3f1AZc5JJKf zys->%=Jg87d_>bstW9dp*N9$YN+=W>(;W1JlnWbuchLS5PUpSAGaMJ<-uJ+u< ztcukSZ6kXx5)`8Dh7ZgI1*-tQEKU(uxEGtIkT;v0I1-qZ23&`Q550EDMw>><7?LXY zJ>zD!GhM2f>~+t&g%@nh7FS|;1B8yl*f-5v!6KSbr3T-7CQjeXI$+LdbO^d5cwp+>fgrD{Ac@@2!(~s zrGbdl+^3JgOUy5CA{H%SdYrZOS9+-Gg054ph~GG_ABpXXBfQ(j>;+n~vgSws(0ek^07=X)5*qpwECt>>@a zP_mbS&f4y-3y%MSi)n`TUbw-lFG;tBP>!WhuOMbIiv#pBb8^}gUvTZZ<${UMQlBLL zR_S$x=>qtHLI+J)=Uf>Z$kg#v!tJX8%v`Vr7nK0LXJyGJd6m1J?6(7S{71-s|~VlERt!h#{-=T)mSth>YA^pN5sHrLPOlp>{lnR0fglw~0%i1pJJLM{!PPW3(6250ME0TnTMQ_XyIps<)p9b-I zUk19stVLg<8zOS;SLh5mQ5ki-+)CcG6iK8x?H`X^VLMYY?W*`ee6tM zG|tjY#taKLX^L$uvPNJdm+~71Ic^HIT9bciFsPNSz(GC{rOho?jJr<6-WG1u-C;@a zp@}G)n@s;AdLU(hwAfNDk9(-iRURc16zdwoHMX^@%wZlT^gsg!87xPMv}Q(vwMjvmMj^W1GFd_d0sWX2$2wt(J<|&lZDeLPXjW#aVF&0?QH8(Mk(Oo$OWv1Lk z4&>!EXp$sZ(uyHD-V(et!}vuJ7oGn@C7dd;{=E{v&-Vz-$U|(o>bc%dlliiTicZJJ z!ww0yr0uE5iHgo7^}sC;e=gRX`Mjvis^N$eeu@`Xsx*G^RiRrW?0aVUw9*l<;c_w| z+-zH1Qw34|#WrGLnkqbvWoR`P;YiLfeM-^C6;!EgHn^O*3aR-vDfYvr`;X4$hH!UH z7yXFK zGK|=0sakH_Ui#O5c%?TjCr#p8n^7It@%x=0Nyntg54#c8->t*2@H%I*-J0?}{v zdNnd1!)bg|BqoikMC-jYC#zA9&VoyV{hDkF-9~AY2Y+mpr)pepXNl3r5F{qxed(JI83ZZpK+PNRlk!C_cJv6kTOwJi|%D4w4P^s#m zJ~t}?Vm}Y38WwZ#Ndeynfn`p74vHkqku2~DcN8u<{!du_Bo?&~n5^o|BDiV~UJj8% zchzgjM}un#7T`=K3kcw{sb$PJtq3F2uqnFc)tytY4X|hwYS1$Os@MHC$}4J zS)zX>{uY!wHdg4a+hJLfJdMN{+-{;-oy6wc-grWE;OY2)0?8~-5rL*&0wqT=UaC-# zrR`JX+%KH>*Xw8kUPox@h22g)0s8;cRQ-pt3dn;=i2j<*=EjP{vaR zP^zibm;2HYBLb0DB3Q|cQs!-ynXOb1CPSAtN0TiU7izg?K72Oz_9RngF-h9zR8mE} zvRizJ6qtAOVW4nB_6oITGcn(}IyNY}Q%%lGvnD)w+Vr&X8r56`Zx5n;(Ct@a%(=z5 zw5D*-+Rm$O7e+2x1H<)~wVL24mSBmwpgKl_JrmU@2U7vIQR%ianYn0%@3M&2`-M7GUy|^hKBUt6a?4owfcf%LEK+F;7@O#b(k-}BYC?J_)(#t#%yd|9kcYK~ep z8*T<}%+w6%yf1cJU3an=PJt>JS?zV?A8v9I<^GR8&cOB%i|yy8e*^bF8$+9BWr!{k zsbhswYMQ0}*Q9%%%+`WM6vlbHYPKyGi}L znavC}tpObAzFfOjur6)FlJKSeJZ&J4XZ3fa<=@2^g=Pbve_dNgLWIE7;U-KX1*(Ti z-M|+XOIpJ#U?LH#1wZ{xm=9TSr4{nS%?!ldlDcIfGJ%>=xPkP(Ubhr0CFs5LBkuc5 za&3ZA{;emc;_3{}gE^F2{{@*wH(>=!0XjdNYj)~ugTu`8Vnmsp-!Su^>{*w<+xFW}P__gPJrxt7z@@o)ht79(6BVJ2=ks~j+KL{R=|&<~dNdM7x^#j*OkqW8VjefO zY`j$~lbR~C;M&XC9^Jx3cnl2@=FR8s<}aRg&6Ug9Tvl1BAX7Sd9~E6M{>ETW*3mul z<-r`S`UHWW+6VMB8nca;EjOX^R2)_}HI_6#01A?|OGoH?R`qn`LA-LhA?`Q&yK-~5 z#ru|N(MaRe`lERG>@e_)`i-@m8AU=W%HFMxm!N!wLj9Iyt=`SCN_@4^P`lTUtim-R ztQ|IOA7piV8?!CIbtUWF76Wg`GRDE- z>@;_}rjS5yjtEp^<)&>R{TdeX!p<&wM_~^j6=7w&(#8Bppebk7tAi_S^g5Yg8v0_Q zJg#aCQk0>bd*;FfG5X;eB+u;LjbFbt-MD9Rk+CxKd|EM!=Vbg3mDtiBaahKe-NSSp z@|4(YCNU3H>0vca1BH!2mX*=`0-R3sx66pHW3MfD&?I zQO~3f`KD3)NhKi6Vju;lDetS~_kPlm9E#)#lulH0Jvx5r{LH{*+H4m3osn;F*sfza zGN#|aM{98DUuJO15AmLH8ptnkxXPc^PHjUjHK?UqjpyPqx6hfDKXj^I)va^o!McB= zL)UuJ!OF-Bhd3xPo|uy&wfc~N!ZXfoy3U(@RUQ+h_|kg-BJQ$G(jz=$zv7hr8P6Bz zd!Dm1cw9IwlXs}WLWxd!^3Z91p9aljdF|6P=P|M*araJ7+vhfV=r@NgkkAo{-({h! z0pTY7AK^x#8I~6bx!6k}GVf>pP|51k%Sg3dZr}>;h4x=MxBnJ{Lf=FG)wKkUC4~am z2^uU-$LcUU3Z+UU4PlQen__H-rXqju3M_`(IWpgeRfw!foxKO`gJOODkk`+>ZP>4& zaFCtCe>VC;5`R^hVS!PRw+0*n9KD-L|Is zbUFMddt&M+n?)sFq;8&iU!LvqVcIncs#IXHFw)Cn$T*U?<+mEG2^rPxH>fy^lZ&Id zmosI#m9-&*^YGXD7*jim-Xe15rKGQXc6--J9;^=5j4%6vPEcY6a$SUl3|R;TN-}7Y z{)|>u9A`nZcjc4l5(a4sH@|9pHeyOQQ@mK~h2A-viqXanvQlq<__6K|45>1CbH(rd zRSHIY^K)Z1ITCv;Gbhr5|4=2^x6wu1WDAjU5iJevZM zW%9LZ`l+I1zW%3}$$`D-HHQ|1x3)*t2S*>_M2lD(sc-g)b$z-n&UUnUKit2HU=Fd$g z6Cvf3P!MpZMSJdr_ITfRfcL#vlRzmnOt~N7Z5U%Oa$e`XG*B}4bu(#?)2vi5M7|9Qp4y=9;lw-a%zW-D7O5&!q-EXe!y&vkp( zw*im?`=2|xrkpqLK;=M#%_0Kl9Nuyy*4F2;>kP2B_=hgh>L-;D1% znglpmpX%}oZegM7)<%!nt_t7M2&k2NB$UcCgU@ViW#R@ONu!T1j)C>qLUz-#({@tc zZ&c!_V6BESszN*#-4zCV(?7qu@JLBz2c`kGONb_wZw9+5X1RK`=q#7X2;s7~MhV+ckaw z6p+w@*#;<%t_23%q8|)|3SWGFathvO8U#nJwVo19!O%(w<4rUF>*jQ#?l~QD1x2zG_M5<{qr}uOE92w@=fe%dCD$Mn z-qelFGOCOdxFaVBxvhqHv1lP4{K@3I+oN}DARNChh9F#COFq7=7-w}9#@AUS$UIHp z+i34S2|9!%XJ&~g?#Exen2qWrLuO}_-08*|s%inp63Cxi`}qa0dq?O5xfp0FPkvFv zk=If|RIbHWwZTVvF^hC&N7oUG#*IQJJ6EQ9^w%ACk3c%w5(A{8#Q&L&hC0Guw;3o# zT+Z@?DtMi4Sxbv*AW#*C3hmH17a{Jwbk>sy#1Mkdr!E{t&*`5omKv4s(B>*ADp4S} z@9)YR*K(^^(R>h4@v^u2V_H|$2LH8@{9mUZn-BTO*dHF9r80{XAWda?D8>W@fgtq& zHfSsnig$xye(moEg_|L zw@5WjO*xg{FRqWXVZ0FxfyQ<;iaYehViOWdMZ96o6%C>)6$)@d@c#^K*_s1elEF$l zt$+wRPtWI0oUG0J!G#(&cCu((=p|hckb7Q)mz98GyZ|SI1CpJoW`}KHj5&Poqys5c zEdW%J%k=>)_uSXs8+-?TFzYVIOX7E0Fj856fv2+a$e!PqaCcskSoBoIDBWHFKakYS z2yVmzak*k*ZadJoOopENY!nD+)!m}n8|!?gv-rIKay@3Duix#n{j6)Vq}IfwTknnl zZ^h|&v~Q1i&d_WkReyrhT#4n)-b}qZV!*7nuqdy6?}N){HWXBf%BYWt)+i>p-y8cj zup2$FaVM*Z=-I6|WBPaCj`(eq3BJJ2Mq|@*yIYWBhh#@`4u|okmYPI3&`T{0+S;h8Lrie|DeXT? zoBupF62gp1B2V!7U@LuIo!tm5EfhFH3W+XHijz#C&uJ3qYWPN_imM3<_yZS!NG7Y* zeUm!zh(u`DaSWTg(~9TmO4|^17k%(f8M?fjkZ0oD;`lxx`ssa$zl(LwFoFEkQJZne zML9?&l{TstYQQ0&)8h1Z53QAxMYl}~*pYo3n<)&2*FegLE>I_mTK@(%qb^dWVk-}8 z;YKzhDwme(EeYEHbfYzht1EQ+xzc|>|) zprGX7yk#ypKKv?DcaK36_og%#ida+P^w(k;p6UgtCn+@XEN~^KQ_X zq@bVH9@A+v?F)*V#!Mn_O;F9D`;Zz zpIp?9=V)?)gNMF+iGQ^5eqg|Va0gSyLMJks(BbwF)4$OWBYzQ81Cx*MYCBuMd^WT) zf~qpADMsI4SuK8I<*{-fZg9F?@7zb!$-7`wRr)ggreVvzSvgk>B~{4Rhnm1nN=jHBT#cj=;iS>gPtr6C{iiuosJnmT2BBc(iliMEuA}iS9qO?Yu#pKTh3Q- zvO(HCuKw<{hT_d(54i)IiA6M@z8C+AAgm2SBWQ8>TjqSGfknAH4Jn0*^Q>cZYU6ve z>gnXwF64Rhsl}C0hT&iT-6p(W>Y`G08K)vWqmMO4Snz>*x*JQ>f2g$o)l>cw^W&*B zY5!LsPMzrymy_4C6EB-1?D6fjGH<6#m`>lYXTxONe&n%8)-k zGS-i`XMn&EFbVqzS816EyOsl{b`rmS8saMEfRf6n%kspc@q1isTS;v2_o-QwP zHtMds**tC+(5`L?k5=OQWA^_=^B#XdcHRvm8eZdeNFZNrKa{rDTI1{5-JdFyyZoj3 zySKH&qGwK>^n~B2AafXys|H@gOUCS7r_?%`55H+~KgSa=IhS`rcgxhhY=q{j@6I0$ zs7U>ccm}Uy)^pfjXZ1Eb-L}AS;kcvqmSe7bW{C6Ww5*Q?W0US^gYqH7d0^bTa?Zq&ysx(;C?w9duAprDjDA6G?0MCyQ-79u1? zoJolHi&gbj>u|6>=)DL};6saJe}ox-CilJw;9@|qcW|+tTxT!jNJ;pzZEqV`O|mKFQPR5<6xLcrZ`K6|cDa@Sxvb1ZklS+f6`X z#|o=y7_ro}&KuNY^cL}-4+j2#<^?qGtsV2V?q7fa;cjuz zy@O3UC()*^7)MU{^XPA<(?vUhRy}cM*oiXm97F=oBaW@4&TO8jCVBshH+0! ziE?RwiNssqd?oMa-DH}vPQc$O1pv;90h=2!j(R`;+v)f}b=BM0i3I2`S1&X;D!;mG$hn@2arE9n;P?2H>4ugm?Jw@Ji^B zwYE}JU@U9hP=d&KWj!Sx#gfLd6wJqCvZR96kD%A>)^I zg9cxBsugE{Te81xC5kg@&;J1-)wc)w%Wo6AZk-4!<0;qfRUOBaL^pL10owwzjsA z4G~E{f2Pm+=x>A(763qSY_8aN9`I$cOoM&t=TClYF5#NVpJa{TKWxfC-3V#wf|Jc9 z5B#{osCuDsDe8z=^YD4pxV#RkC zeB|&%W(!sNGI8jX6!pMUBm3m?-fRK{R0ey|49yV_$ldI)hku#52V&0#UNL*Ctz6DW3zOe%R+{^Mt7D_*s1%~8H%S1_ zSkS)pWG>npveRDIWVZ(IUka!Ko+=y>lMM6ibdbAeEt#PM2T1^T8GQ0|cbaNU`qk@t z3cq-xjOe#sU8u6!IE#*imJo@UX@hm$w#Xt=kc`sZ=k+50O7Tb(wx5^lSZS}xj|K#m z1ggB8*PV(u^y=`JZ%ke9gZOb=Ib1(U2?8(hA7)rAa>W~jA}_6?8IzD7z-n~y)#Y0k z^K)_RP-XbvEiuZs1@`}Xs&Uz1cjuT?jlhpp%GnUpA?+5bmn!=Z%qPKUn+!hjT`r~~ zrtMNChnL8NW?34U6iW7>i?a)@IkDDdkmWwbK^A|cUg^waGhjaFhloxnd@G{(A4$o7 z4W>eEk*UR$@L3~S^k2<)&IY*16H}P0_W-QxDvi$RW?xn1h^S8t0*wAVOD$Y2lPBiN zr1AI~d%yhMoqPrnEqo2=3dW3ulH5q22RM;9br(KO==7oR|QYxkAC)*4E8ZTgd#8()v?Jd{Oav09LZbz2L&FNV(?Y*~{c& z`$O?Dix9%h$L{X_tX%PM!1!G~=InK`?0j0e14#XfuW8l8rG+O?N-a_*ZprWBRE17u z39!_Y%}$pW|sZ1Ro< zofO+c@+6|Bz_PWb`AF({weO~>-b1s_JJ9_&QubyoqmuT-lb)@U1yKqi~z zvL18U1-1)2EaMU_o8}+@ceS5{Fw2D91Ar6?!#vW>qhY8kvV1W+LUQF<%l^{W!>mC0 z807rPX*aC^A2$hb{?Lyb<$euc0+I3i%aW|~ys_ziuqN(9&BfpO@qu1O9>`!q`u;A5 zrz9HO?C7>RZravePQPe8@bLDMcU(q{?>|oFsnnTZq&^J^J$ZErHu32bMM0NBZPr`9 zo%bc)4EOhRq|}V~g)!Lomf3_L^L&X`3h-{?vlH%xgg}drVd8K9uQtqnxJtSwpdNM&N z_9qJxqQ)}4f42ozF8Q88uQsUuls>l(@O@=#XY{mNpOye33|-RMe7k7jIeZG<|6Jvl zGKOa}xD^VfPt|{glS_h>3j+TTR{Fu-f$cwRqmX34205$YQh10F%JEc@Dy$Gf&$E!x zM|C;66ijt;%+4K}N_sYrD>1MsmL?N=N$tZDaf zs5v~O5-%L8kQm~=(rXV+<$q`^@ZdPjq1*e$j5jyr+i9auI-eiZckSa0T6Y{#2d_6Z zpLmW|_LwgYzc^ePJ{5g*;tlUyJg*HrG?wF>w4?xLLE1 z#3~8!_qV9k)ab$QQ=sx0yu34SyRV*rC;U6x>j7yHZ1qySa*slxKPsN6c&?z79dNMA z3h1wf7%SaS6_Gdq@>qZ{v*+v;G)5sImx=c=#-s_Z)8J(x@cx@j-zqaMb-uFQHgU zOP4u)9P4repCS`$F>iHLA^)MURoAP4YM-(G#*}3XHwesPCav+0!sYM#K85Ue(T_P@ zaIx!jiokgL$#s`OH@s$h^fQ5cMmGCHJ5HREB{$$rN$!2OomA2439vk`e6d?9KnVYr zk_aS@6RJum9H`62oP??a@BEsMuhmv)^y#LQmoba?0{~;ha`sb=`#2j zE{}9Dy2|8zhtMyPt6(toW{_dO`Qp6Zo}EuWewhEodm%?%Pw^Yr^O;fhB84~Nsb58O zpen5m9|{#6mug)QnB5LBpcj=%Qr^`Hxv(D>v`*n}Qel1o( zJLOL^6dx^7a$%+X+(Wb#Bw1oCl1k%S#g&lqE{Z@EJDW{sh63 z4e%mA+yH0>1%IkgD!euJasI6Zaq_E*kIX2RK^R8N^j!MPewT301ngPEJUWxQUS4e! zD2$w(szp4ByLEs8&TA>ij;CKeni3PTocglk&PWc4ZChNay4q#fL=e}iQ+#3{mqO;| z_^a5WDq4{af660TWL1T5trjPSvlo1O!J(st>K@_;Af8A9HKt?@=Lq{fV#6P-jaMnG z4bF$E<&QxC>;}e=cGU0HYN;9v;0i@2m%%$bub#Z#ej>65NcnOyhj%p}+;f)d87jMB zQI%K&Us|2FMMZhhv&;)1+zYngzQf%oG=js@yW`7i>jU<(5_#zJ-ba<^25MXfeev7j zOfCvJ&!L+;uPsgvs>G?>wxMgRh

V8Ybh z=%ZH5;`eLI2uS|xLWSh-Oo&zT7qCs@236974}r8@s`KeOP1T!iIL+8@y~Wuwg4Jke z6|gd$qo}Z6tm&j2Smcc!r&ncbccY?+}jjXK@9ATg0Rv@P*a!D6#nE~zZ_{+yZL*i%?nIc9->d}WI@OA@jcvSoXX!16ts55Tak zo_Dd?u|vr2cUwY7Uum^JtEJ`&Svx}rl?n~?XR_uM6B~ZgAc>xzjA}6yrCaj#oMVkM zbD;{QZ6?R4N5i_xz3-EGFqMi3^Ph>D?MxJiu8`2tQ>*v)zv+hbHq|0myr#V?fsI~C zvrsFEv=RfQ3XMLc>pvTHKoy;@1z$r%4gLALAMUZuZ7S(I$LF=LZI`is03Olnj-UU% z^#K&Oeup@ImH>x=!;#ZMH9`w=mLMkmwbl6t>q4HK7xx@gE4jKL6)8kn4G%>;zg;z^h}*&A!LLm z+jT+BobCz)cI@DE^aDAoB6*tjr1Uq(maIa;*ug9yXM~G9fNmnP`o3CJssre=ASDP` zAHDrCM6I%jcDhs_fsOd*_G~Ma6`6+R78#B*0^>Khp-|3yNbYe&4Vy8C-sFD3oxz=X zk=l+W_+C%Gpds090~^15tIhOHxti8%Xa)Vbx`T^JzdWz!7a<)L)W9&*QnY@2c{N5I zPCJz>WR*Ijje_g%5w|1WjX`dje02-;Tpd(FZIHl6S9$i%2@yEKX}z$jOF8%s@rb z@Ny0o!UVu|tMB`3G$87tbP*;L^2bFkniaS-q^-YMeXd8~f}!&R6e6E^ z!Z6|iwAA3lqW4i+lPKcgug=7eWW6p2gmqq;#=?+(^7|v8**F2_8PKXT!%0CJFyAoE z67;SUodT@2o#^Xg1n=q17I?Ux#ar7Iyo0CJPz=2d^-ciLfiQuB(o(ByrQSU-u-gYh zATN5poFl*!Xz1iWmsp-{_6Bffq_ZF& z6OYK&d?S))Rd*lBSYvhxQ@22F{Yk87pNUR#`{3&0EjUABBJ^moQ#s$$hyJ$xWD>a7A?M2s zr!6!pJbsks|L$U&!iUdVi?;5_7b<(YPF_pDEm4`Ca}p_mSd%;jxbRtyX{$8dNA0^K zZ>If2#AK&K89O z`(16FFC~@i{T3S%(E|}Klq(g;q$(t`=m~nNPM9`&qA=3sP&PXIyQGS+yRE3-08m#s z7d%i&3L={(Ff1BCCql#pdf=d9KPC?SZur{pj$NNo9%TA_+;79K(0KA`dD}&q9!Aw7 zcFpDSU47jlx#r>Th3UN!3KdjA<~<2v`;%9AXVTYudq;OUwEe?>1Gyu8R>pat!ggSI z{=d;(#$w{o&$bDWtu_UZ9j(hf5R6ai9hvONrZ7}2lff%NJU#^C5(;<#pa*i#qxT2E zQ04GkN#P#?4Jlh>BO^A5X5fuuYA0?K@kC!qCj(6syOVs7-4MPgWv_0h*j8|z`Hl*& zG@S~4-d2J@sLV(lM6fXG@>U5##zsWvn!$Jo zy(0b?)=%!+1Ea&a^65dq{S>R@+i#T{P3eydAHO7WSgNLSS`!B;)jANfCzK@12EBap z0IY_KLvze-lTdw;lx6`w%@cGU3i%Y$ENc@DG`+XfSn>p!o_87Fq(C>`#wf4)c8c=M zW_AU$`lZd1Qd2O+T55Z$E#~F%73p5@&8%d#N3*pFH|cuDo&TGQh761IHkQGX6Y4X* zrP3yEIFx&`c#g*?o%p~nB@QjnbA|#_lK7p`wB374pakXTZ~kZ2Muh1X32f}UbxM{B zN-}?P$+k*~_c@h{kfxuj@|!(=)~GG_yx7?+QLekrd)cq-`Q)wt9BVr#a2pb1XE4_z zAjOMR_;7Bp#93`h_dse+v4}<+M8%&c`krSoM?50q8`(5#=1iRd#=+r9Hie5_S2y0_ zeYjG0s{L|C-PO%vOHAMRW57ZCSr*z!v%c2xGx}o zAU*G|MyIn`tO>fk*#*$94mCxVKwENeQj%iUS$MOXLQLFX(uO60MfZLvQ=k=p#}){^ zmp@;B4z$qRjUwfl0#CQOJ01!)ld!M69ng|Tgk1)71kT?z)=I2oiWUbY7*?|u1!KtE zm^5mBjyO2Syjc4CDctsv*xtsK#9}^X^r^MFSQ}Y>M3$$6BZ`)`mA@lmu%6%BUs~l) zh$r^G&7?>{B?`fNf8jx^3u*l;K@3!@lntGD zdI!B((NcK`Q!81Ue#uFVX%j;LL!2+6>KPIXd2MjjmDdEZkOSxWd`-STK@ySQeuN@e!&|%?7O4H9AEp$g&ea8iENHbg(Bz+#w zB>lhPcVrtF6VDWV0p^cWU`rG7P!)N7QpG-M75!*ohYuK(Fi1e}7$B{($Fm=KkFg1I zK!?G<*Y!BhkMV=1!yA=t^rC3ZY9!-T+avI%FPkKb=AMu6`B3h5|ChpyR~Y2jK$=jh zFy)(G1eYY*G6C@Ix|5Rs8AAm?6E()4U{g?$+V?YL6Lq^Ec*-Nv!Iv7PjcbLAEbYbJ z&lv^Pa$3q6rdjz)$4gUTa%pD$3uko)A(Sl^8{NkA4TeaiDcS`F#fxYxlaH=zxm#gK zX4)4GDu;uTB}NfDP7W6)OS}$v<&Qp9@ARlDP$AwkMWjX?zcy*71lf$oWP2^=i&jg& zPkrZM-@8E~&$Wo*mrB9k*qZ1TulucMJ5@dXAnNh0NLz!^ceQ98TS~JUHLDFQK=biW z&NRRAutL0PRuRJKQ_{7y=Ev8XuGuZ)FB#!nmJ+5eRz(8Jg_CXbx;ev8s}28Zk2NOK z%C(V$<*d0VqLM6L-z$t&yBBXC@i(Q{YF;-{@&I5kP-BJd5~-8z@vG~*it&sDhEH$g z&%K_O*PkWIWG;IN^b}s6p9C6lps=DKzYpgC16e5-_2RbD_bDP6{j6NSVqSJ5#3#<@ zXyN@+>xY>Hpb=dr4N99?(rdD#{M!YB4+0a;#NS^X_RG0-P+hJ9^A%@41=R4F+*MtA z-?mFgfee1s)8BSq8hjT?p*kkua$%gnpw5evSJOwwr@O7)4v= zt32awbz7XwyZPIIVUWkWKS=H%ZvA$+))aPA+yM#&t5Ss=|Le)4N`Oz)LLT}R7(cQ4 z1%|roc6jl4112*cEa#YNo1A0LHof~j;d|LeCgHI7g^>ji6R!Y`*{V6+S^u(8C*6aK|I9n<~@;g((wr%I9<(&}Ko=+@WNdhhIuk2aVo6l-&gQq(* z`mOa!>V?uenwtqk6G;;CBmZ%3|5u&>IracDv=sStzS`-=DNkw}-u9RPa8X-!nW(8m zoc!A?J9r&~fHy4ZUNRk+C0z~ocz)3NM4Pcz8={KwlzCmDC+to21bycX}IHA)Hmg6uC11(oLq23_Pli*n&1d-u#ikM{amCR z?!tL&ueaA=6YivvljSK+)+r&t|Kag;*~#LNQ!#a-}GHY9N^2iP`N%hmqoU4a!X*Ew{kb)0?61ELo8L!ziLmjGIYXm9DH1 za*xn#c?8^kpji0ep6{1a9L%O5322$HfNrfqJT&`~bcEMwFME(8?%NljMNojB0yw*D zf6;N5i2=G0yf;$>Dhk;qfq(3p{+bNk50^Z(xnE2bE9QNe9AOYrA)YDErn&~qVk{l7 zLOeeler@~Ua-=>)vGZ)$uzf`i)jD2oEGkhhngR&=dw}ERjNGdjzLTaNOGli<{(Ff% z8SK`b@vO?uBMkqEzmAv+4OY(&0|GZI9|5P7X~S1U-%#STDU3d1W8Ivr4olBn0e@t{-NBfHBy=>k1*U-6Fn&?_{+wZ~rI3(b57hbAN)@U0h(Q+X&npw9< zg(Svasikd*{0Xcx?CE52Jg)o3)r2LepzPnBn;%zUubv%JnZI>jZ*wYbrEVYS(OhtF z+$RYBqf+#X{3`5$eoBDaXaXlx@TRg&0wkXjylb)QF_qEErSM){#-ZlTx{utbu9rsQ z$Z-+|MjlkhQ=u|&ox#3~Az|fIc;nj7C!7KQyOs)ln-auQSt&*gd138f zw6S=y^)x%V;fqfl5oaK=;5GbqZvOgm1>tYDi<{;V&MR83t&s$plGRrfDnjLum#EC= zR=pQH!e^DkwTSx?g{T7Fx*Lq{>-G)LO6)zHJ9;6A=R(#Wljts0=Dj?gx$GcOBmRpK zc6bg9dUQbS=1nQXYiita-|ASr{&Dj8uL(2BS6=KH*CWL3Y~Y3~#QXe;i1!PG6VKH1 zed5T^jU~xydMe8F7>eQl{UO?{AxT?naJzQBspTwVI3Si4klMVee>;ZstUw$nii6Cv zu>>^3p!n6{4D|xjH727n3I?g%_EbPk3QPpoey+B0p|NpFp{e#UojPIRH}nHij?dm` zhFnq0JEbZ8H|hOq`ADt1ygT^bq6`OshxGLYg0XNu&@4=%EvPr2?kg)i&0zvYN&Esy zZjB4rQ`m;=>sZrt32;1zz#qNF>&=lxZ$ZT6 zT{qt`qsSm{CWQjF)oO3%UJmn|8*O>X2n@*Wa$1pmep!%rR`t$q;9^or^u3K2=G|SF zyj#-{x%ctuB=8`$>bRsNMCRxTZ#Fe?H#)N$H3N^Md8g$pIGOT^py(exeLpj**jPJl zuB1s{tgm=nBhLgGyzk+BJ#8{QK*`d{)4kUKmsF0Kln-CYWwjyQL7}#N~`6Cj8t1N>gl}Z(`bFbh$q*Xy`3_%s1tdn|Za=K>9 zSgG=>!KasUA5MCE0a}jAN=jTBE0`|YAKD&H$g|Vug5+u=5*e5=I*!)b zwHRytWcS3l(RS8>ddIvLbszPk+YeH(7gUSSaR=Q`@)aB8?tFWC_OXd9VA(+pPo9p` zW~TQ7F#kkmPm7bi-i!R86?d0P{7}34@%brm8tC#%4M6^pE;nJ~V2eWTGo2_^3Qq5E zPXFh%ruz65iz!e6pD5bK5^Me5x&`ZW*M&(*{vW?2loR&x0i`i5U#FkJq1^^sy~7Lc z>1y7%x9VNR!kqYH9~pSO@)yUsoyJo=B4Pinj2ztC)psl@sZSx(^H&X=-CgtoGtK0? z<}c5A2P{sQX1BwMj3T`ebWaF#-3f zw%B-2<%}rzM&950g9w ziK_Cqw3FW$pVPVJI$t_84O3Y3Y%HdC`m%Mu{s4O4h%}=ue$k{n1qa%>un6Z$+S-xf z$6Au>Nag9UM1KtDD?YYtH&`DkuC+CPJKpwCCmHmQMMc;d(I^;zFVemWyizVzZPQyk zw9XVRynlX>c6xq9kjsZE=J^L9g+}B_jOGBddq9$7JWZA}bXjT8JLMAyy*hNA*qd~` zQkT!<|LD5DI!Ti)UFjGz{(FBq2|8XFFb5w1znCZK_(Xc(T@B99OEVsRrXHcW zrUs5rUKozrKR%@Yx~cyq@c55C6)8jjU`YcPYg9x5FC461^`+dUSUw}%#{yrsJ#cCG z&j$NmcTj{6q|s*e(=F^IRIl@T5I23Ud|7_0e|(-A^MgvU!gF>Y_>#kDz({V5jSqp+ za(hS)I$jPP$5g4%mS*ScJ;@p3Fzj=XV-ukR#=W_Pa-~J;zHywSqjxbgNm7TcM8o%2 z%X>fk3@ch-i6-QW9Uy1K3{HC!D8#%@;XYV72GgCsNJ65&m+F_xo!7EOW>v_p4ra9= zvJZw}c~{Ps{X)%X?}rDq-pY~5Ji2mI<(z(*gf#T9uW8Qq0%HP#X@Gp9g_gw7z;Wji zCoN~J@6Cbt2HXBVDuka9IqsiD=6_0U|4kGoLIOT4378(tCvJ5DdY5Q&C9WPF8=~cQqEn zE`2Wt{k3ocmgMg}($gIxyfBJ5md#(fyuxK?xX>Er* zJjJkYWZDQ!F9y(!C2%4?!3S<)Ty=<9f6HCK4#Dkfi}*JUx&I}>H6s0s7`ES$;g73#xDGlE-E-gI1D!kPr6vyEwS=U6Qqbi#3qgtJ*M>h=)RZf z$$L=BV^!>BzgKmC#h9kS;L~X`$_YSVBr%Ao8IF?4mY)pI5t2j*$D+wd&hxY@Vc=KF z(9kbD(mb&X)O+`L($a3dIWOwyZaVCmFP-FMFB$aDO?^Dh<-BnIht%~yF5kcXfgCNo z^GoAf{1Wol8Ccx$wf2ywgn*S>{W*l{-Kl~ZMN#2SWQ|7CaeZE&M?A{NbS-vo&ctsk zb67>B_wdrFs(BLHKm4qBMp8g0dp6tV zT$Qe!aC8ep$(sGajK)&?Lo6yv65$NTC6>^yaXsH=y?!%R<~fH6KerK9@6V&{J$Y%- zy+!gmxi=KCv4GWA5kB+?A&E(&GG5rESh?t%!15J4-cglc+mZe7_q&8@p!bFSA%X58 ziRP0DREx{&g%!KZwoGrt+=KNC!X_ZV?dRB^iTJ$n%erCQ6HO|2@R&L7+W7i#XKl2_ zZaP|n_FHqmDfiAm>Dh{hJDuoNwb3AA1~A!=%MQ2ET}ztDod04NAWDWFp8Wss-j5gY zEjL(yn$L@fKqFUWXy=XYId#8Ko%}}QdoUq?MAt3kX9VZ`ZKc`Kp=KQ)DaCP@78}zH z=S?`q&ulPc$ihJZSn=WJu~56@GaUo_=LSj#55>LZTLp|wq3a&-{$JzW$ylTW4f~%@ zBykA^y@K%(_vW;;5J@{umR-d{2K+6e%t3P?r#Bs7RVHf_jT^vnVWuNM#qnr?fpN91 z%S%{%s6yBH`-W$vYk&09{d>*^LP)u0X6<9e)d56x8`G>C5w9EyaeTL{#xR0JpAY&? ziGC4O4@Wf*Jf$Vx5BGsrTYU<)Q~5#gzV2jS)^MOu?*~NQ{2XOIQ2l6fwF-lQUt5CM z52!*8UcHTXp6b!2hwcuAVB5>Hold>&I%euG1aUU(cEHS*uLO}2v^%C#Qav9u!xfpM zUhO}VFO30|@R{*&6(!Z*;drBzM7ceY1{m~wc;r2QU9RcthG1soUgWR_a99(s4Oey$ zSH|14mP5oWNxk30RM~GGL=Rag1b3wdQ~oCJ4oyLHpqA1At$@tliaA-r<5(i~S2U<<18x?VI}6`cEUUGIF@U>U@78K#g+2y|WL%6Yv4 zZs1N)q!@43*Q4Ug55w_E%)0{-TC9t2g7Tt+pT2B#*QeGE5`Os{7RFHKWwFDpW(Oi| zQ?%V3gS%XHjko*M?omJCx!7R+z-(Y2Lq2+ynUALZ^u|UHWa9I1EVhbT)vs&Hg&o;> zXX39%#BxYgu(Njg`gEMax9se#-4_!U&%p7CV&-Mx-aD1&I98{DWb-X|Li)YnmL8M9nU%};xI5gXVN z^sCKH11Efzi@5&WtUctg72S7%5(hq)Dlo#Y~l9~zWSaiGJx?9_sUg7w@Z%#R>FIEahO zsg;iv`)#3WtUoHvwxmwK+z(0X@B+RskJ5ytYPQvQvm?A_Xw)JjuhFx}NT(F&ifwnt^(OX%P`3+AMlI}X zI$&?E4gq%4C{7ec=`^L|*`{+is97qhhurSrxcss`$+q()Gkf6MFf8<1O<)q|;gwb(a`wI;YZ95WBNgT%ZpNBP$bA5b8?Z&QG;<3xE_xcYqCJD~f z9o|e;*d!2Jrg%qPbF8$(fj_D|(Tdc3;a&T!PzS5UKQl3JUh1Rqh9Q zpf@JscHx(tI_^Ni>!O8)+?K~+3_gw&R7)}$BZcVzTp|)LayFxI)lCuNIl4JFFE4XB z>NH;GY9C((-^W{_V!cjGZHV4!dn1}(a<_~&=wrQ=hU9LJ(1n2MOV!OXiU|m%OLqMX z9Tw@@rQxllyaj%b!?uh?0XWv(jr)~x^TG?7Lj~prbu1%{p+l@ArPHS1p)#FA^JIspgKP$)E+^sAknh- zM~k4mjrMLnSOffPUCzMJr!A~?)3<9#UJY*(Xx8AcXVlAaEypV+ep)Y7f><#KC&bH_ z9hX>se-x>5ccehUb~OD~>)*~2H^ztzVa2YJH>frEi1atpOK@|Ip4cr(R-;V=Lbk4>E z!Blz~umfD4>lZL;F`JGrmVQ8qL5=+d0nYv>Bhe?dI`1ABKCLc)>3jzHEk;bEzoJKo z`B+Blk3q#wTIyTT?3@i^j-kVA5f8s5>;Xa&&Z8+*E}QPxlx0SzYt~LAx2kP!`f`Fq zAI#Eq^N<-3y2*CX5JfShAXV}i#QPk9o}{S(w}Aonq&q#rZLer`clFd%*A=kzUv4ut zoI1#bd^AHqJ?x^~e$+oybHylExw?tEh55VqdcSL05`%;Zx}8 z?m)4e$PT|o3KXE<{89CJ&BM~NTRRO=3Ht%X09lkEHMsq{{U+FQlR{9&SVJ9ZPp=R;JHzMX{%VOFWr@F=pm01c%8M* zN}rq(2wkl8K7_LzTe-j~#Le$}dWhL;Cp$3HMTg2Eiww`@OLL5$e#*b_I7*KBVMX_e zS+j181&_(=1B&jCP-zn~K2AGy*Cxv(+wqU92EC6r#QFa(E*}4V%$%?Hw^|K$taUxr zFTJVINdqb;M#WX(FccX= z`!^cl%Uym)x3;fWwR1keCq|_6)M|*qaa{>_d|g*4cqNUn zAlWklXM)M_rfl``&JmEK-d#vjmwhqrk=wQN1+}nFqF7TNQ6NK*GvKF!1)SpAg^Fu0 zkBA88aFC9EoFwU)9Duoh?D_x#4RmZ7;b+!zAYBfuG$S0a>l#oo6XI-0rqxC`EOj|{ zD^Cu(dKE+#-xLp=zYY;atGx+^u9cYu!6&EF?7QnosT<7r*Z`g~&HA5!dCE(5ASt z@;R`zZdXOg(Wz-^*?=vz)g&{(NKNo!41Y@SXfy7NC{I{u!B8IoF^Rm<@4ifh4#uczBP;14w@D^2Y0MP2Gha= zZj}4BcNevws55E~qsR!NE=X--waXK!ha4C$X+K@~f8H;xiC_M%NrZQIYf9PgKQFzR zDbO(>W_(+(kaiBX32i0qe%@41!UDrRve*f(Z(dnBkEM7+& zq39R}38zlTW%mYaD5@Y;T9Rt|u)k5?_hdrN_N~Xeh!*;g;!Tgq7Ez+$9u$9JV`9u& z5q=RtDYZcys7wNVS(vE_iI-ksBuhF$rijEQw!eBQ;WFTinlPl`k6Di7T#Slupu#O^ z>)7Xw&>Bpo%ro27G@i~=IomAk-$Q^oZT|}k*3Z18`TM9(#>p{dVfs+AdE5yZ=+9R- zm>@7c>HD1Uo)LhpAQ9)~phu%}+%UjFj|S(5Y{{$*_Z~j@W?Ei-gEI$&_zesF;!tgol+a%!)ASKYQ3~Vm>`SbOLdHP;c;2a@*%y1-#8jSE2L|vN#pNpwqU!M zoiOklP$DPJW1L*h%lLj3V`W3R5(qZ@BABBaGTsBxJPhLopCQw8R^BAAly~ zObgq`U3&`os4Z-Q-(1P@HId3>mF8vgK^`GkSykN<4t!qR(F)ce#N==??chpvtuFK& z#_B>pW>Jx9zsTvlemTuMl#t)*6r`$HsO-*%Yr=AAs;(;9TbwJptFcqU`Dp^4iK;{I z2jK^=;!-V}RZ6J9q-I6g?~KQ+q~;Nr6BBTv+TRLx)X}OOFI0c#LhnXEep@AzXuy$! zdLw%R6Nh4<${L8kF>CFVJ8at@lU0K(j;u&DqFT1FC+Q#HTeUN4iAbaD2kHa!b6ED3 z#+C@u5PMR9q*+Dq^+k^RP?gkQy1YI-Sx)@WTSRnM2n$%eP%l6N^8k-swQG4+3O(G* z@sOG}%!X#lmjDL^7dHHbru4MKXfh-wSdDfMuG_dC(b*WpwMZmj&BZw&zAJYz$yRrm z4>M|)+>=O@^#5V(Eu*4t+pu3HhaMWFh7bv9=^9FDM;KZ{T0%;?JETLpq+3eqZjtT| z=@`0W|9#)J*Lv>fx%XOot@$ut_yAmSUgvonzayo`wZH63e3E-1+wok`Th#(~E?tMF zs0bxG(KS!&(QiL6hwI>ps4<|`kYm@UV~{?p_9fEZo(O4mKCD2?@0ZV?onmT4Qk@1K z{uvf-qL^9F{xMx;Vx7WmQhAYtq1G0=OatbqY!xJj-z0q|x8krZc4o_;?T0It5~xhp z3e0me{{K0fR^}vtIm<_ZM8$wQk6GuLOzv`q7`AeI%x_~jL`sH+VGQ%?Ego{{5k)*p z#=0l0Pr4(3bz@-<;s&3vkYTh}d<#bBp)_IwE)uxn9p|3QHjDAQfENG`pi#{fXqikk zkN+-K(^ad|ck9Hrl&(h7G~%IPQ<_m$(7W zM#peXri1JQpef(@HOvILbHQM7u5%oaXsWX6 z`N?(_D_kjFuSfB^QG-vSFzQWpvJa14`v#m`^wVUuvX>HNw}@NP#XQwn8P{5DSCLX& z_<$~?=vTdF?QKWLwSXvFwL+MeQuH%nr;HZK(K7jj6_=_pO38aPRa%+W=>}l2i0IL( zaS_=6H~#KluCTwtzq2qP^mxqHR6c?hiiyzw11QW zzAi!jR+QK@!cIcwr@c`xHtK0hP_3C{(I&W|5Pw=C<48)m4?Tk{Fq)@=XkFp3fMR5H z56fSrzb;{!k`&)#pCgAl3%J-oz|TRqg25UyjZQgOy{X_zxFcp)p_&7GsD4*Jxztfb~+7 zPE2W-=4uxmJ=}V_Q_4kF7(cWZM+FP?@_W9LCDVDDTgoe7{4SO!Map^IW#Se!0anGYH-C_F`Tq*pI~+u#lCi z*o3QzJEvuD{Nf*LaxJM%c@~o3(kf76+4nkJkucE!We)bY635gS9R35;uA@Jfl_wk) zi&Uk)jPyxwO9q};n6NOxKa@G|5{WcDUotX4sxC>`>Dv3F!^usIr!T7(9`OFZhQ0q^ z4H{880Nwg3jW`;6CTmHhOxx9~rW}%3`hG{ajYBm*AP*B&5`F$~F_=F& zo+FKw&~pTsU- zOBs7Z_pC%KE8Bi!Vf|T+kq(;dQ_kq*!{(m~BO~t}w#sw0s@2U;P(zg4J)UM`?g8y( zs3FM|gN~x2tv%+z6B?#JD_Hm6yaVLss<${%>ESX$kK2iA>RD^!EuPI!9ErkxJ9)F4 zKJI*EOZBR+kLp=^ib~OR3sHF5yV!`gTb}*CTfIo-qmr19q*^j}%h3ne`xD8A)gQLa zpLaM|C-j)sg2>Uzt>@jeKcHnZBrkmTxJKJusIQ!@Y1!fo$c8&HDrp^Tk@JsYt53v{kyJc$n7fkj18H?5b`^MY^Cfz ze^-F-P>lOC6znknlg9QAd$l3EJe;EBhhPF~430bd#Inmny`F$e=N2)mN9LC{jBIHs zEe6kQ-RO58juzoK6Tl^NqM?MZ`0Ip$rv- z@ul!{NI0V>pi^>o(vfrQn)SyL`B_bu`#&{CiTAZL7iP-$nOQL=WPJI(W0}_it`vOZ zz(QK~DgX^R8`DA&#@+s*=Hr{Fj4ZVhkAMQhZcNQC!D>Z@OBm4yNemE3nStpOFoDEO znF%nvA_|8E9vK2-*_@?acX-$T%K~Vgw^j2DoO?FKlUj7)4>N+S7!PM80FyS-6~LSz zhsl3oYw~F;^H%9Fg;m2z$gbm!%M*!T*!+Q=UIA5@rbV@1{m*IS8m@8QR5`;-H30x5 zlpvttS-hX(IWySJ{%^;mjfDLyMrP2X!iZBX0qELqYf_n{b+pkAl83mvJbo7krauq} zB@LlFK*3Q4MztWwkYZ*_JPC(h!EKoqj~J8~ql=5Fx;<-X!#Ll&1#FgFW(aHd-GyL> zDJYV(^DOCJp;WVK>`0&EFic7XNAA3d!}ddoMh?bF&F{%9OlZEjL}bnPnxTX!w+)K% zy8!Z@{rSA>pJ}`y_vzp2H@%I&g@G-H1f`^)J z*kW5oxym^9uHIlvF;95FaR~M_U@o8%4=3MyYq>vt=ImHX;~tVBdJWc@%LP?c5U&&o9|faTiOcF z3i)exSVdtmwsyM5Hl%?fL`Ap7!5u2_|I+sS>k_VO0RyU`XG8oTdSI6Of^xz?fcx|I zD@QUNt>73Tx3hR$^gd%2N}rTJkmx||n!=n(4_mTZ;0;x%*USR{VP!|vffn`*)Q{}1 zE%zN+p`tT5tW$}9vZ`ZgCAtM@BWUBGdRZ+tXvEps%Hjo*@Gz(|tOsW1YmcVz>JYEC zPkZ?yx!&Qr0Tah`+boREcJp+h2ig?VK}}QUeyALZarI=$&+QZ6W$t$o&+H`nQG7Sj zRec`st}V|*hLfx15Mt^`P267MT zSXpu9fgNR6>(T-B?|yKF7HRMrgfQ#(HyJE&N2|m;6cl!{j+^9NE_OO6|VGB$g%lmR2BP7w*o)PGbA0R;%$J$BW8AD%CYLWEfg^>yfL~RPAs%xjO!=DG=kNsvfGK441+*J6cU&z&u^d(D5^IT zKXP~qa-A{ztDB)Cnwq{n2j=b*cl$qN=acw(M5x5DpgmHBveCx)&xlQqv|7za-Oe}Y z$^0lo>J1#Kosx{VRR7pBLW11%M>KLz!}yM>Nw5cEIGg5Y=w}5ym@@35U^&2Jx^MRB zbXOM^$~QV}cbPawUZjEddl-8C@bKX1VzSV1chRQL%m*oa>1%FhS$=9I#tXgyJJ;u8 z51b$3EdH})_pf;uxt4$Xcs=9(FbB{Je`LeLFG&Mp``W;m0fav1WVzT-&RD+ULmE8o zemV4$bd(_%u%`xKD-pt&lTiXjJ3esBDnUk8etiCYyyCHj8M7$N`nyTtEEO~ zOPQ3^V!TfhyD5SW^&Kzb)SFg{Vfh%ZlV(~ULuB;qFonCV1#~saP6B(8>N|0YfDxU5 zQXx{m<^4^%*OmQkk^;CKn$niIIP$j9>HIF%PP5hJ*lm#yqyWrt)&EotdXYV0WlEhT zwp$o#)eoknh9dbOkxmiFiYs=kv%oexJ_yHk3Zz#66ZrZHbN!r3XWJ{WCMizgn1FFI z4JIE~4E$mW-j?LkC)|09P!c&zWDQ2>0np7(>hc}&VB7&&`x+yizXHDn+R?Gai%^iH zV5v+aKzLo0_ZuT>fx7L_jJ|<$-*<|c1_k=>;t(2CE+@$c!o2)2$x59Livw2}iV{pjiG}N?~0)F|axi*2ul>`C0aKfz&xx@+(=lKjF z!mC7^StzAyGNQC6Mm(RZ(E*0~zg`PfmhxYzJf34chl@C$u)GX|V?Wh)Qnw3Vf~y-H&C?$F$SRT}liH*9Fhm|q6^uoF&Q-KpU_yQzB}6nQ(o5eUj#Rw@l7Xv^5Hr6it;%Qu41vj%o3?T|GU; z;-)7rI)ewWs)dWb27z)fZr7a(Njdc3-qPPy?%Cs|?tP&c_ZvSxS;PxhTs#73ul&~< zMPuj}iI4XP@7>2kzVY$5;$;sNkPR_!RTC(+P<=-4;ZsKD|4w%YHZC+s5^@9=kgE5# z7MQPhpwA15R%N}l?PChZMz1yb^%eFf_O;NT$Z>N!*$Anlze1)}2N*7Te2f1Oh5wXE zM_8v;z9Z9qeDH<)S)Cj!o-fLiNnE~wt6~@}WA1QFIBA$F%uO4RgH2WtxF1&oL+_D^ zB8AU&T;TY--|92sV`{iNpC;BtE9M5# zPc*q&w+d|{2Wy>}}#4&OJ5?Khkz=YW(OSzF=T&g#r_vwv=l+BHQ}9}pUm*W!Ydplnt_(efdSam|CJkb|gnA+GpgK_2 zMeVZOP+XJ?ADWjXV7$xdT$7l@SbYSFkptN^Y*HKC2+T>YxR+BJ(0c;F?H;lKtWB^lZ=)E>X80?LKBtMSy<#TK?VBGQghRnqXdb zM|Z3oN~drbpGsI(V5s@4Y}&5kw&p)dmP>{8NzIJ!_0v69vXqslH?Cc{!}!C>o92 zJL28T>U;Sjr_38GfxHj|D(^8mN>&gK#SMOBSstGD=qKe+QM9s>8RLp>Qw z;kA6}rd2?y$>b8qy7$t`yvNLnf7m0VmmKp~@s7Gfs!CiU^YLQ0wkI7ff& zFcSzOGbZQ5h26_E4>vIh%nOSb%4sm~fQ!Zqo|^G|rPM4XA84%=IZ<1pPHr0#D&{ut z0-)(SNB5Fr$ybh0%oNkT-H$iRPhitgzi-l>R>Z8s+qeWs4U@w)ty+!)@yt>`7oAdX z#LL>mCn_}_I$l5Vr2V$iBLq|l4+blI3C9XVP%ny+`Lo74HN8!VrH~x}1AVZMDrqjW5 zM!g9OGeLXfbJcyhPfz-Pd)uEMT$@Kp4G^=ZO`q!Lr6TlermGgG%>j2=!RFGcBPGy< znCK#oF3RwJV6T`IO+aUaEg`LT!ei~{L9#M4-cXi-KD0m~4x=ZZV3)vOzIqP*q@LO> z*QN1LmN-0@gXtZWu#Y@O_P*N{KA4v5`*WMyPj+1JN7{Qr#)9);r{c? z_g)OADevb$ok;xXG<)TB@x-?h5P>s0T^;sh+72)^LzHgq>7kH^x=#}-8Y3jRZxLxcgUj(PJJ{}qjJl5)O6Ut_t6 zE%a8*Q0Up9LVc0qPuvN&k*)X=c(@VG79Q2N1Vl^4Y4MV{4<_76o$5~W1F*whBbqj5 z)W3IG)4v`ooVOXDCDy441$Ym!$DKu)mXkS)C5e`g_Nq?Bww8Edh)I8zrO7u1t2zwp zKcCer+qB$Y=;V!TV~OtH`p2JyiFg+*KZHM0T%AwrPa>+s{K^R70Ne)t=UDhv{{XXi zY)wV$!yKIlFqKpw}c zTH?+~b|k*jWkd zd=_nav@uCnv{%bfEdo-2P!@`>om<6Rg?mZiM`ty~WZ*g8j2X*UbdzPJI!a~U9vV% z0UFvr%TeR8YWY!#lzTDs`ru?}wyf`GZrzEPm-HaOCQvs$8Ozk-6D`FG7f)+`7F?>g z3oLm?<<*5Z+!d>5W>dZ$t8c}XrUB{nRKPPzTyO=c0tPqncLh9owNhEsK#J&M+d#Vp zue!+A14?mU#)Yx;q0vb^bL21MpTAB;(MUD+4u3mreVa@0JB7TyWxkpPd;acnc@pn= zDld+FA!gw=ZT9=9!-2k>xInDI0 z0rad-zahmHK^b>|3)_c#60qX}rxSu7J3ysy1zL%=s}2wYR9ISrYwRZz^}XbxL{36( zkm(Su1?UtQlF^lJ>aH?_b+?C&y7+p2wWKep)}JI}qEM3c_;_NoyoYW1;Q>72iEE?Y z$jMt9!1L|L>%5pNB>@U}PDa!;MwpG68I#0XsL~GY`SNa6{W$PCP=$afDhoT{x|Kn)i4HKyaG7sbmnGTNt4|A>t!AK8v~Q#nQ(0|iEB<)9NA(v@$GDuy zn9>&E^hsRr`ZEwyHib^-h-LlYhcwO)ewc|Zdckvw2QYV7e}_n$4cR6(rp631^g_GI zrBdZIqrk2n(Q;dJGYuH%ENGlk#H9N1qy;pAXcS5eHP{T&4rcCTFO9c|(tU*K*7WI2 zT<0hbUwKJD(IXJIOiyaBC-PfRlvsJF1eW-NxRA^X^FK;#+pAbx z%&I>oG^|l1il)RfLZ`l$Iep`LP@Q+yJXo|fv!PYhGMC=!fqQ+NtN950_nHTjxTNBq zOAG{Z6B2nS`o|LV;ekxhP+1G7d_}-)$jPB)+O-zUlKDtlCJS|TB*~Zq8jFq2c#sFl zMZ6EiFt7gD=PZgIlSCN8ed`I9S0Eo-9@i7&W+(irN?h~#$4j{y% z0>qF`@Lc|i_|3K)Q|+<4|40;M#aEMT@Q2NExm<7`$NM@?(X$b$sfG?AWDM)Iu2456 zi8746p-&L6$`6$7va0WUyl{GLz$MT-q-@L}F8{%VXF<^cm&@L*GWkd`nDTBHoVi!Y z$OCVg9%s!mKO(6EqI=cO?!t3ladwxRor0Vxz1J4oZq)9tQ(heZw}tL+hl~Sce4(QG zm)-`QgS73!fw3T_!YH$K(^oxI-)-6_-AnTFOkmUMzYTTI6n-H2%~mlyg!7_qz@EGlD(zg2V0mYr|;2AY3^FJyTj z)Q~GF6j){z6E>H>OW3Ia6=J=}&4nNr8_DXuyEIy`#aN?FXFTEFtq z$Ka_9B)W3&2Kc)Nj^V_qLt}j{!sEgWfiR*%o8=aD$LL~7at~iWLRq0Ue0gbR>(%h( zv;H&k)#Y#2rnfN$Nbj8iAza`B&%Jabkkl}lDFdp$0N54i&sDRjJ9>DnW?&^HzS5{_ z3{04IKgcWq~}T)t94)Zy3yUAY*fswRMG2p5cX<>|V$aaI3Y| z`ahAJ61%er2F&#FI5+|TEM zG))?pO21fB-cc#lA@ojAwN57~X93rKLx<{RW{~P#`cUR&@ARXb1C4vE(@>gxXiG85 zGo!fa2POWNI~AV+LRpzdRSSmglKVH0IVo?^f~e+7JW?+Q9cpZTW1gT&pYl>JH{tMl zZaK1)PekmK^j~RsU*Rj=-i}N3(hRJPiso?STiZF z`z6(Yx72g?@`^X{Yh#z^yF0gs;t$fto`+|@mU%qU?iX6pmG{nOp~V+{QeM}=#Mg!) zbP8>5cXwE7+n$a3UT*GCbDKs9yRb6NN<$9{ThwciG(A`x`rW>&j3t+W$OT;f1;=ER zou~}3@pt#%G?0XKQOp$40F+QDf_+k`)#@ z;o!zCqP1ea{h3sV7+BjjP+}Bgl|{*@mMb8%@pMSIjJMMSTGLqveZq(H(RtA^5tu_mC;z^Bj+-FQlp?4lT05LYxd{$ahZ*ujV5l9DTIj4Mk+#-*7Kr+u zs+@$4q;iH6uM+%rG((UMxFyjS#(WU<<22DgL5(>E3cxImmMh6%#tpusjLYp&|0R!8 zrDAx$_apia;T}5L*i?Vqi*una;on`dXQ%DxG$T~bSKcJvkN20a4BDQEcQ8$1BgDlY zu5y;lfN&^H@bq_ev72prz!%XQUCKs4b3|RO0*Rm2{$bVsTU#UGCkhuhsCi0m(Gs{x zo(VT$SpmTJX#`(sKiz!8}@os8d# z@)X%ODT(g$ymeVPQT;z<0m@DwP=*zG8bgNXx0n&L==QMpI2sFGwLigogES9 zi`ub_nh?|Rgyu)b4}FAy1ZQ_d-9H-NtAD=Rf7-f_wfk|%vSKXsw@%T)2;%M}Yp&}V z6qZ$$N?0HI%PN^a?gxLWTyuePj*3RVOd9FvRRTA0RKk2`!gx6fd8^h`Q>N&OO^son z0gv3W(E_Nw&Uwybx7to{Ba+P|fjJi>HcK4H_U^pFeRKbbNd~w9jrMb zM$z}2Q7d>{5a&7{i1hG#_(?Vqq0}&HJ<3%wIY&{RH5-vSaQPuqz9sc)L2~ z^7r*fVW_95Vp1EZxp-jqed$u4AQ1+XJ)Zhw2U3tQdR53GCkHGK;9I_+J$pvfWH6eN z`G=G1_Gu`q;D%H{MnDDSw^%vVwx`8vFvbpTpS5=YZvWf`D$ss|nvD79D=wAL2tdj> zbCZ-+0LvOc7HiB$JIhp9DAWQAt!j=KLoFV>n+LC^N*4<{R4N{7aHnpSxoyZ>`F=Lf<4D3$W zVgTf36#%qA0cbJ?f(zshX`+>;rI3ZbPaL=1c*ST;i?f%Sxf=B`=E`7d;#|~{Uu(G7s#?-`xpHW*dRs~IGVe(ysWiDcYF3`>OToM1UGD6H4o8TQthUU z%>?Y~ocxOzMRpjJizTU+PbIu_a_0KkbxW_I>JhRk-o!)9EUi@x&mD}|8%@|%8{-N3 zA6Op*^nM)#DjMK#=VH^*rV=rjxg#L`}6FR1ejHPn~~ z8;MGCtp z$wqLqPUc}QHjLjK8<}tYA%CiCMJ3uUKhNjthj4a~nl;}F*Af!XH*_4JQXOO2+eF)a zBT(pM3Hya1V~#ncY@eN)1w-b|2b##{&l7-ZLj{1(el;?#PK8jDrK=Dxq0t-=5QPY>E+dNFHT*)l#?8-or z3prRDnvW!bEKOM``S&e3y=7ybiL<)2Kt|-?SF|~p!u#t4RSZgnC0&;DCdxvlB!N}K z;)D!j3UGibaQV0LhhZjk*>)=waV9y*dSJ!zQIOEuOQ8J(hL6oaW&JRp-34HNEwVr} zVT-PSHg!BR$z$U$hA)Vf!*~sm1-X)vT_N9RBZ!N?Z&vdA-1P*A#k0W+qZ!?4bF<9PFYH(dUmk?M$QYsJ$Yw-E{um)A0I>F^Ki=VVDe*mM`DOa+X4{i0N+19Z zU}YcNg%m#@Uz%-20BCGI6LI;@X!OCR-Q6Ha@Xy1NJ3>^cCSZVg*AUTh3q0iz7HhaY zK=Kg+1EM8?k2&BBYxDEGm^E`lbc$9eEHv^~h}Bv1YYGM!2cD1ssBTjD+NXvc#^$KE zDX&7s?$1<}uSY#W#Sf{iHi#I{PW$SJeVw zLZrmZjH&oHFJq5$s61S$TAjMCoIW9dV(lVTD9<2rZQ}GYIsTO8X%6h%A^;YyMbwY( zP~-heNc(nn3x3%RbZXWbK2HS{`#18ByUH~6yYlWYYRNDOfA{of4}N5-%WAn8&V0+I zIQ0(wun`Vo(F~;K-z!P95qR=&@{2=PqrDwKn2YT-h>&)*b7FT9fz{HmfoP+{#S*!< z5Ch*Pe~xG<3%oE3Lj$5)85Y%y0~QzfOaj6&o#6o|!SK+}I15j|)8UNS$=VPILY-Fp z-4D@oNuw(bAZ9)@ZAKEV;8Ji9rUmyAMedWKH&o!3nT6P{x~6+feSudbM?2FMnKD&R zR*{YT*GS{Dd_*Ouc~w!mWnYdR=ZJyca)O<}9bft_+JHU%?3Mi=S?!#@bjVxUS5zTz z$YEW2ruhdyG5ia>dvqSX@l7F}I@@fSe2cOR&S)fwFbO997u~F2j8SwD7l2{Jno_IU zG3^_Kv8ZV7!3L4~f0cGpab{y0A;PUg9*nAgIM`?s>wKYJD7Ad|$<2Bz*(~F@ z1Zj++V_%S5*2C%(hT8ijuf?A>G|dk;dqU(WA_28VNYwDQPxTul&5@PUlH`EtMdED1 zVR$xmG#mXLDZ|?zKbPDT;^v^-sD}_gJF)n#?=Mmqnt^A+-m7xNc^F^w)k>|WyK6M8 zQoj=_$uoJMwI3w9_Lqx?z`sxncoiUHxj&jBe8HSDlgG>V%>0`1fBVKzA(VVC;|Ye1p?-VG2}V|nUSqv5crhVtRvj&g9s2Cr?f-U5j1vMXUX)vqOZy$=h0 z{r!5`udu1V5c*7<3CG4XmQgl)fid?5d|m^KkK z3FYR8aJg`CY-CUQcUnX%3UpC~5KzhwE^&lF{zBCzi&T4~LQtMl6-v??PXVmiEV*~e z#$YBhUlf0ixIZ2DE4CT8LHc?)#vDI@Xpx)ikk8S!&~JVp_7&?!F?Lhs+zhHvw_KZ3 zT0R516*|@AgU^QxvzX*&U-^Hz)br1S%1rwa*{l%^F4M_`< zHPl~o@7anG79S;Jaudi#!aUt>KGr@KbAA<>0)R+6u)y~mW2_;15T%Z+vmo0r##QFA zi}YRpv@Z2Ld1K5w$jd66F_B|fcKv{bj4)4S6l zoH>>-F6YhLuhm}8FtLY?V z?K41A? ze`5y}U)!C~+)EK-cHuuD$)OwLgEN{^$Cfpgh-MCfGct@5>r3ta0{ zTA(pK{ZL6Jt*Tu0JIr9Hsm=I4Puj6m{TCb-G3B6Zo9zR_!+g2Co>S6v)HYPg_12n+=Enu@VDzHcNy)=Pm$5K zj~vp_tGH#~f^?n#^x@xo88)ZxrThwVKn=w`@Qvs5x^r3V0y-HL7#~+_65mtBjr5)- zzfU)~W@Ij~TknbN_EBAIaID3oAyhm-mB_NI;*cmF?9@5zpB)zqra~V#Xha z|3TyeEzxL0pq;_3wy2?M6~4-sCKtnGDD0H=!=_b=2QFK${`i1LYke&KnA7>RoJ!Ph z0Ov*}uA<`r`P@G7C4PahY^VE=0>8IUpQNiiUfAfqz0Gu!O#CfX zUwE-hlheQCz%$KCS&VSo=|IjTKNWcU$;ehvLSc{UDsrmDA^nVP0U^deMgtRFh-+OjwdINl7HOck%|__veX>7!efwk$|iaF-_Em z_BTEWsA{hQXHHp(HvQ#h>@b5(ZKld$CImLn6(3BMx}Fwj1PD{M9Xm`C=&_Hj{(f<;EeDz|=w*dwPzY) zM>VsCOM4sp80-G8saC(5o$D#)4Jf|1`|PkmAsDK$a)*kH^*pDZ$;OO4PZ{~^KXe4d z8rUK|HEct3UT{a)C#JstvsB_SU5$&F64G(c{4pG3eCv8DJZEzLsO_FfIJJI>^EqIp zDhl^4D_sgSp&Lf_0or|(inKIJz>6>Y0XxY|d~cz?`Ub#;Dr(9Gy#2gIjAw8NkRKby zV?A|AJbl2&FT}4ywKOEUt&dM+rxvmo;on&m_>QZLy$B#r|M6i`LNcK%EWTPygx9K? zO+<7CC(M0U)77cfBPPxW`M3aj)UbBQXc!etO5IO-X2kf9ABOnOe}&fLt1dF|z;xXG zK3+zcsj(iMZ;4XfAc_w!4~GlTNZ@&fSAtQZ#Z?H30>1m3$6_{{)&g9_Lg}aNprMj4 z7X6kLg=#lEC#}n{^p?}Iq*RXDV@oa>MN`)~zbBnPz6$Lx+p`t=CGDSt67CLO95ANo zv#BZZ?oYo}8=>udw)I&h*xC9WI*^iQo$2}d;MOCk=vxBG`viV}CS)W(WOQ7zC_Z2` zQH~MH@ZorE$3|WKYX>^D-jdg?^?EGd&>5ZL}yj6_;>RXfi=hI@fY-b=_dc@bJOM<1SWK}i_+MEPHm`uVVyUv zMeY7^^8nTRpv9z|R^AU4A3lpzF6+k#kBDNZgc@9V5Q@a`pPy(lU;7vN+P86CXloiQPop$s=2H94&>0IU zroX`VZhMO&m)%CIFV5K0)zqWBES4LHcLN@JIX5O*_Q2Yr568iq4l=>F%t`$E)>o4@ z6Opdflf;WV8^H!f9RV1OO-nQnN9d@leE^?4BACJ%6?Ecn56;S)EB zN|61nb-URvph?03rkw(`-2Me@0UKY8!CSIq^^rnndEw}WglDKo{T-K&(lgg$v^EmaUkzDkOP{H1u`18Z4U^c zb<~8?dG}>iEPz2%RRTrLoYW7m)DDDouXyA0Io>WczFWv2!kyAzm$UKZITZp;6F3hi z)}zEfC3UH=kBWeu4AV&2-@^cwB`@7?^HnSWQ*J34`RzAQB90{UG{v>tohT3v;f3Ez z#(bKq>Hqu_kYNQ>3k;|Vw%W%1&>UFQcgc@ELwH>_?q)vhWX6L?Vn`8kO^y3o zJ-TnA_fABdO@1?iG`>Fn=h*`Bg%cJg?V=eL>p!AX@mggSpY1+Yuv{Kc*UG+I8Y*;6 z@zKm{rl6?{hr4CDq9O; zPp3Pp6O(nc=+S26Hk)EEzD-zkF*$e{9E#Ms@4j+avR`Oc))QR5Ki=AHORL}X>KwFE zYjk9N@mA!8tE(%(st)Ax2A+r%Z_gPyy6BGJsQxo3NJKw9&nGo@f#^%Mil&pW{&nS_ z70(x*9ZF;|e9g?XQKpTBx=7&D$O%a+N;J`jK0&3pD`eI4zmjgchSqTdM?i>LR>j|# zLLhIm7*Gp+rJs|a4GHeLyYch#;~yO2*jN)qqiS75Z*@fZum}*j2GKuI-(wp&r0RMX zCqtVUkeEcI41qZ!za#{-xDo?c6lE;h{ZMzCFP9upB*FC(n#c$qpbJ>Zyi4*Z=UGX; z>Z>F<(~gxo%@fohT@!G+zaPy+yu~S^(R%&cW&+?)Tk=Y|x1I8&vPt{(a~=^?Y5?no zO1-~uz5+Mo^Xn*T>sT&Q@vC;cyQ-91gByT*UufffJHHz&e)mE1N-@N~>nj^p^ZJH% zq~<)>xPAXFHlvh&j#;U?+lcPr^Uo+)nHL)EOYC95lfUI16k23UBVt6X`kdRzoqfRV zkW+7dASGgvG$Zam&okgV)Ri8_;#Z6b8oj(=a6CYGe=8Sz6g_PhJf!{2bx>ctcB!YL zc1XUua3aJkwE9@F(sXi4{m)bJ2}YOvN&v1e8iHb`&uhgOorq8OBP|kD%XN*QpyPGn z&D{{!ZrCrW{_`)Slcl{G6HDPk$sV&thb+G3hLaXU&3-`4!0DKf)`_z?jOO!B(ZiT` zNJBCI^rCu&uFjVFIrf3tY?X2Naxr`M_+U%7UvV;?cmcb6z@7Hh$ub$9y7?38vZm6> zX6Mv-;iX$mD$SoNY9ksyE{k3xqZjWM$71-`?H06hx;ik1pBA&^yZ_an9Qonzp?5?{ z4_>_fLu^kT3Wn5Ea45fg=ASk@UC?g*H~l*57??a^NG=5TVX@#?o`<3>&p{$^)}>I+q*7Z<|qUK$KAwf8b! zck495YiuF?Vs}SU!zV5@_uFs8Rp>I@ck&YBsm8`hHlVf}#3%Smi7PSKrdyX*oI|M> zjS`zLhFA!OmdbU7dkHC~YUd&00d*t8D+f4eqw%-tVeS>p7b*Jh9K^S04(b7k%a>Pm zRi=bRHj4EBeW+D2Mvp~%6Gsvi@7X-Q)19v=>k_b`6!{i*_U5-%DU0*R3YO-h09@px z>@)9URpQT}wt>Lj$=ZbM$0zIT@3U3p8xKB3PXFVwg(CgL_XS24 zpPS|8_J?9Ny`CTR(@%aK&1uxW@qYOAipOzKlXpL2x$yJBB*^gl{dj(f>+oZloPz2{ zmc2;fj)u7K<6yOA})-JktfpVIV`B>`Zc1ba>`O2TNEE#M;ZCIV_N$;-9s+hwv z$$LR^BawQbMM^AI#0R3KCzpN>ej{;Kse0G5W;K$+XJrQca!|S)FOO_v0rb8Zp zin0z$5jTmq(-TV5{0(H-Es^;Iq6)Sf zDiGvkrJ$g|Lr3W%E;)|?=(G5`?M7f}A+T4eR&@`N?@=!a&dhn21NG;-BQhrdmk(f3 z%u=Jh!9*V-+b~WeZGC{f$fMh#4Ytu6dsB+c<>F$Im5CMK?a9ev%?R!dEnudUAqwG= zC=EC^z@^obtb09(Glkl8ZonoPJpshB@dByMZ;W58EBpx&42s5FC0d*E}Y)ZI7dD;$0 zc%7H%CtI{0N7y8podO|e{0{!t{ve!;xUOFW0jc0Ovq9Id3xxuR0xx+(c3aNNY?3cg z0}@<@mfiN)R8czkLC&!sHFZ{koQE?X&R$IZu+}+!=<>u*VXPKyWOspdC4u?yC4T|Z zCM^lupy(Kv;rlhx){v`1DnOg&dbpaspSpaP&m6U70{kOiD+W4yF<=Q@RAn^E8nIgP z#oY9~`sZunDFKruQvV|d0r$6q#)$-tWf=cZdZKX48&G-q<0%I`;W6(q%Bzu*zPR`* z-KJ39{XtDvTz!l}EwEH^xgqI4tJnYYT>|6E8VSAZ(v(AA*Jeh%!6{Jt zjpFll064GC5B%OHv4`#m&&i9T7teJD zBL6;PQkpMV9Szo>)w=g1)#})csE?I}a$@6XjAq8fc@?lgM4C6EF*?bhx>~J3@2_1a^NKM`UiBBlG<^Mnm!!eBad%}1 z3QH8VIqw2gyX1pqxJR9g5e1 zDSqbLtHCt5r$O}RI5c7l;i%NHkUQ|xues}>%F(#DVjsJ3F7Bm={Ud4CXhCfd<#v%y z)db+=^dpu0N!w%u+y&t)xDIzfpheP4Jh7`R`YJXhMzE*EHdcEtkd_&4E8nCp0SSqk zhrR9?tRMH&^B<;<5-}9f|Dc<#4~9w{8M<5fgWq-OAMzbzOK_snVv|Xwt($(@`_t~Hb{s($I}YOsDtSRwb%>QpwX2@HCy=#<+f7E#r8XXE2ac!jY_ zJdjmdxjPBZ3zmOC*UeS4T4IO~_Wti5^+AzOcp|OhUlUwlbI`AW=Xnz$|iQ(o%4 z4V|W#)cH^aSF2< zck&7B7$VWMVsgZI4m2ECLWCglC)^+v$R8gA3_S-c|0@u+@=9&rMVh}yeSJNqA6tmB zfs=PG?rnxA`;NUdU{wM&Z|~BV3p?%_cVQoi{4sOMAMpnHuK51?1tEBX?&5|Y6R9CK zft+0=toZB(Z}b=7RXJepiQSsBOp6&C3C>y%e)9^H2}!HMnO+Izau1D(z64?=`SlX5 zF2?kWSl==7VcovpJr^>hGQhLWj_T!RaO8cj_g(PKPw!j)0v6|c zAPs{bsRe(IKKuSXeLRhbZ+mr$%dCB3g1mpY?yjuyA#Ca}&XfIojqKOm?Da;|s~K4x zk^g@AxBY&d<@cbGz`w7&E)GJg{pS6cV3yRXxhr$k8YccQm*@B{rs2Z*@mm9*>ih8}xlh}V2n{7H&4G^cG{Kyqoe@>F-3hf?U@HF@ z>>n;pzTRwi-yr0@lGOlrnE+*s)i~!4)LJ~x*-fp&b$KfZ;v#F>hVB#o1|wnWDX_n< zTXA`8XLNt5o;%In^u8U^aWcOhnaAELV!j@(S3v5hDIeks_}%RN?)SIX zTKhfLKED5EICN&7XYRT0>pHJ9KnqVbpo`wYfRjn9b!@g^w^AKo6*5u>TCx*I$=M<# zO$PU7d?Mo+rh`LqT|*~Z#YyWfHTkc*Bd4c9+Tjljls{~(If;CY_(H}HPTlG$uh<1} z4=Q;I)avBEBfvjy{=>78&yF%muE}0lBZH zljO%d&Cf3aqmhR`^+E0Y_)?t=k1mFOHs8?JbHm>ci#v8x4Ecg-!WQ~0TP4|Ade!y& zV2f?_c|=nR=z(vUOtyzmGQ|c91stfKVGEsL@*z|FUtUigF8{a!9k#5XQ>G=&yhKt; z3mi_GM%{tDfb|n%)Ld0w&y({+wwg)WtN-)1B!=|&A7y55?OX=m{uGCUx;r?V|v+3G_m2v%}TTI2F`Wv z;p(0nNs1Sy)c?94|LQ{D3HfK@=f8?8!9`$?s$UOawRtY4Kyipn+}cs`HbcnR*%707uii z7QMWN@8Y=hv(cwZP(Mm7N{#u>*30OZ6xTx?VH+>1jtX%GWPxr$PywkIc+8K)m)7al z#J{LNdqThK-vea+ZM8zyqin34209o#e}a7e=V>!jw6~Pjyh_1YyUJ@9y2uK~y9Yet z9GPQ}0fW=dHABkNBsQ+?v4_X`Xm28i@&Jfp$Vlgcj1}vWuIN9V7~|Lb-|P5f&0aY&rfrM#P|QY(Q;$T5yEk^WnOY zt6`0k*0E_FAna9%di?w_|Gg%2?&riHQ+seW51RBA&4yv%olVQ$0@c+E!&?^n>m}Mq zhjx=9J@Y*KIj7cg`Ft@>Q;~*yt{e3~rhxN*w-xkt9a)%bX2mjf_xe=45x0hRiQ(%y zXPwtNZ@-p)9FXEai|!Q-D6~P~zb3a6Xfg-;U7mdS_t@UzpfN1IvASKAku;Cugk#@$ z?jmJT%qG9n9`F5&m%A)@`K_gU0asgk`pxg4MIwGzXizsEs=Qc)H}CcQmSX`-GPK+b zd9PLrDNBuW=}(8UfCS-`QO!g9l7yo)QC5FySO4efGsrC?HP>acXBBd_M8ukNx!T%V zJ3|k&eywS2$X~QSMdR$Ky<&f1Eyp(vgM8CBPa6a6v&#mYe@ZoYlcIwRF4brVUplCCYLNUc_lO76mi{VUJY)jd*zcYz+S z$FY!h#C&AZirp5Uv}-yeWQ^a;S^-nGC%g6gS;g!54+3(ag%N;aNF#+?FDDg_C50=^ z0hA$A26B&!-M8+2?9g;pQdH7}v^<09i6j4&JYo0=Z>-TrLCFYMkjAjH-75~_ zx_CP*#1W=)%^AvL9K(5ce~seEgsyd;5V2fM*xFd6zwdfdma!3|5WMMEll-HoQZnEH|Y}(3ve_9WHc0vyrCy~jv{YyT4Q*NImaHJ*#PuhB@ z+U>H8flhKL%`%&2h;(f)(Ndm9HE37})ebTwHgi9GU~x)P_;cg=r>WT0Q~$?I(Jogz z`;U#Ypf>;7C{cSHnJ@mDxWe{0zB_#ViJ$bOl&}VjOuL9Q8$5$Td};X7bB?~0_oDOy zaSDJ_bHVi+wbcbnt|H8iJF{3h3M-w2Pkhtwu)gj3dUjYx%Qw~rg=!~@R=POB&7O2c zPHjZ_eK2novzxA9y*+SS);QI#agtaAUN~}b3>{DB-s_^+cx*Utc=#jdb$F=lYIjk# z!&kf?s|4>^Q!uFoA5NqP^QBl-bt|JxgDCDp$o7h9g$nDA2Hm=myFGo|g)&Q;yh|c` zvrCC5=S_YemR>wG{>k8FYZmr|5q)|(upoR~=hmkV1ju!=DVnp@RH=ass<5EL+x z7MK$mlYZz64P&&P(2He)pmhS18p~8VyU1a3#G2G7WOF2^VRkL%4<+M&-sV4&;%X|n z>63|7;663y-+;`9Iq6*o8uCi)q!(GnFt%iIFT*O2URzGXI=3Q$_kyjtBRK7m=LBd=_|TW^HwD+RRz(Zpl-h2%}-z3Eb8?RL>Xmh^#1(jaZlP>N;2UP0+0 zU`M1UN7G~=yv9lI=B6v6>XK~i^Q@lIoyj!rXq&mdE;K7^EPA9m60(G8GcCZZq-1Wt zaUaH6X`5)yT{hl;I98mOjl!p}7f4!XgYqaG&k5(E67a0(M9m6VQ|s|_IvMj{b@1-$ z@IdUSqKs3_`WJ~=i66N%d@PdfVKGf+@80mSKBh8OU!C$^^iR`M8ynf{j*Zna z0-M7`J*ztQKufU!mfPOV^`nI43&ZlB< zOoIua^LB36gp?dFzcvMES>+p%52dvh{ZFkLbKuqhED(EyVvIYMz^syzZfaejo!{O2 z6%5&A`#+A|e{XOXg;=7!p;|Q!@7_1C!G>SeMyd^dmK=L`-a3i6JRM-A+8a#Zs{x5a zkt(TW56(9V7!o#FQ)$iX$3V=%13FQc*(u5bgSt2(s!46vo!Ra?AtXo|kCh0JIs%ue zEm&&v3eM`m654{zV;>!iWJKi34ws&Oe%69r>FJt6?oW!Zx2RPh6GCqN?Teu(fwI9@ z`h8+UMqt|>91xNV3gP$4JqHKNyzH}>qt7xlQGj{vnVh7Jy@(6<)3IC#rE@&a-*G{w=Gx_OUtg3Kj`$(nR|}# zW8z_}6SN^-0ME>(6XCKIh~c#dT+sy5a+6#WrL4^uT7D-=z52BvL*FN!S`NI~%zs($oDDy3S(4 z^=(4=_8bVGGus+F8;Vx8Mps-zxeiyr5!T5MyO!9DtZl?u%U?j;wh3^Lm%PcVqQw7#zh}fn% z%n|r{tKgRuCmpNJeC~T_*5+L9xa3*sWPaia2r(#2={Q-em#f_fW+p`$CV&+FB;#ztP0l_0421^aO~QwZV%G<5 zHFK|#`&w69Dv zDcdfeWCtukL4|2w<&fxnKr-*UD6$bmv7=RKGr<|twTmr_LBgscyi5bhWV9{s&}3Vm z;6_P+pe6q0VjKoqy>wjUo0pWBCMn>|8;gb;JVJU$ODiXNzP7eqyLZeVZY0z-=N$Yi zfi+bBR+ItG8u2n2lA&CtdTN`Tl=OXs+8!hG>QbKR*EbQJroGiKZmhaZ@)5ha&FmH5 zwW6hkv416h`2e)B=Sq`IUiEKSx~T3x$puCoG%?o^uGJkhOn^;+m(D&341*&kBBm>C zPWnHMM)9NX-TYc=&+AKx>7kSQRRFnlb3h%oA^03-5DwXu%25dtYO@(dlV`u|JKr7P zPf^*rG->Efu6vS<@aTtNZV7x?UuSsomZgtGJo&U63fG! zF#}HqH;<=4vO&bU#J94hxKz^9>o7R2dWfQ9|R<R zbr?-^hMra*tn`N+pMJ7PBDyp6U$4ts25MO8v4%)#vWp%b%^31u?WSah*|2UFzt?;z zhVPo{VZ+V%*Xv2lEiHc#k^dmvoa@g9MwkU!pvY=N%)9KSWHg>xM-Xel33MzhE=v7d zHb)zM-~$4aY9Z@)_#k|;O0ltH&B$QsI*2%qgUIIiHm}KRP*3Ntr_^b`R?SybUtq?( z&6FKr$&Pfl9=`Q-64QZom|FT@yxbJ6rweb;s~1o%?gu=W%Jj?WP4Z zVCZK3VKD7Yyc1RCVfS5M?yVah@#qH;n_hVq%)6i*5-? zbiRGEzZOA?U~TEaUX!iA3vZfX+zOO3D|Ov8gi2|Bk)cK?N-1Kf2Zp{?;}&oDe8+h` z*{3z-dS-`-4i5|!#u}9-Q`hmBvltN+#G3r;8R=`O@88##6uMV*+o!v-y$hZwlTxm( zGw?eHINB+81$)0`Ar0DVnZ(SD#b=c1*8xOAK83~4(mx|vpZpmaj5-XxJh!&f@>H$bTnRPB%nB1 zwljQ}0m6oluX+cW9Wdvt>KFTVWb{K9v!W1I`mZ}2pVe#0w4Ks-gFkMHjv3}*VvNIm zAGN>&CVMoNx?|yKOuoNEuhA}Kz%*KtDB4%h<08)_De}haZ?LF*So&2Q*p(ki_vuj2 z#sUTMnv2zNh)Cc6)X3&kR}~lRzVrGmSSbpxQ%geTRRAJLy8At{^XO5CpTI>}|6Um3{o&Z}4NW zibn~_H?QM4E0u(%oK$)e7PKT4q+V8OwA|eEu${y`5A-aF8;tA$&3LZOb*-&IG_I5H zcT{RCL@boQFd8Fw8rbVEqa z_6F|)Jc%#b;CSHrJp}1naxSWQ||kHz4JbiD(PeQ9oQ0PFN+dows60` zXbmH8+jKwzR$QtP?5G|HI8~ZBq%nF78>W+#-QTMJZuyY5RbkcB%N5GK*XyOrv?;go zAk(&dyyl=~6A7Z%yEGEDMJKCe+&ov`dP&Xa*iEA_wSt0jA|TT9ZAf~?rvXcJVeVfq zFBBpi6{g9`IAyc#+q`ghq4jO>{*!}|AeA_|*Fx_rZ{D$GU%TE)r=zE*yx+S539QB& z7+_89)lL%H9v}GjU?o-+!HB(NOs$Ak9jtu&J)x|BiR)$>Ne9{|*z4i@NA0UqBN88U*974+`isy{Gm)s|1poGG^*3K)N zU@v~VPLH90!l)!{S~c`oy}`U8;Zyr<*U8&qYr(IZyY;`T6*6Vj%yU2YsB8J1K{w83 z{KBa(p~jctmh7+c5EQrCB|j%T#{-Bb@7Y z0s>anBre10#F~jUM1&7PJkzl-+_JRHNX@ZVh5bcjgdbA*CB?^R%ltPc?4;$JR3hc7 zxMie5x;W6CY(Qw>SP8qnOuaYD7$IGKkh~i%JnsPl7Bh+s>MY*C0`O8w(Eg0+3Q?b@ z+q9rY17eSj>J^AJ(rAU`-~r`De!u(iQWdcWK;+=zofxcrln5$eW4dxv9`lxA*P9k1 zLYDG=B04-=F*W*4xpvL!U@7$epiJASP07VnVwBp$JtL%I>j%ve!ww|y%*Rb`(Z5NM z&We0QEmRl+pr%CfBQ1UtLR&S{WaFaWt33Fl%uxhTvV&8vo!Q&0W^av!5N6cjZ^IMR`{;!k0yG}E-eDbK7gS*J8Hf#x`sc(bOg}PA8 zA(I`;V0=L`If-J?#j>qr9XRqgml=UMp&>fD0rHCoyj z&fdmXO+d&2a2;%UeOEu>oX!liZ|D@95_2P;%5fy;+jAJj<*}b%eiOyU2HH{_(Ghfn zSWKkgiyif6uICME)g%AmF8SgijJ~6?-Ou7!BxaYQ&b!_;vZ*R8R*_}K>^{z3I9rT+ z;3$Kc!6UjnM5_ifqP1n#P$+9ImP4lL2ignQ1T8#&q7-5;Zu92+a5HnKw&2??Go*5< zg9Mwe0d%S7Falwl@j-9P=_ajc`9HHs{zNYM$5S**w5U|9J#-#GJtuYf(`yK=3fs!s zlq!w6d-QldT4_?X`J-tO`IAjmwE)a-`{gkZRkKM>^k5ut2)^bK{csu+i6^lwlrjrY z{s~Ytk+fadPn+F&wdy8%ai?2#BA|>Eo$yW3Sxm!A%Vf+Ib;;Fvxk~!$?Av#BWHz3M zREx#@-GOji5{IeN?Y>38HUeE8-j!pe7taf5;ZJ^lty)8 z+(7QWY)R^QMW(N$lfRzYG=q%d$9-^e!w?7qg<8|VCXs-)LSF+shqzZ-vVo%Q`|s)= zK{8m~PS6j!Hg(D;ZL?yuyr(6u1$KQlYkF@FSH~L5lP3$lH!Z~RsX&1iVx8; zl{V8ZcHO1y1Rz@F_uoF?Y7aI{Gg`tWgx@trQZ)U(RNAKxR`d9E0&m3l>aj0Pzk;3x zZ27^ebEdVQo+Z2U5erY@s?LpMynmrn{uP6HPbOXH2doDzu>K#a8hYdz0I&dJh19gL)OgSuKQE%?wQ0Df0?eYDUbfoTfj^~a$G?H&c64xddmCw2 z{!mX|zRZ#tlE^FZ&vin?KvYD5%xkeIPHjnw`XuP#dvoKG_E{~=N`?TY zvQQR z$=HfQk{DhvmXq!V`Yv5EMG$V1rV!3lITX)(JLgM3=Y?3>NyUbCzk2ofPRP+3ao%oO z=IvUyhnBr%;fz!s>7TgjzyM)|Lsx-wv(_x{+kDJ|K`y|5wr<9*i201=+x7cE{BDmj zv@h1wBqs};o2_&j^qUW)*d;q30`B@S-VIEr))3d04!OFhdm_+(o@__3Zip zeDkJx^resWE52yzQ0Qdf5YYf_|5xfYGmf2D-wa zv51I^)C*gagq(NC4OOlA@~7)zk$1kI3y9UlkjT3%G%|ZCqY#Em7yj;a1Zls~-b*5~ zUdu0fAE{yO3Iijn0i=^m4Jfibh`5-U=TNReRaGE=J$Th>_?C>_LgPXOvtd~)zic(6 zn^}5{_$}z=z|VKG>=sKLnSKcz^Yro{pJ%$ktZ?(W9j5XEm=J0Dqnl3XmW2=+FrgM~ zqOJ6Xj>9WBMW88Z(T8B5Iv%G-+)H{XX3q;_q09HP=ONKsOoumUL(7?sv6()xmd39C zqQ+&sp7m=CE7SQAthqB0;=Y*mu=N6tX%s@l^)Q^6rpp9}2-QyO#HA3bajTs`=*0!W zycQ!yBJUCrbG@_#Qs2J{t13(q;>vK(u{W9a@T{O@JXhQ3LbBm!cj|}6Q?go@ANg-F zV_xe3S;aR^{BCKQr2dE!)vZDG9f1-Xhzk&brKNZ~y(2F^;MFZX^+JCS^D8!$4-nkE;o(-S{39`= z_8K>udm)Z49k007n2kFf@3TQiV?wbE#H2d6c1l9U=8gjmtCJ_q|}pd;usYZjO&!a+&6=cu!ZXPS0p5 zCLp|#P=)X?0q=>Eu?UyH@D~0c3;IXbKHHDUmRn0`Vbof8b<*2Sy>XDA&C}peDn?oj$>NtejA=&BF=S zq=8}sxUqkx>yKeQl`#NRxhAyO^jG>|@b!!rovx9~as$IDw>NO2Njc@I5`nTYyAc`+(Qn?8W?`J z%Ep6l39(vR#HJggS&{3^b;TeF;-nwvXNwILpv24f7ip8aZ$2C%e^s-8+f&?3(cO}n<^oOPZX8Hs zLut7B3&vM$+Q^q;rkxsBB!FncPH!?l zj#&o&7O?>2t4nl2Hnqy%ueUPJfEo{wb3ZKsiHB)FaAX;Gq6Hx{+D*O&8uV!;^T-uv zW_qy~%i+WkjI#jJ(jWW%Yrry6kzlFV?Cwo0xMp;;=;Z9L<=0uAGh{;SU`C%7^!V;* zp2pHriBh1^Z>!PVMlgNOUVMPP5~$4rabcuv)hR8*Ezl|mmS*F*A4tJt8=3)y?0@n; zwK&YV-{&N&m!WX%D)dxcLCwwgB6L+Ep@$k$6rb4d>F>Bb;CI=L!g;MZVVTOs@BF$F zyWbutF|%s0cGY2paDkisWs#*R#N-d8)!cvyI6f9fkk)lohUExCh|{@FAOpPP$^?zLBl;V`)U-`r5^@rS-1d?G6+%2WM9M)k#LgN42Z5 zCy&L)HqQz>mds=iK7OL2qIlr4EUTyncjoliT0t*~)4@6C`OsU!Hc!6Kp#)F6IT-F4 zVh%lN@?F}5nhc8VZkgt{*Lv(W=&sGZI=+>nTwnK1q!>*9MubTfv7ug^WhppUyIHuz zt9Zo^AiinFJ7l?Gh4q(QBeJM)^5OkJU%!XqVf2B;o3b+zSs&6R91y zL!Sjw8gIcwd7rd(GH&SCy1d;JI9R_wpf!NFJ57uO@9oReSnmzKD|BP;1x>x+6|{55 zGzS=aL6{f)9SM@g7<>dKREWg7vR8A}ecE=GOnMWZa(#GjkI4;-3_~jM1373XQsa%y zIb;cnfJ$A%P8)FW6PrS9mo;3IY8C`wWS2&a0sVTiSQUR#HW=?}oKzQSmmEdD{HlWA z-CxWxzhAf8uLTy^FN#)bDHltcb_UA$q^xf-u3h zTHGdL2#)QOYC<-Ti9TeF%@;@>pL#^EwQt0o~dlFB$4ycHt{ckJ=0* zq#o6Zpd9MiH+WqEru#H-vJ@X=zLUP59^oMvwais%snOqN58sm?tRyk(MeerQP)Z9e z*97WN94!X6RZM&|*?q-F)FG^|TNX=%b$aTZPk6U4>L2dY9ZAx>!YC z=ySeyd;a+3^6jn)Qk^s^V|dNL{g7|L=A`e2sy2+JjxgQw+b67VZxrf4lDoK9;uU@ZQfw>Pp3ZG6!>%$@oc9spko&g| zNPe~iN}nHbU5%+-Je5n*BXtxlxr`@A#hkvOrW@*-k)4Uc4#`s$@!>07P$ByGMY7G| ztYtNIh}9SXONbGtm9Ke`JdMayBEiaDBq~4wr>Z4m_@k78%Vd(<&MoJ;3aeo9(Qr+G zc|G*X5zT{P5MnP)M#JZnzR;p_0;hhxAcVK=4=iLfSlJ0It@M8o*$pKtwZe7aG3`9i zrlPtup+!wdF8~gKF@h=0kW#u)3KLuXW$NwLena7-nz>+cl@f#wNfd&=6{!!%Zc%Ln zt`#;Dv$o$J-eWHLnGltDSNnabIV`+}a9aj7{!z-VZG8TNydm=4#(YCj?eY9&$};p@ zi^chfYLrmgL8(WCTHLZY!H>!3^4|rJ>Yp0EGAb9A@{$JdyniP5(~FLe9HEa^3m)`D zcdiK?kPT3FZc%KguC;Gcy*+!iPulb-8r#2LxJl$m%U#OWsIVMv$E}f^4D$K|wWjkq zQjLf@U$4t8XDbo~D~feD`X=XZB>Nm3KkfnWQ(a}lEeh94r;YckDfjXT^J@KuydVI* z*`QEOrc&FP&m#6giFC_Qo1RDaj47ItaQ@!D?dP)5sowkxg*T8+)Z(?N-QCt78S5j= zV2`u2v?kK?>r11JVUMLs@n1wN)QLi(6bqTNj5))K>6Tz-y#OH7@xq_ZY;fOpX`Fd# zbUqxuKIH3*xa;k67cv7Fed!CSN0VF5ULW|Ys@LOLsWzwWHKt=SlF0{Z>P`8uf5nv% z8qVFSa9U_w0trCS6vDfAH)(jnVO%Tc1LRZ7RUM{L5rYeMHoXq)dH4&=Cw+X+B;#+= zi*Fz8dBIEy>+5}v?EWI7{Nv!}pVi@W46^YOBfmD5Az&eY{xeQ&;ge+)l}45Qp?ytR zmWd=RS(4HP%nKSG7<~;@PPZFp&0v7>r_H^lDEY2@PTfeeA2ThDln6}+Ozm7br5`LG zQd1>63h0sCpppxpzgA?@Y3K0WbJcx8Mn@DmoByP!e2;fUCEf9Ji2?Om;Y5lCA$ z5riKv5Qr~|GLU1oe;Lh6{s_BHXL_&uh6VafT2;Mk>PR}CSSFF}J<}0Ap@Y@N3F1u* z!{%lR`m9o`@V*r!!F>LrGJev4t}fwWuxmrE-S54qPo%AeOtaqrq8XMWvQQ7H!gNrB zahVXn$|Xl1>jhUbErED3)w}7JY_n6uB8ps9|mtlQMikqhD{MHnS+AY7CXK7{VO{C(r+Pif;kuu1#~5-?=x zRsCaCrY4Gc#rCG&0Dj~@1in1^GpyGf^77Yjk_Xu#?C_Qh*6X&tEv8Ya6Z8Yp52|sE z3575>u?8E0y1Sb4*ychU3tz09IZ+)G8x{f5SXA8y(wEIFhG}5%9GH9npJz^JNs_M* z9`q`s##E4!QwS@xLcKw)eiMkOEKuKXDWH}xH`n2aL1f2jHJMmdffAVWV!vDC$*x98 z<>>`Pol2rHfMbt6k`!w#bLq)`3W!`5-A0_#P0AD|r45-w&EB|!7Xrr4; zUdK?G-@t<@WMsnr!2votVDFu!;otK*82ueFNHv4@7s;-Qfp?7895~RwuG@@c>xQ|^ zGx{ebUaNoHv6;AGLCjh)u*`!Y6GX`W@V7tJ8K&p|El4hFOg7AeQL$H1cLUK(5c)JpcKP*b`x(skH!&?wwaII|nrr z^5N&)S0?%8@6|s)`r|kHmviM7BRE)Y-bB2Sq#~Al-aI?2l6@#2u?&sZmY-`ZdOsHP zPIJA#s3IpkxN59gMCTv3$p0Cplhga$UBBN$&tl*04}T@sQdiRIXZB;zMjf5!r?z5t)Y^}J6+LFo?{bcY#M zaP=DRl&^EJ{M|i)D1ue<@|y04KU|9<;|ECrb+Qi4rFx{?A71=F6d`Jj;B#m-t_3#0 z|NY(k^#fj}UVRRI6HgJy-~4E*vv9$+JW}PsQTW5#nJYAN<)a82fNZkeQaDdsPq@UKY6pZ?OW0^WU6myh)iZ~mu$^q-$Lb6x#keeVDf z#NXWPfB#MV&tv~daR14~IM)9D4*lhlt2=OKNdxi$BLQ&Yqvn@2TK@lB`8z@XZu2?+ z=i4$$f&is-MK4Mn0t=Ho7UlP{9IY-l*_<)tn+!yLZbT0|-;JV>xh=+Nx=kjs4BU zHSTPgbmuoFcct*>)-Deto9HFHrMDOS+6kBe#@gLm=+N)J%|5sQ&CvpbqbmiUs9Dkh-8++ zf6bl`s`s-s{U+a>?t%NZ!wOM51^L<~**||C8-Cq>7``(-9x^2JDJKENl-N=6MNS;oeX74Mn-=(MP z#;ERqX0MTjg*ec1-vE3qNhwB0j%hG4J*2h2Vop2(@1z0zTOMCgN&;|tP0x?|==i$& z?p=Z#OzY)@`{mO_sWF}4^XT8_0yRY}IiEF~jNsXxfEBYboW-#=1v-h!ANSg`|Dgm4 zU!K#O$JBEB4T^YjmfY!D*Aifs<4@IuSj@*FBAvW1{>MQKs4cZ?T#jm9vuX2j*|3oCo1$6kRPr}XP=)Lej{SQnn zsWmRWsn*sJ;I?8x2^d|w062I!maE=JI`hBEkFMuhx5a%{I_J*je22YpJi}hKoln3E zF946^-h}yS!>UUF>urc^k`d`5BCffU=0BVQe<~T&0wnWr^VtgxbBa}d>CCYq)YD1i zaH4Y412XchLxfoR9x07wE7Kf)d#h@_%dhqD-8$jT&=5%#6%FRxfaiGhvOu$IcX}E^ z%SSfswk`TS5o+kqI2cfA9lIL(X_4@1OxmfTW^aEIEbuc0$S}C{Dz4{r;%n;KDKXsl z)oa-AkH_PDhJH5;v{FQ5+PZZ2)Se^gTlBxq*4QXN&%eA7OY%NSH5)aap!i11RI|0! zsX`_vCmcRWm`*kc#7?6#4t`f@Nrq#&Lq+iZSujc_*XZL*gY$J(RJ_l(nHbLpVd&E~ z6CR(&kGI9rM@k9?B=j>qXtj@LM;LT_B07E|WWBPx`<^Xtec47F-BX_vn1Vk^y!WD( zSb3~KTmN;QJdMK({+B>i)N6Hd=BlZp@*|k9(evB_*{`^+v zu%PZLQ}QCAfzPnaL~ixA1YSV}?bAY|rXFGq@n2|1;PLq=M|-YzH5ah<{=qCm(anN( zd_CcfddSH0=C{4QE{7*8?!jXLr&5$MkV!Bd%wY_W(W#e@ke)}k@-LWCz~sCyPffrW zEZXF%H^pCO4~n?O<4|&TFd`=}TjsR-MS(g?r7Y(tPyVm$_ieSrN^7R zG_PJuR-DFm-;0tC_`8w|oR(--wW0fWMDD;e46+i~xf3i040-4MxeaQ!bcryCk<~HV(UkV~dg8%Z=SciT|1l(lCW-$?+eoZcXiX)=?m$fmUMD3u9Rj*?tph z95byXr>9%NV77fLu%(aJJ@1VE+WlUU`6wV}iaf95qxxleCGtq!oA<9Kq0hH{YY7Fy z7<#+y%<2K+VUpcDxXLt-unM$8>P^kfMhW-VSk1Hiz#*+E?uEU{;M=xH_ewBPsSUY= zwe@{SeSsWY9@1Y%k9M(1W(^PQP73=h8^f_?4^8T?n`_BcDWT@mraZPwH zgSf^ik63YCcCoO&)K8ABAsf$o0+sJ||hUES8()7u~yXIyj{7Jefoqce&j zohhj85ej$OeyY4|y3waenoXeUimn;5A!ce1((qc)jlKx1B;iuxB3Fmd0bIB$>!Co*DpwrEp0pM5D2#4wHv7j0!%TEc3j6nd`K z6-vfqbVLr>o;P?_AHO}PU(a1iewTkE52(l3klQ~$AyawsSYre^&4qzzL}iZvc-les zIUl?~pRD)DwjRmO3((=^aY!Xr8Y`x2WEqUd!WUw*?Up%U3a%VWlfl1;{E-FH(>bb= zGtNCia6W)(7}bkg8>qCRp^Wq3qFrPPPLm~`E9ST`XG?0FesJXs%F|8E93dUMY6&sxq zb$#Nf84wDnr*j5o)1;WXupf-uWnJ>@h^o)VMF1aaDb$5T8&g`kxiRmH52nk3f>0zC zK%gtJ>WyBE?Pn9fDD?q@M12l5e`ejOVaz3`Jm?V$>=P7UZo_lEf?(X~&;De$W zP&FsdG^*v`B6^K&I`EQyJQWC|)j~l^9k}j^xT^(FC0~P!$ZqR*g&CE8q?{+bB#r^iFXJ^(!5@^dizEV8odCc*|RtxBq`BGfhdUffZh+`^EKJz}F`>}Dl zzKcu3F-1jU{syqeZMzNYkyFUKUwb*{Pd>L@5Ymhr*v-{WAS;@E^wokQ9@sjzs-@Z` zJXwM(WX{yL?uVS5z39X~{D4RW1){7`VWC(=mTeU zNW`9Eut)RROLMbKj?iOUQ0=<;}SxJP($?;OBWi@CaA$=*l8FP{x2^8InmA<)2{3L-i-&t_eL7uwY>n1)$Q&@iE--rB_>kBT_YT`7q)=s^WOA} zP4>5VSxC!j;!8FqY3hffCo8_5p6|)8xxbxxK}TFZb|H41?4v<_yzlRG9x~ZEwES~@ zn0>D0YBwTe?%)SUufz2`hV&{>;B=dR6bZ28?Zs&?L$iH1_w_JIHX5a}qHmb~CjR$L zY;`hjrjnYL@tCM<1{x(igKXC{;?m5Qs(n0Hhn#SIJsYGAL0tp8OGZElE<_v9gjd4t zms$@a6Y!FX0C6cChZQ2unB5vIA=C{ZRt@*rp&lR#wB-j;^PRTiEi)wbvXW{T{%uFw zIHLzYdivxS0abmhhbIckkra-PeE0I01&RB$S80N#>Aa8ScD>EVfztPa1z>ME%V$yM zKd{&`Zn$1QXZuE45mU&JDUMNT3+;V+s^HROE2YIo`xFQ|v;ZG{Wemqq!EGCFj)Dc| z{gs8k-n+vD(D8**8u9+0vO*zxl{{ZD`AR2a*iialAzzDRu7ujNA4=uGGFd1uD)c=` zz=~0>_r?C2w{yEZ7s~kaM|RGPF06J7FagvKqj;Alv$6nDm8YXOczsUZ>gRL1%FkTb z94uI`JcTWFqg^6FHPe*qGmw;|CgNE%6zjxTro@*t>X{bz5EFlrp zKitg-g4YQccmjE$Da+5$L^wklZfA(T*n746 zDUT?}IosLLogt+uNPD;_YB3WC+RB#-ikdu@BUp}V_Ra*|{DyDNOwYrSOhFT+KFK0Y1TG-&FK z0J>NdIgim3henZ(*$_tS$x`|?T07}$*l#c4-nla)WGFe_y4~tVx9wUF;YC`vUnf-C zVa2JZDQ(BXvXVEYDRyIIF||HfmW=O45oY^BvcJ{s45pD}+l8{h*#n>VkZWSC23vY< zj(d-AUuqWV>Ha?2$ZE2r*{I3SY055YkG&leegXXc zr36V|V4;k*4ELIwF^rR*+06vEo=c%HrN;JFa+H0iyyxqL-$5^`#Jv(*CH!~?799^a zTv>5+AT;aQo0x{O|Im^Q>5Ja^@uRZusT2gWXMl$do(m9!SmN04LQL{Cz>CLhjg^eF^w_eGR}7L9aQ^raoOH z@!%^Mp({**at5L|p{T?$x0 zb&fP@pCWew)$)ztQTh8iq)67XSM!dHy}jktpnaV@MITk|z2BF&b`DKD@I1D6Xmt3X z^gz`AyUS2|M79vBvtj`{jM-=@i#b*0fU|Fa&$mBaDW*h@umn2V*;D#=PWP4@IG3!5 zTha4gIFn!3JbYGTq2auM?-Gq8Dt4oh1iErVncdnodmeJRBA;7hC3f-H98WjlrROmppE^_VC{z8>*V zG5PB~rr8vr84(q8w>L+aFHXNEL2&u3i$QaDeRho-$_!|CRJ&)oK&PGeat?)4=c|1H1)`8F)F+;AuDm{G@HQGg6v zJqF@1OV5-gzDEFzBD9#-d{!a`X!*37e3M5X@yzXduRoxog`)x}9_j!P^dYbcVMw2_ z=#w^~JoiBf@S#=%jT@v-z6t$c@V)VoZf4OOFSxNTsPYXqH0f$2Ppt94!`r?4*fN58 z>Hp*GEu-St)^*{80KsY8J%J!WgS(U99)df;p>Yik!65{f5L_Av?!nz1n#SGT;j8TP z-EsF`_uRAAxMTE>rWp-Yvu4$N=ld9y@$2X%EImA`_CTP6I_-88*N}q-IjZ{^a#=T} zi~2LXOHZ_ZXF$-D*KA?UN;S9~l<&M(@>>ioe+-Fkb{R~vX83IH6 zVO7&#T8HYsfJZ`=YZONmXfXZdN~%!>Kr_PabY^wK@t1}Gjz~rFsV=EX;L*a2=R8OmZAy-`UO1_DS_VKGiV!S~0{5HL>t5?M+lL-B27&;LBQ ziZx2tonBb+gaWuCU)Mp5*08)c9H#p0en?N5c*s|Tk1phCvTr!9yh~Ksu-^7NvqzgQ z`UqIj5v{doZ8GC6y=cd@ntodqTeUev(pPx-%ZZ(-sW={VEFo4QI=k`O#gCgWG{C?u zv+0i(gt_g`63~KlhsWy^Yz}E##T|R|+CoKIt)sFA0D{f)z|M|4(#=cOAWxSkkisy& zMu^zZ22H9@Z4ElAY3S7#x0pb4Iiw$pfK2Sv$NviQ5q(X>O^LASGj&9E=A4myAI`Uh zD6*G>SBSeEt_TuVKKMCr2P2W>7Blj51n-%{zR}I!XJ>reQl4M`2dr}$k-~34o6?J{ zrBeihGEeM=L|t`y$gvWU((RPPv%_mVN6Tj}?amfc9f_XX=iVUbSZtO@vLTQqU@Is? zaG}ue1;3|9t^)(QJ=}@fs{p0fdZ_*I2UK#Ip(d2yQILx;k|30Fu{OsLf57koH!0HI znp!qABQ32rBXi#aTd=3QF;g9qMk)=SMWYaG;4#6U?+Ct;rWoSX%K%8F#h+>hRREC= zDlXLfgA~~z-&#FDaI0z9gS2Ewg1)1!U{PUf*V#8?4bG9=n~!8@o^6(LlN(ArTh@x* zGs_;)9Obkw3j-upgo;KGNS7D=Dg@Be-+CB|nj*bL`tiKUM-;k)_t<}!2mmif&-v|Q z&VE@4j{&r%G?h!UdwkhB-fQe)D zRmQD127=Y42Iw-=l{|GDH+f)4i#9rS_I+5q?c%8mog7#aT6*49cQdticjc=x0bd9= z6>!QllC&52zv(`24{T>pFH&niOGqE_jylrD`qNlvmRsK#-fK}nDYa*o2To+eFAZZ+^q$S-`%Sg)_MN{ZYF|)pw1wVDx$D`%=f%Y zEhz_u4;~%;4WnD|xMO9ZZez|hVrs!3tp}Apmo4L7~HS2cJo}4;>Gsu`dEU*{Md{ZQBR~a~5h2 zxG%CWYRiWXDPRZ3XrEKh$>2=fma&1@0JpnVl9>T|9)SPi;}CTdphpNkjMp4U)0jN zD30`r;&>bZmRm%2M9zD82?cshZ1p%G{8A<+EjiF7%c}xDqjqXTFwu{nP{Vr=7p4wq z7;q|o0ay?IG@D)BC}JXf^>b)%Mm+TxX=~FQ6d}qJ%n9EA_{REMIyaH?>_zS=DNG9J zqvv)^r*oe%+YDv44r8f`F0(pW0K@HD68$&ujUSFqbtqS3152|j3JejiB}7IBb%>n9k?@p?8226R-8jP*Bu z(@6iKv?~>|e zQHq?f^IIotdK4YL4o8MpXSH?{*Fm&`38(_SQWYita^LcU1ZMppuh*wMyKV^1xI8Sj%-Qv^jC)>;EPBImjV*^LW;k@_w0EFhn-;{Lt^uw76C z1h=&`@8Zs1yhKTlw5uoBAsjfvb3&()D=5*o{yvgcPpy(D_ayxPi$4Grk$O^o3eY@A z`$brsXqYY*gAfo(r>=oNA|B(a%RZw(ZOozwPAuZYDuv06&~*kIMUvzXd{&79Em1Ks z3?57=5y!;Xf)FD~=Ky!al}H)up%f(C&GQ{{hHC=?C%y)@56#2}5f*k32B~M$So+tlIjleted}qzdTCwE>G!;FSBH z<|@q(%U9mhB?-HL??C}zx3#HNUt1)r=EFpqZ01$FWi}>-L<8&LMfj3L0$-Bj19-w*EX+cD@D+GVW z&}}G}_pRf>+@62^V$OSUSI4ZqaS!r)KB9G90+WL*VbLDFY4BE0)w?4A?3@pUU$nso zto^`S5YAdEkwAh%lN6+6CAucU2K1d%Z|jh#09T$9xR4`T;WCTUhwv?YW2Xhc$6*o> zLk}K6bip6oRNFnDp!MOj%{B{h8A1n-RHRvNlY+Rr$@npnejNiji&W4ru5Wju7r+Vh zSx@_mo)UiqdWp7}8g4zdiz#+Or;F4Z>u-J_pA2JB<>#zicM-^59HorN^L%nM`1KZv z+l@4Sw9Lm?Rzo{qF$9)>jIzz;_Tql~XZ^5inWldB5X&waU-Y5RNy>lnkp352;(zZ7 zzrX{q{-Z5soCuXnlJMu2aSohsF1gf+wHsLE*oc5j0sh;011@}^hnoxJby*7t8C0U_ z`2+OJ$oFnp_96FwBo{PDH-Oy3axm$Uf#xSlIQ}*H$00p<4{A zH{Ga#S-52sZ{Wyg0aMDsywg1So2V=#l0(2DqbZ(>BG6&Bs;B#ME0aZIw#jz39C9M` zf(?k-_WAy=If%w4|7U}Dy77Y-z*d7c=K^1*ou9v>`N9XVzI|M+oy16uyn($ln>EjI z#tTK~KMju(n6GcJ&ouv=Ks*7!Pt>r%Y{*3w@d)14qP)BxyY5ZtR$G~sD9l-O8siqn zY2Q@P)kjYDP6(z7ig^^i9A@l|qE@`3Kble*@T^8VZPCW3L8d~EAsk#rB#1D)RM_{f z^Q5>m&E%prB6l&Tx$I7#T^uN9l49auW&KF?5<3nghT%LwGa-gw{RtM(S*lO|t3kmz zeWJ&;_~sF-)G=90tF^y~Pr}E`xAOyQVTr)5AOXKO)=87QsY7;_&UslwLpM>_l_Zaw zFSeKYwM)bD1E0q^<=)p`e)FEF4;(K02ClREF1u>+KCWZg8=ElCeE0TJ>N`1zcI}WS zb8C$$7Wl0W&tln@M%tG+o0gS_+l%regha^1Mf8dAXO&1R{0&`(`j1OiEhMC1$otUt zx~Kwsh)n6H>H=pQyO#QKUq!$M{-8Q)BEysUTK8;PoAKZ-%oP)&c1*2K<;U^y+WQ+i z_sr4iYW6qMHAW3w4aQ~%^N#v;=%{qtH3SbG!p@8OUvt3} zu7^z^YrQ>cO1Qsy9si_@;op!#GG*>mdwZB}BexT%G$1@IuY$lf7JQ9(g6g|s;0SK> z|6ENQDIH0?UH@_aTxCs7%dofgVPRo9jC#8>;J3-+eP7E$q?PC6J$**yl(dUc^fx!= zw;B9Gwonjbufsx+j#KIdT^Gw-yjH&@pcJ%{IX`}7g~s0w;eRGo}=1w|eQ zz;*_P^JYrHJ9+3VA)GBjDNrpKU@z4e2?xGbfG0qFz7Rr@Van%ZK_FyeHk4ve7VV@N z5%g1fW}4vz|9BvET(2qauDi_imfVu_Tm;!|e7IHFh-YHN=O0m##Og+pTmmodgI zmT%MQ(8eDu-#t^dW(C2fbE5V%_maiWw_Eb-o=G7W0kyy+PB2;Rss=O%#1|Z}mrc6% zhO}+6x=#KigwPY#)OV@7avKsum!uH2gs33GYyHt{$suCCnV)u@nA_H3-5m@007?X| zUgs7ow?oni$kwd+>F-KI%?jJ$iHwE3Bh7iEQ=U~5!=!2(YPrZ=S@llO0AHwfVfb8U zG8$RKc!zk&+cnZ^oEeaUulWYZ%7#qc+DQE{xk_A{gGtXTg?>T$o7eB?WRVFk9WO|y zn!L}Yl2F5p!Myc+743nxy`b_-AeBUe!~2$yMO~@5j@p`|;yQIn0JKvuTB5~qc9ywh z48(g|*mqH-C4EKaRmptV)x47AlRw{?7{VEcepdBIP<^BOUblP|^&RP^|2efsQPgV)ERNXkgVqoZEe66 z$H!=Ph%GxJr>W(&YGM+bah3B_dj*2BD38p^^`z=qlLO~G&kQ!HC~zQQ$FtWT4ak6C z`?+CB5_R%5+I<(Iu0wyzymHkrof*(gCCnQXFJ;?n>q{>U}J(DwpCtP*8jC)S{Hs^IoE}V~` zl>{wxJ3wO4gYyioHO)N~Vck7)j`4Ot`>a8$cqt9d1RgX8W za4e{xEYZO1Y{s)e*5i=42Ww7JPbFu0GyIFc+4ovV_;S{Ib!4!;#sKWS*(rHZA0{rcdOJU;Hm zEdc3jUb_jF@=mk}SRw@O(}9LJ4dZyueUn2%~^*|1e z*(bnb7*WPN(0cPwZym-XgT&QnJ5csefsBhUedd981YiDT*gu$zVIuLsR>I?bg=Kb5 zPL3H(K(%$3ntUT(>ZYQ*Sdjp)DjARcZ@sD6igfn6hG6B5?nshNpw5Ar9B{H!E2ql% ziT}#bYrZXYZUl%Q?rDsYzxYVSO;mNghf|NO3>Uqj@HV;^C=LSJv_ad(*?{WWYNn-< zp5!NO2+owOvvB-lsGNU%P1tUn*y(JAB_sUyRBopE)> zR~^X=+wAd{{K?-2uFhgUWU_nDnDV!7^jiSU7 znRQRP4__W8HdGsxXP63>dE4ts z8GFqz<>IIg#E9Cd9-_`fiEGBwR(Pf;Q2g4^2nC&7N%`=mHU{%Tw1L6@OXlr-K3n@359@F6nkNr4_NP(+-bSjS>HcO*13Af#5ND7 z0dgQWPnnD3r!DRM^6IB{ZFWRs?9N$2FtQG1r!p^Vx$y-PtQ`vs=i3 z%l`W6{N5StwehC{<4~j`|P?8SS-xUP^RWXd#A-x;g*l^mL9um0QugsHA<;q~C7L!XDh%bDL1@e;;{avpL z>}+XiwyLC_ixL2T)_wx(H(QZ-NDTtGvtj31VaMN89{=@^>~U~<3&rtBJpd#j!}E}r zg-kc!&Acd;Fs^|ajygsdPLGR@!%{75XCmL~Q6c-gqzF7Q-g6Zzg=F?|J=JLPi}^L!3f`Xcr}2X25|WibXF z%oLV<_wRG~e|k^J0)I+f&@ZbvRq&tJRV09_9LP#bJI^gCVWK-Iz{2|TPyfePFP>js zy`{{-->kiVxrP4g$KOK=BK}3G4;V#H|L79@XN|~9Ln*30tW-qxH%Iv29KT;`y2x4T z1KgzVe}32RmQG1SL*pr33G;s%zyEq#P`-p;S4wyhYAN;~50Ah9BJlMr2T+W-`dVFd z1Im9Kfd%M~94#i^r}u<`j&LgUKQGV!Ifx>Ne~#h#J9Vu8@gn^=3l|wLa@Osx)xhu{rw;N97RdspU9PS5Y&lh~Bg3n| zKdKvA%8(*29F4pGhoj&|f6lA6_^$Q?8Q#B-onLD7m$ZD_7SBBLzdrZ>GW@@z)4z}w z`Rvn(%&`3Zq5ky$`loSY(v_u(#XzOI_|6W-bPJE} z#xm0av?;;6lkOZg^D?SBI+I^K7wj8q+|O*m54Y$*o}}wUqibUDLr)BY0RK-s*$K*7b?%=I9SQ>)7WnJdzFclCz@T2o1~+SCR%-? z;YJ6R===NoRV;NBH0TXg{`OY%g98CU56@zpzosVs4#UYGtg%Vh+$(Ekla5Mz2Rypj zyzgAjXt^3w`{Jd6P4^Z0h#PXjg8erv1SF{++Y&h{8zF# z7wV3HVhtNkz#S{PM4p1r#oD-w;Kj?!5>=BLtC<Uf?`k|-KTj}s zaGqGh_Wg^bgwCDZ|2lL2{Wkp9`^cCt@amDrdAo6r;sB3rMql3$qI<^$X#*fw;zuAd z`et1>ub{vi>QEbN<2~>G^e{3Aw0LymUBZ4ppFw#9RS5v)wBol|&z}5re#|6*MnvX% zSbz@k-JOhuEfo}WxKIr1MZT@W+?%$kP2}{sk7 zh=IsZQmO`<=icn;Yo-EwDp-~6Vn47l-`A<)Tk5E*r*oDy{p$Q$=;jO9m_d2`wl5D7 zG~^_=`un9i0sjCJJiNOhU}6aV&$OZYd5*Y&3a6rHT5Y(4nLZvFpJyQQqyW3pb?#twHOdUA zI2?LT>-{R{UQ(2B05V;UpHd001QPZr{D*&t-*qR@2vXVl9L!f=rop2!B8KmUayd#- zPC1Ot9ya69n6F+Za$H-={QUywlLJ4FuLkT`vP6F}(7zXWzL3Qa8RmQg2LN`LU24L2 zbGpG*F3fpyM4w@9#<_FVds%cobr$y74IAHm4$F1Tv?+c}Ze{jBqxoD9EdYjiqx{{a z%>#HD@#67rZ*X&{v9uSp7Joc# zPPo2WgBy5uq)fIIX&@Zb6(R$(JH7fgdSU^H*)CcXHXAemb`d$BOo`7hps>fgR?XQf zl#z~~(Ze-6;;7z3JO<78r`U@2PJJi~8SZ8ox`=n8`dE?Jxw#$wA*U@ZHVe-g^HwEH zO~+OT?4Q!MJDnlkcU&63cWSDeZjf`>nd|z2`B|nH$!o%8mqF3yL?tbyrKR;DKR#al zLz3Fx4rbOf_!RtQQa;HP_~Fb}lf@8-PCc+(== zRpWqt;r89>PX5Ma%17VzSS<%5hD$0+kr@A8APMHX#$e~87-AGx?IPDO)O88%sVc_< z$fW3abfIOOi&6~a2Xqtc0Fo}hH@B>{oE#cCLXzy%Jj@q?F5xB}opC-5{@^ zR;shdG1?`q4EK!aU{HCx=zeDy$7kP{JHE7oi_VQ(>%ijY{K(b2DRAhu!=y??uu~;H zXMHF*0=jy$Xn(~uWe%6m1t-lP^mhdpPy>hfn6J>F#M*P;uZbn2wG zpqtY`!;sQ^{Nv~3egm!3shHi+24X7JfYO_DnI)NT%SeAL`tDy7N7nX9t9kBj3KA|Jqxz>OkM99AUUemXUbR zlR22IYDtGuYdvQSIJ{J%S~@2~*P$^u%wR=zhCU_1X0C>dEJwt-iN)9j+|E zk*~@(_X<|Er|P{~Ji^x+YrnryrJk_Q=DK+NDxgYQ}?2ALs0FQEKu+nXQYQGo)mVBtk-bcps z@S>C<4#%5Q^-AkGL{+_(5ggaaP$R$_*$!w`zT0);T}nKBKz5;AWWy^VsUE&NOwjyJ zSVw7cKUIcLNV*<}V5;wKT1c1EXcE5Yc~tdjE#O6RM6tG7?Kr%CagDZADBxK6qZ6E}}5I3Iqh= za8Y&M0^yS^jds%|$Qn(3QsurhQfTL}3C=>4or%`_fy`3-(h}=HAhemjM(Bysv*8oNm*CmYTc4?Ol5z*_pk9sTi=*=@a!&I9^!eNFmx(Mu zu~e_2Q+ptWwe9c=Xlrm@C{YRs8!PzO>eGm4T-Ud2 zKm?B(`aZ*Lm02Iubz<=JF&d?l7$QHd3%^H=@u}4(L_doC+rw&jdIsxC$_}hKp6+~p zy=eaRDmty9zQ+y?%i^M7EHeY{;J3cG*ZQ-4R$JrPxX-A{Zx>pz=K#pXwT&Z8;vS_Qhhot{eTF{3~Pv-F(!+lHuQPyum&7wa}2-rN_yJo8`_8 zYM#wSq3@g{q6g+10hrT7fp1oRZ{#%H`*W}Ov^O9G^~5noU$0GRCeF3gc{A0wC<@K3 zhTSqt_nclh^B0&pR{n5WXL*+ z=Fn+S_;wq0&w7Jc`qewjNs-#m>A%>UYv1|*B;0B@1rmpz`!u#C6tM3^gnKP|-u7Ng zN)TRPY-s~9u@56_#0TdF>p7{ryTJ-Gfy&`#W3MChZQFEX0V&)INKY= zQLy2)zo5kp4_`=4=Ai4o2zmd2$H=wtzKL1)Ysrh3QPer)3zb{tH`_liTpaCARxdWW zTkC}(w#-~YPhO395>&L?u;xnc3ZGuS3rbM-2>hV{c!dxYA^#YST>jzImDz9$LYzOL*0>$Ra8_q6$>a_Pw$-zO}^ zs@j3PZeybsU<*LY1adzcO3$+$6giKC!G>Z#{C6lMM8E(HQD_lg0T7IT-4`mN;CqS5Bq%2R;i#Xo;whYv18 z?hrG*w<`%n4-L3El2GyqJKu&9#|Po$P@%oH=MVRYuICyj(}d_1$#%niW<^d*#m)sS zlvB~(cTklpX3latmSL%`j0bv>*oNvvqe3n=5)(htkzby86R{b6xsp4tUhU77Z7qk> z+HJjpnQ!*dZ8a3R-0W9gef%+hHqvTdizUA3(BsxPd;|JYZ~w5Sh0>@?g-z}6ZGH#b zSqtWY&e;vOY0g13xs*$UodV3xdk|gy8EiFlviTmAqHDcnuJtrjtY}_yA)Q1S-+pk4 z0+W7AAI^`21%@V$MQ}ta)(Gd3FT7xrxc||lb<&wN6$m``%M^UX-6g@F=b&IYUln%c z`RekFHT7&%$e#x00Do1jUQEoEvbgggPISeL{QbS1&iWRN!v$1zq8%>suE#Z)t=rSj zj$;IG1gV`N!(~#hEtb>G2Y@cEpK*+Sl*&AAj{LbkZbs&@=Cn{pNYtQ9L@n zMx-?;#pEBdhTJCH39HpI;&f~{Xn@CB=1C0zAP-TGk1r13I(Tq2Cl!;l{_qs#B z)F6b7EW$boES%m!y|e393-lBiW}8|whTJXSl?k(7QG1Q-D;#ASBxh}NPC3Mmc#d4V zu2~MJy>~F;&#=nShGD{En2Cx`^(R!Ev?Y12$IjKDJsmSkPP*N@RX=c1eT_tEd17vG z4u24GT=?|$FO9zc?#J~^pyzU9o;FSd+K@n|FYr3Ih|Jm^=9gXTR3SANi|(5he%LW) zj1qgcoF>V0*r`^+K{d4Qz?!E(W_mrKX>YUA=KxP6M@xg&uHF+?s6&w?V@fgOpDM%i z%haD_3@}EsxfP(5R7ICyv6o`?TShd`cA`$WwO!40Nn~EMNCnK&%?2qI(Y`Qt(<^=f z|86Ln@$;f8z<{gQLbf=zA}Qn(tL3-yGVJY_@a+Mo8+Oa+staO6+o z%teIZ$*t)_cYsZ@9Tr4?B}*2L|@K(Dn zvbyguX2}vG|AF{NyaOkq7@L$(h8pyj;oRU#CyEjXK)g5|M{zk_=$%2q`LSYPM6$&IuO6000BWHuFfw8% zon!wYNa{b1Jl+aek3jRvjo811-6Vl%t2I@0qj(ogvD1(S zzVA`2`^+1}D3{Sy_HC|c)M|;{&d|Ca4m)VkWW_aCUtH|%BuYpyy7@mJBat>`8*PvJ zTzWdK%OuR`CD8d;8>!w?1%Kc+C^zb&)ke>kfqunC5SzC*=^&kXm+{*FT@!H0NJlmW zCbwEnZK?f-Rb6^8pN>6gm6O%FC54UzTN8Dhb|+y3n)TjHi*<%TDBm=b_3@&}{&3}p z+fDS7TTkA-MAE=xgMZbR;RLkjd~5Rm1QAvG2+*sfGhq`XPtJezcIU$T+ra6Zz4n@O+%{er>mNkPtHY_5)LP<)pXq_7uDG zX5*K@uK5~g3`l3~KqH4XLM$IooOU_d4<dN*Ix(nE@&TV>%}X^5P?rx@9=&L^T?M zHI7)BKq03+4VpA@9zVhk1nSxZ#@cx&kKRvWvm=JxoJCzXwemo8**~uP*r~dxnF3vW#&U}gMByjaA|2y~7<2n!9j(X78Q~6l}W5b`tPP%SuqE~Z)-SW?kkCR9I<=YX zd6PXkj6}gJX*;=~Sop%bsf6j_UDCy(dAk1JS6BY<*u`%Cxm7SqBuaq~T~xW^AzanB z1A)-Dwda+E(F_cicf*QuPG!2N*zEgkdVk#l7NSeAjw&Qz4HLHl?K(EPJ>VIDo>e3ivJK z5XZ=%;&#DzhD@~qURQ?xXkt#v=v?pn|K$bni+ChRwp8l5PMS_p>*=YtS^qcX*bCtF zZ|>s5z()T0NdwwSqcWzmhcNHn8gUY3IH#Znww6ByCACrMU*{^8qBSLS7-|-Mbya z!A*g*XKd>kf`=_IY42@9hneX_Cao_uUWLlbo&i{wHXU~7vlS6F5MGWFluJ^oh8U8Kds4|IEQG4%;6RtXr^^HuJH!2tNNr#q!JBa3xmrl z9ComEK9--xJvDj^)%ZTVyQD&1?R+q=hYN15#RXkgyzb^MWDc1lVtnd)3~Ec!-(qr^ zLi6B}WE0689S#f==++y8x)(2vcFb?gSk17z^5pgB#OtW3JW#sx4N+CMecv>z#6!}8ggPu-6g z8KboXA`SowX9Ak~xN*SCs}m^G-ABK<%^}ah-6_0j`AGAxTc|%gc?d^HY1$#WE5GLP z{~fOWzr63I@Y~i=zTwaOH2mcYjvwVPuh+E+;@e5cc!RU-Ub*Opq6Iq&J5Ld-OUALCYjez%cWpVX;Xjr=^{ibu?tq6PR?0 zgwr%X)s)oh_wBCV5{g9tOYW*-Ml?};#@YupUlpRvHjfZY&6_RELvu2!@bC;l{zmmB zwm>yi*F{cx1v$wdCN{T`_vP)CM0m}ft|zW^4T(HS-X~occU$AxHwnK!_H7a&e>GkP z;f1mX7*!Xr&+UVwnCt6=&uJFfI89{q`DuM_Cz4x4j?YGF?`)-ZbVv?4b3(x*Z!kD{ z2Bz@By47_rpbmlMwsMll+&a98DUq%t>8=XDhCk)_J68bMc`b46t5TxaUegd`z-RfY zOQzB+G8%lnnz}Ym8w9|!WQ8h>I!~ZiK&%n#VVx|h^rs;c>`%e zc5~P`HEm&4Nqy84XLVeQ*HWyTE#`-Wvfa6jWk^x}?Y|~_x)c^ngaG_4d?HZ?UO^S< z*HN=;$`YynRKfLffb-?mi>P?jyogYSZ12BzqW-&96#^x|lX*^Q?)f$A4UlYn(UK}v zuB(Fou!3o~Ae=bfLq?}Q_NQ9`#O*qmEUvC%KrGS<0^cife{M9EKInTwC17@E#^t2X zyq7{Lk9&)wBU@v;xR<*a7M7dcaQ_FLiy}+79Q{U5V^h>x;23sks`_-f&@*TDzOT-x zE3a1-NKQ8c1C4r5CZ<=RB{3oCNC$dA>;1^KBPp5B+2oUXzmpfDqKdBfv}|8BTipO; zE$yO@PJ5p(exmNY&SD}jSJ$*%fJw)YB0JG!tV9dv>G+2@XZBm){90^WhvjDkujM4{ zR{>4m*ToS7l4OYaS;YCS`Wja!j~Qw3+8>miS#af{et!60n~?fFk&^4}pOp`;E1pNC z7m^=2!~hVP=9xrd8Z-9F{yrciF0B*dt9 z=AolVEiB5+L5Fwtr|U!=9E4Fo!1bpely^N5L^=a_VOK|h*S1ad4{$AHOy3#V_qQ3&F=+U`-*^>F4|##^ z0l}7oO`0GH4k}d>S`UDvTcgPL&_Of*Rdsrox3Y$ND7-iBI|A|#->$6w;i(S?Ki!tu zNwrWE7Y)y5M@+@V&C`3oAKU4k9!y?a4KzC>{YN`u+~6-Nk9fgg4fD45tJB&&fE=v< zV0|xJazJ3L|IJ=rTMjkGhft}cw9XZpG?hYtL84E3db`Is2!KlRwYHKj{%PNM0e^f^}CY=@_gBLh~ z1d)>1n=Tc&Dj9PTyvE#kJkQ5-nOX0n*-t_yS9B(86F;7By*muXLtJ6~Wj$*cHqBe(fcioMK>bwkZJ+ahofc>TmZmJ!Y20N@3if`CC`O31_W+HjG!fgn zj;@a3ml08?8uNzAwSX;u5;1t8<{<-Bc7KkM!E%e^x9;cRG?lxE*wZ7R+IHU}GRqwM z(_VA>qVGclj-+Qk+|CW&JxCexNFL(wzYaM!&w<|{JKHUmJ#cw?ToioXPh=;sU+X>6 z5dWUI7ntOha`lHN&_w{bO$Aa`v5v+7Q*z16h1UBUv1=kzeMfC!0~995Erti^)LaA*U$1Cd`67p* zRp3ENu;+Qt53Q%5LRsU>Zm-vl&0ur0@gk__Zc?^$ zbw)+RaAyzUX#xN(M!LM`6Y$r8bSdPPr{MSIs`y>w*pZ{uJ289lwA zE5I?4H}wd4Ibfyx_eHt{Wh=nB>t|U?t5zVUrKQ2L{ZqJHvOsxodQkD@!f_&%g8N!n zT4r~0F^hgt$NJvY)|L)Pk0!jF3BNg`>k0EO;P-vR9huvu;lJtYIDSpn-(NB^vJSj*ig8Wd%s|MLEm`RBA@JGk@D9u} zcED}S-EwWbH4-xIsrb_(&kcBc{C zMAbi@M0(#HOliCU&W8JJJsvDyp85K9^FedR14c{R8Fi>b;UN$2f^r);>slR*1o9dWd7lAgrsU^ph2xGWxnUe@RM9xF3=q4`*(RQ`Tph_$!0?t# zW6xDO#&z-!EQ{#^kj44{4j;oBbOxjx{NiPM2zd$-T__Otj=QD8bm~QQjhctisT{`! ziULrjyC@q}{6U$!MQmHeg?~~h%wbui=sHgg2LrMUPWlf2y|8(}7ejmKe8;$iM!6gf zLsG5OFN;8T2OH9dHLzjc)apjgB@R!DStMyuGhU-ch$TVx2LfrM!H9mwH1X-Y$< z{Nc(roB8l74$n)8R>sgT|0#=UKI@u4+oZ;k%9FEqYWG8+qv_;2Q3jKp+~L^OTZJX` z*7%g*={RI~+Wv4p3bhkI0Bo>9NhpdooNn2W#qh)Md9zgkHxeOZXs4+p`BSVB#X zd<}NGr~mY-Fp0q}x??78=-TPQ7>&j&OR??uYlOsT&%M<{pu%E#Ay z!W&lo648xvnOKLy)VzldZcNK*9sIdgGf6T%g2gM3bn^y_k|XE^yJiJvAD6rFYIPs6?=#Ub6|kp6@SD9A9| zSO6LrQ@116BR%VIni5o$s@cA)wTd3I)Rm5x*BA=>J;~@ZRGk@DF#e%djVJ_TXk8nO z+osCfmB&n!pvdGwJSOnXSEQ@v?A0$U25nf(4E9=J>csJJtQw^351l{vrIq>`-@ZBg zp)~p&o3<^h#B*kqOY?34n{nvsY)snR9eV3|l`EyzeOKiBM1H9ooW-?0xiK7%3{H%T zsvy9{Y~=d+JvohT7UPO6k@rf@KEkT`;qqh}J;nxBjYQX>JX6=((~NoL*K&$(K>D)h z8JcmFbFIfxbWq06PxAdH^CH(*gB)izM6L%Bbnu>R&!@>?9ANWO&w-DwtCDG}0H=`r zFzz2gOek_$eL#>$D`rMzPR^^kx$S98($HLY68@SAc~2X;;guMGFv7{$yFL2D=F^Ph z#cu8N0kEiVIz&-8bBf*m+}#Dkax73&zxT_3nNcqT^>7&a&ptB@Nj+zh5atkkx$l77 zJ{H)w2+`%AtBUNK_dKXJojyT${;WMX^|cCFW}Vo-G%W*w7g;c!UMO$bAL^&45VJdV zVV=t`5(jzRwrhu-v9I9^o;ZLU3c2R}!yi%3XYQX8AP5tEi<=9JZbQmg<=%XsNpc^@ z>Tt((c>U1ts^+83wWux6$7g7gxSdl@eW!zcMQ# zQz@2$vf|Z>BI7k;uGq4(Qw3$lQg)qxN17MEkDt8*(uGI9yBBTsZwgen_8=TJP6;rl zn-*=^BCYxFZ7s+ywssL!42UY%UkFT^9H*Vf*v{I4Ds>?}cu4w3_%{9_# zZx*r-{249jU}23W46ZWm6ul{whL4^Mw(~maQ{}%9~_vYR3@(Q&p(`C}BQcAJi`8spyyjpPTJX$Rg)N~v1-G|j&Igz*_Iy$NI|E-kZ zKR)#976X9ZZbv$2GHMXz|3}?h21L2;ZQm{hB~%bZkVX^)l$LH$K)M^05Rhhokro7L zkZus9V`!LR2H=DBN(8xJa#rQ#qU^br+H4`{#y3a*3jh<1rGbk zT0i=)J0(9luUgA-$D3JOkG_5q%Gc5Ekago>tLvnf9);&;T^f#V&0dMiwN3N z;xX*2dK>Zo>u-pn#nSS8-Mnx+@^%w1e^a*$R~i_Yv~)Wi^E|NolO}+Y7ihi4nSpkc z8JN^@3$QH6bm9{nR2^y`CN7V?`6oN`IYUk|qyOm`2g?AL+BhJfD{?gMKYybHBD(7w&-a$*Z$ zeao1QvGQiJp+C*ULhmrZ3YEo7+g7V?kzTzxZ8PBc=ehdNV3&|P#{Fjt6nfds!at1Yzwm8~kB~5FcDhW$ zDz73{`bo_t>N0kB*9LNN=5X4~bISF4TIm(ppFYZeYXATFqI|-*A1Wk_rd;ohgUZJ= z%5INhIvum{av_D>%bhzk`QzC7<;D2h4;(+1!xdHr&|;U0SV|)(u7k2{4DgVTUF`fF5jvqoSkHX{wF_@lP4_h zopI2(wIR!^nH%U&O&eT&O_#-Cn8xexUza2YPl#@1cfiWt^?z9IfJm?W9WE-qadV$} z0!et90S@q)s48w#jWV-$;OsQJW%-l==Js5JopY{v$eCe9*Wp+IGW~-^QG;jP2?aHO zs;wf3CG?GD!ilrVY5yt5`6=q@HU2;EEdDg7{Qj+LB^uVF%xoBpqssB1C>%`L%hG0% zVt7l@*sD+V(CpVU*#Wr11_apw_(~h22c_y2wx6Hdg3w@aY}@mEhJGDXfH|+2t8qXC zd0=E;(HlTjUa++OGdU07{Cd4Q>6(d6tXW|t`1fuBixVI%;ij-|hz6bUxFE7IwVlQv z?)=gK;d<1LNFYWAi8{861W)Wc8cC%<2fQgGv2GeX}}p?%G@EAm!WGqUwe9h-cvZ^fkTgC>;$mp#FcKw9xbY)^VOrjq5}u zsLBJvnt;tr?eZpVCf1>4%hzgak8A+$#9rx2b=naS!cIlm70s2Y;n&r@!<*-T^|?LN zP)sMROifW)!S}0&#@&$?47>qgBk3$WQ0cJOp{na*$f#RQ3f(auEnxwA3$j->*X?{& zLWeBiVlf3k<&E5!28tCv_u9_2O0OUDRj5G?_v?iH2uO3PN49Ny-+LOn%qWZXafctk zAa;c(hk&4zQ!yiG|KjzNXJbUo7W%~Hn3h^!ZdIS{<^-TA^E=tYpu);uqRes-M(MgW zo0#azyik?cnhU$qeEnsB97doX7eI$ zmlKZ|)+eslxg9#cxa^-Dw}brjoU-6d`?d;D_B&l17!nG;f4g!DE0WrV(Z2&m zF0+3JjI7!OVY9$+6DrSk#Z;Kl_kg2< z5infDZ+4t(if%!`;ol$f!J*@Y&KA>VhqbrXDyPtgI)DZUQ+DCR`x|8WXSMZ$xa>#3 z=WWGm0DSNN3MP7d^+1D=r<5rA<>!0D`oSYgZ!t2+9p*#C8{oEbkvx9$Xul&q=uaKY z$vO#t>wRCf(?r|Et#1ns$>L(l+AbWs;VY3DAyTWNiF}_E_#JHz(Fk`KdDtPq_N>@p zkG$AsA?oJ4fz1hBP5BX7R~ys3V&nBek={(`@3;^QM|k>w#f6|Ze#eD4FvPLR{z(f- zj*WEj?RD@WZy$cHCg-uO+XUsC2YlhE1M{)FU>wlWGx$Ha>wUT;N(+N*jLm)G9x?wg zf`M^G40ZfY44n^7R)Kl>g$FWI^4BYy`xohNCdn1$SIFeaTD~SKOLVCr#t$gqS(>0z zE=J4nY??j%{-W=>dpnp)2+3L$2=m2lu6pL6{16IrYSDe|u^WuWofD*C?1Rxgb+6 zY-ftoKMw{}z0WtKR8~#b7oEoIQUsbAmzt#4TSCI@$LqNVT9%OX0|EvRw<0pdtV0%g zZa9-hNk5hs?&b9F@Q-NYUWFUrH0?=$1~*eA;jjEo|BT)G8~pfruo-Y=a1bCC`GIA<>5Ffad&HO^U|7dHTucgM9kg351%y@z2D0>#%i{@u2IVoWIsGkz3D95-sdMJ%G%lqgUCnfr#v)&*e?FZB|QfB>2knrk*v11H{Hr6 z*$)Mr;Zd_${u^vzG+<{~WOCse(4}3_se1{|hHEY}kN5kSI%_`{mgt0kcm5wVr*pXQ^IW#Y-{>4-C;rVJ zS9lKWy%`XGl3CLwMQ`g=Ip&NMyo-`vnqU38Yx3h0`Cv$@`PiTZbbfcfl}*R7;!fge z8)qV%YVqvHKlq%_5Gf^6UKR5`v6*E&f_OrsbWMvDLOb|iHJH?dXzV^DaN+Q3`K5uz z+327|BY{lqz}IGr>gMNitB`e8>zWS(D)lZi4$z)#Wl1)GPc3%w(mrv9vAL)sAoF@L zfb2x_5F{^>UAPvZ=dum~psz=W~J=Q4^e|gJ=ws2Gqkfz$T|D zjXqWOa+k@itnNia9(0Poad3&k^BK^xj+MDg4vYtr@zUp=QY_88+EjtMKWYt5P#wa@ z3tHhUHD?PV?)f%OcehcJxj#N+?>1!+Fu!#)sL;%=JDCgSyxJ@tXUPFf^?h^S z4V>}!p;a%t;(hsF26UeU?JadXZ3X8YLeI;mnp_3FPW$sTIk%9kJ;<_U_GA!2$EsOo zRydnwrCp|3V*E}V8(6BS^?@)4ncqn4&PQo~^$f|?pkdKx&MMrK%2O+>yBOF?;|wUK zwxHzKk}H^ZeBH+0`z#`S-v&7wNo35WdZYaIgWp*pYy{@YG>a%EMgm}kVDLlB@uSJ4 zN`A+ZHW^Rv1Ujpnll5Y(?$){31oqoyYlAVjbxMq5rUc6=YKb0s{toA)OdHR8nEI^d zjEPNo?11GiS5eW5VvXxnc$Dro&2w3`=7`M+UN8S)bDE#JE_N}`DW3f}aM^8r06E!5 zXYj)!*LP_RWm*?4huC8Jdkur_pY`Ot?wHj;%LW+#;xu-TWD_$I*xm=QtPO3IbiKRM z4|&`~<7FgX9R^6Rm#|Bqc30rf8?|CwRs!nf7I6f$v(fj1%qEp*%2+45<}ct7!(9Pe zyYG>e%{s2f)C}o*X4FE`G@jq?Os3^mm37Eo`aZSmO?@ZdIR?#eLZM^BU1q@JB1OLj zZ)1LdA)4tEo|01OoX>P36h41lECo8HZHg|qKF8}tl={*;x+VPZ-j7^uP5HH|F5U-A zJfdvf{N+Crr%Kyx_7*2fR|}F%m#Rqa&o!Z#1fINo)hGZi&BR->GH}4(a7)7VLWF-I zr9P@Itbr^YCjPKDGh4#Bd~|&bQQV8)tE9<+(V*oF#2#_0;pS+iID&kAWN#b*nSwx( zm?-A$@_lA@+G)fAo7hf&d{LwNID9H8d;PWV!PNzHTH3d8F$0NT{503FwogYzzP7qQ zrv-m@heF_oB_|wDnI^$HB;QGv;$e*s#zTr3A!Y=?eNJ=5(s;DX%)YyH^9%+U4IIh(B{>*X^(6zyUN0n`qX%Q zMc^er!XpTX!usiWPX>$>kd26w>Vl9O&sQrPk?FTvQ83Wvu)0I_ViG*|onjPu<@g`3 zPAfIXo#!DNZa`Uqq!=Qm;kVWwt-16$p7qz}ctsQz2X@dLwG#I9%sm&2aSR&KjqpHxs!6QNg_$0&~zT@8I2W1 zqjk&r#hjy-RUT7KWdqMnL9k`F&%GO!PzPNGm{!F;HdB>qMBe43Q__`h#9H@h-5>L+H7zeHJz2F#(J@w!RJ~Xhgujx zR@bTF`FR=xK0N@3plE|n@z=7h1p1$iJ2l<);6RH&o6>WoW@-A!MEQCSG5b(htr4<* zy_}_C8Lj)qmYRb4E-9591m+&V@7m`%*Ppd_$VqmJw9R@B$BOD6I`n6%R?9JoPqq3E zM4kz#>hnQ;tG0MvLVUNKco3yHIak<;ERV{2T4c92c<5Gu!J(w2H17iXyJ|?Q84nci zQL4E=YYD=j6;JbQ#3<>GO5a~lHO>bD4ZOokO=vyW9q=Oc4;ltOOB~y8j1HSOC{v5w zEwP}n&@113VETqKKuA>R>)o#-s$keNv zFSl3pK|H3*n7|`!QWcM|CXoJDVB(v}ZavG)YrRbTO<+l*@(6R}CzIBS%R)rT8n8WztmX$E3`oVDw!jI?%SXZH>I`tK{u{CGHuET*AZCj!*Z z<=wmGknL$}+1n1In~V%37BvJu*5zi$ZJRG|@BVyQe0%HQEhX0Mgbd|vs=Rm1xN_%x zf>jo;s*Jju6r$0C_sH$1Xb-6evD|JAQ>^Q%ee!tQ?yIxx#EiRUb&1hSDgZcsC)wfG zMD?6OC9dHJ#}|iW3(?rL-}I10tTdS-xWyj^9%vez?DtHbKZi6b>db0+XMUk1d!(m} zG6$9vVRpVJ^%NH$(0Kz)2uF4oT`O$sQ*-8!!xeVUADXoiu>S}B8Rzye^zhhFYQECd z&rJp9a6@PseK$VB94s6Jak-+=(Ulogo0@LvZ-$7yN4A&NoZ`M97t}F#Q>9uC!cxFT zE)PDxh=H80>2trUL)+pJJ5Avoy48CO3Px?nbjv*4+aclp(~cmDg3o$HYKxyZ>A_b= z&2oza(dt5IL{3iHuS%w%I_M|Vg{E9{zF~gY3ld_)TCsUR zUC=xp(SF0^4M9JhBTd8&n!!5Qy1WRAvRSWu&g!r$&VU6;;Zwz-x^H2G#wh)ch2T^o zWVqZ?mBIebBuNm0@(D$)i`XYT0+^eREw?JORm`JhC%OJQ0cb!qwV5ym{%uhynU?-^ zY3XbQ)tlv_q6U1_aN^LWPHvpe7{ygzvnF^79g{V$tsZ?f6WrD7vp{D&_avmBNB^M> zpXQ{qH`y8}166)S!RK|Dok(jkVR86^R4^Z_9kNt{)y$L6?(&SQ2p9$LflI4lPNPy zV7}2~qE;|F+SGG91gF;N6cF&EP!2{vaH7$C9s?_Rwn$Ex37=%c`Ut*DvdXxG z>u}4V*0^eQj_6N^Rqw?O50pX*D{v)po^*1RL@f7bRWZSAPSq-`>m5%I^VEl@QFl|6 z6J46x-OieMITmO=Yz~JAQqgT;2Jom|l58r`e4VOL`x~_cD;F59VKQ+KAUT>qjhs~d zm9;fRHc0?a>B)^${r^~E_}71Qpq4{DlbMvs`y#O=GF{Lx4@voPPWSYSxDq3rqB-yi z{oxU2*$D{yB3bN>-ROx~9=*~h_HYpYRf?~D8x-(5PxW?VFgM=D3%d2>Y9R(HjL>L_ zJ{z)XLuGj3o{#5LR8JYJ^pp^bou=_mQi4o%C(v*i;nO;4#0T8=d)yX?ixX0$Snwd% zV}OAQV)a~AkGTF3t*N2{pvV1H<>!Wr*zbf2! zM{ln=jyrv%eR$@_t-}pjtYmsx7sw=UHc~_@v;D@+cg%t$OioH!*=`Uz^N{U*L9H(> zJ+3z#RsT(R$E5n{7HR6o8roI;0yjg$`dOL!!nGlNlZCqG_#DtE4Wn(&xNaNBMfm81 z!oJ$Z5S}FS_9X(S?qkZvQcTyTYb~9B8%dQY2js3+Or{~@M_%%?yTDYYkmy;|lHbIT zyL{CAl#^>*05O3s4FF7oor3X=Tlt z`$RwQ*%LwkC(?u95wKmBlTD?NJRK=AG{03o?J!!FcYN4)3CuEw*VL*UOP}A28qCAL zyqktAqs;gPC)oA_D)5N6bu9;4qq7_JI#{Un7PSYm(ka3>1B5KB@w+&Gd7JZS7D zu7d+UNsUzXl=6jdXs&^in+;1k?#$Q4@NgH)${k+^An~N*Zv4u)RoJ}v(Ze@gh0?R{ z_R0iqT=h=Vn?0Ze!ms#^MmV&GYDwnRg8cWJqGh$b6KN{nuQAFn4qSDOz$qcK#SxVB z&(2#LxLIlyI}(_mHF<4pPI#N~mfVw}YjFoi58dtb_yzbHZ_wMq{`~boZgcaovMCsd zenUgR@oWOoJQAPwu%OIGiim}Qo%{sr14V0cXjN`7d4k$})6QFi_Bf{s%c*-~^B}|^ zEU4D3+l$Din;fcZ>3bi?ddsx!b|6Do8+=;iZ%~h#Or_wzKs^=VSr&p>loAjh+-`() z$nI`&ciG6PP+N_th4Sy73|C+e9yg?7Z{F$QeR=H)TM!WFQG=5(M|b;pj>rvTI@Gt- zV<}V8IiiG(=jpHNB$U@p@V@e%ycbm&{zf%#_-Xd}H$|!b9fQ;8 z_&5QVfOBf|K2QVnJ*#pG9`0wOa6LlUk-V!DByH{TM|$`daOn?ZGr6!3;BS>r32;~_ z#A25G4)B=QmWHhsLANaIdm|*wFG9Jc(?-+V79y{K{dWMRJ!PPBh5T}1+?I9w!O+t1 z2JjMIqPH3Lt4MS?w1{)18*ozafr7GpYvXzAd#Rm7Ctv_QsQjg0|Ej79@9&7?M8IHI zy)?(H{tsFznUJGx%(ahu2SZcCwwBNdWfdb{#M5cdhpDc2utT&?eKc?jZ~?h^I1ZtS z0aD~q)28PkmM_CU&$!r0PD-hqkxBzhE@^pP_Zz11}_DH-M*t^v-^ z&BWE_GG_!bgmAkx)tkRzhdf=-ayZsGHBXg-n;*_>AMCbERzVsRh6=ZU-ZD-nD*Sy+ z1LssfTseIY))C1mqvafYuly?>m%4!y>|UwqhRD_?0wqw6rm#fIpSRom~Jp4 z8V!Zo)SiRA%udaO+iz&@H4^f!CrLghP?kBhk-bLMl#|c6)7%x!lEn*qyedug`=)Y8 zB}sn>lfohWE=7>*BK{83K9WA00#PYglC&9pbuxB|ItM1VF7DGyNtURIfRvMXV~Q)p z$8?01rl>CYOSq2RtNzmh7*FjS+!TR&7j9J_aVOm!xz{BzsP4~R$Or_y8!B^=UG6j? z?RUL^Fl5U=+IZn>+*zc6l(4ZrqFkEaD zT!VzeUmHBsnnFVJb!jSXj<(;){&?tAhO2k5sm=S!7#{Q&)RUB|S4#*%>+R8%ft>d? zE9a=8W0*{B`lRcr;+pfl@u)VQ6(4YH=HKg;^mi!_d|Nd;OWgb|GyHXU9!y{@?Zqfj z?)xEY3Q#+HZl8cD5HI7=lP)cZY;Dk2yY@q%;YMqUdNIw#%uDYNo|+a$R*y)%pU0Ee z)uvW~62r=eBP*3Lu6Q%hh>+~Thv>Iv7rs`BaoPbjd>1GQO;?5tSzn68-%w(smHSZhe)!AlrE`>165>5(?()A~?L| z8Q3>6oeb5$STbY=;N*xKc2zh)K>jz-XKrc?CSW*Tg_G`1-TCklyN9(07XzuxFa&@; zr{@?Hy4B9#2@pkY9nrO=S|J}Zbl_GaDkMB5Wr{erJkF_~P@3G=j^}r(ttcoAoD0SO ztuU}2XNvvNx|Si-@sjdq9$mSH_f25avnp6|!u&w^)RV0_K4k3_3sgnZ-z z+YduUW1iPD7oe{Q2*c0kUh4gjH^h>zke%kO8-!p8SKG~>4Y|3n?UrjP4?NTiFVs-z z?Ni>1N?o?qH(l(owiaQlk#koC=NQYA!wu8!Hhz#%oOTR)jB}2)mQ{X!ShC{f?Nd|v zx}9tjHEw~!)?;Pn?*Sa5!oEm&r~LjG3+mnaR3y|dt(i}S5S}u{J8yDwDr?3j6%GS(tj#6zJF30_+hhCETHPv;% z_<8`a<_5I2F<%Y!;(pBNgANs@tose@>yK#qB)XN<9r{7tsE<&;BTn@Jr-}4SxFj=O zN5cwm;3*9&1?ooip5OH7qbg{6BtEa)DmNe7La5u8m?Zo8jgGJzV*FU_per2$D>rB| zEhgwkKfiL~ZC`I^((fW^Y$U6?m>=w!PJj*)(Qx}Foz1HN>s;HD6wx77-BSs={S3jp zf{Y|S2TxjC;s|+FTs|eG^}RJ$)WjWz5B2X1x)bZG*+6F3^UlvWlOZY}xQX-fe_umO z2bP8#-539kQSBj&dsumITFuOyza-}M43+vicl*9nV`Mj!Kuf{bY*QB26uw3qqw~OJk-6-tY#F&anZ{N|NQQhB} zA6{;H4vPS8cB<`Y_AHt^q$w09?I=I!DS-QQvh!=LrLXJ?ra-3zVK)T?doB3F+RST% zGj#;`+LVh}eyv(hJk=O+LjWONPvXD9fA1AT`53QTt{Z$nD%RG&CW#>G0plR*2vr0T z6uIAIC+Y<$f5fl9J$m%s#`5UFti=Jywm1`*F=#|tOjXzGgoVw;x&S|^YPPGc6Zz2l zf^W!XJ}2O(+sh;VFYpiZop&6Se}{iKS>qr*(DC6Tov=wFqg<+&Cm$^|E1^L#rKauY zN&y8#JnS@s$>bqzS2#uR!4D$WD5{n@2e*yVg~ZeMS+q1vyISosV_S)*owY95=?in( zendD%ENIiI!s)lSv|J_gKm{`Kx-}*05m6<+z=?6yL?aupWnP}1anxpFVAyLqx8ACD zS)1r%&>8I|m^{tTLpkO7Pe51u>Ee33?eOjmPS?KJ@=t#0P3)-zq+LZ*@u2n}$5eCH z>omy=h%Z`M5KYC@+z?R$I-d-d>roYpCHH?RY;*UxvQ?&x#!s5xL}sXo-HvC$O`W#K zyG;{%#q5L)*Ph$uu_dFx%3O6{SXt%AJ`k#u+3jM0d4dbHmkp-gQIFFs8L~#Tx?a?| z-w?O586q>%!}Y!iOoM{sk6Oqmn7?H#ZCeTSs{66-`?spl6q?+C-o0*pH;A$!;Gupc zW~;xB-?xNF3jBx}`at0PoG> zn)X7M<`8S#X&C4NY*M6?_uBHy#StD%s9?$9Pecequ5hO zMT04vw-E#%Dr~YUakQ_=~hF3Sl>4NmS3(nZ-}Nzxh$V(3P`o5D=xoXuwUJ ze*9{++iJV>TRemhi(JfeWi}`Ou4Xx%XVTtcqvxAi00Cj7d(DjjH*RuGm*Ik=>bbKL zC#Y1%3ybleEfDI%5d>SLy)`h`c72!_Q9h+(?gbp5?Ac@mxQBpW&z4)0b?d zDaCE>nru}gn>NZMs|S1re0qD|mAZzZIfw;bncj^hQ(VOGLW{U)mh6 zyu|4Yz!%*O*ye3ZQ=2~)*(Q`C6K{LfB*dkXJG{*YA3d-6iNnxev)9GTFYgxk zmQCyRU%-yO;#`;B>&YCIO1Oq^iXj_qtItmam%n0*J~Cny`fjC5n<~u6cd;#R-zX1y zd&M0Mf{=-n+L$j^dh|53)~QDW`J0l<{lX4y%nkuuG(=p|)8SU#{EDBE=XMP|@Z4#u zIfaMTU;CxtY`|GIVX{GkO;fKZTH4(8G@8kAd0YbDL&PpEB8?y!XRy*HU&)R)_4(&2Nth6sGK+l%hmj{2JaUM z2z0+;n(+WD3dhpB*=U=qPOu4cjtCVA08CnmMx|P(6*c4`(8xUaFm96o+F#tLbJWy_ zbXf{~lv!btQQ#7=`*Wb|Eu@Kq5^T`=i|TWz(So7g8ErGiw(8>E(ttQ6<@-1;>2hFL z(0;)?QF;%$?R{r5-m&0Vjvp7}Q(; zfo<}eK|wSLpA;XfDd1pnbp65j?eEvc#A$8lo|C=vr@Z-^ug%r-N9CBuEIAf>!uZ=+ z51UPXe@VR}OY|VMt5}`6!6_uu3%$I{?n#H6Bk~Cjm!DXBp9ZkEaZ7%W_qr}Fg6VH? zLnqF_DM1i%W+=F&saZ;4kIKu-o6v{~bofp4Q=s{?+ZYlU�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 diff --git a/docs/images/flow-breakpoint.png b/docs/images/flow-breakpoint.png index aa98e18e7df2158eb970a3251498ddf6919b643c..a7a38cceaa8c91513f6b109122ac0e1a0ca4cee3 100644 GIT binary patch literal 114426 zcmcG$by!qw+dWJxAW9=3At{Y?NGT~LEjfU6N;d<7(%s$N-6`GOCEZ;^48P6u-tj!Q z_n+VAam+EBnZ5U1aqjb4>s;&7?~{xe8VUgl3=9mKgt)Lg3=D!c3=F)?QzYOMtryNZ zz#FWMyx4n~;-ObNz#oqKpCt^WrD14+-XH&k01#7i23&>wRb15u z1_qb%@dYa(PjL(bBM2iQETrfNyPx!A0lO2@?V}~Klj}kHjnv=6Lz53u_Fc`1Tgozq^3NER8|IhD%pGA>^fz58^^w@p=ad4}6;_|Mn#_EJ7^YGEBbDZ*3P$y~7gppn158rStxmFIy4NwNYH*bBTZNx96!W z(44#FFU9Ep@+I8kU60XHo&TjDeF8vpPQfAnUw6_o|9j!Xd|ZXJ4@Z$1mKGs5M_zWK z<8_)u7CFX0=j=aY#(;og084(d(GX|z5%tL&?ElQ_;~Bu9TZ^WW!aZA+96F>%{P6qq ze?mcC*Ypr_rTO0EK_&G2_n``KPB_}=AZuqPnpgiaPVyf~E#ag@@IV%I8@LtA?zeGH zXPX3bv~*eJiZP4EWcl&m!p_eB5a543FgtdEyx`xV1fA_ome z%>nCiEczeioxb@gmuQ(=)c!&`+sR3Zf4Dyaw~ecELsz_B3}l4xn?y5e#w$9Bh=>^6 z-&`1+Z4OFg$x@BpA)*d;NhgF$n2f(UU_!;COiK3tEx0|)Kay_2Nf~2+Y`rLWYQNqd z)QAx^T(4ZVJs}AchMb9!Ma<-BHdOB{)K%nZHP!EoW{6>OTc-%?ekxL{8gSZ5iizrT zzwC&?7Z~CgZ-y|^V2G~vPn5KDLA>Di_`+j{RH~*C1nedh2@E+qiLvX|amrJfI`FLE zHnIxmK{dK|+qsOUJgp)%qcTho#YCZM!_Y*YWb|(he##@l&}q*m=ROg6AJh@k z#B1+MH<9^?PvZB-IxAjq2r+hAG?=~D^;9Ac=}XHRTDr-(O6N>gOGH6T1x1tCn{hk~po0RmZAm zIdu~6-3`RCD$wvynM;rjWJ@O$Z3J}0)Z3YmH+P^@!2NSF`{+CqQJJ$aGzyf92BbL` z^{UNgbt|1eeU5$SR9+=I>#*!LD1xVn9U;8hujO)}-+Xr}sgU&%CxeBuxhH=EdV3Ud zQnXqqxuA?#@8-uetzi>1s+fh#p!V5HJenp((;j%3206d%%5bbEST?^kd5C8>4OG^t zzg`V6C$ig}D1#a)2G13LaZ?0mzfOJ%WCGOTtpF?#rnFpNCEEJ$*)oy?E-s{2avq0r zmUzqca)|dRPzv_cFv`xqy=q!(FC=(>udyRqL6&b)W-E@}G+MRJI?HJ-h|?^7E7^rH zygD=Kg}~j&-C4>58_;DIf&23ahOOL;;PP3Dp-e0abmLi5Kc=e%n~*x_&7S#NGy*ne zwJ2jC$}b&TJzy_CTQwZkoAM}it|MdVP&5~w2vbVSy?6B!5=HoDev7n$!%_B_wdy7s z92Fxm-yBY{>M^X+i&EH%SB@&D=)JnS>5s&bX0FW>&x>Za-~Vh{MQ)mCnC#T`>=hUDXItVB zI+01GUS9fBD8@e)Wgvay1PSJ0XrsVFQ@x(E3?^`LTDII*LpEYSfrYx2@}rs#i~0#R zhjm+B=F!pVU>jlU^fMd74v@7t2jkfT)PK01$r7Mup2a{b6jVtTJm8Hh=MJo)4gA+Jo zsA-)HsD|o}bbN>m)_om-lsl{+^;W+jD?8~r-B_&L4YIm-gs!7&gz?*2hT|z1cL|$8 z!$9<0T-Mc!Q{}zCGF&*8hH8}&Pk4LE!<}Iag+alNC?+V<@_c*L-q?`4is+qVsnc=W z6X~s?q%WuIbnp3%*BxtsU{DqhmnD$S=~MZ-8lZk)bQFBhWUQfdpjbS#)SP(CBl$9m z@{i^7zh;FN&Xa|%Rq<49>0~57yOTIiz4_X*u<*kW&mR5RUP(**yhX#{jkob^c^3DI z2mD=c`XwHdmRZOKe750mvfS1>yuo@;n4Hxte<;j)p~g3Thl9DviA&*NxeU=b;K`1+ zTI-4{D6XfCrMGT0n=S8g&*l|6p{$*g8+m(FY1z!`%N!?9E%4iuf(WNC?~%7}%;<7e zY+ygfzztxO1urgk#=8qIqSc3# zYWK_g_jjfI?#6R1{62j6@vLkxG=+duv#$zx#?|aqbVnm;6wDIV{CF5;(~G<#^Ooet z%PsO08k85ZvN3cp<5ob+yFF}BUuIgYx08$&h=_>a%slR+D~bFZ7+ur+ z>j$A3k91YIz)QS|Dd&sbS)2qt_Kd7b!=c0-nVd$=a@#o73i~7+&?Tcz-cIV%ikW`N z-_dTQA>6FO+f%_j6T2^$J1T>03*1cx{X#|GTx$@10$I>B0||{l?>q8?lOfvL>E1#B zQ?pU!YA6CBBzV+BB)*!>=~S;`TFV7eG4H1GW1e>GpuwCuVs58IVM`x2gQui+)jxN= z_*sn|wPoXp=y(Z8U|y7a!%pbi=<%NQ&m#o1~{1?|5CD zkpE@HmP#F)$WsWg^#qo`zFxa#4r?>{jbs25a%eUxh3Y}Z?qheewK8-uDD&Q*g&IY0 zUKn)x<78Vb)=zDHB+jqY^%sscLzGS%qfXE_C@}AhCST@7_-BUm5Hu!dHl3oM&pels zK>5n9Ö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

pseIaGjpLJ z*cu2E6%!H?ToONx{`nr&FF+4KELVh`<%Qnm;7n6%sgfYbb9_B?uh`KS{Tiz_w`G$D zT%FX9X%6E-|#8`*mH33MI|Evtx*^HO+#^A4>;#cZc3Cq$ytrvVR?cj1fc~ zuv+y$*K!bzP=U`wj&q~_+)Vu7mq2L-x7qFCpKlfX9S=G>N1kKS?yEm;1_HHw2jT|A zf%0G5IixrMe9p60r2qFN;Szy+flg-q9heP3q4mYBj|UX~J~INupI2stc>cIykTa5j z&j-r8J>~xlBp}>(LFfnf&iJ2@P!fDjwy(wh_nEI?fspX|djH>#!WtP8&WbM6{e5OQ z2>mW?CdB^zC~(2&)?*em{}U4a{|>^hNowt^@%KfcqJ`jdprv!JeYx}3?G=aD`=U_! XUb%TIb{B>M{*#whmdckfeDZ$)d;>xd literal 111598 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 z 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

S>q(;H(Z;X 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�YhsSlJz9FY$+KYLzHM)JZ zV0;)DFc`moY|h!CAy>_B(zX|M;J#E))=QdPBrjN9GC4vF5zxzrL9v;kMD1WAY=5eP zUQxgrb8TGFQAMU-yr4u{WcEAV#&Ya5U~&+uM$(0^>C^AjEhZG^=#>@je0A~DAyX_d+K-GhDnksiPgLj{6h2f0+U@22sxDW z4EG^Cekb6dY5>wmm&m#6bvAKkC^p&>wtyKW=?491$Xf25_8vXNIFfNoro_#ujahy> z<2}S5EwT1C5gDpbgm1g}4S6%kUkln?TDGb8u8OcDBFbJQs8_&G;ao%28SBPxuI#%I zb7{BTVg4Y=GHymqkz3@ho~H=kI;z+wK3{02{R>(A#LM5mQo9Fm>)afm?%)OwV!IwLZl?&$#6_Ty$_gzYvqshC%Q(9QZ#Kp?Yd~LGY$Qj3Y z&f&+ar~1!SWobzyesq+oF!wpiV1dqtlP&gER^Wpr>)Wn%*i2nCA|7)`yd~KzZ_EkorMoE>$Z*)O*4z`wN-uNVGDA+Z4}PmLcI8wHxRX=)y!ewKi@H2|6G%@4eo$8TMk zFy@8n@3hapE|$%2nmnO_P#U||(+pzd(8D7Kf@8nb8`ESEuT}oY^WGYivp}=zm<;7_UV$z?V$c-Ip1RIpnse2AmPOT-{?g4-LB5s zhi&>(-mAiX`j$zEm9iB#@|A|hW}%t<8{R9cH9D_~L`&eVn6ZqzN}0pUSgOU+{R81L zsPr?YW$(Ab`Fh!K9)0+aXOXFbMP~Oas{*x8V!ytKPhf&QXL33gNfzjm}LrgwtX;R z?!VpMF84c8PuPKu)bZ$G+%$hS=q&oN>6f;Hq=z>Cgqi#=zJgkCOVezeghbve;ZgMU z9tQ29wgG``fOj0Nn@C2!7v^fa7LfmD3ot>hi`c6ge1uYdMY*q*jB|~CFyGWT<2gOI zpp#5g(VPoAH7?;rnuFx-X#l!$IOvj{+m_GEv<=GLj^cl?_)t1Tk(*c z+G-D1Ma!gE1MR(u1f?fMcZ%x43d%+ruYcJ(7^7@g*oxX%gC)rua$1-T!%2$jIu0Zy z2mK(Q`56dIF^8#1D^06eXP|dOWkg`VhM4aRr^~JB(Q{YMR@&!yF}=l(lEjlB+r10V zC{lmSX-y`gc6AtuC%O&mSIg&*pk54p9}S!)T?HW&^LuyUpDZz*_^RBybQ~Ga z0AKV0@oh~VFm&9q#P=-eg+NgES2tovRnG`{@jkptlGI=uX+e0Cnk@BVu}OOMyXHmK zk&&$x0Tjw17>WosKwFw<-7GJOT7V^7O!31fYOJJ)R(U~RZdMJSN5(EJVBGdvmfG=U zsn(@|m)3lZvWiS(8-LW>*LGtGNW9S6&szwQ6{o{(&)s~J*}x#E$nGz!5?c_D@7(4Q zD@X;1-&ZN*26ZwYt&{kLXM%3rK&JX{^asV;phH$-xK^7PEH`b=oXE{`d&uh#KRwDi z=v>5;Yj~>>$#1@jKXigCOqNZv9kENwzriP~W@m}NZ8jU_G(N2TdAS9m`@x;b4gUdV z9>)J{`jFi7mj6^z^VH1+H!^Q^kG=Iwi}6;15~beF{qzsG=V7Q`vCb?%p;k(T)USvp zc|-rrQCL9DyZe69$3u$n

  • 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/buffered-channel.png b/docs/images/coroutines-and-channels/buffered-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..009604b8d175a93bde0b405148768ee1cba4f56b GIT binary patch literal 30655 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�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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/concurrency.png b/docs/images/coroutines-and-channels/concurrency.png new file mode 100644 index 0000000000000000000000000000000000000000..e52e2ebacd2b241dc569a30424167d22843773c4 GIT binary patch literal 205920 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

    fFl8Jrey*PQ9qmi#=s}i~RHj@;oo3R#$txPJXk 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 z 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 &v6{=cN~lLbIa(g^;ZL5$;gR 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

    -&-umQaCsZCg2n$Cu@rTMU_q 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/conflated-channel.gif b/docs/images/coroutines-and-channels/conflated-channel.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf118b666c3fa8e6aed081af4f5daaffbe3528db GIT binary patch literal 359844 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

    *9d*6iwNdHH`{&x|eCNsa-hIIc+*t(wSt6J;>m9 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/initial-window.png b/docs/images/coroutines-and-channels/initial-window.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7e3257608cfd26ae42f675e2e7496309a38d49 GIT binary patch literal 77777 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/loading.gif b/docs/images/coroutines-and-channels/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a862128cfd042a6ba7561a01cfc3f412abf5c5f GIT binary patch literal 1015914 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˙g>XwT; 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 M}5X0 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 z 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•~2KuxgXX=j`^3dTI@D07y1wsNb1TbMbz!O=F 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 K`6jp!9+ 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 z z^y(bNP~2=X6{X)BIIRKAP$InV3xi)GqBKm%xPcMQ%bXdugL&KbVm>QwKG}@H6#15i zhX)=$mr?+^goj8QeVZfuCb>Dc$+loXvml$9DD1Z&!=t6xlBlrBbT$@oNL)DCUyv9n zf*W;fz@y|^7S+Ej)>_sWl+I8Q7VfPfHn-m2f`=O-6&w+h@<&&^T!4;I(_PNqv+jwM``-BL7IVYYR75%`exdD_!~?q zbJaV%`OH8>^O|f}hBtTS(P_qPcn0Y-Lt1%#`OenNm!GpW)J878jXzE7Kr&NW4^-`v!l+qLtKfADikt^ninHo+<_bJ zTrS(bq;etAq*Ka&Oxb@|6tO4%W_P&YA<1aem1+09Ps@IQW1u+jIWV!YbWycSi`N= zqKk-G;DMlygFba77ou?5TJ3QBIg?PvsBffxWh=-UK6B?jauo>|F^Xz>f@gR^e#D2h zVdp<`B43a?3La)|Dr3YG2P+p$?)x3*o5kB~QQFKQeqpFSmo2#lQw@@?z2JtQ6pE0U z<0+YlP$s8Su`tHGuSWZc=Z=HD=Pt5%*TbzQUdngJYMsSze;^%y{cG;|7d3!5ry4|a zM$&qMIIj+<0S38$%{`Iqm!B^Fn;I~>sFNsqyVUy2=#pNt^rNBNJ0JgT?lHuxzJv>z zkFDIu)p;fPXmV`zR>6(825-$jt=%rZ^Zx156K!-*BIrnI*rOsamwh`eI2=Nt)-z!iQH^+=UHm zU1tWLD1}_Tr}%5V|NXP?voo8~E_0nB!YZ>qo*oqa-j7M977Z6|Mq9O{Rc2U@ez%{{ zT~SF_ft={%e{h?;6k7%*y%TPAV=eAhrKUC~(g&>FkZL8rRNdbeAb%XvM)&6BYd9b7q7g=$;C6h_eHHP6t)P|tF~xS*!D+<}VQM``k#y%isL&gqAbmy&N3bW$ z&$71t_ye0WOC>?<0_ui_&=WPX50Yn6vwMX4^;d!@X03X#_JxTf!JP4^igf?HCQEMq zlXs6*GAW8LX1n#sx*7$TIL7gl5ZTEi+zgSn1f2i4s5X=wWlJDO8yt6&BldbjglQz6 zK#b`7`a&XotOea}o7{c=>$aKItLG->4)1@NSh#+AZhGJQ*Dq5{;2C$bhY^>5n^`B^ zmJ=m^Dn-CP$~jrB*~@+Z+uX70ll$GLjlX{1b!tE3Vd2t$`HzL$M{fPh;4SBZ$>8!L zxYFv}?LQ`pq>4Xymz9k_U;Q2(nc{ue#XR}3%&cs4-qhC(N<=ZT-dlsKpa;U8Ev$f9~ z&P?5SpECYpvzFbPabAWoocKbACExa%xg|c# zoQwKw?S8Sa`AEe5T#TuS$V+FuGnb4$KkcVvO}+-{m-apa$Pp1rQB+5e%wi7B`b3v< z+YQJkRt_(hbx zbmcf8Q3$dn5ha~K$-?+Bdln(48@Bxhr6WmN`b(yQ@8N&VJ?(-v(ji`yR;B8+ts2WJ zGAXeS&VNkq7tFg_K=Pur*L6*fGuM`lNEv*ldyBW7OIWIvUH_?!Cha+k?|iS>+dRZv zdHbsKE?0yN%5GX^ZU*JcysGc=bs_Tib>yiC)D195GDq!=VN_?{wfZv|)6!Z93zgJs zG6YjbFA%$Ve!{eL?~^4srO#=oJA#iNAsnvQIyOX>+4$Pw>-Y>z72DO zXp9nSz2G+pd|<(*)fjRNg4++qY>XFX`u5tTw=NSa$^+2m9fr<>W2)MO;jGyD{xm zZ~~7zwG<896RDR;YSVNtcVU1_aq5{7s6rInXqPc>SMNN8vX*6BbFh1D1d7RD@pT@h}bM6ns6%3#BRq>45CcRfm?zZy4BO*s? zxS1|(*juif_3+eGrcma2ne@+WYi~RxUMs$ex@!NhN~jti$`ng$pwv$Da=U{bzS${ z@n^nzJfUB@T9H{&9mEC8y->C`xa5$twQFXhMmBH0!d8rr8fMK{{r=}wD*bfw==BYG zhC$0>)S?iA`zI+`=CmBG!h}gBk03ukS3o7-#u#lMB*0)w)h*t@1@~%FZyV^uUs7vI5r(=8`N}Cksw4%55J}g!?ZwMiJihcjDs{Y z5l>#!Cu-%c#SuxrXk}hrLyuyKx55|%%Pw?tFGt5<6pj(B4OItpB?tzF`qJHOA)iCFUykEj^jK#cMD;* z!rqH+ zRrb)$3DU?9>G-4D&(WZ5HUEtA_gNHvaM1tQZ#RSFv!eCj@MFH;uM&UXjmHmUuEo}0 zi%rBfiwpAd*w+8n`}ljnkV1zC=C8(sAlrQ%yleNz?TmrTiw?xp;iS~~ zH=>wxKL}bdb&(U!YcP@=nncEs=Ze)B!W3}Ww*0x;=SC0-jksH35CnbukDic=5cNv~ zu_PY?7OZq%)@PWz1*3+vpNRy@JJs!VtY4ivDp6g~PBuuJ8oolkf258c2%*D-^6ZEB znQ3T5YUreE=oV|}HEHM%Xk4GxFtA|Q6c6Rb21Deb>7Gp!N}ac4k(3auyeiCOOua_E z(LRov0|pU+$U{P*W?Zm))18iY)R<^HZ*+uxQ;%a$#*)yXG}<8o2T9y4FfTNemaj8S zM3Z3~=eGhG?bm$Jk#tbhWFQzNlumG>h?1y-y7PCt>_r|}5z@=Mo-c+AQFMDAM?Nmr zI&f7w-_bo%r{>2J)ws|WkXAv1?S8tg_42MlP~&S+H!bX~GiPPbcHQd!s+UAEUhQ%| z=(cdMG@c!qdpadZLiiknG8uPufZ7Nh=(CISM>gcT>2{Z6 zsf@6NK26Ta5WanCdB?unI4oav)2n{!s~bIrz0@hU^wjLIf~$S+)tS_$mHfd?ynOuI zMa2CZ*o%ao_v=`yo?8Dp2)U64+zBg8o>nH1aZP?0 z8a8VG1nkK^3yu8sTn%}T@`_RGNM4q@grdP)Dc8G`u>u3i@r~C>F;#jq19Y<+Jud}e z`3a2176u)AX9SJw0%Q#qG&%`x4FVOq`2vCK8cBi72F{{A-JGyniT(8&eYfhhjTM-T zNAw<4DF38CyOpb#M2@9HD(;{Ro~{lJuD4V(U$d_cU19m~(r0+SIGi#_)9!fqP}~6L zgdL$!3r=f4k|37MwbS&nBcbl6N{d} z_3O&UqeAb)UG=s82Yc@o)^xjW{e~V|5_;%Wx^$&uDAJ{gbP)lOCL&ExN&*O>haycx znu1DILiKWYDzz-5T%o2f?9Jz&7|_SG(7PO;(dY3?SnI!!7G{?3e>tp7QgNjKjWpANZnW5jXHx>^3R z$HB+D6$u&@O4b*#DaM)o{-eYg!rOb?tVsdZfd|YQ(GW5SVuH(%et%TZVYCKe*iYV( zpko_NuN8UDwiu-R2;f6;DLNejB|ywisPq}IVh_fibedrFAr%=JqxV}tT}RlcWx+R^ z2%A3fr`C~#j%RB$LL?79(VA-4nn3um+U0gHFZG6ENh@@sribgo&6ulC;=xbj*{7!A&Sl4)yA%F+je$%ri-S>vmD=%?i^vPeHF1_nxyKO^#42=Wh6L34%g( zhgN94|3EjBVf2Hm?_GfHv3Gl5!T4a=C9;0BlEK4!qQk8HXsxqj?G^Q!w;HyNsbCKi zAKrRTK0EMqShYW(lbGBzy8nfW9*>qj+dft?)uqpJIaF<$>+3rO2un43>4fUhQ7k!h zKsa&g`;Ov#Qet_S8sV3Hw5l;)-k#4=qg1sz9S>>SR^)k{m_UvogFs{g9BKH;B3j3b zyh#+UPLx3~;qI7X9c@--wS2XS=pPRAi7cgLR}vq|&Z-Ym`Z{6?-mf0Vh5<8DS>}X; zlZ}T{M#A9J`Omx(-dDHavMAv&h$aEHQ19D5h!JM zDak^pME0qOLQ15PP_pwMBhMnDA`qk;`&4o;GK^BBG~$Qaw99S0%Y}6p)TxUm%vFoW zRa?qcN5l1^iL0)otDcXmez>bava2EMys#VA$LVFzQLG4G{F!}Mnezzl`ir7`3lZo@ zhG6M`VVF9y$g9hp5ynEyN z?hVIv7N<7G6*C*I;Y#cPhtG z1q&uE7BH>!qv&@o-(Ie%AxrpS<~)Ev5>IZTVeS}Va{*N-qw`JgJFu|pY|$goq{l3? zkY_~CGtm3OaWNV=Xj(?(h~iQ|nzkOzl3|TU#nG29?T%u;m8X-wb59IjvNlMe5V-u_ z-xY;eT#sH_ONOA?@7v_@UC8W+=RwXrzCv9$=pIr}vM>S>8}f>MmMsBsw5g#N zL$JVutKaa%3IC#w2!6Hvk%q92jieS9zOQo_<&{wOdPip2mLcU1f`tl48p7k9+z)vk z6L$~NvfCWr&qG}aW{Z3e1tMXB)~_R@9+Kl~7K;>Ud3$>#4DKM27`trSB?{llZf}Yc5=3z3OPbhGhG8 zvVZG+vvGVsIzY7i1Eb8Fvt#ymlIgS1S}e)Gu*n#u+YP%I_JX2o?2^O?K5ay+9P8p& z(Ml+Zi@VUvSW&bNK9hw(!g3@jnMmpv=HZFWc0%miI#MSGxMRX0q{98J5-&5`90)O3 z`k!SLc@qRq1^#9cz49lmZaQUo{$?0cEyKvCs%aW7~?{ z`YyU6fn*AHdkV5O6`WnmgEhx=^sPdrpWcq>_hy#eMxu=L=C8tWuXd2#?3^U@*`)bf zn9TbRxFJ0^*r2)h8v~l2^p%eVO{5goKBOvUt)caHAC8US^G~f#x>Ju?4}QRDb2Zv& zH8_@4CY~>h`kW8%*okkfX8{x0(r?x!UoxCrn7K2jh%rWH%iZYOejX1t>iSC=dFrV$ z|Cz4cBNX%#k31%r;bVUmq_^uGje{)sGeaJUKrtH31; z%*PY&9{^0*Ke=RFTwK6g?D5TNkFXO__62av0JRMGh5%(c$fbdb{Xh`F*b1p@Gju)1-vo<69Zo1KX5RG9-Bz6KQuEnbW>*{SEK`Ir~#ZY z04w`rAkJ(BXfoitm9sJituz2Q27q7ybcPi0)v#g)crjoL2Fx+Q5YzXa1Y|Q{+vV!D z1Qah|1y)he7ZRtl8#lHow*&@a;0$KAG6qyJH>5Ez>}nwtK(+^1oZSX9fR`8ebb+rI zRI9i}mT1W#0K^Q{Gz^$vz$greVQw~9M;kRaVgfKUzKi~-LvW8|b{vj|4zxz*WrAJ4}aAppz2<4rZHaq-W$L z@G*lD86hnN#GEtHgbx3CKRP~biWQIv^uJvh6!y3K_eH1c*A}_aI=fyv)a{S zVB5lJLWyclnoNXaCekQdcIIw|(@x}ElE_1uC+=UUg*vHDk6pNvbq2ppJ(w!Qwn4eO zI#480gv%6Q0UO9 z$+SEF;wPB$utWOW6-dED6f&rg9N$uf!RA{AG7dy_C*TG1k&}qwN^nUA(Ejm?Ky^rD z#!LoHyEDSZtd$i`-nyv3+$7V^cPYAnf~_Z0wV#AoAVGT3L~9d6LP;k}PC|aH4O;O| z{oCnCkrrd-xo+asPmK#R4YldRqI_!|%2D*D1#c=4rrOD>!^+$Y=Z7**UK`z@4JfZjgw3BDyOE{vRfYVz zc3!u6U&%Mrd^Yh`-Ka;zkD8uG57%%`WFD7DDD0}VlTL`L$}b zaf3D=8E8(_SWp};xs*1uFDj%I*uyKduh4M*f$~aDL|@3haop|j{duZ4$BM%T;RhR7 z%-O@XTesq?MliBEOgaf|`F7eCOxSj=*AL_9s?p3fFnqXhT|rkgKda`Y%DSQp>--zR zZ|n^=>Gaa0PEt7SXH(iw2UIE35N4ed-4@ZuRh@OGoo9vOH+$M`${k#$C!(Ld>>nTCiD!~3^Bm!JiOUF z{xY2l@<>$o;`y!A99rblvaY0=sl>F*@|o82Vg@GnUZtm(7j2A3el}l+WjrxHBTi=Z zeiuW3`P)m^pSsqcG3d3-eH;~wbO(+;^NxV^!3=S?RHkQu{5ov{2esIP9=SvMs8ce$ zChMqH{L?#;!?J=b-}RB7L;Qu)TzHjIspP+%UG+UD|Ap>Ouy)Y6S6lu zoSRDB#)Xv@PC36s^@!QbMh%SV-vpoPVN||7O1d5NV%WtZW8CQ3$IiQ^70#Bol{G3q z3YFbdzagH^Fd_A6WZ>Xtq zz2do0!^T}GE*oVEu|*FAUJrQm^76p>Bu-mAW#D3)!iw*1&Br9^;1t!FL&FV$vGrY9)QUMoy>Boh{oZ(nC5Hcv3H&w?PyP=jLbOA!aV^rv=`K^*#v3HPYHS199Ncnll{x1X@BnXD#Bj$7gdT~`ux`A3-;)K%5U5Dd4#{ti7kR-5Gr4B z;R=PeMM)7$+MHRv3eOZPmUUfpcn_B}pJ{$w7R4S822aMv#!Kg7 zIfjc^-<%Jq@Upbd6?o|Q=GoN>55=D$y%CGAbL1a;IjA0uv{mX?E1#@5zdaa@v^t+F zJGE+m|7bY4w=4hbi5Ftlg=dNrsxka>IsyL&S@yQcHX+q&Zfkls^RC426QAnesxzmj ziWf*sd_y@yXO2zk+kdRxPG!!+6CHy)&%kcS@^Z~ET?=j%3%?rgdz=5&hu+4Q1>j2? zd%i7V|Ba1Z`ty75RTsFWq3wd}8#7m=&pLfQ_+k$`pVeuf#n=b^U~uYJ0(m^IpQSgL zRSA$~?LT%m&oYbk<>|Od@-f{oeRietpcE_!n?_9q) zFojY??Evs^7b7#EI|}%`m$9v$^{zH#=EP*bol|4s-RhB6&!Ar`@nqBgcHEFi%kNIw z=}k;Z=kCXiUHnMyUN7Jwg)tSJE1dVM2DmDDj>H0K7^G@8%(Q1mu z!QEn>=@hEd4QFD=_~jZxz3IDk>%PEli7A1g6gy{y6z&qmCreZZ2Oq_HPu7c{{(1$E zAU4@=1^oQvI2WP!{;;a=ew85ir?MH@_sbgv%z>)ZRU_JUbcjfAXKj0)`t4543RZ3{l#rPaJBBH~ZO7HYrC0;^{X z4h$6U3Y4smwEiAa_Wi!z-t7rCUy{AZvrFikcLRfe%1cs39*h{S$1qC-2PwNp1TXk# zVvXb#qm|vGrMjZ{-4O~l4=yNSMn7rjQt>^EWw^A5W?2egF%LKW6!-^L27z1Q;G3;6 zK2Z1pir!p8y+2CeM{Ig#u4&0h4e) z*^m0<)iOpIJ_JdB@|IG{wasKAg7%W^S#^D2K28}eOt?UTJ5|D+1j9%_Gf^7gXmVJ0 zgMl=|nZ3m^eoj8y4`T{RMdqY(yi4U8OXXQ+Hmnxm1;{cFhItv*GdXD@B)GQ_^ta2A ze4F<@OVboSOG1`$OvJ(n@!9*b*6A9yLXZ&H*I@q(wi#^v8AM33?lK#)KLc5vVfL9_ zS}EP!_F>Ob;P6d=EPLouW@P#Kp%Z(ivvQ{E|AH)AW+Sb>Hik>$7n=&LRX@3VTjwNKW1be!l>_Cd~R%j`pT=`50R<`=eDTDK{D}s?03nIS6YYh%dPAY@aYnIO2w zr3U%ypBZdX^c($28@5jrF=?%X)SRKwD%b3 zJsIG33=D=0Oezd4@d&ni2zE~dryYXZ5W%a0;1@>-9>UMuD|*+(V6c=f8lS*1P!#7; zD3;40b66zbU7)y9piEP!Dqg5=Sa?CaSjw!49D?2P33up-Sfeet5utB7x_c#nl2pyB)Ol||IJf$;=R2svjz$@*cXr+<};atVKF z)pr`)*h|dWJ-hZw1=(S4YYqg2j8b_~D z_AIx4qD~h5&)*IA6+!&`9(0u|puswjzW%<^L`cWpgMyp>2qfk)Tll8Py(gt_z74%m z(hqd{qVeixok`;xht}{*6QPHtZ<+<`>|grZNCYQYzZtQ+VO3-G`Kk>+`s*tV z8VbL>OZxH$UsiM<_M-9K^I!Fq67TBnH&z=pmcM*gp_*M{-&h0KV@D08_Zy1s-{o*N zmK!y`mS`+IYU)=7OtReJqo$-^S>lfv-yPLU$QDIh= z=M;EECR9`NlF~7=aN%ernb~?IrGrQp1lo3wcsVDT1SfOYjZ^Y7sd$awLj+o+Lffql z+vU8QH&i>$tF^2e-4 zVO0)^a5PEFF{J(Y3;Xph$)#W=(tz=?FC3{cfaaHtglp|RNV$yZ3H>^n_jSDK>*VCu z>Eo|>uHHGd-g$@K#n9fRyxx_j-qp$8_2XUwSKpRe-;P7yZfM_rUf*F;-|=MM>2V)~ zyWcR=WkvD2P-*xjk^b8H=;N&0G`F~%+`}o|-;nM1v#MtbQia-oxqbVK4$Iwvyv$ChN1U`F6hI@#TpP#faW7YTb zh73s2537WI=9wJ2$pAU)3lmahICqv`K53YgWY{1sg~wr-LU!1ao|R5!C?kqt9`Xtm zmtb@DC4w+)bcx~OONZ zxB>Y+u3~6!A9iQ$dj==%hXa->kMEqDFgNu+uQ1pxbq1M&WZYGVj10*}{S7z{F6uOn zM0_Kn0bPoo|CkAGHqKPdAW}W1^opV$eEs`x%*VBM^qHqHDz2dCtkUb2?`!^`JAX@9G!&{7j2r`Or zJf#o*djVe7m!3Tp4{gRn!|||W21NKQlhiD`>@0oqEF%vY=jkk0GoJSp&lNsL&67kS zH7hVZ%iKJRaN=B@uSA1^zRU(uKk^;xiUT=aEZu&SI7c3cW<{^?4T`l%>DJ&PwvI$cVhUP@di zN#ucL`heBElCj4S%{?>$A3~1rw=;iNvkX7pyNe!$i!+G;7wEPuDkm)_<97T+-ZFa@<%k z*;t%T(LNbj^(A$@I-KtDO?z{Mln5hlAyl3ujN##9D0+q}a>hPcCh1MgS7r|3P1b9h zr%szlULj-tO=jLLHq%Xl@0KAUb*vy}tU6|lh=a?UZf_#C35ZSU3)}s4UsX4@m8CZ| ziQ76=3`$kx?)yCoym3~zZB5f{<(3^()i#^yZ!6y4N@?|WEx+w%m?OUYcB-m3X4t*n zm-);l_E{G;wJh$ECQ0nlu5VSGUrLN((QZ!gp69h#>6snrCoy3gv0?D|Z0v5TO77k6zx6dQ*%JwTft7^fTrneNBKRR<;44$;`%B2z4T z;eLkn-c$F(>b`@*stIB$4;w4Io)>TGaN<3P4a?~+% zG|3BRJHI*o=S`?u*vHp%rXt$02Ru^hAqx47 zMU=5_f-e~I86S(}2w#1XKHgPmmcS^v68M~@(qKUR+t}ac;|6t`y`Mu*tX3_GUv%chqR=GWNE zu8HZZJk2W#n;t(Mr;m0C@~>S!g*U71?`$soY?_{Yr}lH0@T1SPg68Nqp>h2Jap$P2 zk(5f3&`ib_;G?>GI3%q}HnyFtzP%OYt9^>tG0i{FVunB2Xy&}#w5QLUTFhh+FwiM( zLVoANs_L0po$tKj#ZjRh7xyV?C zxix9e)qWt>!RRy0E^@LcnCl5X-08d^@w@CnkmR=jJq_ZR^H6fvotwFmlVZOuFJJ!Z ztY=YbaOH}%5qF@TxlzS8ON+}aES8Q}5-89?c1wYy%PPMCT657L^O5UjjXZ7WVvbw> zX4wKIug~JU^Aoq8eu(YA*|I=6?phj1HRv{VJ=0FL^zow3t(v60@!;nVSncj?1n$~< zObnh+@ctH9$`iUGrZ~P?d8z*516rPJGc9^6tMRx}{>;&{r0zGPb5=7(9d6K1f4_R8 zhC<0T)Fgb=-i^A>f6{Aha_q=0_O!~|@CHyAjG}FodjFh!~pqPo3j*Ik1 z19z?OEN@+jp_0#J7u}0b&)d1pGS!TGylu`LsC>+`i{b6Dx__%~B8aoWB_-^>Ps6Xe zBOjw5AMf98KH5FHJ<_|(@_5yQe|^^wiQ#&IiRI*b{%aOkyAcc_#&=U@4mp`UE88jrty@&x;ZS96}b}-)rr|FqJsv@9)8h zSInX~nNx{-%w3v@m}(V7XThcMR56BUW)E&*rm4IbBdN;GV&wDUsLtr8lMb52N_bzV z_ImYzYuyaXS38>+6Wqza>xqkFz#od*@|!lf>U@h9{q*B4K5?gcXmGxPBV9=q_r-mCOl%-r+ z?L*m9tNOfb!LZOK?I&b6OyFY%pGdoU! zJvT2Q+_I!R^{4)&@!Ye1(U1MNna-W}wa9+4$oex_^SsNw%XyPg+|nOBOauK=LLnqj z4esUjMLi~D({R4dgJttO(DJ8pZ^~{vEbC3DVuJ9f7s3>RP@gn(L~X}Qdw?wade5r% z*_8^f8(#KPhgS6;f$w!HPfR_HLcEh7de6fB+DSt{zfUXqIp`0k$0}xC4aKxvqY{^y z3Q~w2e)E*Is)E|-%i2wTD7w&xLI_gAha7S=$y>;(LPcE4hx3^xPv87t9w$M|G>@b( z(~Di@^z67jI#O&nd`s8sk;urdRkS6u&&8M5DcD%E3j0;rlpk`M%xPp5w4CvLR>a^C z=2-VaM?GKXj^WiOJVq%pNtL!=-coFT7_QuIiskkepYm-^rQ3L%LVLPNy4r3XjS7&? z;o%!OUSW$yc`g+u}bYs zEH$DA4$fxz$Pf9JvXX^+3{5NN)JYsSAxw|P30k*PV4!Gt1;L_fyUXWRI8nAJ#sG zpm!+O8m2y_@}n!uYtO8;rq%>CqzxuMC_5`w4rv-2e(4tY^6H7F%_lqMH3+Hejj1j{ zgw?mVtaCXbVO{=`x4*Xt2h}8ndAo{m#syv316=yYWrVTtEp=x57e&YSsz7)}?B%eD; z)XLavy*s)Q;O{#1$)O6fe9MKu+bJLjp;2XJH z`XU{JX`8E)`%nxXwBdwbTDVL$6X~{FnCdy-^DFUB{>}sng4A)xw0J(rYKT z#pk+SoTieMK1OYb;8bTnGKnYew|Xe^sZAeg+^zZ=B}nFLN5(aS?jWw&$<0FaxbR9; zzO5u#DaX&8TT}ZKr6`NxVL#7OJh{J@#5t7Rv~1ePKsaY&ICJM8$TG*+D@#PN;PClW z_Ra8;=hko>K_}GQa9QCLl`@uueDbqpOQBEm=VOo`V|Ie*OC*H{uwp|m=DrtZ)({Ei ziza2OhftQyI_r7QTlqB=LoUw<7narByikB&lM!ttCpCj?|A2ayNiOrn+M`JhInFrA z!a{thxbFz9kG@tn!jPgcr<@puY{&(y`Y=j0M~Q?IO7gT=G}Nj2ej|gvK&rX~giZ+; z4ns)me0We`c8@oMKOpR$5IS4-zDwr7>I0CE~M{|^*BsEOPa_Dma+JXv zm1B7zkrBnuHmX}9>a~Z;+6KF0$=zeK(#6;JRn1?eojs1>3V~~FVy%1Pc(NnKmZ)B< zd|3ZgqB_vNN5GzG(9O$+K;$KK+iEY-=CGmNeYO9SWPIw~QB8#WMJU0a_Gaz-e>KOP0lok)l6jI? zU@ie=w19mCy6AG}5|nIWti} zK!K~zfjQs>g|d1^>Je63I??zprICEluWdk^^Fxwf!z&FwoQw%gN}6qBBssuDC@kU@pa=v$G4bL60xsDfx}KXU|nf zqJ1M{u#}`wIW4F1x$Ls+=<|{?fQAJ4MPi0m;F|f0I{MZv284UnRK7QVyl@>T)fNuuaWeg21|FrRe_TuIy z;D!O+#=tZKs%n9s1~_9PBNKrI2Y6+GhX!;p0%Hv@%51ItvzhPsZQrBD|BazUPaD3y z3yW?HJ3{?SR;%G7_y95In1C8&_d z&3u-Wq!Ry@p=2&dS0)30^Xq#xXr;Z>ShqI8_BjAj!}N!tM7sgHA@&J#T~quQIhx*W zKjfoZQP^*42*d_HI2r2g=iZv0tV$sA_Hiy~)J_j_SVs6Y9c|7$SkrDceQ@{3?98u- ze8PE=~x{hEA!#Kt-q<;NPCGS?&eBT;{F-vwvvxZ8`{ z=&}*YICog@nr@?_Tg-RPB7`N)%iNwKt<~ zFW2fOgMO{O#m7jj*Z*IJlGM>^?RTG}wfg^m8A>(^_m4YxC|B7@8J6Vlo1ro4#o!~W z-%4Xgh(z`jP%3t{!R`^F`2N9A>Rr||wdhLeyi+;7^GsG_Yv4lWTqW;ACpm4#&csvm z;=5DW$iy7;hs5Y?1c#%CgAmsEdd5z&fVzj)LV;dtuqeV0a_7bjGA+YZ2!1bklT(fn zt5jL`Dot&Z_fkeId$L)AMAE3gef^e$oU|QCPF1WhpDizB|&a3_osYJ zb0GLWl(WpIO}&N4pzTEQV$DWX@u|t&TzGCFB>~eFb2t>`be*4%Oftu!_+HtN(=wf= zP}D1mLT(NTzJF!GRFiZ<6d9JKj$hyPJpi^Wj@3;EhqP>xOtgHQZbY z-p^GO_&Py9d~z-ptbD=}K0nPhIy!jWuE0$Tw;F?Y^ArX9V`Uw`vbf)4*Xpemu$o!m z?MauJo2_fCvq-=%F6~eAw0g@#f6Q$4w&DVNtMg+MSk=>ND4+?vRm{dSQQj(Cr@Q;Q zhGw~HXt0U3tZYU>>3Mfzb}nc{FaOxu)lk<8+UD(yjlp70#-YK2+&|n0TN6gf+}zm& z*0YI~{`4H)!o~*Zk3X!Fyn;DA-q^|}ISq%$569zhCRXkRxn-TLP2Qft&GoJIb!E9g zfMjQb;(E0~G|&Vs$ec$vf9x_d(E;nfx4o4d3eAr!01F%JOR$WA zrqS0m1G)#S^Sn$@A&<^{mI3q%kT^ix0Nn#LM`!z}nX&s}IU&GPX4e-V6AeTHP!Bsm zQlQbkK+0q`B!Zo7VPXa(4%peCDj!t+gAEN&CdXPdS&Gg!7wvF4=m%zm_)F@0a+k2CK{;2%=`>sh0e^( zTiKe_H8EbFEu8wV<^gr~$C`0onkpd>|KqJOx}%A5U)}TY(_Z($X>1 z)yd7z1HuBxh=#ga3k!#ahEAY*fp|?$&Hx(XzuIR1l?9V0YBqHtkX6icva6=}QwkrI zb0_lEU$$9cOGPO|-G?$RfCXbVuAi&qzcTqB%7ELjwrt=ZESSHPf#GArH!r@uwE3F_ z^QW&qp4+JIk8O77#nmr$6%&84V2s{Y{?%7M_2q5VOv{;KYG%6nYQTcwRuRYxUXj#$ zUG$ZstG;H~J)2GYR8cv8p$x}w#Hw~Mce5;8b}zo}z~RkMnXEOZu+N)TN9pU*S0@wd z>aRZ!6uiov>@@G*(wW4t8SLjXt6BUsL>=MBL2d{^d^Vm}4tVl@mp)n4^5cMV&s^o> z=iEtgtqL=-R%BH494(&j?_Eh4FtvyE5TUwPLs4I?d6l}DhfLTvYlnKzkuXy7Vl>yt zU>7P|<@*E|R~h?M=OCg824;Y;6U|_+)>F(|U+$wN#1%!oqdwT$E3II32Ap*A~6%{pbsR2ixgM$m) ziNKKor#mPp^xnNtaI^trgO&9UnF??=z;FWd0DQQGl+^e*xWGJkRbCD3=9QV%fGi=Y zgaCs_NnFOpStr2Tx3Z)R5Mlv_)Xy6|xwHgOOG4uMlDcYuFCn8Q1MW2dqXbZ>qC8x? zTl-+(fe$D)CK&KH44sUHI24Ze=K(X;#@7<2B=$BY_VaZD6Al10m|39?&hCEBzJzt~XQLIw zjbR)LfOi3ADhw(k3FQNm*wr!{KykydXjk+f^e&H*x1olynw_zYXDDEOsCkaMIfsHt z4AxOeel{4lN(!Qtb!F&#!Qi$9t|X3THYy5AV9+|+n1S8J%*U*tWNc`GBJ8Y!Zc0G4 z1^n2&7X_4bNCX{HS4&2S2MWfduD+$Wr@oe5hMI7zrLz+t=z{$N2B)!<4yX(V!xFgp z!K4IJ3QWyESCXwAF#it!Ot@7_O1i%|v40xG!Jq|K8!+l9DapY!1+xuI)_*&qw1i|J zQJo1$`TrPE+MZ2>zQp$_Cx>zWfz;q}XuaNTkn{J564AN;b3KP(@Yjgqo&Lop@Yjf1 zbWqX$Yeb2!#iIToHHx1(3_uFItHFq(f6mz1n$9r!^!QUB=Di(}(7kr|Hkmrbuii>- zW2Lh*5z92UWC&GHQa*|er8;eIJboIn$5HBkb1na7WF&0@Pm;n@k1p}c_ws+$&u|U< z^TX*bHPqdDEcShKXs?}uIqcA(^Kwqr$3$9@=^TwP7^yV%4985qiMpE`;>{{(Q<<7Z zhf6{8h{KNUtsXYi4MZ<=+nwKg1kGJ9hE{F#AqmH*YJZh(JpD#J8AhGH7H4~bZPZ^= z;{fYqN~O`GX&=gL)n(@S?CgU!4Hz^a<;)ikLLa5SGOATXtnGClX^kzoyilFZ>b==A zDhR#CcsSc(!M*y)`U1!3YfSX&=#RGRGQ!X2{fw5cr%*pX%Q73PFiNI%VR^?tQvJxX z1Vt@TTQ;A~BK5sbRiV1tIz}vnfOjxDjje0sMhQ3(@at7VqFi% z)RCgCm~e6|q|cUVQOx7ITZ2;ynbC8~94OHem*N>ZM$xLywz~Zcm1^>0#qJpedwYub z0kJ=Y8eaL#?lQx1JtoN7t!||%3d2E)!PMBI)tMx(tXhz<_V=k^)SdcXHj{eYvib6q z3X^k!L&2%Uopyg%kd1Dm>wk@YNDla3cXY)N>HY~`Zlr9}PEL)El7@)AX^jMSGN)GZ zT_NAxM(DNQF7&&QAUii|zkcp4MnWL`0;@6C_s7(Ck25@e&A(2*S?9bAixRyc?&TU! zjd&K|d{0u|Jo16C@T0qKG}{*Pd!fU&tZN^WHC7$m>@*mUFGHyBMyhanYUsTma`DprH(U!e5qk_;07=6LV!E~w6?OVzSA3b$y*{12GO-(audmDFOU2%F=pJ!x zZw5^zwU3Wx^Vy%pid62;B`U7(|G?=<9n5D~`y4D}->f`X%)7gO@UtLR>Tszf%ja;p zthDlQrTp#s;jijX|KBe!-;pLQ^KBz7P_JE?Ikfs7K34j4e?IH>>A_NI)#>5t+l|vB z!Y66s@y_?##FPD>Rm9Wdy$vD}LRSEx8kKiH7E~d2#h!y=aiO6dXiDZTGNx=ewQxx! z%(y^HTnTpG=`Or^BLVtb}l% zkD}SrzfMVnYqj6DDVDdy^Jz_DqV6JkcvymC88ww4EYUsO8hLsu)3cGJP7qch9jL|Ged;qioH8o3^@u$JuGmF6|h6xIMbx}gn1awRs@lS_1&9;rKV!(Cl9 zR<(My@+AwOb6E3TV7h z6xIEBRP!b*j38Jj6;PnTDb{LQW>zIi_QJGf6H8`C3cj@&z2J$g( zb*V~E)90uY%Cs7rAUuIk!E4CcNV4o*a(*WWvsVG>x%?rF2O^qQxbb`U2O1$Bl0+{? zc8}N$@;HxW1Uq%za*nd(gX=~Wd~TP^;4XQVRaB4ptW;Gl*qvVQ|_4y|a~V+m3L zWUJI|KVufHV%YMig+PcqqE({~2c0w^%@eCz`dtk3$6W_ITA%7nY*9NS`NwDmDJZTu!&`<&)`pa<78?QWc*8ZiHV@UDdLps z9IZoDO@Q9iDtd&1?2)I?<>p5gU+yA*b+?RJ$I135@?VtQKQo&kcloua7f@c9n3&a7 zFJP;dgaM=(@T@vK z9F51%0-OxUcmhUC!@DNHgYnC40y)r|H*TIeBMhi8fItJlFhD;7)z;b3i7xFvr=S=R z5P13W6}8BoN@wrN$_fCC!D8b8GX|tML6#GUM<6qSU<8mDpgI8_M%cvL)WpQ+mJg7k z&ckLP%PB2&cJ$XVcw`QMF@Q`1L@3aeV;JNLNQ@9sJG` zNLhBS6F^SW(l{81GOl17x8OVgdI8WBz-6(Nb7=1EbkqTNecy&1yl%gD=VS(mJw7YT z2Ki8=kiz6>mrXDiAkc(kqX9eyp{t|s2GFNVASeo$E8?Pbz1_7S%h|ua4>Yeh2N$5l zm{_P4?B?}0bb?qV;MVl6FS%iz7=uUE1h{}?0|`yf;88gwh-%8n=^|_vhq=0kL0}W` zU_g))q&PtqRn7t>MfqH3=Rg=kv1g(O|#9BnoYx3jB1&ufR?g)QedKgM<#c7ce^U$==Dp^ek ze2g!EhU8*^;EzCFAi?U*ED8Xp$IeY1VMV>VG>rgE!?r6-cVM9G1b0F7nc4W3Z zvYL#NC|P`s%I2eo1s%*%COVR+gh#Q@A~P^Iv1f%psLl1ryBEfC7?u@U&F=S6AZ#+?feNUU1NTx+kr#Y3O)}7LHTT3E>=8|BIB7%iBIOv5f za!aOHae=(L;~Fcn`azZ&vib~!&HHT>?bw?58X3`Sg7o5c00c!bxro!IfcfZWYF?A9 zfiPf{b-pVZeBGum+^=o~Fhk0VSxRfH@f(T{ljS?yS>wo1Di)n`$;=Rl(`70<_rf)1 zxeCumra$U;b6Y|AxyrNyDN*uoxK z4k@;*PlD(C(hAI9Tv={0wHyZ(^u|(cPGq|Ioa=n5VtAJ?+3IYPDr<$y!-bu}6;PI< zX`1q0cEsUZOu&G*wPE^Q{tLQWiZ#sEtXb6lW3Z>kBg89+A)|q9Q^`35&lmgyk?`Ot z;gnEBw+QX6{>lCRB+EP7gJ&qzAF-A1{|tN^uu*ils0wTJ6%=ABr2AmGt476nuew)4 zd1`k}x^d$7C|O&tyg~I7lO?U=j3mTVlj1j}`7g94mfJnWY8m)`>DxQqnjJdutQv1e z<>5QBLZ|w=oKpb@OzH1!4=J8s+1V$E5HIU6Sa;%@V?;EvR|8{v8Ey3^at1uNG%y4& zNq?^{8}ElXCCr!nNHJ4tLZWTgNThtM&AZ0WyVqj5DqT06XJ+{PG)X)=1AhZ9^l43d z2Y0k@9H$;}Nw2KngkB#8acGqUZD_J?>UvVXRC8$6K0Z-C)F z;fhoEbp2w~l9BM>2r09xA0g*Qu8`%*er0T^Df;>jT~(kfY&2t&ew1j; zRp0rPVIorfqo%7*p~UAZf%Z$zDsqkw{j(Yg)WqJ|cV~nlNjFeb;{E746T$k|SI6c{ z86QaPc)$YP$Ak|1*uIwODs~Sf-`gqXqkpciXK3;8#)dRvz`-K%Kp+>g_EfrJ z(h6(Umx@h#Rwvoj4b_uogz4Oz+F|d%x2rDmDmB~yqd(IXY57bgDV*({#~D*fRN+Yc znVlC73mWWN51pl+lelJek9MHwx~Z=fyUdWV8?rntcwMCXW~#_@zc-`JE6Kq2xkaH} zL$lize^3<)%K#ZM?a z+-K}8>P*N>*flHkHFE7nDo2W;-;D2^wx^5}M|Qd1zFAZ2m4%0wBLt7@HGRD#96}M_ z>)w2Y`lU`xERNK@y*6;xKg?)qdaL+M!{bQ*$Nvv)cNy383e$~P)Gf&~q6Ig%2bw zUU7M0-2FF&Q;_*VD{=OjG30&pt!$e@CIvR=^Y_SygGr1JjlYPUx}Yoinyghfzo zN2OMQu`}a@(mUD?TF#m7s9~>iQdvoq+xLlx2OrDjEV32pgvTpFP6{o^w~g-%e@i+o zP=;8PYy9~>-m&qqBy#tc&F!}{$-_i-p)Yr=S+iybxbM|V7-+wjCt#J}g*5cVK-GVK zsGMr+Y`EUBcTby}i&N2P?tAGH@?vh@I`O!5Mrez1l5w7o57N@dycx0@$g#F)kNNoB z)m!so8E=}u>!Z+q1eTF~ZR%bJm(E`7{@e<@v8m%$$ib{F-YT_j(^shn2d`b%Mg_52 zjpjQGFH>vW!VVNA4U$pRt|JfUH>$H+M|SOf&Sy6kPLGCv1-p6Px>~nTZ)(_8aZ7mm zZH2PTZ}MZmSBP`*_M;~)Q@0nr;_Y*`453mppL9+`ke_ypR4=DLhWLDVm$U2Y8u)!- z&qpBUa^3FwrBz+rk?Zo+!c2Q;OLGXtizV}=CAUAr2kvB5EoSox5_=5`yMGwxt(k%w z8`sZo_A8cyjuLy$hg=tvLa{QNsuHr(p)AL(P?-}2tKfn2IJb%Eo0Ia9;BBtmy-BmS zKS@7>M?-b5Rv4|$dZF!yuU-YM)5)EW_=X&Xx_()%Mq7xF-M6|oa=mBPen{kdj?I^9 z_iMds<4A?J{SnB!sj<%5%Kq89G%)I);Fk4k4We{&FoL~4vciTCAg+;6aIY)ApZkS` zC+*5Byj}!x6C#`kLD}?*#25zg3k|0YrGq2v?uL-}hO*5dXgfWozr7^YfA##pGi};q zEy7=-(WMF*rorhSsuJ+w2`p*K@4P+?J?+8&llmNiqX5T0M?<%)BjEB83h59b_Xy>) z2))e+m2@b*euNHhq%LoyF;S#`Z{*{dNGr8Scw(d-JWAI%(y~0#92I4l9%a`X<+K^~ zf+*^xUlaojcK4@4Koc@(1{rcjb3F>R8HK(w2A<=hQ0b_cCRFUqzk@Nr&1SN3bn1Ts zW8wf6W;q%FV+z>0vDPtCi6D^TUob|R9SmN4T$&He*MP<1F;SV1+ovPGSPPxW$>*#MY1{$@n$n z_zl1K&Gh)~8R{zx_ph_~eFxYs;w}KjaCgRjCvsaXrCj6=KRrtj3rm2ryM&ZcM)}5q zGSFpRu{LheI%Q}I6WBT%1r>dwhdY=@o(T9T$g~Atol0bzjaDoRW;aRVb`1R*iRNie z5}ZvEK2H*%e$_(!3RTN&jh6y)g4$}MVKG`NaBOK}W$Lmo$9nTlu`y2qW>mO;7e zhP#P~`6QJs9Eu0l$NijyCdXY;)W3s~dff^u%FN5-5dgw7;0j6t*YQs65& z;nA}arF8BqeqX zrB*GaL@POlPI)?fB{BiUZvDC18YMDLIUyHi2!`@7>GBBE@~D7vRAzb1|MxeWP6?0v z6*~Kq9!2MWaZ2pTtQ2dmL^g#FZqq$-OhcZLNBU=uG0+V=p+fUho@G|K_Qm!F@UvUv zvFqV2x1=wmSAXq~{oG&O&tJXYk~AS*!_!=KN|JQeLMgBeTuuf?e`q_>p0EoxC85Wv+DR; z>jdZi^UY?!cPuw`l5aYnjcYrXdqP?8Q$lY?U!SLqKAKNFIMcitCA{5!`WQU%QNCaA z!1GZ{v)&-9UdPPi@oR5S)sKE#<#39IyT#o^@*yL>37 zfa0I(DemubwP%wh1ByM&ikAHImd+awO`2Y26?(KZ;=OHRGA%;>Y6?X)F)c+EBY3AAiiG}!T%dAvQBMH!YAr)QGu@H#%+x#?$f zu?K&X|6FqDyOu(MrYbX7*+6UPujbOgCNciDV1c&n*_`&k;+VPCvewqA%huS}MKQlx z8A6NDW-TLF(qv{*hQ6#eE&cY=!1m3#hV9n&`d@F@q}$1 zknKD{!4wyI6yPn0jdH;;(4%|r#rVDi_LV!!6w!r(v1|nHS0U_|Z&J>o58KL}2aDt| zitbn@MTV?QT1^Tyk%WuU6z4(MHATbs)R$b85%AGoORct@W?0$|{_nal&htK$WZ(KS zw3dzFMh~(++D~6#)BepbM75`!Nessg+{y%Me}SLl2!k&R&rW&f&cl;^`X$-HxkKAI+5{Hx-M0$e&YO-bqxZ=9QaJOQhpxXzY=b(^S- zg-8!g;1*2ai6%;DPsHmdDqK%cXN*e>O-SZUKG2@DEC3Vhjnl3`Z4r0{<&(IgvEY@7 zB&i9!#PQ%D8qI~t2&r@~#gyl=Z|Tq=j+Zbs1SB+Lf+ArsuW=n;kSL=L?jgUWoO~~iv&1-!I;yWMRC<|7VTiu zx1&Q60jyO^z4*EmwGNmKoYtZiTFHK3HLgtP1AB*jRw$%@t@N;qT?u-xO<#57y*{ z$>?EggCc7I=rv_w;3w?CFq!7f>TkAng$L^jkacyIbt9McC%Nlzg>`MnnxW+e{rmMt zIvZy38!FY&kA>Hr7uV(E*Pi8W_&nHnbhGX_yrEb9)6#OoL3jfp{8NYJr!nN`Z!C!Y zq;~T}gzWFl=HBK>KJlCO%}k0d^zbG+WGnS%Gg){m6Aeqz*($Ey%4^?B$=#0C*(zGx zt`y#SBfR~tdb?zJyPA%;Si+lSI ze*eskJ=XbsxCr?(ycZ{lZ-|Cq_kM$a{{~@yYr*!hArMfC# z5IE9=?!&PW*jy-G%>f(sfR1&aTDsL*|Y{`d5eSONU&)58zncLpm#tEw%{B zjtIEhk(yM)L;VOTC`fVUNM?juZT3ht?}!)r=A7+V?RJFD?_(|4v0mPh6qH>f9imiz zqFf$fhCNZ)Jh73BG}AqO{wl&O5B7xjbTs?KdTG#lDazdS^kw=fJoMDc`1I+kQxn!G zbL^k<{Zs22^Vfb6>Sqy1Y-IH9NaWI)(&m}fW&}D9hK3#|)I>aNipa=2GweN2fevXV zFiuCBUCCb**I4#GyJ&u7_UqBbz{y3e6>xLX%Pf2OF5#lV`=Ywzvh@|DD(~`rhdEZ` z64%|LlJ%-3@3Q0eRU`DOWa*;m?q$Z=;5H4uAqD>S`XEcfH5Th~y=ZmaK60&3aWh-9 zKmF=@`PDVO!p+ayH|@U%x8!erirj2se^2H?XGfq1R@m>auoPel!$K`}RrE53_xx;q zKy`oVFBo%ANs?=+Ig0L%aPo{OM|UJX6}L=UyzRpTz6o;i==UocuW@NgkB#e!wL(RS zor-7O*%e~tl{W-uCjK3aN#3Fk(JxY5_toK-3w=}s$^K6BZu;HTcutY&)VtXl$BK}3 zhHp;OAB~nQbLLK8N>^adr2YlQB$#zu#vRg%EVo3|D9T<#JNpc8kWi(k5Se=WdJNdXhT_HQL=a-)!-H5(T5euhCu#~QLc zR}vN#l^-p0c%x4=#5uVV$QTUP8@G?)5b)+&NB! zJ={e`6j8{lL@_RK=-@bpF{pAx^)h}p#XG65@DLI(R=GFTYaF!xK0!&C%$0K<4`NZ{D4;5pVKq>~dZ{{^8R;cJ}nyua~FGXkuX#;{@y@|7p8#!5LOpFKBMr6z7UJKhyH& z0v=!wV9H|EbW4G)%-ah_TiE1xizkfbz|Pg?V_c$8=h|-Cz!!B7fBh`@F!0aKrrB8i zM94okn|mEU{_SS-j_kQkR41KRpMlRn|`h0i(8RR|ZIh}Ke z*K%$TQuU<^@oT46E0ZK)0f+hxJ+rrb5sc9*jPa^f&a8IWM*eD*;Odq&jw60FFWXC_zc-sj zMv=VM&Im}cH9l@J;_!MkfOgFqOQ>!b$;TF_#v-a(DC4I{EsP&JV`{D8M1i3Gsu#r< zYMo=6PPsRvhvYLa0L9gHFcTa^+`Z}{iu6-rw$%$$v-<&wds0SzPd|pos1RD_*TiHw zruQ`v1q+Re`1VZywQ4g)?uz}ZXsK|lgVs}xej?J#kBL6c$xjW85D6ZW?(sI0tNIL> zh@jf{3E`Y}|IM3C4+V3)!EIjauH55rFd4-&f!E=k(%R_T?=(UDj&;&>O$KSj6@_#u zwi;$XMp=c4HiYBU>G8gf->w&Yt~#tXnA^LZK4DIRSA}h4`+4_G=3Fw7;OnORJ5xzn zt6I?q#whJq*-6>IV%2Dh;Q1k_H#s}UrGo5T(a4!3T!+ipi;ccv76#Ga)&s%^qX)VX zVNs}4B}P_u#hwV2WU)^>YQJu5^rN5G`_Z=*sK}Bqc#i)rx`ofDsva;tX!O2__ZgoR z#TnYSdiTZEnW^T>7Ohw27-EU_3PZam6S)L;`L25jA#Q9&$%^$nT%azw(`chCuxN^a z2q6_PhAz^u%Dc&ikaBW+lp5tusJiu8ZcqWY_P^Y0mN;9;@~X8aQRS(23f!eZL!;-d zsb(-?$z8Q7pE-PLv|lXgV-N0P$2wnMgd+vUyZdt;*r&U+o?^RPpqF}A=iJF zkaH7Gm1$u?PxVEkPrAM^_}UKIbAV>V3#~OM+=cH-M3qKim~?o%lvmCYB*+jcpI`Pc zjHK&v#B00%A}ZE zw~J0$m1N^Gf%57pVaYWTxz#FNUnddvID(Pm2@;23{txTje1$^GK@B{&d_sb=9v(?| zW3ptCg1)O#y$PSNgH-H(d(Zu+AOzdm<;E?txjW8ERee8lzmn66T)i!_Lq>o&^9e24 z4&?f6glVSx(rmN^l_Um6?wO@!KeFT1y&Q|DS~D5pSq52Ovd5cSBEayo+?^|Z%ZLZ> zdlh5_osKeeJtNZVG;WZvcBhh%$`AH&P#n{{1U@&KX5S<7i?l??^ z=IYiIcDYmLla%#1$0?Bxyr$r`lM17jWH6sw*yF%o{pf1yJ3XbGd)Yn2Ebn~0-+i&b zwZ%`g9(cT2JuNeU>Q%M$5(SM!9)%(%Jo#D-F_=U zMDN?%`Ww|+#+GDIcFKx@%-kVuY{Txy1{-gFAvZ4D9V^x2r66{BqSJxU-OltnERp=> zy*?aI5YCF@k!qEkXy+Z4NhaBSLf@fK%O(y)#Uoik{YM~~;F_SsYqxZ9o?&8|dAhYT zyA5U7jo$kNFEYB4ZOklW26=q{>2A3Gaeb(0`r=K8xs_Jv`HsdPozm#@k4r*wB)k z)%>PYc-1oNMLZ7E%8#UPwMWvieht+ig4z-VHb;2`<^HEP71ydvRYt#X;PR(j_Fc2q zK~|7S>q@>D-GQ>LL;dJ&N%u=uzaB; zw>b-zNAZ!($DXMLaVD0wUuTf2nl1?1<1T}htYr3Bg9GQ+;%*kr#9V^bZXGQwZlKaT z68j~mx|p#Z_v{CXPfRhx8VJ&S%Fq2$u1}e9j>}CnF;UynBriUEe#^;!M}R#XBNA|b z-SgdwXKR#!;N^-u=tTqHStfAK$YRX};T4*C`|%ZTX9Gh!^s0ksUY>TaLv@=F*4s%! z_1>|&y_uoCTbhMHB#ef)<<$9segMtX5mH0G>dF0Ew?Qlp+YJ~%)xCJ_cgeo9%2Hxb zEb?6hEBB_c#Y_mbTr)*gOj6955?0a4P-W27gc1o|(^O!OD6UTwG5S%-q{Jw&(jffw zF4GTg<<{JJeuU^TDN`~L{5y^o>1VYrW<_)gL3y3nYw@xRh8mBzwr{&N-}21&cYnoz zrrwF&k(O$D^HyAtlZ3is38%7Apn&{-SP!N0sRmNe=w1iv?rjl5CcRM7(N2p1{sfV* zC&|3794Z}twMYyIYoKVZ)ouEM^JRY-GZC&+_J?g4-{4H{&u;05Wb(6_l156!u5BWW z7qRuCgp6t|PPVu3tnbG;)r?>eG$@tDACi!myYuRVJ+?iPNxU50AHObt4$966StjIG zLtq(*iW>*Y1kl3V1uK+cziDnEhGw9p<)kF67!?RVM1QBUn zF?C}mKAbGZWTqk(8KtDd(j${B4~HH;=`8XIm2?@Nt9@kgRq+RUflQ`~vKitUC1zPSJ!x0fx?=vSK!kH>I`I1Ne!h;f47hq(brXL3nDtXd_Ki^;{~i0ptat zEdxmI!$3r#;w*hlFuxq8m>biotR$lq(Iw9ROZYZM`70;SEME~7rpIcaw=am=j`I$* zE=gzRc7NvG21A~r?^?>lh?=%{uP`8p8sg-8TZ_^V!Ryl?T)c3~G)-CHb` zb=Zk*n2>pn2ZG&ob?9-|yO)>D>*A%rg{z(>vA{v~ryw1Dv3}HM``7MaJ&l@7yZcB! zX_3lzOa`H>ngiMleQn=Khm?3Z82g*Q%fy+BB8}cL)oGi(R&Nf&=MvWdwd!>6tH!tS zizYRqFswf_wDk;>o3^Fjydm1tA5AyZuy|YeE=Yj=h3aE|$=!J_4n|d6F7Et7j2C}F z&JXdEpke_k{XZI69+y}RY{faUB`E*=69v zE6Grq3q3mlRXSz0nrpRLcMYC6wR4^P`96WcZ#bvm7~2`!B+`wz6y_Mhf3J zPGU6AE|4k;j7`a!K6aBTvKnmL1H?h7RSjzH?n$j@f+AI_A>);iUT^hJI0X*MhMu-s z50pGw=ajs{nLJef$sx@oLTHu!NXHgDSefLZ7y8V&rl#|@)jBzWGP{6O`JTq()7n0g zAIR0B?kUe9VO6Q*EL>w&%OZzLtzGc0iF(qk zen}Dyyg6-X_8XsGQ97G!F%4YOGzQ;fp#pEDiG>TqAdE5#+L@Tlqi#M#Pg78p?9hlx+Y#Li?RGgN!`oWPbjDDx^t^L=uNgFEjmn%BxKfcG5eBH`9DJILH5t zAS53|1@tj`M3{@X`;jO-B2X2>;=PL~-rhT8`3N;cD5Z56>2fGlZR`w&hYE~d(vI=j zC#0fK%PmY$G02xC)ghS)QxgF(?nin#pvlDw^rftd%kjL*L$}}Xo;Qu$Ur11?EAWyH z<*kL1E#q9ShX$QRiGe5%cRA)S$h<`8IQPq4_mQrc*4bJLl{&K3p$~`daa`BH4HjrR zIF2va^6MuuBG1s$Fn%w$xGf7#R#6KS2FX_*N|PTN>=E~5Kz#^~P*Q)dSO8j{?Qew% zvz;mRexAc zp5_I?5v`$r5JnGNCG8ish}Jz3vTKJa5XqHB$@u%6WsLK09mp z#b@~_3WrJ>lZ?Xi6al5n785i-?@*i5kFNYFhNR$K(49#yD8o-w@!c;jDY7b2tn9plblM1|V<%t_FZ=0HVg{&!2(+u>n^D zurvTv1K>0OOCu*cd$uhcU_5+${7Opx-tYWFYy4AWKDTv9N&Z`K%F4(Bz{Y>*8jcRm z{{S06dQ}l|Xq3&>BF*`H!vvxEdS%$^V7c08kA;)Bws$pw#@k za&UOHeein&r~nU-f1IrW!w46r=QkIBfQvL4v0k7Nv@M(jU<^r9HCr_}P$Ej|1OXW$ zkS#uswFWE-;}9mm#;~PTi}_s16k_~5BpYxwfL2nHp8{Yu05Ai zdsyn2i}4!)(I=2Xs_@I(N?HRgBj9`h`6keV0-^>`QUaNyv5pMjf0%o?DJq!*m{ z02eMm6$-c)K#u7YG6O&tlp!;cOnyKj2}GICJ=B0k6PRwWH9`PUY4*Qt51^_9*bJby zq-1&_tfU6ym4MX&*d7dnlRz^HG^v0T0@SELr3%ELK%*%LydXpburyp=Amm#nTiVJ2 zaRfj$0FMM{G1Xqo0LF%-4z=lw76Sn_P=5k02oQGy*oGvh_&?bt5L^Om2Cx7Ch#J5t z*1xW1{u&rSX9=XV|MZuDw*ia;0Bt33Sp#I3z?BVvZ25N z4Hr;k0@pWyoBK!^!co51)0P<8@J2XLzMPrC{1R{-%bkbZ(dAR;UXOU$HJo8K9Z zKXE-LA=Fpz_1|$d)W`KT(>VVZSL2R)^Q(C$ga6glD7yFWu12rWKdy#W8NWpz-{YHa z|0h@D@;_V+F}r_U4PZ+aa5eIYaOf0~rGTq}@qjp+W@N4Wbv38}SA$YD%#TJ#l1*QM zG%Q%nsOjN9t_Dg3a5a|jaj?DTtB?QXYCKcZWAE-nz=ca!u(hyTQFxR@gY3x^;i0rU z`{7Q;!!q@r++3yShL0MS*UmuvQ#ts==pF?AWco6K3`VvrkMoCZ5{x^C?_i^I^v&MN zq10m2<{9n{ZUipu>J0+#_5P7A9_jOE6kLroe^z3-qvcsWwTP5H6CR+IRugI8fP?!_BgwV zGFl;n0yj}5leZHjdG+u$E?JY`Mjku6TLefPHMLGCr)EEjD==@({d8TAYO6TuvBs9Z zWy)Cs8JrzwQH!XlA{~#CdVho+A{Yh+FJ$b41Nk?xxSN$>-Vq1_E)o552l3>5usX?k zMFe5hkm(a}mW;Y~Ij-Oo0*}@%5kai3)1BbstAbEY`067-frCXbf|W1XmOm4MiS(3U zT*>>o_*hB1QR=&XwTjPFEu6O6--tzK@{`|H(#8y^jDsoZxbzidCS;Vz|L*5fN@ z6&7nmCsmZi$>>-Zd)%>{*r~XP*$eG(Qv>o_)_1|QB@c(kCfRq<56C6jo@kPjQVUM4 zMevPIS(iOzQm=#9eH_;MOKMmnna51M%CK+J`)j3)Jf+vko_pid7*{1oMHqh2{pvdx z2_F)?*GAf3UYms|*-sT#6m_SvZK+A``)?2|!-i*!=Y_S9yir6RkpK3YE9sLm^eMBqK z-MAxR`}2)1^TP`L-{^0lqLTr?gNSoYyU|%feh-gTb={Pw)J?~er{uCw_K&8#AdNMsTdA(+Gvy_GzZI>AL? z%|@+eR?6KXtfJ>Nk#CA?ruv!S2F)h+Ci$_O&*!$QIIi%gR^7IzO$cvvcvE-GNwKfo zX-apz=!(s3;Sq{y*G`Lh#6_3?XdGgU=QtBWlcNMR?YW43RsjDB{ zch&p#;|+o%j?6AN=~bo=Zgb-%77I4NhaOr)vE$+z?{jx`krD`^IlKm$aD8YLA%h_j zhTlbz#G2tmXoPB@HN0C*Xbh_xul|)uv5xIFM_4i+U&CF!+6-$JzJ9kF`Wlu3;#qdYJ}nx=k{=SvEv^ z9-J1e_&GFnGc~BH{CE$g41{-c-a{fE1=-ZQoqb`w5s8(Wr=*`t@0J)=iy9J*B>Uq> zEW0O~aOWxk-tE_;rc;;nrgD|b9^Rwoa`+}q<|$v#S-;+6s0uoJo%xCXfFy zep_h($D>DXekJ}z(=99s7NvM^P3xyr>+F!n^AA~bWcDvMrAS`hc;=tS{*)b=WeyoW z$|oh?RI2gkouNSG{L->lGRx#j945F|SKz39t7Re!;;kadysb0PJXyFXUVb+&?ysv+ z8}I#2$YM)r?wqxFBec{zj@-gNe7fyMwV01`>v1^4)Vu0CS=WO<s07mw z`spSWjxXZi?y^)vtbDW7yeztBEYPo>$xnzYqnq4nZIuPeB{yOF_~c7=D%4lK7x#gC zpl;_X&J&_f&dtZk_k&q=6Qn20ZjK8zuQ#{Uq$CW67kuXe*L9bqC#3GVzLyJHHr4eX zdn)YhQkk7<*QoZXIsUkExk>A$TXapTDbXw+K5sCyJlw_&Qt7(!Db32=FUPiR)3~0E+-5%FWxYRP7~mi1 z8M38qf6>pXtJ%ZHa!^4RICH(XA2yP^EqA+Z>Whw_8^_H-VvW=%*^#SCp+!C14wy&@Q8c}XMENrf?cL$Nu3{)}AqOwvrm)L3_jJ_= z7GF=S8@VCc`)VrO%-0La;Q&1j(Seh z8Eos|OHYIlP<>^PM!O;cJ;FeZM4*czP$O&PiZ${|1S)j!*VTxSMERFnyq;9hUDGoeL+Vp@`1uMdfdz^3`Gr z0EELhCOJJOI~`Te8&ge$;`XK%PIvt`SHq9?*e&*0FSfrac5o(k_$+o59ycx-H)$L< z<@eXs_}&yZKNGij7Pkzz8oY70R>)R?M$>^Qvye{`hO>i?--jniAArF)_yFta&yjG^ zl)$HufVBo+!O`GznwxTnHam`;D4L`heUKO{w}K|4Pb8fsr0AnE(MzPvNVHi=fD=d>i*C8JUiB^YV}#P*N6sW}#GO&q0*jR^oF*ijC#; z5cZ7XiZ~{MNX9>}1$ilMW-_-i=`|T~m-&!+j1XJ_;;2qz>XQ|`lG)mvz-Nt{GfRDo zje=T_!bl{;OCN`KA8eM9y<86A)FbDbrQ(r?mSHP$*7zuJ^l~@PsVSC0TeGOy&=nNWb{5dA6j0+7Qn42jDHIag6cU6M;ujR+br#~T6oPSzuxv$Q{1n?b znf&TS@JyI=KrDSr5#4r?3`sGgMlrKfF>6dQ``hAM{l#3{#XKY>eEcN>8YMzbCBxK_ z4`+)e=}QzDiY=r|tW1la1{6QbEVgeccKlxKd{O*zyTry6a0N=;14=yk%e*fNjW1l3 zzb2bs6!|)p`7;y+N*6_5ls#l92ds<;Y=3#wb~%cq6d_%npiu$)|H0K5zNj2!s2Z29 znl!DN3aFaNtdim@{!>w9!&fZ1U1h;nEWua3dXYFpgx`SS%=a&B8!Fb>4g-LIn*;67N%S#+#hSH~yrt7&&k5qzg;GFD}U)i1j9TDCCl z-(3yHdd2(oN@n#cf%R%x^%|}9T66U}fmGCR>hM|0UEc^Hd*3FBF!MCOQdLh`i7@NH z0Gq6jwv0ZaPa;Hk8k}B-k^41hA^iu+0#^u;r%1$ec!;BBLla$NO^=UltH%dIWH||; z8_<|M}Eima^aUoEWzEzQxb`IpV_G}}r9 z+Nv*GiZ5Hgw6+D;wtm)Zs~l(<&}a`(E(fTw_o;CNsc{F>RMg|}cM{L$sEK3S z!=yXN+Atu&PEvYytbBpJM{El*8~F|u^E?&nAQk%+&o%o8L}BMODeJ9DDuHY&q3rls zHVTo^$`0vDv2)(quVGz7XI&BnpKo`5{-6k5L+3!4 z65sLRE=hfn*eSBPAZ4=#5&nzWpj{@TcKc!+#6)EcQrQ0z><+Yq^f-NY90J4(1N*WmBOD+FC?u6?khSms z6ITN)JBnv9N)S9slry@wuN~kaZg|@q%(Mz&L`;7({vdDXC8kc z70fOXxc$>bj%PeazfEvqeA^8=Ou@dhOoqWSP2AR=_*^-jZIei>fP$&r7UsZ z^atb&@hgnED{!E~wEV%|zOsad@!YKNJoo`0`@uf^gSz_19kx|bmz6u9cp;ZndYx5X zmmge$7ZF zTSATE*Y$GO0aW8r?z$0V!#ZTc#&W~7edBrch5;zv2J+Lza{XlVXUN`9?VFz}A{&8w z8!v@7P*|4DSM8gxEjOceHdt-Rnb@|HA8bwOZ843KrdDqy4R56_lBT(k=eKVaK(_N( zw(0e^-agpM7~U?(-OAC~%DveFT#dqzt=e2z(c)It-gc$ScGd8&_c{Quv7P^5JAW^3 zijAUs@7LSm9h&z$SPagjIORIb0m2KC*_aAP#A34rp&5GW<^RZo>1z zs^K4qKt0uvo-;@WIq2QIqkAJzPvaw6=&@qW(Zia9;Bwep_K`mv>bps<&~YT~dStY8 zDA#fHIPc`X?ycCl6U(I&?Sm6rEX2*NNlWzfscTw!(xhmaboo3jdrXW~%m?@x;`Uj%)mf(G`8$WRVAnH=S4a8j z$V9pG+?wbdqByVHC?so4$;^3q-bHvG?9FC0!s_B}$51}e<%ipsEQKr^80g|Mxp>E= zku{{1725fmylcdE5pC1e0a%Wgix?8g3;s^#_-mZFBRfMaCj>ifu57q;e-U*+ol zhRv6nt5&(|b=K>FrK?~KSX0gA&yLI4nrofBOHFGC%`5CO_G!yM@T%&#oq95lT(w^{?SO&Quh1wZ!1i2V`dTMgow)Ls2*X_9!c}3 zo(XB6pYl_dKTAw#d_cfR_uOzKTAB4;o445Nm$=m!i%;&>Hf7*u25~Ii%<0RyoI86g zaMwRFVNF8Yr@NO&E{$EtEL_sZ9~y_?6+|^v^B3M78}(0m78fpk_gDBlvg&HC{ExN< zJgG(~t^-fD=5EicK6r3-cy#jHx3}u_GTe}$JAOBio5X1 zcty}{CbT^Eo{U~A&Vc4<7X;s2?;(|f7h3klR13uj|Md>4a%pRqD914U+Wix~>wJys z;S2E*6}s2rl(k@NDC|@4k5z6($^&Og1%eW#kq68xZxYoRvV!W`Vcjp#N|z*B2}*nM zMt9nXmFq>i_{_+8p`1>aPG?=?U^5qpn5~cbmd8D5<;=zo1)3=42<5#`f7ly zF&4x9@z_Airc!*|%X&xLP|wlaYcgD~Jj%%E{NXXHvf;ITCjWQ_caHJ1D)5w-gLaRy zsm+&1Pb{3hMW@U{cg3fj?H0a0dj8sj8{wqq;A6V;_+?6mSAX9rgG*_sd!}>!Zt|Q* z6Z^C|!vJwwmdD#=?i{;S?J{P+75v6R|3-X?C7+?8(=neJnkMsrt@X!?&ZpW93mT2y zlFRP9G&AO5&9G!k@8-@K3x$QDC#x?iUOr}Kd>dU*5Ja`n@bo3sMk&cltJHJjhz}oq zpS@~cKYQl=bA8q#-PfhjKA_e6+%`{cc-lI$6Mx#)$0q7x0qbF;ZM23G-+OHB+ELou+iSuO7w_l$1*{=&OE>PbP;Pdg9q7}^g(QAkS-Uz; zxzb@?x-5Nle17d}x3nL6I)i&}r+(WG%(-v~@2xyssbRhdw8j@o=RbZ#9!mGO(TuZ` zCkfDtxRtF-fPJq(3Ah?v3QKrn4QQuqr^q|S1xoc#KGN}Xf{Dv*puy!7R2zEiH}*NGXOwuw4x;soZK0Q<32%3cV$8DHDfN55^ul1VQHsFZgrtziv1=@C zVy9eoV&q+p1eRc9Tc%s%DmSz4eqY`du`qXmyfGsQZATWgpCx-E$S~j|NluRcyQ{(Z zj8EHN!>H6C<((aue*Y%jQlfkmw1AMfbXvna#6CtjdR>tD$9?8CgY+5E6*|5j_odJ3 z*xO$t#E|EM9p;Hl?3^Ubj@XsKND-+cX()$E=SE!7k^Dv z{!qv?F}N!+j|gW`SynpP7H~Bd5=#|S0}L=bR3!qkF&ZWp2CvNz*uH+wDjZb6N#B^{ z4ekvi>#Z=%7d~QxGR#%M%E#S1^y! zX9CX98Ell!K@B5?U_OM@MBuPH^7)Gw&#+!5gX1E_1s^wQ%4`hA>n2Jn?%FG~YDi8g zzR$Ift&&hRGYj5GXlP=7uI@W9XI@R))aAA7HqB?g+EABUqrJy(b*^}0ai>Ox?XB85 za^%*hWmYlJOHWn!LS6$8&Nnp$-%r0fe??7KaU;6?2h^eOTj(R$Ektlh`wP9i8oDx*E2()~SG0yx zKg557MoPU^p|BdMFV}YGa=oADoFS>t>*9W-)W%BBTAy&YL6p{Ha8<3n$wP|Za2;)C zr$mCK?@Kye5V~2VH$Qg&;{*()Y!NdCEO~NcGGCQF=gK(P-t@2bo6Ke@NOBZ1 z9eR5{^^x|Znx0JG>XKrhvmw7Kdgzzq@Wl+2>7HJ&1n7jL_|sc$Z}U9n-Ozy9@5hK! zO^e+rXVv0I!@X7XX~8aDWo8S%p8K{gT)X&P(oY?fvX-khjru!FFVVyvR}CdT3h1t0 z!cLo5zSGiEqIby{IIczDw)COHSl95h?M^}ohxsKL+E5TsdGM1@{QHs!WR=q@w9NDX zaR<6?Cb)J=(RRpxQ4JMtl;km6v`yFj?kk?qTPHIoNPx$@#@CTm$`nMwih6;k$%->} zbjlf_b;PPbkpZpD^(v#gR+*OU#Zf8+)e5lv@)e+ac+U-uZ|;J_Xe|G|XRnZ+NePyg zr2sreKc%%f^O)d8Hty&C2{#(@&<(p-B7f!gnaA=V{e~gX?20VL{oXt9ADvqSH)4BamixmUU38gc{6dNCMsa-d+mr9S{j~cM8%F2F_UD2f zDQ$^(sq^@T4fi|pjvxr(B+nj2MlmTzZIt}Y-b3x?y{sG{I>P+`)k@9>1&Z%3`OZej zf&lTdh5DmFL_`AKz#aNBfh)WN$(E$W(Kf0{K?%app{RCA$$W@pWt_P@fvC8gU{6EA zL<2|RAR%IgFw)}z$~bB911Gms0kHwjz8R-bQd>6g1s@8r4VLvrq!KkD{nNupdU1FW z4=kKff#uMOOU}bHB=$pSZ&nJ_r?m08@PNN_9$t`SP~xqWJa1MiI6Wx0mhnDa6` z(NCntKmTDO2?du)Lf~>JbTZT*(dCQkyh6QsahCg7nkvNa;bA6n>G*#wc*iHQVAza#GE$Sl*WytrXU^5&!z=h8g29J@W+DzT|wsxb#qd?r_>iRM!Cf32h9>{3gJ34?(USLHRSjE-T)BAC;2F&aN zi43rr3rwSJ9qjzGocqt*8nAYD@1FSAub+VxU0{3H($f6<%shaO0PDR#&jHjn_wLDD zoC1qk$AC=&fFeM90W>$_^5Q@=gGWgLXchqS0c^GcL)r1!+1bE8`QRY10p?+99-oQ; zCR_pY1A#~fR&KLfYJn~5i?cOA{zzY|1y-+t$z3tHl7X5yz>t)OZJzikzR!vW9d2I$@NRq#%0Dl5Z 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

    S@Vsx8nJIXK2tbV${tVGoY z25?F6**eh0G|3Xr=mIwvd(G-uG#Add%wUd=z8^U2g>G7eBe_zA#mg!`O5J0a(36R9 z3Fl8Z%Yf=aN*B6znwg5u17@kqWUuJna9y2)Vb5c`8R)8XtPm!1J+JF0i~=N9JLqu~ z1?Q7XDJdxs=e5>9u8uQ}E=;$@E{Mw&*3)kz#BIE)vFs>N05rC31opZxs{&Pmu9>!& z@Er9B7GwTFL~V8;c93$0x`tf>oesPwMp)+(FALB>Cyn3dxwRfGRc)5Q+Tz3%8?0tO zV%z(&cO<@+!YnF^z9!%lwKP2AfvzxosfpaLP#`#j1Fy5_>{$9sFu_5eINfV0*D9qw zvzLfLZVrSY<4k=?kJbv8|MH97Epnm$R-e`f36_VoECONi8sl;x1};X1;)vq>*RRya z`Xlpk4*AyzMm~9!FS|6PNpMYs(~XTlZQc+KBNj58)phIGnz${7zt~q&SBBE~u59LR zh9=Hs+#HSv<^*R4cD-wz*n)9E?jx&b}4Z@!oAia0x1%`P9udF!L$G($N~}_ zm}u79&i;SDgY?HW4;th}Bslx8JA2401X>Em^FNET5_J2_CTyE!RLk_(%7rez0Ya9Q z;?G)6j%#FWpWfWmoopuSq@Jjx;yKDv^RTw859Zs`gbI$YeQJ@-0k`~!JDvkVwH6@V zXw`&~gT$~$ZO9%DWeVGu=a)lDx5p=$`9o#9eCn_$S);qpF9r9!l#H6pE*F}Q_(3XI zauZ$BdG3$1NkISezW`X(b}UPk`m@WOr)sb^_qaR^jGDk3r(m{_25D7KQUfQcu*4y% z#FwklFfoebxhD+=P)<>H+IMjLT0o0^7T%XDM{0;SVsh`6XYS%Np{iLSVDzM3lq^!| zF+u7)1ITBM9cRxL+%s41yJWD*D{Pe$l2@Wz&8Y@XC z=Ir8TkNq7brXYu0=2-xZW*`8E)NA6_#fyJA>W;6O-XYOXsq=Kxiipbh1R=FLI1^UV& z>IjY?y&AvsHDKKt># zHU3!ILXf4UadQ7q;Ih?UZ=C#L=}qlmmE78nJ4Cks48STHU*eq~V=R!3Brim3Gg2O{ z^|glRO6O5kC-Z|`gr2>Yv_%YN?&2OyHw~Id-OB@~xu|)K2M5ZzS`T&vNX(y=rM5wr z$-4pQdy~Gd;aQfXtEqw)qA&6Lp{EGKQ5}My&J@Wh^Uj&B!jRY3XOS)RbRm~E-YXSf zHs1=iini#(L=vAsYUMLYS<(-qN12&mp!Jdb)S|X^Dzs4wLpN8^y0P87hy|+Ijk8iK zs&bZvklQGxvn>%f-PCY z1zTOqL5jCq-3!E~p6Y@mFB5Iy-?gZS1##@k7P{P#){Q%ZpEfm#V6SjhWAxkhM-_mE z0KPH);;HeV#}*6Cxzpgod2gJD&qGDRtiQj1%n58~+o|YaEO)_bd@W7#McC(cQ>z{$ z5TtSmx?>{ZBS)c>KTgmO7bc2kUkGt6v;6wQzQ+KOrIe-3+K>}2i0~iSR^_wJ)w7)= zaO(FtHh2;27RrdEm2Xj*UNS`lSQI-7S6xZtDr2MH@p~TwX>(n2I`Zx^lmj?z&*&nf zheyh~WOY}YpCTzX=~a1W(P^P?$%S4h%{}qECTig) zx3Z`qx$m->IvJMYwG7wih(H)EGI(gzxJZ<{MwP}CF+-1Z(}TBYPEJPYaT+iDedQb} zSu;BW54iJh)XF|>$JAJVX};m195xfde|EL84ErHV)s(L5!uvB%|L3O(&F=&{H%(~? z7y5bU?Q7-9s0c}Sy^3SwH&(j)-|z9-h294Vke?C zJHGWfGv}RsJBDP#d$UDOmJhyQ+EyFi=IMIfdk)% zih%uziX`8SAE2S7*1IQlVZ&}p#%QQ=%0Af)#5w4P}M6ix7|L>uwIR~t(IG* zMbqO6E=GYdztB^7HEsin!fzI40=5l2iR!Qkr4Gl?NteCqIxy|hX1m*Kc1@F$tWxPe zHUPI^o3+*&l#8qmsG@UVG&Q>#0V;G`-y|;F#GMw1Q3CJppp^P|q_oE6lW;^Hwfm6q znvxxaZm%U@)YsMKb+45xo(<}x;iNueQ=$}kB6c|7!cBcD7_F|mys?|`Z~~4joONO$ zt*RNFK*%f1(g6)}+DXGJL#l^*E)~=>($lz7$5e$7}b}Ye$vP%&_g#W@S`+nEymp z%T)GFF#0Qnb!TFywA_zF6UT#5`;VL+FX^T}OTk?91Zqk9o8@iCa<(Aj_mgDAC6dNn zgOwvBF|Yh@mUU*O(hdzTtGG4Q3k!*SJa7pS3~xz-BR<44MJyi~tx`z?Vg>XLb)WGZ z6gAe!Co{479{YLci%{t$r6{QNrYy`FiYpzqMD2Q;s-`rV8;lLEyC3^yk1ii2=615j z;XfY)q}Yk!Qcor1MN;G2i??`ahGC3QI2$<&GPEFYlMQ0W@x@B*uS>W2cRq~?duXTi zzn$u49rNrPsy80LKPjH?$2;WWM}cdDKkXwvMR;jj?)IZfbzOgWOg%T~c!JmdKz!!g z&9?A8hsTe*57^7QCq(-(*VF2<9e0ceF4k!f1NR8KogX@ywHXqY4mstZ87)|bHBRIY zi9IaHmz|($;jhXp1Dsf8|Zl(ZA8#hmdgqw_Ho~NMVc&Wh+>)x{|n!TuUrQ z`EP0;iL&rfF2{>^m5n_9A6;J=71y?PiE9WH!QI{6-QC^Yy$J5X-QC^Y9fC`60wEBb z!rh^H{l3?I@9W!R)Q_|4{Hrl*$y{sBeIR`_96VAi?Tsw|bw(#1gF!dxPQCMwC`Gi& zq7Ab?MS?7DIJwyja;-Ph>-D;#lqEhZw>%a<-Ny6qpp>l~uJjTz};Yw{XrKgP1@-gkqn>u0uu6+{5c=cE0gZh=aF(&7J0^#fnHZ0=dtuA zudkc8=4fIUf3AJ35~Vt3!-lRnv9u??%w%b4Aw}m#RDXm=2r!4)3#yM-WOk1sHcRvJ zd_VpyyFuL2Nc?*E6}eN_G@8TWyLsck>E`CORdFz%6s1u@UbS2@UKCb}%~MNeJcUQ-Wn*1k_p7EQ z#Q0~?*d9R+tQfgzu;y1x<^Jq~P$zi@A&7;b<$gM`Nv(J` zD1@pcOKlevXB$XP1M+P$G_9_zWoRs)4WF!><;sjAUs`HeExE1=uACBH$HGNTNe8CR zP#nXXmM9>vfLqVps?N)+^W*rptvOm-kB^jGE^t6o$n%7vUEnEJI=Ls{2ecOEa;V+l z4|pvlu!B8T`#M+OIrq4Kb+_nd&odFAT>9e*k+ly-2a@6cJe#Oe#aidEQLId7!Dl3v zhb9pww~uGxIx#YJY^C~2GFSl{M)~fRvB$Wj_pj3M@1NF;fW31L(rfU)=6gnN@Q=-q zaa^IwMfVwpcY*^ zyE{3B1_xdY%Ct#EQu65_6Gg;<<&6)TrBNoQit0*n=TT6wow(;Txx)HNU}%0|M^ZwJ z-n-9#<24dWB2pS-JQ+Z&dpH;PGhQ@YnQ^ybUWpSOU@azaSNtLQ;QD;TUhErCn6|>Y zmEPTbRS*9->Cr3Vs^8k#MA4+AMy+3b>lMdmt7(!a2say);)*u&1BUv9lG zabu1#ttEdSxfjwC8fqokdQd|5L8i`N?; zQI%Bhd#8KNf&glIuN7IXX)UgO+$@TzGNF`$*Iu-%ygCq4gyGu}W1$^6Pt{Eg4?0l-tM|dvWT@EHEZhEvg@U9N=O0>)r!^{vpvYW*G1M)1I(Q5RxUIUi=A4A{=BESwY zC}*GBk?s~Ocx3Rd5TuEw9!DkN<;w5sXM$uKyO(Y-%HH~C<*)eppXYk+4=ORMXvg=j z?|7*LOBXv7Oe7L3%cX?O;057u#Z+3f8)aRpBnwd*WFmK@{#5czlB<7=lyzI&fy6N% z3|b7{d@e?fR?h_O{f2yxoFzh+ecjjdLCM6&(&_u_%ry2uBG7ErE$b{ zJ*c0S`S$5PsClQO(?rcg*_Muweo?7!#uFi&*Hu=h+m8CKj(jAMnuW-LSWQYBMn$~| zA>p(mEgs)NZXij&eN6)bLwUc2|v_ud2>=O6Ymk1su&e93p4 z-cDZbbCGO@35(UP(I`87M7LC8dzJWX&?&3eT5K(#*TS7Rpvz($0R-cSvqF{ z#O@s-CuztjP~IB*s>9LdW7|60_d!zsS45LDvi)#EbD*bQVf~9Tb=4Y<$S0mPK|>1x znmXc_2m`SlAXRLE9sP!mS%x2h1k>}2OIt;Ht_H{$iuM+e`W<7CWY1vn^Qm~k6p2h6 z)rXvxxXbAXK|Eh3R%RJBBGRqY0ZwN)4NA>b_)6-PB$bM|;wHMi#8*taSfSJ}FkEbW zJ-l_%p;$@YiG+_fye!vF?}pkG{gt>nT)o&oh^xpxQ?k?M(^S%!*#1nbox!%!ah@}P zT7J!Lo{BVk4UK&I*Osuim{4m=ngIOQ-iT4id?_M5X>3 zF{n*%df9lHDHwY;iYzCMN~C?UkpfCbQc`m zKZB3^q<4%2Pf1%N;_0ght~g~+t3f`!?Goih zoyk~L2CR~yIleRLX#$pd+-vF1ORGzS+o{Zwl?M(b;TncGKt2DO&O7NNJlExPHTlt@ zu-wLm?;Z2ZQK3*kk(I`bzA(lGqQsBo#-~XUlVB!rp%&{u z{b9f28g?op%L17VO38CV(W|C(aCdJSM*7ieW0_ttv{y-RDq4~<=K5SB#n;oFvpV-2DyXE=E%+T3 zu5f}-EYRFIwu_+7m|NHHalX~&>+rJpMcybP%_^Mp0>@ly6NHzZJFLq&8)gX;Je)Yt zD+wp&?gqA_hty(La0V^1Y;8D^Xk%mR4EnlyNzfZ)1D7`d*M*0o+}H!uxs;MNJ;O{{ zb=Ps4V`37u@ioVs6DJx`Gkxebz`0#t|+GDHpua`z)bAI&OpM}Bqby<@MldUilmsH z1etxyF0Yt+87^U2#U`a(okm}p5_?UK#nu4M?x_U%$>O&d%P1eoHfPB)I3ydMG}XBF zDih{f(OKmlt*M-p^ezsaDM55KhCR-_>}goNI&Vp8;qOL4>kH8y~LD+ zjNMWoGaiBr{LIq|8pxI3DHjm#68)3IdA3lSwV_IXBB0t<^z<@6gsN6QO8)7W6TUdj z4$eV*flcmlUC`9-b&-2xSS>C7B=^3LSeKL%QWOo(ctgyka}8>P-V$(eF>&0`%t5aW zwOd_0@?+~+U3a}hV0Ba;0$M<^L4GGC-Q3V;#wsm~v0Woz6j(Y-(cQ@d>}lL*I%)S~ ztF@Rfr-ZkT5jQe5{Gf&kepF&S_#EM=J&UQ5TC-m2> zuo^5PA#ew4HR(8Rvreya8}g(!IP0;RT2|ftlTNPxn*77($!GkL>wlBDfjogl$Qjum z#wf*az3Tq)|JzF8!@3UaD40r|?Uo8B;l86-7%YJTt4+j9&&)g!Z8|Y>K5Z@9EukMC zo(!q@a6GY4fp@t^9btC{MXvdqUG!aw08Vi5aLkyv^g?)l@vM&ERGI+Gf@pKmHvE#I zWLSvBDOaH`Ei@GKoWJ&y{?AG}6HO9K=8;tr`erh9u`!$SXz~!-MRJ7(ia9pAC!xfI ziOvqnC@c&Av}NpAU#Z?P#F|T4vw_kU@~DfNL-tRkG3*dB^AS?U+ulcUHv?i9cT^@U zU%aN`OfyqRI`yl`t`_U2Qbw{bO#~Biqbp=xDZNshhjnUA#xlp?em$+m8?ZZcl%HA9 zYrQfVAeeqWs@aJsr?9~t!pN-Y^JLi&5^`fZN=&F9lSVk8i2J?Ae?UnPnOm!3IM^r> zX@9xM_?mV(i4~b9Bi0;cd!hDvhEmhn>n32;6`d?D5!uEQ?TSBo1kARymsDwO#@KO1 z-Bw>}Cl0tC>g?)hFUAMCcu84SM{%v~cDGV}Y=OLGZtug{8;{9Y#{3fRB+<)|7&Gh< zigYIpNN9XwV@96W{~}yPE8^?gJ+kzx@T*r{?=@;#*odOe*LmvuL!D0&Hf2gy5vIV8 zUo^ha$?~iizmAG0ui=uv-!i_#oVq&Wo6fTTPhefA)NcHUkEIzfVk=Zg%*j^B#{o;X zxU&?QzgfBG>gQB3=eox*_Za1$f1>+WVLs~Wb+AeGe-}R-@?W3uHJztm!0n#Rxa9A%0KdRL@VJ*bFB_;>65K zES8{cL%H0TB2`Feri>9$CE-yMZn!KG^P4P#M4nZo${la8QToWGX{WJy@g^_INM&6m z?Veb&CCQoO(M?H;aTwF}ECI|uQHo-ZVH5=*vrCs4^@OLmE>$HbQ$esTt2`8)01UB~ z)V&!4g~}~*Jb^T5ju^)2aOQrOM=g?crZ2V+)T#4!s)gBj4YvaVo`|7=74maKk*mAu zD)jUpzTqnTRfM4HtyQchg9Fo&SRVM_(VArpASa)uWeWybP+C<6na25R>4$oz(n1Wu zw9pY4Bs$~rnwXe%j4F-&+$=~|1*$i&6R(&}ILvNqbO77pCJ7-I;Pyw0A8n~!(SwBE z^P$jp_Ayu_m~|ckUkO{=^JOq=vQ4t((Phm%6$1}zm-MsYy-k=C-_TP|6+&Xpo~Bw` z3avKqd1DiNmGrOXo^G&Rsa;|(Ox_`{?Ow&_L~|Mv7kh|Aw)JwIcIxS;=?V;NAhBm> z^i3@YSe>~$ZYmLABeI_ceb=+Oo?J60=wybJo@!TTjk7uM3K2}~CaRb$=L(JZp>Ve` zU@OM`CAgs0k~!|0I5oTO;lyU@XLVzPZN+YAOGDGnj< zZE3QMq89>Gzp#XtEAO5mM-!c%941dB@TJI+0&Txi0z&vJ)Q^9Y zXqootN*fj1P`K}Uk}2wvu|%~rk7VQ*x7`-Pb;zNaFsLM`pgobRq<#=d#W?Ou*aLJc(mK!c2?#TQ~x@@k`rAsXA>JdbR6>RmU@-9in z4+VGGU6s1TBu2b%@q_ej+gxhP74!oUQoEzslb76dy|dh9X68a?^!@3Gt-nVRa=F%^ zc;YrJGTzLmtTvOqi=DFsUmc!{ekpp?aK;{rbV>oig%0LjnCa<_;Ftp+ic62 z&d5}^dS369Co?j_?NUyya64wP*+ki0b8yVAVS1aPDWuEa|G)+s9 zS{oRXRBTkQclqaa`ZAQ6NaWequ?)wwrPpMd3aiz_#$;7aByOGbL0uTs_^$IF+@Euq zPL^@{r^4=;VQ%3`kLs|HO|XRt=2E;$>Gy@-#U4qL09%;`Vr?VcHdBjEebiIP5qHcQNf6dCEjhM=cNU4vwJk&x2^Cq` z@v#G)6p}z@@l(3WG+U0YTC1o)XZkCgz$uE_K087e%m$g3^l!`G8LV-yGM!!QnI&3A z!{S8Di_6wdm4+EtOfc-TdHRp+@eA*I!yO2y2opJE?DuHwc7#kTuv#rmtsDTO(> z!j*v28KVf)WlKp@qDGw7=J5k+2MHzU<)@e_h@0=hvo)=nk8~fkroev9O2+Q8AHL!I zL1s%_!ElRAiNdWS8tXkjR+`rq5{?CNj{a;yU zW=it^aMvFXCs0r*#aC3sC;*lWxakm5mlEp))JS*TQxYxQf}zWdaEZaWrBQnP*W8&}#QP20S;y z=$ys8zp`NvRdUuypq072J{dX*Tt>_Z0(0qoI7wkT_vcHE52fw5UaDdpiI8vEwJnnV z;VcArabT8oa7Mddr8tU{K=vR#8^6VmNq!=8Z@zGXke@ zuQ3bhE`?iRLuQK3Ip;;qtNrR+9WkY$XsXTdla%IN?vdJtOSxoshAP0wYmHb)-3sEQGOyJiLqX1Y_U%GLM_e~xnb+-Es*QOP5}hG;+HenzlmOiDlLC6VP+b!@O9|y zLjO}Yp6xxQreE~U?G|6L(ox^ihEbxVVYnUG(`)jy%4V|~;5PI+Tl_IDV!g1NF~JYg zt(dpweXcfpO_b>@?``bV%kxQ1#~3v`>eQa>A_AYuHkko+sOR-O(Ak{ujULF^r`=?% zG#AEM{i6+&5$?aT4k?r7e`Ot_@o*zCIdc|@s0q@{W)k>yWo^v$^|f`;T9g8r9)v=; zN9w?kAD@Wn0v8HyT>vszIAlp8E-5%V%HeQ$ONetc*TH5I0wDD<%C+4BL*iX2_$avv zlCLe=g2Z2KD$+<@v`q8g!!K0Rnk8|GqsaO^VwgmVM{tU9M5V08RVEghhZc_GaIo_UOD-uWan>LkGxwoz=nFM%jfrd;-6pFN+uMpl?sb0%fW zOYV28O%#;==&~SOjJ@`%lyqH>3q_4TG`_y`ZqjIoW)vMpve1A z(q6emP50nn9u0r~CpjyDOxaW#eg+kokuxLMwDtl~I;vl61xe_elFX8Ul2eukJXK%N zUnl<`V(()&Fz{c~ihdXMzbwH7=6nkXG1avVrz!+C2quhZLwtbVi6r(81+5OoWfSmq$c5#Y7Vw zFw>a{Z&%c8WbpCv8~91wT5t`<1lS2pv_wA#!XlfQHqCF4z?3wLnB7Vdsphe@J7nR@YIkFsN+)s`HnIE7xN3@Nvjn}VvPe%LAze)F ze;Y=lvfsgzjvrL%Y7dQ%(IX5W=F(V?&R4%P8D1)iamsZPbvs0@4F4k7raKBG15TArQM_Op$exU)jwXP=| zl2K@DvT*YZW6(Wggk}+Uwt4oh2hz7KJ_#Iy#r$rZ zmd~nUBvgk6tBYY)edbhf8VrK3R%a~iWXBwCV%Tk;6Ag~I&X3)B{>J=IzFZ&HWm@m= zL2b8Ee=CWZ0@D%$s!?pFpx}QuI=?qNSGN zqZX6;g;zW?>O#NS)#KlZiI{(8*b!xza8~zuwOq zKM7A&d}c|bQXnI;Z{Xjr^UZ02Gc>bpuD+Fcq_&pV82L5bIqIc9uhYmR^jm_Au@S+! zBv+j3Da;hkK$>HhL@=6ASW^Yc`eq~NR$s-9#Wa}pc}qj1(lAz3=3r;$8~H&1Gn4xW zf@ACvbvWZI(`TgcR*f2i3NJCAyS$*W5G32Z(3?7Wr2VNDZ99@RjUbHA*?14TEXmEY zJOvH%xVO;M=iDb;@=zjNsh<~qr7GxqrS+zdgMeX35edTR9}Z)K=piv zH=bm|MrOeb)}HfRz-6$pm()7WTyb>|25)I12oDke!GYdMa`j;{bJoEu?1-hWPF;A+ zqV+6-)kceuSy5^5l^&hjq^lAaQ7S37%n+HlIt%*uheX_pr$)K?^4;=Wev7Va!sQ$Y z%H~nu$jM#EDM*?TLX{$dM?r;vfq)3oL}@RCV4+STLZC6Iy??&wI{eD)rHlfA0x)6; zp}+;Z2%DiMf)UHXV@r$d7x40zgjK2@sBIj)S2tDhBK%UbJgl8)Qpn@6JnvcV`h8p7 za-25d-*;YVJrUR^lg3~O2=euu3l+)x(&bKl`{aS0GAlNDf6E&%DP?dwSEj(ENzk+w z4Hm?%5YPx*ptR1$@2Nfxun+c%{uIL=uzFO*?#O@UuTR+mltBxJP$ohU3#3AUE)@FD zp+}kM;;W;YY}Vht^{oZVA6G61qrpm&LQx70pNH87`~IR|{e7-oUmdOA*ibk0DaOy^ll}M!C z=={{}(!@bn;qtsbBMcW+v=76~{az{adk(9eO+JT{X{r9bTd;f9W%#xaw!vW3F@#)W zx!ui{-J!v5{Xl~NE_@Z_cuS=yhxq~Jcp;IPC{Cxe1~7c=zM{Yq*wOwI1Vrp6nksCd zhpO7-P6I`!Rr(Csz;ZFXDNDYp?#mzsn3GsVrM0MGv?M+@hRaksAHgkj{OIP{Ar{P$ z%K+LwOpNrxw9jJ=kR|@kKyY5+%f9KBX_}Pn(Px7+t9dP372uCg_FC&Fz)8#3nIUk< z(}7PXYGk~&8HJw8mJ0fE#f+|tQ}k(vkgvS+JrUi|X4^v!>n*WGQF{o0E*6~XwQW&-T%g^rg4J}5NNfHkVM&AMYD3Tp zzq@S5Q)-Ps>3L8Qmw|wG+wHSlYt4;?kM*Z+9$+jF`Da|-Tb;_@)g#RxlKA^ClFSK=zH!QRC zH(0z%f#*k-Cl5QD3M4?8V8_Bq z@Po;N;1OaYBIO7ahEal0=qEN(7^U{0B|~>)!E;HbXa!FdGXSX@>p+hS$s3^a%$fT- zNAm|H44R%ICe$y!j@IcZ*LIvj=#2LvBv@LSjz!?@l|OakLV-P5Qt>6_FZYXZ2f2Xm4#a4)~2I zTvx#<_cK1J5}rz(e!4hzuR1%^bpT(f58Lbq?xXo)s(`mQmTDK_Pm}*>s{;<3U|BB- zZi2;Ukkvfup!&<; zwOLHo{|+FTniMCXWuKZ-!%H!tE<^gJXxP`N=X$I$U7#cNwT>Hnyd$58%X4YINOPDg6%Cnr;S+?L$Nxl3jAkV zS4!f&ieqVxuUn~CA6K1H5cGwWd>D;htyx&{)J0d9D_g?-fPEj$z zLPPi;5NT9O{561`Fd~4#2S(D=%LFHN&K@)y0k$w6q$Z5Euo4RUhXY9n{=^mQxi3~3 zA#Qy+T>TQwh62Na00&M39@UM%S9u2}R|x!O{i{y_ejaXkuIz4!9C^k?|-g}5DP|;3RYCvxDL3r(G(&5)(1B4K^F64(VGe|1}YiY6=OB7L)(;(g5Su7q5iGOo2HxT?Uo~E2%y(_rhXsORV2FC0@~r`xfiG z5GmK)Z2P?`;&C(^4BpHOVfPTJ(>TsGexY-z%Xw(M5Zw+{+%6$iFF>@m{h;d?T`TAq zZP!eB$t(zJ`bsxobImetC*X+ZM<=YNc)trH=uJ_3hSe)dr(LtpSgL-|>Os&!&vJ&GyUKs}9F^rDNsOC5M)+bH+T+mmHAu z#h*F@19wnT%epmSsR~$Z&cJT@;b{@eRnK>-9Y?pb;r>&AS^dK|)SO$s{&CS1na1&< z-_u+KIm^oFD(N`{mO|!n2$Qds4WbV9Jehz4Z^Oi>hK zjlq{gYe94daF7ONz@+Qn8Kc)9E3Of|)_-LLUX+xM)(Bw<$@$;dUeM-I!;A*iZZY&D zuSl4;aWY%49`Qu>+TD%id=mwwEw(e6`t;v_>;;7vYmUI46v6_*ltPDa2uEWXmLIT4 z6Mig0Lp50bPLhCy^vMRv|vOEY$lw*MLz!#3}AYvJ`2;n=0> z21&lu6M6Fk)2AO(62VlXZhRd6Iec~j;-udzF3bY4*n{7u8f`zA*(Nic<#?#uJ8!i> zBKlpE;H!`4$k8ayR`0Fqri?kJC@Ap2YvHUbaSu$R`1@dbDMeMDSqoXa1p^4wiK zU!;#Gy9BN`t}5ybOMqG{f)%Bgo_6UVANL-c=}&u9$UJsH&+z^e?gK+@0mdKR3#F&# zF(ldkPrJ9~G9=tREygEu9or-Fdl~+2pJ|?61mE5kdNkT+yQiuNbsk3MY!*FpieBci zk?9U-2Op*h`|9nKZ_W}TBmIW1XQ(I%I!e2@;E}1%UrxTi`3BtuoU;;mg$$gBsMNmq zS>{z)ZPI_Bm-C`(FWK}nb)3)Ez+Esb1x)V&8<{@ocFq9vXs@cpO+W0=QWsCfZ1R6# z`L|^4s`i1=*q{=xzhg9C=o=e-$@gzm;Kb6ZpF+@bZwR{h=OK{q=b$^40_gh7b9ld| zMnu4$mhkSI7FtuU5>KQ`O@bT2Qb95;O+NoZpo4Vz8HIVlTF4&~I8)3>L6ed^tzb^q z&!&#{oze-~js(BSco~HOT$g(U<|5tC698BbAR?+2W{#J7Q%+Nx1fzMTy7+}AM8DE8 z5;cg`9an2)+|*RT|Mu2nkENq0Bk}Bqfyn09**Jk2(f8o{JWYlU z_h3!1V`mkPUXQukkKF2TBMP1^+J!E&`O;KIaLVET@}~~>#l>$$tgidskdfttPt-ai z?{yV6wMpOseKt#@eQo*CVX`dF=Qi?cY0_b?MWMs`Iu^oBK=~+rrA}Kz!LPpnbPe;U zd{9~TTnawguZTb$Tc$ko#LVEKdI1NOghf#L~V@~*f{xl`NS7g`|lC*5O zK1073)@HwyS((tq2RG1Zx%ul92N~J;!rN#Tg3O^UOYQ7KLTdbbsf}JH;Z;!3-S}q( zEF+gBf?e$U3%O-#p64oH?}X7nr4`?Ejj-_(S?2oZ_r}3K|J5!08;0q@5KpX}T zrXG8C4$ZUrV2b$sF5@X`2FKLBZkexFZoC}t<#nBK@afh#q}cH2EJ;2 zkWfG0S6ruGD&{jN@e9!Q?a#fv6I7TXL$y`GMmUr=E1N~{;b3s{;fl=_*N!>tRNc;D zmSE>0UP{WAH!K;u*LnoDSA*FViyGC>s~8eahOX)&yHiM8V%As>PB1?VKd!*0X_+)! zC%UaaZY&~*wi+4kzVwZJR=xjnKUIFZ5{C5@Eqbdy&hgmbyk2`HeJc4$&SA#8&S06- zR^9%SSqZVzFYA;!u*^=$%bsDL?c8~G_N?0|8^hj*&_>gPTJ4&n9TwpYU8s)Ht{j)a zKUJakRLVo0ln?v`B3@PsOdOkGzk$LLC7sx%mB?LmrTGB9t))-TvdLqco@$E^v&VSUZiwtJ)5pPG*Z^hN4BrT?@#Qn zdV-CG@bGX(TAgI>N4J8$fWmP8B*YO7?SzC_pKc3NC&csAU$)=btB6!kwV+ZZ_#{qB zl5`1~E{g-QAl#$|tBt&<@qx%3m-JOgsMRpCv70MwG`mC%Hd~91iIEj8c}p?8`BPZ% z;Vy%2bBEU+qrQXJ?!2_YaEdQiD>VyS1;x{N)jBp3$Jf-Z25U#LWf3lSXf(S<{ zy_GifDMJQpt)wpx>J81sK{ws~10BHdv?!$-G2&@m5!dK&3r_HEzT$Yb2K(FP_qUc( z$U-Y^4u%npc1KG+19U`%2(@EL`d#iDm#URDO2Omag97A2dft?i3K-ytP zk?!yD@+i|x?G3;XDE-Ktzxwh3dj83-Hfp4$GoLH4N9dH+vXYF;VW+Ov=tt;b2kcgr z;hyOoOlFU4EmeFuxPF;*Xsy{Km{@s3Cl`9+98EtcUuh=W~=qNuTiAiFe}A6 z0E;^NmBb4`RpN}>T!k8s^COmjizon~OZwW$$g)^VN~H)z#gz5*K*S2sy*8@l3X?nn z<8JL(PKSFqoSs>3q~fT`B|+*Vh8QOOJTdtA2No=y7O5iE>wfjqOU4&{BYfsK*gCy! z1Y9)qbwKuB2ec6-N{9G_i*FfzXA(k&r$LV#vP8Mv?^@6J(wkwQs>a^7iBw*9=bx@^ zpnwLKGC`pU_Or`|w& zW!?{oG1W0qlhtOrhRm`>xih+>treTpH~Ut-kmKXYMBO9gd2)tY9-X-9)hZbOY;wn zT=K{Ia*Z>O5^EFAI>^C}Uq!>V-~wc!2)!3jcrcJzIysJ&k6G?dK6h015;HyHdE*TYED}$@ z=iyM+|e^8{flbCVCC^>AFbf{~$YAG-4bg_S9JyyCdd~|4#s6bp@ zc~Noyv`$A*1-Q(v`jH~#ToP^2{5(6Hlhp5-xqS0yvBW6Lvl>uSZTZtl(dT0;)E{Zr z%un0vHY^o?#m%vvKs${sQ$Md-v?s$A#7r^4@I2VTgQlXZ3d;+#;j@x;yF8aU=qw?p zb5iPLxW#+VuTfJ3GG6Ta;^v@?iGS-Ye%!(?LSG`h(jo4Z9@wZ4m?4NeqxG?#{GHa) zcGc(m4pS0hpij`~2lR}-lcPYoX(D{izfz^Fre*X#w)Ay`h?@KEWy3HR=ZyyL1UWW! zKZ5xr`;Xa)2@~4=U0pCuqXPFY+~@~}?n)rGN&96kkf@Uadroj|vq?2rOWgW}WC|sx zO~v8COZ!XCtYX%NUX_IxticIDs5ujURi^g(X-Gp%tK~vSD?AGzNuh8nA%uX12lwPL z5pjADmXYY1NueM3LVQVrJGAb@KyQZ=Ww5~zWgwlf+zC%4;E9wM@^KU95TcPSR2u~< zEYVeA$kxtWQ`YbT!%2qB%{Jdk+L>_+d*=|-t|5%kNk@QZUPGWf&O*^xg@+eG(@8nP zX31a+k%~dz>&dOtSePbn0qh6rSoE~8ta9o+9Md>A!fOoG)tYq%@E61?f>B}itts9W zV54-8(a!`jw}yDfd`Tgt6gs#9@dxCUw?auo3+x3F@JAZ7@+U@ZT-2cCf#?-vJS|cp zVlM!-jG1HAuXgLOQQset;`2%=YIx|?KOLyMQ`o0_d*qv`SNzsUKmErGz;RuN)LWBL z9e3b|jY?IKLLNylrs}kj=O|MOtF4hcJ_zS}OwaRo=<8Z)?Vq$L0qrm_BOjMcGhdZ@ zcKK#TxlCK0+yeY#p}f`ay#q|g!qD{LSR8E2{5w|WIgW+V6|Bcac5ED$uX8{G3Zr~K zIFZpa-8^)Wb=lkaK`h7$%0t6<4FVib%%T2 zMyuWe|Cdz%OYoTz4}40y*V8F>_-m6UgtoeZ05^;kN$rAuXoCVxgcbsx2?p~BC2={w zg2PUe&QZeF$X|GV15t?j)25v42V{NC4{0L_Mi7^maz9!*BH0~qEBm*QUjM9BnQo^S zFNwPM76dzZ>NI21Nx`_ztnAPg?@#raK+Kcd>yVRuX>Np!+h@9{sQQEaw5E_ z`#o&-v%|Hlp!0Q3TmYMpx+X9w8dB?|mt7$?&|!6laIPoREc442-%;+*ofIpB{qVzG zeO^j5aU{MKY+;`L$PS=eJrucm3%jVP>QLo?$Wukd4=<=?NWVGxwZ>R>gJsI=X`I~} zX$~c`mpI?CKjxQMLa7l|-yECG>75*nlK4G77^G?RSj`X+_)aF|zT}E07?_sN)8( z;<6ZN;%oO_YRD=1`jq>wH=| ztQsTpb1#L2L!jec_k`5qJQ%R&)P$UW?&`gZgkEXA9Cb?N{|hmi2;t{gaPWNCx(KbG zn(J!rQ=p@dz6%D624aA&T$FXo+@Q-5*e*w4gwTu@0%Rmt5S$<+kfO~nwT2PF;CC~i z3l;&wJ9|BD(Co1M;)IAsIFSfX7t&D9jv^@9M9Arry8ATw_|P*5FJq2YdTFMCL?b3# z^zCHVXL;A&7+_rPpK`I{K=TAlw&iq&(!3k^3%^H(n87D_7O_i*zf+d=;Y!?hi3UuigU?(2(P6s>+}a1e^NSWM3m zp4zj9*aCIW<{$0M(W#}fRivskyF9%A!l*BvT}W@c;-kp}F>`$O)^m)0)KqJ>{4U%qmbf!nd6?S(i^FoaCX&IJWOH^bs7tzo%<3!m5CEyJNi4J^o z`0W;EoBftAI%!g(;!ak3u04H&;=y5Bt$)TLLwK9JoSC3VCoob>_%_45rj*%y{Kns~ z9`dnfF%+<>9bWqc^l90Khxo9G>?tiZU8c@|uH$=ys<}_N+Ng4*U2*)q$NW5i!hhie zYOtML+l%5S z|No3{%7x|yW|iyJ;{Mu;ts0RW9XxcisfL&G5efQJu?45CxX$#Q3e?k(~05}?Vg1XA($N*!q_h))JI7oIn#7j zD(w09zcXj{+Nnn@JQrqQQFS5Q-&oNOVl+1#1%s zbU}~29N?M(JfhXsk7W%Xl`*A!&R|E9>*fY;@q{@WTLTR){ zqThVdnCf{b8YOaXI1N#6=F{ALGhWt?-Aih+Gvvs3`zMmGjstu8<9>_nM)NR|x!dOg z=W8ADySKL{1zN+G-z|F-B_0AtV=a4sM)B0VywZ1kE0J%$Gf*#Ho|h@|ba%h~j6+r1 zRH{{8Uq4T$8nq%&5U`0k%K^k)ZXY{v;z_{wyS=`ut}x#VJipBx{@(VZbiuM${m0~Y z5(5#~=Ut?;_O}M^#1%Rm1=<2aS*nVU#KQ#alRn^_nGG%d&jL_AOfkPfItc{uL_~v# z{%o=8uhtJ=U)*L@2L5S92R}etK7y~vmp`x}I}f_`Y9Ih3ptw^E#kA-WTx(Hz@id(1 zW|!ga2E82v4?n(FODP#nVaVu`pr0TBacjKqO)iEArm#WMRx=^T8>0|_jCVFS@yPJp z1u}n!9=bsE?k9t!d}Oa|sNZCKof+h27mhmu04x8n3f!&V8jM|`zgMSi(XPxni*2QO z;Z>E`A%t2J1e{LAJcpJaZ3aAnkPY1i@_f=DmLWH-C3k6=;^3q*w>duuhuB3mLHx(K z)*G3eZ)#ZHjwT{IsdhsR4ZV*OS&v38+HJS|Dz&{pUC+mL0ZoJ3#jw-`LJup?HPX0@ z6tnf2@vHH=*Z#RJEi0nKwh!6X%S>0Fmcf0sBo9wZgc7uc-<7Rq>Q~==?>lhOYQueF z4sm7zDx8k8N0=*KeXeWbJnGsy#m%gt+dqg;4Zu+`&(lrc4!(Ei(KOS~`q~68yErxI zHN+_&koGqBc4W$`&G0TbEq66+MK)O15&SKwCE$!aW95HDt?~^KBWc_7=%Mf`PoZXR zvSsfqPtof^xeNK`^vk@(_1*94Ts@!jgFZtA-jCs8aTtCDtPqIoV=7wJeK})Uv^#4)jUumitMaN=(O=fKdm=dYEobPp?&e_X0B-FF9EAV{ zdrr@mh(-C?-foZeADIGubs=P@YfRh!S#e-Puv>ah-fT>IKT1XYcRl}{1<|(Q;>s=m zv9X<2O%>;P%lnA{H+`F}Hi)WNgWUs72wVVMr(Cp{3Xr1edwNgnA@+xlTJu%^;FA$> zt6cmi#1;-m1wlf^qN5SbT=Na2j}2(SQ1WB7yB16V()ba4_k=2?POB2!qABeZ&DsF^ z2Uu%>vPWD&RRBGp;RbvcY7ruI)jyd>K{sZhF>Lnc+)7K_10tDwv>m*m8Gj+SZ^txh zVtAP0yh1j_9?}ATgU+xb%s$eo9cav#)J5UrH&^)GLDg7S^bt%)y)Aa07t&u^c?wVK zt3GLDI!l9Wg-f94JZwF0C7fBarN6O?yDDK{xD|A45#VhH^{zZha9JGK5ukCq^{wXdi!1qJ%1RMG^7jzU9tZHbL9Z=CySKLHvcF z!Cf01ttqc&uIOa>xv2Ec!WSiHjU1`{CNDd?+E)5{th-_4RVcui9?$`{vldo{C>Zwb z&TsO4*+~zkqVvpK^?*m`IJ!on?u#cQ{Nm>>cAR#J{bz8PGub>!FAaNhP1^6RT7uR1 zB*2PE_A^=oRle$iC!epN8=9E7+akL8SGOtR$%&XX(#O)6^(DWrV!ZcwZ*2F10e&$A zgIY}{3AewR^>u!CcG&&y)JIf*4)T7z`T^Icdh;xFJ*sCEHgMS$+EL!eTRNFy_~z8{ zL`z8B_uBbh*Zp*FAgFfM`_AR|&F_5CFyY?!;E4Gjka;H)DE4-iVrPx^*RHa@4jpV2 zOdjl8Xh=VPAUX*pI7>g;JUV1Bjumf_6z^6dc&UIVI2|)Ilzo2kF(SodcfO-zV;P(t zi6(SCm{=q7Np_2^>`jp`FD10cTBEe-8}=RC6`YgHr(zbT6vJd@aVS@UKCq(R(nFK; z=L#vak4r=iBvFwInDUV?rrrkGJGGP?^nhZIrIIwsgB;do;D#!tL8>jTl@|Fah2%$w zx|MXibCD~o?rk6DFLNHP&%aq1O}y%?go)gN$CNUl9ZGXWa#c@7(_q;>25)~ zksRtB&;OoxopbLwA7{;%S5h$Tj5>l*4cAX_b7(a*gjV- zQEdN7aJoSMR%fvu|s;@P}djRWoc_H`Lq*`KdM9 zH^E!t*?MCt6QkUzM2&_HGspiTbg=p@bl}jV{Cm+PglfiOm1!Q8!Xoaom`YoPF+qyl zCW}3A-3pfF^d;}!&xLxywSx>%d<@zbe%WBVFO24+S~F!sMWB+P3MmFqV8ZNFR)mPa zQk0y1n82PBCfTNn}$h|GM;P;+H?}T z?EsG|gF;#qPlgIwZBpr$Rbcn*3HsL=R%TO9W{CKQAD~6JBb*tQFb}ZiC(S~{@CNdA zDZX)esC&0-`ExX5(%5Skm#51m<~1fRMhadWk;R=Kk)X6l+4~vjf}zPtK$BNL)?V14 z4D%i*$3jUrPwLcAQYxJ(uUZ+2Ml<n2Xe)HJ<RM*Vi3##Hdc%6QZ z(bNWO)MKB^IxO>{x1WRQNq4O-wt|bO%x$yn^J_8>f4;d)qJul0Ty)Z1=Bm_=Pp(v> zI~J6!X3NYSvv4Gt&abk?ipSC&Lndtf?4S2w`wgYznz(l?z)aF?x(x&ZSJ(dWl8!@QB3xmbgcFa& zmR*U1l#JXyEdQ&aZ%*_D@dzIe$!!;`-7Fa$(9!J-i-n=8j&%t@DuQpN{wtAgWMH!i z^3K8YnJ%HrP6F;2wf$Q}_8EYeReLoP5&gA$9arzzoqtyG$6AKCKEstBWyodD%6-{~ z);6QOLIkESCb->w6P#EZy01SG_#?_=1mUh?Dl4F1VC(=iTm3@Z1uzbL1gC!c_2)H@ zLT$6$(9m#fqqAn^rh3H!Tq08!AOX*MKg1f7?==Xs1G4ly9x78ws1pa~NgaH)kfo1h zJC+0o91~8Dvgk`U*ecl)6HEx$1%~2mW(LnPCqNCzc*{ro`JUX$dMc5ZQnWxi5VtzB zrCXjczRZQkwG1YRM?L^kP zTxB{-zO*ZU*YA?L?7K~=yf39m%j8zcvo|ee%iI?v)ykf`lb^V9fXfMDZsVbTj>C4Y z8ONB_+1IiD>7QFsdz9nsMC1X6I(6`_9D)3JN(?z0bXo+a$1xT%{ZM%%(0ztIn2*_D zeAe8yBKvo6;6IY7MpmLTQK43K(Z3cW(>B$trv?mXa79>BS(am4F0NMKJrofPTNn3> zfa4tv;GlC^pg{Cp!6RUgwTbc$A9VYN$lHP^)8OPV^h&kR`uP+0*I>nFTO8b-VyDx> zx-+ad8QL!yVsQa8lQ|iI%$1e4LO;bA9D)j@EFkdki?x9nZ0 z2XQ#7%1c7s{8#LsC#CD)%2EeQ@kQ%ZS()PaIgorn2mYijpX2d2@<8<*6U*C^jtua^ zcl=TbOAPpfqpIn+su?)_;{~$%+9sD8BI^4VZdfcFGm)=wi;m62fN^~g!NGA6Rtv$p zCv?v$_iu5gHdY-#4#7&S?opKl{O;?0P4}k_Ho=br!=>WKy#aDUzl1j}p8R$7JUNe$a-g*hriuc2;_teT?7ClRq-$BfbDZhXWueM$SMq4Srhj(Ib1G+~uvsr7c>%=F zluCxanTjEgEgCCZMd{NnE&8kBD9rS;9io@6+XIg0Mg$~cKV94Ey9TZjpQLMNPMSTj z&JrTjtI?ObR17HFnr2zkbW-qtRln{9y|-{f$sS$Zr!oZry->8 zEiAAIUYF|Pu-PWbMDfP7`{UjP6#{HwVppy?h*%2ZBmwD~vTsSZN2dg#9PRIm3V?F*0=8cb|ER%4n1vf6|y6<|82V>KSoxvWC zbG;QlXd3ba>yN+fMwpN1uHKm;BjQW?A%duUH!kSM<1rWiM0Zf9$pyx>Ln)>!8;zCM zI_FGn89u`M68|`|&st!*kG(3*Lh`@0tZgi&xL9EuPz7iTAZK!993@98H)GYr4{*OL zLo9Hs00hIoPX@5kckANO>$5BovrMszEfJCW28w{!kY@WDRE><#*28*}SO~5}p;}oA zdIoGc3k^BRQ=`~GpJe2qIO)TfNQPl7|&9M;WDzPH8)MHAR4fRo| zCBPgY>{0CKVkm7ax-^+(cqQ`w4yA08;dy8soJX%nkRto(1N_&*#k~E`$HL@flWbGj zNXw_A*=ijXVWpfEp_zR~DvK`n?{>h(^AbP|B1V2Fp=>oq?~ z_%tKsZkCK=onzK~NiuA=kf*~or+{8{ElD{@JbXX(6>0`#S(Bs|)h-Ole?13ImJk?hWv zDAur_qeDS9lMG9-$QGS~lPO3xMTpX^7X%1Gj97!e^xAToj30bu?X;d}y>NF8=rlTV zmdBh2+4x!gBl(h4m!XJ64EOBiB}%+*UBL9M>6qD=T~LS{Gz-Mm%$=T9P}W|v8H=X4 zfj5VgHZhfO>^}^9n1x%@#dZCnxO}t;8x^g4_hrJKp@u{H@#}qJ8oMv8aUGG*Zy9kqQl9z+2DD2Kxj$gy1G_~`Z_2NAAR3(I5w&E6(`y)fmhs9G= z_Xrf*q|!BPH7hOk0VxG~^!dVh)8JqVl0`R7yV|j_$5;nA)8=W`I@+|Zdfi1$N2Q;A zshGAX*RVH>jhC7>?Y6g>p9jp+mY9#zv*u8A+=l7lQ{O7TE5aXZ(KpNIaNdRN(U^Xg z%0CSj+s|5Q>TVjoVxvdqdz?*`h}u`HRP{~L(TmtoIXm2J-*XMVo}D@NPf??Z(a9`g z*vV;Y!)V33K!eKv$f{yAKkMb_|7vA<2+078vC*}JhQwb5aLHVTPMKaLu^2PR&{VRK z^XDE_#xkAkJxom$)QF&mU^e4^mRe%fSJ|%=6|`Ju+yXTR@dxRkm`ruzDW~am2J3`0 z5YcKw9*_{95fK~|(Erv)k^lXc6`)ZNM&&!O{Xm~}mGcff;&Z%@t$ zV!v1!)s!}sJJZB};^!I4BC6Q7)znTkmQ+2jTZHnfLhwH@^5oVZmWPXCK+j2-EFB#O<0gXEf4Q#D3fYLdN3g9+Q`&Ph~o>L->Y230~ z-wv%Ry*Vs_6pH)0*>idtS@WxAJ!OGzec?Fx0VM+8jvxWMX$bGCq619VXJ)X_y1PP! z1p9v@SN&A!J9?JhLuv3Y!i|F8h7*Y5@n5)8slY2KpybCu)E&UH^9lqPt_|T1vP?dVGmKU<-$QJxMJ<*3~E|%g%H6Y32gn%fw<}# z(DPg5K#p)jOr}*zR*ISNPOu=%^b=cti6z}w>ZAG~&D)D4nb9eUF=t)m2j6%!RU;EB zbJ84ztJK6dsflY%+v?zg4lVUO=4vxG8FqR7rx z4nPA(o9|-d{2PnqY%h7pb?7E-Odp!kh^1MNd}Ms^wl4QRgk|lk(v%DXT%engZ&NZ= zV|rR>>e^<$DOH6(gY-eSJiLDETRueVx$;&R<=oImp%Fe-nhy)SV(BPx~v!Uory&XZaDuhmPI|08YyLLde@RXM4;Voivk;v%-^HzXU z`>%dxWpBgP;IhwD+vAf21q6tOg<;WVapGg2VU-i*tWo&RZu7*g5!R)|k;mlNU_}Of zqJ0QY2NP>znl&sxflQQ&imu*hhVCk{W8wu_2s$*(jqzLTN zVPzg^Vy2;mITX!qC8oBxOF#M4B2o5T&qae@oDbhcf$f{a+<~^to=Vo4Kjk~jv&CCu z*i6+syHT(}lNh@Ky13ZM6%li+Fg+i%<^uL2UgY~q@swYd*K#T)gQ^2g8Lz*`jkCuU zm5@r^cS%?`kbP^%RU`M|!82($&=GAvRhk$UluXO$@nwd7w#PW4@Xm-!JcruXGh0$XCBl+Xrb6dJ~W6H0( z^~;UU5t=LOK{T|2?Lx;A3_F#<{V3C;XIB0We3o+ z^3w-nbyamKm+W^Y?Mf-tAZGQgMtVKYL!4w?t$mE@N3`2%>na||r)rBWU-nT)&+ ztSOazYv>@&tnz%jDic+zwxRfiM||0ikM1Z&;t2000#N?;*xpCe=b^^!4)+lL5pZ^t zmZyvl^Dq4{$ai=WY|dE4F5K%W=3&b>vh*J6+e#H4%=8#06K?4`EBpMUnvQ!d@ME7| z#%bU-XkkoytM0P~?OpPDzNQy=w$FU*51HPl349ZfMJ>JAbp9ypCigoJ1C`4QSNu+{Cs)~+X;sTwWCN>1eN z+oAGjeu(RhIAr7L=p=Gc7@(#jP5)g;HX81I&bR0`Oxaw`$1t z3itJTVh5~f)P?q&uRc%}Wo2@0Q4!riJZDkP>6b+8L=SYZ6n$)q zM{8-f!WiKcI43feKWn=*0u%ePfi=+gQs9$WGUt)HuSo3+prK6(NPm>^dkv712yc;P zCSBG9=2$D0V>3qdy5!?lgW2md$b%8Q8#^|;z|M_Zr%Dp|1^G1MjZsIEjMI0d_4Om* z7`tL8Tt`HM@JdYFk6E80WmlYEmW$Tzs)@)y`xbFFX-J+$@d5j^p{wAtmo=;5BL0(- zE+9wXy98v`eTN21w=!`4l(wJjyo=IWSQ8}HqqfURH%;HV#!f+L`S}AsNc*k|zRlLr za4PvO5b&g;uJK-qA}0*&zdgmis+nKd0VWt}x@RRfRl59LG{5K9&Gv}J1(sSBOg+ly zr7BmmzsC7U8W)Q!T~#)9rH7aBuP?_dRaAn70Zv~~&u(mU_=tA_Rvq?H z(Z}+ynq0d&h3B|u(;Qhuw^{8a3QB!a4!p(Bl+E47#9k;GYE}vwjtQWhQ{DYebw3D2 zE%+5U@_8as`J%>u$+UJwyVDJUX@>9mssG~;{V%+?1|*NH(r4?T3Ez`KQ`JG~#ak#l zz+2BHUL+H}#_6-t{p2f`@TbSd%^}7DE-_zaH^Kc`+AylUWA+C7h}>T-EK*lvVoxE# zaDF%)Ak8eLGCJ_ySYW3kAC@3}bQP)P7f$`mGvSbTU z(cGYq@y))D?Uw~#hPEnXya|EDtJU9|hTLl&LYr9*DTtJL?MFrKLn@inUE9+)K_c1Z zZQ9ae`EZpnt+7X{G!)J>w9fQOm2~Rlb-arSz+u(_mZ#~BDD^1shYy=*KgNnJIQ1d6 zi4PP-6^xe0Jm-83JwB+8a@!O%_6OrU%Bnp0q%udi(B^^ov8RSpuBzF1@=c3<90fmE zpCjD{cHJ6TdE&174!)6%!;|XgmwyZh)!;6+1=pp8S=j?4sInqe+^=-33>jwWIPEa_$7)cUcl-55oYRTklH8r>#kShaZGEvo!e1` z+XRgSgU!c7uYa0`8>~9MR!UgA_M1y%W%} zU_m)~<$GU9Cbj^Jft%pW!tc)rLdrHruL@O;H*rW`e?^HGebguvJ=7+oC4XO};+rgX zB4l}6?0hy(g*}-|{hhkwe9hc)G2ty9?F_7h9#;Co(-SSJvq**?!h4}aFXLbFFreGZ z3LHMX&pVq)VCtEIQJ)p#t?#zRX%QNb(xT|mndY>YD4hw&qhjtD$sPH7<@(;_*_PNm zxOH^`oPq=IvsP-l@@2%Whd(wW{+SJP79zvFY)u2@dHt=+^UFs~W=pSFWuD-j8ij6# zuZzt~X$!LI?`hx+PZ_B%!gG6f)myJx?>r$=mA~`DCR+}o6^Mb4Wb5o`K8sJ8c=_T| zwc=E$KA6b2WP&iWzqY3@Lzr2R4{o$N^JXnGd6N}<``Bp6NaLnRG`6o1d&gizVGRG} z!$*lrFDC6u%mMf>5Gk1@{)s8ytQd#XoGywavZ>A-3=VtVU&$1wir zu_B|M&Io`bJ%_m}o;1^h+z;%Q@k$V?mbr$1Y4XIPIGRpT3!EK+Z-wt!jNDQ4#lDNT zT11%bf}a$cHEFXjSC7Vd)awW?4{Y2H-u6Qs)9~2Gieq)0y)YuP`QA(XEqB*1N=J%J zbQwOq@e_Cd5P|8LykpC3}*VdOZjYV7Wa{~!PGTjE>@>P;?Z**j|{oU;=LI5{@` zXmUB$(n+8*^tWl;?CFIRdhf=xYM7kj1Q?E&h^-rM-CVyQk7`4&3?z>Xyf)Me_@Z{2 zY_^d5DuR_V2}B>5B-L~0JD%w_1@=UN`pJ7HKOP_cU$^>Z1zHttD)JMieKdC(n8FH- z!@urO@PGs%yNmg)BLo0DU#adTpD(4*+x_FdzM8HzLW&jtf?d%(KlEu63o?~=X@vFB<&c|;U$0s^oA>#$huG801Yjug8V9ctfwtQX@$_8ymRJpP? zeyHFf@n2EXKXW$z1$m!muW;{Ob@`<*fKv9D&gqdI{!1K zIpLS9s_A(|;!5_Op)T^(wNB476|a|G(|iGi&RlPC)us28Pi_kY)@&Dm>8K-y-d!@trlAG;hjneG^!FbWnjq zt@+U(U8!*MgvH8l-B)%Lx{_Q`{fUD$r80cLkU64J zbeuCDW-`6?+TK@+$D`+hrCxMf;`Z0E{AuEu$PmBa*FZb`&;BF%{DM#Fltnb#X??g< zY_C&9H$m}R_JdCsj#TDEp)(igP59(`-9@~|X0O$3==arsro)7P(_zew>cW3(+Qiub z`&ZMACR__mi;aE$PO&MK#-RxNI_KOTJ7_bAn*Zfl(?;F zz12Td4T=4+X2Lz+t1An-n5x+=pj1`nlv%J?<%A;o4G4TW|~0(8tW>La3Rxphu<1L4M`ahb>H_?*c%#hq}cIrFJrX$iF5sJ z-YxCw9T{W4wa5M~u})!%Uz% z^5sejTQ){kT(@T}!U`PlN-`r`8Cjz70E;3fx^n+KdI|m3Gvw*m%KkODp-%%M=-5!& za>Z$t=wML4J%&3@=XKk(*jfb=Exdbnc(~x};B`8)V93Pekr?B<-@4+naBk^! z^2^u|v+nWqsx}rh=`#jW^t#1%M@fN{s~{HFq=3oVHH5mK4ImH5ziSP7hn~OZOHH!Q ze>TReT9ZeaC-@{0cO)A4fHirhXgT3qlMEIQkBemk4i9UtdrqmNYy!5CDR~8}kJRXJ zNK-@S{1<4amcq|ZoR`jRM-JRHVu~}HG5y5^$&)ItkB6mKR7@^Mlus|)#68u{x9bB6 z#A`y!7ugt@jE+q6c4HJxH25N7W$2`_z}|uNIVIQ;8mXgGEN=)%(dI3HC1Rk*7xUXj zYOcO6bU_P|;r#s>YQwf$ob)p}A1o_$&7~$mm)T-h14sGmGPx%kSE*!om2RRp6Qw3C zqBjtQ-PC+Ct8ZPEA*D|Lf~gh3uaBPp*PnuC07UJj4WRcVh%dQ}t8xGj1}-<4lh=^@ z7AqTV`{|KLzk0#$UR=LadX7vipJxy*1?e)db^mT$*L%(ZJXOHnZxHu zfB+I~$qF;gf0aa-?rCc+jmDJ6Ch|doTAp=jr^X37T>jzKHM83v`J zF!-;OVR`VUq5k88aaS2{$6CgvRPm#MSR;>Oacim3T87e4)k)&-BL50`KREo~JSDGO zRM8kt(!%+bP(sYj@e2^Vivkaz0Szp(} zFu-7j8KoI44_G7~Djix>Oh>O)YeWA+)?pd}$_Pr(2+AN+C1@`-Wz|czD_Z}EWM9%U z9oYz{>Oemr;~#AJthQr5!`P$kv))rz#l-Gjt8+$` z$Q9FB#E)Np254+9`>?+27Fj7V@i7#Bv2%DREPa98iNCjLAC+J+FrOq+!kV~&PhMtM zH3I2^&fobyqwZGG2OaLWE?@k($quYmujM9YJdj4p_)OG5=$m2_Xy96I92LBCgKFyc5D_Fj+Ck!cAJSjSfRXwS4cxPA@upcWoUiTu>v}XfpT68i)7Kfn& zdb|VlrweYeCdlvHc1}E?lw?n{Rb_kyk@%4)MdCSQw3EiJtMF#K;xTl*b}O7BDwxGm z;8%n7jF#=j&B5pHBy&O|t^Vetyu-EWwR;O@2+Y4TIywk9G1M}@qWYknz-K;o-F)?p zHF!-qf9uuvBdivhq2dT#H7eO{P<3hUC6O;vr>lvx{@g~3XbnL~BNl7CW18_fvqrRT z2*r#{29E3jsP@=$yAO!;Nq7193-)VTX6Vc67fb>|>bOqKcT|eEtqvlgnA=1ApZVoJ zwZKa)VcB+dvA@;iA8dnLN_XcI#C|x{i`F^gv}Q)y@3e;|EL_gr$PP`04tTr$fUNms zu9g}I4tz9NH-R^Ur3WeD&`0lwCkxXcY=Ics4bC0cM3eh;oI>%l*B-(SSML*JT%$nL zE7={a2f%EpT>=gHXBcr5S;13Uc2v%8MfLr`9npseVK6(Ap{-U|hzPzIM9W7Z_<2IH z8K=Zcxb-3>nSI|zn6|GYT!6K7VZVj1CtS9S_1^VjlFPU(mvaq|L*TH$9c^!xppc6Hym9i*&ka2 zUL}qbx7C>IT1Sebj8NSEm4uJf21vWM?KIUZ1JGBzK}zjzm$M_~MVSZXTO`MJruO)L zZ2xky@))sczkHcy^j|$6x&_eZ&$sXF&uMFy8Lr%SY%`zPRt0|ErfRW2kC<{jcNt)> z@a^n5q$)ozUuoUDE_PX2Np1+QbypsVLol= z)jG);^fe6~9XEKVRFUpP(OniJyn_M~^95R~FYiN>H2WN+PnH&7Ua9hNB}|S3UzLS- z7hN`Ag*KF9JmqYAS3ArXqV5gz2}+*N6O!AG`9S&ZEmGtI0E1g9Ne(bhRq_S-Z_jO4 zuq!~R8*N^Ek1)dQ?yR$5a+6|5xMgmgjMecNGn>9(TFns83)Cx(3UeM#lfb5Ru_Cvj z&F>r8fg_Q@u4htE`^{zQ!G;)z))m^h#j0+E)Ut2mDJi*0O+m}g#B$dBbacU#a@c48 z3xn$%->snX?;i~cOaP&Su*JNJtk5Z#6d;e$Q5s4^!vbaM7kYx zqQVSN^b2lKrtL!}H7vnH0@(D%PDm%=*zrgVp?b--UgViJIw-PAjRYGwDEeTLcx@jP z2-aDf`=GmOZKU~xEH<(o^}J9G3&ly%$y$o{z9V%wC|spD-FMn9ZL(M+$xR7batWhe zlTST=Q)yb=1^r^VXUq_vw!VJrd?GDH(-q)gQFa#Ux9M`%XB|9Bb35j>%l+bjLBftMmewRRl)cwkBkT?NML&x%2GDu*Fk1bXwtwr}I6-QS_g?G*!p+)C zdh4=tz;F5r@Kbz$-ZN3D-ibxUw`XLx7I|80M!%RP@i3M}wJ7us{4I6@-f z5LC*(al&&hYW3UUONPh{feUtyh7NOs?4&6~$6N&lVb*(+98_?_*t4*%@Fyb?n%MnG z3>78)axr2Fr6;)}4!OCG^|BUiCU2?~Lo4yE-W&{)I4!y=<^g)omRh5aGgL06W>{-R z1cJPeHG+#-i!0&f+Y%fP?B9)#C%LEmvs5e^xLNeO zi4w6hWy)=e^NU3iI*)ui;f7N(0Q_opBvb3-!MnC9Dw!gK)vae%ZQXJ4r^tJ!euUU@ zQY9jfwBhdyv?SF~>=!#v^`?@?ea<&URXt!vs14e;U)A^8?G_8{f})iQE2=-g%$}D& zH@u$*e`pgGN=iDzzl=ic*o?d3f}hP!IBRRp%>`ZyY$bq_uuePeli;mJP)JhP3>N6<;op%KhBCQTk-~ zH+!CLEEHgb%n4gaEGFRSrasN0lzvRjN^k4(;)Ta-uTEL|)kp5rQjk^p`I{=YjjF@I z)2pbFgW(H^$%XAym6wLs4@G}OER#1zh{a4lydN8;x>!2TDIH5dYBoJyYXg*0rVMeix3(@KG%_QZ6$Pz?1J9{YaZB~AljaNm8TlUQ^B)^y15iG6Fqt61C&!3;RYmW zqZV1u2Z56jhQkw)C&v!zB0_3yQq?c0ZVZ1?;TJf)FUsUJN{h?f&NukLYR&|$J8>{& zhuNmt;?27ESo+m#*&hmCX54v6*4N2}F6_5g8U4{>j6GwEze!6+#SR{OcvUUgeDa{{ zV`|ZQD5Hl}PeK_V4#3*|hX}y51{)TC;w|*J49SPhZ-zv-A~ylKkjjTu&%ZUf#qaJu zXP%OsV$EySsXWrbSGWD=XL^zfa=CUh&;R`IDW@zvnPl`C`(OGqRw|BVlPW6@MDZ=U zqiH-vj4NG^GooFc7ucK+J5)Hi{Z^ckD-Y&=xnYW9LjBb_Rqv`&{X%{JY;UX9M|rf# zFpa0!YGq|v`$GWvx-LQ)SWbpkuMbyWq0TM0)}?*HGl}(i)3;T#TmuI+>&{>DDnABT zLaI(tAI_8X>;1=rv04g(f5gMAYdc?^7+`Om ze<}Pk*8RqeLr<_;>(4BJW{=&Fws*kWGhwU*EI>t*Xu6qnCPm98I`74GT7-Qg(3O)PXj-dSkbenpQ^bN9p=^J)=0H+$yUI!^D>L&YAFkC&Qz+~_@=y{}(>d>bn!ygW^IZHXb(^*ke9 z(Q5m(&{H&KXDQZTJ~MuJB9y5WhGmTV_R1Mp1=q4JJRQ-}H+^LysVJQdO-a??ObujK zD*~v5l`D`qOp^^_>DS3g-agav8@~yI^V-B!+K~&tNug0E!MjuJ*`X6`A*t)j^K%1^etZOxX^8iHquQ?^S~74gWE4)1#X|Gd~0;yjmCfmfhZ7|z#iM| zaAlQy9`Il1_@98}6B!Iw^S_rm7c^ny<9np%LLK163 z&olI4O1H#@?D)5Deh5^c-FTAD)ouWLXo;xrc;L5h;fK5RZH>McX(pLsLMCk$5*#)G zfkCk6S@c;|oUlnX%GKyBE~4siQV8*T+SDzW27tpRG!Qw-D|Hvw-2kXe??580NCoFG zO%k(dUN-k854!RT%_4^>ETELnNAB;`7)#aMd4)&n(eolupPu^)Y)Az#x+-5xbj5#p z?7ri)#Y;R^(x%`Ol(${2gjH2kMC4V>%M#_L=)OOtRs|~SzsqR^s7ExF6^(zppa*|i z37s9E6u3KOOPo>c8tE`}wlqA>jI0sxFmmp(@?BC&;J=aw(T(6N!-U`*i2KtY>VcfY zuWvt&+7(!FjS4!UcxEG{=@aZgL(Wv(R+PNGA?j*0;!eW*T;-pSeYFgJUG(1y4m^`U z{Q5cl{`36{eA~%qcN;F2p{8r~{(HyR{IKkVE5$&I-lSw5fgg%_bAqK=!+g1kWA#NXuNOFHuNYCK>T7fkV-&tBE zT=zJ>6+RoSPWmpkD0QOwJqguAkZgvwZWgiWtq0f%nCKtd2V{>PBp$11a{GtL6`82Z zP8^L$bz+jghDvtI;LP}1@Gp!gMR*0AO*|f%((3l^x)$TgT+zya>K|+Q_uWPI5`Hq6 zS%M1gkH8u>o&gNO<>Gemx`*HOH}g4h34A+Aci@HaSJ2}SlTmE~NlyWPb)IMOg}n`h zIJfJSBju0tW`@<5vk6cJ$yQr{P+)yX$D}p?h^HdL&bq^p=zgTbx8JMlw^xg!YgCIW0BP?;d`=X}VGyM5Oft@q+Xbs@#k5*8 z%bS(p8kP+)ujK)9rTPVx3rZ!+O?d!h@LMcQcPQjIoM>3LNe4D(#0#$6+IBq^O~|UI z!+#t@lSQWk>St)GV`{)}M!3~#bWi4+DY>Uj5xcpf&aFvVb_U|YW5=|Mq$$0Aeax&M zJe9VOXg^O{ZOhFV%Erj=fTQP_mXfW_Wgqk1O%|c>v-t+bnK#!xHh`I)zcG6DVk0D@ z?xNf^0b3hdc0kY=y-YD)V%+Gw4AAwqM75A-c|B=Df7Ybgyud0Rw z5r*d+(>BlV=>T--6XbNWbBsm);dQ0NO(Q{#@nkL$eV|CY9?LAJx#GL8 z@qA0-%E=OXAi3e#mUp}i8FeHRqN(q;Y%83W!8p<2ptJ)0{8!p9cfltIWc=X+If4YyB`aYPRBCc`iThwx}`%(h0H7&VcZLiHaiQ|P^kb5t6 zh|o{yZRPi;FWpoZ$bM*l?SH+IM%u?$HHNaE8SWI@5l*aAck&Dc)N>aoNtM4TzwYJk zaP`kdz_?iJ@qNe2Y$NKd@o{&P)NH0?g!*s2@O&BE_}|aM|FP&8jq!t>U-Jb?f`4Px ze?1LEqQ=*5Rx*1#7p{^Rpv^0G*D&bTGpngy(>lh`twVjW%e0L508bPdEXV~{4q z==CYtcM$=xhgk}woF5W>Y}xnqZTUH1DFs@j40HSZv3hV)-5wuJ%p9l`!RXwW=MPLc zTjU>Y3h^731l#3@vuH~&PP^8Rs3nx8*6X_y+}1l#6I@U8N${7+gCr*&P64z9`E9Vr z<}Vzs1#I4~lFgjBa`=TpgvlO)`S>KWgI{6%MuIpXHil+uB%};6$J^3Qe0I`T!P) zk4Nr|=Bl9EWx+Oqx?R$gn`))Gfoxf)1^)TYt@U;~6h{ezT*BVyyy{%oBNcF`vOzAv4GI`yf(R9=Q)?@;S za^e(|ZtG75xnUvIP2ree600b3vgg!Kjg}>iwh1wbjM@*;WLYeW*07>3_%}5M6$nS= zVLJ(DiU$$9YQp5{!OfB~Gr$Opz{NJ(4 z1?edaV6Ooj;-^eZ+x4gQT4L(YN!~sub&9u5t+QS%FlpC77cz$pKYUwzL4_OQKhX6Np|T$@1j@zrAYEWj@}r&V^P9s@6RWh!xwUv z8T_AO$#X;2fW}EqRtY#nL~}gBh#Xc9RM0BF0#qs5RWuiQV*=E@cJWM@taSpJ61m%s zmJa*dd^IqEP2DQ?&25HQKMxle$h_ZQ>jYE*1&%3+sgDA30qiS0KBJ(zsoo@X4g*tm z!U2ioR(uW3XO-yipO95b+fDK;=$Dt}Gpy|jXl!qh)=CtcA6Nz_qM~#omc8akIM~)y zz~^un6Q@#`b&$wna1N$+fU1?{$R)|&TXY1=hL;={j5?08=0i$C<2uKfOEv|LVn)YX zzcooXDOQYMv%P(Eai1!yC%=#ut{>NlRu;V)^sF^ES;jaeyFF|j)Wv(bf0n_T(D)^F z*i{iU=m+`~xBGZ1R06EKQif6!#!*K$=Msa|L&+B-?nhZ%5TA7BD9>6ANpFpX#FJw} zDf#~*!2WnAymDdRTLsDuqpSb;=%W{SsZ!>nx0v$BL_T`~wV!G!^j+U>V;A+bzjvFG zv+eToUUD#j_|g2{V=+vE39bL;hQ-iQ=ZfE+e>2Q{;M&mVyVlB%lW=j%rB*qoVlwB# zn)vkt9LMwPMvECG2_9!RF|cBL?|mM7*ns&F;8XZ#NRjq)1%z$PJidXj_Dv1K6l@Su zyp$OY?UFFUTzLtC zH2VjH;x+*u!pOM}D9-}7&)8m4+tpTm!mXWdg~pXUs$P@U^O)Z9oACfvcI~pJP@k5y zzB%U~ZL_XjFIb_o4v>>CtDZBuxBuy7^2>tPNmGh%`qH^2asBZ-en|%I#PhA3>_89x zWU0LhQK1t1o-0&qex1n7%L9p zk;U0r4eSt_glQtL(RB06W&3N!CKnstnflVb@9%gY02OT$HpJ!)ZqJWE)6YjFH2NR^ z3O}uxYPNTpgXWHEYkK{YxU`S%H$gsN*g1kZ!Cgj(2ky1w?aS7fQDve3yPVpAYkj*hu=fLV|KeHNk8b#&E8F`VE=EUZEb2@M#ex*0S8sjw^zj~Z>Voxvf6!ZIM>Bt&>G}*P5+m#D#_!*geTJNvLp>qjHU@*V-gw7&g1y6L1bEa99 za~Qk8f%{Dz;{zYlxJ>|4_x#pAyL{_h;QT#ueMnD9iQgLVYFF%G%@^}lc2Ga>hZ4#A zjniEt>DXScv*ssST`&FWc@HLNaLt7{*Z6DA@p%DnKYaF=iuE7W)2tIIdE-JPKRD`l z(>p5-kvU8|;9^U({o}N+WCLkt>XX|724?UUJ*C>dW*)p7z(1P{$g|4ysY0U!Ruap- z<}$KT7&Eu={K35d^|IF0BEQ`QLu&e^BO?WitMC~A3PZ2+hpyOdrP}P6z;5Y%I*och z5q;zRC7mS4dIO~E522plT>4=!JJ$to?b_M~@!QKP<9`y9n)a(^SeMwjDl zT_%s6M{=0o$&R_d115rV$f4MSIs+%9q9d14)3!uTow)Cn+S`J)1PtkqW{lx#Lm%oS zd*mY$W(;~oZw>>J01penbID3-GO|LZ?j7 zYy4){V8Qe5U3UYEo#7{BjeC~#Vt-Sr{PDn?DF4O-MmS3`uZiv=bhgGqH4hulHN`5rE%>Z|O{@Tg=zneaTYKg;zT_^^(sVhNHo#^e=#(lZw1A9^T5Stmn@R6n_@A-> zfMQ)+()@9f{%=6%nMM*%6Vm^<5!5$H4fu(zCc7Y|nv-%4DeBY11_FA|&bDn4Bo_p?@ z=bUu-R(4Ly`o@lHv~=XnEXA(%ChAvZ*trYnv!GR$!`zYr)cZyr&S%QX=Lj1uJnu^y zteM6&aG712YiW7^iM6|s5JP__z3bypocnH`u5&wMWKkdxom+Ktf$T-i&0f=HYI zMEQz4|4+~(HH6xdnesZ#j+El9sJBQ|; zCT~@uVZ{ZS^9{TqDQxi~;f?h6Dw!IwRkX1iGC2M5J!g({SL-WD9-q+jy*vKQ;My<4 ze%t7kLnXeqf0>#bZ*}f%glZtck1V{6Oq|4-niVa}#V(Hut*0a=tqR)UAIz^(4qgOV z55bChJlBxY(1!!t4Bg7v#hs(h)-w$%ed#VNdzE{84*ew#1KU^Y-cPp<_rQ6ESXQ=c z5)*;d6DGu5@^}>>X7w!74IR}7Nn5!i;`DgNISjtB??HUDYX2A){F#u_^X^8e0Use# zCx~z;^3Hr8=#x1JSl()Bs!sb3_{htwEUhA*u*Is8K-fU%IGyU5&&;c;AQO{m$j~KI z1daP{gR++B&Ta;Gp1Pg~GlTp<)2`#1Xz6|7cEPo~HGgOT7mtSrXH~HHw zR5+cMT3=tc+CGt#WtyX?g}TkrbQyH>g!2X`{Jr}}_zvfQ-ZVpXN2Ad^b(eh&#VAyr zG84WGkGXLEJTFgH!mMo$IGSHjCeegQmcXW%@TIkNzzC&qOV5f2b;vWl3+0^PDozK7 zPLjV??D^GK+eiidG#Vf($U)Q|WyJ&vKSRc=pXJHZr&JMRecfp!?z=WdP;{+*M;25y zzrc~WI`v@lhcuKxo}kja8S5rRe{S);9O-oAaSS71F)D?gD3 zj%GTLzQ}o{i@NiSk}wY}$~jEWfLr9yN;ra?%6$br6mj$Q%VL_rUmJS_tKEn_}uy^z!1a7r_k%%Su^LnGK3z}#sSkI}i9_BVr+n*rCw%A>S6o|_I z(UB^-qR21*aL4Kt2p4$K#HfLhM!SFi0%j7uKX3wFIAz!IhL~J^bl%E{}FU?_~Jj zJwHLjOXcn5oqC!#0#yFh!OaR z8R=}5DRj9gCqUTj%gP3BYdTh0+HqmH-gR?{e*M7AUo@@O4R+NlYZr5OL~5lgO zV?{F(W{J85a`*GBLXTEfzb6@-xelhhdgK+q)|}@H!Gx`kp7;-60z$2bSF8;~VN=>! z{#D_8oJjsG3E+>K_&{1Ts;wd&Zg$dht}f9qNE1~fA@HP8jZRemwI@0{Rzjr&dzk2) z&*e53UfNc!4Yk4^##Q#0vi3)kWAj{!9lW~Xr*nTuabar+&EQ4F5D&!Td62F~sIB8YSa#brhW+!oLslt!! za=Fs#dFzSi-?C2;e*jLlk{)HTj(((EEH8!#K zZ~J<$w{pB(?CSABdv?N?t#@m+l6VOZ_`JyJg%C;}E->gWB;d1S9N49~1T)XZSZ}0A zAJVv@3m?(vF1s;Use6WQ8P|ZBFH=+&kaEuw*WXJBwQA}#2+*oTH)NpuBK6E(F8N+3 z*@v2I+QmY5X0$0#15V0^qv`ih>YhZZc-;8YZ)9yjE|tcYgw#{8d^LhVYCTD8ra5={ zFu9|&RQOQAN6YF^~L~acu1rJMHlhA?{0Rg$;tV}K!(iuUyN1Lm`6)9 zt?CleaD%Npw`&=#5cwu|vWv=!%wGSqymXSUE)|j`JYYB`US2fJ zxrWn^%3NE>^0KmZ%LeQ0jHo=WQC*!Ek9W$6#l#(Yz>2JUSfe)Dhg~pm2d>-bQ+rZx zB7~||4$h#zn+JKP^CPX4g*JoN#0s@qQg5DcnLU`=47Hvcl}dcu=RvWD9wxQwr?dTk z3?f)_lDZLc=GY1FTPidytzBf{XqJ(i+u0Bx(&SpwDg8>klxlEKCK_?Lvu~S~naLZ4 z8Con@+Vkfs7#bRKUcx;{DV>83h^>%ry<8b>Yv1j=)Sptmhf{g@`7ASKgzG_b8ozUg zMAt-m`YqfB>cGIZBlcVnmDfM)^LU;1*g@~A4&PJG9_<}~U*6S=1*3(gu~1Q1pHqe? zzkOZqCsvTx%WJuPYT8399ipx8={UB8CwFMk>lxYmqbUoQisvJciZyz(?J-NJ4$+<| zbA=`kkk-&ar0L!ugsxbA$ts!qaKBM3&S+!Qotxnr=zl2*V9+)fUufrb^!YL`< zIt+G4Z{=lS&_f8hMn=o^0~T?n7-B1=Cmn9Y)}wC@?7pQcT|Y8_fYs z`GdRtcKA+1!e!`~1a3Q2$q338=lsRGWP0X~A|YsALBBc>iL~|Dcj)P^NPE%YPBAEg zRa9g-oK6)M;x6B|5A9@AnwSiVHWpgW9jW4w@mad|WQx0D50j}k1lz~ew`YM18V+VX z4-MlyFq*>BgvT!O&t9!65>|eR*-k0A^5&0C6u*0JyY3+hxw36)Wip@($!C6peFu>7 zCPL6jrxAn)W>Wd`XV+Rq_|T-1aNpdZ0E;N_;JJ2@6~oYKwi7#b&5eT|xTSqX&HEA8 z2p{d8dWDMHx9nNRrU8?m@0kd=bxS!M-zgmj&_BCYJwU{C;6X-w=8ve;dM~c48>2hX zI;^&PkV3-3QV(g7YlN$86rS{AWy$U6tQa=J&Ph9hA@zMJ(_gAMGd0Wl4>ltmtk*uW zFt<|qDi#{x$gHOx?pd4Mj~yXwX=zzP9illFN6OTf=4SmP2M_nwa$pu)3(g;i{?1?G z@ysXcP(Hlx{-8jGH@q5Sox7iRxUj+Q8w_hK_7}-3obwV-p}L3%l`CTWQM!xV_r5rc zKEy0TR~n7dWFML&lUB_RCQ^uz`1&l1)Tw}RmDEg3AT&_e9KJYFY~)K$)#U3@WkxaP zxH!=GU#N2v@Zy`)Zhs(s;f)h6*&}YP^m%OzBW1|qyfgK@R7A$NypneSHInFHSRWovW;2FgY29nb8%Nfc4;4;#ixJC6uRAM0iAm^hMXt zW89uX9qH*A|K+|X07#w|{atJVE@XBAB!F`D&C)5lRhZ@eSV_bs{{l`ll90&wq*srU zNb}DaZD|S57}nmfg;}WP>#Xc6Gv>3!x(R+ky$l_NOsqAIZ84Zr?cDO>gbxq5i!Rct z4OX-7wZTVWq}-)H3f)9c{L5*BuRd8tF+3v{{R3T?I;jb#iXio>%7)6d7_F|E~zKhE>ivNvrX0@=Ytu{Rx0)gU*hYDdwctb zR0qI}6@8_SXbTwz4_SYt#2ZR88xYHK^MP&Ee$m$Q2s=NY(`XrHz@c3LeTqW~dyPEW z%pHgEoAnbPDZ#I5Z)dmRP>&cm&9v^wG(Ddhl8W`S~fqE@bU363%*?W4(k|| z%B+qQVH4MvBK|-x($c^vT>2D4XH(i2>pD{+-6;DTtBx|U4Yhs*vp|keh0l>aSpcez zTI8Tq2JL*&R;UDM@<%sGCU)Y@g}xqyg`Lm-H|tHnQH^KGgS~cT@2jZdV56 z>n+LqRqYOC{?~Pusmz3N!O;EG#y{?yQ+BK$xsrc@UCoCE2{SkHWfc5QLPDa|35t3x zzDVgj-8YcgA1Q2m(WV6b80y|1O-4cGTYZ|UX+tDgNoa?VE`K)ulODsgrw|qdHC-_OuWEz+0K{fl578zKLvSHjI5+lYC7{YJFW=a!a7xE{Usyodgx9~$5NdtvdcCu>pB z_QEX9-v7Xp|qg_vP`K`D-^(TQ9k+QjNcEeD>;mwT51({OR zb2N=ScaUOM(=Dp_JF~jsl~^N*Yx`W4E2?cn(J4Pi4x>;F*4QzA`Pr!bpz!b z%9akdqoic1V%$K=jR4TMYwjZPzrYR*1O)%ipBQG2_?}ZYvuE@AkGX-Z6 zM!2oL)rCy+sp;y{m)?6Z5QC0CNwM9JtCWvyhs@-(=K}f4cTWqm^RYGiJ-8Op;^)D~ z==B{+o^QlT-}TL_Y^4Mh>%2byUw8na)}P@N%3-f~eY_oy$3D--!Ua%K^yrJFSbe1H zVwPbP5n+Bnbt#~|4R3JqqaCt3ks_`^_ZL=kJ64>wwq&BMEll?|RTg{GjGEL`RZTqi zaXT2zeUI-b)d&a5ZC22^hJd_~Yd(B}j%igYw>QEEF4JE-akTXR5EO(A;2gN@n<9T& z6OXSnir4zhWaQ-X=pE}4@LUcdJC<&l4KLXkCDZK@t&*YlcxRn2w?ej%9S?l+N;l1O5LL=Wl?><(Del$8sZ>zhw{NfVOni3+wxo{uzjxuv3_G8A{_j9G3=}BeYAcKJV|?9^TIC z6#w6>2=MGBKqHNI9|&W>Ya~B^>!rr>qNfe6ZF2JI_?(=tww;|_#?XUFN;57HqsOM* z>etMyEHcG86JI=^wnoBsz>1GkYM1+;&4d>Hr@2S6%^BPatyb=;u!zZHX)?NMO`W`{MCxfc_TszlP#^i>KWh?Dj+T?3J03+O;O6$d^Q zJN-*$9X2PO@~m-Ke|(j}3hEHXmW!-S_2kJ%ADZ3mp`N{&#~-_WA_NUb_5($Koks2Y z1@0SCMU@Ly@&3Rs8F?)$k6M@;JLDX-E} zLCd+V=oNW?2BEY(Urnux@2M!wK%h8o@UU4`Z+`wWp{=ROEGZmD@dQz+*#U9)%QBrwZX_Vy%g~j*;a+7OAQQMPJ+(Nd6Y``C^L2 zgyq&1mu+TNrCk+gmzfO6MwZh*adMu9W=OMYw`6O%?`}l2(28!^Qi~-%`2Q%Z@E?u2 zfb!-?1w`YRK6bx;g}GX>g(*wqtgo+!)Qz7r!egml^$2#@wqVqm9b!JQorhNe?u=Za zBK}bY5F6NhN_5@Aq07oi%#VV*`0Mcdhy#gr3Dqvz1Mo~G(XGsp!|FnnkN>Lqnw|g~ za>;f4Hr?@tka{&Tcy{9xx>>tK5(fU5UZ??I+K_qy6vP@>4t{NH(KT|*&$RUTYHpxv zJ1soyyv&zK9Y}avT-9xWo9G)6Z7v{cJvJ8gG$bS>I3W80@IgR*z!$N9VMVYD-Z59A z433$eEFCCAEeEE(vfaH1FD&c@=rF7GQY|GB?*%W_3^ioQtnL-;5GOY`TyKAmEx@}V z#bOb;u+#NCdWiWPIjqJtFS{FSwh#Ora;T`8x)-GuI7zw94?@}wpdNp6QxMi&Y>kSW z#O|=gxn2IZeB$*3XjepQ4v<dI}P%?+UB_tQt_YPQfA5t~|{skt| zp&h=p$o|ZC``9Wd9tuN#H==m|%ZQ#hw+67A z`SYdr_>nV1tNR$g`G^lwv$IG!wkwuM42qQ>*Lf`n`C(S?XHQQ9#1_YkfFWEnG?t_o zQQRdtsU1MY%Tc(F&-`eb>p+H$n@@D z^72R-B1lQ-W{UQ;?i58jA#~U|>mEhd#u@I4iOaZ8$*$KZuF}cGf6KkSbcjsriNqC& z&2pbta9rGw^Y^v##ek1agnqNuGNwA?ryuv^M(u%Vp3ghBe-~#%Kt5M2lYcF7}_OC2HYF0@14$*tY} z&(F%+f>=CIhk$;EFH8~>oQ55P+T5m#{v$f(<$&lA$stucW;lh{Um(?mt5`oU8c`Dy z;lTj_>{f=&*bMH#8X!T28C?zy?X z0^j|;)YNE9+2gmQ+?B%snSXezneA_1{L1XbeaOv47EpWr$QuZ}Hkor*-vB47XU2xi!Lnu^Rxd-&L7A+`N6PZ+;a3g1|jK z#Os`U4l1mvca9JUj2m7V*(IY996Q|^Yjf8q;5H+r&sA(sQ;gP1Gv4DFa;t5FBcLm7 zK>(%=YJhwhct#U77+)yye>9oO|no9 zT!jl7yZPJ%PbPDmxje(FEZqMf?CdmmO4j6Qto2OyG6GOlh|4E5cJyzt}11U}*wSmSZfb|D8NTF8hAn~?tD_??*M5PBG@ zJuv2_@lp-n0MON?^`Ha<#N0eWJl_krSZT|FX^6H(#yFwqfbV}h!9STHehUCc*a2TP z=qMb5VT6TBbG_yiGPsu3R_op-DtsaMSz!!#>S)oTZ7Cll!MzLu8M?`4yky^zca7|7 ztuNZB7Ndya%FfK(Om@w=jXtUHsv67kqQGT;R*{D1mu1GMl`;Np6! zFvuo}g~47$D+jK19dgIlA0G zE3*9@pQV1hO**oVX_i<;RUKJDA$;+^?1RhhV@<#I;00=589jm>4bmM11Pa(nXN93) z^i}#HIGi!g^`qnR@XeQtKyz&HhdQ`5g{wP~hP5+E2Ag|m8_hqRFbyQBp`8Psx8U@D zw+r>kn_tVUI34-dPPM=<*ry4L1C#i&1{M=F5P^~l35khWe;+MLvR3H zv~Z(V`#vMB&WF_JQsQ+2QPtjSMn4OT>E&`9IF#tu6w4pP$*UhIe37n8=9iBA<142Z ztzMLQocn=Gp)FnrZ(G2g4LAeb{7K?r2h>RnP{4MrkDOjMT({_Wi=P-6f@?EGlh}56 zG%~nu=jqG|x?8aVc}Xe8eqyTlmN)pyZsV!QPZ3`KM#M!*VBzVP3rUVl>W-?ezq8_1wG~+;G}dkDX@8n>qry@$I5t>4`mhlc$u93FsLBe(^KpQb(0Q85PIU~G8nb7-7Nax!G|Yi*X(3RrCs+%-h% zapVgm>ZTeYVtOR&x5N$;TQk#3OU*CG)BKG9gG>Md(0ThQ9N)db z&y>`&UYzz~ka<%1sVH-B9%1%p`=l)0GX5dYDJox$4h9iJLG^1ff{?<{K(PiuhO!zd z-GZRE1hfuPWWd8w#QE>neZrn{db!1mC6`@)d z*c#v8A1d7m;xEvJFyOI0*pCqC0y{>p?fG|Ya>56P8$O8MPH_;)uf-tiE3{Ct`+*{> zW3?rL-Uo-`pd{(QTp&uQEnTMa*p_x^!T8$eIMw|8*jWxF!RSctqT{;$19QB{(;@}a zTOTfo+`2G*4s=N_J~6Q-yL`9QtPE2svLALXiz)7q?2*LH7dfb;K;hm}rxhA<04h$x z05X-<<0d%Av9X#~sv+N%_MXPI5bO87HD-RNY+5l+-?y~bt=!h~l z5rMd?_TF=9t|zPapTJST6B83Z$f!4an=4vE2Z=o%aeMJ{?ZChIIu;l{N z7l>5@93f54y)w2qR~jzLZ3#j=b%LR?Ju@fK2nPjR%ejALVHf-eBDbCeFfR4a?=DH` zFBHlo#=KqL7qGwbV5IZ+vj7eaex_q-ppW(s3Xz=Kk_ zVuZA4Tm0+6gMe#F z@3COd^ZpeE8z!T6>+GmQu;aquo$x8Z9c0FUh0euirZPAZ7Kavkne&Nty^XMN80Xi> zXawL7?BzU9*3h?LDLmx{+DyXgFBbF%Z<4!dGG$$UE?80E4KF-f_UBokD|)} z6wg?Hek{VC6kz+6KbQVNe0wB&<;22G1H?qwh>;AVS+q^JQ23O?Num#e`rg*F&>|XI zS_Cgjzy-0+UGYsI{+=e&Djx{wr@q7249#|4dLAMhojiQ=-sG3?^3zQ#!0kFrh2#}k|xZm~m z_F8Ee*h`Gj5xq1+jRHAH))G~zdoRNTVOz1EZQIn$d=ziLIZy%s1D-b|T8?4hEDIBN zvoE8|RV`Gut~SzgmEqSK=mQsmOt!%Vcy{pmjodysDd2JNb|m5Ty}mc~39ULzsMF|64O6%3wH-=G74d;ILQ{3UY zia1u3d&j=o)2DfB;ZHyyG9m!YS|Fn?;==Yj;R8VVswWEnkIHO&6j+EV0YQ>u3Fimv zDv;D0$eYeB{!=US_*K_X&>-IQF!-_3mTI`s`wLGX6~Dg&jF^{tP+Cyy3}=Uw&taCY=` zq@EwmN+nKwaVYuc>;@}U@j_I?L>C}v<&RdlK7U5r-QS;|&!cy+L$C-80*u%rV_-J> zyJY#Q;F`sO$(!X8x%M1AGh#zOuoJPA>QT;X$)7RX=ai-|o+>3hy4=rwh~EKPGyII& z7RQ}(peg~*SQjirMVZB646fsuh_Jxqsc4be7&F(%_84?9@g%VP6l|Tf6}&RbVm}05 z&go-^an+|)oeN0ou}U#8376(DD51~x!FnxbLs`VUy%YANO#e zpIfk!xym@JXGNjl-Zbh8g|$UvN1bM-jcurJaBvh#u?4~zOK5Xz@alYvWp+VnY3VSb zWX@j{jTb*v!|E;fN8NmmsQj)|to!B~TUYN%88qW0ke%fSQ+EH!Qlkbq>t9YO+e3BZ zCKn7)7Le^HA%!xG&>D-&nO8bF*ytG| zJw1T(8(lPDTEFq&@4PXF16*a_WBA6YqrKyas5S}`yJXD`sJ!mONkIf&3fFQi`Yg&8 zm!V0Bot+&>H*sS<{tQGX5YKeEljQwrMl#rin2i834)FS0RTY&6hm3*TFk9~~g%Iqh zXGe<2dM=<7xnyMSeRRLeH}JJ@xx9yft`g`jwX^3`wy!W^-Uo{F@bY+mfBiy96uWme z+tddv_2bxYD4YJ>zOXv)MM8V}dHL!yjwBIU`9~U81whOn?-1HlZP;j++2|Hxt50I! zZTutGQ~Y=-ykOSI!B;1Q27yVSsB*We%cA=&A3IgURrT5=ONogy?K>7CpSKrIw?-ms zC`5DNrX4mlL(x^~<>kUc6S;mV=riZ1fLFsO5`UK0ZyVynOtf;pg|5GO=)V*IAN?`h zu7Ce1(*Tr&Ck$X>KHz(Q+yctCnmwod`QkuM&_kJkD^&P>zWH-<6T02SmRPbbD>9Kw zd`I!C3$d&*3g#&W1+cNQztc3%eRNL4mmE!(EXT{~mE*drrt&;?ATw6a1sxf7{tWOG zBey|dCM(rk;;FVjRVOJU8P>+8m|EQbl7!TsEUn27AgA{|PIkKg25o!)YUK`LTA^~l z$u)DpB6#_Z=WTV^qOC>Y?9x+TMhokq!shcEcSj$)SlR#sg6td|n~`#t{R86McFmIx z@Vy#ob81ETc!$~cWxg`aZ-qe5VAr-M$DGbAVF(~BRRMHDf`zQ(tNHBNcd}F@01cVm zU2_{?oL4Vqhd+cZqQo`?z3TtR%om`ymu$pljuOZTA}b~@Ai@VNbK2gQtnCKecxO!M zHDFp{0K6UCwa{4^D@lLHunIWz@{+JH(;-G(eGGTglTUU#yt=@x-hNSY=vwT-*YEiq zEj>UH?HnlEb1s-t%(&w_|BFc7tZ&6l>l>9GSy7dJGihsMcg_qc=*3Lz?~pDf1&QUI zNqJl##rnZAw&7cmCh<}pjtS{f{a8(93Ogn6fw67qUicqo0z4?9-B(mlkDbABrifsrSMJRtu1 zJT}S>jj$rO+tjkOM!v-YMF`L-FIZSua4sLu?-(g_njCt-(?%EKYr;xem6!xI2RPho z{coG}P9v6a+te%GKdw_Q%Xy=IlsjvX9R)X2@EQP$cMqt$kH5+_AjHo@{J3X0SgH2p z$yg`(T{iw)2%TD0h*zygKMQg5 z_x493ZSF;Ifb*}%;uFjVV8X(OveSM7U^o}c9|BYKOTc*RNU-75zX<$kz$&_GrsL{4 zKOCR1tTA7lB(a4GbMMA+CYI{+>Jii$1;m70sO(#H6;yD>T%Q4T(mh(d$7vIZ($#pQ93lo4k zW}2Z(@c1pzIW}>JFN8i?N1P?Zj9TXE+J7&B)ES)10z|I>EsfmOllZ3OFx|E~zW={e z&_Ro&m5=0aNt&J}#>=mG9Y{{*%JVdw40a%Yx>W#ndHsLgjIv1+AIs4B`Fp=nr{uvH z8a`XM97r#6s{vo)|CD1353O!B(QVBokt?z6SV;qOmqkUj6fyddI?jPHkQUBqFtf)=KyU;tUe#ZAMFgjBmH-vyv}EMG5e*f7q`7vzCXGw+qCmf(({dQFLLkET z{{Gfe?+h@g!yTyJM<--X(YNqZG#uOUU2FOI-2l8$4n6?^XN_P3V0O0upgzSBQ1gxPBAnDi9T#w-}CTjH6q-(;hffrP{$ zYz#k^W^HW^ar`*?R|RBt8nlOUzAK*m==X9k1wSSf-I?mSZ7`Z)N`bT<Se>hljUyJ;>-w6It+G7P($1<}?b$yRudr&E?S-_<79<}*XdEsT|bKG0<#O^M)}#R&Pkdaz&llx7H7 zP~`@Wsw|4g$@}{C`qKT866MrY>K=NhQ6r$?Y~vzjX7`3TbIrY4&uxcAdj>mo#-9d3 zXIoM9-K6=rjKoJLFPT?ON}7+>QKX7*P=C5(rRok94~NEC?ma#w?5TYH zf11zYt-zcn_q3h|yKM=?{J4Gth>ot)NFUgJt1sY|)XWmw>a5ryBD;M3QM7>VC>#P= z9xj1x^=o^g_khC`QYE}I`G^_qA%-`;4U2d^ZRtZ?EKLu>b-!H%t0T1W333gl^WZ@^t7OZXRj^t%*ufvRSQ=>J9En zGg2C^+b%XMLN6IZXZinkMA_^BVyX3eDlDFusBmRufJDBw-$F&eC5|UpOa)BZ#^=) zPD4^PyccI&l(*)bbqDEq4YHk!`2*RMtaL)rAg`v33`JVW#hA!Ln zT~+cH_Ype5nBqcn6braXvP!*bVLmczz!o?mlz?JEmuW?FRS0L#N-9M)Tni97(4Rwe zIw&(zoI0Q5d3FB|F|!Nge4q2ju&#|HXNwO{+w??Do7cEo-&%YGjo(*jA7Hdz4Jo9z zT5k!R<>fnYxl|OgtLs@QG5*A}Y0`RX04vYWe>Pp4)q65MX}o#2RN40##QO)BRSbo_ zhN&sy<4fZhFE9`bUAvpd8-CM3g|0y+oHnBY-G8^w4xuL2p5gWl8RYKh)_?!43UW=* zc|Wa+Vq9bY9^H^?qsW|di%;@KDDJ`55}$K!PE>Bjg$ozz1tq;WcKaICZ+^Nru3t8m z*jn?R3_c2p+}{NH{u0|lF%Rk6K4vf7Hw#AR_dM2gS9;!@oJe;BG6W#aM+6-xj*8ru zq`y>(U~9r>u~kx!cM6K;^B&HDJtVyRiygVZ{XTMQpk(*w!eTkq=@}WBr78VvJ}f*l zni5ZARn<$rX`oxFN-3X=xqPM1_(1sj(}3wJi_e0Fx%uagPMk{Bfb#6lbw@RIRjo?W zrzBC{IceFLQvVu4&wHtUW`}8M>Dln+)PstOg@q{nXu<&|kN#~J0sePfV5K7NwoH%n zG%XBDWwK8fA-yVn8g}M+7icbMshR{JvwRj?(+Ups0tT|mpE16FM3U98p*o6D?H(bnNab${?FJwVkb9814tvLs}Pyon0$f5M~>wvB=7O`lmWZl!ht**P!nG~D;* z*#XBnZ2Bi!hRhDv-+IRvE8+5$0@p{rhK(z(r>T4q*SvuRn1vddH^%0!o%m8v>8_TsG|LH&W_~ zdRs4_Iw-d+f2svx;SP2lwj6LCd$`xQxaM#Q9Q5HyY*=-seZFExsW&*84|x63f^tX@ z`%FivRoBjg2YsJrjXtdVRQ3m{jy?|vGPso*Y0L{YJO5E5yF6WcQZ^xo(@`{A1?Nov z>3Y1I@D^r7GGH>b`6CEotLWrE?EU_}@RpZw-0cBx zC?%nrp-$*{RO5hK*;N-V`(oi>g;-p|Wo+F?eT|}&p>;kNJ&h%?Z2enh7SAsEosaD& zEF)~aOnco@=SJ{tP4w&3Fropm3Wn)ELeHz)yFZ|xiU*86S9Mf%!K0+5+gkJsIa%4H zH5Lh^1k`sw^4NqBJ{FLwdGv_j#?6}!<4M)GbeY;VHmJ{#km?k^IG29wToSm`*KHmnr z3b{Vwvw54xHwAe*(D-CJvh(u7s&hg^bfRI$IJejKR>YW&&XVD`!;G!SmwQeZqcbYd z54OXaGWy@7c_$l35+&=no7P_7T2aB!W;PCRr%l}pEB9n6q- ziYs_#R?c`;Zck8b`RW@FUUTl8{;`mm#Ppd~mT%W%Yry^Wr(MW>}rcG$;I#v-?l= z>aqtb<{r5dw->RiyTmMt#QEQhRgbbQ^6z!rS+5Mm<~LS+_@oXM`cC@zR_W4)XgVD= z@1DwBP%4kETQ& z_)&W2)<6b2*mIZPxamJVWw2*|VNfr&>s{mvl^E9((o36$K~Ah; z7nHV=z6~}$?8u}wA=%T2X<*G!H!{-As(LrE=3PODrj^-OZrbp;(BHfvaH%JZ?FAW| zl&$0;AAf4y@YO!_>1LW~)e#AOOl6-B%axCd*uLousWts%|Uo9xVDcTV{wL_NUn z*qhjesDv(X@orN$QeUjGj}fKPTe@mWDOJwp$FwWQI?a-JJ<)H0xKZV^QjPEQgZ;Z4 zi}SPRUpFN>yK8N!$PT}-OAvo8Z80&*wkZXMKXQB&PY%i!ZYuwf+2>sqK^s1h6XsJl z*%2LK&2_mcnxpq~juLU6g&GJBzxJJJ^B&dN^x@F#p^8ppC&foPWHit|E*se|-|RZH zT*lHfP0xa!#*j9C7p3*@MLm#OKPXv^_h=R6wALMOqs}XJ08CGnnIVvV1by z;rHo!Ki66F`?H-C#E(aP4&~eZttSl7JW7;ubrQoh`5E7NXg}x>Q?t_d*bgRbBvft1 zOkA@h0-j{jUa_+rv~P|~37{9AiT~7|{H{)NWU={E1W}+Xq{fWagT*Mkq4WXK)*ZRm zNn*Cm>vabT^E;#+&ie%`jti&APt7MtbZ)J&yUe%^r{%C;I`c8FMybJ#VQr1cMRYnZ z+PUtL4#uwO%!k~%{E34r?BB9_d3Igjg@z1SuT9=!tW)#ED5EXQL+99|rx6*90b(Qz z${JwABKAAel^**Yt;d>1?#}n?UEYqh`TI58DPoNHjNy^c*y`wY&bFtvyKwzMhUa>3 z*7};_md_o8n2Fv~IX@m2mwn~E35{7#|LZ>%>pykUZuRMbi3gtS?a8pH!mS2SSGU** z#h6D)`fNN`6C(m*)gkG|_vjD!T`uXK+@E@JQD{bdu`{8fARUnMM2+Pmxmpb_zob8E zjr}a#s|SduFo%2|z#Dgd7nQOOpr}1=Oodfz%cD26R-Z0lKietBwn{ycH?){u?JD5$MskoqrLAR{%#z%Wr2T+-U-Tej_u5m< zL|^aZv3=H%(YJwPB{QFb^KlWT-|R4Z774qQi(n7 zSdAIIaH)?A@V%G707ikKmR8_NFIUdGp7`3Nr*d;^HnUD06#VVtYq8J+0v~tq)>Z#l z5s`Bw)CNW6`RhKzu>y162Wf?|a_F>-yvMDKII6=g=SZU5BG>*sgzA&guy2_gB$si| zW*r|Vri14?og-T^3LAv{%K8p?{6+ct=j$&bnCO%xCUP6;WJxTLCA{W-fzv|LT{G3H|azw#$!ycdUW~319nu?pT!PT{Xu%D0H-CSKPD|6myO! zHDjVEHbhCm>mE)poiBaO)R8HSjU@rSSz*7a#K+0a!EHEj|210#D?0hfoJJlgmzKpK zi#L<^JDL2tLiqKB8n#7cN!h0fq`X{bn>JeSp0QOeV(;KNMSMB`3A6JoAY$%kd|JXZ zuv|8qf9h98edpG|PS8RmB^sul!LU*=q*(5x%1afOk$y`@pN;Ub$;G@y?l;WkU z3;D{4wvNSW)J46fPkS}psez*!kMyMXD$k_Ub2S&N#6P`eBsg%@HL!>xOYHQ44x6EE zNRA<8gSZI0hopRl{D(00bc{54%~!FhmTPyOO}>qA>d&Q#kijG;ZRxZ~=}m@-`5Aoa zB)#JLG^HKcm1&_ISmUFLcgdBl}?s#tG-^%D`=0DdmN6HmWnnAC(M!GGIz`Qroq_Yd58Eayg@KP zBvwLRNB%{B?6|}?h;~?NT_c0bxkZ*xEiqa!?;5{*z^=FdtQ?`0r$Li7Cp&l1dVc;B zR>T_tm-z>3=XYJ~B7A|@ue)gaD-B}RjViGBt>nhyyp*=J#~a^@e|P}?u~$4{Bb%%4 zsk~Q+oZ9aa;||^pxt;Y&5o7PQS1* zlUn1lh1F|YjjC}EX#H3vaslp0Rs3Si+I4@2>*|2)z12OfN@c^hN{wZlQG-~ttL{5u zC~EhP;)HK2p?t)~qS2)uxagQxQC&`Zej`EDPs3dP9y8F1}$ zl9($Klo(WR*XMatDN=kY_6?|hZo^-Nj#cjii;5)j`m%-4M#$*3izWPhfq*zXvYsQE zhMZ0yog4S^>GVCm>?g3gMLD&K_05jq&~m=JM4edR%rGjoMCdtNGGDzZXW~eMVbHex zPBWV#&`N2jW3X;8rKP2A=2$V@C|=o+O61x!pvHyST8~Ti)+ZPAUV&IK2|Ki&dch}q z%;*@mNi$sbbj!DfMEgl!KS1(X^Snc|sP#nqHFOb7osr?f!|}Lr<(yHMLK@?OHl5Gg`<3+H9TQhf~e4s%G>&dKg!ru6+W>31h?)N~-@cQbDw z;J*ZDM-K)5ua5t}c*(mr!5R!l`@iL)B#6M(iT0#af44}{ybz;_Wtxq629l#G-6jin!05&9f*Q8LJPLUpc!V8T_!nJ~*{N>lR;-@EN9iX|ne;4M8 zD|XnKC+&-@ER;^O^{~5r^j%JtIH`y=)n{vX-D34^GfvPDix z^_{=h1}2@7mRM;;mahaavTF6Ac^yFTBb0G1d*OF18G0jrOm0+cGh_F4b4LmqfH+(S z{i6;rV^AL&$BGM_iqIcLuQF8@QO3kU?&6d?W8ddd!qu|RwP|il(k}sBzOll{+apdj zf2anWYaWx)!~(JW?X>DyJz$|3P5Pk54gqt{FU^P2NuB>n9_JMAJ@fEgN}TQs&0;y+ z(l||WPqI%Qj6JXy`EvI41aS51ElO4W?(3J*-Waddk>{x29vpHgn51UBUnbBXSwq=0 zOpjLu-dY};4mSw3AQ~J^aR(5P;TANPpD$}X=gvT@SyYl9vaqCg2)qW$eJI|a%kMnr zOkHfudIwSyFGn(w8@M`y*pePU1t%=(K9C;#E$KA6dXmGlp6mH}8JdyqR9P=M%vWX` zt^7Oe^NCjk_mG?uyHkyIs;BYpH-ASo&Sl%R3pXx2>68oZ_p#Orf8Xcq`|?XVOb~I# z7a}A74v9@qO=qKOo5!ff4+x`S&3;yp3ee6>x)o_U3AofuKDqFp(h5){6*W?4rFuND zxkiXxnf``0M!xhQRO4nWB@iJHF{aSM75Ko9-rt>F5a`z!I5pgQ-k?Iqa$GR9EV;N- zna1$#I`nhc`Nq@T>6@X%O@OQDQr)kUzdP;e*HbUkrLjXX+ucwoU$)4p`D!4{saE06 zd3o~!^I-ca0>kmF(|4iHNtFEHt_1jv{{Pz@Vpk}*c;#;~{?&x^){CK`N5iBN6QVyE z94UMAt6t)Q4N$*K^QCDhH{wkjcgc>?p;K;rI`5bn?0Lli_SqXS`xgPCbLs?8X#1GQ zuZ$HdDo4HX81Qr$JwExQ>XUc&{!=}+)-k3k%X$J|jQX*Yn3(*)e`n0#S|~Zrfckds z!}u>a&1E*szFUX7ZV|lVTRW_=E;5Gxl&F^_j=^|LzOU*2U>mc?a9~`^xm_b3NPs6( zq=5TwjYT!j{=L;Qp(EtVI@^RW4Ndbz*)%Dnufor*>EQIp zJkpH0QRoTHIm8c&<2O(Sa(}~Y2i&ti?a$cs1U^f9^8-fww3Qi{!P1KUbB$Hnf8mW^ zUBkHk$iTgH)op@9sCoaB&MK` zVnJ_HYF8PMZ%(Zy-l}@;_5ZJY|3AC4!GGqm-cpfr-?~3p-+Heg5}VpO8tN#x2XC|j zihfK?7XMwP=PP5Oj@Ax9=Pc!)&e`wk)X?ylzg!=o8&+v7Noe`VXIR-#x;n@p>IDxP z>zP!>B}MWY|!dX(_Os*A>UPxT!-UtWTkJuAH-X|5dkbi@aWlHQ|~~b6u6nK zOK|lrLJkN%x{#LQyO^nizjs;QkpNtP(fw7wee&0MZZHb1l!b3*yy(R-%=4RHXzOk8 zy7{yzvDmdL)+08d9rdEbn*?X_UThP;P_kwJV}AbZ#?T5PubtK~1C7tCf91iE;T_F& zp!Pz0dG4i8pxwv5V!i(GJFTMd@VviY@8)hA@U_?Gk^~QZ>AoOkuTin18<8W?zAqE` z{&?BcS+%IMPX#G;eto<-Hnwte>#XaKxct7Qq<{KXc>~ls4z_WN@somePd0P7>WLtN zC+$tx#!`aW1j1`*{$sWFA6Ur36m)ywJa9`+Hrr12$33@Pe0boh3MM`hy3H7uidrGt zC%vg)1e+f7*4s%B9V2{*C2Iz3j5#AJpwL zz0*=gD1mJk7Zn!kAfYg~+(gE`Z&5?a)Tn$kK4=KweXQc7ePv*S(xCowwHxqO zPXraq(1IY`qO=n~rr+Gr%`bHNc$kl)dQ$}aXyr&}7^N#Mp~F<8yJgujkO*g3dUpMsX#D8aI zb|XiRQl_-gmUICYE7DH*Hi~po@J57jcI(^UsRxXp;80n;G4~UUNOp^Q>nR=HT2h>e zc>k*a{0~>2&iDq?HgwuyA>h8vYlkJg=5yh(T!o<~Kx{?^WM;|wwB(rmTR7Pq$e3Qf z$Efetdi6QmcA(`yRzw=oBZW~q)1T2|(DK?6U)mz9$Sc|O|*WkFxbPU*)F%yIUP z(|3=#_R0h$=F)SCqbZ713M|y&Y=YAJngr$cGG0UvR`$uOwMs_289oHJ9M|gT(peO$ z>5|u@do(8%RH`L=1`)ARmkG(OiI3lX9!FS^P0&>(VN_MXo|Ogs?^V3*9G6dXd46Ya zY&hUqv75!p-PxZ=(pR#+RBR<6&D49GZ7Ac zt$wg$Wvy58Z*k|ayyM|DI0y~IjHKk4uNhog@%(T}y*|F(?jfasEUor@xo;Y3m*>Yg zZp_|Svk%N0zjUp;y|V97qv{ZWS|py?V38mF8q@xz05()g|9;C@cond$eyVf=iRes} zp=w=i>^R@Lnd2lke4j2@+bk1xjRBdT%hZ;7xjLiGQq?{$AJamVSj$baNLI zq8jRB{6CtOxft~?T*pvz(w$TVOVelXn4iWT&zpAWNsln{a9z&wrlFM287N3NAmFZ3 zHFp&Yn;`gNFs!wD_cW#9F>pJ`Cg7COhfVp@V&82&! z<on4r0{&vK&~(;3}mOuG3by4)t-ihURbGM-*s0qg-8T zbP2Me<^aBDi)9szR+sKSo@kVQf3Q=a8;i^9%K@wA0Z>(gH|R_m z>F~y{TSvi(i=`RK+S#PKFw)G&jf${{l@ILzkF&W^fmIK!H(ViVTh!_m1i6@dFup%o zZB0CVo38ePQF^ZyC#tr-(M?Gh>uRfjPyU-0SCdYC{SoHBzrXows2dq^|8LLZ|3EOy zpWcouBQV?Ze~znE$qe=u9D+#GZ<$#IbH*j=UmmUO{$6PAr1%4*s?ZJc8)gSf2J^q( zy`|F|N`7xRjbu$X zQlXZ1g=t=-nz^IDFqQ1|&)3%QP@NqVf;)f9~+4&1bTfu{Hy78S`mWi=!~s*!}I8NX+O6X2+}g zloLQVpX~+Y;IX4y4x_%PP)7qBP|ZAzVIr8nD)&(LGxTgC^oh2-| z^}Fs1Y(C#L9nD_tYCUhaR83yNAQ?Qjt1QuZo*W$u_m{tsH(Jg#mT_+vZa^~Pz>GZa z9;tvsI})-^>h+Zjqe|!l?Dv>w%R)v_-B*{tS?7*^etiMTS4TALTDW7$2Tqz#b?M0C}Yfwfp&HFcbE>fUK7xI-{Zwm-{TeF zVz2dnueGA;$yclP*q-VD%qtS%qqiK*L`h)~Nz|Hr%rJh>ddtt(GWQC7@V-V-Vl0(& z{t&q!ZJebiepMINvaz8qah_W|f5%3H)S|4a?V2L68@=lfBb^o3f5=t7m1FNlRl)i$ z6lijvxV^~iz@{WMeJE*#gxL#RiP)tl+r>*-@Q?c^`%Vnso2~FINVJ&g0M9r;{{D*i zR`E`xi|+Mhdnbc>R==vJnJm_xFZ}>oxmXD0(;*Yo$q!0Y0**}c9$Thiv|oOxyV;l6 z9A-dI14*&QHEwtv?N*zWFBWoZSpp05d?BX$oS=i8yuTu^Cv#)NJlKIU|9jrgzw=GT%cUiwQ^6BFWEnZ=BP9KUU z=HrRRG=t#TeG8{1&wChGI8A7OsuTfRP1S>F%i89;;+|FFGiHC(b;$IrtLbEQZvDeE zQHC}~_Me+D%^i4xUb;|lE=~~^V4E3(mhCUvQ~nH?w?E7CeW&vLj|@c3{<$7ccLz*e zOHhh->=%eTX5@Nda~d4A)BRufFy&yEZT9i(g*VS66~--s@+>$^1iLOYdT=bw-aUh5 znqQ|ar-~|IbXBI&v(ILL`Gx`0p+PqVWH`l-mY1h4UAp&L)z$ru#OL45U!w4ipxbYipZHC$9HdvIv9YcF3J+7#(#@yNW({! zV$7Y(NpML5BA4|Nqhbuvck!*C^8q*XV3SkkssM4FavLlaK6B%Lu;}z=C-QLPi-r2F z=6?qNJS$#o69Me(dOLoJV`IH@PSgLYNK@~TsvXmFACs9=>r}sGkkDD7!K>E6*m2MB zV&bw~7rRK1P@!S@w|;7ZpT9!v?Y7B!)cMRgz`GB;}-tD^t){H*OC8%&rCJ4YNqWu{A?%1DNUR(y$^6m+!1rX;1 zQCYPO;UN3A>(;5KE6!>DVNN77TYLgF#cu>uCn<2MFpL*=kYq0E6~fl99H5&tp&cRk zgbZXz92_G@?`LCij&fwT&JkkvXWB~qfG|^gyU(YpY{(@QZG1~brWO?$AF7^nWG@Ww zCg!iwAK0;6oMBL4nxK!(xY|XH z4XuEor)2&-{^4(>o$}Ssr;8kDyBl7lT64nELj*tG1OU^QRnwmpIIj|ZQ1}WPxAjBF zX~*}^oQf52_;QLgAeW&Ze>V`kLY1W{m~Wj=OkBo>Zm3s-TH`Hugko~pn7oY9QB=5w z%p7MKI`E3nl@z71ZoE8UT`)15?z>M#%k|b15t-Fc*anaL-b7~RRkuiwu+7HTzU;s4 zy16|~L793JIQzV>NwK}u)O*SkLL~g$SeMKaHo3xq(75#KX1+PugJet2Ty!}UX+H5mqn)y6w zwJ7eZ(S(I)0JF3us>`K~kqKK__c+EsuV+0W4}u1*)`-r+0_Fxt=z7ZIpWFLC#Y;B9 z{^8dZ`atnJy%!S(J-MQDam9rb0<9E`_@opF-AzH0O6b%@0-^-4Ui^~KJimC-V~v;L z?lItFm?JyeG-&=|zf39RR(0|DAkrpjdX`iC=Xqa~)##3Tk4D`I5&9A{=Pq}d*?py?Pr}XgCCr5MnhV9gU^bX!qm9DoQ&^?I z=lBxPfj!*Zv<CZsN1?+fzD1}po$qqUKJg$zmf^5yk0hz4 z@iC824>1wd5ye~?&mtP};%B(XZ={XJZ5Xqu`i@aBYg0+sW>}enKPE&p@)g+svlU^t^0-)>{=ZN;^J{Hc+> z$jwJ8V-*{Lia;D6&z{_hpe-B&GcVcKHSK9cj|dh8H#Z?9@!_%%yX;Ykc_Bm65=W`; zFcx?@(|=9xaoir?tI_LtJ#a}}*ck8kgWJ;bX>675CTZYTt`WG7LyOeA3Rg+u=*&B_@CT5p;!{@6F) zF9+V9aS(ncH8BE9XSXv7K2YSM@3C0|_wcC0_XMp^S$Kdv-u(KU!JIUC6oCNKpH#P5 z$Rj#EiUT$t2jq6=7eaNers7H9LglW)8T#E*4mNeQYe}{d3zVxC_}FfeN@nZAA~v76 zGdhYM+N=QYByim~D$n29_={}xE=MU$#GdU1YME`Wr7N*QXDNb3Wd$ydrk#m}dUod1 z_p@(^C>Y0OkC-^Z^H;@?H{gijS8c_`@GqjvB;DqFwvAE$+ulIO0IAGKGIgExBiI_M zLAiD2$`_J0t6Y2F!=1P~r&H^Dw3X05Y=Q6fPcq(rQ%g2n~ z^X*fnR{;FFgVwe})Hh$Ib`RIwr_^T4RAcJzJihIIN|yXDt9L6^5&O zo((!0*->%121gVJQm5uA0ny-1YUy&y86si)diGe!8mp ziZ_B_k0n#;G)mRw)7Kj&Z(4DYvC3L98zWfEmloDrn<=A2>K|~W23613e=dv?J|nd! z*01=3kJ&;+!tt3wlZ|I9GT1{L)a#Zn-p?cX5%X_bN?`b<)j#3#L6U2g<0uj-pwuqe zXhF4_n?FX)NUM7lIREDnMYaYG|2OPZH^_Q-;OZy8AK)ouDJoh`a|9ddVESo(HeRA4 z-PGKs$C>Z**`XfD2yU5jEK_=WyvcBw$3RA@RIkqLD7xb{p#4@>uzoES-p;A&mRxAW(4R&$!0Fj$g}KsMm7*d@VZ#KY23bhpJz zHm8`PiNAC=oYwo{kw0R;rh_`~xg`R5u;-lIHe=Vk=!(R& z3xrCHJBg`gFQq@)jdgV@vP#(aWLzM8d~6sB+dmSzOY+u;!}~O`6rtcR8&RNg{lU}5 z#he~uwXEM#VuF9Zerwe~gkuTcrydlj40?7jZ9d*}R#=UhxWIY6pFfB?uIr)A{d$RR zck+Y#*Y1ZXIfVbV!i*4*pD5R!_1ZY`KiH{mfB9c80DPZ32HXM+d3BlYqlhw+%E-?1 z&jVxS+nQl{k@{VRSj>*37V$A;jL1n}?|V;b?G0Z0!;)d4O$gNp+LLfP@D1T6JVxj@ zpXVKfFiXjl98LvF8Y4$J8V;qtKftktbfbKN@FpR+M1qhHMu#lFX@EDPFG(d?cTt0N zLx3-A)U@aWwk%0butwTN-0>T83goSb)~Yxk<5#bHxxY0y&I~*N& zj1{KLHlfqcgeTY9A;OM0jJs(~yzh4GcD(M;P}s`+B``!f{8ngnGNvT#4YNcoH~DgT zjJ!Qceg~Hpo01NU8KzS(#bL zbPlpo?Rd%CjT<<*sG2tC?Yf&+*yl#C4`WWe{3_yk8)$d=W4m2A2Ls8(Yv8#u_x4@O z^$ol4vlg{HDaiXby=!FRcEakj65fsbY@eMl(sOeEKtkcHE=J4i{5jXHJyltkc{tO4MU zY%h;U3UJ#^@*I3nWW3;$Xculf49+PcWlGEfBoZ(+$LDrEJr{Q(KzsGOTCm(V5s*n0 zXrUE+bVl!3MTd8-A+f>&cM2Gb_Ps8QokL~B0;0FYzxhkO*cQM?QGNX^^7U*Raep_s za@gZ4voy-NI99*StSJF_3r`Y!{hp+Nwqy7=4aea5^ME&UaR387&{fRlvCU)599C+# zbEmYUfF1ulNG%IB34%5>wbzP@Ilyjw7{Rck4xinpVr)hCvUnw!Iz?tn;ji?co2NKX z;P-U!Dw9^b^LtrN%-!XesSJp@xvIDWelH*B$!T^AOdWP0dN3SMug!3>Wn3$xNBU|9)bSPRRac zL7nuFsB$tF-q;diC&fclhs-7LQLg}L+IHd*Hl>U2{;J>x_N92NwH6Mh}Mre8DfPbq=L&E?~Q`X-!C zP3(^D@eV8A6Uv+E2$tP{p-c7VzUuKbV4hB=)|;fs|U; z;!ci+&2D}j+ug(Hi0hQ@4s0~j$mNg~`h4bBZWrzjl>C6s>8x{#x?xx?hqNrOdeIE# z)5{Gs_eUfy#|qaUUM6?}#7+uCxaWG8jdwpv0NeZoT#8V0@luJGTdi58#xmJ}Jd8+n z$|y0MoROR78PV6Xs6xwPY#4VFgJ05dp-PY^E{ZNhXy1i^Mo*T>hwN^*-z@pfM{+Ii zZ4edE>wNJ@iTk@(N~}85z1}u_{{`vkk)_4(LzDuXnpmgKXF!}Un@ul#( zryad1Rj>@R66@UbE)2L*8MD~pxLpF-l zoln9a@jv{RMY@LnVGFu-*3%#GR>}8XeSjASTvH&aTc`_#=tyS6@w$J|GvHRKN70bl zJQo>kTZS|{bMTwz%x4dsPi-g51jhRdQ#cK2ciQlzR*&MwEL6gOhNgbGEuIb2DK5An z#r_N+ySN@T&lyGiQBt@hRwm+$4_D?-Qc!^cgpOzQR(%vpi27@SX;!5GZbDANN~?$} z90rlw3GMNTogZ-p-l9#rvSZFpb88n`_t_KyLUiKGOy=mLF+;XWsSNnwq*2>2PSHl= z3RC;x0pnUHcF`dux`6ek2?P1M6mZ!zFl=pdFS z+f0RCkM(+q6!6@@QTcOqHS4j74(Hm)C#A5@2vgv<)C>;r=5o~Jr@&7uS_oqw^D3Vn zRkQ^k#01{OEM8%LrhTOPUTl0%^%nuBp)7U^KzAJvfj+O7}B_sg@X^^=+6EJDyh(0Mjz4e0Z5ZLB7FGCY}2WHrm?`DnF_jUnt6 zu1(yb4g`JixH*meQz@$+;_QBvq+g)RZeJ~_K`3|5x*2sMDA0BI&+QP_%K1s~Ey}8P zc`1De9;N3bx^g={C!eSZ$K-KorS@<#zw@21VS|LpMc*PSrDu`(W$iF1P0q2@S)Ma# zwjie&E*MUAy zS|5oQlTSy9c_&!>86Rbfym(d)*oPH7auDxoY>eCtZu2_NRI^B5& z2&gALL59sBrz0zP{aC7tU!{!78CW^(Nw(32Ey^taW$XBW?}MjAW3&L2#bQzYpWWr& zNl}u%3Z;FCWbR!*O;i+0dfWLRJl71lj7%+UHkQrDttt|GQfF=|d;hV*{B~6IyGVyQ zheT6}GZ*G)7DfAwG0}x1K05n5cL`N3pE+MFc4x{nsND}cH`cqoRMVcCfzZp+3tr4< zis68^bHShnz1&`x@Vdx5#Z<~6s$ZFc{n84QEoqiw{%glR2d@3C{bBOT5+D`_#g=uV zwv%?a+^rN8-8=GH%z1O$`5)-?d$U&tdHm7ugj%7F5P28U%T9~QuX~;lbFAq!8!!*H zu+(@eylH$joV77N9F(c1h9`E&of~r?`IkQy3c78Dr@yc+Jv>9W9^oRTf`>>?a7LS( z=MH5H6fk*+#Y|0MAaOalI>R1L!%x`Y-byL+1Q8B;?O7XK^4ON7iY>kf6n$+&ES@Ou z_Ev!F5kd0i34DEK#z2JoIfVfy>($_GhT~^)Cp{}{@x2ua@nf4bZ3vMgmzg08{?7Tb zmDgnPdCZcK3>Lv68isn_elBll)-XI0HP(eZC!(#Ak z@y`*+T8fe4T_?;qrC?)kQ$qyXM#|~^dL5&go-MbxR;z=IL>n%n*vOVAtEcl?r}*0g z@ph{@`=W=Kh+Vi``Wv%^H|OK`o#NZs;ktvo=ez9u%KefXUG`FpW^H$HKU@68BSYSQe=P#3R5R#V-a@2(JJ`Qwk(A0iziuCh8_jzIJ(NW}c zawCxf*17ip%YgJF9jG+!ENV}ndq)iJ0NX>TJmpmvujI^K&`p`oqAOm89b4fRM077$ z=;fdHexay91aK`R@O~wcq{N6AfY)&=Eoph|CgD8t`)W~oYMIs9kMH>;gqiNK|MAr1 z5JPWMrsANs@GeerOH>WVtRl9t!=xs%`}oTrWieQxxuQ2oZrhAXK?k`wrM>t@-{nhJ zWqYmpDD=d_m^u;b;E9Rg#&4s)9i-0uY>qdXn2%BVD&%u z-v=BZ-Csls%tq++7Rxe;>LD9`>1RNS6cu-*>j?_u9RLBo2%4349D=s6COf z&I}Y)UKZm1{KR^@jY(oqdRe}W$bXZaaCK$@^GV0ZSXo$?pDsa0Mn)_30SYwbI?pq6 zWL1UQF4mJnEeddJe)U1z`=B#hMWTwaJpTamHbNR4SECKP;u~3V`Wg>xw~zT_?bc|W z76)~4Te=i*)SgFpPF*vC6g354ClW%Q&LVlOuA($00?CDG^V)9=a3FX`_yFi4YxQ@O zcqHRETuY6F_l-ycm|?#xhvvehOcQ<6HHD&Q52MsAX=M>%5_PIL^!*~$gxoF!q6Fn(%e24= zK>rr0;ms9=&3U^^ncXHgjH@o!Z$m(fs&#vvg!kJqwr()e9q$=}@oniOckbN*vCeLe za50Hlt>TH)L%uir@72kl75`|_xkSs~GBi9nDiL!C@W?2$T3qfJeo{*Ey34LiIb3PG zL-#TC%CJN5_PjZ1e$@aXNt!l-BW3w1s?8!q`kl>1RZ66b&Q9>8r?ka54g7{Js zMxEKEM4ii!)bE=dN8ipLM_SRrHUn!Umd|J60&NN4_S+8l$o&Zb+oT8|=M-t1KDIQ% z)LqBX!{C!A$J{Sp_R)4yjG^-qEVJ2twu%CX;Z^&-Gl9t72BUhzmW4Z8PEuapvvaKE z#knFsz7kQqEY8BTUvM)9wJ8Zrg{19)z}{)%($%5|+s32X6w`G%lx%*ZZR3|6d@pCu zkp}qJ2gi>aEoJre_J5>)oQmD-bU*!2&r`jaf`dEymHxp7M?|WN^lp>@N`3ZVk`iXU z;If`sm-njw?_z!E1M-olguEPHbiAC*k@{Fw_8fB>AVnTU%jAiEQ%qvo+kl$Y!M)^~ zS8~nyK3Uh%2);`}*HOhm;1sRP`yiFON&M;y)#i>0?=2Q+09EMegvO**TWp&#W*S88$>GoYKCFx4>$mtD#EtrTPuOU%=AAGS z{g>Om7#RP3rK|w%{g*8 zBA6w|R0WQc5fj_@8Ie-K2bs|ZZ@=@u(ff&h*=IzV7Z%z~rhuHs|4tCGLs5^uf{LZZ zC`r4&Wi?!=AMITloDILe!0c_HwfV0?0va4X{>Z(6xEuX&>ONCjK`9x_FJ;Va35z^I zWMQggP6K{qph!u=UQH^dkX@GW=EeTiML=lxRzYvZ^>xnSL9gEr0X}{ljL(%|l0>R| z-a~788r_+#WJ%H!WSm2XL_ZiZPJ?&4`?T=BILQ}VzWn}|^s*>)ot5S86t_bJ>|Ry4 z&sYaDBYy0f(f`(#T}}XQo%rhOXc-i(4ejggkN*}XA#ghF zAdW~;)NA(BjvTg@CEwICC=S1MlDvQ=5f|hUay3a9+;}y@4WT%7!$d^6#^WI@vrrSl zaVmD7WPn>e+h~h>?d%=*a04v3v> zv>&)_YD6^nuCUU?aXri;wtY(}&ZbK9uj)yVZ<;eT|Mh^ZzhR1j?dIV6w|B18$U*a= zdA}_u3gJqmph+;>0_y3Ip;68_3mL4uGUmks@QYLUT+bN1!XUwjMTIWb?dWTGzcqk} zX?ngVh)IzVCeDcKPIC>P(uYiH>u2t6x1wIS9w z8!6c>!(z8&zZs;FLbEo=MHsGSZ;x!8Q+h7%Yp?TGWV`IB@?X1yZVG2bebiuTTcLP2 zolm;fRKKfrDTx;Up;9Iwyj!Oas_%_!8UAI+_CrJdUzkc7W_8WcVZ7^1aKk?>y*)V> z17?YOAg*ZG*$n?f^+q<|7oUT!>EGuTvo|7vJ4(E>w88zRFO7}#+TDJAtIVfj`4g6Y zs+w2yi2xE~#}Di`K`15bk70Lwb%$vu{XHzFG>?P1-ZnV@CbQum;dc|oESx=Ia?ig! z4jZm-T>M3c;v}ICKu@5^9TBH`ZS8|Wjo5G;)o;;!qxf?wWy4OZLn!h$-Ax`F= zcBB=rGnF^Dgf|XgxTHa1ucA1}y+1 zA5Y#Qs*Mf$i%%QIIg}THeomxClTR(JUF;@4+Yu0hx;3`9+TO=pSrS(XsuiDVelSN9 zomp3>4k7eeOhH04Lxs87$IWfM{~}dq*LDoQbrYJv5>Kj()%9UItIPcuo)MnEZKHY- zA>xLOFb;2y+w>L*4{1gvIt0JCWTQqyfijp=G70!0(m#PKVw<0Sr1}r82&qalr#%~? zaMM{D(E1 zM1-2KG(gs9ST+Y%y0b zsVAwXPTLj9CnAUxtcrH3CKk2zaRoWJhFj-hxjdlB$ZY)bKmYNAzS)S@?5m;710Svk zR6)ck*L~kQ`&X!1%98g?lev*!INdy}3S6JK6Jm8Hq&dv=9RLwZOfU zSh5@iY$EXsFOPr7hza{{uqLKEWUsgzZh)%E1pjbNZ(UkjkawJuRE**j@vC z3!KasM%$emwoN&2acN)p$K=bd%|Lu2qh zJt$H*UBY)t#D$6AcKPkC0V|4}Q`EGu;Iv$Zir!y7zL=ZroKNsO*&RpU5#;}dFKN&p zuRt~OvclCn_rZjrfMsw7`;!YhEtBT_z8<*qk7)uVHg~)ZkTxAurrg>Rg#n*&7Iz`u z#ZPKQm*3U-a17=>3q$qAGFG#9>#-rGS1>%tO&9G3eZ{8N9vXvjN;Jg(ACcJQ8BfxO zVq@~lZ|QJjg+EA&ckO5P1Z1XRR7FvhVh@!#zDhO}u_2Ep`UIMahlRW3-&awd4p|dr z_v7Ora-7*jAgFx{@;$(>@t3zNN}B^zc-kFmz6pDbsWS5mD6b55KGp`b6n=6hYVbQU zgP&GrJpAntl>Mf1=5;@uj?d0Z+?#{uSs|)mF=!5-hphu#UucicSNO5B!(K$3rROFJ zDDqpypT6(PbgN00;wR-FA^ZRP&U=B$z0R*Y>#Wy6S6K_j>s;?MqHZSDtm_(&ntfK& zhfj}B`x5!OU|^R*H-WmCTjJGMO@_}5T=xtG@SnMq=q*tAkeGRdG!y?Qft%k2&$LuD zt8Hl^Rx*8*Vi}-!sCMsJcI+HX`Ur>l(?Zea&>?3AQG>n)t_r1_MYbVQC1xIx4t?-l zQ)IoCBogNcwwOar2h|o+rzMiVLnTiyn&eG`f{l%hXcL!VfBv?KFdB3bQ=Xhy7;13x z5`rLcxzNje`#$cmf*G@7As1dCXdS98Q}1-0L)I@;)tcAqLt>4bh1{8S@zv4!Pl_IH zlxs)mnm-#DGu4v7X<_TVziXd(6m>BXigSZBDMz`h6A@opjvd)^cD&ZxE%H!RJb+B@r@EB)`kvBjQD zN@%0WseI#BRdTacaQ9RAZqC8QSTk5POQV*5^|-XBnK<0mm`9Gp(a^01#r_!v(-}Kw zki6tjf8qJp*n_vQe$0`y1#wtzjEDWJwLH^N%0tktsNeR)fhA|&Wa$$ie3((v_v-)R zzOkra>zPv(iC?xpHgZuI{aK_nsraC9(Iq2`@2* z$Y76}+g^FNn-j(=J)N&%eNI{4;+<8(i|tz@4xQK=FZd#kq0O_z@2EH{xuO4I2Et1y zwoLtE#wRzY2=>09xSjPZ_qO3I_IolmPR!M|>>x>VWNz3Y%bNAFsZG z?Y9B%o55cObG;<*$$jc7sH^$DTp#dRkEJ$!-5ooB6n{IItBp7xH+j`07$08GU)wJ2 zTRx7)CVKre8TICT4Sa-9zkKL=Oxwo_?oH#O3i3DbB)!by0zj1{T3*V=pvhanMcsWC~{~K8&M1RU){5k&h;jQiW?nB6%e}5@wz@hTtcV&*49lEst zRO=+=NC?IVe0Uyw=q=wukz5gJiWJNUw(py^&=<&xmO7u!lYWOGa$-XGQEqSF=^pup zZYKnh2_Y-r;7*ufXRHsT1cl~BzE(R-FYWPDq zz|}eCPHIxPIkyGyA&noMU9x~7{l0k1#8Ov`i@&5E`f_PMJvpQigau>kjkqf@ zza6nzrOV-I;$suE|L~ji8@civc;A|!@Qb_tGMkn!uA+U>2Jqi%yp1!_OXdlG);c`h zA(h?pMnRFVJb^b6TwmQwjK z&kSS5g>-s@pO^7Ay0(dch@bQtsf+D+U?&#*Hc2)~dXl}urKk>w^3Uf@Rg;;X{5T8s zu(w}|FI*6lJXuX2JOjM)Pue>W&3u`IV=S8hL&n6#JMB`58)9P!;kRlivb((dv50CN z7cUl7Tp1rea%=k3z=L>#i-YwnC;HX%W)UP27$*wJ`rzChNwz-n()TxGtlZLY4tMQ{ zLoy~ff8w-{Fn={t4h4@b`0qh51mMaY9tRu=xwEud=bV1uM~ssJ94&n<=VTZc9& z`qG}wGhusIwBT-pzzEH+gZmk#iZQ!}$Xxd7elb2n*hy%kLfY4*+Jp|~CtHb~m`4R& z4EN*zqv7O+oW@QY^Ouc73X*zH;d-WcwQe8T{hR=L!`#R_lp&)dY}Qi^`eVqJ@~m8c zqYA7};;YLv)VXo!Sy0^r=F3`W#C<1zu5_AXUoI*h+`q{0d!ZPx=9+(@C;c&Wre$=F z-z?H|C7o73aP=!11kQDC>IUpp@KqB&RtVhf9IBDqAAM}F5_d4T$$FhrY69=gQw)E= zxiQ)OlewAsPw<#wzuR7OLlvmEpREojMsREL!9jI1(O)4M4_hWk7y3b}7yn3fs0?F6 zrT#$Pw{Won=FrNNcKi{B<}LlTJd7O$99rkKZ*#LozM$%7VU|M(Ge!Vi zkkz$&9{hykjnKKSnT`HffWJ{sO2G;>jgMfLF{FR0*>YkC!LUUWvKw?jn08fH!=ghd zPIJ>3u--7u&?J58H%c2=@+Kr>k|IqRnsAJE#0*Q{=-*;L$ zn8z?z$y|%_Y1E$Lv|o#R1<547ViL}x9#XgeC6roXJ97XWX}ZdQqe`lR+=rZua6T`o zN(mzU4Rjboauqt$%0SV2i0umb2&O10j#+(9xgjJROq0SYT2pfpMXNPR=_;g6D;)j0 z{T{ikL}TIkELHWq&*el_F|X=bH9VJaZ9zt<-HLORMyDGk1PSRPmn4$eE69F;&VjK! z_E2w#en;K~ss@+}ldE1Y=PuR4`G4qotEf1_t!uZ@K=2UU13`kjTL|t!8kgYi*0_`4 zA-D&34c=(dXmEFeG~Kv1&SC%mIXB-v-&mJ5M%~n?dRNW$%(=3249?$H#tT9cCOIwE z8YagclJm@qfX+i9XKZnoHI8aWAL9TYNG-0|tc76pk70Y?u2x7#&j%k# z;|!5O=R!@jWAfngSF|~msk0r3{1_(UeP#^fh6(4>k_PC7U;Od>SIu(hB_{R@|MScr z8a188c=14RkK+;X9@FE1kwbrMeY+iod#v;8L~|I%qGXG;e@C$XdWz@#EcfI@PbniJbCH+ir^=O5D>^qzknW$E%5Vq00dmNc$$&5*sKv zJ0P|;GiMQ>KuE_)U2LJYHiwk|{uxtvIra5`p2>UEw`ZJQ@agodp>q5<7{R7-9PA%Rh z!hNL#F$Nqa4wEK)v8;oCG{q%I@}WddYjP^vEG9vA^14fPvVEeut6FA)p6rCxU^4pF%OP*1kSeHgD|MBp&MQvh?(H zqekI-K}$p!g99s4zyCL9=P!@UdG}0pmmja&8)b8ULv!%qHvh?H6neFGVE}n9ps=n~ zvdQza?%0Z=n5ObsO=eWd&@iUv^2Ih{e)XT*g{vWF(b607_8j-I;IEd*Q};&n%I|8H zncxfA^(}Ivg6Vph0pxOGp(Hr1`|soZ7l{>@3Rqk}(89c2Y_;P*nMnUV?fo-ZCcPlS zR}ESVl;Q`G-;o|DaUe^QJEC05*4e$Bx5b_VdWYOs=rp7PSCnvC?P`FsZ+}S3{w))J zb?B5kh}^FJ?GNXlkD&c1&F|NkhkDWXZ+-ernM}r!Vn*?-_RbZ;B7swPnOOg#=S0dZtf+}6Zm-5l&M)Dyo&bI(mz5vd`^JRrbaLOolE2MoW- zq^oCj4&>X*-sVo^-g9N2O9l>r&BAG$08;4h?8!F&Hju?q4iT+ijSajY8nRJ@c$q4X zKWqY0lFv8*bVFNC()(gZD9z=6i3U4EkGk-%p5)q9k5jW|^BFR>r0 zD-b2nE>}1P-={@jEt*tv!v-IPh7mx>lcHl3jhF=NDA4g!Vy(y1*g*e6&=XdmU zQ~{^u9Afbnp$v)J-`g|Nul|x6;oMNU8nT;xvthmf8gKOz_nBzR@1sIh(58Qmov+Ha zju~DufLyfpUxwGm8I$iNwqLSqOe*s99ahOtJ)JexNM3@uQqIm8B4Xu-`6o=j-pjQZyPTYwP3^_ zO@wKoQ0;U6%TQSnUN(7>DJtn0(G`Wt!ZHcN%}?xlx;)Z>VHfhmrrXVC9|0bhI@6lgnDzT9V2~kjjd?(Hm;L&3I(;>S6`Y~eVWr?SsS?!Ko9YK_mH8jW6PNe>8k@N(KG1xtS(WG0)LAgNV35xPJ1oD8y^C~g)d*4N^UX(Hi56(nPY;YO#7tYhuw zA>F|N>qbiZU(=zEL*H0W07*?webv+(mVbWLpWZ8uczl<^_wl!^?|$m#==;q8 z4E92pTe~s4TZvUutP?i3&XO>s^_>-D#cHA5mP=b79jh6shy;F}-7}Jo{S}$AaF_< z4t{kZngaR?LJKjK@Ua(x^%G9IP)xt+sw{y@K;@}p*0;%iB?-XM4n>O}mTqo)Rd6CR!E83wb<1WA9ypN3w`D>y$4k{y(`yds*HHi2a^XkB+? z)1}Yxzc8;~UYJ*e;C@%3OmwOLaXS-L;ALK6Nf65S65IbUaah{OVHKd{2u=R_L~IFH zevj%z$xxYc9+>9RMlP42FIjQ(=^1d|5zb!vv^Hz&c-7Y=?X% z?dYfij73T|2?6gVEC#dr4_;XWto@jGUX5ztU2xg|_zi86tz6ja-@fO5^VhAdo1qaL z*w?EF+u1e+eZ=ywCk*NMP)7zjEHrh&lYKxNOqo!wxpc|*-wT|PN{#Bd+-Bv!sE-D0 z5Q*w*Z&f>?k545vFb{rfWerGBeaRlHS!v{r%UNNjQ8AxtHj$pk$j2B3;oGbHdgvpR zFAf~URhF?kfv}5Cr>uxz<}OliY63=QKj@Vh{rm-Zg*?&nsv0kgyvGiu5hEl^#c0?> zW=fQN497Gx{$KqYblqL*!kYtGqWB*&faEKc;R`#KlIXqzvHn8j~T8tQ7Aw#&Uspo^G5 zmli9YPG2m|STNh;Xd+3NOg{jPavQfXW1`)6KSXU$(YS}saE`{3sQi8AMtc#kGeESX zB1>C-5juWJV%jNe?73GB_=u`|RnBjGw|zgO#oGAXZZ8`SI6aamu7Whh@cg(8;Td zCZ?8!xZjrO#fli5b(btwp_@Eo7V&&`FkPT5%on@5oo zB!3ED)}>sH!K%{(=7tB)#Nqwj4;omAC#AA=Bf8y^V-VF$T}ggWZsd=={+0PYV@R5N6{hNQ{$c;Jr|en? zl+FTKoECU*yDacNov0={P|W&oq17oW-uK#r3xPNK==#KD0YOz^`4HUqLBLDP~ zx<^v|%ABnkA33YEA}YQ7*qigt*t_w>2??&FAs5rs%hfkR_tm`g1GmubcY!dPo-FF1 zovAV+Qphv(f1}s9l|qj8DxU>X+0i@m=+U6XZ57T1SM zu)=8SZ#nrlznS`ZZ-C6YjsFqsx_TK3wkAEtqq`}h#1g@!VD9L*#FuC)v-__bi;#59 z8VB)5Na3iQ16A*pW@VYJ=4$B*BL&%trY4HHXA-xlBoXp90D*XQ(>Azs7tTT%Ue8sr zC#{LQ&a~@IBV2`+DF1JmOr^vdv&i4gnZZ#8bmkLJJqb9)^J3N!k0sLO9w+6{lv58xH!8M2oYR`fDEzzizRSx- z-ayS(9ol{+Qg7sIMga8?g!m0sfcooUa#%5csK?YZ2C`W>XE9uaAo;N}*gYRAx+Thc z^G)L$gg&h|CBR;gFJJ7CMKMb+f=DbXz1IX-l3kAenYP^B7NMwQXoOu%zJzqMTj7}R zSB+3|ipW%6oxgt9*U9JKnJM!C>nrX4UT4cI&xjatj+`J%kuOd?Xes8WSefLUe?Ji> z_G6QfdU8zgHbcnWmz=lqeY_*p_m*a_QlcL#&6!*avlThaact#8CTvVYH2#LuuJpLS zC14Se-aY^1op0m}f(H3vy!p2(ccVQIqhs2)L48V_YbSn^6XC~~B|XoMm$k_5S%NMmS)f(cnX&Xo>HYTCZ{Lo29`hUwjLz+o!zsX2^xx43$LR-zL>(U8 zpDGd86ry6PW?O?%HAmctjzGEZ0rSxIEU&DIaTAU>Y6%8nr#9MM%xmeBGr#H}spxXk ze^k++tCpjW3l%I`i`Vb=I1m?MY+lW=rq!c}pL)A*yhd#HZC8r(wpPKh1OC9;DI}gf zaP>-Y3gS)eWo-up6i|#61NkVfhP~y;kk(bt$cg)zj}FHQIV8`j(m4XS{1$6m8^UA# zNE{Qal;k}Sn{1p_0j-B^&&a(at+sr&xTw+%H$K0mSfBloKJD8tmPocvc|TaU(nVh* z^F&o>x;sEQi|JHUBZV%}D0tP|89VWwIg>X}c~Wp9KL0LoHqd2g-DmK7o-y+ENuo;| zOW;9g`pFjBLj&HkS61L+wGF4<@qY{Q|HmBj8T0MLhV-&q@ zZhf=@jgu&JL(w9t%%7wV4STJRIw}HRRqA&JYuWpM5KjpZGr_=uP7%DbYzCC2dtwojC(OEjd5n{MDK+NS30f zmGk{%{@{%}m5CHl|C1e{hjWKqffSK6DBQ2`t>IYAf(23L0Tgh51wim<9wqkut+-P0VaFPC@D3x%W6S>aNRNXMTDqg08Qx;@LK@AmX9; zNN=U_`#%5pSh?NdmqQW3R8Sj*k-awc70MkaKq$9z%a9MAblW($?tP7v>)chbMxiG) zp9F`O1N4&qCM2wT($F;zux7j#*)p75`}4kq4nUPb^fN8dYh`5`{T(@Js1$8U$|K}p zc;z=ZXap;7VFquC!#6b$$?5{WHmDvVa;=`(s$_mzyqC6jxi0AsL<)MwGTysb1w&NB zQpe4qzMK~l{q-Jn(T;l(AQsQ>9;ioKM#N8E*=WbeU5Juhht`HgE2fKd1u~;Z?J=8f zVYzK>>aH_|YIQ^Xf`*XOYox`Gz+7?y`Jwc_&!M&-8!yUQ8xDXO1rY}5F;PAUa=gzf zt0GreJ@eb*t#-8XMzN2}{thB50u?m&9bn=kQW{rS#frV7bo zZS;bZ<553EmE7;DxoRvrY?$U2!fv-dP*ovQP)WBoA>lUK!(}(m=3?uT<41-y<30%auYnP9C|&;*5!3bsJaF^p+%gU z@Fhk~hmH|&yis-~HO354HbH80oYXlk&3`CIiC-32irR;HZjfz~E$Zwe;(_Ys%8`oi9;!a*WvLi{6G1+E+IR&XS%uQJ`M zu>#li#c}8X;+Fn36nMTQpER&R0OmvBU*PGq2sUT%-sdr&k&u+%AJG$#f>1hoODA@LM5S^N&yuWLS9s$&{m*F85wBc(wtFAG>V zjW%6KZd$9jUs7V0yc$=g`Xhxeubk7bU%Ek^+Z_L}*4F2Z=NIGyPStl`sOz;fOE-2mV+Z?5NA8FJTbRU6IP?)qVA=M(z^)J-RPuzk71QrN2t z>+g=}C6dU$@!-*`BYnov-wuP_M=o>Z(lbNYp!s=%h^_9?CjndK(VZ6@Nu6;t_nawT z@e$B<+(~glw90$3HuT=|&3O^dDPdqi&JE>rLSoTqDqV-6xPFn}LC=%dzO_}_K?4V0 z79P&DV(`uIq|e#Im+aS9U5`R1&rhnW&sL^od7uxTbEm>O+hroba2NjZJkVqNh!-Fa zZ;R?A^D{q99xQKR^#d$2?U3{SZn`e$HWIR203Eco*D6&ZyF6mX`JdJ}-!tXSG(%_1 zm95xcC1?+U4cCWQ1;!W9iC`pGO+Dr}i=uB_@icKl$OZX{W!tP34yFo`hEJQw&rp+5 z`7XP*YpY;b7k(aXY zXNm`@Vo?Wwzc?f-YUh)(sjXX^F5Kn4(U=Eaz5X&>CzVPqH-h|=RM8FvO0JLNu(X&V zGia~He_5B8agDjw`zSS!jN$O|VZu?T3gw$FRn7i9WlZ;t{p3G43{?J|?IN z2OSH{#T|nZd@vay8WRu`s76b>R?Hb&+agm476G&g;@78RhhxqmBu5oJ4n&Y0zfy6w z>@JZA#S(i)!hH9;5^<)0^$1A%2R{6ziy{#YDM zwKF{sDJ@CK_u<3+=~$Ul?vZGC{%M$uja9v1gcL=&)+QD85i6aI)mxR*rZ0cK-S}1% zzqFQG$lVk-e)jJ7={8C|hqs?otAYlpxdc_SJfu2~UHob#kSpa?a0p z!)1A$tA2+kRCj%TMyy1;65tzQdu6c|yd8;O+C<#x?7;&}`JLS!F^vEGmB-dJD0!Ci zYoBjC(nU!mst~o5YWl`2&&mg)CmD~t`EdM%hx6R67EUprdz0gSfgfonfrUVJWy9dR z%=gsd4vjR9`FE_NsUNm3I&@y5MJ^JvGjCIPZgncZLFIdjH=b`2HzIEW=8O64dWP-b zvlVtP8Jq4nsv%tRMPA zo%bE9H`!ELQ92o8IJ&P6tw2UfbH(`ZeHnp<43n-{d<>Gn>$Yn^1bRUV(mT7T^mp@r z9QhdV?4F7ortPnL=DJ@q%8Zyfb8b4+|Mn9%c^4HbP_tUkPNh0zX@{XQ>T@VOcCxMR ztjNn0zsLK5-Jm_$9S2b9`+h+s;etk=NN(_s{4_f+IjHw0^JqAS zURj*C^Gxl~(FHG2dSL2xBNn6VqQY{eKG4q=n|S}|@b>{%S9Oin;HTZXbW8bDe6!B= z-|J&&;rZwMLJXU2lO8Q!+h@bmYv`iUo>1ybB)4~?{6Vb;EY=y;gC19(p`E$6WB|5R zTSin{dW%xl{;()$HLX=X7M7k+Z-cN!H!?%EdQwqxB$_H9`Cm1ojOKwAuyYiK>7{JD8@Nm!UuTdh2yjdFCZxh&T8Q`JJK-x z%PMS)|51SW#e+H7dX07ATEdoU>YTk0lx_E~kf{{L)MYPK3-`O1U9Z+(dkuX})twai zXh?xKg*OuYU{WPBZ|!qfUKgMsWOVM)dp!&NBkP9O$YH`o!J|!0y|TU!yc_U1c*_P1 zO5hDbR*CjJ-H#8Q>{xBRR#`w3JKt*>MZ=y&VIP3e|C{~&vnYd8%+veVpr-Ua9i2Md z;G#|AU7kGG?C*c%$Efim+uQ(A@>-v2zqNOCBlF8ZKWXdSJQ94pvcEcVN*&R{@=gs> zO2Rr5Sq2JBITX^!}V+OX|gWFW~Geshq6M%U1f{>y&P`M9G&`(YmUq{{k04;z+>)>rwqp= zsWOd!&dT@Etb>7HPgw1)OM9{u?KbOo@nMVIBmyNU*5fh$^l}L*G`IWmGyh~KaD^nj za`e+-?GPvt&?vdZap^m5@LI6CjGXFADjrEC-tCar{8!3J-F&8Tua|Y7Q5+)|lAIl* z=3`B`Ut8#dt#&ANX)-SP(rULQBu_GeCx4mPWgSv%_^8fT1n}fO`4JR8 zA@)?+&QPbL?^QX$o8n1THJ(b`BI~*;jA$Bf^zks&19l-6Ac-eW4OW=D#?34^gE1EB z>;LqTPUP0PMdVtiILeDa-8U2y79-^jIwB@olc{1CooJWwe7{XU^(Vm;^tqgE=mHPC z8;bdys*dc=#q+z29c_|#@ljYWo0sC4|4sh-yN>rQV2N|?3(D>%;=C^j0TIDd@w@1ZzV31m)?ECDm{q(IJNG-f2dy0E_vkJV8ID>{vWNOzO{$pj}kMHg2Hdx?EkEc;dpY9sG~I zz&6P<2$RolXbh8HY`ri+KR%feTBBH0hOT#FH3=N3*`~DM4wlI_K$+$Di8Z;6V+~bs zmKg}F?8`Sck(M>RYtXEahpb)FTO}0d=B_{Cm`}LUt~Qe4Ig3Cg1)!$ zr{nQI4&dmU;Z7?UXXWx#HX|YI6ggIimbs6R=WN1n$ZRgvRYtIWa816+4--Fp<4 zi0ZJdjcMS)P=nprp>3q=ZEvx5WVg zkeTQepai9-Tmork9*#mRw)*W|-A?>Zt`F+3s00L;tEd< z;hAAtG72D|KO4CkD^okr0s8XqkSslOr=kg!0=J9Q-P-)UjvjU=>NPOF0C7x6k5fXC z2RU-u4B-K|dNq<31-K!X8dYME*pqPHs$QG+|{LB;0Cmv82TUxisZ zBVIWyYH7>r>5%L-dvRKAB)W3(MUMWee8nkTvHiDDGsjNBxRn+4bCOw@Ime*X31vN?G_w?4i20(@6Knhr2WZsB+Ykrp(z8ld~% z-D#ANN}`(aHQIXG@m#V%>JpBe_)+`?;E_uT+k^nQojwgB2+5ylI@#@b2rEu%DbC^7 zss{aDzPM&1EOiTPLGvH|^)uhn)7JeEArHX>G5$#qn1P4 zE^qJG`@JqeQ=jFqE%-!tfD8z_XsOi@SIC!MW-tNW zfmjMrj%EenH&R#r^w-mHFAMjnsP!I@t}ePRmgvR-QWKm4pwpLKOk~Ef!dVc%C$mS8Vosxg|EnGnFb6uAa7nM0$@ihIK1RdBKA_=`BHE5=7hc=d`J zW3}#(S_W2tZf5uh?ABN};ETzK8PiZY@LMyU9-d}5U@L-h}A? zD^tR4@nn|nr)8 zP1=nhrxS~BF!snS1C2&{F=Q?Jq-&gzNhCbJbRsV{JKrXI%Mfk=nlGsrCVx%Z3v>wu z>TckX9%r~2?F*}P@&wT0+~-3X7B(4ow8WotSdoX2#l8N*y@f1tuDEftv)2SWCA^w{ z$%LQD*x7%(e*GHZrcSG#w3rniwdLE8zv|w1wvIi)kwvPo?h_+CzZ=(e)%*usalv1f zJ*sTfRp>Yz=eSn149&lTc+O7Am&9^*`-U8@i?r=!IZStW9W-wG(34w)2i0>rR-bF= z&fREUM%5t_wg&b+*ky10Y&Qw5 zg9|->=*0Hcf#N58mWVd)!vFnHJE#A+%;c8#izrV77ze>VGbhJrL zAB|`6nOYe4PMei~m##)-=HuQlBF-|&Z@g#909{LmX=#l5{7h)(Y`NAwnQmjub4$}t z=@XcP6CS%Nz-e=<&oSC3@%JPy?;e-lM>xN+X1Gx|TGFNcw7=PQ*usw95Qt%&H{3Z^ zU+Cu_zt;FD7rk+J-8y}D72=Q0<9GI`2qq5U1Wn!kYx*rqsx*5I!^skNhWYFjh{%GA z)c9Zxlt*ECz?=!W6^+^v8L8$(W=d`*VPNnMlm$y|_Nyfpc-Ys2QpEdVf5+r%lzSy|ior^TZ`MadNgl2I* zb;vs|paD4|`68{{Rkhb0*VmWc{Lq7v7-yS}<)(7`D4o0A53uVeybO@&$beiQF1E1m z3ovdBR>WRM`FP39dm(KuqwkXThXv=$obIGyfx)+d?>|)kD$xX+XHO1;-ml1;Uz|@X4 zGF1>eQZ@0`AHQat`&gv_z|8Ue_f-~G7MYVAvn{_=ml5Y9=$nAxzHo~8Xa36lzg1Jp zGBI)qiwF|>7}hQJbeux|0h*|x+FD1_IgKK7#iFDr!gvvKUA~-5zBC81netk_Ci6;Z zGA=zM0$-hUcizcPIsa)rz%uP!@g?lA0rBl6g)u7SA>|?=rp1^)*v(gP=sAflqjlAT zOtjp@0EhGmwe3=BvNsLPRgMEfeuu1<0c)?N1XpiOIWYLr89v+*%JByczA3HU=XihK zuQCv2W#N4|fi+1#X&)UmwPe~QO|eFp7L@Q}jK_C%z%OnZfcXs8LMBcNth&AG1)T^z z4GNsnxRUNz+nCNC5_v)@Cy&e9I4fo24& zwRy~X1`?~L{Mf6w;qgT0Yh3SQNcY_IOA8H-vwJx1!*IqO&=u(S7rcKqC_1X?O6s@3 zHh72?c%4us2(sU-+hv~%$;mj@j3yeY>QP8)+!u=Pd=XVjB*IZ?X=vFI*#KhE93T9T z;7|9r-&zi)VtER1z4UR!24{fnzQ1{Kn+Jy9!)uJoW({LL0 z_#qd>1z7HK5_h@gkA(ZXcr}DbQ@PNrEFc-6GN+ITFHM8;)IC1~*5KNqPFLd3VP)7i z3Z@0AHe_Zs7E=3tPYI_xahU)mo;Sf3B|^oR(e$xE;Q-ZJL?xa7DZ(kZc-M=~>^H78t?&~xly_1nl0 zg_wtC(5_*}n{oFaj29ymZ!6Xpic13S*=VdRztWH5GVJE9Kd_-^sHO8kf<~oISJcL9Lrkff~4DSH2PjFkifDGe%U3^}y<|0#wvzzM6Q> zA+hvqTdh~MESbVH5C396$B9Shi}WF^clW{~_k)Azk3%Ziq z|6RU{7IRBKR1K8;Lw2$g8f8`qnsexGg8DcRV?um~8@&u)`8h@O0rJ8J#h$YQ@F%^)Mf%*N@IH=893IiV!xy{BD|osxQT>E+g00W=v(>(F*l?)8fyKr2UX5Mv zsG(@y#{82)K~2j*gD}2smN(XPe@wMyrqrO=i0EbQ$%j({fXGCw?W^T+gsl}z`SHbw zb+3DKqzg+_T;(4IxW?{wyOY*4((x|pmfPt6=7?oIUPig&k&~Np2b>%8 zKG=>xHg$NP^cb;~=84+h6dcr>>4?@sXya|7l&A+xJWH=4d<4c`>=w@qCc{xqd0dUD z?xafqkvq&-b{F#NwW5jH`KeqH>=pS;6RG+j?6b!$qB2daB0@Gclcvmxw98)<)C%bj zuq9Z%-S#v~6JuG`sinYdH9FhwdsFf;zR#HTi|81yxS&sV4Lu(UlI6-fsNc)obI&_8 zYm*b)5iX5dT+?zpRz#g<^@eYsUwurM0t4zE@c@c8JnOuJ$6u8fY>J$n-jLljME@ZO zD;O8VDIdoh*!l9L62%zDJ=(T~Y@uX;ZypElgX_I^p$kG0JL70&)u5-)LhIrR=Siak zK7?E6S&$q1>m3#%EuRjO_p9Q7l;#1VNb6kK7D>dUPLAXsO+uO_;&*O!{vN=QrE4gO z$rv}aXmuT2NXOgXL>ZCR8&N~Y7aRkKH~GIw3j*>@6v>;e)*Fqzh6c%IdMS@#9vp^{ z4z%4#7o!vO8#VURS{wfJlT?>Uf!!jG=_>813eg|2B7YCArP-K6gOglFSZsKH;uX`} zHcq~&_iL6F#$>?YqwTjX$}=H9Vkci{doWZz#m}4FDuW|a!ApY%RfnjY91<9M%X3!fW->qbL{p@Pye;Z^{p-2QHGTSMtQ!-fDB6-o9Dx%4RBmpkLq$%Dr& z24l}hMCiVuCGAZeH=paJFfOoYpq0DrSzyvuKQ1)!5TRCara9-7pEc3J^Ou&$VxIoQkmDojiFY1_BH5^XqnBUx z2hl4#UyPZ*Q_i-&X5!NqLG#Iel)g0`9Kv=tWSc1u>vi7)|3r%W*4_vjzC7R`njAzP zI@UsnHzlm@C_Tr?_bY1G>3L<>?Hv;cFo;-Vs7b0o(`h!x#D`0BN}DY zJ6ol8nZtJ)a2kP5alI5toH|x*1X7CoO|$ofv;fsRJy!h>^}Bn>th3HNS>>CIY_3U>1W0I(ZRoG>^Rol ze_^c6YLoTsg@jWx*Cif=_78I+6uHa8x-8S!>K6IjL6h;w732PXXU~lA>aKFMq%^To zIpT7VB=Ou$w_{-Q@HwMb86ubF?8)2&ezvy#@hqr+^T!#sD24HpCpQwv z|58;uA1t%((yw<64C%3<5oR|Ix{#SIAuvWMjT*>VxI@#r{CCmzudEW<{9>3F41Q8@ z&OxV(^CADIF5=lU)aZGnt6CJ&O4?f<3|nT0(E@BnjlBjxFEi}F$adFHo+1mXu|SvC zy)0s5w&|N+0XY>s$GiCBZY*nY(8kRZ{J3y3GkM}uheqSYqjzIDjoNDQ0OS$*M4W-` zWx;uAJUs?}`P|F=z!GYmf~9^7#{D|Cm{vGS@|J+VuSpm#q~^YUM-R6B zyZm*b>HQ`3>$+f^Ij&k@BIFF@i_a`@$@yt3-Y@(?M8Ezgf`?5eT_fGd=V_(1tB3tA zzA;|=r#$dlY#aje)1JQy`;loJG#5OgNrlF~yaEWp4^o+30cb@n;c|W`25C2i9;9PGX?+SP-s1UZ2Yr-u^C$461d?DcdT9dG?Cb?sk^&LK_smYSD{#I2-RPRggB_|DHz~z`LzO#$x~g;{&dCuF7u=n@y31$*9FgR~(I2QrZ%e6ahIDL?MSl zF|OBfp`q*5Y{p+Btwce*4YUW4=@XTF_vlDI z&&y~cd$-Smgz>5fOB|8QWcl;K_~v~uH{QnzD?g3=d+LEtajlC3dG*sHVfDx+weJ(` z{fs;L7tQVRNT)D-XoC>;)hd(L*YS zuvFQV$_*ris|Cvx+w)yPvhBy7~~AnHgVIDKEu^-y#rAyqP^acWQ+f2q69=M0)C zE+o`%c*T!Q2`bNtU_qpX%QpA}{CJK1*X){sL8qmDRn1x>!#2^_7pe6SOd(9ej~IkJ zV%RB`{gw*Uq*0k%bSnKqnZpANiLW37jFc8lWE75$qiH)hhH2G-c1Lh$MezFL9^yV9 z0S>g{QKW{fIVV@HY#_kOa}`=;YPpD`i#jc@iz|{A$-Dj{p&ry=k`>mk+l_!L;UhfB3;gCCo1bgF65Vw@|5hiT7J@-Gz01hO zuNQ+xy*ROa0}!?1L!p8CZedHfEB7rFoJ#HYNa<)MamCarjYMXGb()I~A*3mX^guO^ z9DSjwf7xYm?l`pJT1rwZ1tQ`vgK0C*sCPz0aasuhAP`K!3|GF4AX6D2?rjW^52B(_ z>(@gX`xTyxUw~UdlRy`$j#O)xGoLo&2FAWgv+WUTpaLRWt^U@G?I<+;6u+%a#L%Sn zDjrms!heJX8^8Z#El z-E23|+MlvkAMhE`(Q^8Uic`?qGpaw446CQ3DBqrIoT!?o)Il+Ej#r&SU*jj9EmUs; z!xtsfd~ILyuY1McII`T|vrIR?FobgE*_UGIrj_J{R5j5HoPPKy+KlRcDhbIMyp{=J zfvmnA4_;I@CLTarE7gaH`=iX@O1E1TeXM}QwUp^f_Y%8LC^V7fu3Vb_Odp22g%F~- z{rC*{NSgNQ9$ock2_I@Z+_yE}&71y2zt=W{DSdiVqS1@Ogo(!2sVkg&RY=@T9BqQUK@!6Dl{5t9g+AuERIXx-fy0RUfbR{}9Bj6{>z zu4G9zfw7zk_ARUkvr%{O@+M7xD~~Hj{8}3sgO&AuRp5K|zgcUoME1b26Wv_OknaCdjtLU9Q0P9Rv2;C^}D``z!yeeUd; z%$YfVGiUZ%dr9xPQ{olnA2aHufhgdm$oAVO#VfZvoR)>m3;Ov4y}JxyWfYCf#Q7R& zcJ>9B>Fpqxi_B$ew-fm43q=fTy!TkKBa0lZt1vHqK*Fvn%9T;z*Eui|Ad%6I3=v{v z8M!mcvRbFSxMb+H#ta{&WGrkp^0_87!0M2QZ~4-NYg&6$n>`=vu3HGjFk*^xg`0Ls zKM_)jv>Vx>fu{NFkbG^*eE8Dt@R(XzvgUhjSny%*cqTgtK*HN2TquI0yST*}MwA;AU+#|eS(`80bz3>%9f>w2k= z0w1YvqeZPu+A98*(i@qZkE}yHgc>hz(m0o!UOBlZkO1^E)%8nc6y?a_1ZTzG zLvE*6y881`u#sf|EThW$`HA0fa?SM;9eylxUB7ydZ=tgb&Zwy{aJ(A|-+fG6zo!^y zS`n>g`J5zu>UXm3vmCwdtK>7bW6>Czxi)Wz7vl^6S)`|Q-w?gBcvUxWLh&IgJ7&a5 zv|oLiy7@8i>MD)hTI}}faQTp3ObB%BHRJO5&jQIrsd4$(E7$KT(4zMqSIvwawHefI z-wchoia%-Y6hVx3ULlQ$h&}$zaqk(ogAbppSTWLoQKha{oDcm3da)ImVERKmxc_n( znG_Q+qSz^c+(*=(s)<7>qL|UBVW}Wuk)TmmdG(+NWJT9v7YUivsLf160D-L7)b$Qg zC8l9US`__2!3R5vBwxWoG<9?*S6l4L%7f;xqD*S7scKjzBuT)Kw^ z%r-TAj6?W)uohB?cqaN*LJ^0Ze?N0@fv#QPcucAFoteT+=> zC7;%~J>Ug$23JGe9VDI9ee9Q_M<%aE4b%(2KjLatc5F%dLQ?!yCQ?2x5*5E4SU}T171E!22G3Jmn9c3kLe z?U|vXx%x|^KqE;r=Gmb)7;7F8z)Otr0)y_HlayfFoioy+C5+6WPr@wV39@C~ALb&| zW{g)O{oT(uM;9%%ee_LRrzr<^&CxWnUuksa9CjXPfF_VV1R-&w2k(Iv zep(+2*cLvfs+;lv#yBr`R?+Ti!V#%XM&9}GMk90c0zGF{$PGmDLKexlo_R*weawQd zojG&?)su60QDmzEXE<1q9x4#b9znKackg{bu=igh;7>Qvv%X!#0bn#hF+drpK_dY2 z2t=nRR`vGpES@&?E#?Hv41`9}`MI0ctEVfcw^6L93n%Oj7!R(;#p(y=6$ zgv!%r=%XiNGVFu4M4Mdk_D84A@=W!`Hwiu9*4M}0jgRmXZ@0FCpy_2DavEU1JGEL+ zR`cN*N~}}4UQ_nMUg@n{?oV{PuK2xmEdy6+QUToP=MfCCbuXLC_v{l1}#Dlu=5`%AG$E{j>Ju0-%;NLK6lru%q_-tsNd zKUkK3+}F8j66(e2weup628(OdsjX!m6Lpys=iW=5D264`rj#A?+YB*R0mSEFy73=O zv$Zv+-lPgOhnsYblyB;Stp@7@ma-$zN3w~agl?*ORC8H z_;hZWOs3RNEhV5&^ zA}}qJs`5MJEna83?ddkbT}Lb4KH9c1VsxUi%SAM{x?b&-%K#qo7@4ejoSKtOT(6^!BJUaF;l*^6 zS3zsY64QFaX-WG>G8E12ZzoO*=1CagiB?melaXRWzy$>W(1Ij2wcW zdh)Vne7q0?zkrMDXDddY@8h{x(ty;k|{&J}MLY$Mbt67$XCx z;&hK0qrK^02l7j-(HwIxCiwR9BGXm*D3Nz$eo)j$8oJkeTEA=Bi0`sk^Su-;NA7A-G=vylT{V0)3TYo9mu zDwFt@awkVuo|i}PH(Iaq4t`i+rUZlw*{%W{&9ftsDZ;OE$FlP$;Jk{{b5z6Z&+!74 zjaU*E@gz=u_xb$Q!mGUP9kvg^{?NP4eByQO$YYG70!nt?a>Z2)L!CA*5aMiAu$IHP zP*GgR@}^8lpP{P+YIx!`2XAYF1biQXh5jfXVJZ9Fc^_G3PxL|GcSuhpS{Phfd);Iv z3JGDloiQAoUl=D`FrCNJ3B{v~s7TxBnD%!n2xc9Ncx^~AysM+Krlx`p9(Zb~s%yX| z9581>t(h@3B3~5Qb%~S9gbmKiTCAI9oaW)R)`nk=nF+2tp!*o`_6%C^gb!FQHeC7+ zkHA7s`g!DEx*w){r4-0Now7h|p2Q@)#4U)FTc>R{!QSrx?H^qcb8Ybt7c(zA=>I*A zzOvcv(gPSA8Gruw`ns)&;sn~@;rxe{?-GKVkqL-IV{~KPXL2Lcxn}wk40!7P;Xs7^+v4n9TM zg1dH3&N^7&U3cqZb9@e|b{2NaQ_9PYEpTKWZ$wM5)L1v+?SFt0voN=iKtprk_FS5l`1_@l9XwvzzbMf~%JnWrDuZ8;TuWns3N8 zrO&Hn%b0X})Nt%>u0Rbh!VyB8C$fL}RD!S27-r$R<8xu}8Lc+*uU?|AUbiZ&I7Dz@ zBnkImekgf6AW5metsZHbz~%c!L{Lt9Chh~~t#s(!i7#U9YU9Me{~+(2nTae8?>MGt zv>CVHL!N}WA^+5rV$hV%U%sDiu)i-YeME(^4TufxJOVIMCX%WKk-VggD}h(Nkxjj6 z(3N!)MG?YYSC1w1NlIJ}@zEje&~JQ@MdOJ;4gJF>0qYmZLhUD)auOu5UiDe^#Az~G zlAUOGOep=|tWMFTZFft}{gDkbd>JIcMxnofLsm3C21(v17VUr!+gFu8KwKVfn8>J{ zv6FKw@vJ#2X$g^Bb8A?9%~kA1vsD*A{g_?{CN>~_F9~8*6qhwP%|3Qw z1k*@qaB*Rw=nPb6ga{+L z6xl2#*MiItRJbw5h=%SZc0Qxc;|_PV70taFo$J_Z0_Y$(vdbHxU)x4Dy=HX>T6*_ z0wE4Dnor68-afKFDW@X#=!&`QyR+Z+i%&u%T%b=sro6;f+2Go*=YgSz<(y?-N|5&4 zn}fMUZXn;5DFNpC+qtx|faciZK>=gQP{EHl0kj%ySWH9ZQ*+ax$)qvPgD}(K9v*m4 zEzw4I8Tf?j=RX>7UD=URt@*<;Ov|uy7CZs-G^I?!aRhcCgn0&y1yQEoHB{i5Xx^yD zopPT7o^(wUiwY;0Q@mex%k2pM5#8_y?a!fZ8)n@ou@#UZ(O6Fda!(4oMOl8=1QtI_ z|MhT+`!(>pDuu_xc!cI)OnLD)^0HTGdu(sb(k&KYSVUldwSgl+!tqSnvGBZ^ znRg7RCT(z9c)WP=NrPzK5v-jhuc$NF`*EWuxE-|@!*AQOTC99ze4>9=>iu1chvE8L zd5>5UY1uSOXB4ZXI2m)C@>j-`qIKY!JOqc}?Wq^Lon3A_v?J8x-sz=UyLxL1%YXLW zL1HI_k`XuME7cr0arZyZ*vwhI?HCp+z)?Mr%LT3knlOLdlALIoXOtBooFnUAG|vEe zs8dnBD@9yN5?WY!dGg=ro;`5;%YX1adutB&J3hLHxqo{76hBx5RJAAU%Ivgc zZmElfFnsoUk(X-RL@Zb+J~d4hUioj78pHFkw}FN2TkW%NOKFuD$-E4RRWkLLG+_y~ z^Tq`@@~~{>FDEKnNIXhPhj;V9!d~#z-}}9VvB)R46@~7aw~Wjgtg^=Sd95OnM6Z`L zl=qJ$invKTbb5`knF{NSREL<1z(H;lc~b&>;WJ|_Qg)>@L5YsC**PZFC`t%h9YsU!wh={p z4YgygsVBk4oRf_|33c)hbvaT78)WAoJQS;AvhvrT5x1DlagBm~F`FTvtj35My&pAE zR?yeo$2WTYg>2JvWJg7}n!h-Ul?YTxeq{YBu?#L;EhZM7N@?7-WY{yk zozjY}sSU=6w!=^FTf@`^t{dE$5Kv06dOl~^Y*0bb6)o#*mw)^8qHZlbhbK_lrhD(9 z(a^3Wpnh(`CV2dYd0-e=f^NMKZruj3_G^&(guxUqUWp_Qa=&3y&}t>i1p{i9EOR9(;ZBdQMoc8 zJmg8#`4TlmSUTL^UvgRM;X8d@Jn;j=w&@|4+N=_DaLWjVEOd|o$f|;hXs1;O+%wzq zuhjA1GX*kqoaL>36ZB_}yCytPlyUBHsnY5!4PYGsmTjER&etfp(V9`{CCP2wWjR-v@r|JJ%D<|krFB8Qv0-h;%0>a4Zs(e-tp9m5$sC^wDm)h1JkKISun#!|$9M8x2 zo3id(vV0~R{Qrj{eUSgq{bn5Rx^lF(#%X?&Xwp;)A?lwdU?>gC=mHqJvhL6P?v-bx zVqY24YwX9WAY>lV-0FL)I*}7s+#yinn$Fqg-%6ni_~*8J`mab>`B0%{6VolLPr$u} z15{8a9hxTih<4HNic)Rjz1Oy8oLi_01d0w(0e$wI)JYobPnb9EB!H==>rxzw&+_MM z$g1`M7~B@N&S%c(M5+q}ybD++^k%!s@NVcSbi`equs=1u#2irS4KqZkE~6=BT*QKm z@+Tx108b1Id;@akW;F^+2a4ROWfV3$`FwxhlxSxMHG`kLv{-Crw+zi{^#;ufD2 zP@)ORP6Kl5-icWKVm%LABTa0Urfbf0%_u;@vq3(PhuJ!_fy>zihEPJqfD|Wld54CK zSEZBS8Idu-01L~Gd`=EYYJG4kVR;}yZJ6r=0kDG3>szpiE$pTuxB}hnKU`P^H zA}8XpB3NQP;}OVz*)lmNcZ6)X0#*7Mb=kv*$(M>2SD`i_h*lB^SOJrY3Mg@UIkz90 zs_-zIWmIoAuzHZ6eh+m(rVC5;nfgu@rDyjM4=T`F@Q?nvd0fm!${bo?fUMB5H%re@ zEN*O#B0eeXYwNQllLX?NAfV$XkT*f(bElSXN&t}8fCo$rf`-VRMEMC~w+#Vk0@Hf? zb+w_qWD=_Rp6YnmKPw|`QQl~{ql?V==bBB>R1ukC?AGu7(8i}B*qJ{7;kX_`vT+5)%8d-yY*UzglwUTzZpD`Yos?s3=|TBrh<$H zXbP0e-iPS;i3`OvKzs+J>2eI6zkNuIJM*g4MkGF|%O@UlF6t2vaj-lawc&4R zgf>azOzRgS-9zzOvbl3D@=`YX_)lC3N`^PowsLzz+yT86cMWgkGD9WD^J7QWFr)Q# zx*FL-b5@cA+A}-JFwIs9A@xl_oO}xQY|6Vq9Q7&(S$xq4)wbur`{g0VjFrlc z-S?Rvc_-~8ld6VtvP%h*>z5n4gLX{a?Zam#g=P~f5}qnW$y$h{wdAnfKCYa?1bkp2y|9Il!bG4O_ zTIEOR)Vz0-#yO02cfPnzP(*OMtG#7s?rsArkaFLTA%GSb-iG(e$-Il&`<^a0^%=_< z+g2XJ17LNVC}4w*5M-?>L^;35K^(jpA;=X-{SZ?dzEayE9nXyOB%M7ts0;idXr;7w zvjvVzKsWoxY<@AfbRY~$%jSVgi6%9zA`=eg*}7H!Yx!x)GO~sxj)}5>w`AYp{klTs z2ggdhmW~7|#=PyFOiSBCrcyOkhEX^YABWwWjb#1Z_s%gghe!MLbjYnX*aPg=*}s=A z!)e~-b8P{UiL@Qn92|3fon+?-YLDr?!~Ak#bw&2+EfYhe;$3bCfLEaU50?ZPqlrd= zR#XPHO$LeyfH9eg0DzK13OV+>pS}}o>9SN~@L{GZ3kjU zhH%gTIu4PzDH_TQAvi{px#9Mp z=MIeqv<_mFyhuk(9J5!xX;EGcYF#=&+O9@r?tG|BWK2S`B$>mLVMI6VmlHVHw^~-V zO{+oivC-iRo_gO*ZldJj;+%y#f3F`6HG35%*GW zjlu)@hb45~`_OHFM67eWQ|jTP3BxBOhSL>S8`Qu|2Mg*u77l?5kv@6iXp!?TX4(Ds zwr|230~m4~=sGqkd|&?MElAJGm|OwfpWNPL@ZGX{thAbhc)^X3r=<93_}r)wE#~CB z0=(=%F1n~YtyX-|VMAPmjQ{Y2`!DKdCQ3E2GP}vIm%kfzG}C}75#*lNlz;iKN}cm6 zB^mv!*J+v}fd}5J;HZ)VnKiQcbeFN#IYQri3uji<4?y8>SEoFW? zvv=&-bd)#9j)>jW{3eN1!|1T6RkEsMoGGikQ~ul|I(-Pw6;aOqT;(Ml;{t^kr8Vr* zk-w*YiUpgHF2~`{w6MDzQ|_0=8BGQ{3@=d!7pq&;gz7_$W183!GTj8&A1J2-Q8AX_ zSuM0hK3P8Oplx0)1Ch0-)Td7hz}(dlpZ9!|Hu}aCNrqk!o~xgHlV@}TL2bb0YA5CQ zHD%44F8{7A7~jf^v9wq^OqwEpTh}qjU9fPv`^}~N>uo-f<##IHk3R~=UW%NE%}fc& zwnf|ed4}zV<@9Z3YO5WS@8AxMk{=y1SG@v?I^lZ!HC%snee8{FAk^LNf3ww3 z_1nd|9b|$pzH(+6Z2jITG9S9hJOhryz(T!ewhEJ zOqEUr;yHZ#MZhrv>LS>TMNt{fFq;#)Eo%W*mZNQP4I`awwHm>qf7|gTU!c;toEwXg zDC$OvW-nyGn7dby3JlVdHv2~gX~APh=Ez7k?fcSAHoX6VU{Hw&9gl}n#wmH*u~wAQ zaW1n~AiU6t;@>`mH}6%y$S_L!-}}_V9(8tQF3>L%@Odi*V+^QNVF3M2j(_03z;2EO zaFK=JE(}{WkRxo5?;C^DsCr=%gfA6@BG4PbE{s-%U=Pb3F+ypKcEFT)150`seC|Vo z|2`i%92{`p&W_{nDV|aC0qVm7Xp}$MJo{tGg6!=T&LcScv#h39k|IdldYPzs7?f9> z1@cJtWGRvaEQ^wTyFX2kWl5hVyi&tM`XD#^rGSFkiHdu7{-vy$_%UtkmqL0ONBo3S z+|O(^Hi^p0B-#Kjg}H-;eu)U~ML@&5DGd%nIV?ZQn>pT~QuAUapg8%^&>OPCylOxq zPM-!u>4`x-)~RMx8jO^!FHaFeH~C+ZugEUu`4g-C`~GENi;pW|nRF==C!FBkSv7nq`7wCRgm(zd>D+ zqIPZ!j1ox-hh!*x6DNjxJ!%}EX{z@-Bf0m?Xl4d0MV|+o45mA8Q_q*go`X5+pU86%M*;Ir5p=74DnHN|PrsjIb?o`DjOuugQgAJU5Ei!2lol**e`6--ZOjVb`I*Alb z=aQ#)G$L$mU+U{df*2>EHCYC!i?A}&N|1qP4jT&pBI6<~+wF8zfv3R~@a22vtb^!) z9pTq6y_`(kR}I}&fc?y*ln;I9j<5X2pr4T9YcYrGGAsUVs67>)Q#g=$P~1o0pMGsX z5fnvzTo^*;1j-o52iukb^wMETcf1c?l~k#tv<7Yrk0fyu`B8B?ks_DtHq7x3@=^}; z-`fXO?r>A-wZ}ubyv#$JhPkicH$sgvR2rIwf)}o%+*Hfau8vNz0Kt`PjWtY4%!r4Z zGLd1#uDQzdvbIWgq2ISZgN((%*M+eh(FHo)4#~r}*sZ3SZ{(h88w}%}V3X_H#f_6F@1#{?Z1!Z`{_SWWZ?+*1u)k+ZQ_MbA|Jg zi|qVTAGi?Lu$pU5a_`3?>3~_k9_oJ7hiMt^EMoBxq-?gpHBqP1GRv-)sc#$0YW~2Q z0?tB>Y`bnJh0fE*6w$*@$2w{1Lx7s@vlk|l*_6JKJq zEEZp(H~94Zu5FP`WllROMechiN!rmBQe$H{)W_~fGjkE4dbcBVgRQ4~lYS;L?`|;_ zd$N_kM80sg@l5E+G0b~6+L5RvJW#8P$)#iXs=RPL!KQH%lMQ@Yv~DL>n{M)*U_HFQ zJ_gJDU*5bm!I5Xvv-`^)`F{@u4i?dGCsu2K^5IQ*)=l^>tSVJm_^j_?0A8ir2|j$e z(0f|Rig$k@F~}uybniPuIZP>loRr@$F>DHa9OloCSEi!)G+sLpit<@?q$7yFH{dIV#qaTKfo3LdcFv0Xe2@i&4s=?AFGq5MOTYld@&L4%%2Q$V-U)l3d031> z^b|Vee8n)$(Xiyd2Y&wWb`Vg$%V%dl?PR$*(Sr<-emyfazURY_r6YRxS#DxeNc@u z8vx(c{SMZ|fZ+~|?6m{zhNs4zYMoIGF4f*6!+%-klhK;KR1^E(vKZF%lM;?j@0Zr; z4F2o**+NQ5Qe0~n3~pj`N|x2AROsd8W;kajCqpwev3C;I(6p!nC2!+)Ig86^OPzqV z4Sr~gW~8F?7Nz|7cx^NIx43M7OiD*5%tzTW#J>?Zm$*~wN%SHDwF+qgQ!<#J^dRgj03hwBVc zUnhrt9^SUO6$&aygH`|88)?oj7=H#44hsKxwGn7{(K_w`rwt8LnMgNHH4Sm#{lk@9 zbs#wsA4>nFL9Yx%p-iN%j>%Bpu&-?GxTP?RJHH*mxE|q7wMsOaApLua1v|eQRiZd)2`Jg1iM1#%A~*Z3>W3vu|iUcR|r|gqdmrS3oSH7ZGCu! zbasm@^8If?xt8`XKYP+V6m#p4M$a)P^zi4SRqEOj_?vjaxpKW9D6=kBI(8o88g;%2 znax^Gws+n>==CiFE)p%W0+YRie2r^&H^s}UD!-MvK1xdB1Y?C&U(}`E!Maf`R@Oor@k>?Pkg!=dMnO?B^SlD0_BHNqhGu=IBp4;U@PZWZP=b$nX5mY8;?LZM&~IzJ1%?!94lCRJ*%r z8Xnj$E&w|)Ir@1!gTAyUB>o;u6IF5-aal+Ve1B`Hg00xZey(lkkA^lD@3QkY5I4O* z^pIjW|B-ih2XeSe;)yTT%R5l4gvF6_W`ZT4bvOwb?J^_?aG}g8zWU%-)N;6$?T1cMb%N6w2*` zW4IfqsgBj?oVg`!$?xw!$uOP^a?&N{zwjGnhfB;F{TP>b`on!6;N;ui0B%(X=7gZ-XC1ULe z(PIvv?+H(?4#;=xnYtVGfY>hteF~-pGF+xLxtI{Qn?E9V6(nLreaDx#%+q z7AyPsfLeiucF`c+xJ8EMc%R2rmoj;k1B&pwZn{@d=gz;{a7&d5G8Wi}3WKfC#L<(b z8R1-Sd%Trh3-<)lyIVxpu3PIawlNE+MzkH^2EWb?KJyGAW`cVuO=d8dkSZp6ne)VC zU`pwVGqji=98ky<1eVJOFhf{14my9RGBYw@2ppsPM_MXehL;+(Mr;K&)ShX;Vv}_9cWAub%Tj z(rcs%F>y;r8F=~CEPvW@B`u1zz5q&x@6`P%ARP?&?Bk6khvZPAR>Xw=wssH2C*y#6 zwuEd#;VUe!^8M>W=j|x6DlBI&5x{seuQT`WsI`cArf*s^+@_`x-)8Xv#v%_`x_dW3 z+3JV-@ik`G2n{P! zQBoOck$0GzEgz_Kv{PF^g-1P>{!fL;#hYfYfdXSMS-#qUx^1ousGbSeFH?0rE|vVl z`f;<6JZ`;#rkzc$F{kKdEE@3!aL}(QUMy7%RZ!#hJo#nXvdqb!R(+m+InG^mwH-H$IlL*J@$Wj)e-IQ&ZMh;B?zGZ?lLosP!IS{DJY zv;X?JhwJjHj!~R`AAbn#A*j)7%4^0rfMs1S58BMxBihTpTGBojh7I=EQR3T+2Tw(j z$6qSA8Ml1!mT)-`AV3a^MM$@E4VWkjBjrP8sYHSMun1;y>@ zKiwD@@Gh76{aV%B|Q$frMZP&&6kN5^0(7D1-x`=1xV( z{1I7kTDR-RFJV!IvEQ->QIGJCBD*hc6a1D$Do+e@t7~oP)G5*f#44@p*uRc55&Fxi zu6GsTeTfccOgJACOp;!(w&vAuABrOT;}nzl#F}CuFUf(se11A>ypGta%fqSc9QL-8 zobN6lFJ@J4Db{@uPsWLf%wFn)oL@w(MqX@Tf1~Dq9p;UWrG>L0cMBRL@0T zx7apQuYEk`Hcbc@;qHWZt=~yM2}7@96ShlL3~Bgp^Vc}#w%w|{?1Y2^1nx_9A(M*A zA?ayrqow4EGo}>u2+|~9j5;<1DS4Q`?Usn5kcsHBh>#v)9Gg_q=l6Q6=$|NS3p{E- za;FnI3bNVqp;RCJQ9PHfu}LJvH{R5bAgzGiCRlnAO2)!L+BT@Ow19NIKna!wDeyDTKkd4mtA8e|A(~Tw)q{BK#X{xHw~L4>oYKPgA{oEo6w3IB(%O z@x17NP>27PdAq%+!I@xalw3ERNEs9w(w`gU&n4f}KFumI&fef1J!ARKJ09sow=x=d zCG@CyoZ~6KdNwktg`~?`Af7R79=ftK89|T2&qSts7-jPYOxHeU~;joD^#+xYq3{${Xk)wUfw~SkvqKs?w6gOv` z>m&U@R2Ce-u@hhskLGX}A0qQAz2CSX!q!^v)lDGAG~LG-Kq^#@F>{>twmQlwpw}sY zziL^L(iQV{bdsC4f3gE zO<5+`4h*Hcib%zxI*Q4Rc56j5daN@?J^}dJqYw3z1(8C6{F%GNc8ExdoxIfCR?YmJ zSoLtz@vpsebM_9X6a&Qi1iFM ze)$@ky56zBf|^_YZ8MqN9DjQyYr*N)ErkybPspy=eU&XG*j(^&(1wTYU5HpY!-o!K zZ`+W;BEBU5VkR}^n(tAE0=F54l0qd{#f2yf!!?wQf*)oHMl26(oAAp6P>?iK9h2xQ zO}Cq~fSnoTl0tUF-(gv6hS$S&%PmD2Gs;3Ueu>)v$`X zD&%(i&SM}vktBVIeZkAwXLG~X=S|E7{;_AZ$Y^HMS~SHg5hMjGu?IV?zsvGTjDDB@ zEE?z4*LPrbjX5Otl8Zz1)ZimAbPzZgIr+y+EUv#h7+&+b zQ$bEkFD=Xp@?AXc1!14gKbVrOueOU0HMENiL1VfQ%wUuT=JHeLbst)4$-qHBv>&wm zf`RVCvEjPK+hKUj*1%#O#Tt<)hvkCTV->F-@;klXJ$a>y5 zt#fmVdzoci=v`a$gnh^T*_Hnhp@D|qc3nKc|Dj^un^}(B+WV0OVrTI;&k8Ml{XAA^ zd6RV!!X4zy4lcJfy#MX8#LFSp;YZx&dH<-=WK$jbA`O297fJlipR{ao>{IKv!HwS} zxu6*5)B1Ly2!(Rz17$No!bD11B4Yh@aeev~*FE2;)!NBM~5Qz6= z|3>=%dwJ6&FV0AzTrS1C>FQL%6DXZw1gJ-uI*8cTQ2r8N(*g)w{7$1w_(;G=wMLY# z6E2RTKPe%I?rjp1eecJfKSmtb76flg9As}x_K-68!=aDKd0x0j_g$`;vk0knk%%rM+?i=MCY1z&9%ml@{ z>271~yN%4a`8~dv<>W={NlI}>X>&0b2@FTXAt5J!oolSP!&uz>tU=uPQH{R7wFvwR z&2{&XY5ukZ$Itpz5v%D4_&uZM3>rEj8{^<-mn;7ra&mZ7>HWdC^oPAkE>K2m;tu`0 zz!c>0a#LUd#e7si;BW-@fiuOZYQLqi9Vjeu#P~h(`>~(=*Ir{E3Oe7T24U~Hr;naW zuLA7r^lO7t>gA=xVv_%*m7oCL<AHpg)UTg)So3^>g=_BCM){zBvdg=#YvP+vDl$OM zdB2eymn9H5CSyeA7kT=|2wr6QZ4djhg|4=Ys5z_TM<^oc_n79dGSJwW#EEQt?*L{v||c5bKOEL`PV(2 z?z6;B7q4<4B2se)7?&0!Saop9sur}*#wC7dJw?k9|K~%6fgFC$nu?BtT<)cPMhEL> zgvzm5`HyoH6XnLHHOIGHel@u0nh&;$CvEURK78!#F(S>`wX(}9q;@ZI@nd7#XJ$q_ z`~R5X_=#<_9G}lb?vV+pWTKH|JsC1u;eA(r4$Ti=Z-u>1WIFqx%s!NvFM+G+NjC#0 zW$Xf!r!bl%?<{)^ZHBuY3ws-WLvPKt{i(WT$n#v$GIEyOUO%>X@0)@J>-*c2079>E zMZc(75+uKI5jUH*yT8-RHta%ekKG)8p!Yv>C%+~sL|5k7;=BlM=fl1tTQzw)cA3+L zpeKKe%u8`UURk8_IjZ@VbDR&p8Pk?gK1jbKqugnBw*4{OE-5-9WItNgQEiLdy!6h_ zY#(%j6y_)rIbX5jUB>R9)#-gLJ~~4yo<=7EO~j%Y5=0DQT_0&2Lik}+=5dh&o2KpH z%@~_GJuMAZBU%U1?GCLCo5dadx(K_;Ii#nQcF|#p)W#v`*+SA;hNNLx2YnXwwUV7J z_D}v>S+8R+TS9p%Di=umUc9N;uH<{e<(U3PDXSJ8U^XrH1S!zy!L#J9F2Mvf$JA9; zp;ywigoyhNCLmwCDvX~Y%+nxU&-C$58I7l9s+$6mLOsjA=Bl>W$8G|XZu2~U&Earz zcOnL&D5YBV+1gFHnqGG?Z9C3=?d}9?T$oI&!Fs-U^r#nm{3D|wqr_!vM@T5UCc5yi zjcRrEY1yO0J=h?Zn+SFl&Qv&V{X-28O zhA(^t*NR={v%wkHo=Q)7{S5;B{G3mEuFl%B@*O5!4n!`YgiBr5zq;C45huP|YkVBt z6y5K<#QPEzu5$bmrzMkVAAWP$lIg){XOdjSxl<}$>~8kCvF`s#*7`ouzqq5S0;pZ_ z{^yQGK+x?}MEkDjWRKN@dCvLY-c27FOx@+i#1*th@ou5KSd_8=1x4V4Q}SN-w3l$N zXb<~3L!vIJ_0~zGJ7(hzo-?H#Ak11vO&4#> z2}`fm8IR)MT5Ql)r`KxZ?RUQot~eAkKYTbN~3X;1TT3T|=rL993J~P91a~SPW5^{Ka5O z{kla(IOc|1I86h_;Y)`NHcFwr)fgF>W-ta0aPyGyMj&4VU>DhGj+m85Gst$cUsg+T z3j+n+JvkOhBOy{mwnOi^)HUUBr@XGOZB8+qIoZ8figP1VLpsBLWyfBcD+)0PCJBL? z3QPHv&@}VSyH0gDR33*1-Vvbf*3%XOp>hvScMD-gVNG&Yj(az5`|DVU1XSU#QBx## z5yyif@SLOrEj_J_4bcXjaUCQiQPhW8kE-r5{D8wmIOV#d9MX!B|2iD5;UOm7ca8hj zY8w8Erl<4z68u$D*`Jfl?g`bw9|&46$`V?5>T&QbU45Q8-_y2Pe_R?_!uLOa2X{cN z_J7J`T;i7Mr=QBW+Zp1KLAwjM=AEpB97N?C3~`J%sI|7z3|#;?C*e+zw- z8X0Q>(o{0;=XpH!UN6V)N!o~=HI^->RkeUHTZEQRRx(uXU#JJgZ#v(Qb#7Umd{-||r{O;Sf!=WI zgGYFlzuvxjKh0Zf8z~5o)n&P+G+AK=LfBFK+KMdd&=aIaX|@SS0u@E0w|lr#d{t}v>Vd-t6Ggr---P4do*M9saId&PH(;ON=|Ev-ZU zghL-H4WhN4)-55?-*6sUy81^fJ9iXO6bavv_k;*dc?N$8Qg7@y60i&Ac(!e_N>DgZ zHXsm-OW!z~^^(lAZJfr`2i9f6WG5-UWyY`q#rls7A-M0SO`6DE`{M{f5RXe>mq)lmI{6xPdN@PK|`NN z@ZHZEuTn5P&g~nQ__%Mk`bWlp8(h3d=e}l7T|7Fp3U{AOL#S=Vq7B-w&pINu!>>9P zLa4jhpE5kwCXRhQJ$#N*U_)>z$(JTb{n%C)VcCF#jH-V2wK@B)>-|Q*5!ZY6qgs|X zq;~hq0sbmN;*T~9SR>XX|BJ1+42mm^wzLU>03o=$1q%cS1ovRU0|a*q5L^Rv;~t=K z3p5bi-Q7KnySp|{H_*s%XTF(x=bKyow1?BP7R zOu8yc1o#H=VDvr**1Tnvz&px3@|~F1 zygBp*DY_rQZe+7xE!4CAOtI9jvD}K3=$BNqZ?ooF7z)4VH+1)1l*x&GUIU2DbzCkO zX(77ic#IrOzKoSd#5Q1f!6s82OgAkQY;K?IjZ3GinXjk2hsrO7ZR-C|3;Dk~6aF9K z0PX0TKmia)xSI$}GmR83)K&Aqj*SQA6S9f=IqPNd#0a~bl?*O@|2!t%Y7?I9u3Z1E zXP%xVBG>XN`QKmGqMzKI618}iyF1J|B!kCXMNW{9^?1!#o4j1*LkRN+6O?a1 zir59)w1vcQhdc?dZ-B2>GcAVi1W%$p4krSTJJ3OddJx|J{4KXe73jhT zbGt?7KA#j3-e|S4Q>)DU`M-3yEYFu^z&cEo7l5*whwS~_Wxi1%w9XbqI0`-U$3G)W zlMhJLX-+3D6Qx6w?H)-XUiD#10oAG+2Q0whtV!Ef$EF+}U-hxgRk*Sj>l8cc`VC;1 z0UxGaRYfr*5-mmK#Tm|rT>h|spzO#pCkn#xdou0XVE!U^$2JIMhSWE<9a*wo)t)_i zwpz_!eP`TQSgL$p1WUJMj$KafH#~3r)2@5I_;ogP)nje{SrJ{j#2B9Gm@n8(V&6pKC9CRoOLdt8ECbzRz#@)Ur+@;U49_RSA$xX znFrOO{s>XOw0npr=w`V}QJyn0WAs6jTraZ#KfP($qdKlqN!SHVT#SU)WTrWaI{t+4 zy33xj3;UY<@#Eb4)kfk=RoVNvvy@6A)FED67&q!ER@Zr}Spl1kJdQm!kE@IL+^~d% zBkRLqo?CC;z_Xm&H8fM_@h6OG{z#B_5@Jde#NctU4Lu#qR0Pz`MTd2Z~4g3aPzK9NfqqQeArVez- z0OSZF`&pfA5pfEGEswLl^e|4#*nPKiS)=%Z?6f4G zWVye(t|Q!JGs?7dijcc0B(T6&fm`7Aaahtcbv-bifh4`O;;x%Tjfe{)C^P zi(S?-5pAY#aM@jI1zU|n?nDbor~0$?v~s#)ntdT^5huWqK|TRj2@q4eAQ`ydwZP$1EG^et`b zJjE&8=Fdjv4cR2EUqos@8QZP2T3bGcyMh~`%2x(E)cQ6K9Za=TFZ*zyG%j-GE^fXk zGXIq7ayzJ(c!^NSi^`G7D*-K+b-;Er0dU#bF>_)eL%Zp7sdA*frYLaip7^g8SdQl< zbXP9NC3kn=l=viTm3{+r11ffflYt9(q^m2Kw$#r{u4SlH2|LiaS~#+s6`rKavQ-2B zfDGZ4yv=YsLVjOGB-PMlZ#{_KjS;T8;rynciW}~RSy$}1_pBB8AKCHAFE9pCbC7Ua z5pS)!sa>#~O4USh=^xdeu#La)-O>C)sxL>4DfM*7>YXrSAah&yYe7TU+;t64L%rYC zuk~c}&ZkMom8H{_dTmJw%&ifBpMlr(xRREibF(csbS%s}W^$EH+Lk&_)IbElk>B#5 z3;AT|43*(_UWL`2ezKiWHwK65eQr4<0l74ZcR!Daa$i>9IGA6VAi^?Jn%o@CEn9W0 zN}JIh^f7OfqvvG%#rzU<7jn0<=4{Zk{ z!CAGeX5H;?tzXZgA=K1bpMes@9PB1isQd*HdUGDKg+sR9usbQ}Yj!L!ibQ-5gc#RO zb1*i=rS^F*HBqwsyxS|O$njFfxM)6ysD8MXKrAW!aJ=L8tA60KjoXq(88=_&m`jD~ zsc4s2KXZdN(oZ1lua!n++?kl7GDpzS99pT@`77@*n(Jf{l>I`{LkmIm%!6Wp4T7ST z4t_4&yq7tbU>{(QS@x{+9+B%`M4kmpx%`|&#kx8w*tRR?l?c5Bf3g(UnFH`mX3 zIym$jcpdpt0l>LH0HsfMl>92zzknY6uYTRQ3Vq8eH#UssLJf7G)MO0DG-HV{_I zh7ZiCzhn|S+9NR1!;9La)&LQTr%Hg{kK@#tWA#6c0 znBSXH701w3blMT`^J^ZuRbi#*+t#R?0v8{n?hfpfEpwn-n#aKI>4-H@rTI||+-1dy zP}$vkR23s>Z3>d-j|@y#Vi}g^RuJ6Vu}Z8q+-_j+&|f~qSo>HXaS4Xo`$lGwS86?+ zV20_)Z2BI3q@V)twcHnqMkKpB5+s<{buUS4wBzh>MbipHuUp(aX<$BJ%-k{Y--ct- z-=Kngs(QbmOVgQM9GUrsJIyY_h|1BhFS?D9R%c(+4K2+XODQFiJCzpbjo+S^uCygT z_7gv5B{jcE==mb5aB55{{QTcy*LxZ@mbC`FM3t?^AxjRej81R{tywc zh>&qINq8T!(i9Y}08cI&`zMu*tiYiGH}Wi_x_dr)=8@-{iXO}GUT>$bl{Ia7ND0`K z;36T{Exzu_Kpf&0ARE39IcJ%ZV%D8gaE&a#L=p1Ep2@V(I}cZJ0}T4@ik#xZskmyHzaqRt=e z!nV$aRiE7+Hj_7-%F@7Y%sT=ybf0PR(eO7XA;$8$#$7^7S(rj&p>3Kuel%zJ;nac` z{^BW4?l^5ruBte!{wO{#Q_SBIyyS1@xy`$W)_#Ij3~?UOsVb{Z=mgTj-)t;wbfI{r zXU?|AfbP*&U4~wmgUL5bZ-4LVfcJh8pKF=?V|;J8G=$rj084ts2zKKa9w0?thpWDMBNytr0dztMSe=^2)A!PE-0bI?y@D6H(WU)lu zGPAiuWFO<+PfbSGziK&9iS15CIHVNJ;+3L9F1&5rB5fM+EGU~a`o4=sn%?!0>R(>; zm<1{23J1YiFllA6bc9=hi&?UHWm|=48KN94wNrUWojg=M_& z_tM-u8Z~T%&j(YEsJ{I|&z8m3nz>5z=d@B--t8WrKu?`Ut(hr{u@zoD6l6li$Otzi@b%uO>0k*=Ui8$|lh;|OppV@~%C;YAqCh;uKajg-_rdP+gKjvA zRUCJ1{#pm$3hmve2!2ZEeFStNkaEA|HrcZ+#k@NlrL&yEg&&itljNUCv$>{I7d~n= zHz@$Z@wJ|rJfB3d&zWxl1E6wysALYZ7ke3(=_Y}6wGYXtnz1(w1`~fgNM9;9_NwtY zjI&y5_rEwL%Sd7)y*_OH>sK~7q}IB)A2~klPjznK5+t{Drg5s1U#DTXZ(goo7?CIq z&ANEEmK3o)EB4KWu_Z&F7S?U+A%6YfSwi$p_1JTWKQZM8eqUQ<+f=7fBgc*KC3yvd zIMh~o;luAqjS*QMdqwrfkzC*%^+t8wpimsv%6xs}=b8fQ(a7n{`wI2*s{fB*?0%+t0jugKffDO0OIR4_c z*>j*T*|&*&wvyDSWxpwkd?7tLR3knc-OV?f+zUuf!@jAh{{M{#|M7n?8U^%lw$)@> z%<~^k*%#cvgZ##v@nhw7c3iE%=L_!x!bt>vn4yTkZr>zLf^Cph0p;p$(bG|KG(@a2 zY)#ve1#JUwuy8+#v;MniA{n^a{Nh7Y@R!}L!^u_UGIZx_>BmF9pN7(VARSNgC z(04g5lERW~XkHhN7bB05qxQr;Ii}G7Y$y4%MPTAM5Va{!D{13QC z?Eg{@1$Ip-CSv`p`~blvI^^ZTt=JymBS*tkWQOVc!IA~s6QB@t7&olW2}uXF*Yy>#JJ=lB4gZK7U#0an5?o{g-e7s@B`n}Vq zB-m&VTH;CNJfZkr`4ahZ`pBLxK%uzi7d*qvWfnD?b_+fCB94ho&9jQ2v&OQk|M2UT zU-Bvmh{Yc=7;diw*g(E;0*F!maDYRx!OS84n52iPyjQR1Znphp-sysN!#bkKdmxzr z8O1L#pvBrd6rEpE^t;ILfuPDO-{{MmZxZ-IA0qoC=$SB-sY{f|Vm@Zt0%rvn^wwtC zr8&MLklbfDZ@#oAt6qtYb59jOnX4*=3D^rr!!BLV2*w-zu9q9@X%Mi|Vp8Aw>p0)NBEjD;&%v1Gx@pqP}jwxl~225 zvX6l_1rO5x8Oz4G8K}E2YdAP*f)^(3u|DBc5i`U47Yh{!KD%STkhE;nm~Ol&m!9bD zd+NemEo^@o%s z==$*dQVtudfkb)S9m1I@V$_B8E_3TRKX#WLU4IpYf&#=42XL{aad+P~^3B7D24kD-1ikqK@}+kJSF@-KT*71$8d zRv%-nezVGE4~Pj#mg(6VGM7y+w*(8c5RWG+04Af0bE2q^uYM&Gf?%m=|Ocg|Azbt^9oUAT!8z7HI8iyi$H z6on8Y3045a(tR3QDm`x-9mB5QvC%ISvKA`8FBa#pt=x+8K9%NX_<{OE1Na)NSeL&Z z^;%Or1GsB3b`&-sb}CJKrJe9?lu3d9GUsG?h|c>fb%~?#E6?YU^?Nr&`nvN!yw=<3 z@{_H?`bhZYyRF3-;J_UER*F#=S>`(O6s`u-5YIA08HC5i2K4T~uk|?b4>ry&rU<|> z|Iw}7)L@euT2c*Cd!y%;+pBwEooLNeLq z^k>t}OYuQ|9lBXJfM=v;x2q1Od#i!Qmf{S;Oh%`E?V_Ojo$RSlcWLPWz#P{kT|X(w zfm+66cy3RGyJ)$L`l$v7`X;OaFG_<;4dlKuI1=H(N|0M8!h)pgyMRd%%Vz(VBZb`v z6*$M*9v)T8S^0o9oUh}4bbJsaMU}xPO;SDj@C@6}cDPeL9X!m9XHU=q%9gmucS?GaoG8)lAb{2}m zY_xxC6%*2?Z?kOjAC-ljn&lM}n-}-((>Dn;8w??9brEF7K$O7vf`9Dg1_@Ewwp7jH zSgC>jVSRHAlaZPSZ)H1J1UYb{6Oeao4V4V^Azgn}?*Gl=6E=C_-wdSzi4I01KHs{C zEHaP23To##SKC0dio)~9@ik-;!n^&!gz6iF=MMZ0Nbp}DagN`XzQ(>AvwfT^b%=~Z zli1UPvKsoFQeTgFi<*&qlUv)5a$V|>dTtX&Y<#3k4ewUDIbmfecj8uaGPB<&?^rAzN!~xb#Um|J_E)NYi%nwws8IcwD3*m_^GWsxH3q z?JbqiltORh%!HO;Eb|lhp1O^tB87$k>=2Leg zI*x1>jvFuwB}(Tk5L8eE7C&=Pkq{m#Oxe z#a_M-+kfI6(jGpxc8bFu6981xXYQ)%XxK-TRwVU(uxNDWD7Bv2U{%0-G$I4ttfJ5; zBacnMOj)SSopLlte!~RC+_`v5=VOadDq2CYoWDYt5Xcd>(mxN{ZcGMv09 zQk-XR-=ccfV+HmJxhf*Hl)f%HSnwb_uvv2K-I9>y6LNLmY0cu#$osdM5J(^du&Lc> zP}FGwUcDczO^`?ISDoBg=Iu> zZYbBO;_2sJF#6Q znqRmz=kK^^-?ekTGyG-S(0*38n?4qko36gf1p1ZM1!4iRu3?ny%avM*$x?<9&yUO_ zojLxfY&A5Tb+RomIVS4t0;9;b1APwe3QDW<@xCZKpAGk&pJ`t7qw@r_#mmLh4vaxQ z)c(>T%;1*C;0bPI$_2*HDCxiKKAv0QO#Y0hfO817hCY=mzfPW*L(5!Sr}l+?Yu#-K zTe7qQ&-h-1tt~)Ap?My|i-mQF1%w9b=X+OV??82qap-MzR^F~l-SBHw4pg5ycgOKe zQ9eQWjlo^xAXZrd1z$1(4+0-E@_-NHyQ-_%7;zfhv=Jj3KI-#F3t|f5lO2>A`wOz; z%E=%9WTtmsGYZuh#dz@@yb;{w`U%&B_NSE`9T_=%KPgOPQaj1e~&0pVEX~ zTHwv?)vNOc?k|&X+xyl5&zC&8Oa{KVD^@0%@(S+I%~1>`4$VsCjP45ILv!C}$z+x_ zx${R|sNIQ~g+zLN#Bi?NRawC5UodEx8TM{;we}`}wt{cy(@*XxPhkM;PhBKJ7ga*g zdl^GB3F%iDhT#ZgKf6>vYPezOby5%KxaI(8vVMxok8#&g;MM8z2Eal2XG zaBPm{Zz=Yj@8<0}_+=JmuWNCs^^q(ZGF2gkhV$d_5qCpTpBx~1T@M?Q|B&8T)mVKm z<#LQ>ztt!G&TCEFqPv`437{kYrS$+1acN)?V|@Gvyh_-5J8>!n=a%C zx8EZ^aC4IuLeX!P5BlDe^+|$+Mn>bYQQc^renH>R zk0O0$VQL*u(=1s-n7}q2ZigE(L%%=+s*@-ulHLYZEXDp+_v4W1Y<`Gfim>iqY&xTa z4bni)x?J{oD2`M$0Ld;*q~G z?Z6sBf|TlBg-NL2F42l~JE?h#;9Lp_s%M97(TfVb-uSzM3O#h(WyXCN;u$X-V}pp-H{A1$ObSiv=0t`!*=@s2ki_drl=d_bQnER^3<(fY6cMYBISqV$rj-3&8vYl$a++FEy zg#snRk(5loi^-*k-@_E&V5pW<>)we!@&}%>53N3DT|AsFSU$BSXn6~7Ep~PEiNdL_ z$AGA7^fH#igWQ2?fz^Ux6$D02yui2TpA+?|31q+kU>tjvw;JszA*NL8j*Mt6)m})0 z`}S~2+_zoi}9BzToC!zNVR{_XgP zGnt6Y6j=24yDy?{Z2JnN>{9MVm4ebsICq+v;Zt?x)txZa`1xZUeRJO|yf{JTG>cC= z20CRI!WlK451|o6+x?Z3m4MR{8i(4dV5~Gt)K|%R=LX z-tt5n;nOp$BvpgcR&Xje2QzS&fIt~5_wT5TPHdrOA6eVodHg?(*KL)$Id31K!P2j} zefefsIkmQH6;`hgak~;*>UjU~G2@Xk+8M#s3ijflQSRCuLm#MTI-M4FQ<;|wlsgI& z4clI|-s<}|F7+bS%+$V?xW$JF@k70n+vA5vh3L=KW*BgGz<)Mmpbt}0<7LbJwno0P zCpq?dKej;T1_*lC>vSmz1eS5oAWu#}VC@>tY zz|HMGU7%;CJ7`V0=&693^JAY6waTqh1DJi`eKcjjbZLnkEbpu3WX6d*%;NNiG2>P9 z^@+-B;zO>aG^7?vWn~C6569n7XYlCZPzvih=Ht zUFk7-yl*XzuazVD>r&kh|Jq;3#5?F_rEA#|ALddd#g+hbMiVc{)D87aTQ*-D? zn4kiVdoF*X8x^v>w(e?5WaFz!4Eiz^=}sLLjolnkj@MKhcyf(++d`+PEQX=Nimc0D zmaZ;@X&m7q9gW~7uZG7N;fnG2e@97BS62Jg)3c@v6MrXT^G`QmNmciNFz6^ ze|kHh|4*E$|8|`nxV8jmQE$K(uJ3bM$K+V&aVIFeR8Nu_?~VK>{ur&}uH;~wgvPf) z)V~dtlCtnPudJYGbSv!!Q^Y29{GfU&yi@Oktb}S% zT)Ta%Id{lrUFv!yW%tG&`=d3Q5>|T)^8!y`EUPUTSmI!tbR?mTNJlg$a(ZE}YudGE zD1WMKv*B0TqhRnhjl$gdTWc}+V2+T|pomvz)m6|*C8?g!9e>}^($Xnu<>Pno5)@h3lY`8A}wY=$&;v+63M^# zm}?Ka^+|}>u^kS<4PcQmW$)G+Xph`SG;~9T-*G!@M0nd28}YF^VgXbm9`s0JV7L(O`O)Ov`3F zW=~d5_qpreuD?D*8*W%Avnto0_t-``kPp@n3l5ow>=EO)jTQ6lTa;RP0(3CCapVI9 z+kII1vByQ66-puur@4k8S1%eZ~l zelj(BB>Q~&-&Hw3@JZWc2FrSk)c!AASyyKy%E+P-Qe4**xv7`Xo(F|WtVKO(70D%bu4M?A=lju+% zVxFtNJ0fa|8o7lPQuwNOLr+HUsEs4cPcZC;s4@#pDY+9lU5hv(oBq-zq-cAXjNT?f z%>A%nF!#VU`dvsxAEL}X(R zYVNNg5uqy7z?IS2qIIG!2g!aJq)*cLPHJI|pml%VOY9iWq24S!sj_wo=GIYHmoVT7 zozhPIsOmVaINU}{i+}?U3v5YwFO-7{SV>>B&i%cRLnYPcksQ0%;RX6pbBZJ_Gz(R6 zeo4Hg&FGa5_(%{J#k1x^XpbhjGX!BNt%tFlJsTiGXuN#@y)Txo$nm8$F~GA1l(j3k z7U_K@-Ig1s+HxaGRn=kOpa#_V@z4<337EG!*GiziRrRi1XTYR61Mnamgnbs-fsG{`gZf|ILWH%oq`RUuNR< zaY1u2%zWKB+ODEdZTvrMPsnvSXdhS(Mg1-rli3)(odw`a4AL6UWAL>ZvHO0xWdi?M z?My!*#O1I!z4QmwSCs_+Qr7(y{kj)h8Ko<_;i^3Z_H>Lg2>)Uu};?wD}CaT z2lM5FV_7eh3jJ_}EZ>5a3PYHtS^FO*iQoQBtgCx3VN6LIfD)!>f;>PfoNS>R|FQGv zU;OFSCE$4f%COV*Ea_uW+JTXH#hmZ8NavNX)mi=gQ)caav)+399L)LOLmX)dVC$)e zPK>OUbv+l`Pu5Jmy~3>+!F;|2v7&V;b9V&iGMMf**NA@6&eKQQPpeCVMgl9hXH2p8 zA<$hx*;e^#Rcwjitgqqk5Y_RIZwNv5+V)Krr9&G-QqKlj4|;GtfZn`ZAaQXTrcvYS zt*xs)iK@qWN)hNOBc-YF{Zw=CmHo^wzoL)QXR&T-4IOgM9c+s1kC|fqK{OcU7Y{|X zt}7)B*bt0;bGtbsD|<7$^3}*s`yv0}7{(4fvsk!qTEIUQQpn}wJx%9XydiMXy%%sg&ylH$;(W3t zwa^du`wZ`u;Y3RQ1rP7O#U`sJsqB(RJ^Sm?fj-uw*UGrpd4Yygjk{l8z5aX*Pca0Z z*sMRkjvGBAqXx8`=G!d#&_wmsJpPm_al!%s$IS3AVl(P9Q>`l(wtQ|Wo|leGKDd-? zj4yIolg!uE7mcq!%K3#GQs=f^RlTDb;CNzoybImrH@b?qqdK3p0C`d&(kYT2r)OyF zbGVbQ@AfJmYc|DwN9S>t`VnHV+w&nS4hz+5VH?*;j+#^^OnL*ZK;@SZ0rb7YZO>=+ z+~l(}o2S(sK=oemW7KZ6g=)(cY`NC|1KhH0A}d;gVFLX#@_!yqnz+`N@RF_-@P9t- zat-mX_{IvIw7ZQEYip|bQO&p+L8b6XcbS{@@}P$p-15rhJO=x&=r(eedPW&FbULe@ zr1(qd`->TmuObNlC=o}5e~!K(zuV$coWV~mLW>j8M}g2zrr-`CX`n>7lf_K_DVRvE z0xNW6tA=a0&P6~}bM{G<;>P3o4N&HVI0G1*2ilSLKME*KSfVboe{!H|UQb)6s)XEj zSjr2T zGb!Xe8)aOsUzv9bJw%K9S;3wkuh!3rNa`Qn0boy4t8f=iB!5%Vq_^C-eOZ)GxzC&P zVP^>bPSd7GBL3ZZSy{tJ?we=CuLsHSRS{t^woO6cWy!7GSN7YJR)2}bwXEt?j&wOj zl%VY`+QWvJrdR9F(`S@VQ~ayM^b*LXQ5lF~9&N&)~6qhTOLpvjJEn}q?v9MR z>}7a*yz3Tcl7)Ao6U7*xk=gs;)JM{%igQ&Ey)E9K}6P%Ez%dF7J3ye zo))sO20rE2#&0aP8+c1#e~+*Hf`nBtK73oWe%Q+0xw_F+ddKL{#o}laQ?>f*h>YY7yG?5@p;|TDUU~6k zA=|p4$r!KuuL}&cyuRnLb5X}>A5p?Bg_cH}(d!{V|)XWcsFA&IJS zm2hl++mZE9*lYZ>Hy@1DvBL2b(+OKM^>`IXvs_dG`j_*uY-`1N6isOR$-B%@?5~4e zWFOz-*xe(j60qCxk4Ic=nd528(a+j*tLbE`LzwtoyJORF(#yvWLO;lBmkY);d~!Y6 z0_bkg2b}V-1hDa)(UIS3g~P0BBcJ&_E|~px+pFVbk3oEs?HR6|HfJ3}i|K;f=P$;P zH0M)sSCn2S-pt|g)7nn{|DrknOM&RRzRZfB`q5D2$Y$eNqmT#u&jW&u{A<;H{v6N= z2lVnk-E{I80H(`h^-u4Z7ry~k6_B?1aH=f{K|4j?!Zg72sXT80za`Z2__4t?M$DcDlmOg?I-2Wkn^A* zS7%?q-<;SRg5z^e&W^l+cd8ZlJ1O2m35-bZm-htzUVIC4<12ANCi@ih0$an9@7JMp z%qc74oUHAh{P^mZ=M(T=%yfm0{UoTv4Sk%>`_U?U@}GC1DCgo&??Z)Owv7cyp$1_a ziFL^0+YWaea7!Z z*Ic}(93AR-f4XKGQy#y895#2JWj&1dzCOF(-3;@)4SSJ~j!1<>fWL zwuj@V+0EJYr?YH@O-hSs@q< zTvK~y^^FND1Wn2T!!!8u@5h=Y*6Hxc0K{6iZKas}@1?VaxZd0}!LyzooSucB;hSN; z=V75V58X6CmCV-BkcU3ihraW;7@&n`_o$I*+b!EEOM4Nn2&v=m-)cFopf)IE`p@=K zHZC}du1{$|-9FLPYq>|aIiz;o-rSzS*oV3Vv{N+hAu1=v)y!#PvzwO(6I93d^oEl4 zpAAu4dWp={IzXno#HKh0n=4mxBkcvORuyY}=IRAy79zvOZDgCyY$^TrEZs^j`i+G5 zqO2$}aVj2v*WT;;%|xGpcw7Wn2#fjF66)%H+uMoFeUrWkYM5CP*Qbo$ZfdJA%PIK6 zvb`|a($E-$Sii%(dkCPp4OsbgY*c*7YkbAqi+DQl>7{sD^5f0uycnIz>Z{)yE1q9AUkO+pWv+NW zHg6_zKE`kIkf?;A>6+9oi#u{4U!@6(h$t;HaGRy(ETCJEcz87e9c>bbia;Y3e*CeI zuPOE(iI1a#BI)YO>*jm<*}WRLbbj1ARZr!+e%~o*ZtAnA1^N>I_%{K0QRS1F+@xP+ z%hF8}gHJ1bk}g_+d@2Ya)lZo63N(aF4nc^pFpMMLH?fT7JSNYG4bs;xe~o@-i5t%9 z8nApe-p9Ip4`y>0U$<$XJ?_J@h;Mo_5z4T_OP?I0@jE%(#Hbbh*6CIP58tkLJ(F8o z2N(ja!WC;Ox%_7K%+DVGZTfURz&6VreU8t0#IJZt=JWqku>L>Y>hMROnOfk?MqYLQ zuN9UbIf|RoQDV~9S+c`5|K0HSOHQf+(TEx9ZMUR%x?rsmX@-Y$hk|Gu1NWcaRO^=c z-$L{Lw9d1LPb8`-ZZSZ7k6LLeGR>)4XCFxS3st^F2;S(0vh&jGSg}~qM$rl+g}IW< zHmeYRoL?!`F?7?bJT&i?F)TXTa*wo_Cg&}X)g*_Ot&``tS-Ei%?F+O}Nug_q;oNd8 zdIH}LW6_nG&xzsZ_q#jeb<%U#>*2lRR4yEBnENu~Pm}cV;RdE)11Wa}rf;Z)v8TT- z^SgO{U8e82b8tKO^EN$U!(u&$tfoCQsl)AO7z&B-SBc#C=$gcLZg%l6Ap!ic<3)t+ z{r$dH1u4WEY&w@20nM))jW4RpYWL~xv$MA2hpx$LGV_ER0$4-zb6A54?S)|LvABiW%MX^qqX`ah(hp#$UP?7A^Lfha* zSGxaPWj?noG?AJ^+T&)xKZZgA#yiH-F**B&*P}%+FSV9`Z*{=DVS6%GgCvG4St)mh zC?D_d?EG_onf2&A`ycS`N4KOW8*oQNjt&2=bNw68XbbU8%6czz-J1mzna_AW#qo9e zI^t{>Xn_~BxmL`G*DF>Ud*l^5sf!QD90Cj~VpTZ>dewLE|Lf{lH zrcW-G;AgQBzJc+(^RkGgi`dReu=;8j{w%etr4A3lO_g48E`C1=)&_tR{tUAn1ozkZjsB^LwrkXKrI!7obB;*E=eL)e*0= zR>0{!$1msK%iOnTu?IuEXL0&pX*n8X)El0B)Sv%w-7n-Ui6s~21vcE4rLXo_ZC_ur zq*7(J#ue#y&NpBU@A-p{zPl2)z6C+jf?UH)TBz0@17f689uR1vAD7ff8U?cYzos9w z!p*aM%{;m8t0kgk%=Fi&mgGpHi^P+r*JMPu7y>xGjQNP)b+ zq}vcnB@a03K>))HR5d~o?$`hy#bu)6$f%}`? zP$xR90_=U(7e?TOkjvj)1vzh0@VZbH!7PfHYq$;S*AGWXVU;rTig8}NOc|4TBW@4z z>`7~%iVm<;kES$WLPl9-U$PIYh$+B(#5Yn>=LH|(1>r;%>NG<u9C)^(YIMI=Mri`{fk_dqE^b@@w3_)c7G^*o!}MEGQObt5yCQz(F}2CeJCjgpSK zxVESIjE5gT_Z?DdGrt&5-FiHq=bjJsPrASwdp6ylrbC}M!w}8MNTL4lMfJ?!JcZkL zy3F3y-BlK4Eg>iI-*f(`_}VV6;q8#a4X4z%zNjHMrYn&Lsw)_EsJ4T}_*kS9ngu3PIkT-I}JJ1k@ z0>fguu3Zd=N!y>-65>RNhOhH8!oMpF7q<+dQXnuFZ8{NVt!k>3 zF;}@eGQ(Ea?#|SJVT5ADXG^JxBoSsc!)b?wmjJv9p?#FWC8&Xv%HakQ2hlhx!(ikS z#F#?h&7e5(ak%Ekc+;}6fHB*nly|njKZ=w8QaBvu*}sxSkVifeQvZgx#qC9~H^$vO z>@sgJ&C9P}=NrjL>!n%oM-r8E-XGtU>Q8YB=_98JxX{|LF~uhgmj#^SH^{Do#xvj} zbUTlVw$r95%4N-r*t%oiI0;UY@LGA{4W#6bB&FX%Sv`h+rO?Ij}pQmm<0zVMg>E@42>h+3S&hezOE>8NAzWA6_xBMLC*u;;O@Y*+Bc8em`TK#LZ5ehljE4n87)6O~X7kcotuE z1j0(io+^mH>*CK%x6CIwl1!D*kl4O=)+4Pw+i9$0#ekhHuD69#PdmtI46)FKhepLG zaJRdA9b03(Q@|X`s;n@Juh=nhNk9Osb5qEHzP_Dblz-EOfdWOc);pgbu1dT$0P-cOjBm$h} zjqytT#kv6KmeC7Gy+tqg+l%dGCN4dk77V`TNhk23s8P1!etTfS`+K0nIXq0FtGFfj zTYT!QT8k7KcurRG$S&!e+=<maiv+EVt}6;ltKz83MSd^z++>DZ zY;m5y<~OZI78WAap>xDdOeL0 z#TeZdrzQUREfD**z4tn8#sz%uX(D~z?t7OTDfFpB!VIlACisWJQ`-=4ML7o zS&NZ5>ils*Gw>(xe?oKnIGrXL=BjiF`y7u3bB&^w6-Fo8ZFW$veX080T({iJhNXCb zK;}5vag>kb%C4@aY&7$D^39!$w^-?72j`nup`#JhEDB3cJIt(IN-v*h{T2XOyU(7Q z(Vbc_UjtTwma_@$xOXG)-Hv{4g)Jg8B4xinvbFX@5h+4%0J_kx6+eYI6_%wOv|4~C z-B1M|MlOP-6SQ+Q~ANS zE0(1E4rS&1e^B;T0dcjbJtn>-w*db&bRq6zN#8ylz6DgzAj5|Jb5KJjGJwxtOSWPg09IKf8w+o zfOB!i?#efBKQ`zcl2=yLxNSet>Un1Q)_k4q*U1{irwR9_4{e?Q;?>(?J7Cq}e3aHB z#!j$!o0s;%qpCf6@Fw$)nP7qZ8LS_Si<1@OmyDhn@Q$>3$*_w*V?)KOQ(e` zL1yy)%{>HhkT)cI7|g?z0U^10X^Mt!!dJ$<`};i^QQAH;ywO+4n_!M`geUl9s&_NPW1*NWh$U%2BMN`p4)w?_-qqKp6+#Py{b{v%4Q?Z~uwA9SdDP@Dn|-1N6EuJ^st=K9fO1nsDwX zU1c)cP@0@OF)OD)nF)D&U4?zyFj?{wL*CcyH{w&p*2WiP^!L&<3!b@%iXwoQ!-eYP zYx!yNCKl&yIYcX9~Q>^g?*N`8{s+ls1&s! zVx_3yUJxLjfg31DNbMLKQWV1iWoPErsM4TrN>L%1Z@d|i@KIR4A)-zh$xH+64|@yg zGlM1on&K0UC|A1M5qzWk)rm2i2M4#i%)CF#wj8fJY~E-aADb{to?JJof3WVYzxzX( z)yHqPwuVnFpUBVUIiFOhPO;d`O~X6B!upO?{elIY>_|-B;!>sU0=xTLAy#fwY3oCq zm1ar4tue)MKjBKi1altld5H#TdtTRfX96lDxsxmP#_iT4;bHfB=@*zxCp>*po+yk5 zyCZrba!hQK@y~#G=TUdv7*<2RPBmsKs*4ub(aCKox0ii`AArAg&XTc8Wx?*GCfRX$ zHKt8>yM;4WW*n=Bt=?W}nIB7g$dG7D@@M%)+fHVo_i!w}@&Y5|aKQ@O2m&?#!J_PR z#z{hMX;#Ydiw6x`^EOxaga4zBaKI1oVYv}&%~BI^#aw8<(Y0f(&Zf~O_z7Dceq#&6GehaXOC2ymgQN*Bcl64+MfkqWvho9e2ln} z48CZ2CV4(#p-Mcy=Z|Cm)EZtiQn{zh4A1e@|I4%4_4o5!-S4Q2XZJek2#inZ*rHRC zR6~}?^PI{&=jv-$a@%)y5lE<@l}r zTw%Nk)zMh7g2$Ttt~ffOpOqU^NnC3j^!wMlE?dQy9Do~y&T9~g8}9lZUU}2GYW&c; zE5Ub8Ihc6W?1Z*^3DAA6*JT~f8sw84#+2S+71%CtXR_-O`sMdqW&48m;tGB6EQs1~ zHc(!{;DyD(b@f|zwdGTyzO;a&3@L6WHGxzX4vGT4o0 zqVXpSxoTEpG@Y>FMoU@ej|>hGT|Nqxr(}@O(aHF!RY6ATU^iXacOSyGFD#JN`l+{W zOQ)>2G+pcwxCyJhzE1UcTi>x13$sW0jb2Dfgcaq&KO);uxb$__bl5enMvR*!oV@{M zG4e9DjJ@Wc5f?aTf_3!!t4dquT0q{uCCq9EgMI{E%-<2xgq(#Ah^4rb06zfr#KPLV z(~F{!cc2)Yp<_FD+u6o;Q7Mj7g=sOk_dU(?xgJv~9PZmi z2q+4wPA5=i9mOJVUB3G$hN?rOGG)ZHlJ&k9?eOj}T}|dl7B$7&q%hnXROPl*!pv>n z&c=%{cy&J{u&v!2R{A*Y6)pej1c!ct`M1uD;P-Hbo36KwNq;ZgFZ~@2omwRZJB%#lg zmBc3bm@A*4WSU)K`;P>zo!qFDh?^hQeb)loXIl3fM(UgYP?10)EyBNb8)VHJX|uV< zPZB^R)4s~t5lg<%y)szXRGZ7@8r83s{6vXQKI9!stuWTTQm6>^cCXhPt!L z#}u56W3QL-K>^-NKMO#x(&?=y-4?T2q4IrRU%RG{$O)5AQ>rQh_MCjJ!%umxf(kdLcc;Cvx(Oz*>E+%#xfe~ssL ztn(qIsD^9A@W8E9RDCwzSTV=Hg#x9xZN}mE0dPjx`Ug1Ythk*WITc&ac|OTuYVpcV z9>tF50wiN)CM_{w^_RUoTdHj`c3h!Ie0(4>jsT@}#8_uA%=9`v${3kfH>3B7L^b6y z9{Nd}z4bi3=%-|kZsmBatd25_ZEh{wh)3RVaa{eHx4uC|H5N+9GsW=^w6e}!BA^cb z8XH-V@L9S)2iyMrMX~atPk^G=G>A*_8@wrk-#A;fM|~*rtE}8q>**~$&CUFi*9LwT zk zvCg9y<$!Imj;~Os#ZV8By6^3XpkOHIUVf_nn8zip$kDz6Vc2rWG(tAh(;v`ZkV>|4 z&}&VK>D4zxZt-->*{T%Nom1>Ra$LJ5V9(q|8?Cujj<9RLS@Cpyu<|W$y0IS zExuk2HUfua8Vyg~be6whV;)uGwZ%@GwTg;9-UZju6sizlo=3Ts*~>|W)vOy2Z*`Y_ zQZa{4=_hrfDCfS^k+QS&EF;R?6`v@g=_{2F?(nL}8&fjhtE7c`Y;2#J_@|jthv$$J z%Hzi|@2;!acKzRn*L>H3Yi?JK@F~vHD#8VR$Y_#B+A=kUaYw&vz{%U(Gx|A!)xwlK zrom5a99p=aR+%ejOEIdkNA;A^(Q!?>I}w_>r4g0q`Bt}wjA-u=s4#R23jWNjxha@y zLG&ua(v{_vl;JizO`PAF3w2OC(Niq64yE4nnbF}Z_rbB9(k~_K`3u1Hf!ty@%Y$%5 z7hSEt2Hq8uRl|T1W>k^^gRp&u&2b8MK2VSKj^n{fA3DN-{zgs32w+yzuI4A*Xze1U zc4&E>B#jF$!pt^Hz!acSMg1A=x@1K&6NU0L%`k8JBStqY&3E?us%3?#UH&qnwwFS3 zXV*>gvl^bvwzLQ&1QIE`KT1cC5>iD!E%zjNy7r?B<>YS7?!|t^a$UAJ>vf*r7PR_5 z#_WIj93=jX5ntlk)rr;!R{z~dGWrpb@*yG1!{&8;?ei-2X%KLj3g?I#w$a=JcjWL( zYA6+{QDL;kIAyN%Yk$m8DZhQwqxt4-%n1xtSvy@aKqVY_cZI_sn)etLTEkTG)sZBd zqj-|hVx`GzQz9ojCk5oaZ2LPWgz>d2D%WMw2uJu){N)aS-!Y8gKIV4}%x(yq20+aj zG3LsmhEk|q@|HM|V#Q#eEu?}MmPOLUh%lp^U)U? zF?y3qOb=wy!Nv1rT>ytl?T$=%TPw>Rj!Z<(3DJICUd#+4Q*mhb+@0W<)&Bcn>L2b1 zaZfK&TafnZ-C+~bsWnMsQp-VszuzEEjrY(D?a-DZwbDS9+bO+hup;F|AckhVLo1(| zv%SCiKBSb5d z>?cb|c*aq$rnNg)S0VmQ=Ah(d&$Sqe#~jNbbZ&%(?TCyw$8Nzx%My>sF!o(qXt{~> z_z$G33ZEjF3!&~3Vc4VVY}(&OfnHX*fXQk&lfZas{;XFRjEZFf8Ci|vn#Lc0%c z8&Q16L^xSz=FPJ$I~-jof~WrJdU*52lV0fduQrqV6~kVk{Q#$KU?v%J4=2GMp0e_T^M7l^9=~0r zT9)78FJ|z$GLJiqGS`iAB94N8PW;v5RWD9p@%Ckoj<}64b@sJB>WCL3SiqrGVPsQ* zSCL}ljIx?hV`Zq02=7cXU*gsUhmVS##Fa-?mdAc@L0fh^`MHIJC7OSSCqu+0lnU!_AetlnP%{ivLLnpcvtGP zShm%`J@pv(uwn?GNQ4`buhPb$fw`N4TX1$3WR1`8*~nV!S|La^UZ>ExBz$8APbT&A z6f*eU=>KgW{jV_XM)yJx1@WVwX8w(5v$y^Y?T<%hDm7|{rPQYdT&?DAeS9ltg=&9Y zR^hFyd@V=Twq5%ISjCo~lLLQxN~Iku5m4c^q|XxT?K?w?Vx~Iiql~=C0U|kLMKj>R z9w|ZIi(*QVJXAGhhqOe^4Qk`}@~%93ZL#%4--s1jw%9hp13QXsN^H?&_)0&wY>y@R zoi@Wikz`vOsLJ$f3*7G|Norkw6Bd_z1Ei5}C64p<-j=Z?YC9@tp*;539_||EN~gr8 z3Z}dp8n;{RqojN)T)pkE82|LRCq%a8Xu3gw&@fB27vZ|w`-G9vZ$BX;WJFU^ zS}o~2e#Q^_xNqFboZiI6%aP#VIxb%4p}wejtaH4MQJl+pIql z9@;&qHnh3jCeE&~EnStQ1t%@p4YMC@RJ8m4-d*oAbgZsJu6KH~ejtKvVnbwRMf1XZ z=0m?<=}~YKzyK+4m$EdvIJ9DppZ18zE&L-=L-D2&CTgd}s^trz`<@diu5m`^nq$Xd z)>b)r+&vcyI@U>wzoY&d!Uy?drN;++M4-)7D9uUUal}X)JS;pqv5VBnbs73*S+u5u ztq6;^=UO(z6kdDTYmcdmx|{p|1Ce=$_o8`z2w2wP_>Yk7g-899kgV_yQG_}$7aRa& z#xn{Y4~~fupYk7xZpmRtiQGYt&2Aw7phQd|^SMs$KmJABt?)3+AHT;m zE7*m$ShsdD9h`YN*vgb_rCr`$L4cvbUsC{yPV{%UG?UmS-{L`1KLpLQz8jT~w};#F zm}^g;ZFA{zwLA*laz>S;iv;pNO`X|oUhSU4uk`Mq>-0WXRctG7|IaP}oRH^DS3&-C z5!67k*tZfD)8=A{)>NJ~v&^v_UlGAU19UOR?+hgY(~m&LWi}5Pic{Ly<{x{BUr=Ft zA5$_zxt$252eh0ymg|w>iQZhGEt~@IsJ}l5u0G*{!3q!wuQ#-GN{3T=M$7sh_)O)f zC6D297m=Kcz7`?LT^t|BBLpQzc3eCdgnGaaCQ#E~BLnePFMDl=YMOwE?2xbJ@rDa; z>9XfB0mb1TxJ2Av|H57vXVU1z)~rC4+m~bETV>C#;;9?!smEA&QQ!pOk0rF#oPG4^ z%mH;)1DMrwQ!^&Cx;~Q_!Oz#8Z9ylhhJ;x@1v(GKz7J39gg%Eqy58^+@dYnU;xe4zuS>+oB$J?w!yPcVQaN6`8?d;?# zW8!xw1amYzHMzr5@;S+6Z$w`zI-zA?*RH=lDs;hKb>y{^UAW;|J~;k*+KXk zv8fY;OpUDn=Bh^qAgLCty9V~L3qE8`l8hhw^hb5{_qgV9{$8QHcUa`zTa?BT&s-^L zCxHetJ4aa-`x!^H!u!n74m6zQzXbK^TT5>N6R0XuOYa^7mgZ$~ICP30*%r$9@qws6zPQlKqu+QlJ5UlDp zAu)$urI{sDpG7?@R!$IJ;fSMEP~dj>6ioBdzsxQ>%3IQ^WQb_q@@;ufBaDoTWX>Zk z&)Mv3WL@~)886x;k!3D!e}#F4@1e`r#}}4^q11N2{c@G2-O%mgr~&)=nycOP_7N^9 z=(U!uu&Cn{->=F^a~rj+6Ba%GJ7T~U$z_;>TYS!9QybkVrtBJN*p-@$r4+~(=zQ`sPWN>l_szpudS_OrcZ*noxAC| z>81m2j=ukTZqBDmush*NON5AYl&JSLx995%d*{r7zn-wof8=?hm-y%k&JiO0-@UW{ zFGYi(t`YPZM2+%c+q?JU;&cBYM1h8jbR&UK8&)XC^C(~9-|Og zIwmUJ`aDeMigjGf^x=1nv?Qde1WJJlQt>2|9Nh#HhUoqnJ(yvLhgPCh!u6M7o2-c6 zGP=F6i9d&IRi@t9yk6g27SPVbIOdVLSAF@VA?J1=|+Z}rkC@*f}YozbhdEx$IX4Kw78jqjGv z;PYi>lZ#Eim`b|Uu@``RN^WO_1$aW5cYkkfCc+S)jVK}Cbc4+0wo~iEysrK}Es!RsLtx`-=DyV(!S?+2Efi0Kt4~59eVI*u2F# zbg8Y>ihpDJ3;M9H*SThCS;GY(BNK(iZ_DG9`+9S_>(NJfH~ z$J=5-L(2A=q)vRo*^`B5mq^SVyNb2299-o_$2(?}Q!M(8SYEiTq8L z_?ml=-^FPEax(Q!aJ@9&JGMl3-j_Wg`%spJcyjom2$e;6snMm^^~z45aUR&Z8t~Pu zHfi2$=FXgaOpe!>&|$1N&>Ci`))E7yoS1KHpD+BLSY#YbZ&G^&;xaPew%$7WZ6~Ug zPd=DKc;GGwtaOpU)8-D7#cp)@Q>+a85ok_hdN-9AhNNb3n;Sxbbq5bmYQb$(#KY5` zYWv=x^CcjCZTAmp#ki8@wT{t^*Ht#4o|4vkT8@ne4h#1e6JTi5nz7tA=Nq>3L-h2t zecou@cm$by%X(Pem{i0Mn?`iZoY9{B^13=FH(Btkx^DYO-OFyeiZmxJ<#NOq>JUwJ z+gP|yZxl}QSom+>`oC~9^6FncmVesVhkyH6|C&!q|A_1qdbq`T|JU2A0lZG~u_Vru zN}$r;80sfJ&b-Ur*T^i)?@yKf)mIofu{h~0Ra9&ZOn?3X+wtye`UR;mX=LKtzS_y8 zwys8I;-*Bq&ooIVXN8;oS)|z@cRO^f?8&S{=m77gIaojnuU~`wJf;(hSrAx{a}|Hj zF)`#*9QCqN{`LE&z|!#~mas2yhAcoc6rn&qBUVI{O*rQ+*b>Jvm%?Xj02lG#$mh3M zC;@5b-dKW#SAr}mF{^T6cu7K_)MsL2yD5q0n9bVQhOh6$Gkp$P@~Rkq5gYY>xO=5$ zc^YCh(uzphN2hC16>A6G!qUW3jG=%M1L#5IfyEM}RJD>{vZ}KRL_}z)MFZX|y5KH| zp9n)#wx1SJ`El@yrrMY(Iy2L)pn`M6kd)BY@Q?aY(nKUxX)jE|0T#X=u%$ zT95yHeLVe_EYW6~?qv|u^i}05)82SM&IwVSRaTYJg1+?i+rE`4!UY3VwL+NtUxq_> zL!edC-lv70o26&_@-dY2B`pm;2m4R8TKaKn@Yc{_Hmc6jl{RHId4gnE=tksGb{mGg zEQ3Lb$;-clip$s95j4ewb(FrTUAAr%_g&~FuV*<)nUh?V8uWMSWtMI;Q^c7SAe{B_ZLgJo}?dv|Lp&>U!1^x(!&@`OiG}^0fw|s(cnot;zjr`QP)S zS2ms`x?%b<<2Coxyv^l&XEqQ;-n&gkn#6!Ej8Q7Z+sPgxgDDA=tUQ?F%BTkB!B01K z=u6bA6@y(AXijx@TNRslA7{DYk!lH4F=Wa3!u-@01g38VoQ@0so}wi%tL7jY;!Ct_ zRR)3&BnfEQNW*w=wt3>ye-o=o=;^!fv07c|$*;}poXlyqBoF{FIj z-@sCH)XwK5t!+C-?5St=c#(I~Ma!Maap~3s>OMNlrtl)g#U-HWzr5d3J!H<9p929M z#yqaa{1C1=&ouWIT}t*kM)GQ4eqd$I;GJ!gVZ~9hs42-OHg3;2N1e1j*btdh+e@SQ zVx6tFoVRt^k#@^EVsd`H`~+*DnXLTIS-g9RX5yS|R=;GED{w$XoPO(9MUy!`qmqV} z3PicL)wb@h$>v}AAaH)!ZUSYRl-cT|wcg7_ZQDgOMR0_80cU!Z>3A4tEYuZobBaz2 z81iueECsv#3;*NV>m_{2oSfp*NRa1O;c@Y67)k4XiY7gnUExk87&{_f;%> z>PuHyTvKPr`oQ!Ah1ia0eR*ENp&7L5#L#4AN8Cfl!jutLW%0gf1<`>)R^E|A3{)hvRjl!% zT3I1;6b1|4O{oJ>HL5Q(2&wTt`%)9?G{h4w6o!BLncF9Ni&)bi?4P=5fBCbWG+n)H zdOE$YAd;sR@Y(Wh)-ru_-XMu9rJL)}gDL;>{^!a8Q7O|#w+5h*@h;Lw9D`)QRHeMT z$v7B%vp>L!%vfA7O?a0U(}Er=`G#o0%-0xh_z)!p==K4*w4$sefy_105GmxT+(iN= zbxVnKj)VHl1C7IcXmf};Z}PU1nHSr7%!`?k`E2%$M^-Wb952sxmlhFPV9GH@7lqdX zXdP(=#h#DM(};s8sF{l^B1?-Dm4vg{)T<;$G_4JH$S#;Yhj?dGHVcMbS69KUyu17b zQ3ZqdfOu-FJNf*}qt?pk*APY1IXvqk7k%FtOQrJWR^}1!fv>rKMu(LNfV73;{5P{r z{VR4lX=PS$m-Ga~`OW>)1ua{$rw!6JHkY%LhsV_*RC;t`p0B^DCHxsS%TRZ)7;>eu zWzqaGIX9ADgKITEjqntg8p(_=$3H+U%cWAyZ(gp#hTb2;9%xO+7v?GmO(J)w1 zzIvNhbR1#Hz$!$_JeI^s$Ve$*>bPq8t|~(o_mUCMdIlW=ae~ptwq1Icl<&n_W9@ag zW*N6B_WzG@Y;5afzLBs@>OWxCK`i`b*DE$i%*O`c?nxr?gc*Ru)%+kVh%XSVtW!;e zoNwdYvd!Bk>h+0kQldHOIJvi$#v0-l14- zh!OaM$mn^o16-;dx*w=SbXw^eO0XGeNTKi#j7ES~glgfr&QUi36}gCirgs!-f%zE-i4K<4Bo8b&pisD*!D zCH2q|NGXq|aV~#f%7-VjXNgv`HPjjHZ*xAQk(SaNNgK>^7lV>&yvIU|cO6_Fb ziR(byw%9C|(CrLYeir3pkE;xmy2IgY&5e1Lw&A6c}?DuuPpKR z1r()3tu-1oabY{q^#Xf(L;&Xs9&(XwQaR!wgMw^bewaDctrt*MHnBv1_{? zId|!}F2(jBY}P&f5AJgGzuaYt&ExFEbT1>BPcsS`rore$Y7WJ}P$gNvs+SK@P5dlrm;L@1sFr z6lUE2GL2iv()6T%8|!;AEM<8=*?t|;Rq^nIR7}wdl!!SZ_)Ypu)MGV8E_M|XHm<)H z7zLex&Os>yfa^vo<(N?OszO{IzEDjmTq&BcnT+m_aKy#G5%)&-usZZ`4DT#}4in9ag6e#2dT_y+mU_h^|)xruC^7iM+wwxJuDjoXHy9C6c+-5}MBXTB8C7d^DaHsvgLF!oVDQrf%qz zEeC84xB_`{kyc|-sRJ|&r&=9BUUG7j?%>1Yuaa_gGF7jqa5PJg>&32n0%WaaP;HIr zI0VmaJk~kpdThg9lwLj0lT#eu8=w1^vqoQ543|J+b&U%WxlubG>3?h3^)!yJew#v=F4=zR-HRoTnv;olpPcDwaIr{&Ej z@^A?Xci_#wv+Ig8-b-iOKieImUp+TW{j&*^Sz^s_i)iGAyU*T@l!qkXEy{1a0%e*d zeIz?O8Gezkx0J@hIR$p1n}UT{ik2}!fc^r!Onh^`xXLvWCYsVCL7mTF8$1m0+Jmp^ zYFBcz)UW9J(Rlphggm7-idJJ6=NyCAHgZC2^YcA^D*HT&sLXv6Nf3nq1MsXILs7p8 z=FXWS+8ca6amIZkbbjJ%85-q#TJ9N~1*fN!+{#>cNDGUtfg)eBtXEV1Iv2V0Fm**9 zz+&k1#khAM6Gv|{+cgak#QhT`>an5Suj&3e1}qe1?3lAjU?tn$k`pCbSCJQ$pBeib zibMUr=)^ni=%zj}TRJ{lB?^w_X}jiUl}VFLdk22dTaeO4!mm!CkHV$4lUFob?L&0% zJRV?FAQ+jZha0(Ku6IYs);y77s!$Hpit6D_r#CgQd*I$zgy#=$QTau*D?S_c{2O>Ky z_OGr4i0jS&<>J0j+EXz@Ihsb1xy@*Wyr+v@1A5niFX8ma=K&;@yb1 zGM++Md1@8T1~%XrCr z>Y`D~pJw;ehnBb(-lzkU!d0@Tm@tmDQBU3#H zPkRioUd_kjMnYY>1#w}sysYXEi57hLgrR^Pyr}EFm@pZ>yNas2n+aj6wUxzzL6MJq zs3DrKk{$VWSPQwGDD@{fjr5WgQVNGuCjop4Ce-X^b%owGm{PUD+ zni3Ne7Yo#c3BQxdFuc-dP4E@N92ZC- zc@=pj!CMcVpC0;M+wXF89;)=7mgn9NXq$vXuEncWH`KM7P16f%W_j&o(!QOz z-Wft6?R0Kw(;P6m)i(O{&!}id^HMjmpY7THr^XWbC4KQ-Hr*Kt755r`Yd(G^zWCW- zS*oCNNQ)3}dn=vw_o-rVp?RPyIDSSK!uA*sFh&mShE;x z3K@XR`?VXhrJ8jTn(e2WhBkxS!6fg2(~%p2&ksj>zxg(kihl9}ibDk1NhB-Fi4Qw8 zaOUD%iR4Az8@G=Z19`R_P@QsCi|C~od93r2;fEtssgZ0h?Zctj(Gy5_U{)=hM8soJ zhv2HQ_FHa2TUk_(&rr>=6FNpLsF~Y_beh01u8!3&`hwF=%dVPl;I zB7tZLncWOBrKN*Uw;dYG7yjFU#h6Q{2U4uOz?{zK{``zWrIcoc2*C{0nWJh=Zn-;=g+rv5goK)7p>CBV)n}wVM%dZfDVRw5h#vS67r0 z;DpIpHNTBGwb{*~AzZ24M#y5`8-V*)O}A!a?>eT7lZm$NX4F0(_mS#72d_sh+O}_u zZkgy@8~g`1`QH@yrAkcl9}oF&@bg2JY&rOxq@7G!7Ou>Xr=}ejm`>Wm(Z|}pt-*$$ zLt~6G;zDch+?EE_px{z8zzu^UJqXh|QwijgIsLJXWo7-K!S=ZuRh>%FX|Hd86omHo z9nfF#kBpLcd8~ochj{dM0Ja4df>HMe28APTJVOUsD1+AsFz0dIAyiMR2!IUP1-<&| z9DL&YcNR;}@emU1x_VKy{<1$w$cPNR@Fg(_r1xu~5-5nFj37ybM!)WZmV_Z2w?HeN z-s`am|B+xbZi@f;Q%H4l2{ETzWl9A@H;Rs-y7LSS4z@rVk~8muins^@YH3UdIiB)z0% zP0_W7#tU_A5Zb^yh7dxSM4Hp}2(ia-x+w*{C4!>_UqQxSk)+4;S?u5axe+86(?R6% z3=pW9s(tw;L3e2FQ%PefSB&QKSno z`Is*{8Z&l*t1gQ=u_x-roLg^Pl|D|@-^^J-9zpfg_X-h_vIJ|f--F)B*E;7{?Ep4E zkzYuz^e%+Eic_yFR7g)o##@R0jA~PW=`BTkt#4f&uKkHkoji}?CMq4Sp}u0dQ4zHO zw$3LCGFI@eX0&^%`8(}KC)7OpwDJ$9Kj_tS$izPjzfAvE*wzEWH|g=%L{eA-BFw^S zYk-i-1fnUPib=0y-5TvB;rn2xDQo6=10)~(kFw#LFk(oT52E6?JOsGx2uOsQ)|Kgd`$#nQS|o^UU9b|4e^$H z=`}juWY$s?ny#Y4k=0W(8{)R7X+4tnHt=fFkoFs{XTzv*s;sA~Xo*Z-lD3cvQ^H>UwZy`b<#q0b&c4Yq>L1k)iq-Cr37ltgSOv* zri;5yJ21M*h(1z(xS!84txf7KZoQ(kA<>31sgV{Tl&a51HshhG;&x*Fu^j8+(aKV*q_zosK(IZ9HT z$VW+P%pAgAi$^s&kaVhWE9~wy!)wosl9ywz%lAR|!9=?yB0>w(~@QJGSdtJ170azvt#d{e0)?axC`WRAf7G+_5T3 zM1o!S@a|Vayq$!e5R|Qphy@7l6d8EC<6%ly?z2<^J z^D#ctDQ&qpBo|rM5S*Bp7-Y`#-~Gq~NeePc)k+G2f{%F~oFGPW{Ar9%;chj&7I7y0 zJ5a2?NmJ!$OzC+mAk(r<=Ig0rBhqt|<1ynMOpK0FA4TrIxQN9eV z4@gx$(lAa{-wx0&zE`fmMg2K31_iR6%_KU29*h}cPetQQ-~1?;-Y@N&i9$L+wVkFm zbCxZ6&67!@m=V75as017weOU=hv>xYBUggKkH{bIp}Znk-rZYFon z8j?KBfulgRTxl}1-HU9(EQ{aGT3r{w?Uwi;FHjE1Z8*??b=V2jiEz;_1EDu3T=oA4 zZcK6g-ukI)kWzyzsR#TVwL+Rlu3v+*M_kC)jnE9<+y7!*x)3iu_clUiw07>7iP`(9 z*WAuj4U#aiRVd2sTHXk$2HAp8oo*T97I5F=rb&R!=6yp)Ec693E{}5=2fWN#hNS5~ zApK-6_$7{pst0G$iDcH5$C=zY_C2dw*J^)03EGnntj_Do#N|AiYq`3v7#K(n!7JX>t*auRstDq2Uf`Au>=#;zQ8wY=G!6LejPt-=1nC49hS}b3vX52z)ZDn%;o#%x3bmHD#W=<; z4B4wTgnb3g5oWLX^k-?^#rz+_1`Gd-`|h)TB5e8JHiGuz#_)YYWWr=bP#~S;4?*6> zx9KQiBHx8JQ4;}QhV`?-{XOyBQ5Xii=kyOYkt5Sm(M;rf*{t&y=@NVsQ!up=>;1K{Gonot7L1zQ1xj>`KU5bHB3{7Z z>_vNK;K^f&R4*rz1979ICN>XH2f3cAwzK+`48TVObRnp2#iqMxUyR+Nqp@t z)X(MPcyZx^FdYk15#FU#T-%>idwI`Xxp=#2?8c6bDRd+XL$2w7Te#=GU=R@{%*@xa5bKFlMC2Ap&Iei3g6A?E9Mg8H8whenlAG=JGXLvBg#&i}l>?fb% z&v=6K!M`@A^u>+f<(Np!B`=k%H}EGYE-CMd%VIW@eD(V%S=@NNOmEqHGzUUtMT8+) z^Dbvj&Z^Os&b=!F6LTYB9C-o;M zpUp1~E5-+zH81^)*dS8s57aJ?^NQ+-ZmqoGj;lo<8x7xw<90%c&ela`Q`NrpJtsZ^ zRAoG+l%*o)g~cYCxN^bZi3A!hU=M-!-RvV-=Yi=f(o*O9$Q4|!eU@0ygJ_>m^Vvbv zOn(TB$qIxy9m+x#_Y?LJR!#7^xz0%X#N#!AvIbaIXlJhsL~Bo`P7mJO^EP&l|&}Z71MAW#c+lcC4Tg=gD!Sz zg|Hw0u(+Kg&Vxi2w4H>@1|0}bv8Hl`I*^Lo^TRnv{bfIAz06a-D(0XMce9Yz2wmHZ z!-yT&eksc@00_HPfmtqQ27?Atx;t$U1E3>4jHBFImH-iV5D{l*oZ37If@_Kwb}`c! z=FNuxfQHvS(un5xIkvf$U99S24ihz?70J2Pp{Ey^D{`C%(F2+@Gyy9?0;{cdJP66Fe50e~8|{#ylIN zvsi(e&Z{j9KJvY+P3fUO_F+Oeg42Lm*%+akFrWs+DIduyN3pMFeV;xH01kF#NL`Qx z6y&QlJ;1`K7hG9t9Wkn6WXS zEatr=_-)i#23#-4G5rYo|FHL#VR0=@+h`yJ2??2j;1Xm8cM=?e4DRka48bK>uq624 z?i$?P9YSyk7Tnzf!4u${Jo|gzC)qpiIq&&?oFC^p*R_7E)w8Boch_B2T~*y(xIe;x zde|j)xZLOVtt#foK>m*_`s>hDyEVxrLb-q{z1N1ANDUMxjCA~0X)%4=Yp)_AqEIPf zVJSvLk`R*2PU!b2%~)1BBE?x|YP1N_>d0y`jA?upUqcg>N@J1 zxzx<5+&5xV`)z%il}8oX{J55k08-4kFK;IMuqpW@5R0zfyro!f=I%=?A76=hKq0=7 zbn-^b6q(~5Hy?;5v9jVpU)X!5@&y7h;#J(__2$<|0g=VI`f+v}sB%*Ck~e4W=n8@xmU^Nbh&IdNqy-7YpaUvmKBiF+M1oD-MLJC z+h0#j${|KPS||J&4D)ii8ozFaN!4=U)SuN7WB!W;{h=9SE} z3gztHI+~6ac?uI@%}`O6{-)>og`pQO0rdj7m=Uoam>sqgPiVBB>Z2R~6obuY_&o8n zpgNk?iy|)#r5aL3m%exF+ZF3!+ARLPRxiA&oK{}uXtzwSua=U^aG$u5yt zKWJ-(iV027m!+|$OuSbfDwC-mD(H0k>Ydg>v3H#F}hnlXgGK3X_u*#oqV#smfIKJ*{wcElm_mApl`+yGL92{Q)Z~D zyx5BR%P_g*xKFGq-9D{RS+kyJO0A>K%&23WJo*QIP{$)<*99Um^2MS1W67? z8xwBvyU*|TaAnG4k6B_9Q^-*$fzUx3&QfBJDGX0ZD%JAZ;C2A$aDYGssl_lU;AIJJ+^K^%7Aoe!ae$?udCZ*(= z?9$`gw=BB>SdEBi=e_?#JCi)FBPF8PFVD+74{%2ZT`4LUy?TvujKc)lOARGLy6OlD z=;``oUtfPQ*up}t=AtkM11h-0ugD^X7kT!(qC=kZYF^2X#Ox;qr`kW!yMVYnvDvBu z<=0Lagfk6)hx`}|H+iirB!-HpF%S0~rIt=gI@enG)amJ=x2*F0gy=)D$373He}BF?BE-58w2(Y6X^gQ> z6tG^lEM+wUuIUge|L1!tF)xe}>zU)(l za-V?T$I^`&RmYpFgCBt8N$-$5Cp?2m-=Jejq1r{XS3En5DT%8s$mb12$1v!KS#7L) z+ng;ya(hgi^Z;Zcjb+{xzvhZzb%Ez!CfzszL4Mtz$=?%kBMa+q$U`pih>V(L_j$+rYLd*8;%jLkaejZ=NFcwTgakKx`} zmle@A4YRJO1dD>{t};rq3pnLr{fBWS8Dv{}`5f`^jmqqAeHhM?7ZS%@N+aWR>^ zQ3|F_D#A!Vheu6LR$R&VHEa)PmRA&cl1iCi*j#L%Eqvg=2#3rSpll+I<;5I5JsO9I&8hqUv(2gha^nMvf*eRs#w&TjE#R&^ zU-9{?%laH{7#)7Dz(%o2Y1kF+Xd@!8g4K%?xv{Z)+U9-kQTzEdp(k48!mEpc+*^TX z(vSlararidvb%cn>(938Danc06T1;l#Y@JH`U)a@d4Eh|qY1Dd=z1eJB1PR>eOlJ) zJ7gncF&RNEe#!oDcePQ0Pb7XE?~vN0BgAn`5gdUBpo93&Y@Gn2-p}%0fuG7s>;|rR z9cKyw+oNhDL?h_2IdXez<7vf+rJfyE8Au&G?kdiXT(|hTt_?@!o4JsA^@D~(_!&0y zgkKO=9|eYO6J0$ahLxjM414BC+U2x}vG3)1@Igl-@cQe=k4WDRYc<-ggLY!Y*rsc+6U|WOOX7?RThT0NaLT6t{1mu8i?fud=qVOYuh+Qzt1q_MK zCLLN)2Dz^?0zHdU#eXN|jA2%BrWflj(rA7pah>%9V=L(Gxu6*X$EA$3`_kxRmS&?j zS4?$}o(P^QnzU}#&WYn*SN$g1e&!k|#YT23LTHh{MUUDy&|?fpw)o6LDKNgNDez-m z{18GW2+gI^&ubXApI`mxzdcT<1kHWJX~Afo3Klb?r=crY;nCZK(r>HKqF!`O;+Hur zNJ4)c^)hBU?Y6ena-HDM#4R}D((oU;%wJ%qM1eeJfhPH#jz3=A>7B-D=F5jFM!)eA z;;f8!vn-_vW%m_@$NMP<7Wx!L3gyzTg6?OFkQDhUM50?%`DD)sjpf_IkB+iHq>H8I>a&B)_EF_;MV>R{QU4a3J zW%O+h#DqBCvVU)XPWEP_`24;fwYZ0gicwE(eldSvrA;V4- zp*vX`jE|xq!-C(o%NLL4EQ$9lh^u2PhO-b zO*^*CrIo+?X2jZ3-_sK8w*67kxJUoGQWCZJjB-uCokJ) zQI)s8x%c&Ne{&`HPlF?jKAj>3)d- zU~`2jtQv~Wny4twwb$;|q@Rk-L|8atR?~nktR)0;%x;2YZ9Jq zRsfp^UAEBitDi(QC0d%WMzlM&!a5$z+Q6gq?DdqVc}SDtp;3&vbWRmi6I>6~I%hJi zNiR-b47GBKB9Gq&bC+BZkwR_DaZZi8toQNLu}coinoR7alqoqbCe=D8Xji4iByFc% z^j;?lRtSHISUznEe)W9f%SZ*Za~O|MwxvZcns(9fWeEM^8yl$ft64>Zxz(nQijAAj z211i!H^d$+b|xI(a!sK6@CE95fQum@BzNxwD`tYQI$E$v_B7Gt?t4-&wo=&%tXxp-JdJ9hP#jkbsm@zfFu4AqxPR)8d(tSF#OSJ}D`)ZyKdg$ZAe z;r;H8@W{R|eYZ{PzWxD*{9;|Gc+Vr-(IcCvHt2Wsa9$LVWlM@>W(754cn*W@DWF~E z7!AfrrpIhm`M%yxI0Z7KfkB4DT7iC)-4woo(wu5l>){0np}s2q=DG0$3wHZ&2co_$ z8@|K~w9_KqlW4sV_YQpKpVCS|bXL$K5b;JqdsmN6#|Mna8KN=OPlK^zlfk<4>4j2E|O0(H89ogP6`D zwSf7vkWB%m;mB53n!rHPsHb5=lg{SA#JZU+T`+9|hSk$98ZThp>c7tdxCVc!;uOEB z2*g2OGI^Sj=FFH~b#R4&6m&2VMkK{QYyI6NKlXtzKmQsJe!Ah2(UAkG=Oiw7QMfv#u@zB`(yDvJYgg;z8T~>gI#{C3S{mfP z-&al)vDo!}BHZprhXU(W7*3T0F)+W&5ReMD$c~@F!1ak-C-E&>Uk9Q1`6BUtp6Wgw zY21u#h~f$5NDDJ(@v?kg2DEcXFqZNPTt|%uLu89A;-wZsb{WPPWWF-v0|o%h_km4O z!`L}dW#}c1x|J($^a-P0sz-*@91+%A1^$SRjU-nKFofhp{$NAqN-WxOAJU{*?-ZAo z+{HB)kKItXu8IC3L28nSMXU`=FC=tJvIw;BceG2{-MdsX{FopfrJe}|W9>e09q|iN z_jd%|72y8}|Hex3V}+L>NX^78cn06~enrZbu}P~+)nDOm**5+-JI}#q_y&VD22%Lx zGbygCWHnmtDztgD39w_t)~*Lv5s--7WTk$P~`wQx}xtOM?gDzDM> zH`L+et~If0f8T+MEcbqRtWOq?cK~EECMC&BDw%7J?)%wfZ03D72M%kZFQC%|sZx|i zD8*4oe;OIpc!0f@kx$tnCR0o-(cWvKZ zYBT^m{+-=Bf`&69&`G=e%akAT| zp3!=GA9OQ_`SVk)n|3^3N9W5-MeY!bGhfqhOAtNd%*RsORI|h4>6OQehQ69L)x5w550}QTmtiykD*3koq6D~3!FY0pe<%17H>WSBRi+6rcb2I1(9v< zG$6M6u_`{L)1e9lQ*I9&?ZqzleTfq?1}Zy$wOdpwQg)~aa8YhN+@xq7v()JH$?ODa zVt1%7-JgkzAV*TIH9C4EQZ(z`zFNDpPNHN4`Jm))wI?}vQ1pnMJOaQrZ(3kFBNn44 zb2I>cZY4eHxK6=Kh*S?=iRsk`VP^IL5+neqs`wavWxipI;`d5B>%zbm(B=nLzGinS z+8e^}S#@UEL?Knz{@c1mB$aB)QDXq6yf1dLdc1qas#uxqN1xaAG9dZ(EhW|EHrM&* zatP+w1`*{nTRHJ)q>gi&#l1Z9`+@E?4!>7~$IUx|L*sb2t$)%L*0BVEh=w(=Ts8Sh z4tUD&QtDl~w=a?0;)U(nlE1stOiO$Xq-b(Ww^qmmzq6g*eG!}Yy@F~bu6h1@vG+18 zyrGT>Ywt)@54po!k>=_|xu=<9;T@()(QO=0p$4q3hVs5hg=|&J{&=_J$!g(SIKgMcLGYu0EZdv zAjb24WZs@7uDj4EMgEbdx6DCC)vSoR7106q?b9pL`@O8DLYmKvU>s z!g?O~rd7Umt&}T1OhJNY$o^Zh!)@**b@W>A& zSNH?;If*7$fohEFvD`u`4Z{ta9z!}hE8k)^PLdpOBfpVqa37cxDG25{Kkz}$_5>t2 zd!&}i&<*LK{ousku;rYc`l?etuJ(BN$$9Epy$9!z_(W9hlcl57i`JtS*w%2W+%e6M z*7I4*fdPZt6P#gtyPLDAc$eli(z|sJ2g)lVY?@oFcpTT~5;VaBX)W%$8(X)hQ_l&- zj%G?+az$Y~RvABQ;UX*#6cb%@JNaBrx=XGd^!g zjyIin{(@$@%TL0pXX>Dh?G~zxGvhWRNhmji`Hls3FbY=xqd`{8wy;vluWtg)0JNzB}rvuZgM$d9(U6?jAPR22gmD*iC8VuQ9;R^}?d-&>cWjSPIJz;ri3_KO7lw=^|i^Wr;dteP(k zd{Crb!W?fqx9Jk}?vo!Fitd4nzTfKZ(jYgmsvs+CCTqj8U~^HVXc6=)V<7G?Ut^fe zY_Y_vj{WV!KS!yZlG1LyH}dsIIj)&ZpNj>JZcwFl(|)CxiIFVN0y;@Dzq<4Mo2(_e z!33*1zKx&(mX`~x*)6|v8HJrRMo8M&tcvU3$NgU)(0~|Pxb6CSM5{#8kZh5o$a5ma zp})L6FjgUqrfI@dHu&vdG4M7*l;3LqYb451Fp71WO08zA`{Jsq55@3p^t?;peFK5* zNt2fSaSnC$QmOKJy3J>q8xzgd;QuHc1i9l-yqdqcNI9y6{7q{7YoH`(>`tdE*abP& zwM)Ka(e%y$xcg8DqM^`*F`Er*C=H=!A?7cV2Hgw$n9JuEt@az9{!t!>&|a-^lz=wL`8^IW*>Q3 zod4@y{_^XpZTIi+{_k6Y&UhdB0QTAcImK_}`l~W|8DzvRA&rKcFg@5=p&INvY)(3F zoQH`gdo(zp9dR-wbKOE~m27beErKW18y5~&*_h*g`&PTT5c%qn`R6`!C&RVqGZ_! z!TrxnBU}DJ2TgXAFC}^!oYwPZ?poRxnV5CVgmcjC6HvM7SyJW3yu$)_9C_QDJ+XnR z59VsWb&}B-nM#|iunm3?Z2lW!{tcsW;pOeoESQH!bG3F!k7TS2h204{iGXu;h*OVr zQ)*pkD*tW)-EV}U_d-AuyPO9CrJ<`l((jj{)a8`ZD%J39J>%Y8YlgG!2Zz1-+uzW<3Ro6cmGgmNC+@v@!`z= z(`edhW7j)e=)tB+^mXJA#>fqycRVzH9vLJ|0(R{{(?OTzb0U&R?ltb#L`T= z+T>s2UeNjDV@zn}f=zs$RhviO^fS@l@M_2d=&c+X_<%p||4+n@hqX_f#)#GCu0%&i z581p8Xs4rK6%g?3OyG}WbCtfPi2YSLr!4-Qv@PDGe+l>pJ{Xmd_r8=eBy%G6GeB-^ zTI}|)t)&L_nNhwJ>#Gb4Ty zLXx1pEZIN;f9yhJZ^9(F!{P0oBuqpsK zTx|IeVX;`(9WmlC(Da{M$H&^_eb?-B_`4V@l11oC4MMY^zcI=+ zxRRv&PY{b3=A%&4HcCmh$T5-!^Kz<0w@d*z7 zTKX3$G-px1l<8=2+DtEtJ2ov;o^@izJNp>lMA7`561_g$9I`=++{U+EXk4F*LH#e3 z|Ga5eree+9_;4*Vv^`DyCxN3#a^-%yJ<2X9s6TtqJVOUHwg(tWog7z$^nDs7uAuyd z@s}N`0LK@Od&kvWzm)zi(|;2=hFaJ^wPvNxc>dqU?7w>)4;AWK8ZYS?U;OXh_**$l z3PIn>{V&hy|7T75Kj{PfvWc0k^?y@0 z4rO+rQq5fT4{AFF73FZYrD?wr!2>n_#RDm*CGt4<99{zM7cq0rhm1HlIAqZa@-A%2 z#B;wBUWK=-bI(KzFx75b{2e!%wF=XZCwM;CN0>8#Fp~!;~ zS^=kL9f2#A8PWp2U&yum9E`x#^MlLhzn1=mD?@V}%{CjonR+81;?V==fiIXWy0edi z&ScWslU`W%Zw@6dU{Q{;G}`S&*{TrzJ~fpI{cB3}A`5E!TeJVoA@=J>ky#Q0LC42q zHd{mTggC)I?U7Ux{nMA4i^473ja2IYe)H$wQ%rwO+)PQ+Hvgzoetq??d&KA@;x!{y zWtaS6^oP*P%cp)OgHJInk#}e#K^}2m{MNrlc2UnlV?Oq`${6jD1ApkPk`jFTgN(U{ zTvb)&=W=I?=_P@UI3;Fp0Fid#Tkp8&OF@rIJJ$^c1D;bi<&H6`uh&y;Z&z+U%ZyxW zlKh8W!O23D@9`0mMixq@(Kyu}J3nHFDvzR@`(w|ufpa%EBZ zR=`h>SC}j+v1S~r*m{5b$U>l?_vEYX+>nz7jgDU0m}2Jng7d+bb0Z|;tD?t(l&J%V zq;}(4q$+q@ZFWl^Ucbqe7*nZ~lb4U%D{VTAnMjq!=kn5MUd06>dXN9UO@)I#M{QqZX;_K9grH4?E72tGQ6O^~Z{+(br`GBBHrxuegP!at0c(`*HPKty zw9<6cS}RpNjKcN+kJV~tNwcr^LSf_;Vw&d_A9CCn#VHeZm*%ZT#G=Zkl37x1nohSi zWo%0|cvDM1&AF0}3=K&~9M*gIu8IQ=2XcY2!M(v53pRVB{=*cY=+dD4Z-s@m$)+*D zz`3j;DnO0c#<;)hMjqpSVRJ9l@${CsnuG#pwTyc;_`50EDhD!~wK|XSZZ>Py4tD3& zW1ZHmts?m2XNtoGExpz7>CH?=&kaKB(3slY4}g&8K1W=KJi-&r8FeMH4-!d9<}&IhG$W%PAh% zYEqQQiWTEK1Pj8kHuO+p@3!bFfNZd-q-HKyP4dToBsfiQF|ScPq*6Afil)Kiyg+ld zE7{4jz(2@i)IK<80Pc7k(Un-MYt8q__dG!?BDuXh7ue|7nenrz#Q6`uP<)-F`TR!E z;3i7tpDvc4DwmGp{UxQjVkhQkb3QY+g(H?dCQ!UdEka~()Lw=LFye;IApwffws_5n zLJLuc%zq(oLwObqQ|ltx(O4-8O6)bK*WI9yb>g)Sl#`|rcBn49hK(?8(6^cJ#8NT1 zSE}_)%xI+XOQx`&FSaj>yoTKj1-59QPAYjW(C`FJ4Wb+l-?fn{JS~ky!F3s`tw?idzmOB(J6t_t3ycjCaEVXdHK>?_>MBhH*5_Jd%Q~ z3Rj^1B`)Ac6A3Lo3RtJpM}!fQl0V?BBmHI`xM<3LB@FgYK2tEP9;EoCf>c? z(Ui*cUIP@KE;HUcik$>MrY6)wFMBJ(;;ywY_G>=;nnA=4LI`2FD-7`m?+j z%6J0}(QGe5OPS(A(XCM+v&$8rkG$9mKwa}D-i|gPP-2z{Y=NURR8>{30ri|LQ6to5 z*F|n23U+2jdS;&@Xeis+VqgmLZhYss_)#^QXm>hSMKwN1%p?awO&U>~(+MADhWRh5 zxI!{Ga*I+IO0O*pU*T%P7+{Zy)Ovs$qiasG>cX+w+=z1;pFQH|c~6My!xng8!D4Me zM~Xv55MJ%%>?|G)a!iL)T+m%uF9FmrGkKu0OQk-Asz^{nb*J`mnc^Z3PF$9O!uI(u zNSsDb-f;lZfKiE7tYytaakDWBcZ`Aqg4dC4gdE>E3hze}DkWl{snmuHD|x-$BW^{X zB0Fl7_xuGR=*y(sa0}=X@}$re310$Lu;5jkjyqpxsrhlqp@~ zbB`l$No_q!GTYNvE7*t$9CIl;p^w{R!G_+}YflAN4x)#AHj&cp5~F+s1OuA@?f{q1 zae&C#prF)9g26L-6-o<=3?NhQTZ#U7Uq-#N*F8a95P+y=jxOZI3B>?KJC7TnLnf~R zZFHFPDMkt0aD6mt5U!5brOLFU`uW<{ucI9~>dbgl=7LP`JVkt6yXG+ov?JIDtb$<@JGR7zJJnk52Yq`6Sj8eMr z2hVd>_*cn7Kp4B4!1$nq+|;nu>?ek$Co{BFWe#}HU;MHnr&Uf6@|Tt8<*Bd!>D5`j-l zI$88Rb5{3z|BmXD8Gth3oYU9?*kD{~9M>yd3gtP}$3DPNsUV5FgS{TZ{B4p6LlMH+ z$rrviJaOz(Z*uS4S7}65{g=91})9&J(G>#BDD%R+i0pu(&+VUE0Y z3}5Dp#4YXEPuseBLGhO81@L^lW0UL$Mw6miv4kR2gP@^%lM3_!d#sk-Ab`-CeIZ*1ijS!*5dhe6nsHss zY+GC{E%DN_+C1b7+sYv*CkneDR47DKfv|?jhu4Gz`o=9P5ap2wwfY3Q?s?8cqrkj` z>V&POxw%|If`%{K#r-vfv9fN^MWV9OOM?)pR3Cq5JsPO5?Xdk^#53nCMh7ganhqIJ zcikrKbo}D6FHN-qUtrxIp<|%ISayK{Bx2Pte-B(YwqzHhChH0CVslS&t@&OxI6FBQ z%Ow0rpeA5rc#puT60zRmKhu2zN`xm?)HgZv59WoT=1&(!c8O#lp%o&UIaK-yzl+!e z#3B=nE~*{nZeSeQ#T6_OL{^;-GAaO%N}l8l%S?z!iXOz;K^)VaNv!E+lp_PNzrtf2 zi2{|e_W@IH>TC^yEOm}#odoEkH!StS=*uG0Cb3K?AWWIwOokM-eR!Efz$-wI=8Q9B zGl4Z4`aJgr82$ZzT*{^(Is&IYNW`BZ;%4sB!Z~*NT#UU*l{=I`Ux$JSH=(E1&_SXzo}3jj0Zxs6}qg$CUN70x+doWa@X z*y?BIpYgtbGFoWn$9lKMo5w6c8aVU~AFcDMTRdl6gMR)N zhIJHk-KvXnD;@!6M_5PG5-sEN^A_=E!YyxmWsMusz^Wv7S}`P1X? z@{6^mLrImcTTq z(xQmZiW{8BYdcKUA2*qPdPrSvBsD1S@mV`{VM|E`H$6A4~T2#G=;LhL)v2E&)I2t3Y!}gdvMk4+X`UxJ|Nk& z<(q!Hk2c*;*YXDgL}h@*9Axq6mi?XKw?RbpJt1>MVCGNS>`etrFNtla8X zpS&nIqIc=Ts@%%2h5wFukRYS;OzGb2cb<$ebZba{b=6cg!jCj{bJJdx!Li3Pt$q~p=DsVz@oT}?g-4cR8G#zfW&-K^rK@93pW$kJA$%LE!n zp~zr<;Pq3Rd@e@PPaUk@C@69zJs<{RXa%-RJAT?}#0CH#7GQo4babo+tbL&Hw_RAA3gEE?bqrwVfS z!xIzDIY1AI?B!y0baQosz3{jyWHQ0X8M`G%+Te@6x$=#fk;X<6!PnV{Fhwld;X6ac z24dQda)CF`9C7P+4oV>+vmX|#0aAMz0-Z?<5FH2azK8HclKdMBGWwFl#0R6>Ae9>% zKDwcnhhbT6>80WuhKvlMVdTSn6|QZ}o)g|BW20NA54u&uqzgsCqx8K33Yv!O_f~0@ z_89H=*$R&RE_W|5t0482p~gjHr|uzvT6&_rQ_CO1C)yZC4kWc7KkV8NXUt(j#BRIheFHqPBBPR>K&wttT zHQNJX4vx8z&f+C(t4^+5_D;}W3T6^cV(a7DB8>O-u%%)3oC3h7nVe~Uw|V3!ZD z&C@Hp{UVe8BY{}a$+HnlB+Bz0MXts)0CtG=$SGv8^^>9#kqN%&7D_RQs49RG=nBYk z>;t}6wl3ZxUsc3&1%?2d;O9`N>pFd`8W3Z&Co>PC)%6O(z|vR5&SXsYqzA9Aa7^db4fYCcZtV~xz{S+Qi=0MED> zYVC3F`Y4_0I72ZlfxzIfUdZj3Jtj=Imcp?j{EbF@S8V9?L1kAYT;7u^^M%a%to(-9 zlPb?fe`l?%FiT>fXP{&adRY+TSGpFecrAI2v(Avpz|X}4WGduWO6joyK@-fu?b0JW zw-mEljIg_>RyYhA+Vxh2rKY{qH37CnUI((+Lh#eB2S%@~TwQIsL~gR!Fht)>UF^~W zchpc2$cq6EseE7cGm-I1loMCPWqN z79Obzt__}#OU!dL%4Z8)@NHGVytriKzb~}Wt9Tg7GI@+j$mx_96Lkux-}ztazWvp2 z`Y06P*9`FIeDKdWJ0fc&#d}G=d$0?0%zdf~?TaWa2(R{MVUw74pH|-p^DER9 zj7YgcyiB}KEMzMt6=ba@eTm{Mp)m?|O3C9^0~AVFg<(MXlnP2^{FU0Qsn(1ZhV*0_ z{d9rIjMjs^T2-2^ETsYsbd@SzmQWd)OA9G|Pc1vDhc5DwL)h5>_-Ii?TQ@JXl=wKB zpbJkVW;WoS1eKGxYxz?nrOr4AW89gVdQEKY1i}_*%qEl3{`y(QqNSPTlObkjx%F0yAsx!d3xg{*&9VN5<|-l4UAOznZoz-&#BD| zG&blkMFeZZ;P*52aKD*=Fz`D3b3&-PAFN4IYpf_k#}FqTBn{i+Zf$`=+(o=0E@K++ zDNAeFcQSx%4dPc$gs)yKwa9;bkSuowq>!QS$DxSl;^SCzi1|p+$=qckA-+$%qQBP=FXfN8&Z4+N+_J`iYRJy(%8Az*lz*f zc2COb4LB8fI>}a}F>}a#88Kwxa*R`aSulqRBP>4fm=?%%1}3c`h{9^MNB&&qvq)EI za_P<+6k%K>`A2{mz)(bEz4#SgE1GxN0B06`@zp|;^nhz{J$(}TFwqPTphu1HhiZ&g zr=k3SoC*!`Rlbr%%B(yuTLym@-&~f5&vOV#Q@Z2_$}>E z6|$aH{XXRq@md)wp78aFx&+P(A1iSb$i68h(&~rrTGr*Pz0)T(rm~$`uc=b~v~b&} z3p7GX!?ZAV4#6Jod??27cn{ z%6BE0E6EPY6hS&;jSVW1U5jgt!Kc@Qs6C@$rItTl2VLBYPGjpc!O?6`fIW+*)_mKj zY=8bgwvCom0p&teqcB-uxC300R`WWbSJE*@tV`Gg%)Zr(Lgz~g&Od5Wb1aP4-Xw`n z(c^(hq((pJ58qbXqo|xJV~8X7Hwz_=mB58tqr{f? zG3zj@T%+4#&+hW6^Q^ox{X|B|?>rowm<0wGc4Slp@9CR1<-D#oVmQ*yu?4KUX`d4) zH8Xq%E-Y)B^IXy0Abn3u7{^;&+s8md@3+mq$VHbJ!=hjpHUOHM1&R z-m`xGNeZ2YvY_t35MPch#%qgapq%`>@$lxkBun(R>QJ^%O&J2EXa~^rd?@E`#?lKS z#_2*CC;8Df)(@mMAeizi(&Ug)V2une9C-e?)hP`;He{%XX^Vu4xwV!AH!(fZqp{Dh%}>qU1wmJ@Kbn1 z+w|*4p&+txKZ&_$yStGYJKr!p?G7a#AYT0HzwxEGn&uaG4Z`auf6wc&@WjzqG0Vue zP%mX~If03z!ZFDo6w-(lGrlQG7#eV1Jek-w=8p`(ei`zqi?@_`N^zeUHXslY!0YNV zO1;QLfLCxAude|LA7&nQBqJ>}Y**-wNN*+z3oO`3S)w91Czzffs>zI<2wD)_t9@hqF z$miP`h1S8T!zI_EYd3A2#}gMmY&$0v_+Cki8p)D_1a>jZoO{7JZB0ZR0&)=vsmYUk zp=Y!TQVp->)n_&YXdRf3u53c-jV;_Og6};d z^vx)6t+jQJeFWVVI{NKh*yu`U2Ese0)1`{+%NtzPETeX{SxxeM)w#q{@%`IK ztfu6g40Fu$-I7wgItj4!oTH4=?5hUTKsU&Gt(Ladsv0qF=tUQ$WNr;Ud^}LDwt1+XQ_AT;u z{Z54s7#4*G5I4+XgPdfR!_q1eCN$X5+P;I{q#zxIY6djW8YX7Rw z)OSotuHB3p^kekGLv)9ff7#6HI=uF|b*>zIblS*O6^b#MY~L|$+hxl_w;<7*yTulN zJt@Bs%|2=cxAXG|LUywnTBOGR)(Cn(+S*5%sy-a|pJdul^yM6si zAU6GPE`d7>WOyo^*P~VZ5eYYr;Fo~c!JH|3wT%zcU_8)3ae=@f?6=2Ajp(rc;Ea#z zpJ-$Krav~RIW-2dI(1R)?59gIMj3dc`z=H7e4(Ce)Dh~(AL+x*IuqGBzbGZ@iK$6f ztGdO}r>Qt*-7x+gynL3j|C-RJTzh1Wie0NZu0FsD_IdhE3n z&;6FG9c4KwJEzvr5FBzIk2J)u!0vrk9*for(E^KlQx%O>7;QIx3nfl?o`N`eG)eF_ z^gBtc!s%PP;9<78hRm{H6NTsRyT=6SO5ZH6M-Q#gtG81HRV(z=Hu6`hw`>zFQ@kut z5pQ;u6lnm@Shn=kEzw8B>lkC}EWZBp{BIvF)iS5TLA4Dugy8fd#U7B2hd13=qAGtm zes`409f?8yDle^?&p!VtZ2rYTotAvmBhb8gLcT`J%DtL$e9vx=zd2Y}dv>na)0{PV zXA9lbAp-MFD^pGiUOmb#J{6QY*;^4`dT$Q?ca6={n0r;2>6pr_(x28Hu0r@a^bGrk zA&qWkw)}(}i4*kG$>|*J4D+7iz2CB^koKoRL`=xEelLjGr?hndha752w29E`70*WN^rvG5YC??Wz>wSRc(CdB;>ls25oje_5QGm zL+(0NN+LK*^iF=VvaiJkP-Q@uI*-6%6aw}8r=Bq(?8dKvbe`4;lv@&r^VN4>a%rS! z`F-b9{|>FD(_fFR2DjwI(f{K=el&yax!lyS0Pdmvm&*guMDF?n8G&WSsooe|Y^+VGuKK-%9Ppw^s0Ru0lYlXl(BR@($z*W{Th=S5luGV%a5V=> z-W3`ONGuPt>Br<5bC$x=HP2aMr`HlQL`aaEOixu*82S2oM&HYf(ZR(z=rhS#RV? z)sT5id9UO;zQu@Ih6=bUxl%?Oo!X%|K=H%MZ`jGGJHcx&E!1In>D~&sFADFEBfIDG z2nkpw`f%fdZdGRqs0pHMAF0=!=H5DxRucz2frsjoHYOPwNsYt=^y4O@&1*3 zF?*ECHej_FVMCwOs55QGGL0SYHnS#j>u3zp;PNlI_8~PQ0kDTK57O2ZC@TxKrX}Ui zQh9JB8&!Lc8#q3a%Ddja40pXOAj8&V9e?$F6;6;vyI9!#Dbh0K=wKZR^W1)D4(5fzZ4*^^zk9~Y+MW(AZv|_A5rOSuW^83fc z>owU+5CgR<7rO*@{HupFwvr1``$D%uY(la^!63L-zA+i{)g|-l|IGr}2d&Fb5}df^ z$(!G4EU^$VIJ-D|>%WoVPP!n`-B0YxuW}2LRs)`YX2%|mlp`nz6+`tCd$R{EpFO;n zgnR6!^e0c-TS)4vd#2cp%@G%j2|KyA@2wPw73}bj|DocP5yaCr(Swy12_bvD6?4DM1nG*#R}AV6f%-SJ_Bbt_?cy5jdoiIH zuFDsArwe92>3^avcq_3US!}2^w{C86-79V3sIP>YQbQ>!1*B*24jXdaDg4+f%LMcA z2UC$oHo?ehWZ){*PhVB|27=HS>zQj`25KJ(V17h?Jsbl zaS9do`Wc0Ie$kS-P*O1D~tbmFoqk(B%0 zxQH4_Yv_OEwg1Mg{BcXCN2zA1r!%BmyV!+#m9N^;flL2`c1qJICi#{zl~!x9=RlH8 z`%)C;{gq?+()8_CWrM}q0vCd_%I$on47HM4lh6T}YlwO#%5nGRtv-z=!JcR+bLxuM z#2Dq=<)k*Gtkd0rzDcDruT$=F<dXXRV_`)p3&U=St9z;5ovC^}rD4I7qt=1O&G0ZosyVmsJ z$iJLG{jm#9bog}5a1aq*oX60_`bjx~Qbo~3?@*w6rDh(Y1<6xGB6B@{mb<6*&Ayq& zz{09{{0v3QNMO{9rS$rfyT;segOREC-B~)DUwr1wc&WVY z7pO_A_kA1u_^_F@UG}9<~rPos&nz!wNbEGWop>Mr;6+rbd;vZB*$GzIrs}`hjP0C^-M@sRe zr)MpjiZS;w1lOuk#7gU(#ZT8%Q~LxtbS-~<4!|SieG08GFu3TE70I#!tKt0^?WcLC zx}~#50DWhkgl+yaG7Gk(z5FLpa@%o~B=HRUo`f`If!WCl-NJO(D~A0K_slE!j^4J% z!MUL@mCvr?%^$6`=i=k#PReb#f7W+?@F>XpF6@fW{_9$p-8U8Bo6>3H4$m_zJX)Hm!eXdYJy;s+sLyC-LEVhj5#AUlNFZrw>L@via= z2g^5mYTPsiD^nyfUq}Lbbc(rjT2Q%g;RGYo*TC1SCRWoynDT|o-IjD&QinGJm$KL3 zIijX=G0YA!HHwDr?m%$ax4kYC=OW<(aws?tq0;hZ$)J;BJ_lUhB*f-oRv;p6#(c{s zebn&f+qGTzfOOEtBO4%~EE_-rED~`pJxXkRUOvw=ssi7fb82sCx4MUH29I-^rIYXm zNT0{0u?_Cn{a)X2(0KH^DgQU`oPE3vrCRudJo%IAISCG5ISWB}q?)Q4hrZ$dI8bb1 z7Kja4>N4!10EvY>a3Te~C`;gF2b+h258ZpOqh{ZC2agr08N~dgv73{8>nZ+ug*Sqz*X3Vlb(CqYgg-`#kNeIhz+ofRSa9u4DlVZj!oJ^ zW3=koS4+-ZkG&n&s^hFWvCp_LlK@z(s!ZhkG@m^bRyd(L; zA>Uq2jiJHFVDea^@o@_1YTb}<%F~610U}Gj^T9BtDEG?GkvjbCUM@aO{5spTfelAV zOH1GSJ1Fv`Xp(w#pjv5n-8HfKI0rm6m@8jq(!scsG!F;iT|A0dikll)f~0SkSAs%F z0XaU&z(m@hny)4BU>E$+G9sSG@7j_eZ{4bxLk)D$!anTVwB#o;Q~D4m-1F6%=aBB} zzt@x&s5UfQ99pZcUgO(;x*F8qUm+OFDslJ;aRc)$WB9?t3Av5A`v`oBFP9J6CKHU! z#5u1Edr>&ewy0#-fn2_$L#s=CKA~B(ms18uEQRAsH>T&_9jV3t0$g*cqPuqQ3KnvE zH%sEBz&De_T*+yuQf-mtKcHT$Y2#oSv^nlDj`%NnoTJE>FgR6v4^Q&zST zR3>97Fc)00-fr^zepN!sTx_%MMvveBNYT z+D-3}NeUrI6}#uUc|C0jTIiA|TPu7SHTNB7KhR%qRP23f2;uOJ8jM<5{&LcF9(w!R z&-#tk8ZQR@3;dCc^tmbcHrd$76LRWv^07$lu)wb0&G?o@P5yEQ)~LRY8r;d%`g+zK z5YPhbDD3xdI4rvOe*I*5;UaXd46&_~V26nmOnY_2|9X{C@}wXKcbQ^FsX^}#T6wYI zzRX$m|8%%pxc@PmAO_H~#T>WG2d``Zq#cJs$NW$Wfv&S3zhUB+!FPDb#Hgd@yZz*^ znb@e`CF9=t&f(cGAm&&9IQWQFwKQQME$WB>##0fxX?3$+bwZQTrR?-R9!Zqq)Xj8A zZ#gjbnC`@EVJdpZ{**+T)HKD4SXG9;fj^Z=@*lG#`FjZ>@oLUiw#oyX`DgEjLQ|eQ zxfbkIZna{5rD%iK!}JC=8dEVliNAY>2vrOEkH-2^VkF@{Za~glX3%Y5kU=b zSF;u>g%j$U$%WF0m{^vins7f&d1I+kvHDf-)s)2jJYVlDgme{7uro&Y2z;SKccS-lR={lf8dBT`UkVwFyNaE zNba2a;~U9|u^9aWCEqKWdRSVKJ9cTeDX#Yc4}8sL3((?Z8ZMQo4UM|McW5q@(-Wof zYJ}D0ZTa=W;u!YiPCA>YEg}8LY~?T#vZP>lENiP{q@Sda=kJy^jyZk$!~FKC8da)~ z_xQu#kj9!9cj?yzocWFQ3ts4AL7(2$l6%ZHCBp*shrN3E6WdJ~EsnkoV#){{Ftno?TaMs-C z7U+7{8tfJzLAwm-jiP!rc=PVI7!`hZ;oHb`5^p8h0y<`-cNV_n_qrJb{GsPyNIeT+ z)xQZO86A2@!d-cGiO8#a#a^A_wynW=GsIqh4Kqg5!`p@-iW$&E{0l4aT@9RI>2%6< zh!?Db;CBRqO&TfU86MBPn;#R=k~7P znsC+7io7-@jCKcnUQxmw6iLIqZoZEAjzg!L7tdz-wAzVtJn7|vd5DPv?rdorc-Nm) zk+&&=bJa5O0`cLt{k7`!Y)hrJeI+TZaGIdIbMs7kwzMN?rzfscqj?V z*c%P_{v!0P<(IaTTs1&`4giM|61Oxzlt*&C|ee_aC(%JD&U%)(30bYN9=AzZN z60JW#(0>wFE(F8uvd^kiFE7L@(jk;F|7a)wPYTSe^5I#I*z*>DouQ{{blx!11|dy? z3>ZxY@YB>Rt4n;gKEsR?3{pRJI+z zf`Koouq@9wHZ0_$q+jmlJp~e97nR`7wfp*okZ+zyN_3ixOJJ3C(dH{DKRpYW`AFLM zaPLEw-5CitPV={N$T`tce%`b>xtg9)u>7I{=Ew*!H;n<+tpxILK{2T{dY$c&bG7^V zu6E`m2}`nNOY+0s9ry=>vwaDmxqU_ zfB;spAUr&J&5}82gT(2_3v|jsZWWUE^=cQLuVBl%&ftTV`NEJo&hW>&TlYDq>gwGT zEvE)bsZmGf7I#*X4oq(w5k%lzP-?u1l~ntAf?o@Zv9%PI(`CHEy;q2Am}|h;Ji6r} zEsMw7rOLxqp5#sDTEP^c@i&+nV6-PI-;W^hpU*!g;y{Z;ca8HgmRAsLWTOc8WL=xi z#_JFKCzJdmah*z3@VfFGb}PcjXL1WtT>J|z!J6bGb(fN=>C1a-H!B~s)F*B8cA04T zZTD+ePYdYiI9A@SVMp3lI~x$a(_QMfC{UFQ_-OChS3uvRmJJl-;t6?2~1L*;?Qzprj0biOTrSgI$XoT+kJ+jR|1^q#XX_|$MIJV|u)^)s#d;Zm|> zciR3}8{4t{x~t4{{<%=9)S1TF_e1QVZjTR!X;yM6^h7l#H%pN{x7HD}#A?oK_x zCO9M&mvj^6zScrW=8TdBZ%4hmjeU!b7it{I+z_AbFqpG(r=%R4Mq%wFt_DKKoU2yk z1>13zyD?_?`049k>9aeY{q+Rgo;#FWJSw#J@bF!e+hsm^nV=)2!26uWXf|4W_jE~X z$Gjq#eYv+#JOt?WY&X9!_hQX8{Lx(a2)9yI;mJoufk9^z`&D?)J;rVioLOa=; zi#WWErzF{D#DO}D@qAkp9U7)|gS-mTW6Raqr(z01%~5T8WgXe9q9nRNueUMJXSluFl$ru+2aaU|D|nhfrc&*>;0p%{tA_Vap6xdk z68~MYpBWt!M|cU@L9R!nBluWJ7cUB~eY8nVXGC%>S`TY6uv8C!7IAOo0uz?64Y0WG z-<>^PrGf5qgNd33ra%AAiCswv!!Db3E)%W20sse2>2Do3Epy<=iqF6@s&*gir8Q7m) z-L#U#{OWuxuKe4?78xft`5n26eRcbcwLkX6woMCx3iP$ibmxRQeP*|DZYTCHG~Z3C z_NN&*NB#}uJSqZ&w)R!D93Pe!qf;60{FV7;N zgPONOd)M&xhVZiI^Rq=E=1_)*wn>IaDG%agcSqmB_Q`+TdGs^)opzg{wtGvUSlaL|JrED7ZLuNA;d&&yy3T-8e=%${Uvh}-2SH_(*M z6)5fS^~QCF1Qrwh!LdW0*~+7>fv_cx(3Od)4fV0}7Y@p)xc=ioL_oYH{%I#RqP@9o z{9(|-lWFfgjK88FahV0~0Wqd`6n#O&nIV)R^P;W@Ww~kP4$dlSGO?RIr(FgN`F6YQ z*>N#RIO3SrUcW_6J>Qon3--(kzn6*rnIS2v-??Be+}oj8>)5WpN!3aoHpp8qpug%{ zxAi_<3>h@&2XnQ|+va;#Wf$YM>|jl+)r^wcu4XMaapq*5paVV9cy8ow-d#`Ma;*~5 z4@k^s>iCY`$NkGzk=%fYK|AA$D9fG*+UwQ=wW1z}nk65*tAj(#!TJyg*sy%=u&fPUV+F6l zl~OcwBfd4!2x|)Ex$5sIJJC=I+Xw+ff;!j)WuGPcRofPp%qDfRuf0(v0VkwLb`wVs zOGJUEcCSN*4QNfXyM)*Ja1rn)k)pyr5&d1;)578eBi+&J2#Q|g63;f6V<&*DV96>M9Yi#FDT3Z$-s ze4NX4@j@*cn;LnWsr~eSjUu`bx`X|y%8vqd0=~4&0pikVVm5ccXr7`FDJvENLZ-9$qE#+7zsP_?uj#yDg7J z+RI(?2(w}-)gIcDYNYRVpgEaoVb;Nd6!lzwc!9?3!E9$uy@U92o zTXb7kQomEijhr)k{pt=j^dsTprK+nYr{S8s7QNiFWVQ9ft=JU0v6aMK+@M_9C2cv< z*Hc(L`{T`l8deiPh94e(#DY6x1ILFR5!jS2xo7bRw--pW?~kl!i4=pian$JOBZ_H8 z>u-_>V}83@#}W7vJJJFR%~Nb6kQ2m4UuLTat2p>jJpwKzaByLMi$+%WH2V z-28$wN0#^m;mQuPB|+q30V9lzacX!4GJTw+F?v0m*$9<0Ym$7v0&APOwEqwI%5@gd zKK&SMCjGLV_d_1@kJw(V>YdypVPj|yg8o(K+4B&kH6TR7D#vK_vCN#aznGJc zs)JemM(x808G0#=WizwhPO7n*D)WIhkyfene-j<9k4)bdXigRmT-F}2PC{-1upJqP zB5j^l4B94HzR8o|y&VvOa`5-KgG$p(Yd-$ujHbgiBsxP_2hgMg5J34yCd65Ou#zv~H{gh*MLA0h33WZL7>XuG95;UVF zsa=04T&hHDQCsqxVrd~fXlJzZ4+T5w*q2ucvpbKH^pGx!c9bZBU4Qx%e*2QNlvLNf z)rUU=o#XyWL)K^XvFSEQSd5~`tRGR6r;IgIbyDu|^Y80wYU`({lz-+<67HrP`geWN zeZtC79NCJwICTGN;9z+Ex;6Y|C(`34C8ARnM8O>$PpFR9lL3nhIxSm}VkG1L4PgJ} zru?Bx@K37Prr6>Oj?|KC3V*F2rYEVq!QigQm32SB52KpGY|k?Z!|Jj)vg``8Pf62b z!}=Gqjg7s~{PH^;M3-Eq^CtsR+ydwuo!==1 zK{~rau2hnr0hh{#=2u1m@&u7@Yh5BAmfP?MngnM!1C|vFp zdmqhE*2%Y?nB72qm%uzgsb*-N3|aw4D%gtp+&zR+8w|=k2`MVTG4Kg}uDxvmLc9SW zam)iUl7b%waX^k(IsdB`#7ExtQ>R8)A8t;n5vj@NVF_L_qyNxfaG8HAt1iuN%e)+S zD48In_I~o<7bCj4GRl28qJ@iSzd;TeLZy>+vO@Hr@uo=HVa50Y8w-)466^n9Zw92L zv~eEX{m%SzLR_AzvIz}}^GEY46}9;v$CFzJd5P42us+gE_W?h5I1BspH53^T`nptJ zZ$Sbi?7nxP$`hLQ0+@unX5$|`6lOMd)yolhMy48RNZ~g*7*QuCB${sc+l_yTk|!ax zp-JKIfNS(Uob>aG_aoY`SYNk@(vm>3k9QSlTEmgQt zKeD)674cncep|gYKUULU#ve}IYa?7Fl*}kY`nE%dNaeaxi=ruoJVcWQ{wbRQsMnk8b$R`vZT0$xcJ!*N#JM4F!hNNxALt)bz=`-1_~ z!Xbam&5aT|aKPAq_53y^eM+x!I9Zjz*ib4{u`dFk{cO@8s+NRd%q81 zRkN3-gL|;yPxLg}T5mJXDqfGvfRF(6slQ|ShZ;<>a5795-UeyRPVwujcEwCLW$iT} z#?82v%7ch~*PG5Gcug8hKt^iFX0ONHu#X7IFI1Hmsu)mFn}yLO6~?q0EUvRK(KPC` zOTW{pUXdVo9ifkOJv;PJCM$0Mu7G>aU zura_7C#MgZmsO1eYX#|xGOZQS{2jEbiJflT$i-QPalnAbY6*9!GZ>eS1Sa1#kL_Em z*iBSSiC(9W=bi=&5fR%j%El}Uc7YUMQ9yZMqs$QBZVC?8P!2u0`q}fxIB<)68cWDJ zXf~}JpKmoY^^6E(Ket)g}{C>`E z*6weknI3=oc}8koFq}x|kH9X?kT`z{@UwcVhVt*nBEv;M#`LuR^%`OLzUZ}VgxPe0 z@jx#pSZT#)zpk8!!D|>wUt^z$kfVuI)BQkL5-TTqv|5Timn`8B)RC&|N@|1Q7;xCfQLoH+Edf6_A|k^RifWSFv%ARyKl$FU8`7FC&jr6O2C8u*CGWaa z${fk6*D6k#yI(U@7#(Fel?&M}OE;7M?is#0o{k@)wBp|A`XczHgtGam(sK2SkD|VN z)=46#>Eq(t%**!YvN}*9Sg)d(=cX0l*LVrN>?T*lF=8rq~zonYStFRNak_VYdRW-!erYM&8yeImd|Q-I3~g zeU|WaY3&kvZrUySx=1>E=L-8a?%xr;Ni8<{?7NXw0fFqG)|Q_SN{Azbv6#`I^>6*T zqu(Q(6^}1BW>(&=a=y-5La!wB8%W+*rgqO#vM<-}C&S|_s%P5TlCobdUHGqmMJij& zCV6cX4#6qiHDM|IOK}~_uBh23scsGvUBZYirvvMAdxMH!E+ub^hg!STr)p3u17-z$ zc7>vxXGP`!8ZBS%roO3zEMurb=9xB6ymE`T zY#+V8oPf!H@e?>?A0zqxoB6lg*)wgK zr3MT}8WDPUH_BIna0XmYdBuwh`b|i*=D?x)bhYNW*wel=O~GuTLho|7I>^a%wVqJJ zk=6CYNvah=$13NfoNiS3qHS5*VROEYKLx97L z)kQwLcN)#7L{K)XEx)GZ5|Av=de||f_5B}GB+haU{<0f_zvXTSRYVU_x%y)V&>aG! zEG#Y}TH=m;WoJuo6$x5u?#`eI1jelaI&;O@xm{Rv{G<^cUjU@(T1&_!bOQn(Z+O0C z7vd#zNWzt>7ws)dfoqT^XVnedy-^3i=gx71A^v6Jm?7Rh?bg# zVHn%d{q&b*s4~DcrHbxIqIv_J*C;cqvV7@>{zOei%dV|b7N(*xq1vNQ%by)@CJjK5 zW6kP#9Xhu&g^|fo>FVhc7ICm@834nvX>0V%32Em2fUwy|1&9&^*vsh&xae4HDc;NGQ`3v z*O3G}tctWGZgQFMEl-1saN;qXFa?2bR+1x`#*UflJkV11-Vl@eKgJY)?;|ip-&L}E z=aaR%^dxnz$_`dCMpiHcO-SXblI8Ezm3zy$`Z(uB4AOAWU*7~(!t7kzVG?(<C*JV}6U^Mi92ABVpa2cuk;BWZw_+a;O`_H?- zpK_Tf6)Hb<7G+E-C$o_qRTtxk>&m4i>x)bE5x-Dmc>4v4YDj9mU)e zqcvGP30H&a-NnuCrKk?&X0-3vcQ6;vwF+)d*c?@N79H6Npu0KU9h>z z@KTC_WY_a(YB;Xts!k`t9Ea#>hTbl=PRSB_b~yI#7z(L1MDGa3y^oY!UY58^Qj5L2 zB7kw+!4ENk1Z~gI{32$Qb3EWn9(W>ls{^Uou$Zqja7+-KJT6}8<#lyr2Qie|>(aWJ zoZX@BbG*_Ic4Pw>e^NMKzGiI!Qm{& zZ41*h3=Hfd(LZtDB(H_OvYWwrDAg-_er7a$;X8QJ7{WC*3>|;fJCKY79{3*Uf!zid zt`?^K2AwQlew-7DRWcfy@j?7JKF=OTSZ0FWK$u5mkW;pv7Z>OI^ZcImXZDNwJz18$ zfYizbf3`fG`a(N6Bmd~D4qc2c(8HT^nvtBvDCk!-v!8T>k$Qnw*e};F5?+AgK~%u9 zuMrDV%1N7Atc7I#n+}t^b!ZA6Uh+K_O-0039CBay&xDtIm5ycoRh3WdoUxGl0bI>S zOV+8%&nVI_2VcUHe9CD3FB>gJI&QcFKPShkS20rLE-LdK(cC$;AArsWpWwgf!9Fm~}#rRGrPCnAm)9~Y*mAh;)lVw$-Gjp?Hn8G40~k!%>f`| z;r(!B`4tIWxa*FnZab(Oa{}M{6okO&dYqgEw?Lr0FSaOUBILwF{a9B-aTCJ52854I ztmTLIhF)5rYR>Q?4*7207ax-C1Yoa}j*wGf5q|&qK|1~Q2(dNpJ8Vx5ER~zZ;-l(z z`a#@{CY&spW~bl@_6CCY0lnV6ML<2MnVr|R*%ss1DGKW7GezSVz#7?4w!7CAdM7<~ zc$X|dvz20&HN&%@xoa$PxVG5dU?iR!BhW-mGsN&?fJ%I;8aRVb5^O&2<03EfFXG zxoCP((@8{qEEniCnL}AFe)r2yQNu+IxACa16EGuuPc^m1Nv~t9p#!&%>NEtIVxN(< z+otrzjjR_8PmnZn>~eFP`r*%5Qf%OAN4Zqael^8iSG?eIoDgIDS1`uD>;+@AQ3(@w zCa#y#5oz=7E+E3MlG9MRB(FEcZQhRC#0%>l_Di>*&^+9J8Y~HVCln0ILvQA%O4ySR z0NOvR9omvL=w$Ri$rEm_FTX+$JS&qaNBXaN?NxL z1juc~we^Zc^!?4+r>DWCpnV91Cw_L`OujQnjcSdaPl|FryWs!3az%fQjNKOMPs}Z{ z7mxiH%|(bPZvklluK_nI!ly~Yhn?}|fAH{hjE~~W%{%n>DhNHol1wI5rsJJ%X6@jV zcb-yM#@jm0=wUd4q+XZb#fFEPIjcBzJm{pIua|VY=LW*VGroC%K4f7Ukl1s{7GlSG z*%-)A@_kCA{$>bdvsb(A1|0xT1c{>;Vk>q7upPobi|%a@u=1V0!eIRLfE`tc&S?y9 z3`s;U>yzWj)F|g^!4_HCG!5a~-)+Nn91#}L!aWCE`|*}O*UxHMYhwmO1ZO;KQJkc$ z!R}Hb>oFI&#*r#y>@kgg@3H@J^Y)%#|G8|S{^0Nl+YQE#UrJYLUGr{KlBXK`7r#N?7fERhlp?D7d&n`gY48n0&&@e@v#VM zZFd=S0B+Q50`>;=`m`_xf1o*O#%U9Si1K^JHGgDi-012uTkfYMPfcO>%FplbgVDgm zU-I$R)%&En`>YlCuETbcRqv#+#~ z9L=H!#)sLG1)R7wh$$K(r*jS@?9dAbdgs4C)r3|~k*t;%@$u@_1!-Eh2b%`l2B-AN zHsjVD1wK4)I&)b>f|>%)PAe988!=N0;KIlgJ-puQYnSbb%r6HFEoB3|mug01p!h&-nF)WZPjC4o#blC;;aKaY@_N*VtVGZ^FZ(A8g6vref52P6Errab zYi`PD?a?ihAM2WP@rGy3@Xk@gWaefOOr`JFqS?p{$D@we=X>Z{acvLA3v{Yt469Vq zm;~LUOAwj{0b$uSdKnD|b^7xFgGr6*3Rsy(15M2XgWT(kbDIW_MDv%&BR;m!*$hW& z>jscgnw3;-oOd$h9sX+^BJ+{WaW&y8drM_iOT6`a9#&<-xXU^$>w8nBmIS5CNVW6c z23C`+IjFbFVdc5J6*FlFU@H(t~ZIilxE5e}; z6L@0$Qca839kS@cqQ&7nRrdLK33TU&_yx<0A+X%@GSRC!tu8meeR7?|+YU9y$uTIK zqWiNBo&c~6GsSayu_LRz7L0!i6st+zjJv5RK$9GuNz+!9Q%1CdqTBZ!_8i1_Tm5G^ zd}Upv+9SeMzrM5zIqE{3|B_JC@A>KgBr<1;5f;miQa;Er5uZ;m_AwP3N^M-(u)821 zs>SXJV@&v#`|6~2<0QfOmLXmOs&6?YDU>#5K(Bk>V$r%&J{&ehBj5+>hkz#*FZ!-p z9ySI)->Z(cy>Dv&cGG53ao-(#d1cJ^ zgC`gtXno{3vv{~vSpR_EPiu{-V|-p4rUwgbeX2#8&;*i-x0dMqg-zC$9l?|pO%GS# zYYzU-=|b3jT9gSj0wX&U;=fBwSU3%^)XZ~f9k&$7#|EL!5Rbbx7s zBi+G@4D%!z)x$Bq#vEqH>=+cu#DgfA&4q>fLAg{O-CS5{`4t9XL4al3l6L-lW5a=!RToOj5JdlSBgJmEgVMso z8a`G22a(8VsiDQ96}9l!lJ=)aH~W`i;E_wp)U%R9Mpr9^A^sUQdd`8E#196CziopC z)vc|t9{E0jb+}1XXR#at$6Owm)FAE^2?EXm#Uj=i6jBe5L-+8>1BhiNzEt_LnW^1{o_ z`~9xy0t5I$(n-HfP>Q;$vAbfDr0>V8j$zD4qow|^Xx8@ClZddRhD%HrVrbGU_64=h zQF~6yeI!w->sY%+|9l!6i8w5|alX0^r^r@0`xMYwmTP!ac=(2Z&1-SW1JQ55!?Rlh z<55ez>qPDF0}Qks43kiZ0{!5wzC)KkvY2bEz|AYZ0P7GaPW4iHQk;xVm`Ro4D$&^D z^y@3sL@0ncFSV#|x%uA;!@t1qzrNnx;dWBT+VAL>|D>bqXMBnh?TZU-XI^16mf1VY zMbXKa$#iy}q?h#Au-aS_ML$Odf1o{FRo5ZSh_(kl0vzdlED9nFLMT0c-H*j7?NY+Q z26XiE8SSSiXHduHe9Y!B#ZWHI_B{T@r*IdkVw^Zh_W0XX5pVO0 zUs|NlC}TQR%y?GRua|R@3fw-RRf1k_r}Y$7GoPcz^vUI1 zUAq%?Lo3#$z^TXb^t!OyuMlD3+3boJ>*1^}@f_#+w%PjoeV2$ow`O&ezEVTHpEN#K z8K{rDI0}dM`o+R7YPRb>q|PAs|E|CsCd4Cx74x4UOt7e zE(y#UJB(nwr(J1O9rM3>et8gNJDH{PVfbOo*==A3Y|V#)BhZlGRE=ao;PhKndzDg; zK|I+fYnL6^x@HI7hFhgROu)x7C8lXVf8~j`ZmW2P_aQn~#5ktqe_=0ye_^lrbce?+ zs5lr%^M~_()pWO`LOy!CUzu6fkJE@egBg7c<>6yW-c3(O7WvvS zfABU@eJyJm5>?)mb6}L_cIxJK)sX-xHFO>CdTuwHZRmZg1Aolpt%JQ}MS}@LP3|^F z`z&ToKcD7CyIggzDfKVf9Ts%irpqMU42$gOAudQ6=7BE?r{Kk4LhHbm1Pi zkMa0x|FSXCADVvOe}73&Z2cT)?ofhP@Y1;d_F@@8SG>*^?(m;wf$)0}$#-u;&mE1+ zaSc9>%OfF}(E5fFYtb8hO4!V1of`Tq37RQ}j*K&ncZ)w^i@t88hkfL32q*(CtPA*- zUcZdI%syfx8c7zi5#Bvim-)e}_ps`;qW-rb(|oTk55*0ev+eTRd)vKoGHXWKjlY!K z+0=VlNKQqn>QHK8)Gt4C&Rit{F+$cZSv&VZePQJQb|8U3CqWsVtKt>jOeCQ(j7IfX zKMhNpR^p{^>EC5B7A4~xoQi3iMhHUgWqM)`Z8Y_XrkXq>_TOrbHQuWi3zfy(F@y0^ zm4&J$FDQ1rP^I{PtJyd`okwe(>rdm(^uPXGL_uRg6Q zJ~xK>{sqh2jpy z-Q8V6C=_?M;t(W2kcV@2|Ih6H_RQo>@**;Ge{!@81++bq%dFG>y zIx6mON(=S4Net45h(d9Ke(Wwk1d<~1=HD9%z+=rPVGoyAl*=v+0<@&65k0Bj#+(Oo zl2GJvY{6ZsQ?^ydIV!{EYyH%l8NO<|2sAybXEY z4PDFU*4_}^YY#xQb*CZ6v>FU47Q={=^D}LEEFr`WSVX}aNBde`*BpCT0abzG#A`@I zL_vtnz|%2k`Dc-`5ZqB0z}mT=3rnZF|B%(w^^v0)ri@CxV+@|dQYxXiFO&3W*BIw< z=*(~5tk+4@^BHBlSdaig(r7?T>0iq;Tt_d=hInwIbyP!x{xr%D3SZ?xiy~M4UlxGB zCEtD>e?JREeA-T#rZaJyAHh$Z5_Li~Duwau7)kaga*-+ydGccD4;Feaz7O z(Zmr1Xqw~*7mMzxL5yD0vqK@R9*e%h=xr{7xOC!zc#q5mYHBaX(5h>Qe@5~A=z6>z zU-s5s^kazKV~Bt6l_0i+LW!!*dOSll!^y%Fkao+9dGcZ8s|I!WZ*R*tRF!j&WdX&4 zu6XB4JrnX&rEQXpw`j%>2Ravs$otaOzxAmiL(gM~+PrUYLHaJmgU_btT=N|JeY&LY zxDzdDTX}6k3Z3~Ra6k@k^b!UvXK*|KD)1n`;K@LF3Mz1%`+4hOA@Hic3h`ooy#s`*2-|-v& zSJ@|nHG0+3tzZsXGNO$7rs#Kc7|nuhTY1qUC}}Az^01+q@joiyc*< zR=|yp4Q^R$?>hiBR#KdHC?ky@N@Bw-NT55mZ4EPW7>zwDq*D>y_30oJStEc(^GV3K z|Kr6<-}TbJfwTX<64r47yTj?S=KI%V6dgZHd_-z{`5hZ1t7_?>KtRJg+Psq}HEf>r zEsj?_V2}oW*X+@6I(02Rd=NGFHG^6{fVKw)3}Aafy@|`7OrPGhcmEurv?79T>hk=Z zfN`fN3jWVt;jv3T;K;Vn$SkRW_%tIV@uzl`nbc~>Ib{|HP#R`%x=Wgl?GIu#xEko0!t}(SZi>+?? z!K#aVD)pu7;KD^wW7U*HuF@;p@)nMQxa;jtW2G!2GFkuk;L`J^6(@Z$`GBo{a zs8%iPd~uH%s&+vMDzARewo&|5S+wX;`y|t_#g^UZt2KlqysSL9A3ysT!ud)Qo z$-M6^@n7H9Gi+I%haZ6FUOHp%$a z)yTTns92VD`>Iu^mXgG)T0*&SeWs{8`A()Tref!cfwK2k?;5`@JyHxM`t_%;i^7Ko zeQ#b5GcUcRjX0Drm$-b{AB3o2~_cUwwP zLTR7;uUlPDNaG(ay#|%`=A2W`_fs^DuBhP!@De!fxi@~~k2BQ-xN6+_ zA@0;-76f^EdtTE`>(5|X{aQiQG0OSq{0=Cib3c3gu{~)6IV$2i9Cu-#>9lGCbegWh z_Rz_3B6c^5woz`7=@E!29nM!VRQ$E>lv{8RbI{_St7jYe_v`5f1c$>HL3tciYWHx; z8?CTdYGO{Ud0>{rh-|x&K7S|8>wqgGAY|b_Bg;@@roN6G|xr z7ald0@+aY;YYHaxnd153<(0z8d{J>^*%ZQmz85P%bGIcxUSLjKI&aRm*#ABNNzWMm z*z;rW{tT-H$t)=#0l3H3`_m#P!XrYduWwpR2$lzE*R{?0U~nrgY0DcV$N~t{O@I_M z4s1tgQ|K#i7B~d0hB-9qU04_8W>QP)C%7K}88i8oX*dRJb`h)jIc4(QzYqOjKE0N= zh#mQ}S_NhLb-1Z<_La-K^U8=Sd=a=gel~Na?PEekm_T%B&3lV*O69b_>ivye8UZ_n zgxtU88gFH-Mdrg=Tk*0o^J`e4gu$-T(~U|ozpzPy-_@{h^*ZE{x(tyuVYv`4azqzh z%8^-8dc?ZZZ?)!?D%~bB) z%BA=1{zT>YPZ0)ky82%od*EB^yv>o9MPqxGL;0LqR z@K2vRV;bG)-hny^)!$C;cs5; zhViqYVuYaUW=mW8PV6Q-*JC~Uuzs+({M_nP5ADU$(5=Y_Ik@Q6@I6?UmGx^)e zB1DcIdfI#kI6F`kO4^#_iU=I?5~(P~0vHYm-D^b!L_$W<^tUp%{?M=O{7vOAT~Tom zv4_R2@sf1McX`5f(@m=nOO(&a%5~pF?b*$$p_|^U3{=DBtx(=2(K<$PCR76l5Y3HD z)VAO<#%BK3GduCi7ol3?@FGTI;OwkQzS26GCQhZi8uEEd0;CrCxSpFm z0&I|{vxda)W&`r%IKKEBlEPC4}RsF(6JDs^iO^cu|ySq8dS-OouZ24S%{OC8ha+e$6^ zJ?^174;4Q|$5v-0Ey@i7OG~#B$uUXk&N=CF0FC=9gWH7e^W&YwPJ;Ulhq}_W1JXXf zxfdOv)ITzZYvS44Jp~)J0Pf;qb8Wms{R( z+8TGrsQqbcZHet09$w88izQ2AVq*4V@SpNA|2W)?Q%CNuRU5@06LRJRtqzzfum!l> zLE$K~N+8728UT}b{hRk>C-MKJ5(UMvd5`O-$S9KTyHd|naQx|1vhIJzehgB5=!zJ^ zYJtf(5B{rZFh>4RrwU*+U|e4Hz{(dp;YJuS9j+0c*00D&5F0N$RkNa*33a4 z!6%&B#QQ&a)si;4ES|?n4a_rwb&A=7fwdH|Ni;Hf0J)hcp;BHuwP$Q7S!ZXFf*D$V zc37+6h?q==Rxmldd-)|>ayF>TX9TL4`G=# zR+oALkKSf?Ir*(S_ZPl~nT+XFkuv3rf{{Ynm-)K5fY;V$)K!}%;70`t0myo}UfoEZ zJ4v|oKd0ck?<+sLJD?{lp3HjcmZK?pWS;#v0t3d3+V?Putf4cf^dp>)f!pX>Q7}H= z{JOWyCDYk3D)KPwL>YG|#haeFL*LM{W=UtGt1wjZL&#}dEd`PbJu;p9#0b`?K}!I~ zL5kMj0IQ#xj*@VSYe}*ky0Z7G@#!8>YCpwG4aTCVsE4LF#p7n_=^6XKhJ={t$j~P$ zGH5egdoe(DJk<;BINyyemyHVJnc^XObLhpsyId*FCFcAlF4Ljfzgs~`MXQW3bzjrM z)&H=gUzRhQoog-MAkY~12`L>c{*&r82@G1dd}S2|bpOr98quAWQBN{lcX>J5;;U!~ zDgO1hc0NfhS<5oU>e@y-W%Wyj>lok8DA)M%m#mBh#wh!Rx&nCB+KWjOY#Et^m}FmF>d%ezJX_XyP<(Ju1(2Uu$?an3DZ5esz4c4ji$J+z}BLZY|p6lTHUHEF<1tVP6nExf+t{ThvBoY;kXa&Tic zN@GRvycVw4yy5jW&2s(ypbJK?V+uz=X@e|tky4uWHQ{m}bxB+2C?Q*V2)Fr?D$x-+ zGh#GNN815Fv}w~>kM`<1i(BAUoRealqBTx8_B)~FF6*_NZ^7(t!kOGHrNetG0dQB& zAd|G&$6UFf>z4LpGbfsELnW`P0%=Ca{|h~ZbO%yadqI<6E2sV<_oh3gTKVTTZEs=@ z;)cUyaMIp@vON9O+R;%C%UDCd}{~y}jq(~c2tT%OS@MTe;0@dkj&_Nq|h4EGN2KztR>F%*nDHs1%+dh~tTBRUCtRGh&q1UP7h5cEjZ=M=<40^9LADV~ zSBJek_W-?y8)@2Bb-s)Na6;R0H9#nmO4;Seum8jTh>}@=T8Yf9K2Do=n@hQBWW~uo z(=6f=XMZROwsbnVRw!7I+v&p`R>Xkw{qy7yT&VWzwMC03gzKt3>)TtM$3TXS( z-}dnZRS4A$)=xHt)bvSEzgN}36misc-fsHml8BhAW%`<0H|ZFYLg?39!!*KpqE0`E z-jy|qZPn7+!+c^*>F-BAkK4LAJU5w;Dc!Lja^*UI4X!5}mA2DAv+H^s%_r61W4TFA zGStCY>oA3>w+1hFo0Q-W+cH2mg!a+SY7OtvWZnW|nd6vSX>}_#|2GioNitpIAa+Go zfYwuwUYB|JT$=%io9Mpt52UQwS;FMNRvFo^r}3Cj2>~s{4+>)=UJ8A??Gh*P?Jm@z5@Ke8)zBM3EnbFQ<)#Y=kt0 z5u2bZ*6@javj48PckT@?oiRT)sW4Tl28mIF4e%SE%i2&+GIdZ!Z_Ks|AbD86@Wim= z8PWI?4=oAJ&=&TaS<`XY`GPAk6ec3H!))9o7~le^#;zM$ukTmM>{tI2$21xGx3Dq` zRz4)cGK_nde~kmNJB8V{>j z6P+@huE%Uo3C)B>p(kJd3jPmFyNIM{4vV-sUEZD*Xu4nM-ktckpaL%c)>lyMr<9kiY*J2{13=~5=#{^4qugoq5C+xG0NW^6w9i^r`tO&jxH=t3y2M+ci`r z-8uO>u5}7MOjX!E=a=!}@epeWSsoJvJ1$8O@59L?z2mK&t`iF0ok#2#Vrj-80tp^Q zQ_2Hq&3gb=8BE-aoe@flB(ghG>nmF+v>!!V-;*8WTT`~IQ=?STRM4XG!-IArn(h~A zMtx9l{Py2SDcaXW;UukmupaUlg)eauF=3Lv)*UBJUO{`YSpIBCZUB{QB*TlhwAFl9 zo#_%Z*3Le#+?F_PkaxD1x9{K8kGIzMu~wR^NzFM+^Y#0H-!5|k%+iltpZtgx z^QRg?`sStPlZaHDVf+!Qj;=+yADX7wL=rwizkal=5&5qOJGUP$9Ho5bbN}CU?hBp^+O^01Us6qE~Zqxxz zAEiw6lu?!aa_oL;C9}p&Yfh*K7|Atug`}T$@pZ|J3E+OeL>{J`j#6-!c2F`;HEwx? z0*B77Ij!!5cY;;Cab_5K5&LYR$3CFj#JsFj7h(98iVm(Kg|6m_*tahvt>dOU)h(gH zGIG`(9(cVc7|~BxhHxkWK}Q1JZLQ(q=M49G4TukjCIb6Q_z_fPsl~1d$N<$p$?`eU z%5tAx!1!Xg5_7+!Ht@FcwY0L68eJ2#=LXQ+Nf9P&G&-H1t<~s4> znacDil_;|5wIJnFAw^pZ?|HO@Qvmw<8I~DfAf?iLrzQNK_`Q_kYSH2eX3jTCg20`Z z+De5^ufD!h$?@fTH56eED`#dE;=5P z^zLJ+jt7Qvu&F($-J|GgyS>}mQ=SEO?OsW>s~zO=Qm|F&L$w; zSXBJus0C3aa9PgpNm$ZZ)!rQksAe^<%k6}Eg1eZ_jMu@~iMHRiZ3M`xQXkI| zv~udW#rsX!zr$x_Gei?CS5`O@tQe4ZQOrqES%SsX?DBz4W_t65*5{gu*&(c*=IC-MKX*o_tP-nH!V*)LVg49sVPlIm*C1m$0#o`$PjDXT zI=~|l#2?IFm5Nz8u@XQ18E5Fs+M{F@bQ!0lHp0Kdv_Pj@s~MRm&0h2NNZAjW>ovPj za-9mNJ3V{rv@1{itW_H^CuU4bJy(0EM{86AFMZI`2YaGbwGK^uvZ28;UHY}s#;+(W z8-_hf=d6@1{qc4A3Puqj65L5D)RjYNMzIp*sJUF?hqLs^n(l{o; z1nY~VyW<@a6|;Loogcy&^ZCOAIKC%0!HbU9o^@nEXao>XdrIVdrz(c7^|%Tw?-8tt zLF{ZMZSQ}Sw~m7hW2if{2!c#4_>Bm>=UBRq()D!k7|d@pGZw7)5;p!PnzW`S`H7A* zN5VOoNeFdbS^Tf}OS9s!Wa zxHeC7r6Nc8_A)d&p9y{B3FC(uW0q&NnGN5~df*djucP-=y1dT4d&sWsGgRlFTqt!9 zqxxj?u4a2KnXEkRwaoVp*><24cHZM^Ykh(Ry! z95iwwU~3Ful?CMs=A2Okk@;VzjVB;@mW=_fv$lHCx6ZdI%Hx|DRZm}Ujn^KnX+YBY z!qm`YW`FR6apGLo)t$@o_o3uxCqS80sG`cETi)rSPubsn8c}09@JorPR9Ti zXzVyCc`6XxIV(zv#y%Q9u5_MzS2DaJ22tlK?^jG#-5>o4R--~~oq=!_p`FlWCG5@h|{tMAW5$m=>5TOc&7&WoM_=Esu zg76snUw8dK_&=Ps3(gViBxV z>QPfZ8lAWs^Rkb>g)hT6?N9uGuu(mr_10jm%>Wp99A`jV&snXG)sWD2ws(DG@4$tv52mEdYah5ldz;_`p zf|zvhGErJ^TU)_-afNq+K0dp}A%!eMl=(m;mcr@sy%vFUtB!R%Ww3BZcA`48ed(`L zp0Hj^zBKJMxeG_>C9u6C}7; z{>`p6Kc|wP)*j=wM(b!x&90>B)f)5P_ zgshTSjr5g;Z?|1eTK1COEA!@zrg9Y-y8iyMGs0BGoNVN=5LDp^>LVWE7$V_v?mX;a zXDimkhNVB%bpb7Fo3KC0McP4Q@+TJ> z_yT%{ZK>rA6S0HmQ^vy1IX}1N`5u+VB*Knkg7OPcA=q-_;!4s&an)rf?WMjkF$y%~ z&3pH?eus;-b}O8gKLp;l^Ba>e|f%|k7 zPY)`c@(Q?a+~%F0~NDKC;R}m0TscE);%U+ z<5_3$JqaD3Fd1$7l?A)C71j}c+8UqaR%lWxXh+0(CT1zD9;eEgRlPu?tMZsUNsu#J zqO>{Py`uRKz+ycg3M@9M9kh$Xy=Q;98nA~hRa*^jI zk>eed6aIG#iuH6YwDXvKUz~AXr{elB(z#-@HYA6{X>uNPdaehXKcee?k{Tx8T+O0z+K@8B;w;c}eY=38}I6WZD2>CClTtEV{b*GJ}txqcA}Us)^# z6+L)ZC2O=A!%%&OB1*vLvS{c*n?-U$Q7xId0=<<#!mLNWBPbOt4A+n;aKj&SgK zjW3W~{tFFFJ!hBnpKb;d=9z;sDm!mOYJpdb)d7)IqtN3(fj#tiF1Wz2QQhj|x9h3x z*U$OngNPI5Tgrl8O#UqMdsVsh=R$9h=-5Z+;omrU?WGrLoFx{*JWmz{9L~Su>)I2V z4|wQb=kIgjJS@a`9qt}DE2J|o`lSildlRK_7QC%dfn#SO8aoJb^iKgpWt&Y8wurVK zV0zmrDRT)^euNDcR8=LjPG#`k zh@3D*^IGsIjMH`XWkC!Cb=A=}d9^1f2)Iv%7?qC;_2$e;4`ZHKIYmYtqC(=d$q>yJ zYVNzj|E5>FWsuZ1dy(NGku8vX6vP-%qXy^~#l??m>)EV_r1o*-e>8o~ zFzyjj94~XE-tk)14;?lnIB(?^ZI7+?+Cr?m0p`fVW>n=*t}L<$|&wvYgCPJxAY-SrksyoT8dvd#d@m z;vOfVXeXr$Ke2t6K0p2zKOQyQ0SmEx?)X?vYjK_;09(FmnJ?%CJ z{VH$0z4PT>>0$;RfsvQazNul6bu8xT6z67gFIg^a(&4@B{D7ruhvx%#%K8lCyzZ65 zVW;D-vh8O3%fn2_yghWHQT|IH+WK(*l4*%$zl6E7ukSppu_D*8ZP-R!T!rsgWi>VY z^%`Qm4T?@nm2ta^F#^Ew_vY+{i(F>83=J5Unk(RtRPPEs-nc9hllyY^;uEwNl(!); z4?JzQ4oU<@)JMmfRxkcgrAD0<0k3oW%Fx<;9gW%weGf?;nX#5VFm4H5Icl0lMXpK| zr9nP=zo~<(o+g+$$M77%Rwiqt&L@tXL>s^zRywM7#IebS`k$-Sc#*kop>#xZ*6rgb zI6=ek0B`{(w8hbitiC$q;dw8mTN}&%m%H!0&bE0o;CX^{f=hm4|0VJ>8o3jtr4rn4 z&*mWd9{!PlgUA#F-Q6ZKVLLiVRJ1(dTYDykQ=Pi0BS5Tsfa%>0P8(Rho25>F)9(Kn z&g4ij4Cgw8;{vDcuqZ3Rynk_)J9XI)M}d@WPmhS?=d3>?DXf(bWNoNH3EctW?G}YW zt#1?R9E}1PNQ#i~Ue@7$hRlPq6=*1s`tTm=qVDBpDJ)?;a$Rgj&2M#JrEJVM!ERow zMj!PB6c4lOzR~2ldsSgVa@&O;VY#%MpLgiG3S%+qmeYqg%ewWUrFFjHDjjiWi&;M# z=W~vJtS^Pb2ZC9q{l2U@vtifODUONX^hfZ^CKpukav6P;Zy)+hrN(z?Vt_%jT0g(| z4@Ul9CdRWrI6teJH7l2;960(L*#%c+G+o*BgNudfDmTqq0wELUWKq1Kctr%Cw3xVO zX260>JAVl}6LvC_lQE3pard)(k6D~vgHfE|r`HSP9wa#KlUY7Vbe%`;+s7RFeiJV||cq5em^28F4qiqP^s&&5Y0FD5ZrFk1im!Cw>M1vHCBzCH;vJI5IkFzZ@ zn7ejEQ`^^X*5J+W&%XMLdyOGP0Ic_Y$y`Jm%6AwOS+>!T$Ned&o?}@&4)^l&o@kpA z7e0=8{@|HNM|vj5)=D=zsw3BJj`MqzKT%UrYRJA7#pbowKXN-$e8yk; zwoigpHl8F-5QjeDZl!M;|Dg!2HhAXn!n<-?OnL%fspGzd<;Go|%if0-w;wm3UaF5?`-@jHbVzai;lRXCQZDRh2FUtjE3agG)N@%}ue=`aFGiy!1Ldud^@7eN&+33XC!D?bHoz0*8 zlgdH}=V*R~DHJ4{$+1(d;_`3=W+Ue${QSdjkotdXRxSB58q&pHNd*ON3B82F78zs!(|Dr(aXzFhqJTxMP4xM#i zVA@ny3~UsnZa46ER+`sou^ z8s^gmU!3s-&6l#55H^-s8PU7{wCf4&`N)8v)$Sk4gDtiw7@fb;pk*hS!^=1eB zLZ9#GXkcR@V3Z{e+lmP>Sf`>g2?cML>YY4{;(!l)2)yVXUb99Q%{%x9n2J0cxhG%m zhLVtkGR;a0J@WXW;5hctPcl?nn9_KL(g33lu*Rgx=0?F>6-FjooMT_YRvw0tn(>ds}No7Z6d0aV5 z6LXTy%>|E!hT5is?VgIVWp$Q9k5PYBR^yKwoj{C+A|KMuE&RU+$Fr8oDl4sqWty}% z@V`N9;VbKV@xHd(%(_2c^Z)h`OBee_W&IUa>GQk$NVV)hvuUve)8#qeJa?*0V7C=} zPE3tur9_=wiFo0Iw{R!iaa&I5t_4A+iw=Hkz?(`7i)je<$5Z6n)uX`UhrCSmb^Ua3 zY>i_=daR}A$F$O=fAV||&paQ)qsMv1vk95+y#M{h{$Rseh$z9!@YsCx&UgY8JzT}{ z*=o-4_xVd;e+o|Y+D^Q60ZG+!&EBm}RSVg2!6Nhl)lU)o0|L#6y`x=@kve6GD}GF) z7;J-EGB$>Fs}ANLQWNt@xDv&8^@)+Vz~l40cNCCm%AN$nA-7IS(YC0%#2LmirLpcY zD7oGG`1Ks}{m3*dPJ$!FgIH>z6uO9yEz4EIoX9PU-UDPlZ~V{}{;Fm^ji|@;o3@74 zVx$=U?{M3k|90H}TTS*~27Hh#>P`7^TyKQHo9uyyeyXHB&!z~7tDwr&tE1!nsn++L z_?37}O7>~gapu@b4`+-??43M<6ysM;9|y?2V&WCz(Zy8M=BodNnsm_#>IpG<`OYSr z>Q3FYC0A>nngZF9L;&EWP0qI>M1RFD`};>+lHUlJ{Nu&KHQd%_*sL}qq!8S_rU;4OS|bpo2U$8YQD&CNrJ->b&;lS`&tys14 z!?@>Co0v0VMF`zv{DQ>X_XH1j{mf2AEy$tA55-k z#Qq7D->68ebFe%<7Uj&N-xWxTihtak+)&DzE9m<){gWlUSWr=Z?v!9ZW8t8SH8y^p zKV2_iYt-b~=2d;D@BudLXAv6IZt=}mt|BgkHwMh78uQ6L;k9Fs9T8Ru3^%vta)gsb zLg1nKRKtZsI70SH*=*bpYWPgde9h8KNc~MA5SdS z=B^Wkx^FA%DR*;E1f2^jMTKZuDbXdPjkT?rAZBP=eEI(Sdx(VhhAo(ciKNXv z=BNNx5Iulob}@iO+%QFB*S0J>(H076!2v17<0|S0ub#0);`_11Nk{+fY>zw_o>_9i zN@DO^UGpooYu;nMe(0zyZ{BEiIn_#*7CpkT;$&oGJP1%76R=~vA)d&SRWdfnCUME| zhy-SWYzMk-Ob|v43VugqqiBnfnMMxBL0^LvOKgMW&v~#O@`h{z)UJxTh)jvBl=Ve3 zWDJv`Z~S4`1u6;)d(K1DLxqS_^R9h5HI#j34IYU-jPl4>u_nP1gLw{ZYISt#nUU%~hF zDkmd_yw~9_Tv2@$Psf}P*4GuG&EPQ+AO6*yh#GF0(rmeRS?+^*S}C&;Q6t()o9No= zV7g*~5>r>J$pJB|NBNcqGg>N8m4@F)P?L-j8QWSn;9^^U$UASb@EN>w1C(zP}CTJfQuOryx@8TXdnuI{9t#A(5` z#^mJsy^>6M(K0KXs5r9SY%~hsHaZBmCf7KQwMy-!@C;3bfl>uNxG^Q3`9g_ z$@rP-Yr6bvEc(`SU$(W4JZwR)!O_W>&`Q(u)W)r~wdnfH?XI}3by)21qxBDk zqoBt{{}#S$ccA+mtz&D&+1sKhy?#OdTFB&zaXiR^y?t+KE$w-9Tt40T-C0WM4fr)H zOY6EUNC81m%LonYLDm*F@OIqjimH8G_$9u_g7A>n;IDA&T0na=d6SMhbs|Dy1S)!J zGN{|c%u(zV8&WejE*Ingd%Izfz(Blxhk;mq5!Da;!B4>-zw`kaJ9q#BtdJd@UMr zul-LGJehV$g7STX3L(^AaRqoa!SEL%uH5w&3~V&&Ns=YIm+u1d8K5-jkV8^prT5yv zcl`xXX_WaQWbK6%`GObbR=)wk$NZ7Whn>h2EB$sr#tnB_7kO#-vkIb z`nAvrv#EW&eGz#IgMzjJj}2ebJvIoo#~)5-DWQ`mJMo{k{W|RVcA&!T3A_vC9Ut=ypYIQD~ie^|u1Aun#Gvq|`)URc}BBr;Zh)qBw}Ypct&Uury}PpctA=g6o=A2qt`;!J`Z6nL$@mZVu&X;iet+)fUGsx41q@|jV6k8*`{=7} zXEly@?re+P)YXD723^KI*)SYAW15NXj1+hjR9umwVZTSn8PXqRA4tdlW`@ulIy^1@ zx2EtN3Q#ra9r5fOe{f>wM^iK_`2E$qDjk-S$v;m#k4oa#!Ff% z-cHw*8X-v)_j`L$8#kRSi^g3bfpFoym%zOllfB!Bpmd71I?PzPE2 zZT+%h?(A=)K(s7@{pHWA#GT}yB4%fSzhsD#-+y;IuWcA7jbE-JYI-|ZPAx5-|=0jb5juZHb(&G(rfP^h{+e$E90yYsEf(VafybcWYjep)S$#v%YZ zDr@2$VEESLIo2$Z;$K8q-ZJ%rEJ2mV7?w-P1_#B8ex&~}qppNJ9- zQ`6Oxp-#N-p`{5mwLncfEBFbD4|aP`v9EYGgpA$I>^vZM{cuG|tuSts9M#y2nv?$} zl8q>8bhQ<`EUd6a`;e9?s~=ZguG8yNIPO4y?D*X<9mVBWS#B9zPWixcvCHjr(oH(K z0`^Kh+I>hN=}Hwd!cw4~Tzs#J4gY{_@LrsR%Y3P|+Nd|p|Nhbq)da@Qw6p-h>0*$| z)e{P$Sxg8gGIF%F{ZGrs%>pWYJp-A0-)zNFYv{ro%OI;8oOV6LpkY?xjNfw7o9Ol0 zHkZIkLcEs|D4_lChzI_K=`QARC>MXCVggjEa@y)Htj~qq3vK*DqR-uHQwf@!*zti> zyYN#xL$L=5=Elc_2vtoXRED^AtWoG%1Fbx9+lx+^lV7%a;oUJ0U7h=3XNP zPp!^NNrgmT}*u}#h@yP#wH8VghCrm(PdCZD_pq6VR0jtl=L}g zI0KnXB7H#SyMvpx%p|6AI<3;==+P2m%>M7m-Y=}r2|LsThheE&%UT%{c+g43`rw(E zV%lRJR1M@Q+B7DC$m;g5=RbfmEIbpHSjl@&D_u!Mpt6Ho-*Hb?rob@hBK_W!fL@He zvun16j(sVV6sl!|vO6p!gUxbC)?+i$cijL+T+c65IQ>gISTAGLIM4Cr004Oi4A;4w z_TgEbFgcyCCN(>0c2lvbd9E%oGvZv-7O$(Dt1mN}IXARvh0^Je5Xu3etqsrX%6g3t z+_O`PV;O^#LTD#exYs4j17E#j$(uArBH_FPtFz7UA@&JSNM8MGRAfI&QQApleG4b} z%I)cVNJLiTkIFre6Um*BK7?~VCbcv2d18{JcQ6yIyo+dF+-@G1w1W+o9*?#@c_=Xu zkUyUvk?5jjE^6G5f!u+>s#6Aj=T+Be{EHShP$o#t3;fU}K{3ba0}VkWB`G|?lz=1C zHUkjU3l*QQ5R0G|M3Tni`fngA+g@AcG)9WgfE<>4y>plIngH#shTGgHII>6i-U<>o z$p2>b6ExZL_{YR?+5g^uO*}uTW=ng@Kq^K5R~?Gl(&xBV;x&Ghw>GXYd8gxwkPqYWMkAj{c~6fLvb z#PI@Cxoc(r8lEWjF4BDOY%kvNJfP}8=BHLwSLo%>YgtT7JsRCkZvJsb1T-$WPph&# z$WQ+BPHVE_IKjMaIWLTB3_s;Z{4!tUM}gZ!WCd**ySlwixt7gho`B)k=$l``AO7hL z`!^C@hn*tiQ^na-S6m=nsJCaW(*e)yQTuRJoSSj2$1H2584_iFMeJ1vq_Wfk9y%)Dluz8 z%Cd@HeuV&XHNZbY8r(_=?`;(T~u}#AT zoHbgkk^+qt;7?v}tVSc66#~MHH{{Q|R;ordk%W9BMPGF?U-rQW&{<+IzpV z{@5p*FJE*< z^EjP_hn3T@$CKW0RY)^<6%rdd zFs9@DGs9EdnY21E&;JbO`Y&!7E96`6oQASUUdF?yRpOq|UJH;rt8qnjfK5_Qazifu z&4nRZbgy~S+yR#-eoQS7T@1nt29Ml>G16Zr_lRAeCT3v&f9-r_R9xG#ZbBeI5*z}- z-95NNurw0f9U6BC4#7h3AZgq^xH}CbK%mj!(l~T*cYB?)_t`rq=ZyQ_9pnAEW8D6+ z#_GAcYt@>oX3eT^ezVpPg?6ddR@#cQP(qOv4j3|CVjX^H44^S-sF~k4K*M0_z2Do1 z%^1dYjQMBW;?bN7tW`SqZ!hY3#;>b_=eM&8h1v#$&rq;Vy|7MA@Xo$jMf1Tzs!ZWL zq$)`#E4rzf>Xmkn1oRz_I^wfZ7+q?-IbL;)*D`<-b&AKxWmdHbfLFT4pYYsoB3@Wu zp=7!amLpj+@1k#z=;}-<65i}gBFwU`o~o}nEmSC4cA}V!Z?ATV8-|RUX_BIzQ*>1c zyYrga&XQbKJ&@$b)e`7y#OQQi9vf23fTwC`BCD)(&ootksQyUUma2Ro@nTIIH3sX5 zCicd~YRjWxvK-JHx(eaR^xLvp-?8AJ&AguHwAgQ>`#gawwbd#9%5!!*_(9YlHE>o% zYO&uu9g`)q-Ypro%n?~Jd}9JFiD|7$$iEGE-A1Puohor$Ride9NJm9{6bXBykN2$x z75|n(BRNvu0>No3;#~%ZM4DCQ#G%y;;Q?@E5xVol){!$XKslDfs<{lKR8dc8h){EZ z_mgQn-rO1g)-;^0-Cnxd?~df`1^PIoewEhTP&r&_JQUlTXU7T_88F*b2BBA+J6Xv0 z_g2kayKd{8!D!_(_#+%-8t}(4MEhWQNL6*k;We`#X}Uv@gzOsj+4e5)8dNp(MN+@& zNp$ZT4JPF&sXX3H7n88M)RJCsPYNj7>wlEqlRt1a@f)$-8`BaZvj5NOS2-uZPcN@> z#ILYN)i_ydP@bsWB$xq`wjk&hE7Bg^C=2azG;#(YUX?XGqVkYelaed+I61TmM>^lw zJegI!Hq5R2u}#y&M{YKFPo2edU=oEQI}uB$P7w-vdroq+L%z$H(ts3Jj`}W4g)wD& zQ4D_>2P(Ax~oedBjtj|8RcDvKa<7Hp&(=wd?@&#NQtS$ zzMXV`dcvI1yI{|Agknb371!JUqG2Cp|6N!x&VcY$m{iQN!Uy=iwt7B;)Ul0SO?WOB z%xOMpfaOtfSs0^|37P0(SYj*>d^vE`1*o`?2CWKjx;ZdD$?))+srHhBQ;A~DUqB`o z+}3&fJ1vB$6kM8sPBp@_slH}b?)&e|qd#>UUYPN(X=dmGcl?b!_pa}=Z5!PgPSIt8 zTW-MZC;&VD-B+^X=)(@zSBd?~;JY~HsT-pEi;!yj%{b0T_Ywlb^WvDA`@_2N)%HqO zC!xS}i$pr`76v3m(4Jv?UndZD^cwN-3uHbwnhA9pUf7M9*Z*>ilP0`F0})*ALErH7 zdENq}7bAM1)usAPB)tL@=P(_D(F@;zdm=#VURJ?&&1zF*>WppY$UK2EP_MA>R$Lgw zj)N!0V^{w%Qu597eQL_^+7(H0oRx;@>C6*!D<%xXn`D2+P@&x!?eLqV#MWlLN9CkG7IQEP|&Q7=cUn7}$oR9;8ASHGC-(dFz z@M2WECsNlXwt1S}Nj0IDRtMes(z@R3N(7VA$@$i2&37+%(LK)Fn7>F(r{$wJ5LAV zK!3jgI0@A_^>}ArlW%{iXuoe?v(^>OC(L6 zi&|g3@ztSoIe;PnLA5S1xy-kj7i z%DK`P!#u0rO?-3>E^eI`)z*^gZB{Y zweVq{b4R?Af1>K`uZ=1lix2-+`a%y=sL| z_}K`^BgUCH#sP#siNkjjyDua0@z|Jq(rEhuPAUIn(7cBrW;j84`lnKMe&3P@o93#c z2Hg+}MAzPuhkRWwcpbY>dQI1JGPsHZL|zzCo_yn>qq=e9zrAr!=)La&^dks0YqG(8 z**v%TtjIMe`3VcNH>(ywz`YEap97)_oyvy_NC?^4jtd++e+K6uuz(xnP4)J?cW}5S z=fM}vN`A}+lLb>YQ%*tyq~q>f%SOv%8LEmtyJU%v6otxc%{jZ^^amq^uln+8d=~>2 zAA{b~!}$Z(NZqUOirsg|Q%+uAEbf~WrKk5hoX-|-_5}z7ynELBz^Bp2V=&4<>Qsl1 z^bPtq`OYV3{-M`tV=+IWW!8i&$K7Z5~)|4G@saHy>x?@-(58D0B>~ zGv9wYCn|Zk{xG)vWHewcMN60y2mwa-AUlGUx8ato8cex6{K}ui{xE zQ`;0J$fcGAZ#Kp}g7v>vHG93mQ<|V@L5QMUAsF5bk6HBE-loJ>A5|9b4=$LPQ>KVB z&3XT}5|<^U5x3%c#=iA_;U`;1^@>)30lp{{W68tjy=re3wwC>jh-#dHvsbldD|vkg z0L~aD&&Y)rjMgmJt8*umkev&rTL*%`gMLNGUPmvwt(~dFno2oglG|8b_n4y|VB~rm ztT5g(J*-1Hq9=_^@{G%`Bw=PF07`Jjl4{K5*->0}{YeHv{Euiz^$2>1O>tn)6NsE!`Kmcx&} z9lTaM=p*ynHUMO#Kw*hjOjp}HtoG9>MFM3bmSo!jjch`5g+aTvIf^bNJ|%hdQ;Ls_ zJ*MvFW>%AIH;`C5MbzCDl6}K#QPc0VqlwcbY;ND1DM5AvNoy&W^Lrm8zT;mOK`jO4 z@SNrs9W_r^OHQEX-alM*k>$N7xrWuqRqdQ2GJ*A`wBO^i+$YGzRth zz;+@U@#s}j_n3NY9~!Gv2}#d!dVR~dbA5ZZKGqWjqcWZj(^2Uh6Y1I z#{<*wk|||6b)N^)1smioI6Ff9*ZZpE_6@EZm>e}m8@&8XMRtt{Z4TVow9$nSAARS- zxApIlJiy&%B!x}jd(dYA8DJ+*){_DezE+u_4+y#0p?P)cX+iLk45-!ws#>v_d zqN8x+G54Q{q`({0SQ}iW*l*Jndfxk5J9J|1~v6G_n@_PdhSrS^(52i(VO1` zjk|a(%M9>+-@E!1(p%&--?JI>p)~%OyZ1NPwMLVr+F-;oONHO~+Hii>4f0oS>}4q| z)i5|8hC(h%wrmu0S(XCjwup&+b96RnYLic53^~I)+%<^RUEa@)M)+wiVRCdNRyt;x zm)D`ALK7+w^>ug|O`wXtiguN3l~!0uxE`qZ{lpj-K_|Ba_Zj0IgNoIo$rWLMr{tdb zEEYU(%&SK+4m+L>)hawN`w>3JYE$w98oI>0fH#L*8rfT??Vy0iB*h2`lVQsNH8N~T zGt-5=0L@lYtfUc^4WAjIi)y^>VpjFgHQBcj{plADca^>dsp!)~IsfIi7Mh-I;66{e3y)UDN>- zT&?|QA)dY2r;{9;Z9&YD=a;uL{3Os=%n9yk6_Z zb``8Mevq0UXR2L{>kgAW%#Zs}^EIaM8UFmGE21nKq5255f=~)eJoTC6E0^d{cqNQ9 zFXmzHX7$3R@-Qrp(+=u6Dq5q&GeO{2Iuo~9^UR4U)x+=kyQ@A|mfojgbQsV2;(AU@ zF;-{V_dxj;wVm5;@>?_3$pKUz9{@sjbpf@gIf^C(k_?l%+~#wcdbRT+Lcrc>C4t-b zAGRB(S{l4A7W0A6kJRD7yQ2==JtiIhyAj3jp(k&lRV{VHl$esJ|tGjL^;G}NzZ z4Z|44Y%BsvUQ4%Gg<=`7j2(Srj;!L96Ov1g<^~a4?3feU^`vj&fkFxWdn_anV9|1W z30@Ui{Lrk>a?t6!fK~Q*Y0lUH=kD42=O5hXTh_SvWd}nA=J$24y||PE-pU*0l--a? zwEymT;9Iij{()1gRQ8eQSQKSsUKJt5V)Mpfq zQAd3uxgR7ZY`#xDE?9l;BscoaJT)rHohcU8^_wzQJ#HYb{|WxkQ4ebW2e~_j1cp+E zkBp2>I}Uh7pL@;qC!1K=0EceLreA5!`_#>%=w&>&WJZm$^h^X^JkLp(Il)xN#gFiyEihWaY&^l&kbjwrP_hC7u<0tka(b%l>XK|#H8S>c z78ICte?dRqOx*B^hUF|GW)tsbK9$$tdqQy~{_?Q19V#9}Fw6S2F+F*lzBEGU;+iU2JCD6xN#*O`C_%TU$F{ERlTL5#;KYkWl;Yt82=ha3THy(;?n z8Nqoax5kG296{H^H|fVTq@v%JL0(d95^B$ZCo|7z_C?!&b0nJd!=#? z^I)^?_xS04ZUMT}(#B7d5 zE><7cN+<`ic-N8ribu5NSmb_8O7|T{r-zzUtWQ5xb&JSQZ-pY!WUH?tL)JS4RQjwA z8r+N9V;Ho?A=6DzP!PI!JGgk4_k`udI$OPq7?h=N^H3xI6-r*x?l%p<3T?8LI1U9p z7k>Oxno8q6`kF^5+Hw($n2JR`0}|z#cD6wO{@0$69a9q{q+uH&jD(Je0s0y|9A_-A zI!x|OY*-=sR{v1iD}CEwc!eEfpoHq|*JV_xFis3+-?H}0%^Iv zBrIVX&bAe4PhLJl)P14EuFVx`rT7-Mv-O06eOU_)6J-=-%Ovi22EUf~G?UcD;Rjhw zB9|%mTke_!!X&w^t;@3FRPv8+jU(hl!(9l z@h#^Wat}kIudZ&51{pp-NE$}4%BZ>S8!}%UG}D_jWx=uw10Z{xn_^>#h%`>MmAn(k zH-FDxaFPzMd0?%1%I|g{WL{pJC1UB*N5P^*xC=pj41S8hi-h||>>>PMj@zsDwnH-N@?*^-dAD529bDUj-~ z!F7oC%vj#iOEM;}v>9?i`3lLm1O3)Ef&2(SgP-;OAzNvH7o0O&w0;RjTu+WkdlN%gh=L}m2H`2BBidx6o0K=| z@7u=rp(~ZYt`4`KC97yuJdy_jPffZXrEYuHX{jxwiu6R#_&Jf|61$`h!=St|WS>Y( zk3z}(_$u1l$v;Zts8p--$z3;za?@ht7wqG)PI4~o4Et{P%9m5TS_3?i>lyRkbMq^# zD2#~LL!-EM=DYqO1XR}lM3e)6fkV$J81;q@i9<;1UZ~-%yTr(Ekm*b5_H5H%gx_QkEJ zi}lO?&J;0jdJi5VK@t-0VZ7nm**mF@Qrv8FGOx zw1}@gSq7-nY_eI6@x{q&Fk^7?;&7bMmx&y<+`6a{hDAJb$oNaHdYx-u$whFL_jz6x zmRO)!81{?3f57k1n1@iYX;uPM`<`)H`-#VqltOzKV910!#9e30KC%8(q6zicwl6b1 zSHP+lLS=Jw7PBwK8!9&{f?P7h%>l9e^ojSu{x#H1ES6LQ01gIlc`j}EpxZz~#s*<; za6d#(b(F-);H;*Vi!|P9R!PuB_@2EaCAr`CAemGnT}^oMt%pa_6``x0ARpfk!!9k| zD5kXUC9Aos16jZ`k3EKu9Mtpqkvh%%#&<^v=lls@=AZEN5Up1CFgEZRAL{gAt;U;o zHDw$jf0|4B%DpNijn*R@JwY&ZdD$b`Z+(BR)nai;PR+jFzJ7!{RWdsd*yGLSSWWSM zQ!`hbh}GA&5rJm4s6DG{SpH3<-Qx{}vCvP)(9o=dGNhugG|C4nz&xqxJYg7yM>VTd zxd<#6qf204IZn|2hGLYgtq1v3$XBkNMzZ07)<_tHCZuYkSYe*xV%0<1DM;ZhF{izd zc7zn}!2wk5J4zs3V-(4JYB4|nnSqpABb=B6N5%|zdPo7D$Mu8tg>gKzm*>xFR_2oQ zPGbV+|8_=?@s_|pe)<0Am8Ce8`F7uuYcux-9bpAbk9}S+|Gqd&pAHA^LktQ^am%i* z8%ZM#2qq2<&2+JL$&6CtI8Z8%tx9xR^^RJD`r&8tPwb(-cABpNA7n6P$fXEedurae zBrO%6sYfL@0jkrcm@febucp<9)dy|5n(--ETE2W)MU;DGmLQYrk^X?m{P;$>3!Gw{ z^wI|8hxHEoK+z%4fl}RNQ(KII%gf{885R8z z8hu0b_uj)PBm1hVh4HVyr*hoKAGQ_v@Ka}E>LpppCxxsHKtly*AzD^PL{xx{0keqD8GiU(Z@BTD734dTQem;yRYvL^$n%T zA1KQDxccas+PK&Vnx{*mnu9$K48HgU^xff5THF50<7q%E!4?zq*+ z#54XruAt)#0mcLod&3QK>Wwt&dZa*Q9YXMnUC$6rqWB^wpU$I=$UeQA*Z>7jHxj=Y zrI8`w5kfE%+3t?o<$#9JBKA_LIm6T|K0Fi7mRM~MUvjxu zwck?85ye>|DaK!Cfz(1BEjZIBo~rbhykiPbh^A$yyzeWWOOZ;er6b}ZLz&XKXhJlm=2q&P>CM^>H(XEE;% z#3ITK6xi-sWfKPw1LR;c1$7DbL+iKio^=9g}T-Jcs-!h=n>C zsKO|tmV|Vq`Lt`Om>NrEIbdd!mO7oMP3%)JsZs_snJ&J#>Tp-pmlR&7ycC2}8+m%E z28H@{Ydmrauq!!{U5c7kx@nU6yjrH} zBq!jbi-9mki-@3=w+KwHduN@8mg{b8Ax-Oa;_3CpgmgOLv7Y)w*&fU+ZrGaHMJnX$ zZcRc5pW%?B>R%BzfkDUp){BMd7k^KDf1DAhX91Np2oj9mFTH;g4|Ar)wT7$$lXZcQ zj!Nec0eHmuA*#SOPL~9IegjiCk>ysboISr!CQCb0&m30ml-%!4pDW=Lja)FB#U+85WTk_tWq__2)+4c8QI*v0d+=KCL>uG@|t#{4vOv zi!tVNNbw~X!C^MTSR!$>*k(&}$h61zXwz$sUf278IkUDbBZ&AsWi+islSVDmdGZnr zsI-KYiUe)a+2xm7%a_b#{&NO-hiteMU9dYf6zw4p zTHJhtxNNm~psotOF=0ge?8b$ZU)|iS*>sW8{rr2Uy#civn2x6-S6oE%MWxZ5kL^W~R5?9nyI7b^| zDUuFNbj4Itw4c$n&oCPg@28hi>YWWjMj2Av3;7do@%ph=3MKKr=Zn@xx#Wn)ET-;K zLpZsB$fks7gwOEskHTqU4tr9rtA%oLHpyX5hRKJoMW>P((yLO%YTETMA9pRk@H-6} zNsCQ;)LNnAtS_PE!-%WUWG7#+gR8OZ-$Mhl-C#<6#4+h9R4rZ}6?5{q*&IIzCuFtLL1S2iDz zjd)QKocdQN^v^j<59?vz_xqbK7$~OL_0$I@R67(!6ay4mln2(A1mb3?b>9ZQp{_GN zSRqCrDqnBPMRE3!)cUlTpucW5yyc3nVrG}1nyrFVXD6CChFGqvWc;aN9d*b&mlV`* zw_lxWu-5yTqOA388hb=m9k_m9DMW`M=FF+|Op}DK64&L7H*O>LHF6#t8Qz+(L12{N zDW~wsV@Q)xwJsqk8+;X&CSIgS;6wUW_3>?I&fcQ}(Mio+0NDW@U#^b?&sJV!vte=Q zOg5}Wag4Tn6@%#3rb2g)55qLtx!(ZP<7Zfp>S6PMo#%UKty|aiJYY6Lxh2L9q`RLFGLjQb-DSZK#5a>YSkC^WGe*a zuA$uA)mEhoc@j^hRGWIHY}>b-CFwDk0I!<7ms~!VITE5&JeukL8P+`xz;{#6DKs)$ z-tHrVo0uX){5&nMhK`+eF97c%`*lFfZ1HKs*Do?^gI;pOTu9TcASy2VTyHA}jX%%N z55!H-_12m3_+4H}14lCRZi6=lTNM>K28b(wJqJFXy9xRL1(`&e+3VdCX26@m{ioaU z2}*rFXVW<;q7UVDFPu>fkH~KaGX`26GV26J$^Lc~K`1vDhW0_~#+`q+{dvX?dO!gI z-%Z6=eXb!zx-$&;5}a~>wm7`iidw=%xAr8L8;pZ{79dQg&X*$Tn=~VFlh#{mQ$JA= z{)%aUPIfouG{B=JL+7fp)z^yrp_yWSH0o-y@c@5q(2}d0-?g(iiS>l~CBMOG9aB+_ z$sl8-iRWT}wi0Y`?L_^0D`kt^yll2jVA8#HVM7M(t1c0Jec(=Ok@oJ(1Uq#Ujq%ZT z%aONZ4#3Bm4(e=EdFkrBZ2Sv}a^ADdM=3N4$;F{;2DMiaMd4KPFycMAi7!nvS9jcf zvu^D%?)NSp^KY+I|3bEm*x^`LrzMNlUoC%PU2tI9xBY6X=MJ7NVOakuc_h7}x!9YHw0Y`wnPt_UsfIbzH1NHp}D zfx>H4V%N{p{v~N2438nN{bOvie-|Ojba2ysyti3n0Ua8Wfm&dYu4$*U9-P*^*&|k1 z>V_mj<1Lh0h{*h=ea{YzGw=jS%Iuj`{t6`Chy|1%JA_0d{N(}ud|KA*j=MX*^TE~L zQ=vi4MgPntcdCa6UjWlMsXpq68==RMeKJtW;bh-WidDFmqCR)s>YEw2zvN3xD#)dV z;Tp5Dze~pT04$LMw(d^k6tAzJIFOu2A()~Kz(VnE&Q6bzkp99Nf9gn}*>T{m=V0@9 zBC*Tih4rn(%Wv*zhhcHU{^G(gof40UsB^?)QoK>u$eV@c|l= z&&EDm@G$|#?8V009wVz+PHMG@D3<9I&LW6(le^WGq zyJ!}B-(RKw24wvi=|4bVy%u`#S&H#LUjC<#{h59KcVxZ?Kg!a{`$eJutO$EO+;*l{ zCJTSP&wu>sQ*t;Q_y1kZ_=o+q|84{X;!BqiFzA>Acvob0W|Q>pHprgyu;P-cQnx!3 z)8i5f*@I7O&``34A0pltS*eNz{wuZ^f398p<4HPN@DCh9_I1XO{w)X=H}dxfUvC_) z+BfOFtuScYq9uyoTMl|cHExTCdeho*6{WRb?D74JJa{joj#huMN(e|F^`5)$6n3)mNcYVHRctkqm^NTpv z%nlt;sE$E9aL(kH=07@Msp7=j+Z%fJWDaU8fb%K`py{?BJiv+$VHphed{^mp9k7q{?_4qjqJ zh5zz@giQHzlfs?&-v`;$PwRdD*V@^aCm79r@BIhC=;yb-d#jNB_U#NI-|x^yr`(=3 zS5Du|RGYb9`mE6z;jZkUAF3jl_pf8pkp%JV{Jh11RCEgjF+YcvXyV;qKWJfaR7N=d z;(6X8v*;Spozt^+HTw^XHB@sc)%^Q~1=uhwRS!=c)z4Y|t8D~8SRL6jH4o;_R~5R9 zc#&9Dj6_6Bml_i0+9S6MnM(}nI;_^C@N(#G#C zKwI{!Js>Je!}$NS*-1AdA|mLm_xarpXX`H`=^@e`XFwe@M%@i0{J{EOb%U$li2U&G z^*tDFx^P4dYRl8|fmW*!!2yMx_MDTpfh69c=|cLKr>sJJ>fakzPx^0iez!6sv4@Gi zq?l7V|2K0K3;6HI{IdAaiRHK9{4Wpt$D1Yqz^5)|t8L}~aP40;eT>U~L-N0B{+Ipq szrFeYWbglLoByR1!K2;(F(dsBBUfw8pCH`o`~mzUC#49-M2rIe4;mwuQUCw| literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/progress.png b/docs/images/coroutines-and-channels/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..778dfb10d4d5cf04aa3a9d7217b0f75124466a78 GIT binary patch literal 201234 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/rendezvous-channel.png b/docs/images/coroutines-and-channels/rendezvous-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..23c7bc81a236b1d1b867ad371b982d3b1e6079f6 GIT binary patch literal 24552 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≷||XnYR!Ui$G^VtlCq8 zYjrT9g?+>iSlhi>Bgu&;&qB=YSOs+IicgntZ5Tu}83e3>eSnRd(^T+y99q||0@m(} zPkH0Z>=1Jii$rl&Pf&@*6`(VewDjlVX)r-spBsgNJzeW;Hz!;*9^9_c038ibL;}ak y8cm_2S)NdVH(G{{R!VqAKEO?0QYxhn{~7HyW@w%|E4YXO2s~Z=T-G@yGywqk$obR& literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/run-configuration.png b/docs/images/coroutines-and-channels/run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..9661f8f61916f2940f01a4b302618df103e668a0 GIT binary patch literal 179147 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 Hli>dV3~iIs literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/suspend-requests.png b/docs/images/coroutines-and-channels/suspend-requests.png new file mode 100644 index 0000000000000000000000000000000000000000..92f92f6bc8f75d809fa68314c48b53b5cd2ca73b GIT binary patch literal 195151 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
  • +cAtP37B#(UuxPa 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 HLjQjNpY7{f literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/time-comparison.png b/docs/images/coroutines-and-channels/time-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a52a3375c1fa30828190c14b4a39855d1e7e82 GIT binary patch literal 134085 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 {9#%@V=K_QX0xD| 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

    X2dxl8h5*M+JG5T3(f5MydEX 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

    A*&wJLu7RGiKLO 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 KzvP}(@c#j&Gn^g( literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/unlimited-channel.png b/docs/images/coroutines-and-channels/unlimited-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdef2a975799716c54c2508824363b0f5fd61ad GIT binary patch literal 28302 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 literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/using-channel-many-coroutines.png b/docs/images/coroutines-and-channels/using-channel-many-coroutines.png new file mode 100644 index 0000000000000000000000000000000000000000..913a0ddc37a87f687ebbb7fc9692ddf9552bf627 GIT binary patch literal 99723 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

    NIxw`GgW|E?lg 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 bCRhHg(URpdd6LCgz@M^$`r~3blfeH1B_-?u literal 0 HcmV?d00001 diff --git a/docs/kc.tree b/docs/kc.tree index 82877f44be..9fa1e11307 100644 --- a/docs/kc.tree +++ b/docs/kc.tree @@ -10,7 +10,7 @@ - + diff --git a/docs/topics/coroutines-and-channels.md b/docs/topics/coroutines-and-channels.md new file mode 100644 index 0000000000..c8dee73b51 --- /dev/null +++ b/docs/topics/coroutines-and-channels.md @@ -0,0 +1,1549 @@ +[//]: # (title: Coroutines and channels − tutorial) + +In this tutorial, you'll see how to use coroutines to perform network requests without blocking the underlying thread or +callbacks using IntelliJ IDEA. + +> You're expected to be familiar with basic Kotlin syntax, but prior knowledge of coroutines is not required. +> +{type="tip"} + +You'll learn: + +* Why and how to use suspending functions to perform network requests +* How to send requests concurrently using coroutines +* How to share information between different coroutines using channels + +For network requests, you'll need the [Retrofit](https://square.github.io/retrofit/) library, but the approach shown in +this tutorial is universal and works similarly for other libraries supporting coroutines. + +> You can find solutions for all the tasks on the `solutions` branch of the [project's repository](http://github.com/kotlin-hands-on/intro-coroutines). +> +{type="tip"} + +## Before you start + +1. Download and install the latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download/index.html). +2. Clone the [project template](http://github.com/kotlin-hands-on/intro-coroutines) by choosing **Get from VCS** on the +welcome screen or selecting **File | New | Project from Version Control**. + + You can also clone it from the command line: + + ```Bash + git clone https://github.com/kotlin-hands-on/intro-coroutines + ``` + +### Generate GitHub developer token + +You'll be using GitHub API in your project. To get access, specify your GitHub account name and either a password or a +token. If you have two-factor authentication enabled, a token will be enough. + +Generate a new GitHub token to use GitHub API with [your account](https://github.com/settings/tokens/new): + +1. Specify the name of your token, for example, `coroutines-tutorial`: + + ![Generate a new GitHub token](generating-token.png){width=700} + +2. There is no need to select any scopes, click **Generate token** at the bottom of the page. +3. Copy the generated token. + +### Run the code + +The program loads the contributors for all the repositories under the given organization. By default, the organization +is "kotlin", but it could be any other. Later you'll add logic to sort the users by the number of their contributions. + +1. Open the `src/contributors/main.kt` file and run the `main()` function. You'll see the following window: + + ![First window](initial-window.png){width=500} + + If the font is too small, adjust it in `setDefaultFontSize(18f)` in the `main()` function. + +2. Fill in the GitHub username and token (or password) in the corresponding fields. +3. Make sure that the _BLOCKING_ option is chosen in the _Variant_ dropdown menu. +4. Click _Load contributors_. The UI should freeze for some time and then show the list of the contributors. +5. Open the program output to ensure the data is loaded. The information is logged after each successful request. + +There are different ways of implementing this logic: using [blocking requests](#blocking-requests) +and [callbacks](#callbacks). You'll compare these solutions with one that uses [coroutines](#coroutines) and see how to use +[channels](#channels) to share information between different coroutines. + +## Blocking requests + +You will use the [Retrofit](https://square.github.io/retrofit/) library to perform HTTP requests to GitHub. It allows +requesting the list of repositories under the given organization and the list of contributors for each repository: + +```kotlin +interface GitHubService { + @GET("orgs/{org}/repos?per_page=100") + fun getOrgReposCall( + @Path("org") org: String + ): Call> + + @GET("repos/{owner}/{repo}/contributors?per_page=100") + fun getRepoContributorsCall( + @Path("owner") owner: String, + @Path("repo") repo: String + ): Call> +} +``` + +This API is used by the `loadContributorsBlocking()` function to fetch the list of contributors for the given organization. + +1. Open `src/tasks/Request1Blocking.kt` and see its implementation: + + ```kotlin + fun loadContributorsBlocking(service: GitHubService, req: RequestData): List { + val repos = service + .getOrgReposCall(req.org) // #1 + .execute() // #2 + .also { logRepos(req, it) } // #3 + .body() ?: emptyList() // #4 + + return repos.flatMap { repo -> + service + .getRepoContributorsCall(req.org, repo.name) // #1 + .execute() // #2 + .also { logUsers(repo, it) } // #3 + .bodyList() // #4 + }.aggregate() + } + ``` + + * At first, you get a list of the repositories under the given organization and store it in the `repos` list. Then for + each repository, the list of contributors is requested, and all the lists get merged into one final list of + contributors. + * Each `getOrgReposCall()` and `getRepoContributorsCall()` returns an instance of the `*Call` class (`#1`). At this point, + no request is sent. + * `*Call.execute()` is then invoked to perform the request (`#2`). `execute()` is a synchronous call that blocks the + underlying thread. + * When you get the response, the result is logged by calling the specific `logRepos()` and `logUsers()` functions (`#3`). + If the HTTP response contains an error, this error will be logged here. + * Lastly, get the response's body, which contains the desired data. For this tutorial, you'll use an empty list as a + result in case there is an error and log the corresponding error (`#4`). + +2. To avoid repeating `.body() ?: emptyList()`, an extension function `bodyList()` is declared: + + ```kotlin + fun Response>.bodyList(): List { + return body() ?: emptyList() + } + ``` + +3. Run the program again and take a look at the system output in IntelliJ IDEA. It should have something like this: + + ```text + 1770 [AWT-EventQueue-0] INFO Contributors - kotlin: loaded 40 repos + 2025 [AWT-EventQueue-0] INFO Contributors - kotlin-examples: loaded 23 contributors + 2229 [AWT-EventQueue-0] INFO Contributors - kotlin-koans: loaded 45 contributors + ... + ``` + + * The first item on each line is the amount of milliseconds that have passed since the program started, then the thread + name in square brackets. You can see from which thread the loading request is called on. + * The final item on each line is the actual message: how many repositories or contributors were loaded. + + This log output demonstrates that all the results were logged from the main thread. When you run the code with a _BLOCKING_ + option, the window freezes and don't react to input until the loading is finished. All the requests are executed from + the same thread as the one called `loadContributorsBlocking()` from, which is the main UI thread (in Swing, it's an AWT + event dispatching thread). This main thread gets blocked, and that's why the UI is frozen: + + ![The blocked main thread](blocking.png){width=700} + + After the list of contributors has loaded, the result is updated. + +4. In `src/contributors/Contributors.kt`, find the `loadContributors()` function responsible for choosing how + the contributors are loaded and look at how `loadContributorsBlocking()` is called: + + ```kotlin + when (getSelectedVariant()) { + BLOCKING -> { // Blocking UI thread + val users = loadContributorsBlocking(service, req) + updateResults(users, startTime) + } + } + ``` + + * The `updateResults()` call goes right after the `loadContributorsBlocking()` call. + * `updateResults()` updates the UI, so it must always be called from the UI thread. + * Since `loadContributorsBlocking()` is also called from the UI thread, the UI thread gets blocked and the UI gets + frozen. + +### Task 1 + +The first task helps you familiarize yourself with the task domain. Currently, each contributor's name is repeated +several times, once for every project they have taken part in. Implement the `aggregate()` function combining the users +so that each contributor is added only once. The `User.contributions` property should contain the total number of +contributions of the given user to _all_ the projects. The resulting list should be sorted in descending order according +to the number of contributions. + +Open `src/tasks/Aggregation.kt` and implement the `List.aggregate()` function. Users should be sorted by the total +number of their contributions. + +The corresponding test file `test/tasks/AggregationKtTest.kt` shows an example of the expected result. + +> You can jump between the source code and the test class automatically using the [IntelliJ IDEA +> shortcut](https://www.jetbrains.com/help/idea/create-tests.html#test-code-navigation) `Ctrl+Shift+T` / `⇧ ⌘ T`. +> +{type="tip"} + +After implementing this task, the resulting list for the "kotlin" organization should be similar to the following: + +![The list for the "kotlin" organization](aggregate.png){width=500} + +#### Solution for task 1 {initial-collapse-state="collapsed"} + +1. To group users by their login, use [`groupBy()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html) +that returns a map from login to all occurrences of the user with this login in different repositories. +2. For each map entry, count the total number of contributions for each user and create a new instance of the `User` class +by the given name and sum of contributions. +3. Sort the resulting list in descending order: + + ```kotlin + fun List.aggregate(): List = + groupBy { it.login } + .map { (login, group) -> User(login, group.sumOf { it.contributions }) } + .sortedByDescending { it.contributions } + ``` + +An alternative is to use the [`groupingBy()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/grouping-by.html) +function instead of `groupBy()`. + +## Callbacks + +The previous solution works, but blocks the thread and therefore freezes the UI. A traditional approach to avoid this +is to use _callbacks_. + +Instead of calling the code that should be invoked after the operation is completed straightaway, you can extract it +into a separate callback, often a lambda, and pass this lambda to the caller in order for it to be called later. + +To make the UI responsive, you can either move the whole computation to a separate thread or switch to the Retrofit API, +which uses callbacks instead of blocking calls. + +### Use a background thread + +1. Open `src/tasks/Request2Background.kt` and see its implementation. First, the whole computation is moved to a different +thread. The `thread()` function starts a new thread: + + ```kotlin + thread { + loadContributorsBlocking(service, req) + } + ``` + + Now that all the loading has been moved to a separate thread, the main thread is free and can be occupied with other + tasks: + + ![The freed main thread](background.png){width=700} + +2. The signature of the `loadContributorsBackground()` function changes. It takes a `updateResults()` +callback as the last argument to call it after all the loading completes: + + ```kotlin + fun loadContributorsBackground( + service: GitHubService, req: RequestData, + updateResults: (List) -> Unit + ) + ``` + +3. Now when the `loadContributorsBackground()` is called, the `updateResults()` call goes in the callback, not immediately +afterward as it did before: + + ```kotlin + loadContributorsBackground(service, req) { users -> + SwingUtilities.invokeLater { + updateResults(users, startTime) + } + } + ``` + + By calling `SwingUtilities.invokeLater`, you ensure that the `updateResults()` call, which updates the results, happens on + the main UI thread (AWT event dispatching thread). + +However, if you try to load contributors via the `BACKGROUND` option, you can see that the list is updated, but +nothing changes. + +### Task 2 + +Fix the `loadContributorsBackground()` in `src/tasks/Request2Background.kt` so that the resulting list was shown in the +UI. + +#### Solution for task 2 {initial-collapse-state="collapsed"} + +If you try to load contributors, you can see in the log that the contributors are loaded, but the result isn't displayed. +To fix this, call the `updateResults()` on the resulting list of users: + +```kotlin +thread { + updateResults(loadContributorsBlocking(service, req)) +} +``` + +You should ensure to call the logic passed in the callback explicitly. Otherwise, nothing will happen. + +### Use Retrofit callback API + +In the previous solution, the whole loading logic is moved to the background thread, but it's still not the best use of +resources. All the loading requests go sequentially one after another, and while waiting for the loading result, the +thread is blocked, but it could be occupied with other tasks. Specifically, it could start another loading to +receive the entire result earlier. + +Handling the data for each repository should be then divided into two parts: loading and processing the +resulting response. The second _processing_ part should be extracted into a callback. + +The loading for each repository can then be started before the result for the previous repository is received (and the +corresponding callback is called): + +![Using callback API](callbacks.png){width=700} + +The Retrofit callback API can help achieve that. The `Call.enqueue()` function starts an HTTP request and takes a +callback as an argument. In this callback, you need to specify what needs to be done after each request. + +Open `src/tasks/Request3Callbacks.kt` and see the implementation of `loadContributorsCallbacks()` that this API: + +```kotlin +fun loadContributorsCallbacks( + service: GitHubService, req: RequestData, + updateResults: (List) -> Unit +) { + service.getOrgReposCall(req.org).onResponse { responseRepos -> // #1 + logRepos(req, responseRepos) + val repos = responseRepos.bodyList() + + val allUsers = mutableListOf() + for (repo in repos) { + service.getRepoContributorsCall(req.org, repo.name) + .onResponse { responseUsers -> + logUsers(repo, responseUsers) + val users = responseUsers.bodyList() + allUsers += users + } + } + } + // TODO: Why this code doesn't work? How to fix that? + updateResults(allUsers.aggregate()) + } +``` +* For convenience, the `onResponse()` extension function declared in the same file is used. It takes a lambda as an argument +rather than an object expression. +* The logic handling the responses is extracted into callbacks: the corresponding lambdas start at lines `#1` and `#2`. + +However, the provided solution doesn't work. If you run the program and load contributors by choosing the _CALLBACKS_ +option, you'll see that nothing is shown. The tests that immediately return the result, however, pass. + +Think about why the given code doesn't work as expected and try to fix it or check solutions below. + +### Task 3 (optional) + +Rewrite the code in the `src/tasks/Request3Callbacks.kt` file so that the loaded list of contributors is shown. + +#### First solution for task 3 {initial-collapse-state="collapsed"} + +In the current solution, many requests are started concurrently, which decreases the total loading time. However, +the result isn't loaded. The `updateResults()` callback is called right after all the loading requests are started, +so the `allUsers` list is not yet filled with the data. + +You can try to fix this with the following change: + +```kotlin +val allUsers = mutableListOf() +for ((index, repo) in repos.withIndex()) { // #1 + service.getRepoContributorsCall(req.org, repo.name) + .onResponse { responseUsers -> + logUsers(repo, responseUsers) + val users = responseUsers.bodyList() + allUsers += users + if (index == repos.lastIndex) { // #2 + updateResults(allUsers.aggregate()) + } + } +} +``` + +* First, you iterate over the list of repos with an index (`#1`). +* Then, from each callback, you check whether it's the last iteration (`#2`). +* And if that's the case, the result is updated. + +However, this code is also incorrect. Try to find an answer yourself or check the solution below. + +#### Second solution for task 3 {initial-collapse-state="collapsed"} + +Since the loading requests are started concurrently, no one guarantees that the result for the last one comes last. The +results can come in any order. + +So, if you compare the current index with the `lastIndex` as a condition for completion, you risk losing the results for +some repos. + +If the request processing the last repo returns faster than some prior requests (which is likely to happen), all the +results for requests that take more time will be lost. + +One of the ways to fix this is to introduce an index and check whether all the repositories are already processed: + +```kotlin +val allUsers = Collections.synchronizedList(mutableListOf()) +val numberOfProcessed = AtomicInteger() +for (repo in repos) { + service.getRepoContributorsCall(req.org, repo.name) + .onResponse { responseUsers -> + logUsers(repo, responseUsers) + val users = responseUsers.bodyList() + allUsers += users + if (numberOfProcessed.incrementAndGet() == repos.size) { + updateResults(allUsers.aggregate()) + } + } +} +``` + +A synchronized version of the list and `AtomicInteger()` are used because, in general, there's no guarantee that +different callback processing `getRepoContributors()` requests will always be called from the same thread. + +#### Third solution for task 3 {initial-collapse-state="collapsed"} + +An even better solution is to use the `CountDownLatch` class. It stores a counter initialized with the number of +repositories. This counter is decremented after processing each repository. It then waits until the latch is counted +down to zero before updating the results: + +```kotlin +val countDownLatch = CountDownLatch(repos.size) +for (repo in repos) { + service.getRepoContributorsCall(req.org, repo.name) + .onResponse { responseUsers -> + // processing repository + countDownLatch.countDown() + } +} +countDownLatch.await() +updateResults(allUsers.aggregate()) +``` + +The result is then updated from the main thread, which is more direct than delegating this logic to the child threads. + +You can see that writing the correct code with callbacks might be non-trivial and error-prone, especially when several +underlying threads and synchronization occur. + +> As an additional exercise, you can implement the same logic using a reactive approach with the RxJava library. All the +> necessary dependencies and solutions for using RxJava can be found in a separate `rx` branch. It is also possible to +> complete this tutorial and implement or check the proposed Rx versions for a proper comparison. +> +{type="tip"} + +## Suspending functions + +You can implement the same logic using suspending functions. Instead of returning `Call>`, define the API +call as a [suspending function](composing-suspending-functions.md) like that: + +```kotlin +interface GitHubService { + @GET("orgs/{org}/repos?per_page=100") + suspend fun getOrgRepos( + @Path("org") org: String + ): List +} +``` + +* `getOrgRepos()` is defined as a `suspend` function. When you use a suspending function to perform a request, the +underlying thread isn't blocked. You'll find the details on how it works exactly later. +* `getOrgRepos()` returns the result directly instead of returning a `Call`. If the result is unsuccessful, an +exception is thrown. + +Alternatively, Retrofit also allows returning the result wrapped in `Response`. In this case, the result body is +provided, and it is possible to check for errors manually. This tutorial uses the versions returning `Response`. + +In `src/contributors/GitHubService.kt`, add following declarations to the `GitHubService` interface: + +```kotlin +interface GitHubService { + // getOrgReposCall & getRepoContributorsCall declarations + + @GET("orgs/{org}/repos?per_page=100") + suspend fun getOrgRepos( + @Path("org") org: String + ): Response> + + @GET("repos/{owner}/{repo}/contributors?per_page=100") + suspend fun getRepoContributors( + @Path("owner") owner: String, + @Path("repo") repo: String + ): Response> +} +``` + +### Task 4 + +Your task is to change the code of the function that loads contributors to make use of new suspending functions +`getOrgRepos()` and `getRepoContributors()`. The new `loadContributorsSuspend()` function is marked as `suspend` to use the +new API. + +> Suspending functions can't be called everywhere. There will be an error if a suspending function is called +from `loadContributorsBlocking()`: "Suspend function 'getOrgRepos' should be called only from a coroutine or another +suspend function". +> +{type="note"} + +1. Copy the implementation of `loadContributorsBlocking()` defined in `src/tasks/Request1Blocking.kt` +into `loadContributorsSuspend()` defined in `src/tasks/Request4Suspend.kt`. +2. Modify the code so that the new suspending functions are used instead of ones returning `Call`s. +3. Run the program by choosing the _SUSPEND_ option and ensure that the UI is still responsive while the GitHub requests +are performed. + +#### Solution for task 4 {initial-collapse-state="collapsed"} + +Replace `.getOrgReposCall(req.org).execute()` with `.getOrgRepos(req.org)` and repeat the same replacement for the +second "contributors" request: + +```kotlin +suspend fun loadContributorsSuspend(service: GitHubService, req: RequestData): List { + val repos = service + .getOrgRepos(req.org) + .also { logRepos(req, it) } + .bodyList() + + return repos.flatMap { repo -> + service.getRepoContributors(req.org, repo.name) + .also { logUsers(repo, it) } + .bodyList() + }.aggregate() +} +``` + +* `loadContributorsSuspend()` should be defined as a `suspend` function. +* You no longer need to call `execute`, which returned the `Response` before, because now the API functions return +the `Response` directly. But this detail is specific to the Retrofit library. With other libraries, the API will be different, +but the concept is the same. + +## Coroutines + +The code with suspending functions looks similar to the "blocking" version. The major difference with a blocking version +is that instead of blocking the thread, the coroutine is suspended: + +```text +block -> suspend +thread -> coroutine +``` + +> Coroutines are often called lightweight threads because you can run code on coroutines, similar to how you run code on +> threads. The operations that were blocking before (and had to be avoided) can now suspend the coroutine instead. +> +{type="note"} + +### Starting a new coroutine + +If you look at how `loadContributorsSuspend()` is used in `src/contributors/Contributors.kt`, you can see that it's +called inside `launch`. `launch` is a library function that takes a lambda as an argument: + +```kotlin +launch { + val users = loadContributorsSuspend(req) + updateResults(users, startTime) +} +``` + +Here `launch` starts a new computation. This computation is responsible for loading the data and showing the results. It's +suspendable: it gets suspended and releases the underlying thread while performing the network requests. +When the network request returns the result, the computation is resumed. + +Such a suspendable computation is called a _coroutine_. So, in this case, `launch` _starts a new coroutine_ responsible +for loading data and showing the results. + +Coroutines are computations that run on top of threads and can be suspended. When a coroutine is suspended, the +corresponding computation is paused, removed from the thread, and stored in memory. Meanwhile, the thread is free to be +occupied with other activities: + +![Suspending coroutines](suspension-process.gif){width=700} + +When the computation is ready to be continued, it gets returned to a thread (not necessarily the same one). + +In the `loadContributorsSuspend()` example, each "contributors" request now waits for the result using the suspension +mechanism. First, the new request is sent. Then, while waiting for the response, the whole "load contributors" coroutine +becomes suspended (the one started by the `launch` function). + +The coroutine resumes only after the corresponding response is received: + +![Suspending request](suspend-requests.png){width=700} + +While the response is waiting to be received, the thread is free to be occupied with other tasks. The UI stays responsive, +despite all the requests taking place on the main UI thread: + +1. Run the program using the _SUSPEND_ option. The log confirms that all the requests are sent on the main UI thread: + + ```text + 2538 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - kotlin: loaded 30 repos + 2729 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - ts2kt: loaded 11 contributors + 3029 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - kotlin-koans: loaded 45 contributors + ... + 11252 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - kotlin-coroutines-workshop: loaded 1 contributors + ``` + +2. The log can show you what coroutine the corresponding code runs on. To enable it, open **Run | Edit configurations** +and add the `-Dkotlinx.coroutines.debug` VM option: + + ![Edit run configuration](run-configuration.png){width=500} + + Then while running `main()` with this option, the coroutine name will be attached to the thread name. You can also + modify the template for running all the Kotlin files and enable this option by default. + +Now all the code runs on one coroutine, the mentioned above "load contributors" coroutine, denoted as `@coroutine#1`. +While waiting for the result, you don't reuse the thread for sending other requests because the code is +written sequentially. The new request is sent only when the previous result is received. + +Suspending functions treat the thread fairly and don't block it for "waiting", but it doesn't yet bring any concurrency +to the picture. + +## Concurrency + +Kotlin coroutines are extremely inexpensive in comparison to threads. +Each time you want to start a new computation asynchronously, you can create a new coroutine. + +To start a new coroutine, one of the main _coroutine builders_ is used: `launch`, `async`, or `runBlocking`. Different +libraries can define additional coroutine builders. + +`async` starts a new coroutine and returns a `Deferred` object. `Deferred` represents a concept known by other names +such as `Future` or `Promise`. It stores a computation, but it _defers_ the moment you get the final result; +It _promises_ the result sometime in the _future_. + +The main difference between `async` and `launch` is that `launch` is used to start a computation that isn't expected to +return a specific result. `launch` returns `Job`, representing the coroutine. It is possible to wait until it completes +by calling `Job.join()`. + +`Deferred` is a generic type that extends `Job`. An `async` call can return a `Deferred` or `Deferred` +depending on what the lambda returns (the last expression inside the lambda is the result). + +To get the result of a coroutine, you can call `await()` on the `Deferred` instance. While waiting for the result, +the coroutine that this `await()` is called from suspends: + +```kotlin +import kotlinx.coroutines.* + +fun main() = runBlocking { + val deferred: Deferred = async { + loadData() + } + println("waiting...") + println(deferred.await()) +} + +suspend fun loadData(): Int { + println("loading...") + delay(1000L) + println("loaded!") + return 42 +} +``` + +`runBlocking` is used as a bridge between regular and suspending functions, blocking and non-blocking worlds. It works +as an adaptor for starting the top-level main coroutine. It is intended primarily to be used in `main()` functions and +tests. + +> To get a better understanding, watch [this video about coroutines](https://www.youtube.com/watch?v=zEZc5AmHQhk). +> +{type="tip"} + +If there is a list of deferred objects, it's possible to call `awaitAll()` to await the results of all of them: + +```kotlin +import kotlinx.coroutines.* + +fun main() = runBlocking { + val deferreds: List> = (1..3).map { + async { + delay(1000L * it) + println("Loading $it") + it + } + } + val sum = deferreds.awaitAll().sum() + println("$sum") +} +``` + +When starting each "contributors" request in a new coroutine, all the requests are started asynchronously. A new request +can be sent before the result for the previous one is received: + +![Concurrent coroutines](concurrency.png){width=700} + +The total loading time is approximately the same as in the _CALLBACKS_ version, but it doesn't need any callbacks. +What's more, `async` explicitly emphasizes which parts run concurrently in the code. + +### Task 5 + +In the `Request5Concurrent.kt` file, implement a `loadContributorsConcurrent()` function. For that, use the +previous `loadContributorsSuspend()` function. + +#### Tip for task 5 {initial-collapse-state="collapsed"} + +You can only start a new coroutine inside a coroutine scope. Copy the content +from `loadContributorsSuspend()` to the `coroutineScope` call, so that you can call `async` functions there: + +```kotlin +suspend fun loadContributorsConcurrent( + service: GitHubService, + req: RequestData +): List = coroutineScope { + // ... +} +``` + +Base your solution on the following scheme: + +```kotlin +val deferreds: List>> = repos.map { repo -> + async { + // load contributors for each repo + } +} +deferreds.awaitAll() // List> +``` + +#### Solution for task 5 {initial-collapse-state="collapsed"} + +Wrap each "contributors" request with `async` to create as many coroutines as the number of repositories. `async` +returns `Deferred>`. Since it's really inexpensive to create a new coroutine, it's not an issue. You can +create as many as you need. + +1. You can no longer use `flatMap` because the `map` result is now a list of `Deferred` objects, not a list of lists. +`awaitAll()` returns `List>`, so to get the result, call `flatten().aggregate()`: + + ```kotlin + suspend fun loadContributorsConcurrent( + service: GitHubService, + req: RequestData + ): List = coroutineScope { + val repos = service + .getOrgRepos(req.org) + .also { logRepos(req, it) } + .bodyList() + + val deferreds: List>> = repos.map { repo -> + async { + service.getRepoContributors(req.org, repo.name) + .also { logUsers(repo, it) } + .bodyList() + } + } + deferreds.awaitAll().flatten().aggregate() + } + ``` + +2. Run the code and check the log. You can see that all the coroutines still run on the main UI thread because +multithreading isn't employed yet. But there are already benefits of running coroutines concurrently. +3. To change this code to run "contributors" coroutines on different threads from the common thread pool, +specify `Dispatchers.Default` as the context argument for the `async` function: + + ```kotlin + async(Dispatchers.Default) { } + ``` + + * `CoroutineDispatcher` determines what thread or threads the corresponding coroutine should be run on. If you don't + specify one as an argument, `async` will use the dispatcher from the outer scope. + * `Dispatchers.Default` represents a shared pool of threads on JVM. This pool provides a means for parallel execution. + It consists of as many threads as CPU cores available, but it still has two threads if there's only one core. + +4. Modify the code in the `loadContributorsConcurrent()` function to start new coroutines on different threads from the +common thread pool. Also, add additional logging before sending the request: + + ```kotlin + async(Dispatchers.Default) { + log("starting loading for ${repo.name}") + service.getRepoContributors(req.org, repo.name) + .also { logUsers(repo, it) } + .bodyList() + } + ``` + +5. Run the program once again. In the log, you can see that each coroutine can be started on one thread from the +thread pool and resumed on another: + + ```text + 1946 [DefaultDispatcher-worker-2 @coroutine#4] INFO Contributors - starting loading for kotlin-koans + 1946 [DefaultDispatcher-worker-3 @coroutine#5] INFO Contributors - starting loading for dokka + 1946 [DefaultDispatcher-worker-1 @coroutine#3] INFO Contributors - starting loading for ts2kt + ... + 2178 [DefaultDispatcher-worker-1 @coroutine#4] INFO Contributors - kotlin-koans: loaded 45 contributors + 2569 [DefaultDispatcher-worker-1 @coroutine#5] INFO Contributors - dokka: loaded 36 contributors + 2821 [DefaultDispatcher-worker-2 @coroutine#3] INFO Contributors - ts2kt: loaded 11 contributors + ``` + + For instance, in this log excerpt, `coroutine#4` is started on the thread `worker-2` and continued on the + thread `worker-1`. + +In `src/contributors/Contributors.kt`, check the implementation of the _CONCURRENT_ option: + +1. To run the coroutine only on the main UI thread, specify `Dispatchers.Main` as an argument: + + ```kotlin + launch(Dispatchers.Main) { + updateResults() + } + ``` + + * If the main thread is busy when you start a new coroutine on it, + the coroutine becomes suspended and scheduled for execution on this thread. The coroutine will only resume when the + thread becomes free. + * It's considered good practice to use the dispatcher from the outer scope rather than explicitly specify it on each + end-point. In the case when `loadContributorsConcurrent()` is defined without passing `Dispatchers.Default` as an + argument, you can then call this function in any way: in the context with a `Default` dispatcher, in the context with + the main UI thread, or the context with a custom dispatcher. + * As you'll see later, when calling `loadContributorsConcurrent()` from tests, you can call it in the context + with `TestCoroutineDispatcher` which simplifies testing. Thus, this solution is much more flexible. + +2. To specify the dispatcher on the caller-side, apply the following change to the project while +letting `loadContributorsConcurrent` start coroutines in the inherited context: + + ```kotlin + launch(Dispatchers.Default) { + val users = loadContributorsConcurrent(service, req) + withContext(Dispatchers.Main) { + updateResults(users, startTime) + } + } + ``` + + * `updateResults()` should be called on the main UI thread, so you call it with the context of `Dispatchers.Main`. + * `withContext()` calls the given code with the specified coroutine context, suspends until it completes, and returns + the result. An alternative but a more verbose way to express this would be to start a new coroutine and explicitly + wait (by suspending) until it completes: `launch(context) { ... }.join()`. + +3. Run the code and ensure that the coroutines are executed on the threads from the thread pool. + +## Structured concurrency + +* _Coroutine scope_ is responsible for the structure and parent-child relationships between different coroutines. New +coroutines usually need to be started inside a scope. +* _Coroutine context_ stores additional technical information used to run a given coroutine, like the coroutine custom +name, or the dispatcher specifying the threads the coroutine should be scheduled on. + +When `launch`, `async`, or `runBlocking` are used to start a new coroutine, they automatically create the corresponding +scope. All these functions take a lambda with a receiver as an argument, and the implicit receiver type is +the `CoroutineScope`: + +```kotlin +launch { /* this: CoroutineScope */ } +``` + +* New coroutines can only be started inside a scope. +* `launch` and `async` are declared as extensions to `CoroutineScope`, so an implicit or explicit receiver must always +be passed when you call them. +* The coroutine started by `runBlocking` is the only exception because `runBlocking` is defined as a top-level function. +But because it blocks the current thread, it's intended primarily to be used in `main()` functions and tests as a bridge +function. + +A new coroutine inside `runBlocking`, `launch`, or `async` is started automatically inside the scope: + +```kotlin +import kotlinx.coroutines.* + +fun main() = runBlocking { /* this: CoroutineScope */ + launch { /* ... */ } + // the same as: + this.launch { /* ... */ } +} +``` + +When you call `launch` inside `runBlocking`, it's called as an extension to the implicit receiver of +the `CoroutineScope` type. Alternatively, you could explicitly write `this.launch`. + +The nested coroutine (started by `launch` in this example) can be considered as a child of the outer coroutine (started +by `runBlocking`). This "parent-child" relationship works through scopes; the child coroutine is started from the scope +corresponding to the parent coroutine. + +It's possible to create a new scope without starting a new coroutine using `coroutineScope` function. +To start new coroutines in a structured way inside a `suspend` function without access to the outer scope, for example +inside `loadContributorsConcurrent()`, you can create a new coroutine scope which automatically becomes a child of the +outer scope that this `suspend` function is called from. + +You can also start a new coroutine from the global scope using `GlobalScope.async` or `GlobalScope.launch`. +This will create a top-level "independent" coroutine. + +The mechanism providing the structure of the coroutines is called _structured concurrency_. See what benefits structured +concurrency has over global scopes: + +* The scope is generally responsible for child coroutines, and their lifetime is attached to the lifetime of the scope. +* The scope can automatically cancel child coroutines if something goes wrong or a user changes their mind and decides + to revoke the operation. +* The scope automatically waits for the completion of all the child coroutines. + Therefore, if the scope corresponds to a coroutine, the parent coroutine does not complete until all the coroutines + launched in its scope are complete. + +When using `GlobalScope.async` there is no structure that binds several coroutines to a smaller scope. +The coroutines started from the global scope are all independent; their lifetime is limited only by the lifetime of the +whole application. It's possible to store a reference to the coroutine started from the global scope and wait for its +completion or cancel it explicitly, but it won't happen automatically as it would with a structured one. + +### Cancellation of contributors loading + +Consider two versions of the `loadContributorsConcurrent()` function. +The first uses `coroutineScope` to start all the child coroutines and the second uses `GlobalScope`. Compare how both +versions behave when trying to cancel the parent coroutine. + +1. Copy the implementation of `loadContributorsConcurrent()` from `Request5Concurrent.kt` to +`loadContributorsNotCancellable()` in `Request5NotCancellable.kt` and remove the creation of a new `coroutineScope`. +2. The `async` calls now fail to resolve, so start them using `GlobalScope.async`: + + ```kotlin + suspend fun loadContributorsNotCancellable( + service: GitHubService, + req: RequestData + ): List { // #1 + // ... + GlobalScope.async { // #2 + log("starting loading for ${repo.name}") + // load repo contributors + } + // ... + return deferreds.awaitAll().flatten().aggregate() // #3 + } + ``` + + * The function now returns the result directly, not as the last expression inside the lambda (lines `#1` and `#3`), + * All the "contributors" coroutines are started inside the `GlobalScope`, not as children of the coroutine scope ( + line `#2`). +3. Add a 3-second delay to all the coroutines sending requests, so that there's enough time to cancel the loading +after the coroutines are started, but before the requests are sent: + + ```kotlin + suspend fun loadContributorsConcurrent( + service: GitHubService, + req: RequestData + ): List = coroutineScope { + // ... + GlobalScope.async { + log("starting loading for ${repo.name}") + delay(3000) + // load repo contributors + } + // ... + } + ``` + +4. Run the program and choose the _CONCURRENT_ option to load the contributors. +5. Wait until all the "contributors" coroutines are started, and then click _Cancel_. In the log, you can see that all +the requests were indeed canceled because no new results are logged: + + ```text + 2896 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - kotlin: loaded 40 repos + 2901 [DefaultDispatcher-worker-2 @coroutine#4] INFO Contributors - starting loading for kotlin-koans + ... + 2909 [DefaultDispatcher-worker-5 @coroutine#36] INFO Contributors - starting loading for mpp-example + /* click on 'cancel' */ + /* no requests are sent */ + ``` + +6. Repeat the step 5 but this time choose the `NOT_CANCELLABLE` option: + + ```text + 2570 [AWT-EventQueue-0 @coroutine#1] INFO Contributors - kotlin: loaded 30 repos + 2579 [DefaultDispatcher-worker-1 @coroutine#4] INFO Contributors - starting loading for kotlin-koans + ... + 2586 [DefaultDispatcher-worker-6 @coroutine#36] INFO Contributors - starting loading for mpp-example + /* click on 'cancel' */ + /* but all the requests are still sent: */ + 6402 [DefaultDispatcher-worker-5 @coroutine#4] INFO Contributors - kotlin-koans: loaded 45 contributors + ... + 9555 [DefaultDispatcher-worker-8 @coroutine#36] INFO Contributors - mpp-example: loaded 8 contributors + ``` + + In this case, no coroutines are canceled, and all the requests are still sent. + +7. Check how the cancellation is triggered in the "contributors" program. When the _Cancel_ button is clicked, +the main "loading" coroutine is explicitly cancelled. Then it automatically cancels all the child coroutines: + + ```kotlin + interface Contributors { + + fun loadContributors() { + // ... + when (getSelectedVariant()) { + CONCURRENT -> { + launch { + val users = loadContributorsConcurrent(service, req) + updateResults(users, startTime) + }.setUpCancellation() // #1 + } + } + } + + private fun Job.setUpCancellation() { + val loadingJob = this // #2 + + // cancel the loading job if the 'cancel' button was clicked: + val listener = ActionListener { + loadingJob.cancel() // #3 + updateLoadingStatus(CANCELED) + } + // add a listener to the 'cancel' button: + addCancelListener(listener) + + // update the status and remove the listener + // after the loading job is completed + } + } + ``` + +The `launch` function returns an instance of `Job`. `Job` stores a reference to the "loading coroutine", which loads +all the data and updates the results. You can call the `setUpCancellation()` extension function on it (line `#1`), +passing an instance of `Job` as a receiver. + +Another way you could express this would be to explicitly write: + +```kotlin +val job = launch { } +job.setUpCancellation() +``` + +* For readability, you could refer to the `setUpCancellation()` function receiver inside the function with the +new `loadingJob` variable (line `#2`). +* Then you can add a listener to the _Cancel_ button, so then when it's clicked, the `loadingJob` is canceled (line `#3`). + +With structured concurrency, you only need to cancel the parent coroutine and this automatically propagates cancellation +to all the child coroutines. + +### Using the outer scope's context + +When you start new coroutines inside the given scope, it's much easier to ensure that all of them run with the same +context. And it's much easier to replace the context if needed. + +Now it's time to learn how using the dispatcher from the outer scope works. The new scope created by +the `coroutineScope` or by the coroutine builders, always inherits the context from the outer scope. In this case, the +outer scope is the scope the `suspend loadContributorsConcurrent()` was called from: + +```kotlin +launch(Dispatchers.Default) { // outer scope + val users = loadContributorsConcurrent(service, req) + // ... +} +``` + +All the nested coroutines are automatically started with the inherited context. The dispatcher is a part of this +context. That's why all the coroutines started by `async` are started with the context of the default dispatcher: + +```kotlin +suspend fun loadContributorsConcurrent( + service: GitHubService, req: RequestData +): List = coroutineScope { + // this scope inherits the context from the outer scope + // ... + async { // nested coroutine started with the inherited context + // ... + } + // ... +} +``` + +With structured concurrency, you can specify the major context elements (like dispatcher) once, when creating a +top-level coroutine. All the nested coroutines then inherit the context and modify it only if needed. + +> When you write code with coroutines for UI applications, for example Android ones, it's a common practice to +> use `CoroutineDispatchers.Main` by default for the top coroutine and then to explicitly put a different dispatcher when +> you need to run the code on a different thread. +> +{type="tip"} + +## Showing progress + +Despite the information for some repositories being loaded rather fast, the user only sees the resulting list when all +the data is loaded. Until then, the loader icon runs showing the progress, but there's no information about the current +state, and what contributors are already loaded. + +You can show the intermediate results earlier and display all the contributors after loading the data for each of the +repositories: + +![Loading data](loading.gif){width=500} + +To implement this functionality, in the `src/tasks/Request6Progress.kt`, you'll need to pass the logic updating the UI +as a callback, so that it's called on each intermediate state: + +```kotlin +suspend fun loadContributorsProgress( + service: GitHubService, + req: RequestData, + updateResults: suspend (List, completed: Boolean) -> Unit +) { + // loading the data + // calling `updateResults()` on intermediate states +} +``` + +On the call site in `Contributors.kt`, the callback is passed updating the results from the `Main` thread for +the _PROGRESS_ option: + +```kotlin +launch(Dispatchers.Default) { + loadContributorsProgress(service, req) { users, completed -> + withContext(Dispatchers.Main) { + updateResults(users, startTime, completed) + } + } +} +``` + +* The `updateResults()` parameter is declared as `suspend` in `loadContributorsProgress()`. It's necessary to call +`withContext`, which is a `suspend` function inside the corresponding lambda argument. +* `updateResults()` callback takes an additional Boolean parameter as an argument saying whether all the loading + completed and the results are final. + +### Task 6 + +In the `Request6Progress.kt` file, implement the `loadContributorsProgress()` function that shows the intermediate +progress. Base it on the `loadContributorsSuspend()` function from `Request4Suspend.kt`. + +* Use a simple version without concurrency; you'll add it later in the next section. +* The intermediate list of contributors should be shown in an "aggregated" state, not just the list of users loaded for +each repository. +* The total numbers of contributions for each user should be increased when the data for each new +repository is loaded. + +#### Solution for task 6 {initial-collapse-state="collapsed"} + +To store the intermediate list of loaded contributors in the "aggregated" state, define an `allUsers` variable which +stores the list of users, and then update it after contributors for each new repository are loaded: + +```kotlin +suspend fun loadContributorsProgress( + service: GitHubService, + req: RequestData, + updateResults: suspend (List, completed: Boolean) -> Unit +) { + val repos = service + .getOrgRepos(req.org) + .also { logRepos(req, it) } + .bodyList() + + var allUsers = emptyList() + for ((index, repo) in repos.withIndex()) { + val users = service.getRepoContributors(req.org, repo.name) + .also { logUsers(repo, it) } + .bodyList() + + allUsers = (allUsers + users).aggregate() + updateResults(allUsers, index == repos.lastIndex) + } +} +``` + +#### Consecutive vs concurrent + +An `updateResults()` callback is called after each request is completed: + +![Progress on requests](progress.png){width=700} + +This code doesn't include concurrency. It's sequential, so you don't need synchronization. + +The best option would be to send requests concurrently and update the intermediate results after getting the response +for each repository: + +![Concurrent requests](progress-and-concurrency.png){width=700} + +To add concurrency, use _channels_. + +## Channels + +Writing code with a shared mutable state is quite difficult and error-prone (like in the solution using callbacks). +Sharing information by communication instead of using the common mutable state simplifies this. +Coroutines can communicate with each other through _channels_. + +Channels are communication primitives that allow passing data between different coroutines. One coroutine can _send_ +some information to a channel, while the other one can _receive_ this information from it: + +![Using channels](using-channel.png) + +A coroutine that sends (produces) information is often called a producer, and a coroutine that receives (consumes) +information is called a consumer. Several coroutines can send information to the same channel, and several coroutines +can receive data from it: + +![Using channels with many coroutines](using-channel-many-coroutines.png) + +When many coroutines receive information from the same channel, each element is handled only once by one of the +consumers. Handling it automatically means removing this element from the channel. + +You can think of a channel as similar to a collection of elements +(the direct analog would be a queue: elements are added to one end and received from another). However, there's an +important difference, unlike collections, even in their synchronized versions, a channel can _suspend_ `send()` +and `receive()` operations. This happens when the channel is empty or full, in case the channel size might be +constrained, and then it can be full. + +`Channel` is represented with three different interfaces: `SendChannel`, `ReceiveChannel`, and `Channel` that extends +the first two. You usually create a channel and give it to producers as a `SendChannel` instance so that only they can +send it to it. +You give a channel to consumers as a `ReceiveChannel` instance so that only they can receive from it. Both `send` +and `receive` methods are declared as `suspend`: + +```kotlin +interface SendChannel { + suspend fun send(element: E) + fun close(): Boolean +} + +interface ReceiveChannel { + suspend fun receive(): E +} + +interface Channel : SendChannel, ReceiveChannel +``` + +The producer can close a channel to indicate that no more elements are coming. + +Several types of channels are defined in the library. They differ in how many elements they can internally store and +whether the `send()` call can suspend or not. +For all the channel types, the `receive()` call behaves similarly: it receives an element if the channel is not empty +and otherwise suspends. + + + +

    An unlimited channel is the closest analog to a queue: producers can send elements to this channel, and it will grow +infinitely. The send() call will never be suspended. +If there's no more memory, you'll get an OutOfMemoryException. +The difference with a queue appears when a consumer tries to receive from an empty channel and gets suspended until some +new elements are sent.

    + Unlimited channel + + +

    The size of a buffered channel is constrained by the specified number. +Producers can send elements to this channel until the size limit is reached. All the elements are internally stored. +When the channel is full, the next `send` call on it suspends until more free space appears.

    + Buffered channel +
    + +

    The "Rendezvous" channel is a channel without a buffer. It's the same as creating a buffered channel with a zero size. +One of the functions (send() or receive()) always gets suspended until the other is called.

    +

    If the send() function is called and there's no suspended receive call ready to process the element, send() +suspends. Similarly, if the receive function is called and the channel is empty or, in other words, there's no +suspended send() call ready to send the element, the receive() call suspends.

    +

    The "rendezvous" name ("a meeting at an agreed time and place") refers to the fact that send() and receive() +should "meet on time".

    + Rendezvous channel +
    + +

    A new element sent to the conflated channel will overwrite the previously sent element, so the receiver will always +get only the latest element. The send() call never suspends.

    + Conflated channel +
    + + +When you create a channel, specify its type or the buffer size (if you need a buffered one): + +```kotlin +val rendezvousChannel = Channel() +val bufferedChannel = Channel(10) +val conflatedChannel = Channel(CONFLATED) +val unlimitedChannel = Channel(UNLIMITED) +``` + +By default, a "Rendezvous" channel is created. + +In the following task, you'll create a "Rendezvous" channel, two producer coroutines, and a consumer coroutine: + +```kotlin +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.* + +fun main() = runBlocking { + val channel = Channel() + launch { + channel.send("A1") + channel.send("A2") + log("A done") + } + launch { + channel.send("B1") + log("B done") + } + launch { + repeat(3) { + val x = channel.receive() + log(x) + } + } +} + +fun log(message: Any?) { + println("[${Thread.currentThread().name}] $message") +} +``` + +> To get a better understanding, watch [this video about channels](https://www.youtube.com/watch?v=HpWQUoVURWQ). +> +{type="tip"} + +### Task 7 + +In the `src/tasks/Request7Channels.kt`, implement the function `loadContributorsChannels()` that requests all the GitHub +contributors concurrently and shows intermediate progress at the same time. + +For this, use previous functions, `loadContributorsConcurrent()` from `Request5Concurrent.kt` +and `loadContributorsProgress()` from `Request6Progress.kt`. + +#### Tip for task 7 {initial-collapse-state="collapsed"} + +Different coroutines that concurrently receive contributor lists for different repositories can send all the received +results to the same channel: + +```kotlin +val channel = Channel>() +for (repo in repos) { + launch { + val users = TODO() + // ... + channel.send(users) + } +} +``` + +Then the elements from this channel can be received one by one and processed: + +```kotlin +repeat(repos.size) { + val users = channel.receive() + // ... +} +``` + +Since the `receive()` calls are sequential, no additional synchronization is needed. + +#### Solution for task 7 {initial-collapse-state="collapsed"} + +As with the `loadContributorsProgress()` function, you can create the `allUsers` variable to store the intermediate +states of the "all contributors" list. +Each new list received from the channel is added to the list of all users. You aggregate the result and update the state +using the `updateResults` callback: + +```kotlin +suspend fun loadContributorsChannels( + service: GitHubService, + req: RequestData, + updateResults: suspend (List, completed: Boolean) -> Unit +) = coroutineScope { + + val repos = service + .getOrgRepos(req.org) + .also { logRepos(req, it) } + .bodyList() + + val channel = Channel>() + for (repo in repos) { + launch { + val users = service.getRepoContributors(req.org, repo.name) + .also { logUsers(repo, it) } + .bodyList() + channel.send(users) + } + } + var allUsers = emptyList() + repeat(repos.size) { + val users = channel.receive() + allUsers = (allUsers + users).aggregate() + updateResults(allUsers, it == repos.lastIndex) + } +} +``` + +* Results for different repositories are added to the channel as soon as they are ready. At first, when all the requests +are sent, and no data is received, the `receive()` call suspends. In this case, the whole "load contributors" coroutine +suspends. +* Then, when the list of users is sent to the channel, the "load contributors" coroutine resumes, the `receive()` call +returns this list, and the results are immediately updated. + +You can now run the program and choose the _CHANNELS_ option to load the contributors and see the result. + +Although neither coroutines, nor channels completely eradicate the complexity that comes from concurrency, +they still make life easier when you need to reason it and understand what's going on. + +## Testing coroutines + +It'd be nice to test all solutions, ensure that the solution with concurrent coroutines is faster than the solution with +the `suspend` functions, and check that the solution with channels is faster than the simple "progress" one. + +In the following task, you'll compare the total running time of the solutions. You'll mock a GitHub service and make +this service return results after the given timeouts: + +```text +repos request - returns an answer within 1000 ms delay +repo-1 - 1000 ms delay +repo-2 - 1200 ms delay +repo-3 - 800 ms delay +``` + +The sequential solution with the `suspend` functions should take around 4000 ms (4000 = 1000 + (1000 + 1200 + 800)), +and the concurrent solution should take around 2200 ms (2200 = 1000 + max(1000, 1200, 800)). + +For the solutions showing progress, you can also check the intermediate results with timestamps. + +The corresponding test data is defined in `test/contributors/testData.kt`, and the files `Request4SuspendKtTest`,..., +`Request7ChannelsKtTest` contain the straightforward tests that use mock service calls. + +However, there are two problems here: + +* These tests take too long to run. Each test takes around 2 to 4 seconds, and you need to wait for the results each + time. It's not very efficient. +* You can't rely on the exact time the solution runs because it still takes additional time to prepare and run the code. + It's possible to add a constant, but then it will differ from a machine to a machine. The mock service delays + should be higher than this constant, so you can see a difference. If the constant is 0.5 sec, making the delays + 0.1 sec won't be enough. + +A better way is to use special frameworks to test the timing while running the same code several times (which increases +the total time even more), but it's complicated to learn and set up. + +To fix these problems and test that solutions with provided test delays behave as expected, one faster than the other, +use _virtual_ time with a special test dispatcher is used. It keeps track of the virtual time passed from +the start and runs everything immediately in real-time. When you run coroutines on this dispatcher, +the `delay` will return immediately and advance the virtual time. + +The tests using this mechanism run fast, but you can still check what happens at different moments in virtual time. The +total running time drastically decreases: + +![Comparison for total running time](time-comparison.png){width=700} + +To use virtual time, replace the `runBlocking` invocation with a `runBlockingTest`. `runBlockingTest` takes an +extension lambda to `TestCoroutineScope` as an argument. +When you call `delay` in a `suspend` function inside this special scope, `delay` will increase the virtual time instead +of delaying in real-time: + +```kotlin +@Test +fun testDelayInSuspend() = runBlockingTest { + val realStartTime = System.currentTimeMillis() + val virtualStartTime = currentTime + + foo() + println("${System.currentTimeMillis() - realStartTime} ms") // ~ 6 ms + println("${currentTime - virtualStartTime} ms") // 1000 ms +} + +suspend fun foo() { + delay(1000) // auto-advances without delay + println("foo") // executes eagerly when foo() is called +} +``` + +You can check the current virtual time using the `currentTime` property of `TestCoroutineScope`. + +The actual running time in this example is several milliseconds, while virtual time equals the delay argument, which +is 1000 milliseconds. + +To get the full effect of "virtual" `delay` in child coroutines, +start all the child coroutines with `TestCoroutineDispatcher`. Otherwise, it won't work. This dispatcher is +automatically inherited from the other `TestCoroutineScope`, unless you provide a different dispatcher: + +```kotlin +@Test +fun testDelayInLaunch() = runBlockingTest { + val realStartTime = System.currentTimeMillis() + val virtualStartTime = currentTime + + bar() + + println("${System.currentTimeMillis() - realStartTime} ms") // ~ 11 ms + println("${currentTime - virtualStartTime} ms") // 1000 ms +} + +suspend fun bar() = coroutineScope { + launch { + delay(1000) // auto-advances without delay + println("bar") // executes eagerly when bar() is called + } +} +``` + +If `launch` is called with the context of `Dispatchers.Default` in the example above, the test will fail. You'll get an +exception saying that the job has not been completed yet. + +You can test the `loadContributorsConcurrent()` function this way only if it starts the child coroutines with the +inherited context, without modifying it using the `Dispatchers.Default` dispatcher. + +You can specify the context elements like the dispatcher when _calling_ a function rather than when _defining_ it, which +is more flexible and easier to test. + +> The testing API that supports virtual time is [Experimental](components-stability.md) and may change in the future. +> +{type="warning"} + +By default, the compiler shows warnings if you use the experimental testing API. To suppress these warnings, annotate +the test function or the whole class containing the tests with `@OptIn(ExperimentalCoroutinesApi::class)`. +Add the compiler argument telling it that you're using the experimental API: + +```kotlin +compileTestKotlin { + kotlinOptions { + freeCompilerArgs += "-Xuse-experimental=kotlin.Experimental" + } +} +``` + +In the project corresponding to this tutorial, it's already been added to the Gradle script. + +### Task 8 + +Refactor all the following tests in `tests/tasks/` to use virtual time instead of real-time: + +* Request4SuspendKtTest.kt +* Request5ConcurrentKtTest.kt +* Request6ProgressKtTest.kt +* Request7ChannelsKtTest.kt + +Compare the total running time with the time before this refactoring. + +#### Tip for task 8 {initial-collapse-state="collapsed"} + +1. Replace `runBlocking` invocation with `runBlockingTest` and `System.currentTimeMillis()` with `currentTime`: + + ```kotlin + @Test + fun test() = runBlockingTest { + val startTime = currentTime + // action + val totalTime = currentTime - startTime + // testing result + } + ``` + +2. Uncomment the assertions checking the exact virtual time. +3. Don't forget to add `@UseExperimental(ExperimentalCoroutinesApi::class)`. + +#### Solution for task 8 {initial-collapse-state="collapsed"} + +Here are the solutions for the concurrent and channels cases: + +```kotlin +fun testConcurrent() = runBlockingTest { + val startTime = currentTime + val result = loadContributorsConcurrent(MockGithubService, testRequestData) + Assert.assertEquals("Wrong result for 'loadContributorsConcurrent'", expectedConcurrentResults.users, result) + val totalTime = currentTime - startTime + + Assert.assertEquals( + "The calls run concurrently, so the total virtual time should be 2200 ms: " + + "1000 for repos request plus max(1000, 1200, 800) = 1200 for concurrent contributors requests)", + expectedConcurrentResults.timeFromStart, totalTime + ) +} +``` + +First, you check that the results are available exactly at the expected virtual time, and then you check the results +themselves: + +```kotlin +fun testChannels() = runBlockingTest { + val startTime = currentTime + var index = 0 + loadContributorsChannels(MockGithubService, testRequestData) { users, _ -> + val expected = concurrentProgressResults[index++] + val time = currentTime - startTime + Assert.assertEquals( + "Expected intermediate results after ${expected.timeFromStart} ms:", + expected.timeFromStart, time + ) + Assert.assertEquals("Wrong intermediate results after $time:", expected.users, users) + } +} +``` + +The first intermediate result for the last version with channels is available sooner than the progress version, and you +can see the difference in tests using virtual time. + +> The tests for the remaining "suspend" and "progress" tasks are very similar; you can find them in the project's +> `solutions` branch. +> +{type="tip"} + +## What's next + +* Check out the [Asynchronous Programming with Kotlin](https://kotlinconf.com/workshops/) workshop at KotlinConf. +* Find out more about using [virtual time and experimental testing package](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/). \ No newline at end of file From f54ddb1161845ac3a4437ee18d0860d053fd9abe Mon Sep 17 00:00:00 2001 From: Lukellmann <47486203+Lukellmann@users.noreply.github.com> Date: Thu, 4 Aug 2022 10:24:05 +0200 Subject: [PATCH 320/328] Fix documentation for `DEBUG_PROPERTY_VALUE_OFF` (#3389) --- kotlinx-coroutines-core/jvm/src/Debug.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/src/Debug.kt b/kotlinx-coroutines-core/jvm/src/Debug.kt index 911914a0f9..4a821a14bb 100644 --- a/kotlinx-coroutines-core/jvm/src/Debug.kt +++ b/kotlinx-coroutines-core/jvm/src/Debug.kt @@ -59,7 +59,7 @@ public const val DEBUG_PROPERTY_VALUE_AUTO: String = "auto" public const val DEBUG_PROPERTY_VALUE_ON: String = "on" /** - * Debug turned on value for [DEBUG_PROPERTY_NAME]. + * Debug turned off value for [DEBUG_PROPERTY_NAME]. */ public const val DEBUG_PROPERTY_VALUE_OFF: String = "off" From d0ee143063ed4d037b7418bcc37ca5d11e91f535 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Thu, 4 Aug 2022 15:44:08 +0300 Subject: [PATCH 321/328] Improve bump-version.sh (#3365) * It doesn't require specifying the old version. Instead, the version will be taken from gradle.properties. * It reverts the changes if there is an error in the process. * It will output a command to undo the changes manually. --- RELEASE.md | 4 +- bump-version.sh | 106 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 85 insertions(+), 25 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index ef7cc23365..cc0bcee0e2 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -21,7 +21,7 @@ To release a new `` of `kotlinx-coroutines`: * [`gradle.properties`](gradle.properties) * Make sure to **exclude** `CHANGES.md` from replacements. - As an alternative approach, you can use `./bump-version.sh old_version new_version` + As an alternative approach, you can use `./bump-version.sh new_version` 5. Write release notes in [`CHANGES.md`](CHANGES.md): * Use the old releases for style guidance. @@ -43,7 +43,7 @@ To release a new `` of `kotlinx-coroutines`: * Get approval for it. 0. On [TeamCity integration server](https://teamcity.jetbrains.com/project.html?projectId=KotlinTools_KotlinxCoroutines): - * Wait until "Build" configuration for committed `master` branch passes tests. + * Wait until "Build" configuration for committed `version-` branch passes tests. * Run "Deploy (Configure, RUN THIS ONE)" configuration with the corresponding new version: - Use the `version-` branch - Set the `DeployVersion` build parameter to `` diff --git a/bump-version.sh b/bump-version.sh index e49910f428..a44247bc44 100755 --- a/bump-version.sh +++ b/bump-version.sh @@ -1,35 +1,95 @@ -#!/bin/bash +#!/bin/sh -if [ "$#" -ne 2 ] +set -efu + +# the list of files that need to have the version updated in them +# +# limitations: +# * no newlines in names +# * no ' char in names +files=" +README.md +kotlinx-coroutines-core/README.md +kotlinx-coroutines-debug/README.md +kotlinx-coroutines-test/README.md +ui/coroutines-guide-ui.md +gradle.properties +integration-testing/gradle.properties +" + +# read gradle.properties to get the old version +set +e +old_version="$(git grep -hoP '(?<=^version=).*(?=-SNAPSHOT$)' gradle.properties)" +set -e +if [ "$?" -ne 0 ] then - echo "Use: ./bump-version old_version new_version" - exit + echo "Could not read the old version from gradle.properties." >&2 + if [ "$#" -ne 2 ] + then + echo "Please use this form instead: ./bump-version.sh old_version new_version" + exit 1 + fi fi -old_version=$1 -new_version=$2 +# check the command-line arguments for mentions of the version +if [ "$#" -eq 2 ] + then + echo "If you want to infer the version automatically, use the form: ./bump-version.sh new_version" >&2 + if [ -n "$old_version" -a "$1" != "$old_version" ] + then + echo "The provided old version ($1) is different from the one in gradle.properties ($old_version)." >&2 + echo "Proceeding anyway with the provided old version." >&2 + fi + old_version=$1 + new_version=$2 + elif [ "$#" -eq 1 ] + then + new_version=$1 + else + echo "Use: ./bump-version.sh new_version" >&2 + exit 1 +fi + + +# Escape dots, e.g. 1.0.0 -> 1\.0\.0 +escaped_old_version="$(printf "%s\n" "$old_version" | sed 's/[.]/\\./g')" update_version() { - echo "Updating version from '$old_version' to '$new_version' in $1" - sed -i.bak s/$old_version/$new_version/g $1 - rm $1.bak + file=$1 + to_undo=$2 + echo "Updating version from '$old_version' to '$new_version' in $1" >&2 + if [ -n "$(git diff --name-status -- "$file")" ] + then + printf "There are unstaged changes in '$file'. Refusing to proceed.\n" >&2 + [ -z "$to_undo" ] || eval "git checkout$to_undo" + exit 1 + fi + sed -i.bak "s/$escaped_old_version/$new_version/g" "$file" + rm -f "$1.bak" } -update_version "README.md" -update_version "kotlinx-coroutines-core/README.md" -update_version "kotlinx-coroutines-debug/README.md" -update_version "kotlinx-coroutines-test/README.md" -update_version "ui/coroutines-guide-ui.md" -update_version "gradle.properties" -update_version "integration-test/gradle.properties" +to_undo=$(printf "%s" "$files" | while read -r file; do + if [ -n "$file" ] + then + update_version "$file" "${to_undo:-}" + to_undo="${to_undo:-} '$file'" + echo -n " '$file'" + fi +done) -# Escape dots, e.g. 1.0.0 -> 1\.0\.0 -escaped_old_version=$(echo $old_version | sed s/[.]/\\\\./g) -result=$(find ./ -type f \( -iname \*.properties -o -iname \*.md \) | grep -v "\.gradle" | grep -v "build" | xargs -I{} grep -H "$escaped_old_version" {} | grep -v CHANGES.md | grep -v COMPATIBILITY.md) -if [ -z "$result" ]; +set +e +version_mentions=$( + find . -type f \( -iname '*.properties' -o -iname '*.md' \) \ + -not -iname CHANGES.md \ + -exec git grep --fixed-strings --word "$old_version" {} + + ) +set -e +if [ -z "$version_mentions" ] then - echo "Done" + echo "Done. To undo, run this command:" >&2 + printf "git checkout%s\n" "$to_undo" >&2 else - echo "ERROR: Previous version is present in the project: $result" - exit -1 + echo "ERROR: Previous version is present in the project: $version_mentions" + [ -z "$to_undo" ] || eval "git checkout$to_undo" + exit 1 fi From 8165b5cf51c9740dae3f170acabf9ef14a409be9 Mon Sep 17 00:00:00 2001 From: Danil Pavlov Date: Fri, 5 Aug 2022 17:12:42 +0200 Subject: [PATCH 322/328] update: KT-50122 adding kotlinx.dependencies --- docs/topics/debug-coroutines-with-idea.md | 38 +++++++++++++----- docs/topics/debug-flow-with-idea.md | 48 ++++++++++++++++------- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/docs/topics/debug-coroutines-with-idea.md b/docs/topics/debug-coroutines-with-idea.md index 2541c92469..2c26051da1 100644 --- a/docs/topics/debug-coroutines-with-idea.md +++ b/docs/topics/debug-coroutines-with-idea.md @@ -4,19 +4,39 @@ This tutorial demonstrates how to create Kotlin coroutines and debug them using The tutorial assumes you have prior knowledge of the [coroutines](coroutines-guide.md) concept. -> Debugging works for `kotlinx-coroutines-core` version 1.3.8 or later. -> -{type="note"} - ## Create coroutines -1. Open a Kotlin project in IntelliJ IDEA. If you don't have a project, [create one](jvm-get-started.md#create-an-application). +1. Open a Kotlin project in IntelliJ IDEA. If you don't have a project, [create one](jvm-get-started.md#create-a-project). +2. To use the `kotlinx.coroutines` library in a Gradle project, add the following dependency to `build.gradle(.kts)`: + + + + + ```kotlin + dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%") + } + ``` + + + + + ```groovy + dependencies { + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%' + } + ``` + + + -2. Open the `main.kt` file in `src/main/kotlin`. + For other build systems, see instructions in the [`kotlinx.coroutines` README](https://github.com/Kotlin/kotlinx.coroutines#using-in-your-projects). + +3. Open the `Main.kt` file in `src/main/kotlin`. - The `src` directory contains Kotlin source files and resources. The `main.kt` file contains sample code that will print `Hello World!`. + The `src` directory contains Kotlin source files and resources. The `Main.kt` file contains sample code that will print `Hello World!`. -3. Change code in the `main()` function: +4. Change code in the `main()` function: * Use the [`runBlocking()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. * Use the [`async()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html) function to create coroutines that compute deferred values `a` and `b`. @@ -39,7 +59,7 @@ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-gui } ``` -4. Build the code by clicking **Build Project**. +5. Build the code by clicking **Build Project**. ![Build an application](flow-build-project.png) diff --git a/docs/topics/debug-flow-with-idea.md b/docs/topics/debug-flow-with-idea.md index b769e79510..3a65a37883 100644 --- a/docs/topics/debug-flow-with-idea.md +++ b/docs/topics/debug-flow-with-idea.md @@ -4,21 +4,41 @@ This tutorial demonstrates how to create Kotlin Flow and debug it using IntelliJ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-guide.md) and [Kotlin Flow](flow.md#flows) concepts. -> Debugging works for `kotlinx-coroutines-core` version 1.3.8 or later. -> -{type="note"} - ## Create a Kotlin flow Create a Kotlin [flow](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html) with a slow emitter and a slow collector: -1. Open a Kotlin project in IntelliJ IDEA. If you don't have a project, [create one](jvm-get-started.md#create-an-application). - -2. Open the `main.kt` file in `src/main/kotlin`. - - The `src` directory contains Kotlin source files and resources. The `main.kt` file contains sample code that will print `Hello World!`. - -3. Create the `simple()` function that returns a flow of three numbers: +1. Open a Kotlin project in IntelliJ IDEA. If you don't have a project, [create one](jvm-get-started.md#create-a-project). +2. To use the `kotlinx.coroutines` library in a Gradle project, add the following dependency to `build.gradle(.kts)`: + + + + + ```kotlin + dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%") + } + ``` + + + + + ```groovy + dependencies { + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:%coroutinesVersion%' + } + ``` + + + + + For other build systems, see instructions in the [`kotlinx.coroutines` README](https://github.com/Kotlin/kotlinx.coroutines#using-in-your-projects). + +3. Open the `Main.kt` file in `src/main/kotlin`. + + The `src` directory contains Kotlin source files and resources. The `Main.kt` file contains sample code that will print `Hello World!`. + +4. Create the `simple()` function that returns a flow of three numbers: * Use the [`delay()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html) function to imitate CPU-consuming blocking code. It suspends the coroutine for 100 ms without blocking the thread. * Produce the values in the `for` loop using the [`emit()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/emit.html) function. @@ -36,7 +56,7 @@ Create a Kotlin [flow](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-cor } ``` -4. Change the code in the `main()` function: +5. Change the code in the `main()` function: * Use the [`runBlocking()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. * Collect the emitted values using the [`collect()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect.html) function. @@ -53,7 +73,7 @@ Create a Kotlin [flow](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-cor } ``` -5. Build the code by clicking **Build Project**. +6. Build the code by clicking **Build Project**. ![Build an application](flow-build-project.png) @@ -84,7 +104,7 @@ Create a Kotlin [flow](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-cor ## Add a concurrently running coroutine -1. Open the `main.kt` file in `src/main/kotlin`. +1. Open the `Main.kt` file in `src/main/kotlin`. 2. Enhance the code to run the emitter and collector concurrently: From 83f08854a6445098a6a942d51c56fbbd232b9067 Mon Sep 17 00:00:00 2001 From: Nikolay Pachkov Date: Tue, 9 Aug 2022 10:16:09 +0200 Subject: [PATCH 323/328] ktl-695 chore: support Dokka HTML customization (#3388) --- build.gradle | 4 ++++ dokka-templates/README.md | 4 ++++ gradle/dokka.gradle.kts | 2 ++ 3 files changed, 10 insertions(+) create mode 100644 dokka-templates/README.md diff --git a/build.gradle b/build.gradle index 4d6af16570..ba6d5c18cb 100644 --- a/build.gradle +++ b/build.gradle @@ -355,3 +355,7 @@ allprojects { subProject -> } } } + +tasks.named("dokkaHtmlMultiModule") { + pluginsMapConfiguration.set(["org.jetbrains.dokka.base.DokkaBase": """{ "templatesDir": "${projectDir.toString().replace('\\', '/')}/dokka-templates" }"""]) +} diff --git a/dokka-templates/README.md b/dokka-templates/README.md new file mode 100644 index 0000000000..0891177785 --- /dev/null +++ b/dokka-templates/README.md @@ -0,0 +1,4 @@ +# Customize Dokka's HTML. +To customize Dokka's HTML output, place a file in this folder. +Dokka will find a template file there. If the file is not found, a default one will be used. +This folder is defined by the templatesDir property. \ No newline at end of file diff --git a/gradle/dokka.gradle.kts b/gradle/dokka.gradle.kts index 2470ded3ea..ba6956aa83 100644 --- a/gradle/dokka.gradle.kts +++ b/gradle/dokka.gradle.kts @@ -27,6 +27,8 @@ tasks.withType(DokkaTaskPartial::class).configureEach { tasks.withType(DokkaTaskPartial::class).configureEach { suppressInheritedMembers.set(true) + pluginsMapConfiguration.set(mapOf("org.jetbrains.dokka.base.DokkaBase" to """{ "templatesDir" : "${rootProject.projectDir.toString().replace('\\', '/')}/dokka-templates" }""")) + dokkaSourceSets.configureEach { jdkVersion.set(11) includes.from("README.md") From 6cd4ad3c782dce7143b52034b49f1b6900f54d61 Mon Sep 17 00:00:00 2001 From: Nikolay Pachkov Date: Tue, 9 Aug 2022 18:15:22 +0200 Subject: [PATCH 324/328] chore: update the website's release step (#3397) --- RELEASE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index cc0bcee0e2..a3ba7843d0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -76,6 +76,5 @@ To release a new `` of `kotlinx-coroutines`: 8. Push the updates to GitHub:
    `git push` -9. Build and publish the documentation for the web-site:
    - * Set new value for [`kotlinx.coroutines.release.tag`](https://buildserver.labs.intellij.net/admin/editProject.html?projectId=Kotlin_KotlinSites_Builds_KotlinlangOrg_LibrariesAPIs&tab=projectParams) - * And run deploy [configuration](https://buildserver.labs.intellij.net/buildConfiguration/Kotlin_KotlinSites_Builds_KotlinlangOrg_KotlinCoroutinesApi?branch=%3Cdefault%3E&buildTypeTab=overview&mode=builds) +9. Propose the website documentation update:
    + * Set new value for [`KOTLINX_COROUTINES_RELEASE_TAG`](https://github.com/JetBrains/kotlin-web-site/blob/master/.teamcity/BuildParams.kt), creating a Pull Request in the website's repository. From d3f21df63480c23bc25a89316c42c8202a029919 Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Fri, 19 Aug 2022 04:44:51 -0700 Subject: [PATCH 325/328] Update coroutines-and-channels.md (#3410) A few grammar fixes --- docs/topics/coroutines-and-channels.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/topics/coroutines-and-channels.md b/docs/topics/coroutines-and-channels.md index c8dee73b51..4d999e8b8d 100644 --- a/docs/topics/coroutines-and-channels.md +++ b/docs/topics/coroutines-and-channels.md @@ -142,8 +142,8 @@ This API is used by the `loadContributorsBlocking()` function to fetch the list * The final item on each line is the actual message: how many repositories or contributors were loaded. This log output demonstrates that all the results were logged from the main thread. When you run the code with a _BLOCKING_ - option, the window freezes and don't react to input until the loading is finished. All the requests are executed from - the same thread as the one called `loadContributorsBlocking()` from, which is the main UI thread (in Swing, it's an AWT + option, the window freezes and doesn't react to input until the loading is finished. All the requests are executed from + the same thread as the one that called `loadContributorsBlocking()`, which is the main UI thread (in Swing, it's an AWT event dispatching thread). This main thread gets blocked, and that's why the UI is frozen: ![The blocked main thread](blocking.png){width=700} @@ -311,14 +311,14 @@ fun loadContributorsCallbacks( val allUsers = mutableListOf() for (repo in repos) { service.getRepoContributorsCall(req.org, repo.name) - .onResponse { responseUsers -> + .onResponse { responseUsers -> // #2 logUsers(repo, responseUsers) val users = responseUsers.bodyList() allUsers += users } } } - // TODO: Why this code doesn't work? How to fix that? + // TODO: Why doesn't this code work? How to fix that? updateResults(allUsers.aggregate()) } ``` @@ -441,7 +441,7 @@ interface GitHubService { ``` * `getOrgRepos()` is defined as a `suspend` function. When you use a suspending function to perform a request, the -underlying thread isn't blocked. You'll find the details on how it works exactly later. +underlying thread isn't blocked. You'll find the details on how it exactly works later. * `getOrgRepos()` returns the result directly instead of returning a `Call`. If the result is unsuccessful, an exception is thrown. @@ -1546,4 +1546,4 @@ can see the difference in tests using virtual time. ## What's next * Check out the [Asynchronous Programming with Kotlin](https://kotlinconf.com/workshops/) workshop at KotlinConf. -* Find out more about using [virtual time and experimental testing package](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/). \ No newline at end of file +* Find out more about using [virtual time and experimental testing package](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/). From d88a8c227a295f91251960c8fe6b21a02ddf704b Mon Sep 17 00:00:00 2001 From: Anup Cowkur Date: Mon, 22 Aug 2022 22:37:05 +0530 Subject: [PATCH 326/328] Fix typo in runTest method docs (#3417) --- kotlinx-coroutines-test/common/src/TestBuilders.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-test/common/src/TestBuilders.kt b/kotlinx-coroutines-test/common/src/TestBuilders.kt index 80dc8d6083..cb677811c9 100644 --- a/kotlinx-coroutines-test/common/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/common/src/TestBuilders.kt @@ -57,7 +57,7 @@ public expect class TestResult * * The test is run in a single thread, unless other [CoroutineDispatcher] are used for child coroutines. * Because of this, child coroutines are not executed in parallel to the test body. - * In order to for the spawned-off asynchronous code to actually be executed, one must either [yield] or suspend the + * In order for the spawned-off asynchronous code to actually be executed, one must either [yield] or suspend the * test body some other way, or use commands that control scheduling (see [TestCoroutineScheduler]). * * ``` From 2820bb1a9f20aab78d963af298f911b2072bbdb1 Mon Sep 17 00:00:00 2001 From: Pablo Baxter Date: Mon, 12 Sep 2022 09:45:47 -0700 Subject: [PATCH 327/328] Cleanup API, update knit --- .../common/src/flow/operators/Delay.kt | 60 +++---------------- .../common/test/flow/operators/TimeoutTest.kt | 40 ++++--------- .../examples/example-delay-duration-01.kt | 1 - .../examples/example-delay-duration-02.kt | 1 - .../examples/example-delay-duration-03.kt | 1 - .../examples/example-timeout-duration-01.kt | 5 +- .../examples/example-timeout-duration-02.kt | 28 --------- .../jvm/test/examples/test/FlowDelayTest.kt | 7 --- 8 files changed, 22 insertions(+), 121 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-02.kt diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index cfa1dfe6b3..b3aa6a0458 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -20,7 +20,6 @@ import kotlin.time.* - * - * produces the following emissions - * - * ```text - * 1, 2, 3, -1 - * ``` - * - * - * Note that delaying on the downstream doesn't trigger the timeout. - * - * @param timeoutMillis Timeout period in millis - * @param action Action to invoke on timeout. Default is to throw [FlowTimeoutException] */ @FlowPreview public fun Flow.timeout( - timeoutMillis: Long, - @BuilderInference action: suspend FlowCollector.() -> Unit = { throw FlowTimeoutException(timeoutMillis) } -): Flow = timeoutInternal(timeoutMillis, action) + timeout: Duration +): Flow = timeoutInternal(timeout.toDelayMillis()) private fun Flow.timeoutInternal( - timeoutMillis: Long, - action: suspend FlowCollector.() -> Unit + timeoutMillis: Long ): Flow = scopedFlow { downStream -> - require(timeoutMillis >= 0L) { "Timeout should not be negative" } + if (timeoutMillis <= 0L) throw FlowTimeoutException("Timed out immediately") // Produce the values using the default (rendezvous) channel // Similar to [debounceInternal] @@ -465,9 +421,7 @@ private fun Flow.timeoutInternal( values.onReceive { value -> if (value !== DONE) { if (value === TIMEOUT) { - downStream.action() - values.cancel(ChildCancelledException()) - return@onReceive false // Just end the loop here. Nothing more to be done. + throw FlowTimeoutException(timeoutMillis) } downStream.emit(NULL.unbox(value)) return@onReceive true diff --git a/kotlinx-coroutines-core/common/test/flow/operators/TimeoutTest.kt b/kotlinx-coroutines-core/common/test/flow/operators/TimeoutTest.kt index 47fb50be24..e5e0b4522c 100644 --- a/kotlinx-coroutines-core/common/test/flow/operators/TimeoutTest.kt +++ b/kotlinx-coroutines-core/common/test/flow/operators/TimeoutTest.kt @@ -7,10 +7,9 @@ package kotlinx.coroutines.flow.operators import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.test.* -import kotlin.time.* +import kotlin.time.Duration.Companion.milliseconds class TimeoutTest : TestBase() { - @ExperimentalTime @Test fun testBasic() = withVirtualTime { expect(1) @@ -28,12 +27,11 @@ class TimeoutTest : TestBase() { expect(2) val list = mutableListOf() - assertFailsWith(flow.timeout(300).onEach { list.add(it) }) + assertFailsWith(flow.timeout(300.milliseconds).onEach { list.add(it) }) assertEquals(listOf("A", "B", "C"), list) finish(5) } - @ExperimentalTime @Test fun testBasicCustomAction() = withVirtualTime { expect(1) @@ -51,12 +49,11 @@ class TimeoutTest : TestBase() { expect(2) val list = mutableListOf() - flow.timeout(300) { emit("-1") }.collect { list.add(it) } + flow.timeout(300.milliseconds).catch { if (it is FlowTimeoutException) emit("-1") }.collect { list.add(it) } assertEquals(listOf("A", "B", "C", "-1"), list) finish(5) } - @ExperimentalTime @Test fun testDelayedFirst() = withVirtualTime { expect(1) @@ -65,45 +62,39 @@ class TimeoutTest : TestBase() { delay(100) emit(1) expect(4) - }.timeout(250) + }.timeout(250.milliseconds) expect(2) assertEquals(1, flow.singleOrNull()) finish(5) } - @ExperimentalTime @Test fun testEmpty() = runTest { - val flow = emptyFlow().timeout(1) + val flow = emptyFlow().timeout(1.milliseconds) assertNull(flow.singleOrNull()) } - @ExperimentalTime @Test fun testScalar() = runTest { - val flow = flowOf(1, 2, 3).timeout(1) + val flow = flowOf(1, 2, 3).timeout(1.milliseconds) assertEquals(listOf(1, 2, 3), flow.toList()) } - @ExperimentalTime @Test fun testUpstreamError() = testUpstreamError(TestException()) - @ExperimentalTime @Test fun testUpstreamErrorTimeoutException() = testUpstreamError(FlowTimeoutException(0)) - @ExperimentalTime private inline fun testUpstreamError(cause: T) = runTest { val flow = flow { emit(1) throw cause - }.timeout(1) + }.timeout(1.milliseconds) assertFailsWith(flow) } - @ExperimentalTime @Test fun testDownstreamError() = runTest { val flow = flow { @@ -111,7 +102,7 @@ class TimeoutTest : TestBase() { emit(1) hang { expect(3) } expectUnreached() - }.timeout(100).map { + }.timeout(100.milliseconds).map { expect(2) yield() throw TestException() @@ -121,7 +112,6 @@ class TimeoutTest : TestBase() { finish(4) } - @ExperimentalTime @Test fun testUpstreamTimeoutIsolatedContext() = runTest { val flow = flow { @@ -131,13 +121,12 @@ class TimeoutTest : TestBase() { expect(2) delay(300) expectUnreached() - }.flowOn(NamedDispatchers("upstream")).timeout(100) + }.flowOn(NamedDispatchers("upstream")).timeout(100.milliseconds) assertFailsWith(flow) finish(3) } - @ExperimentalTime @Test fun testUpstreamTimeoutActionIsolatedContext() = runTest { val flow = flow { @@ -147,7 +136,7 @@ class TimeoutTest : TestBase() { expect(2) delay(300) expectUnreached() - }.flowOn(NamedDispatchers("upstream")).timeout(100) { + }.flowOn(NamedDispatchers("upstream")).timeout(100.milliseconds).catch { expect(3) emit(2) } @@ -156,7 +145,6 @@ class TimeoutTest : TestBase() { finish(4) } - @ExperimentalTime @Test fun testUpstreamNoTimeoutIsolatedContext() = runTest { val flow = flow { @@ -165,19 +153,17 @@ class TimeoutTest : TestBase() { emit(1) expect(2) delay(10) - }.flowOn(NamedDispatchers("upstream")).timeout(100) + }.flowOn(NamedDispatchers("upstream")).timeout(100.milliseconds) assertEquals(listOf(1), flow.toList()) finish(3) } - @ExperimentalTime @Test fun testSharedFlowTimeout() = runTest { - assertFailsWith(MutableSharedFlow().asSharedFlow().timeout(100)) + assertFailsWith(MutableSharedFlow().asSharedFlow().timeout(100.milliseconds)) } - @ExperimentalTime @Test fun testSharedFlowCancelledNoTimeout() = runTest { val mutableSharedFlow = MutableSharedFlow() @@ -186,7 +172,7 @@ class TimeoutTest : TestBase() { expect(1) val consumerJob = launch { expect(3) - mutableSharedFlow.asSharedFlow().timeout(100).collect { list.add(it) } + mutableSharedFlow.asSharedFlow().timeout(100.milliseconds).collect { list.add(it) } expectUnreached() } val producerJob = launch { diff --git a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-01.kt b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-01.kt index 8b3d2d2422..954af0662b 100644 --- a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-01.kt +++ b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-01.kt @@ -5,7 +5,6 @@ // This file was automatically generated from Delay.kt by Knit tool. Do not edit. package kotlinx.coroutines.examples.exampleDelayDuration01 -import kotlin.time.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.time.Duration.Companion.milliseconds diff --git a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-02.kt b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-02.kt index 6500ecd35c..45935a0982 100644 --- a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-02.kt +++ b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-02.kt @@ -5,7 +5,6 @@ // This file was automatically generated from Delay.kt by Knit tool. Do not edit. package kotlinx.coroutines.examples.exampleDelayDuration02 -import kotlin.time.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.time.Duration.Companion.milliseconds diff --git a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-03.kt b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-03.kt index 4d5e40d78d..fc389c2474 100644 --- a/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-03.kt +++ b/kotlinx-coroutines-core/jvm/test/examples/example-delay-duration-03.kt @@ -5,7 +5,6 @@ // This file was automatically generated from Delay.kt by Knit tool. Do not edit. package kotlinx.coroutines.examples.exampleDelayDuration03 -import kotlin.time.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.time.Duration.Companion.milliseconds diff --git a/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-01.kt b/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-01.kt index 1a38c1a909..5db6e6a521 100644 --- a/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-01.kt +++ b/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-01.kt @@ -1,4 +1,3 @@ -@file:OptIn(ExperimentalTime::class) /* * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @@ -6,9 +5,9 @@ // This file was automatically generated from Delay.kt by Knit tool. Do not edit. package kotlinx.coroutines.examples.exampleTimeoutDuration01 -import kotlin.time.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* +import kotlin.time.Duration.Companion.milliseconds fun main() = runBlocking { @@ -20,7 +19,7 @@ flow { emit(3) delay(1000) emit(4) -}.timeout(100.milliseconds) { +}.timeout(100.milliseconds).catch { emit(-1) // Item to emit on timeout }.onEach { delay(300) // This will not cause a timeout diff --git a/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-02.kt b/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-02.kt deleted file mode 100644 index 3572898098..0000000000 --- a/kotlinx-coroutines-core/jvm/test/examples/example-timeout-duration-02.kt +++ /dev/null @@ -1,28 +0,0 @@ -@file:OptIn(ExperimentalTime::class) -/* - * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -// This file was automatically generated from Delay.kt by Knit tool. Do not edit. -package kotlinx.coroutines.examples.exampleTimeoutDuration02 - -import kotlin.time.* -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* - -fun main() = runBlocking { - -flow { - emit(1) - delay(100) - emit(2) - delay(100) - emit(3) - delay(1000) - emit(4) -}.timeout(100) { - emit(-1) // Item to emit on timeout -}.onEach { - delay(300) // This will not cause a timeout -} -.toList().joinToString().let { println(it) } } diff --git a/kotlinx-coroutines-core/jvm/test/examples/test/FlowDelayTest.kt b/kotlinx-coroutines-core/jvm/test/examples/test/FlowDelayTest.kt index 2aa390148f..f7e93b34d9 100644 --- a/kotlinx-coroutines-core/jvm/test/examples/test/FlowDelayTest.kt +++ b/kotlinx-coroutines-core/jvm/test/examples/test/FlowDelayTest.kt @@ -57,11 +57,4 @@ class FlowDelayTest { "1, 2, 3, -1" ) } - - @Test - fun testExampleTimeoutDuration02() { - test("ExampleTimeoutDuration02") { kotlinx.coroutines.examples.exampleTimeoutDuration02.main() }.verifyLines( - "1, 2, 3, -1" - ) - } } From 8685c6defb682517376d2fffa97ea30d6ed81a0d Mon Sep 17 00:00:00 2001 From: Pablo Baxter Date: Mon, 12 Sep 2022 10:29:04 -0700 Subject: [PATCH 328/328] Commit API dump --- kotlinx-coroutines-core/api/kotlinx-coroutines-core.api | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 32af7b3fc2..4a1ba61e62 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -1047,10 +1047,7 @@ public final class kotlinx/coroutines/flow/FlowKt { public static final fun switchMap (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; public static final fun take (Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; public static final fun takeWhile (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun timeout (Lkotlinx/coroutines/flow/Flow;JLkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun timeout$default (Lkotlinx/coroutines/flow/Flow;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; - public static final fun timeout-8Mi8wO0 (Lkotlinx/coroutines/flow/Flow;DLkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static synthetic fun timeout-8Mi8wO0$default (Lkotlinx/coroutines/flow/Flow;DLkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; + public static final fun timeout-HG0u8IE (Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; public static final fun toCollection (Lkotlinx/coroutines/flow/Flow;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun toList (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun toList$default (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
  • *sYrxRq5~d1b|HbhkSNWxTt${wfXBW2BPL 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 z zvk5wxh(}GP%e0)Gy_385+y>BF=_6m3!h<}jyjUuhplw-r&5-M*fMBMw2X;_f*v-ld zDk(S9`Qd9jB{z(s&n24CfpM}?V{}Mt3Kmxp8g73wAgb_U^dX4XbqqZ<1)mP|FYfL( z<4-B-v5g_?KoQ5-IVdZE{4gmu!!P4RUf$!3EJ}>|2_~WeN~b7-iVrVU%KCjpG3iA= z^Sr)xEIADjkxY{X$HlqP5oh=aduA8wV-taxwEJ}nJx#Ur^>e`^JyJedZM5VOM$`VE zS}Y}%sw*lqAG2;S=7d0&{vuvShk`%^sbNt#?#nBVvti>B?-EqWZ}3Kamf`$(y}K9> z5q5>|){KA7I$M6%oz3kz4FvQcH-8dokF}o0M)o^`^J;}<2bYLR^<6l!U_$` zjvE67{D|a+D4*ndeo3LlrCKOq=lxaI32WV?S(wWwKDr~L#fA@adJ7yQWi7FdpmK?+ zK~@cnw^}kmrE;R*X%S`|s}{^Cu)FpRVFY)HokxQ3oj!c*sNi3+GVAhC9Y9=_-Ve12 zBOh1XyXc>(ib=FED_#w-cJ&Dx^&Ss~-}Ar7*puXAbKgT@!n^nfSB@S>98ot=c>D5b zJ0au3r27ksi0s3Ft3!FsCws`1!MxajhU9RSPBBF-+tTdDl}(3F%j0$Ty#mbJW3wl~ zn$It=CxJX5l)|ed)8}H;&ds+}|EaAzmmcA57^*8~XteQg8d#b>n{L)3llPoh?mK$s z-=_Cbd>F5})g`O@>*jNPuZU}12w^2Rwxc$Go81Vru}&^(o40syhQ)%G-R304hTYhv zFG;e;d4jU)%*=RR=u_ITV4;m~LP4+P`Pt4z!Y0&I>|t>tP5s#*VLbM?0-*ix6xolq z!#0^cZwRkAobPOPJxgak9w$6rHGdLhQ;+o5s>l3gsDX||=Df7iT@*0ox12HT2T!V^4YM?__^U=Ya@ z1*o5{@Z}$#m0$epS{sCs0|oU{t)8M`Lk{)@LqDMRW%|Zy*3aE;UY=CuX{&zQU?_FxYgc^SlyM0vO&%6FyE&`7|MN}nlfIK)YqW;E1e`IENzZ1? z!~6aYV07ceW%Q$t(OBl2)bOnwQoV-bTYRMKZdx0(R`bjiwMfrjpH0MpPZw#!gKdBD zf$-voKq;$r?FvOPXs%fXLrRyi-t`{c>o~iFOWX~2-S*Rs=f@(nnvGxoIqCN(%jAfU zpX^c;IsA{~`3diqhKedqpr3ZSVe~0N*`AI%BiNmTmEnpgnK$0ap3^+3HU?}WvS%OQ z(eZPC+$_u_upF>vRB-6MC-lp#PNZpC&6@~!Q3YsasO$e{&a&`s45NWpni!HX`!#eZ zv}@1g=6DULhg+?KZv=`;{gi@64oRFk;Hq$KtklC)uQTDa7F==HO)pb>NrbENpAh$D$x^9-rOI5kl{1$0* zx=MX9bQYY+8b6>fD`UpI8VhvwECg=nO4>Osd?iNIjQ*N@adjrH9 zgn#g%E9Sjr%9gs`K3y}*(bEk`%pw8ceVJ-Q2*R;KZm_Qg9EBqsECQGNuVQI1(xLb-}F@TQ|#tO1u~`4?Bz9;SDa$D zrhna@Sz|Vm#oLGu=4*(Wc3(jui`=`_zPVr#O+ux8_c!b#`3(jDupQo34wPjTJ6XfR z7?py~k|CPUL*9i^w_1JLbkz-f%7!?6KW`0_Yc7t+0P+GIOx93YRc-+2lHqIKQ#xTJ)y>4lp!FF{JeG@ANZkH9-dKKTTarnaw zR=DLcqk22So4fX}uqY@IVB2XaT_r=!CiO8l%6%m^AUG}%ayj$q`hIn%zCi80`O%$R zU0`oi6;El*9gltwgB8YBFHiA~!Pjq(yF~ho@k169Uu~r|my5uPFcJAIFJHB0o*}@L z!Z#aC*EJK@La>k6QRP$!F!q7?Fb#lPQv*iliI)SJugn{3SjGx{^fMG0;BzI)o*T>h z5s>XQcTY$_IHFRvfw!IrAP?bGP-vHjRKj95OuFm-_hS^&aQ3b_C6G=zh4}9NW=6Vi zqBr)9@yENG&P(Rp8a-dbpOMOGQ-;-QiwWxa5D>F`J`- zFF8|&u}o$0|K);IV+Q=*o|keLnlsBAeTb7Q;~DSj(+*0*R|D|i%J7nw%W+(OWyna* za-xnv$YN?qVXEvM(bxsP6_Rb)`u&@GX>Bp1IAf4g+1P(&@+jb;oG3R#i)DHUbtqUv z(ooRzrVM69)$r54hLNdNQ--OGg*vtG64PuwPfCTP0_36n_~YV4YGYKuRmk|SzOyFu zJGM0m0UfTn_LS)F;a5YZK%4g;T?Ic7;=-F`!qksa5;>Easi5<@0aG`U9{TNwdOI=< z27^Y{WV0R;b$-{wq^co!yOa1{cl&WV=LS;f+7?vSB3W~YpVuLL*DzYAGEg-IUByj9 zw-=jkiX5>Ws59OI`)8!>_sn<5S?|zGzI}-fdiwr{E2Qn|`vYh49AA9eTG*%uZ*_hI z7eFXTXx0h;D&Mq}Psm<&|D!8LfBS{5vPrv;vPt&BM_NU@Y_1hik+x=*{#tbNO94&3 zj+w;(Bx*sEx&oHl(^wEb-zkNZ1JWEz7p5!jh3?4yHf}$Cfwnzi! z&zbqD;p>vOp5?d=?GgqMc5W2W;^^5|R>GYywS>jkktw`ViW#G_Q}0=$)pEXPdJyP_ zT4Dt7;i?3M7>E`>Nf9Z%OZsxmh`FmR_Z6Pu~KB2%a zC(^oKm1XO}ezaR|YIcBrn87JC_Zw?=8jY0H2DS)(`!xo>^s+8U?=JLB{Zl?0A!mYTs)hwa%>-GE_zHVw_7XlI#Sfq+y2}z|hd-X~v~>BcK0N_< z56{-Fo+Lx=A1kYwq0uqF0Zz|%U*{_(pjCThvap%s3Ok+9yE|v~1egNo`fiRMtYuK{ zV^ECHUHk|S){BxDn}u@i)a3m-tKfJ5=DoaM z)RBW>ZfKd>nGF<1bs~s!cfD@TrffY2C$;PC0>UdH zif_T7X@+Mq1*5O#@12`$Up-9S7QE>b0$MpHl1-}0LZqv-0G{EForl}?s6j&W<$hQ6?$COI8& za<;aKc=_VF&B-qd;Yh;F>3c>b z?M0X<)gh`;nLTpSsB!B^RoU;()GKCI)T%7~CCeTG2<1nG#P&7VJW8e;@R#~sZ8Gf? zc$E(|0TPQzG3PA)7XPGHpmUZ7IDMrlKs7mH4@^hll;NFB2RvGQLos7)M*nO^qMKcfFelaKopc>P{anyau4H~HCZ{d zP+!P*H4WWQbtXLjEc(K;+un#7l+G`?xYv~szhnQG;5)lTPh?Mh3lswg{AE7RFn1Pl z&Fp=Ts<|My&y(Fq6!{lmc$R&R8=%{kVu5=V=&A6mwvfZ|pf^0*n6yyB9tAI3k>-th zmY*$DzAB7X%~mJVUxCF0TN~cyW{B`#*lKu%xy>mYQb@9}*hmM)@v;%ae@q1$n~wtS zG1u}!>y=VYS=RJGg<jIYfXPYru=zJDZaw*bc&o9PY0x--c057;c8BO$qIaV#@_S21g2%1 zRrLf!YCVeWGcC(Ki-j-^h!(LLdJxhIER%1%7xG-*(usxKI15pbhw@b&{-7lFZH+)L z`oo!Z=aooe(-^T^{s{Z>I@*23%}L4c`qC5Y{AlSbdFezw z2Sme8B3J{r#2w9f*#h+6X(j>XCEc%*ES%~4zwN=05b^Y=P*6W8V*tJWi@}CgTy z!(rvq%w1uws`q1x2JO8Q@uYSOr=8MX0vK~zblOL>D;Tw?ua1~ZL50gCrEJ@_kcmsxxl8dFKUm@Rhh2c{InFE_%A?S{h-_x381v$CM8vTGGNZ4v zLG4A7zc5Hhc~h^>$}=D8^r@;ZLNF3r7D{qt9oPEfMPBp)97!Xgbqza`rZLMegeC%=&y%nk1OsaC0qB1)1$mqtX_QnZ^6h{atDaRgeK+kiB9#TYjdG5 z?kuZ1fcz#(@5zyuv3UB8nPtW0$H=G8?5-z&qTust2BO@sS#ne9y4NX&sDtszw(8`0 zvJtKVL*)V|gj}LYtyrxYGhrAsoO9H?qHOB9w{#6t@0$PyA3NM>Xolpfl;(d4ed^zi zv`=g~HO`}}<14rjmNb-qW|4X!H9tkzq|2S#Pqw*6I=@#{)vjgm)ir&%1N7DP(jXFjDnTDw(m%`p zNUVrBzV`)gnB}{VFB&qZ&mzL|yFwP&BEd@lYi%JiE8PEZZz@hZP3wD{+xCSVlHjC5 z%6fJ5#_Wak_oVPN+eE`2$V&-(@rhf!npnt(1f96Y?}AK)AG&5A>qI$8`y_C|i(;2v z${DSscAtYYDaMWOD;Vu(7;%mY{o=HJJU+8?N1GovcUwHRwku?JZ)l<4>T!*IM)#}d z4=><~y@ruPgw?yfz5ZT^I`(RKdd&R12VQ%taK~gnMqlHd&K@i{3em%6_mDP_hTXCg zuBuDHa*t?j%W2U(vRx+fYn$64T>@1JO(3pWU6c5ZiD4o$ysXT9@~LP~pCPW8o%SY{ z&qX@NHai)6qzZ6fSvCt5uQD#>?1qo)|nI=IV_&9bJ)9QR(O_c7c}92w%WS7vCx$b5aLLP_-p{UV9%4 zLHRbQLvHVWc1q`2I+mqXNO7FF;nvw3C3LJAaR?r9$}xYjPc{w!D{p5aUlOV#06%08 zz1n+JhAyOi!+o6kqV1h7m@tp`NxM_(@ILWNV^o4uby6|cg>Du7B@w&N9`nKnMNV#8 z%Xh0iXW_;s$Pzojo%EN=>tl|KzsyKbc?+~1e)9j!VET?CcdjOu+(bz_6 zYr$2QJoT=B+hg2&`WGq*ebS7VokK^+mWzIV)E=jNGS;jz!nyXaBh^s5+d-v>?)o4p zk-44l3(52gGLc~;o)menz|@gkW-gA?@xmg7@$P~^xbJ!1kl1j=9$AoAwcrrhN&<|g zL*cbi5RW(%$x2s7?#Si#>r+docZsrt@m1_P(MP?%GP;evqRM3Lg&OjduA*2NpGlJ& z^&?AnMCNVGLpqNq3Fz8^lT;?Y{5AG_foz=SX6pf_#!o#Y$ z%jAuys>$oY(wB}R0Mv!`CIhy^>F9*ENWI-D;gT9eT+!cjjH?VmhhHYR@<8gR-y2VWqVhN!`&uF zILCKqusp18P=;0M`H>BGM=DBushDFp-wy3wR#Ja557Q9&3R zkS)Q$a4p?S;fXP7K8pom2<(HG?f9vtU8T`14*6CsAiWoi?0(u{?jB^xms&-K>D zFVrbb5ssA>XkwER!-)CCF$%-vCM8)s@(wTyF2a4~`CgoiIec~(r)VqEWPr@D=`Xdi z%GT^lzADcu)7TLdBv=eb*cJZ(iMZ0_6b!E%Ek|`>Nc+Q-soDnqZ94pA=Y0r+ zdA?pxLLf#>?jSFS(hRCCs+;0Qxj^UKCtoLK2<&67wH~noape|CpsQd%DduH9wD~2- zc!~*U!d8urn{j>_gzP#89!u#4O1vB;&@nW|eybq)W$)f_`jV`+El5FQw&Ikev#8;J ziS8H~n5dj42O&Si^%Fd?U;GD3^zWkw#NoK6M(hS5Qr;Nf8Ut74dELUo@m7nsfx<_@uIE}meryIH*pOZ-V+C)^7eU2u!6Ke z!YT02#6L^%COU{CbY6Z}K5W3uapbGQ8;Apc^8@!jF&n{?vi62Y z8ScvzrL##eWe%-JCOdc)hv!8M22*ANGGRZ2Pl3}eI!9FL*WlTXK z&B{46RwkTtTfZaVloQwDNNA7vAZoBmmMjd%Zn!|GDk1q$1VhRC)AOy*&U*bJ*)Y)I zzpz>>-A-eD*G?Cdg+JvK#UJyFZy!v3A!n`Q=Y{|^y!ZhxNoL>yC&9AoS8aWogU^ER zG0dWRzPk`IGXlR0lf9(cLQomh;{?Sl&MT~hVHqQyegLfJigis~h3(r4bJC;P9caJ{ z;~ZYTch+F|r4x0@Hr{1^raAh9o6@0pw#Be*3itk`FU6Xo0UT1FS0}&THhe)%+jf(; zq0)|Ia3%TKAj($q>v$XHkF&}>L+Yh31`NO;YE={K`$uW1n-)H&G5Aea^c}^SJ`Z!m zsOQh_O5bO)4A|pUdmps;vQ(!)#A(Kc>OI+z;LRL5vo+owt^kTKLp4@@;A@ePdTopJ)|d z24ey$62`^rEg?EzkSaq{BGa%z6hbltdubq6;i2@*24uc)qWTqYF&Evkp;~mDOGHSM zEX5ZZnQ6LuWH#L?$Jf>RCGUuSxNxWBGlug-tyqlMtSU71U?31xSP9ZM<;-vL(?v{Hlh{rADW!fD zwjDShc8qRB}}?#n{iV3Rtdn|$y&v+E8zZ@5d4$i5mi|6=o6yZed{E&#k2 zCo^hw*QWY->NRnH42VPCXMq5qwl&>`p3h#H8^5?9m?~EpWPZ`;k#a z_hUZjhYo@8ewu>D=kAwp#VwixH1^uN@5<%rN&h#-ckoOjLx(?QK-50n+zuuR;%i*-7fR$- z>SWudySZq$nPs#6@xs57OEKI`3$5;HUOyr@4rhuo=(onsswmyMR zq><&Zku(58PY_V7GJlKF_H6=MfD6(wE4#1g7G)7&dHA$28cU<-W4dK%T6v~;_#4C_ z^<$Z*#k$5i%Z>U+BA|!lCxHoa9{wgo2%kAgWtQ)iUD;fi^2cxMx++U0f7C;(j4Cc> zuDOllh1S7SlvfskCzjqikQW~0Sq36%?_=`7JK5)5!ZRS+mr!4`LVUl!2laN^b(YqZ z@wuRJMRRJ4FWwX=M5k+uM#sXhJpMk7)$h@hZT9bFC1CFo!l)R!^Bh#?xwIwb*u&({ z7s;Xkz6DVx5{vUUG`6nv5r1hk-qu8se1E0h8Ci=ZZfP@`pQcEq=rk&Ybem6_{SL>t z70b6Z2Up(>v0)0Ks&>|m3vdXb^E_lbqZ8Jk=) z1Cso_Je0+CYOhwvFPHtQpaaHABvwFvkdrY*F)w!HD(5-I9Vgj2#KQAv0EUUjCheu}5vMh9! z$PYC(h}VRJa!{R2GB6{PdUdKu4!E@Rf%9wp-GRhrvpTXC+GNJ7V~3kpK!sbLV`mwnO3-!E{uUIpx3>)WVTfV zQ^eF1`06u>d{i^ADaAvD7-zlD>b~Hhl!>8=p`GSiHjWe;4YEM-yD{V%b$%8@N9F-1 zNlr37{2nxw13oc>=&@MOTOL&-j(mTURShjCqivsAQFCN9hHMr^0s=j*!b|*NPqN)J z;fMOZ3k}bOHX)Tt2UX414~9&XZnRZqQl2Wl!Pu>TC4rvYSXq}4`3a59nM^`!h<5M6 zk$atNaqh$juZif^>lobkF5H0{g2ql?e-AiGYwrZVJwqPdUD*(zYjv1DXQ@KfRLqlS z=g!PQ+z@i6DK0>AcfnyvKmGxwJq731g{*{573W9X-eY8cctPT}FRskc=+Y;LS9LIRV%$#B}u2%^s*;{;`-q8+_ zUk?m1*W3g8c+479Ob=KpUcAG3fr+N+PcC)o;)zNi^Z`l%V#O2sh7a$Cu>S~Q;OQ|l z>Ul`dGb#iXt3IAIO9N81_z6W=vAGET|M(3KB#pzu!?@02`(;N4*6dcH98=zbF|3xbBS;&lzK*(g zz($>;wcRxiHWvQQ(IVS5`{t##`6Ddeoke%VQ3SM$5UpE$&FC-!!go_{j+K<&Ii=ts zEjOqz6dJpr%3EUoX5Hv_<<@nR`yk$e(6Zo^aYopty4(c0dD2}hynJWi$~G?FHK-XB zU6Oxbq4de=^N^`1&ocf|q4X|+cu_5RVQYe;t@=8u^A$@3w$*#~B=l3@|6}%%>IYSrod?$?kP@ZfzE${J5Wox)nOe37%-T``lJLeQ~ z6>|UXac&EOWlR3n1X&+Ysq;Rystd2{hOf!hN5{b#)U|1v+CP<|;dy29y46$8fmp|V{u%5HKtbY8n~2rII_Hbo{DsDa?z369p2JbMjUu~~ z8!;zrmZi4$#tjf=eE808y1-9YdPEwQl)FMQjd^0M-bUZSxiLCHQ zSo!M8EEzgyYxqr55DR=41BZ*3ia!wls}T2h{@J^#E*@Fo`WKT7FzUixw%TQ?i1qBt^;#PKj_l&R8pwO6L`!Mt8Cb>-$Q4EAF29mLt`OE60 zT(660kNRzc>;t*TiO*4O1elB`B78m+Oa5@Oq%RglKtPJ({=Bv zd9P+|Y|{ zyrcwYH(U^<8mm4tpl^>e#DDGyaP9>F?WZv4?RnN#jPj((Uy&pxJE-GkHAVX{$D~`R z3J9aRw5-rTSNPxu(J0hKf5M|6&DR+>t4TJi7Qw6Jl#;&FzM13(R~6y5Yo=BQGUDak z4~Lse6S1hTv0l1EO|_~K`YR}lir4<$e@_noy?!>!n1fFyo4m(s#oN|c7cJC`J|C-+ zLtw%?#Ee=wf&A;(*9KyynQq1+knxZ_l{#KwpMmTY%_V;0qeK@o#|%QDx0c23UW=%-a=O<##lr&Swas>G5j5W&_vI2k zocwyHik>**Xj+#(fOy%uW`X!y;FW$Ob^d5SFlXjd&4kJw{lnB~{0Q4EI7tJQ1RZnO zlc8FhUjl1a8k*72MY(mv%lqnk`$b{RgCjm!$KRdzXGz^zDWt>Q3#n|;1c4~>y9+l-&_ysCp&8q>iX*+F`g&WXn zGnq3ne6*W-5$p$2d~@ZV(Y2Yru~|{?8cLITgBF|%ty<;U-@5BWl}LPUe5B>4X-_h~ zVl>09P^WFcJ}IGDe_z3{sl3w1dz%;gV-H2$l+6{GJ#L%MWWjNhn7bt1XIJ;HZRYgY zGf{Pq*<92(%V?Ld%1_3L+<9Y((n`E{Wk;$3Azt9u_;V!TUTpKOjCjkOfFjz`ob#K0 zXU2BRp@z-6>WwyqIjTEE{K@w{;HSgYJK=cycd2T0RP+<3JqQJ9X#FdF$|@^aVv0Ym zJq-;={HodhYX<%uef?Mv&?SYm%c|e52;~KSA3+FsjfkTCl?9*SpdBBOxKO3(_B8^E z2rGn{xU>bu__K z%WVQjhaA2B#Kc6fGJXOaA%Vv)<&cqZMRk6qTQHgcLGjrCH~KeTjs3QxU%(Ms3P>}o zL~=g%TJ`lnw4)EGc`e7aZmz^u-yAx9;*OCb2?l4LTL5w{>&RK)7Iz<63V|$ zu{g%WiR^!KfhOYO@PB8If7fp{nf#r~w_>)cO#bX1BL7lX+8|0q4((*sUHP%e$=S*n zN;Xuc8?l8q$vC$^KU%P(LX`Z02I6{w$q`aB$)$(CpCd|sO9J2Cj^O^~_{*r-Vm#sv z8Df=G*j8ljpBSP$u4Lg*Z77u^ED(}hQf@55cLGX`6Cm*0PO@lR=-hnQzVy*P&FV(1 zu23{Gsb|}om|XXOuw2Cj^|XzfMglb>ysyZTEJwkXygUdiIIv#gEjepd!>^f~OY0~+ z#*~j3UyE(0RAlAo4kd86YX#&FGt?eX1xVX0KCRJ_unm{l$vbG8Z64PHGua@v0|*D2 zC5hu@viJ32NRwT1vKDpl^iy;1W(-UGhgOQ0QLQrxk#9FnH-h_?m8EN&H;7{wNTiY# z$B`&3be^Pwj$~4^OFZj8c1KQZHmS8h<&5JLdpV{~NlZ_aaM4Fg=GU5;$DdTsRNk-h z6s5=&8?cI>46!9Ot?NtK*e=(5do%K;EAv~uB0N%nElE8K%II*zqR9HJUM*DI`6OK& zA+yq8*0dHWdGQAy2V2Y@-)?1|Z>iwqWimyM5{Q+{x%;@7X zGF?mRAT2OPDf=tftfkc(14p$Y&>r2nDk_<_F;#`@{L zN1-R6Jprz#ZvkYui+W?~RF}ad;jn>%;Za_n%u4bG*R;0Hksgsyp6maz0FH9e%mJyh z7yQm2g{YjTjNWpuj7mye$`JsHZJ(L_JL02Q}*h8&c5CBL}v zN&6r#_4(AEdAM-$VQ-TAY?d`eaCKpj+6$X3d0){#&iJ|t+b}S&5cVnG+`@M`DAS(0lo3Po}5?O8AuP0*<*HDr4}ULx*X^4nVeXs|n5WWF${mhHS)Qjr`M zDp>P<9&+0ls=U%jZ%zmRaf#_eg&T-5P8eV4h_%A!@FV4IED%P=Kddrgw8 zsOgYzaj5r>Yyn5faOTgM#sAMplY}TVh3z|l7abRlfWZm=I^(ani4ZxRHcWCzl0{OH zY-l7b7=)Nwap!O+*Hlsd-t_Z%&|?%n*nhult{hQ)SnGnRy7tr>H`9@1*Hu|Zu#neW z^m5Aobhd$AHZl>RqJJ_<&(%|iX7x9(M@xj%jz|DLIh8;=W3$`1i}!8q$q7=*`t;L1 z2zHVL7W{x*I_8iakS+Gfl>ek2qW7Wrpn8WJ`PG~1H6g_e7XsFa@d6+@YJ#l;QHFn< z#xv_cje;pxm@i7spzC|gtELs^5abV=$KBz;7LMUsVSg*ba@j#*1Tk1E^ zOI)y-OPx^o{aPgiFe6qtnzAuo&t}Y&K(lwT>B3rf&!U@mSU_%rR{Iu`JHE0E=Xlxo znbmM_g!)8Jj7q}Z$&fAKl83=+p;x50f`%e2zWbErA;*O*+Ah}-8Tjh4pG~RT8KDvB z@hQ7bc3+EFk2+EIeh(n6j|}PjlGNCQv)4YoW;q}E^87Vh1ZiaT3wg8TpVpyC4Tc|- zBFPjYVOQR^Ww_H{bjfq)__GsQ1m7^~vLDi-hz|!`0RQu9I?h5Y^qUP9fdnOROc)P)wmPr`$dZCIv11SUsUle8e?TMO5z(*tUZ7=n|TlU zu~S z7Z0yUrZ+WI+QVN0?&U45JW*|#P~=`F75V6L**RJ&cVbocCD}2?!K69VX{>0lIzN=a zWkJqV<3Qi!q}cF>JqUOK(v^Sa+n2PU->;VtJokXKGUOFgET4K9{b+~xj>lDsAsH)> zLUQiwgvzeIpBSC-Z1hYQSOib2!0gV8zFJcImTRii_oeobIZyXEH8nthTD=lk{B-II zR0Od<9S*@_?wB*C|*>Cly(~`3ih;;QPm5biedhZ-|zDMwoN=7VM<*eI)%~k>o`=6++=8+rb+)T3|c{zZrWifc2w}>x+%|*7}<{ zO+B-afKky*ZK0^QtW=WTb3JC7Z&ix|$&pzZEpq63acairM+C@uPqCMmTZYOumX>jM z_{$|eeKH~BY14Fb{6B=fRa;zZw5^L12o@x`B)GeKfFQx0pb1jJ-Q6LBh|DTf%a)1+kRv{ z*ZYN*pOf3WE*sTE7^Z(qEmhOFW@veJiyV=4y&-*jGcRLGeqcBVqZ+VeuU z%h%&hC~HR=nI)a?tB?vecq(8!dcJyUd5IALDaz>|F!2}k8F9i%A88&)>UrQw>Xbo5 zq2h)WrQDENvW6)%Ku3)DlileQ(j!)$^cWiTn4EdI$cWzNIWR})txnok!Fwgw&b|-f ziW7^(MK)XMTp>Yv@PC)p_@E~Ar%g9I zgtJYuH+tfK*sg_?^>f-}N1p7bif6@rckWc}zdIA_ySLRmSk#0T7v*%BuF+KhJx*yh5 z^3BZ8`-*f`7g)K4CvOp@_MJ4!v?nc!@IL0$;u5DB!#qmY=75c+Gb#a!`0k5AtEO7o z9yuO15ika3(=yQ)ZR1RzE$|OWY-OYY_isAowBGs%vB7r5g!omcK_X8eoWb6T%EG(9 zmmIelAuKwwS0j^sG6-{mpZnZZv!u$i8LznCF$!6)YbJ+xc;g~-iFu|ZCQgeu2WNPG zL6vbubtMSb+@lk5zC&&8toa}%kb)udUS)1e4~4jGw-v(W6HwRtyQX4SEG_A+>hruu z(%P1IKZbd^sj!)hyF+bwEp1CcGk(l!=ab^865ilDoc${6zr;eSvNi+GHp)=#+=i_L zr+%(LTL{g|PJ3)tkr%o7Pn=K2ajWUb?CVah9=d5Cd}i;46t1C?d5JQmecoZ-2kb8$r86i z-#yL3i96*E%)7y$Yvh3&pz~AF|16aD-w0B09_)TiQuF`mA^&5o*vBI*bqVco(A041 z$$y3M#s5Mq#c+>a%8U>Da0oU8$dM9FWV&sK)#WUP;9n4ir)Kk?RDb*=`xGO=_1Ve* zK-7AVg)y_AU)vVOhBs7)AcacOcp$>%kMmkst<}$wN-`g~4i?GO(^SM6=tPhCOpZx1 zZ?1cD+p5GR(9hUBWe0M{yWu>J95cHLiNQ(a>HP36JWct_eXhzUGS}Q)j5xU#0+%T0 z4YctJyv~5RIU?s-y6^B|ykZP);Ka#?s2*pWrX6m@UZ?f+dtgqv5IWC|El>N^8-5l1wm*{L>XH=CSojOx460I) zv$5)MPnU9L|IaJwwi+k$D3gb!F!_La01%8PnU6KnlDo zH~SpJ_9JrPwfd)^+z1RL%Nhgna%jgQ62K z=yS!aK{qy0*+qKAdqt=NqcizCCY6yQU!4eCUT6w3*>@b2H;Xy19&<19K#LE0`#31R zmEOAOVBnY_GsU)sB2lrGFI+8`lL`HOJ&lSm@2CG>Br^&S=Mx&srSYyD0q(c!_4z)p_3dcsCmkI`krRT zV$$1eXA$BBm&2PAQCsA-f^(UE%*|deY9_d(i>8n$UodCHE}6Xs2s1kdC&@t15rN4I zox@8Hx?mLIXahN0y6^!t#!H(x_D^@VrZxP?9wC=og zwgX1z3R$bEQCDeK<{*G7KLGnskC{dPPN&xY$^SKQnD2YHSSx=?f30inE>d5x3qP{U z0JUyTz?A%3Ce=C>HFeC!Ar4mlvU03<{$tV8E{&D_6Kr3?tsJ)l`uqO8N#9_2cp|iA zYHbDOF{a!Jx9XnQR*8vlS2p{@c*{u_R(=@e|L7jS7^^i}7k>#0y4e1ox(5-%X@#l@ zS&!y}Gny>6wmCu}3W12QO`u+{5Gs#Tk?wYUvat~4mj4Ttqnia#sji{0A9joMxm6x9 z8Lk40EfK{v?SSM^;DXb}RjAyl59x{y?eD(XWi~tvEojv7)O2K=Yuamu02_@9j&dQZ z!T{2uZaff-QhmFRQzt6E!9td(EKKg^8fXePyrA`7i0pm_)wZ2&lROoX$`a3+Up6>)k@5@J+O`bwxog++Q71I9&Q8^rs_99Oh|Ttg4; z25m5ZFRzckZYGHcwbnqr0Z%^h@df%GE#1ZTfHg3M9<{P+a3>OO1@*};$I6)Y4GKFL zz6enxrt1%u@r@*W)<&}aV?z+j67i2yjB}^Xx4NKVFdms}rCG(1nyWQaj+KmDTz+P) z36kFp#2cl^yQt%q0p_JA6NqG5TTwz-Z=MTby`9cs8?O?(3Vf5UU;@AO@ykc1a%o(h z6M8ra?vc$oyqMfObzd2)8`U5jWbYELCO`$@j zpd%{(B0ATEuSNj&OGLL-KKx71Tff0NoU=-!lU#yWn=2*XthP#rL;TJLlnt# zc2a8mTW&~WC~UTFrhq}3$`W3T77h*fi%lXsdj@W`1)GZFIelnap0?TG1o1EJXF zuG`}`RA7&Q^-Vl$-BFk@r5)wN)IHGBx}BXnFeY%Tb^h$R6qcQo=b|j|*m=DGY<7D< z%vc%_{0_T*;7>N1R2#Uyfwk>X-d}UCrxjd#Q?{07IfK`af~I3_izxkn>>GJahq;{* z+C$8J?v9PEUha9v#}*R5sEB$QQW-h)*BtFiU9U-c-|dO|`?^BFW)^Y7x~ayq-;6x= zOZapip=j93j1(*+T!3}M9 z+Q_E=*s~SWFX;Xw_rDMT3i=@;J`qCaL#Gr)i@^WKh@ha0$e<^6{5ncO`&8YYLD8;N zrtQpz8&EEF$Yxs?Fx$&nc;#=`2Ldp}?E%I=*MJ zVF$LZ{yI+8j|9Ie58yME)0vp&b5Pzx>XDcWFWBtJB(O`fp-S5Fb)14C8#_)rG8`h= zJK$V%gcfP!^C!9bm|Fp;3qF*mI#0g<5o4wZwG%gMWB2ruNQ-H5Vp zJeY#FGR6RzG518G-$zLyX1Snb5cWZ?@9aVKQ}Cv7qKk~EK4d{(a05r20`@~@?n*Bt zma4x~!s+vC1={s~2 zfq5J2Q%_73Jm%1-x3|WD!PQ~R2Dqxw6fEB1{Y#CM4<>QEgKQq$k7ZjyIa|IE@=*6_ zI_0TMep%6NMKGeISkd=^d0t`}imF@-WZ~wFpgFZ{Vvh-8dt&5(JE4!sT6&>~e!PsI z@%w`9EhQGaGY%@V+j3^Bk<11}#eY9*Qqlh?P(c8$%n*cQt#QVnR=>ov3aCbQePoXB zSXLP@h~C6P;gc1uRuI2XhI%%Eg&ew8@-w*?#l1f2fos4GiB@oGT?BqJOa))>=rI^N zi|&7%(j2K7>pl^W{82(6Jw6TCOu?r5&&lD>mAE7$q7|ZgtgDuAz$aG}OOfBEb`=h$ zLZNSuMfu2&yTCwkvFsQuGC=?0^8m}CL6!(F?Ifs_es&`qrC4}i>B71Cx4 zG<4haJ=!z|k?Td3!yh3z#^Z^kJ57@{W=|%gG)S0IpO$s+D~E<}d3UfplDl1Gx2>omV-9;kzxTwbIn@o-9;!{li~%mgcUoRhaXyp1b{7aH?< z`;fJT!Q!WU>XYhO8MS}y-zilke6m$}tl*s~-!(wtB_Ry!?O7_zc31bFw)Yb`@rDD~ zlz&q{W%oJpJX%E3P|^qNKpanR7gPLSy9CK8+e>|S(pxnZ&&RG;+SX>Iy^k(b?6?&b z+mB;VAumt9gh++Lxe*t2Dq?NqZk?}JN>mKmsf{!C8(^*?ui$d5Q{Q;y9=n*o286Ez z)ALgfloluY`83KDTcK6|^(I*`w!wzggDsonF7>nSKQO$=` zcCn)au;(|@bGE>Aa42ek*E*`IKS^OI|>X-JELv}`&hV!B<1IZp4ay&c}}K5w*kFrnE2o}6BA z655g#|MW3d5puwNGUit>Z<(n06lknA87sAuR~O?EiN*j^5vQN(oaQ#o#iF?{)erlO z-Jp3l;pi2l0LWAv^X9UUEvGv=Y$Sg1x2C2Sjamg=Zbno`o!v{B2o)ZC*oq_0E zAe84`zXvq{9qgUHHhs>~&!UH{mVN0cgR6HJ6haF6mfMY3q?Sz2iRC}J1M0GXJkPF8 zbc0G9vh?LxdcnLq#Bok-*@CIt1lpDMG%0!WC^I1WE`Dw2I8_!1Q7#8msy z30;g0)*`74J(cC-zhbehRu4BqsDhdVbhd&qwsT^-ZM33URM{97QsPh%E^D_!;b#&^ zks)hn{AS(gI?#NdxyZfzjD&aKW}$(x&d6F`8He|8=U3i+hVXEyr)3k28^pdd(fw38 zS|`0%Aym3-4a@zWM{h!bgV)7Py&(cW6b zX-jo$AQ0b%Pe2n-N)1~?4suFy*9kpbsMh3)|0qTBD)>R=8BBKNnrX3J5fa#6LiMQ$ zF(@oHNMU_!)fGPC#LDg4vV!_Itws*$Z6!uBs*!Lbjws1*GC@Bjb~5}nO;7W1d%g9X z_=MlxDEslP@o#HLGg2{@s7Yx%Yxs6jFtU!72&jn=oj;%@pq$~%>H>9QbkLWd0XW|MfXnz zyf{rgIikN1Vm^45ya@PdqJ5r4lbH3n8_nV-qh4|mzpS0^DLRJ;vx7EiA`(&4n7bpt+QE2xy5ct4KLaNa&ZcWjSrPg*mn-S~i7NFp8KxqCMqTQ0Zj%Wk}n z9^!#ouA~Dorr<5b){q~Aoq~U3MZ6%3dK)F*@ ztnE5g>^H&g>qKk2Cet3GfILGJ=Yg>Xes6tEN2Vp$?zj*4*NLvb>W`31A6A$yxR3;{ zp3n(AtPk7M3i!IWo=mbH#UX0Lp9laOP-S(d*@c@M8#4H9Z0tQC;k#vgr$1VE#X(~A zzx<@(A;m-e`xJf({flEA0xvUef;^9ugvKj;_Gy*_KAdtJ4jbV5V~*tM%qMw#0d>~ma~C0UEP`{WJ&IQh(yl_F z+=XI&-7i!7n>+CT$MD<~1t=q6EU0M%zlVMoX$AKjUAw&hA(By1BOmadzJnQ-@?=7j z;c}mLqV128K%a(bheH*pP4+fz_VC&pZcfj{9xzYKOgo-DI11l@b{FN$GP1JJu z6viN3ksld>W7)(2he0YF>_i`@uG0`ZIzmJY#gVA?;6_U0~TtS+OA z8JDIbH{A(G8go8tlv|9ON$r&s2L11>eZSEJ0@nGn9^U*N>3WQ>%|BTqivb@dlD%TQS^3uKo7J4-QvX8#B)OlTv3Y-^x z=`A<%>G`E>P1)w-3mHi%-FIi+m92V7j#Vvttu?Ch)An9`eM{avj$R$*>8vWR{f5fI z*;sjL0Rg-}6g?Q6mYmmD7XOHAZzbi;0q5(S&Vy4|ro?<_$&a3+AxrV$WN}mk-%-C_ z3AaYQ_Udb73?V;(h%dC=m$ zq-4NDjm?mEhzBT_K{r7~jpC0Pq#qv)3WQMt2X7_MZt0u<|19ir?jan z!rXZI69As{n6Hg3?dvisD#jRMs~+S1GtMLII5v-ut~a&FXJHHY$9DN5y2EMEN@@P5 zePbiZ)0@dQ#Gd?%l7?!^Gru0p1j0GNk~ zlLOE)TX~P`Qb=08O+N+~z2?Ld#R>6>^x7;Zy0#fc`r!C+m$?)URq{XVwfAF#CGeZRiV%Qi@Ixu=FK2q@rJqQ$$?^Awo71r zx1bt|O)7%7Pf*%o6HYL-r2APh)Yg_zm=B~`Rv9R{`~DF_-QzPU#H#|I+-86(rR!Qi zC_wW4I0lIX0HP>%>Z)3KD$*-Y=HijkGp9u%mN>Q;pQ|Fo^NROY&#O_LBQI_!u#YEc z_M3nIVg^4Fj1edgC8O{3=m`3Ao*h|!0yI{UAO!V*Xj_i=pE`NW?%2bh`5ON~9XK36o zC|LgM^wX=Gk7`5o8WhfTxh8h21gUhBOhEi{7K@kYj$~a;y_w{Efuujhk4*9+>$*z9 zPy`CpH*bNR-;o)5+B^x!#h2t|Tg!nw9OTU@8GR?ZR@w=Z+E zf@`hVeIi#;RoG%?&Cos7)6iQ#VrTBc2gesFdtj6)8ovagGd*p1cTCusm94)UD>0OO zZ@=93dU$z1%}o&C2=3`F`l>&WQnu!JJRLN`{&Yu+l*}iKHKxAPp3|Oft2qxO6utO; z{lqSu_jDcJkqN|@SON`6oXVuGEQz@viN+J&RG**v`&=>;Xnv&H=Bw7J)~e%@@#Kg- z%nKYOykeSWNu&Z;0DklECkLd#$XnH&e0cHhgBq|0Qmba15*{NW&{E4tdP8k;$sFGXK6vqj*pr%HK}c(r;B8a|In z|6Z^bHd^;O_k6S-Mk!lzeNpu-UhZIaX4ZOrlwNG(C2Mo{+{W##hW-OR-%$<=_=b-$ zjN3e=9;R5asn*;<&WEWks`jp*qMuZA>NCWik#3t)#Xbgy*N3YIz_u$t&;=JPPX;5=Wk*ShydI>qIuWH z;gt6L%Y6&Af-e)mlhuyq{V}9~oSu~3M9^iHYNu}_(aAKRs+Inc@`1)xR^Y@<1EDj# zTB#1PN+1f3gR48ac_%Vfe#JVFpbm6N-k9c*z^Ts{n|P1{7#>rn=Me3_zM$NWS{HiG z3m?NoY&$he3Yi$3>egCg6zwHT6w;?t(T}m-HVg;t(l+m}5zG{{$|csgQ3K%C#(Pt! z7k@qx50slGfcgG3pt+>cCV!b4lC9iie+pyw6uP@61~=}<_Wfzkwv_+yW=%vJPRjbA zbhG8J|Njz`It>31lgad=m(KsEbKs$XKcPAgUo>sx{&*=c#>1izt$=B#QaymVQ96QH<2WsA*u6);|DNV zE=)Ilu7h7t%e1K(#`9s64eL_D^v_Z&!FC{jLoy^Jz_h37LMw%=(K6zr)hUx_1o*U4 zlX8XE+j&+H{7rgUST=xJX=J)-u6sVMXtBLE$T?1;?2?ni#K-G)Z|&xB)lsK|S)qeSC!_jPqs8hguzqn;r|J52lX#>M5W|G_qE z;tjU0nQnn5 z)Y4Vz$ClejE8RB*q^>2<8i=r#TUqDSUQorgD|rBEa(Vr8v!`fR<7)(Hbg{e0ap!E- zU5w;WBI72iow~U9E>DkuC=*lR56hCua|vpZE%OA(X}V3(O!MEq#o_&!xo1x=$v%+o|PJnvt! zWXUXf8!_D!PTKNhHza^w#Xbt4 zO%X}qBTiq$x?ostSu0v~(k(?evu-d63u2GSC=vuoxiVcLceaJ@!qg;K zhfIfPM(E?RLK3)ZGN4v|Q!iLQ55)h9AM;Ly!cGJ}-?FkTU7#3PTk!ej+2CC6J^)1SgwvAOtVrpH(=wGf_jr$d$L)D>6{! zjwexkP{)E1)nJmI9pK8~#PF#6Tw}9oVG=qNNA?%=r1#$Vw~bEpPACjWz*XrDSn0HIpM0}7x@Yg&BGGQ zHS`_G>qHR~+9=>(l~vu_a$}M#XnfiIqU-4E-+DY24jC<%UPf19Y6=@06<_0SHyH1g zPfyAob^!&28O=K~U$3=&I4Z$EeJZc$3qRX*R-($WrsosDX?Jr9y@@f<=~|Wrj#x}( zRcW( z)4P)qabiIcC@D&NWR6*qokey0jv-{(BNo@I=F3!Y(RyED5P;Z3Z=C8%ZJ&M&8!`UY zd;CYjhw?Zwh9 z6vB3aQ^LVN#+*eGZH}nPoCOih6AjQ|dIBO3$iOLn5_5xmgTx+0#ky0Rx}gKuwVdDX z$np4;;UIIT^WStKlm|o{RHg)P$LoSdS_m##Wdm*uD+mDrxA1BMi!)4QKMe-f!*i(m zMX?YYIisYce;ZCU1D@)ovST8|9QI4!3Z*BHcmG}#3l6Rgn!;gt%9n`pBuCDEVrKRJ zUFkQus0Xms?wqrrFLKBZDuUGP#o+_TaP~-HnB%!*KkunJ!?^@wf41PSZ~A7@Xvuo9 zJ8IXsCSv54SAP$E+ju_BS{t!RrTlJJYrJ2J!?&tz>D2x8x$+5qpvBZUOp=L;&>^TL zDfA%0^c-h-n6gT#T|)_$sRu?l8PH?w&=1_Qd$X?c;jK!VrRP%OO%@MzuLLipAc0?K z>^963I_J4e(21e?oK&YCE@B%{RsCx`*%^r=Y5q|Ig+yA(fj8MuZ37z`9DF1bQ%53w zN7H7Q_%s40xKFI>dq+cLx+L=Qa{_<=b$r8GHMHXW?OxrH>;il z4n)R&wbCGCIHf;@qc|y&9Hk)epNhIET7_TJ@Ylx;H~j_j2j7zO4hObpi-ivH=Yv z3$u0^L}jL?KEU%Iwnv8BK#od9>)*Nul@#WQr^gl}_icvv!aJ2pQFqTz&AyfWw^la4 zqpbUbZNadZ3`g*dC8WG1N+iUnTX#Q^BlL)a+vII6R9lDl`L+T}CY!4_2%OFl$vcSc z&yYwKo29HO0Cw)=#)i}lcw-TNjG_Q}h3gO8;DuRrqps?ya} zXnNpP)#Klxb^K=A><5#E(X+ZrMwk)ZIQbYidT^ka(?*?fd*ac-iPb-_g!g;Eht^*~ zWjAZDIg(pn#fSJte|6OwT3h3GFf193kqMfs zTkbU*R+EwZm1xn?Af7TfC&97aIxf)*(aS{k%aI&-i#8`)9LEhGR-{EU(ohmG7Itx;fTUzFS>i5r_GKnpAQo%V6Mxcmfvzqs%F zY#t*8szqQg*k}*O(M=$Rq}IUp?*)%!ibP*8YPi#=ynWDns;{YWr>Cw9GRhRd zU0<=t93!N{odZ+fJA}x+BjcPhCOfd%?53B)^nc|vWboq%m$8iKe~<-5J(NcU&~Hy? zhGT})I<5$dQzNb?&Y*^=k9o(NKF$f2PP0$Nt_A6SYe)h#?*+f6(KCH^MAzXl#AL<# zJ`7oLH-3;ge&3N|phY({%$)g95mlG|vEOGqOlh&S!(DV(|JKiIHOJUuTO6XTKiM*K z40;RlsUqXVAti_ISwE9BB21628k-L^C&Xbl+s|phX z^_2Sc;5q_Db-?+XUrS1V>{)Ntzv#54VK9{x4HYeV5q(=X>yr=toVwF=w3SdpyY*IR zF-BT{;}b>*6?+RQS7Qh&E!1=S7i5CD2ZuR70r`45-!Hk7{VJJr2jGO>kxWSI+*ZO; z8wNvh_bP*-;Qe+yFh5B?*6Nt$uj6H{Ra&$XlsJ^zU%VD9bC6+o>*IM7(>hP&;#dcs)R!%5?Q?1koiZb$rIX z{eB!BufQjUSrN;y^O$30xKwxgTY34-;tg{!c`upDaNIOo$!iD5h^tdykIkBmkjIM_ zxpDCg+}ef@mZ5&x&qmzc6c$thG;z z#=iwIzy7`Nuxik^{^D$|U<==FC+?>Ap&574s)oCdwJ8Oo>H0d{sq*~c6)W(bo5r&4 zcn&74&g*_o>vX(mk9B#faTKGmgdM{#9oX5jvjJhw|82ytel-EQ$=QEI-M`5VB=pxi zRia1N5c@SeRbqz)REBELiyhzG)E5rJnd5S2Cp5b6(3{VWWZNX&y3KmzorhcKDKm%L zHp#Ch0r4rT&kb&_l#kKzv8LVE_ac}&Sp?bCB79+{ zN>bV|q5#bOm{^qtVxR^c>ZZPIx-z51@6FL)oUCj-wbO(1L~hpIPODFS{vL>d>Ijth z8EyxXQ<1Xew*Ge~#-!BCq#f6(I`szv!DF_W(|l|9=)v@XN##^wVkl}h-0(P+N3k&j zaHv>z$aD>Or(J<5wn~^lBy4h20bB>^uj0(nuG$+-2D%JF`z|AMk(ccW@V~N{Lq%a+ zkU~f2K(DFMe8f)Y9hQSb4@8Pj4hJ(xgTk^>wvC2e^f{BS7U5w9zFg-!`;2F`@NqclS<)mmt95 zyO|7Ga@EvZPei{GS(%4##(j&qzvc-Z-^>isOR9&o7I13d_q=mtv~YY3P-@lY+&}|arW2SD&_UZ*S539 zYTWW2ZHdLNKOG+3msPx6(=sD}dMLNLZ3(QIWU1cqz#xOlgKcyq_5DS89IygHvG5uW z^YDE*O+B_LqVSY>U>CpLu$lG+Pog$Jj@L4|z>~L=bDVnPfBVL=@9Ok+yj^P}TB9yW=6lztLvlcZ`9@PR&v5Gwf=e-81}UJ$Cm~ z=Y+Q7qbJ|hN~XE>zl0Q`cC@o{#b$>MW>fPkv!m8*FL*cV7TRpB%7w?AV0_|0A9I;V zUT#CqTsHq3y{G`_X^otNZPHh}IpKuTa@3gFI!Pe99oY`_{F9$wGQ#{8fJosU6je6Esa$^NVpcNBUr zjEQ<-b~NBci+(xT)!SkW?ma8?=5Me*_Q)4~$nRNt_4Qse6sWEEk2A3|7q=zp;d4^v z2Qt_ieAH4*%y&IG|IC-yU*_l^UefykkK&&HpLJPW5Iysu@MWQJp5lF5o`f|<#{2uV&zU$w7xF{wX>9 zNAM3S6%&J-o9_#713tWGM0gAfLKu@x!?$N&`_gF)63g)WB!h>yP8c4`uQSs5On5;( z9@l;t$OP_Uzye3}+8h!z5}vW@n^yPYpZce{neY^l^EMT7hIZ%rfq7tGV9c!O{ddx- zA9iji0?2FE-kH8AzPQGYH8I?Vw!%$8`eWNcmCkk9Z?!+C-Ebe^!)@d_evIm-YyzH$ zN2{u@6*7|p02a=yk5DR#$Lr=>4Wg6_VtM!B-fDPd71D1@t4GGSCapL7;~s+f_6Z16 zO|JosI}RW3`+c5iBIEAiHG6+Rz$dokIYt=HrXFoh8(P%XwhX3Tw8=R!q%tIzL!|>! z`O~{{tQ3$YOHMsklR?lRVmd7ROjfnnlFUa`Z<{nrkj+m&rZJrfKavu%{`Pq9G=t`L zDwbO3cL??mW7+Mg@5H?+?)~>PH||O#x8Y<^nyO0ko_0gpSaA0@>RO6bgk zYdd2zzvsFq6|kLW$cswLwxxQCKV-yWeLBdedL&yoXXdb)wT2~Wn01-1rZ#UKQS9J4 ze6}>s9uXGCWbzS~rF;B+L~QO-_k^0+b`!x8Zdk#5TyF|m`?f(9|6+n1 zVdQhqd4w(IiCG4hoVbKfe!_^iu7&uCmoYf^EI1>mj~mUU9OCclEh1?|zx0j%k4pBy zPp!l*yes82BT^LuCdR~d_uH>}6_2WJDSVo=3Pvf1Zh$v3ap&gTW%x?g3oTkd_64r+v}sx6!AJu#nhxBeV}1)8Byh|#!E5tR>;KHIp^dDGbr&~-F32E%*K@nDJ2-r_s?k=zNtp~vT-q510Wn{3%ejiN`Iw+l|NEH|^(i@<>; zsq%8S+G@x=GwHme-CY_zSpx9H)8otC*WLU?o1_mo?3Y<4;iQgJs|VY0^Z%&{xt*X- z@S55G?gRgN`PtHePjlpRg>w`X=31e8)KmEhr60?KG6N{XY>_$CCe)UBO$v3$i2x<$ z_cT!yF?Zbz+l?4*-=g7Lv6Yow#sbQ%J{TjmU|V=r>GZ?0;4y795Y!&$-b_Yt8pFb4 zAQWRr4z&s4xyh~?9d+-$kbT-TdZ%@Q%M4(RYe1!Jj^0JFTgXi6g?@O+kqX{2aG47r zT0y7U#;jDnx#)X6YN8RFH$P{HNOtl7;X6vKRzka%l;Zky@mE-qdFjF(yXQP_S_n<( zSA?~Hk(kR~PN22SXkB!+-zxW&C*C1$@^e6rz6zSRtV#6R+(omT{ob*!BQ{ni0sTYH zv*PUCH%pV-3neu;r%zHC_L&~T6KlD7G0fz4dDBtuKSab@rsZi@vU1fRO37z-*$}fk z3|x=g7|Zwr^I!y`4w4PAhj$1yzNID#f&(r)ec$>UJ77e4Z#VuHb*-bZB#!H67~Vk@ z5@?POS*>opu8B{%XRq=q5KW%Ro=JU~Z|54doQBZhe5S~4_w>zF~JK_Vo0IJK_6a?h! zZHVEIiY|hNyo`Pxd6G%b2$VG^eoRJnvLoFz6m$HfKE#swr~Joad{d6RQA#3gi_rr@ zHIPtt{7u($!TUU>EYkHO(_5CtVzS+Y(_~pXb5u-qbUkX3;qF*))7H{^Mvf#yp&N&Y z6ay)g-QSwJaY)?9VvZXmxJow(p7LMoP?SVP= zOxBL-&RNHQt?lD~pFKeQ0N;M@^9laTd{)Wu7r}#de<@Ef+~=T*0hUvHRdx-S78 z2ZBc(Z7)th1?})sf`YP%MWdTXJc01*xj}l*r$TSO27SHg-O?G#$7^ngu=w-rE;o3< z6iYO>z3?rQ@9s~Cx-3ZRxM>Nf5}%>G^Fd1RgdQRIz{ro${!vMJE3$T{ONl_!OROwK z+-0%CR#@`ugDuriz%i~@KK!=>Mp>^ki&mrg7-ZTq3>KBY_6js>glP+3R?(Sbbm)?@ zz{^$Gxg;LZpyFqG3+R?I4oVrijnh-=UqpJ|MG%#YS*iG4^40IP9EWYV0-%(Vkx`= z&3F!W{;_nh9mw&xIL!d{xPD5xu?o+We2Nn8?+TKgG$CzjY0K$7i}_V$)p4Klb_qEu zEiu*r0&;>N9(BFeSxjbb`@VyXun1-19JWZ|{%&%S}!W!pAUbfs2S{aBJ zMB=pWmG4g<`dcY2Q&)Xn=Fb#RG{X~LPfK%kmcUB<${&u14r2##+_!(e%4zefD}JZj z0J_^potHDrMYg-i0RWe(|Bb0mV@0M)xv07R+%J~hC6=d73jA0>(4CB0aM3XmbSq^N z7#2w&uE0U|c}uL|i5(%||0&(sdDVmM_M#}K8DzVJ;$Md0x>p%aVc&7v&i*5(_4wG0 z9glm=XX($8U=dlGm;Zg^yn9Oy=QYnPUD0eH2IHJ>S;3BY)DUcOc*W zZ%c*p3!9hY2Tmx{#t4GfJwiMBMMX-+RUL%%3=VxmerXuFR*F}yHa#>)Ua+T4n?#mn z5PSEuqcFO!;`JynKlG~2UhfPy+f$S+MMdxY3Aol>OX&;Q(I4>kU9)gxK(+^`+YDRp zEebn&lk9ucR8>atMUGe2k8nq)r9yggUZ1=|{|`@R9oF<4wtbM2kPxK@DlwJrQ5&Hk zts*7uNTqYskPt+0G}0k0-Q69MQUf-+VK8DeFTdw~pZCx0uN}wtd+fUJ^SsW_IU=O9 zzQo>33jGvn6{mkgE?NEg(>JIx)Tm)6GKq6Df1-ej^+GK*vzZXWbHq}t%l+OzT~I;R zl%khyq%6HH!>QCoJ!_K4#HD2O=aFhin%sO+bE+&SNFw-Z6R*suSG858*hDZ*HrUsr zN6Odf4G-yUeO$tpuSxVH7spEAtX2@Pvw1(a;A7s5A^hD#;HLb~b0LzN?-H8rbwgSlc`f&ec zE%u)upl~gYxM%+n zk8X$w&yEzC<$Z_x$Cif?^E$(jLwXIE*JCN-Ri>T?tuF^h$t`R1TCnX$SUOS`j;|R6 zsNy?78I-T03O3;q_{(YF9-@KMA%Mifc8)hMb@kKN*DO5HhppY7TpBcOyev!S8hqJ! zem%fkoA*lW8ggBf>I?{8c9K0jR{F2K4j64r0nBxnl!UB`SoHX?3sqT z1@<9^lx&re;Zf=1AK)L(48TzbnR|R1!(%i>@UpT+J__k9#0~dVngS{*w(*i?^FKk$ z=!N5Md2dZ4rp0@@$ahEF=ii{TCyUb~iI_?IgM1(9FzEwB6Az2f@Ne?iX6z<_tvF*m zYy>3Mo>V%2YI?6&sbsD+)fY=6v4eYduWf+V;?LDNF#Y=D<%olH#N!}f^$G}w-9DkJ z2|P`==LfIU@#P;|Uv@meDH7+$^z`73s0{SLPaJ^2Mlj4oVnZoWD~4POK$dt=zaw5H z-nvUsV=a^4oW3G!Z~AQ|%b;qZ2gydgiEJYB43+kO66J>Ec>SO?Rt5>KdEc6)D<^DW z?VzQh8D7QaH>of6XV%F{@cQ4E;eNuqw)hB$FF-ECtM=}J?0X#u2B>Us;;p~z6V?P3 z$y}~>-YuzMtQ;u*s*1V|EWb66J*I zoN*5$JQ5CK6ixH>?o}{AMqCeDAvFcTCT$$w;Y6jrE}S>rx+qj`!oN{XI$`va!;zLt z;k{zCi?LM9<5IX9(*4dUojTpu6z~sp(qd0x#*%s|rmw!l2e1Oz zfh~UY`;0W))I+Xpy$1(19Du@Unvk2f+ta>*;|4Ro=O+(OrS9ItM|i7oh$lR5^mYmZ z{y`V7w`_}&jF}utrExX|*e(b^WFx3_@M3hWwjvPk2DoQ)H_eV695@!eVctX*M!pVS ztA~4gx+o9NOJuNm?1be9^eQp^^!(vl#52juuFiy%cT#Kmy>}&KXX6)lsn=Vfs({-^ zLYe9(b}0>q5gB*F?wT2bxT62Fj==w(yp1*gvv;Q<%b9`ysUKHbS+e(-pA=`Jx%=N? z`-L6HxzA8LrJ`xqcJIqiK3W;G#6NErR1aGQ#uQ&XO3-RyB5mu&0PfesmUDu~YhFfC0L8AGapq0Z#YL3VqhIKE(4S0&}KNo|x zgXV7xS}~wR9xJ#G@>BkgK)NqA-C5<~E>6%dR&&L11F>y=!=Q1~kZ->vLX<-kB%b5H znqxX-td;#Ip&tzQdP^+6XP!eKz?1ju(~rr!SpKm@xWIZWC9$14LcF);+SRau4Ef@z z1`#7zFN-4d@RVf|pl}G>O z?e#{?$w@ypjqu&b?6B;L=X~u_i~CS{ue5T(faFDf)?71gIonVE;;u$2!Tnk9-Y=gg z>A;NW!Gi1Q>R(ssts`Xx9xAYi4YAs_vD4Yxn-xu+ob6)$>EYV~k09O8JD-e-)s~Sp z<-Rw}|B_L+8K>jv-X3Rvy;yrQSd4spv@Yl8TIIYKJ(pTNbvGTP^dAhlBzvZuqHbs# zdtZk&HWac?dDx8PfF=Zk`@49fY8Ms&3+I;C1bBqZ{_wnA$^x0cWcNL;;W)E%JV(!m)dHC-JOau38{*t_Y zjrn|AV0NuOjbyi2j4``y9i5StZN5w|Is?a$Ky1v(}tL}H4nr;ud-ga?jEt6XSGk&;u&h7cl>OGZ~X5){qn32{E zm%UrBPM5h#J^3SC{-LsbA}LN}jLLa0uy38A^?~ABwk_4g1d<&UBmH zX?AZ5T*U$#9K6vvMKwMjM8z<~7S%EElEyDksigw~+5^$eIbfhl`W1F>PbR%V44><8 z`sRJ95l7^zd7reZ^^Qcp#^@4NYiiL1>8amup@O`2)YV?)QEDzo8GM%}sS zO#4`7Y!$xB4Wz~{zT8z`Cxz8}#((cEqTBPV+|I6(-5~L*?O1@zm$9t)s0@H-3moPM z5WijTw&UG!hy2uT!=5zXf$vrlN<+;opw=$Z9k6SJ$yMR!bRnb``-~$uVQ#f2{FnA^ z>*Zl#VB=XtM4|Vih{=R(6Fn;r2o`p^25F7Oxt(ZT?FF4i)tLIwhMR1Ct+MueV|un= z``Q70@>(JnfJ;otY<|Vej?`(3sbx)vYVWuDnII_1A#(f{rUBi@gI+NUo*PHIbkwXQ zr>&PO{I3uNRz`Q7pEkHhtNjE;Rjni`6I^?*gU79BU7)08e!Hr*wRef!2?WT|P3o&l zGaFR0BjsSO2_rAvyT`lVT;S|z3IL?6Bv&jEFv z^?HT42td99S`0M>a*IkZxEiXmXm5JEStz<`;|~Ob1Hl%6gQo&RVZ!tbQj1?i0wW3> zymha-wXZ5HzNnZ{zw7-H=YhGTDLDz^W*LO>+8%CS4!+)2q5m1TsL*<~Pf!$Z)NHA4 z)h7|=Yn7o2^OdUMX4&Clu#$i$ceSJAt8d3;+RYA*Y76}6t}E#@wKVz7E~P|v7mL4s zLDLU17cp(66&!rq5`L&@Q_daUV$8&NN`vM23lai)xnXxe0b7zj)+U|l&t03FB6 z(d1hRu*x+nlmjTe#WlNp(M}_!bW7D_$^<*_oN!O;n7vAdKt?_n74bY5NiCKUG<&Ph zTC@l0{+m%|mBia!o==f4n60G{h?Z1^+D<9~6zS5PLFUX;pQQzk*Lp^YafC%~u=}!% zZT!8PgoU$)1;Ccmk<*nornbSD=LWu+w+LO+pNQo*)QTRZ7wR(Sgi7*|%&dD|i(v$u z_|TM?CEp&$gT>NKuCmS_q5x|9J==<2=%NU*x>6{Nzs`$>L~%Hgou4y9Rc8!;I4xAm zwCqA3G{E3{Ptt!ik?;=zqte^jHMU9Q5ei%5-WCPC5MKL13|3;{{I_%DorY@n12`z6 z0vh*}xiJR1X`-5vvwkrKs;37zrEA`aQTMLi_4MJcWd_d$TYLMxn|Zcv{`d&#Pd)M} z(9*Eo>~wGvL>FU=t>%2$zRmgtEvyt3jpK7&!8scp-4}_ZV`AX8gC5^byd}?h4R`L+ zB2w1ocVhX#i_ptRbQWm~h-uMYuV^wCcn$K_Jgmf2f64q7Zce7;(3 z&sBw=!F;ckP_wLcOXT(Z#)U@sjmcF^NnriE;e#9h)g)5o*(-%61$<$Vrpc=&*+sWt zIP>yuulkS5hSq=D8l9CO?UqB`nrcwVCUBj!h^k5xxR?xfRJ_Pz5&sL4+2kr5@TB+) z@@lhluL6CmxCa<*x#hHaly+c;PX9?&YWK^p)9bQU+}QCWsM%rAs`Y#<5Xrf#Qr1{? z+IBsWwzp|2s*k=gy4hctuJnT(R0s>V6tk+g{!dMjN!asadP>Oo8LE!{+CH)ESBx9&>gT=Q|%2pjX9;bS5l zTN3e0CBWfhce}k%)-YkTShp_gzi%=lvw5crslpesvA(;#Wh*L4;U4WTYDMDs#>dN{ zZ%xix{1ix%+_hsd(W9~Ox!gJ!dV}4bln3jL2qpQ|yn~)u1*d<8O?C+c(vhaD`YZ73 z1YRKeDr4RckoSB)4qEk$pn-gDJ@x00YK^XxqcW-W^R{)*tbe_Ix+nZE&Shuz0_?1P z=vF&YC4M^{HrGy=p}_&Gh?C9VFd23k@rd%-v=_$4TUpr83r!neU~a-aKp2SbGpVhg z-rKTidFLgXhMkN#gmJbZt>FES-9vB8dDa*n*rS|ob5C!57QbqXsbQwcr`SEz}9OT}kTydGdk2j{*X2uCr%bu_G{E*i}0q#oAmiV+bQM{1AUymO#{2Rs(;VPEmp z9ZXvu!ks@`7jB9d%(vRs7z4fKXPsCZGQfKU2gejW%cqeBEkkR|uB9ebh?y+=7 zcvSgTQw`*K!Y&5>8axY`FZhhlC_3WZpPC$-YBSN|AMXo;t;C=9trvT?t|cDs$MF>= zO8@H?eS3Y!osK_tu%q8U+{Z^9Vf51)t_b$nZV50x~;cf+mgUtGSp-*A>&f<^2 z?_W|yn38A7zJCFHc-e!}#3Ksq#4;7WY=JWmg*(ZfgJPdoX2D4eLcrhNYe;Thz38rI z`6y%OnvlFM#qe@Q#&&KJ-;_BQHA}N0GaY}FmcFQzTtjo!H=*}1O@sW>nz5CaAK;3b z3wA8d3t;P%BD)&K54pF`nCT5<^SR?bmA5P}MAu2<|rSskjhO z`}%p!cioLi>RdnKcy&k}rgl0QeBnIa>l0H&ZJd55jTwDIW(gwqLymD7vbMb_!N0;?2Y>Ywq{V6(+*B=DKW!E(Xs^_G#CEq$WvaGK&Mr#o ziYECIOIB29ry%gspwZAEt7>^;Ml5)TiT30l#ja)_dMb z>uW`ByC*#*J@tsSeWt9so>;_BXP)(xns+I7i-j(4Z)n+;8ZYFODg<^*HADfQ(<~?^ z%$p={0?2WFDh7-rPfDP!p~9TS8#1Y$2=8-s>D9kBXJcS5MCo;T>C~^@D>}$ePqWeT zgScyg@`GQFhLh11r=-BNrkx*lR+-7Guc`apzb$ji=Fkaqn}j#dt9O{ zt+s6I^$flL(qQ+ybkUJDw~(|nc_~hyh)r5bZ+)+73FOr_8i?pK9}Zqj#EHU@Zw3lax))_{QHc`0nHy_;ET!|P7gJk}sv zmcF%?HQ{dR>&n2(9S;*UI-VxD-5Q|gE4iJYg{-lIo!+Kxu{EObFWE-nJ2><-CFmkH zT-Z|}Mug!A0l3_SX{AXRGn9|o*8}SI7f(ZM>!*v^pp7x%Z4+%2?qeDX}Ek(F0^G!tp?mw#-9Dnjf+*Ltbb>hxX zMco>$U!G4H++K#{vok`y&L{6;IhQRbI;oOw+bLSw8y_YwM@-JAmPJPPxU%zIW~4PtNGg$?+6ed`S<`&f9>C{ zJn$?JA#cEbY(BH@V|SayHn8;|g#(CTCXWZXD9VtSI**c`JARj5jQrxUCB>ru-6asebVq| z&QURS09VxCk|C|=$OsVU8x@|Loh6NL7_Pf^e?x-y_i!~`91$7dPcJrKyUHn)_z?$D zSmQfHuD;bkz14LpuDuBA>8+%tS%eRc8Et1Q{3(6UPu}n^3o7etpW={La|rF>!{#!% zDYnsHFiyaF1vC7VE}vdH=}h>aliU_FOx9v#0(ZL3GriW{AS(wRoIeWz3fU{W#I_&_ zORW`Lb4_~U6gY~ao91k|o!G)?aXlj_061+00IeDei7KPjpARlLtQQ;y%&MQ2M8L(a zWNRq^84*3)u7on;nxLl!R)D7@bZ=fwy)i;gerlHGMXU;RXn}P)zdr?cCqxw5SHBUAh?9a=US}$}nPD|I3b124FmUZty{k7j_s0)c z=sxQoxS3s8j?l3LT8Y~akZUZq`|jFP*z1=$8MTypnXqh#12y7uTNWPyZk3Qw^$xn8Kz$t4e}iNATDe|uj6G@xrxAC%zKcBG^950CJ^0tbY*sX={mcFpvp(z zx38oNHiHDGD(dJ7rO|N7THj~WFz#~=y$_RuL_ERac3a8EspqNo4PW&FD=asyL_UTr zJ}i2MFZcD@awv@QE*Oz(d-U`y+O9qo@5u+kd!-kgZW3|zEN2>l$n=VSw@W>*JZu83 z-ZQ^rxmGzo2S=jT>DaKeo9Z+~Ar?{*OUT%|L0DwhKs29u#3E<{baB=Tl0m*QK$OE` z6{yvb$2s0L@^dx1?TD&^5Q#LRmpOm=E~=uFAM#8E@?y3yW;DNhYDi4xLO2Um5uW>VZH-UZp47D~Z* z8z*>1#g=fd{fAT(8peMOC1gA6>G!iNTLvU5o5SxZ&~<(sLZv>(IUG^J|HMG{`mN13 z+S>z_!~Ck%=OmhFK-G}dm(5~)5wH1oM}9at|CXuFN%!`bE2Q*al&3t9AdrNGQ>VUl zi5JSxX=a8R3w>l7#hFeUWGFcJ$?wRxW<4C$>k zBOeFQZdeQqbEJ+v=sz`glL+)bu4E0ri#_k2+jBO!R)7H%{r9b$JMO;+I<7qtBKXzD zTJ`jZ>voktc;8$y)%j}(=8%DDJ7{>!M)Vb>eAf&k`_oR-MJi~x7b4a0xoF3zexuuX ztPxDzQweG}w(&>}t!?Q7aSIbmtJo)7k2SFH=Qai(tg`Qzs%$K*-XV!U;ezUCr=^+}Na;9aSC2b=TwYS8Mculp%KG zTY-TwAZLHR^I$lia{AZ10@>@ccF!pSI)aj>bo$shzs+`rzoW<)y3M4nEoRNt58tL_ zFw2w0s84wN`;Aq#ey)rm$`QMH=p(<)kv5k2!;TEJkYrIOEvx&vM3R<7FYm*F*6m`E zY>x}_;jxL!XpL{wM7-Ei#9yBtxq~L#*SG5}Vb{mSV~H1H_{QV;+$;?J5mq>%-dI2j za!~3PxVydFRY)QYGHmAt+f*JWEC3{swg)-hdy7F4zU_9BBbj*+fQbHsH754895*RT zqDyPK#6HNug9vl_t;6F5l+84&XbEd*sf)+tk+s+$t2DuJTY<0rLF$R%X@W1oM-}u< zbu99#UC@Q)d-{EoKKcuWLK&IECk)&E!UTQhYJN67fJOB$cI~NJhH*9nO!v7- zma4Bw4q92*tv#fn^SU=w`v!R-_F0{yUtLaR9R)Q6_;wliuyv31XTYgoXKJqVj%5Ep z)@^rbsf2cPx>NM%iiZnPR^y~g^U>+tpojYb{cT_3H{KorEqk*W(!FP_J(z`}9bA9A#J|-V%O?Mu#_JOKwlKyrY{}&AOp5|Ia^|&pbC?Exg$^oxd z&`f(+!kj`TT0r1xZr?@Xs zb@az~%+;Oby6-B1C|OGH%4gkRZ~`0$F8AFVRmdkdY3Ly(UJzyRVkH;A{?i(f&nq69 z{-?BAvZ1Zy9v=9lpNb7Ta~hiQo1}i;T|1ybd@_Hc|FQ8iaWe(~2Sj3zV53^5D|qlx z@x$DJ{|3N;Y&IU$U#_(MC`HZPF~xtI<)2GgxPMW5iQIVtVIgKi%B+VYw zz&;*d$UQwc%kKk6ewp4+WQXt6aNC%nDtmY{%sPMow3OEDp8@SYU!#Q(cpjyt{bu? z;g+ogq1mqiJCi5rC7V9>Y=7)mjj|u)8}OH3gmgRSe0s@_usyP&$`?|&MAiBy-~_4o^t#v8-Occj|GkFUk-jaM+xUIxx!_Lw+4xTs19-CqlF z$8#R(U@I-kK1Yj$Ht(O@Eibr(cf8R4TNenpw@8=iC~UbVDH98&UC zA)?)~Oqpp-AiQk>m%u2#``IjrQG{7z>VpWUz(sqfe3*#BwwXuB*`uT@ry|zL;ngpF zCdP1M)5u5vyay&SmLdP3bmk1O(F4`o?SE zgM)1z0z*lBiiR>`RF^V&NGN;L{6zEewI$=YmpJ_{EYBA9{F3}o+fp;A@kuMU#x)GvmssJgf>G?0Z^RvPl3-Ua%;s_t>~Dl0;0og^9b|LZxL0g6(eya!ac_?v z7#SA~MGsHg{`Y`y^+n>8kM(`vmLhVV!)aBfiYGSv_NpOVkTz=v#iR0K%3t@azfc-P zjMR`A2-KWdEvb7A+|Lb>9Bh2wAdvAadx}xKh|1GGb-mGi=9=PkXnN>8@OFnn6PZb% z@OM>n;IMRW*WxCG@`AfUK4K;3Ew`79r@Un2cM0dUe>I!4V)-;52jqH{EBy_~nfKy| z)LC++>}bz4@)reqq%KCkYWPJ8Y27%^E28sk8=q}lE=a?9^4^asj|aYE(XtZB8PP-T zZ9X0WnbZ|_ew4Z5|H<+=6^qM*AjE8pM&AOC)xCw>zZO~%J6tn-TqF{K&hb%th9FFL zMjHDBM>W>GBVkKlHMz1;6}x+f4R0x;lQ<7UdDO1CnnoX8EdwOTx_e3%k1_6iG2RwV zWV^Yl5ew^jRBB4r_8p9549w#pJsKBe!yM52=z*!0$G@xM>O&7ZT~{f5E$6?I+-I|b z(q(>g7&;7ZUoB;SQQ^;4i!E`U6oZtrH1kvb+e{#^nZvq_F2jOV2i-^f8E1OKi_83O zh7R!(){eT|=3iUBj|W8D(|;3y&pjdqRfM+gKJ8LE8#pV4mUd0qct5FIzWg`$O!7*9 zvU+=LNsY{2-!%jbWY;v6N=q_+2Xx(|TV zSwRiTaHTnirR)Q8Bk7 z1sW)z{p*L@ovqAB_cV<;yK1+^Tq7$cXkS70R9OVNbz3&0{&3B3m?+aSWI;&bq0dV; zqtaVAZ?#^5wG~5FpFZ>N3k^#P3!iua4S%Sw;wy=JG5kk-vxH4DAtpa1d(;WK-Z&{5 zwZkVOwe_LN--JHAJmWi)B)c;ncaQvILX4H{Z?9t4Br~eQ# zqTrnK%=dHZGUEUD8xlMsN!j7A-occ?4=!leO`Bsbq^G~8(UgS-yAEv;k580K{+ya1 zMfMZOk`m(<6HL8Zr5@>U-AgqzAC=~swMq#MKX5cVCR zCzRU+4m>e>nu-yETM@KgqWj$F^0I>zi{w`VL2g)@vsCK>&G80Zj}w8h%^<#m?h#ko zX(p~1N<&YO1fj@>;J04cJZ>kfd|2*5s_@)FZO_GgHme^Vn;fZ6OpdtJo%&tuFEqgT zEvUpQnD`-aC!cgC#$(ce(VC=ninA_F0$~$7Yc$+nNoqn!G%muG8eXS#^jC&>ioj-t zsYUqQ{CJ$s{b-qfuao+#Uk9Nm*hT^CUs_!SAVrQ3Y|`2Yqnp&jrq27%b}nrwoKV7w zByVNAs8gk#iW4=%NK4Nx=q0m^k<8rPEV=+k#g{thGYsFPQcF%4^&AtYOU>t8uLEm}pHQo@)UHDt7mXTXOaH zA02B7e-H#8aymCMk^6YxQ6;~%SnFNK_1)ltfbPWFnrQ@X45y0_Rl z{|IoqQi27hhpprw`9fLJH)?~)0c*@8utq@7Vj~^c%seeE!rw4@*$q5)nKT}V#@w8y zx`Sk>I}^p)l{&3KJI=_cZ=olA!CZIQdpAuRTE3S?=f4j}B z1H>FxKpw9|8rtQUmRu14ovA}D=+NH6{Mr;D)gi*=RU)y1+6-1+No6ADGN0(T|vq$6} zD_Gn3FX+YX0CV9@Kml7GC*kq*nUMAidsChD-@SyR%|!$}(wS7^_Soy?pL=MsaZ`fO*!;_K?HZzf~e(*PO63L7D%x)y$RyPmY~W%m+4$ zlyOWnG4FXld+&AsCQvGXiVe&S(jR5Ml1~P_y5~!~Z}sR6vj%vq$2D85C#GbT0q6u7--d#iuD%-Mt02O~lV*L_r;pylyd*ty7{knay>0$LoH>*AY2ww! zl+Ug9l^yg%e*5?rWsR}8i~+G!zVYQja8TwofGHZ7cG9M$DLK4_w{2=hc7}RW^CvD> zTf;3nY001uNMrr4W7O)EHof28X}6M+=~29Wu;z zW4?Iy&7mXs-v3-3A~V_)2Jn3r+@^WahXC{;$#~hcvG*P}5ONmS3gl_5hc5%+pFAfE zjVCosmK`o@91M&v#(&+Uos04Rzu_XmC>N^XE^M8O&~f65cPn}|@*UGA&F&MklzNY5GWgv9(3v|)>(qop?!ryOrnXec%$+FDI-7q+tbiAx0i zJr+*2S_>o}PW4#5RBdMlqw2{_0|dF4J3$XTFwHS^Hv!6ll8r*L2~Qr~J`NTc*F5Wn zU>3(#;#|-o{lFn1Ln%25L(i*K{JHC(7sC3Nfx9@a%PRmzeIUHq;;e<7mVXKrdSaZ6;CSAub+rNuts^ z6FOYw3hSC_93Jj|2}Qk*kIz!?ldy_`8QEi*%RsNc%)gnnM8)_y)7OQwtn!|>56D2- zfwm~VJQs>53W>P!sMk`Vj2rEOj2o*5`xGtp{6k%NSNB!0MOVM1vF(AG6b~5nDR~|meUVK3COK&nquFUmPJajjj#(VhrzPTFf!Mre&SFXc9rvagc7z<1@w*!aFMUOE=lp+Tpw=XFG!GARd%j%>G(1$Pb?{qyQ+BVG|lcSZj>gX!K=pb z-p}fOduVdaJqKdUw*eRI2-v2@FT-fEReOL9CtPR2z+ol)sv#di6Ad5#eI6}mUwTcZ zJg;(x?s+%Wr!+kz@aB)t#k2D)T@4GXBG}#w>FsEjUtz;i+#dbuttyQho2S_JWQeXb z7v*?E?X30<(8y`Y`84x5kRWTl=2Z?EW+z`Cc% z{*cP6kW?4z`rQEb!PIlsO(lq%(!_R*$}6uNi^nR5aw<-n1a!>`;Ps=7rSHGKcre(k zytOd>3Hs1$QBHj^X2enm^r08;X1;57-Xxd!n7hA=^I!S!p$12>2K%7}`bh&c?@2sPl1& zHPDn0)mUMV%~<)CsxO=Cw%^`AO+rG4+p>pxjxTnPrQEVDaatau;{BW6e+pw-KsnUA z@*`i(Ld;tk3&FjWh2jmlu-=0G1iR3NvaQ9h=nHufQ2K5jYtJ$}Y%>HuU1Tk#l#;?B zvlUuEGvI%<4!jzfVQhAJZrd7d@m3MFs>p_0$lQE+AanhC)`PG#)gL^U^)Y8MNw&O26E-bMiuouX`#(dZK!s=fz)Qe=d|6_9l}Y*==5v z3~&7=u+z_7-c*GWH%-Qd`K_3 z8QAwWb)x?(_?VfA4QyNM+(MtW(A^U9XQ7b$Ua#QpF^X#*@`AeBK&I8Z96xpbo1z&r zLSE=Y@8>gS%#xfJZRt{@p4=atuhl|hpgwh21QVXBiDi>uuP`=}J5RQ{^?v$p|MJqr zPOWSIOV*)u0n34oY0@ly0WKlG)m4_GDo2BX2Vk>izQrfei3(9W<*KZI=v*vQ8nKoZ zV|VMnnVQGEQkvkn#35AEENw$@G5 zsPFMBuo#q7M?5oG?2|GFx@vmnNufo-(_D;N=9C|i&y@^sK=?m*5rV4>CX5P^@4~V- zQ=Zmd7#)+tGjB7Pkxk#D3mD^hbZ2V(H=%r<5>cFaFfUQ8$|M`!0Z-pY;}`jt z;roybdt%^{M4yZLkMxxg6nR~e1*TuI!uT|5A3)X;43?}1u@h|UulGHq;^Ww#f7y4< zuY9@H1pQ$8L}c7O^-P^0&x%rIt4%;z_q2$8X5##XMr2-3<$UJ?A%#Xq5l&-Pd5(1I zM_xl_DxN03v`rgZaJLzC!5HK`cLg@}n4;=E39U%okXOGj05ANdlCSv7HDw5Zc>Cqh zX*oBgZA>v~A!&f-Pr5I@?KFmoG`WFEQE_smXIy(lA=o9Mtu59xTHTSDT%xA)qsxr8 zgz#VPTwOYBK;6ENtUbRCBqaB{4h7GTJ46x!#a#yXbK4zL9v!$yn~!%C8G%3*QI^l>8S!tC`_*EeL~H^g$}0(sbt?VQ=;VY zK)Hw@!uvE|q#r%;eg_3sWx2gtNl+PFOw_r*-wOujh#3~FLr zfKqJuJZMc_B^Gl5;kb;Scy!HP-LE%zBmBC~g&U?v=AAIuOauE;3JRk~fF$vKa&gUw`s1dx z=pzZlND$S6&m6W~6D>%sTs5xLLgThYWW}%PH=i>YvSQeBs8y>_lo+C*8+^Dc9Ie$` z5GF9_X2Nc6u0q|)r9Xiud=&XNGc~(7N_blG=y?m_MM4^|_fGEjI`mZfu>oApzR_c8 zGcOgfLyX*N_1>X|Sq{7H)Zgbh4X}ZN>Dt4bE{*~!R<3fwmfq#LA8TW@_yRpsgZfq3 z$QA{Ur$`?eA=zW=8OuN1%(^AfnCTF5mS3!~b=te>!pa){JZ5uK`fYtBDG<``vH0CD z%=-XD-PzD`ziEnq?UEjJw@>HeKAon9W!;!m46x0ahPYoXy3&tl5X#-r%T*yD|YjxV=GA zaezVg=x8P)(hvw}KZdh5&UUaZ`+*LsIX{xSafK^_b?bNJ-xPJ78~dU zjeH`Yyz&+fX>$n~mK4fo0?AwC<4i*!!X@}~1-vhw3q8D!cCR3hh)Fj-NQwW#V)T22 zn1r9fBbuCC;2^O48Q`xnXQ^w-0PNFXZN-r-i{(6Le#A-?(GdVmU#%rgI@k$qH#YWS z9h=lWL!P-ve%~UZ6m(WN1@%lOG#v4opDXl_n-9PETL9`f?WTDwN5PLV+UG5aitEZF zCdz>Ck^b@GHC#Q`a-f_Sga@~lpQmlUubX9@sn{x66mz3msD`+XDXtKv3dX-ubsT#j z6E49!HG>c;e9mo3yYKO+jT!kzjJ}DDwQFVhnw(A0MBuJxyJ?6-nbgGV4ZqXTNdkFn#{JZ!4z)h57qhjsTVBBi*jZ4e{t`r6I; zvi#AVifFRGCVH|XdNTIQ;K@TuPi2fDXtKB4;p(hn!n?R{fKg(vm1=K>WkokTy;X4>d-;|87VVw7a_s-C=`hE0of%4 zE{+W5!X5jjQ>MvTW0Q*wnCU9f3y-&U0;%{OaIQhF%``?j27C}Tkp`h-ZfAz#&Et|L z>>GZ8PyQH276k8>I#)J9NT+G;iH1zJZVPVTh^Q`b0|+6>#lZub26hQQeRDW~96GMG z#l!cLglEzZdI4TOmi@CTq-ML7ft2CL_A7H~>p4ne%OM4*zu>QTx-I+WeO>hFieG!hv+n%%hC6JI&Z&VJ;1Z@6f5 z)EC0*w=)7?!y>2_Dy|}Ku_viB!YI4$ErU*vamo#VZ`9Qg^HQqqi#vXQ^s1vMAF%i( zMIeDfJEQ*opJN90eez*~=~3vlhMCIekIwmgEYGpgIR(ir7>f~ul7?loLEQB}=3lkG zXE8Z@k+`SiZm)`^?cF?1K2o?N<`voZ2&XbfH&EWw4l_i$!$g^NxwgT?J;T&?oBRTS zst@*+dz(VxE!`f^h-HE!_o~xE?em+s`A^=J2v{Js6A*qlElivKlL@Q}LCf27!=vA0 zhNct0&I$NZ3FFyFgr(ZFSsIHI~^7dwt7rX%h(5XrO%x+ zLRcE``E`W^P4j!Fu!Wcly}|cqF(q}T=i|M`4IQjrwvw2gc`XkMdTu`g@eu;9Yl}lw zSH0u!;F?CgkIpx5YEhU)n);|(x34QnJ;JMD8?wHC85tZIl#gzP7>cSwwG@qyzu~%? z6A8S5MF;+;ft~rfj{T4_`2tk!gDKo<5`s-*!RVlkRIL>u=)Cs5nq0T|(hi*+l^)}$ zM3U<`(k*_$u)DN41pE7fdX1LY^Qs1WC-(o9d;VHAZ0R6~e#6S+{8g<#Z_0OqcsNd< zXm94M3CT#6126U%$VaKxr&uEtHFA*gFKm6t#U=mR(7Ha6JV_23^Dl-vF0nxCaP}q_ z%`y`3qagRt^7@rehasOnE1%nKeApTF@3i~AGDnBMlpf2Nf+WfHK@hIpaS|Qe`uiE= zBu#siWlL^cWG_j?NYcE=%p#b-;&3tYH%UExWBY@oVv2PD7cStT2prAu?s;dAyO8~ zWk`Owuik&S$!JsUp=qU@<~d&_6nrEh`E;wnk>flGh<%r5d8Wo3P~aob_XHTW9&t=# z$Z0Vz+{57-Fyb6etLM}6>?r>fvuZt57;X}dL;Afkivmi6Y)pL$DPaQq(TJvHZ!fUV zBf}=~bpb>Iw7xvh=|Ef`;P%fX(i@uY!!Ch_fE}OP+?$@MAO~abnt|`T3PM>)Msj7{ z^0+rRMsOCANBUr>u#;Z$~u}Q+Z=p0R&9}cTM_ed=wi>J7cddGhU zCJOpx2=9mSX@OJ4=_IMHKg@&{LRnaq3sZ*O2y`F+Rcd=1;wi7@G%S@@p7Pse6pV9C zso!!vbrHy-`55g26#D-cmA9GyDPdQ;R*=TRmwvT9*JEtgV{47AmyMSfO-I89_VsJ= zXkHts>IHsGUwKZ1*S{>fMn4Y{3uC|QlfmLzRD+b4OY8r=wp^t>5-1agiGE$@5GXs5 zCTRxD5O)Zy{!GmwMhB3(rjq#!0@;b%S*VE5DQ<{&xk>=XK!8HCH?6J(y$&{6DK>v8+bGP3$Q(3MQL#Z_yjeC@+z+#rn6P4M4_rpv7JeS3` zDx_}LZ*ZFa8Vu8`b_1io+Wkzzy$vpP*^3ISk#9ft@WxDUiBxi%N}=o3JHug8cDSGY zO%7LF4R-OZS$FvPx##)=F5D5$$Dao^A_J)yEh)-eY_ zn~K$ih6KkCyYtRYsD1P8fGnO%IXse1+p32Fu33CYkIkn}`$oL7{v-e`mS`)U7A4egyh$ggkzqI84m(tPtdaPrZ3zYQEdTH>J+3NCWu?|Q zuF$!^l}rC5dB(E5pyvOFr*n^IGXCFxrASVdavZA^ik#2KN=P|WisY1rk(>{6oKr~H z$T4R*ED1T}Y;!&{hmhkiGv_gf9gO{aKELnx`~M#MWB2a+e!s5kd0j6a;%}{X*=oKA zLPrZmd?`>F_Vf12qy9LGFW@v7(;p@l}%OTKFBLQYMJF1c3_*l8yhgi6N z(MJq05)omDH2&3mSjb^qYgW!z=k4;YEO1+JHnBVM7h3wg=nFNDEN@?BpCnFKp5L{B zw_06Rl6s>fIQFfzrAfZ*>PqG#Ian`%o@(D>k8^PK_HuGpxvwy$H?waL_F*U}E)-pkTM5t$3Duh|KVF_36kp^oH9L z!AV;eWs%LIKKd>%>)+{5*zO?0MBsaIueqvJPrHG}ovYNvdM)K!6YTY|SNGHag56a; zA$#`AaM|0~_Oh?-x7PJY>?s=JDP>hI>`A#(z=_Fpx9w+9zw z^tB>!(uPkfmj%?ueK@i+L2m6LGwKsrd*e%u3z=E)-q9w#FODjQo*nCknEJloCuah& zL)h*CZ2@U#Rwb^Ax8$2Y6luLznqr-L$B?$$Y4R)*hPkizFU%U|2!ga5&%~)NR-mwL zv6_ix-q*g-R;9b1j@+%+6rBE6GMJUQqnhkqeuha70Z~d!SKPW4rx7g1q7j&yW+;=b zEvbrMyNFeVX{%~2HZhZoF2xH~PFyHkIbK{jTywN-7_Gq1z;uU9#(O!43(=2X75$uS z=LoCs_JvhdthKQ$vd~I6Zi>(AcB~hi7kSrbd=j6avHY_MhGQ_#UVf5^>_`UKu_sV? z1@CWmT-S}T6&!PSyjlrM=voLF8O4NuW2ra%L2|5lA})&O|t*MX;lV`mx6y+V;p~f z)t%L6N*T^i`KyR)ac?`YdTSR$+Hh%JPB3ZE^HlnH%5R-be8u>)qD>|7joN#XX>6cy z3m{59vWSi9T+3s^Tc={v86#%xrK{`b!t;q~c5^@O%KGDFSH2j1vQyJj)opl_lj)ZI zB!ia4muQ>Na3wX(nl(1$Gd?;`BJT}ZZ9+nLRgG_l;dPxqukvJYf&jHjRO72v-X_)M zw`~<+>6_=v{}vuxGGz5#{&XdwwPPgWU%#P!*FFPf-X31UjwHU0e2G|lH|0cnwaVGH zqEvA+*zJPQl&mAiFCOIx$4qeGyXp}x&)x25rIB$ixU7qdr^V#WD@|9qKfX0hXNwcS z;Af0i7n}2yGK4R*bC&Yn`PA$fGkyEqBVJk7x9mZ}$A5YEniW76vtM9>urQmydB#4Y zh{1?rq1pZ@!v&W8mL$)E>jXvb$s~xW&AK#cG{p2czU0Q-C-t2Fz`0w`{Ud-gOeL1Zn@tqE&9G z5+<_-!p3jik4ZfD{D7$X1Gp#Y|Aub-#*r?|-nSqbbnb0fF@0QQqNNO33=tR(eIazT zuAhj1<~o>we+ClbuI?sjG8Y-Si9V5(<|F#Y@kxcKI4m&78r6>@Z_#8`QB z`EzkbYqG2EB;KsvSDSa|z?EmY&=8Xc4^T-4ZinKTmF219jzhV5;3OzrcSR(3Uy^eB?;1zcuz&Pq)dqh7Saih|X? z5$vLB;|x}-iWPr8mVwFP+n7d;EDyP@Y1O#C7_`B+{?nll=}7ql!TgiETRQZbN(-yv zxKD3a3^E&|{dEcs@S_{lnq-sgEjqdwi*^BI+hpH`CYF&Q>|EIOdq^^^0AoZ+AEI~ zipe^Yr1wQ~M+PTMVAg?+8?;l?9#TmO2rhWwdzP-GeG&a(Zm6>@W(!1A|6rqNJv^SA zTrf_0-jZ+B>ST*)+q+4}4eoGjtc5W*eYS1~;(C+TD)#tEBYVmC9lH~frF?Ca+M+yR zN-;@@pf69Eg;6s*vmL0)@=vElto;@}UPIf2BsIW(gQ~6$SxP$H|HNdt&HN@f1?T0; z{WsVa2?6gxd?M^Egjco)US3S<3uy<<%J%aKhx=36`{mS+F=jh7XwdWcaHoc>7jQEX znc}47JJ>nLoG;T0I!&i5I;EZ_gJ@+~Bt$E$HVbl>{!eNSR#~DP;~}?(!<~&v~p0d!Fc$M=%Ab z8~xk9VAr=Xd6e|pLQC>tlbQqQy+)>byY!`;xdR|)_6x?$WOc~3$>Hm1q*?Dtk8KK` zTY}GsTm~A=i8gY}@d|5SJ23NuR=LbGS2;tlx7aoC%gfAeTUI7r1sM$1K-=X@*3uk0}4i{L+&r-`L$;|Fc7qQv%lsV zd{7U>wk13q%AacezH9p;rHK7`*FPWiDC9n z%u_H88oJ+$Vw+h9LrF_uHGjX4NI%E)K(kR6Q~L{KYiO_WD;tp}iLOS7CA~KV%*3T! zx7<{fg4dvY!SNc^eXQT72~i?IvOSRd=EEh!Eab9hdR%l@58P;?>r!^veor!pwsRakUbfq?L_SBaA!R!^b2xc!s51 z@WDC!=)qAYhCC}Gfqq6QbaM0lbkt9uYrJL(nyUaQe^A%C=m9HoXwPNl&`}yMNw`7z zo)Ed1QL*?S*5_fGxEB*kzqM_lYJu+F`0w1=iavGcSM?wz9_nwUUt2e`D)Gq!4dnn~ zpz?N58AG>C$j9u3+^m)8GgxyQt=f3ZT|#Vr2BDfmz`9w`KR4rotb?507tn>$RW0f@ zwi4Yjjs4#Wse-ZeB#a{>2Kd825T(f2VT6IAiHqjjtLpRRnalp7M0!sQutx2c|JuhG?eAmTeF@pM7*BBwuGxt) zYpKg(q6(|o_wD*@+A$F(;_qFc_qu&EzH#NL-_D^xL)I6+A=FgxPrMu8*YMZwy^H3Z zB)wGYVZz0J$VL`P0!Su1Qx0wAG%U{uTCjK;dElatosmEqr1lP*hA=17@2qC2j!pBjG7)V@_3WSZgm`S;iH2} zSD5#DkrB~lSRI?Yx|$~&2kMb+R^)0pW9ZY2|5Y#+)NhJu)8idv9X#>>>*4M0<+5KT z*SEO(s!XLPocnK#l|%E_98VGHP|)OiotV;RxrjKPOyzyviY@VFa;dTWzOApsuNF)O zw4%|g6PFY5&Y187IO+1Pqqy1>dDdK6OZNhD?mMqG09|Gk>B++70EZbRma%Uxh`TOE z8Xl4C9=-uYrbks(s64kEW9*cr>NYaI!4X+Ch2f(wg%STM^1qoEQ0MMuUU=PY)H%iP z>uu{0J{&dn((IjstEuy9*n|jt#hx?%_G4!0b}?K4C~tU*+=SiP0SWwZl%qw}MrHRJ zZYgQ~$;rCxF8(L5;Euw8%q$$p|duS<-6uHd{>be*R884Y}$QfowCTL>6 z=;?Yt*LgBpLiK#J)&Hn7z~fSGWiO-1zie?YHg2+i4HKd1(`)A-}3FM0Uz=*(`cu5{`!ZB#!eMBR5BwMg=*X4fD+x zyk2k{xvk&kf#e#kseV@o{$GAr{eobf$(JLuvCQjO+6?C85XX!5?K)P~-~EI8Zr&3Z0f(y_(v-}>?` z)4Y;aPISl(OvhaFjnXW1SY_i?MMB3+@r|s2hst9&XJr!SRlTtn)9PY2mT&tFYwdij zE%RbpNCdC_WoZ6T&8+q?6Vk^x)(lkZG{D#PPVW|6uQuyP@5#x0HnsK}dH8KUv|Noc z;-m=l)m*zl?|7Jb6bq^X74MI|ZFGcYuo{xs0Cpta#X?7Yq~ zLVaZkSCZq8BO>Un=!2}e(txVQ12dyKFTeRzi}^YV{=1S7ot&y^qj5-$HYdED&muTZ z$2A3^mEP~<(8jqXxyy&%z_wKh>NRSlpSt2`bgcsF?$8vFJf(QwmC|y5v9u!Q(}0w3 zek-=T&X>Z8Mt$&W570!;dd#Tzb3nUUR6=ti-bO&hl}<_~k-^H6y09RurzQ}%mc3Wd zZ%?#RHawY8Tpgnpf3}F-jtn8yY?v zZYRRO#SPk=u}C@NUM zNMCqR;6}c|jAA74f{g30S6018iM`LD?1FqOHgV;D!I3ISm8*nt0_{zoK_Jwph0l2C z9iVp+;MQ3ovby|`m~CGbr;%CMs_7T-MSt`w8_aF=&PQ#-VaDyk$9)en`g)(dc&nsj zZ*6N~{w8D8RTv@Vx0U@^w-RA+s^J;R;5>QqE-?S&pBtHr9Z_EQTtenyM@C%8qi0U^ zP@2^Vblc@-)vA2d>TfLg$@5Kx;BDP&EgW1g(#Evmk=p&wyb4bWg3SG#R-f+fqlCBG zU`_2UgVpGA_GTQ#)Cpi)+)87a+QZ zOo4Wn*z;ZP-tT!Gd^^r>lg#CJ)n1&_`LB}4`%JIO9fX9w$<8^Jvh|ROFy*v1L$K*i z_TQW_1+x-KV&!>$8A;wiS(G{M`u4JOwa9+g`(N4H)g-s4dhg}5za$YnwO3ZAy{5rm zI{t6kx`AlvI!j~v+j6?GTPc_x^11$O)v3pmd5#hL2vT7Gb>@06E3-~1Gvfkd19Y3W z>kxeFeanW~>Ow>Kw)Ddt!&$(!XR>U{+npJY#WKdG3JP$gc29+TB?S%Jm74xoTn=9~ zqm+%SQ@YkHNwBO?fPqo)W});MS4l$L$nIf4l;>OCSeCLr#qTIuTUBbeeQM0vlPC@M z8Dg*MHb3W1Qa%jiA;TJyYOA<}Wc}ybD2B7W>P^wccRul7^dP;!1=`miOXv>Eyjorz zU)JTvi5fkx$&xd*@_ixvP&Wl_D}s%yozJqAC)EJ#zR?;5m5(;JWweYVRScU%>>)y+ zLkd3g&uoH>reJsb!PE=T)tA%@$R@WPF*f5eT6Sx?`zrWWZ|>cb`7%NH&Fir=e>QQ# zmX5^WX%Sn#+-X28KorF2H?AeM_A6W*r>EMV$OL=Y@x;BiXc zkozm2#r*(VJAz?RrtT|NCPErQ z)AW68x!L?df>Gx~PRIWm-_pM0--QaVEHR7*$5@!hXVr#;>H{+*r|7lPP;dlja zk02mUrC>>`8JU*X+svGFeK>FR`6du#Te1n)u0BCX;bG-@bl81^eA;0A6Q_#WcI+nw zZ|tR}9=GRM!?IY}^)S%^@izZL65SS+qf!U~Q+pqNoS-n|R$SLzwwIdzr zaTOM?(pAwS%G8xBe=E*4*GPSR^&#~~<=S>CA_ky)T1?xsJ^zCC54L% z{AwAhW>U@+=@ee`gioy{{xOvITc492DF>^%#cl0o=p(Uht`RhowZ{3Ke^SMP^C0uU zgjAe5Yh)>B^g7M^V`D+K!(l)W;uu8%p+)CT<}x(nWwbyZ34zA7VWh8;0UxMprLed{at;+#{k{JL_iz`;Ooc%7+j6E|g?bdse@QHDC{F_R*(l zp;f_Ap#b;X44<%`h0?jjA8~)5{dz~@2iaLwLxm=WwXD@%ZdE&vjWG$0=SwI{HoCwi z%Ll%HnpxUZzbvquSt4OAm}Sg`Tv``P%?TKbV$=+|_8cG$L@%Xt*z50on<2z$x$Yn1 zJ5QrT;sbumckuT3okQXw2RxB~;gaiQ33egq!>Tp{h104P_nq|x2a^v@!7p)iAgx_@ zPT0fEau<@-fX{4aN-gi#yR0j-;s^Gk2YffyxZ+wS{y_<*8cVz8YrO;B+yt-cD~rr{e?Flx)pg2 zO1%8{R~|OrWDvuuFghK3)ZLwI<)%so#1j;%iOLuFQxBpw9q(w+-k{3FAS^ zug{6Arb=i)GW~a_VnyJB{k{_W%B?p9gqN>{iwX4TF$!lBIjr-~B7P|~ttlC<{k7zi zd2N~aWtKbYs(l`2cn3vKMBhca`eN?)S2RYR)H)TbvNB-3VmBlymEF~7lm?5COT)oX zO7JbrJqfY%3V?tP&-E~lzrY}XY$;8T|3I@PkK1qad-B4D)xzw&O8lHLQkqxfobN&y z_r=!WSfeN}gD)D@<+xT~0d%Zh7kU2NdFK%8)laa5QA6^`8!hS=^1g^*anr|C4P z)IEv{HTE)Hj+o!rUg-gUR_MFan2;E{$)kH6y8Z_2()YpoT2tJC{qbM31{lBbmkK`? zmRreD*F`+s+j?d0<^YT=8A$7;790Xj9z8o6-qjq= zI^)uI9Cps@hG55KYNAA&C?OKn=3owZ`{<$^|>8wc9zx2~kU zEROj>S<62}+&%K*`pAYTIRWoOsBJg<{NRkeMsVf6QzP1`#k7f95{k_mj2V$L;wzxu zNH25m+f3MXjF%|u{S)+Rz5Mlv+#Rl*?Ckgp3Wd>!{}OAS=G2t*^;Z0^H5Q(8j-P2K z92KW1Kl|TW8lDRuZp*|gJ|FVNgNM@>rf$^gYVt4O{Zx*4c#A@NAqG4Pg;=+E7xwDz zcR~7q4wj`)Wsw$HU*%uj89MJv3Ua>)1zf`%Wl35f_uV zmQ6`o2xbdB3dSRXJ?jtenu<@_=2ctfHX+z-&VU*;dsEBgHlT^vA7kj24dbnYHE$$@)ONN%$?8~OA&*vY! zC$mY)d}bEzCBI7F79QjT{gsCYf8y@nm_H?2N`Xzvw0H%pncapA7wdWN_KbGpa8pKC zWq&E182t$bmnbHl8v^wrrC37K#&&*3&a|#h*fZf{`WC#|pXW*#UX4-GWebO}4wxgx zc3V{jnjty8w~T>*Xl)sqbwr%hrTx_b!->?+-H`IYe%%z{38j|smoQ|0`ZithCh)5X z(iYQ|eTQ?$A|F0fhewqwe>JoPbL#!U4t;UOJb+!u^UeMuZ9nsYqLIJ*v|CN~%=eq* z>AR9nfpdvsphu>YV`3!(ck?Ux(%%$I#s%s+HKjtU^}fpMGmw+?JakRe`%Sa>>-8Vw z_=0_PB^LJ|oDQ52BsqQCpN2q@hj6c5k5+-}km)PwfzARvIs%5)$MMg3+nSgirnR4y zXgmh1xURpeCh1G|DFPI=m_8`3t#$TUY^&4hr(cwWyG43H1p%aR>}%UP%I#sKuR3xnFXqXW|1EE8$^f!U1v znfc36zoFUeevi7Yx;8>K-;^LP>AS5lFm^?=JXqpi*ygQ_#{P~ki|pXhf{flV*szOv zBO@A291;aB^FK(%u}uaw4OtUl-Dza%hRXmM_p@`zf_;e}yQ3{j#pUNT2z9@~r{S+7 zh^A-ezD0mshlVh&zK7U`ovl(J^;KMFl^_@=x{2sID^BZj4ZhVlBg=kC|DsEjwLmAm z7dGwXLKg6|2t6&z+6=-w;-das z0?$X4b=~YS7jaw2<^O5^4?7Qm^7``T$2rGdk2t*2`@@jhcxXPbx|X<}iB^r=0*MeU zNd*-bqd>Z6QbPm4yYGqSay!7tR&GG~+}Vq=j8K@p9W|9Wn=|14ZMAKoEW7I^CPCZK zCxCw17z+U$0oUsKqSdB{N2)WQM)0R?S+_i!H5D9qXMqzG&Zc|ZeQZF$Mc}h%4)9Q3p0)tZ z!zraCSZAJ>jiHMlnaDq~=7}JvT>IFd@`F`3(OD%?d{x!kL!J5VryD@GXFu~&Umm6r zK66-I;Q5uv2*2cJ46c;Jei0GX12g6S7O9+~CCfhfRI5eU>OocP1o6UiSkZ87hH|-# z;gBYXeP>Y{9IstH;nL-|5B7f3MH4W6c_xdgqZj=!Z9l_}UJ!CPZvTgAxz8Qrqo}K7 zm%tKfjg$45bj8%5%<#BrE?@+cQvAkFtcx?|Yv7xyf1uUn9&UFAeruEYw#JPrFIY6; z(fB&KrPG%92^=-g5!wo7oGoMl&R!M(t$U!*@UYy1i zT6>QZshNMPlU25&4NZqwsaq=9F)YXOfVR*F7h z+uz4snQD~86i=Yb(*Kq4{CNIO_MYF5>iweZ|4N`Cd8fd~ukhDTCPPlw7XUb--m}Ru zuJW#?=Qi+#$a?UfXJPCY?(|+=nQAfRBNRfma@7f!B;EVcNuDx;tN9-j=NvmgZg}7G z;3a$jG?*^gB-MQ@`%e?LJ;y?0cd9X9HV^bcQk}44Xk|CuxnqhvNoPlH>HAHx<%AN6 zg;UyI20rX`?B;n|S@3QH4~+1ym|M%7txk_5V11ON0t;4#&A?}g^*CmV1ZL7=ZxuI# zI!p&t`M#q>n|6Q8*k5-*@CMSma-c47G$@IJg9Lg}dIoFlxQG0dpYFftj|oSgnyUzy zr1$-~mzt^uftm+LC>&);LHq!x(2Ez=j z2cOyt5X`-^6hztlk@O|$t5m(*q&*P#2MkGeity+l$eBBA(O#@&y;QQj`K=|O zTs;N|E;D(5?bj8Ti1IDkvo-g~u6Jo}$oa^qW`MO{lnZ{5?gjNQ~j^n({^-w`uIIYrG7dqBoSo z_SWuG2ey<>ugxJ@SR5pvwCaA(`vqdXGs#P)YlDvk5?dN>-@bbB?5eENX}*sy-de>a zxxdDCS<-F%tn>Y*%lG>0B@M#={Y{?N6M;rD^+Be=z~P#g@O{aAHXVbNBQr@aF-+u1 zvr*O`tlQVv!(=AsYG&sZznawQHfxG?@SQD)f4vAsd9Z)9tU-2v9IC~!lzC-YG6%1+ zIC!$HISH8-ap6c3Q?E>)n6}?>ar$heni8yqk=2FhJd?`4li>Q`ZO>A5$V_FTDZjQ& zhmCZshy3T!JMKu6?$Y1r>fGhCNvHR|uE)F}qTKD!tP#d*u6x4XOMm1 z!sz|ne&bKcj*8k>(=)((FGDrk=XBwcIaWrOzMU>5ysTS3C&z)V!-HVAj6`8>Z*UK1 zhjAC0X0MA#ooKYQa`TyOzSMvl))T*bdVX9YBacLu#QAA*G4Ui6+S2&ei5)6(jn zaFglMkH+sqCam26CQL=|ylQ8v?G!ZA*1#_%sr7-M9wk~|`WWjuojr18S+)M9Zy)pb zal+jgPaY`s)=u)BIpi^y#3v48Hl<$tdX}`$%L%_yf&JvGo6K{{&LVdh6sTG4veZ~v z5qj6q;6v8mEq|}}s9lzaW8#2P8QHoe z(Y%{<;hLj}?@$O#r1JNrxLG6Kg_feK18n!$JlDhk(sd>1ht-TeZ%p3nbahodqeD@f zI9<6O!W%&M?o+E#oxF+)7W;}fmod1VMYn!8;XGV%4-e&^`|U(k$sPSmg|*@Zq8x~K z8V>BYbIL=ExrMpv9~h|B-=09oD)38f=Ju<}@FK+7c}L-G;Vx-pIFuW;HNoW7jcz)r zO-1d2QST`!+-l0*hnTCGve2h~iICin8V$zqg@>G;ToK0}Iq@04&G)>Tl9|xzIvHgw z^w)QAM&CEi1F;Kg*YvIz%C;dE!KT!KVvf-C%Ds4@g=g;jEE)?eh^k???%mp@5UcUp zcOqLMSCnD0dVcGX$UTkwZ`HpyAKq4Hg7W>@8h&)Dj;3B4wz92?>1`v}{$!aCD^-qN zDHj5wSE4Y5tw7RBqO!X8-D9=mw@@ShJ&By9Z?t08kkv6ahdw?ZPLOTjc%mNhsaY56 zQM>sv^|9gUQ9LNLY0+Ao-EeedgNrYw4ZmN79950+^szOf-rg~K9#z{t-F&q7?!uI3+FkHftqX^T-XZmwBK}?+L}t(0l$xIDw~7 zLB~fQmKSaWbUMvf(IA-pflZhnjhJffF-TOj+U?@Ix{$ZY8z{8ndR(F??n>LL2)}s$ zbapB2haC5U@1N=u*Mi1XT`V-XLC#rbdHo;>_1Yn8rNCgK_oTss-(glSouY~=(wW6u zdruL&I07p>PbvFe0KwNU3zegnbwZ_|bg5vA7Fp($69``_8VpOX>+YX5&kWd~fN=u7 zGWO3f+*g+W`$Eut-sxE*xH>vIPbxE(RS{(B1L-YY0}E0RSnI|B`(Mx50~Hoy^3Ncm zj?Xy8*CYy@nPzV8&5zayuVY?M1820HmK{X7lGACgyS`dUT~QEFyfUFMT{$!~n+kq^ z|AUO$%I|D=|CSPl^olL zWcURC4n_!MU7%@mNUvY=S$J)F2a3qLO0bGI@;~dmc8k!lp}EpbB3ovxfo7kfmE^Gn z&PTUh*&KU~1w=i=d~(OOB~MvM9c1X~c1S`?kT>HED!rXEnO_jW{EGwuGm?RE*+9K2=pc z&@T#uuwCx{p>Y@Ucm<%b@s7*Uy_)SxvEWzuiLwW-T`}R&27PTB>UdhqbA?~mH zD5pD)?rr;hQ;OVJon+`u3`|z#ooHE*Eaw3=GEl5O3d|IXF;)3&R!nXY_A-OxjOy3T z@a1*;&P&SIly2h2m?kO&$X;dpJ5xXg&AD_vvv9^au768hGfDeu-SARGWXnQsVd|&Wl4gOe6rYxI4J~2J*-9Jk z`%K2~2xztTfT6J?8QrPGPCoBLlcBIbbjqRuWzFL2MNF1^@}W_n_luV!HqnNGeKp3z1X_#P5F zwD5xWb082t-}}V6(EPqq+u(THXESrRb2S8*^2%xZQ0g_&^2a8bN(FPfmfXulH+NZ; zN8=o@>p{om8alvKZjr-P&hJs4P1FIPnb_S|OsIS$ zz)~6+`}W7E3e)Y(^#Ox#$#;*-D!3c+_2x};&RtKL)*s}&#s5^+F)3eAU|(SJW58JdBz;Y7vZX9AY5E2~1c!G=o+CZG zH0w2Hz#thuYKby@EOVKQ^&>AkYve{qPeD~;Vw2+8m9))wDx6DeXU;#H&5WJ=9Iu3y zC5S2obGlyr+j>Yn`4z}w3S~S4d&UWi2F|jMMhJcTOmEJCf_!>ovwn~ABw?VW5nSzd z6G9AQP>IA%JAGgc0>Kn%nwXuFmE;N49r{6eu$!MAYZ~k`k{G7dA6JW;`Ph1aUABqP zg%(FqPRxCX{`7RnTwS0iOs?UUVI{Zv))$;L>g2d{tb>MLo+%7-%|+tEbAH|ItO^7o zaj?#cWNZ4b?)#EKr*^4%IsN0B2L#!;ag3v^lrJ2eRy}t-ls&7y;MKo{RdpFvSpL$L zJ@QoQA?M$*M&5#NUVL5O6VL&;p5WVCi~KFIfn#T13O$*3@5#-OvZ;s7rGbS#cV2CG zSWCF76ZIlc#fr{j&@hmi|?OB>yoWLGJ^E9elN1 zz1kX5@IkRD@o?A&%deBL#dE1&GSud4$-#%ueaH86RMSCdOdaiyD^GWPaQ`2ysE2Ad zbk|u?oPMaNG3;t*qO*; z1Io8WjoIsu-oF_LRKe`2Ay`xZ%nClvtWa>gy=$7zCnH^nmhKYyS%lR+`GaThk&x-!3*Zt|vuc!1Z+*zB~x>78sKnf2n8B>!4 z$g2ttGOYfvb4j+Yv0o8Y`Ijtox*m3pnDiC7E*fwfb%*$pi>q=1hK40+hDXN0pj~3J zQN4`n$xyEzbJPr!(7aovtZ>xcFF>(xka8T4y0O0$h#uShja2QcA6lixxHclY2Vrvg z@LYyNFk-Tno`5*~F`Y_pgh-&jXj%K2cHX>0;P-rmE%^#r=a9>dIT?MHt-#t^Ut9Hp z+*eY*T05=$_`LT?uPF*#zkz&#*3&$A)inl$tPyK?k^$aFn#D^NB^hQ5~tH_VeFT?Wb(+hsiNZF&E%pJEIT}xxi#=;)?^mR$RN_Sz( zQ8P%hdSZHFCd| z+TK{`+Ma77Wz7kjpquJ$U>*d!`<%){8|K}}M*NRgpGC1m7TL1C>okET2K;6_Xweda z5_&u~u!~ODu=CQFwu1XVlnE8es@U_qi#A-q;{w`Ihui$-I&iCq;CNA2ydX`*z#M%u zxK!xfy3FPMYL%B??;PxnP0S!UGlG30+KPuvd=b3LdEYOLNiIL3_b4kviOC!+hVY(* zDZE5#CS-y*)idV}Y?jBEoa}g*yD_p@GzdTciJ`An30iC9k#;`2-a_4DA(f%;N`&W3 z=scwgEq1!nrx6ELXX*RNgwGNUw=s!G8O&>>k{?{sHIP2ok3O>UJSm3EsP0osC>>1A zH`MN`=6@<50P9Gg9AfEe`Td&oPRL^dn=a%oZ_pnR_C`EDVAv>VKZ3&AH`t${>Dy1V zqZsa0Ws`Ss&pf}!A@>9*6MN`pbt9kSL-glCqs;w}3oj*2(F4RTAcHfuc zm;3Xa)p9MjhROCNt_0}aOZ<+|{6P6Cp8G(zd-ufJmHKYlCsr#mAI1(Cq9#(dn~fBk zq!2iZr-Z^F7Zwe!ugy0Nn@Dr}Q?ag(NW-8cS@P{qPiK^g%KrP=0b!H>{`9Sh&j#)d z_G1M}b@Q4@C%N6*??`{NuPi2Q!*XwFe_=U!nU=2IoM~S(Q_#y01`4)aN)Yq-XW5X@ADL|3 zBGOJC{s-FRnc(ICv!>m4UhTZ;Nq*c6RcQ=C;S14QfK6wL%juz~`=24NtyA#I=k=Pb z26o-Skekj=%T6_^mE~0NOV66$x=`H_%bPR6Iewb5Z-eMLqc&B|&oNP)>Fay^0?^Je zE`pnIG{EyNb?EZ&Ij!o7&+eNh0M*>8cojMM+q_t~G;(Vxqo5qnqQ0~6%jn5sJdpi5MI#@zB>eqTT}x-0`93X)RjX*n*#8<4pMKld(+JSdlc8^# z9@WEY#ys04qV6YnJjtWl9+UV7v-{_t16xE^_oOw%nCrTAmOJGRucGzyISgnS{75dE z{rSzxr$w9MU6^?O#!T576P=T+mpYdt_kM9&>PU`g+J;+Xs?^u&_5ejB6F|p`eqXx` zR~N4-z{LN2uYG_<6&QQV^U4YAmB^XwgqygD3Phe%-BA7Z)xWwp(@m83EVJ6yCqrX+ z@B#zyUys9+s{h)GJF3PDe&~RC;uq7VB?y#q=F6N?2=GDN!2_Lxq70X}WvCM>lgD+1 zI#hCw-2K(@%=o`XEwp_)fn4(2khOP++3eK=c=+DWj^q^IkYc) zW2qpkq^K~bd*p7nXBOYxc6C5fshS&@4=vkt7xS(0V7o$0%WOfce+V9(A7~VP)A08* zva+>@9V7YMHJ%PJu{DDrm!1(cQfTuicrti>$nbH?#o?78PoK3gSEBUBR_BZctym=l z$eTa6ZP^eTcMgjwz!sEHm1|-d(n4P}F$=1sTLcjgcbnC9`hyea`hc;C51N-t!teXG z3>wkg3}cz^1a{_a732}09VLYpZMP<1n#KNYw-SdQ>!0uinJ4NSwmxo@Z$5l!BJxO2 z)y5#umQ%6lMZd?4bL~NG*o*~K@lvkYw4+$Hf=x$B-EW;8wWuH7?AblX^VQl{;rn{B zu@)QWjpqxTsY+bD87&5hY@j4lM@9C_oD`z>f}?dJ7BdhQtr!suMMX|P*LLBaGseWE4?}1JBLz?w>3dJAqN^E{b--01W7v%tqX{U@A5K;d!E)b<0!}3 z7u*<`zc7cOunP9#uL=nzf&#?e`0cu?Yrp=bumGKnn-)xHJOD<^5mu{r0g4WsS`O=E zZq&(Izap+6>@3y`!c9dgb*}+~CP1ek(Sn${4o==r*&BKKU|0*-A;1{gdKrw+E*Y+5 zqKG(sIT`hbHaeqm)gMM&!?C~sX2>-^qqp0GWyz4B)i5gX?9mF*1M7-luAMF|N&% zo%A?rjuLovf%7zTb-Ehzrx$;wqz0jfIH>$^iKSf(ip!c}mU4hW?2m^pSTh^NgyZ0+ zpVD~f27$#wXYKHk)+Yt0sBr!I7aZYuGb1%%!V;=_8mm2-b3OW5Q2&e4dl7L}mnQH2 zMB_h9aqu?q_z~sNIj>Me4$=%IH|OUlpbh4=gt3I1b)YSCml1CteBjn%_8*R3Q<& z3Qfg_Z)P}6=`qx<|1BWCvB=Qs_|}c=&slMuZu+?VO^p>6i<_t{`Y^9BN*_pdH+a55vTO4Eax@C zLd2#PVuek42=z@-aS;EnZ?bDKK-Y(Myek=Ofin1b>S9*Cc|4t!^LNBEzl=c;5&Zz7 z$Ap;xhit0`59|G|I@t4i=iMK&sLtclx2-z{NT6CHSMQFn!6o(gk+Q0H%46q`MtcOB zN%!fiuPeuG#7|?YN8d@v_kKE=#bKbjpr2a)Sb2ZKIO?Ec^pQVor3(8Q(Y^_VqIEU1 z(2&4RiRRktZ&D?=b3ENB6-pjkVcNQ&b=O#pu9?PmLIDY?z{0ZjO{EqzY*Lo>-n5gs zWVW%&nD$+%Cd;-;bvR~!-s#lle+>6&yn$F8=!|Y0I~mx326X4akn%}PwSq>?OAdfz zw!GFnKqzxgx8{<~ctGY*Fdhu`tS8jzJX5At$uW2T!<`i({%_r{OkQBBA1y^}F)I8&p5DWs&HoMiE{fV; z)!L+`rD_#bAw*j(+7fNGwMUzxYQ>DLC_0R)y*E|0_ugX0-Xn;Jorn;L;PJcf=Xw5z z>-9OW^Ei*=eZ;>YLuUWOzgY@Dxvux~(>ZmzE9=^9RqswiuX&Z>_%XBqddXUvR!ah_ z`-4NZqBF@&3Y1BYw1R@E)`3~&nK)tGfJlFRW;^!nk&Umb)XxOpC_`iU>=wM6&VlJe z7x~D{&;7B_60+X98<%KcT?vuog=UGLbcO-rW}(ht2gIW*C};1Wr@tX;%dspdERp6- zqLu4sqp}&H7>T&ET$9TV2QL$%udezN83AsPau)@1?m+l;kh-?O@0eMq##IA(uD#6y zxns2yao^7P_dNDdF-RX4(GCY)^&aMW4tp|!gTrd+H+H={BXE@KhP?Rrh4&$-Vr8|8 z0covTi2JLXd3d9=T>^u)+h2oQi~&Cj_t5fXCG_I-&gXnCTraZemA=~s>Q?0R4BtiV zvNKG$L&NH4LDltpaanC&P0ZgiMzgtG|N0#8^IPxNkU0F(^EqexgAx8>mb&&=8EiI( zvs^~y3Zyq4ZwzGH)X|I?;;(rgu%qrX25dk)3bSH*t#~%Y0zM0S>09@>w(FiNeguf-l(uu+l7Oy8rJ|jZcBO31mpeaSUCt57xtb#;_nA9JC;XX?d{0uM z&V4z#fhW)ry=%Jn`LA0UJmGzK?bA`HwcUna;1a1(7MF%18R#{W=xtcn6#RGA!S1*N z@Hy7vZ2=@r<)U^@xf%wJIua~kDz+k4&RCv8bpsXYYhErdxDGE8wwF%oJT9Sp<{cx* z$+ULNzH<6Eg3WrY+n3+o>%%7n8%4g2c^*8?Z$nTMV=Ah;s5p5L7_ZmB9zv5Yt@foL}fEvxFC{sVz$mM3m&~3W}zgbpRcq5$zTxyRp+MUbWn}7Jyw*>AAazE(TVspZdtu zojVqZsMGSZ1Fu(^G2?hIgEJcu`|P1Rx9`0>oRNu{sZ#JNih1QD=6`bZ{)_xggnsxd zR-KQs5!d;Ko`5&mXP;Gn7KJs(STuUeuS^|fG#$lb{+b*~mwHd<4b*d}Ldkut`_%)d z=ubZ09x7&TWL?ECN%viQ89w7T2^*@C>`~4x|HQhy;9IstZL!rAag6I-=GLR57x8vZ zOCZmC&V9*c#UL@Y6-lH8!jG**m|~S{H%Y;M3QrOcK%W8KPzwGl& zxY5#-QMFf8X~%b=Q(*U4Y{mZVH4HkzcrSZ@gm2syG~>e?r@PqAq-*}^V z@T!_ig0IIDh1{y!glcEs4dZ*_r^`3OAMktTgrMS@b@wcWM*ob`cQg5M3DTcvpw3b;7Uxqw-fz&I0JkZ^Z<{opumNbilOGbD zU|{Cy<-rn};}b`gK3}cQ3u!n_bMoCH1Qld7Ubw8l4NYM0m(-OFZaAwj`|iXzVDgbn-)FA_#?qbBGLE6h+EV{5(XpKzzk;QcUQCA3*+Nw7164V7DBO`IlgtrI;vtadCyi?Zbj0Z zE%7hQviARuyRKJycY*#4+CnE!W=JlwNIsb!euKKu z9V0f{s3}bZhhaZcp8G93a2bf&kxbNJ^__F7tXct!d&_oFMitf6?WpdZ$l?o_pE>t; z=QH6!nMnY75-yVvuwEjlmfoUxx}u*W*&Vn$_hWbSgcz|Q?;ey^ybRp)(GdENuJNCS zL|gR7M*=i2T=M|J==#Wmd_gPL_u;+I>Q*ZGb6_>$<)Q^q^bX2ix0sPftFh{ zeIWL^&xZHLu%Y^M9zBWNA~hV5G7_buP+Jh}L5GG$N&62|P4z%FVe^{0@`D=U$TRcV z+c8j^8)?k4lgaLb=xXk%UKz$)z%!gMXTrSw(SBhQGwQJ=c-*8Te zhLV+e0u*x{N?k-(k3Nw7Gd3pEI(l_zQCBt13gnUcny)(tw3^#JU8Z(ht28)Iz4q6@ zX>QMCv+yn4W|XjWMwN#?yeTOhvdNV6dhckDqN7o341y>5urL0UVSbe2FzV$mfLeS1 z+w#gA#b~4ZhT@J!l580dx>_;K)N8$*vpvjXp`t!-+x9mCg`8El zLVHsCdF2Jue27qaV?lbdhQ0SFT~a~XtvSa8V*)Ani`1R{ z`Ay;Drk@X}Vz>I7us&5mrsRLL$6i&QTR!H;6H;9PGlUtbtDs*YPZTac*;XA;Nu__f z_$t-kaZq|lcg&(k+3uC?z*I)Aqnf`OZfik|gXXjNY0X;NPq7IT;c0>Jkp59SiE9yU zYBkb8EpQ*X9SU{UhHEjtJA8C9zw%8Jb+m}*%)m)BBE}ysv4zQ-jyZ0kh_jz2(`N5B zvfDBLlPJq?d-ga`&Q9&w-Nusj|4sCN5-_LChvG$izmf;xzoTiSv~p1lXy_N!)bK6n z>Yz4sSxroWZ_S#}W@&W^%&_LXu_edy!~ zh-Aa_xIdA73v%l!qV7)Wb(`JX7uJR;J#Rp_b^4d(H+Q@O_KecnM5vARmgQvDC5Pa1tri(KC12|WTdtgh>{=sN0#Blh9PJCThD+AsyZPA6i>$sZ`} zjzwFr+)b)La0=8QL_-?NE5OUe+qdA_$63!8q>^(*S=E2RFN_tM1MUw|Xb}LNN8{4fY%n%2*ZR7$@TcOs(A+z%}@px1mv=YDO* zedo9q9&o{woLs^8XEGHeY8mgfZ$$W=aJ*rxXRwF5Ujv^>loq?O8C~gT^O!r`!I@T# zMFevjtZhuaKzBXj0sa+L{_a<8Kp%_HIyzgtu5o-MX!1OPZHei8BtintptX25Q`)RR z;Io0dtrch>0?v~;WX_L#G7K6{w{QX3k?*T6qvS?AOu%kKF8gsxSlcReAb!b5hU`{y zrLM&-!&^{yEw8hHj#m)Z)y|R;J-WAahv>5c*iCME9q`X_&G6Ls4E1<*zn@twJ`9-R%YHY&nrZQv~Ujb#Z)qrlMh}q_WMzM%G zfVq-!=7477kz|xc&C2T>3v=9njCcF#x|GkYGX9rg^HoWx^ zMIf^0L!ip+snLfsN6-Ofo3!|+Zdj69GyIvmA%Pw_3Jgb`mFppr$eaD6g0+hzVp=ov zlYGE=1l%U8&0&)iDeaRZb+(-%V~+H}Cz<`*=RxmK;ibM&KW+cT zwzjtwrl^I}PjPt}Rb_YyWeTA~&(y+qfK)F@{KQ5UoXX(Q9=z~Fw%mfS$i;d%1F zx7`*rv1&Gn7d&;DUu7kT7^M!tZeQ@v3W;>eL*fk`5NwglZ(W2rO@yY$!5B1b4C_+j zF=}{oE$RXDP+Z=NNlgz)z&!U{GE{jPl%h;QL7imC*d4F-D>UiDl)_) zoVW{T7gpy-B;~YsIwMgpaiM|TXw*^8Yd3iE zg9pMa8Mjf$@S*U5t*?WLA$QorUQ>)CTKNy!ve|k3td<0@^xEU-+lYYR0V6BwWB+Z# z{<<1`#kQl$3%tpRNkv-IS@c1%Yj4xs)$Ewy(hzg^I~X7lp|(n+HWeWD8IUfwsVNAC z+Os0+HGn#a&i^$n-$@4-HC3mU-!Mj%ax5j~Ac9xg$KTiJ_IZDrXJ}xKSKNyLCB3F~6BhN*riE1Tt zaou@q`QJezdd$|dOVLJS{Zp#zG8UBOOY?h!3O4TN`C8)32)v7 zu?khD<)oP2j*ej>vaN~s%7R1&K7Ix7BuaY0olt6b(h1#6TeYs@ex0*vd`5j@NZ`l8 z46zoMgm3oi$kvfsbcouxVls?VmYwV7^p9;rcVl(1Ny z+Wc?Pp1KBPx^vI^kNBgf({HKcd0!ew@*ffPcw*c)?U)x_CGZ_QEoE9y_#O&;68Msm zJ6*ZlLRp9C!KYmAKf{hca&5sRSc`InZC-m40@^`4;(1R?ocuT2k}!9;N)8sg zvK|r&E&xUqzi#?j4&a~(B`__IhPH&Iz@KJ{gq`nlR+8p~-r;h^&Rsa5zod7Z;y<>L z4?2=L7XxkRhza|j>qB+?)(GwvM~Rq6a`tD%PE9vrqSKnEui7Io9lOB3IAwQiHXdqk zO^MqkgCprfU$QgWRx>vFt?{&_Ld1?KUv8e~MmwoyEwMiL|CzupUCna#%i#F`bX}aZ z;4YxDX9rpmuxT^6v;`&4V(we#tRmF7Uew_;d^UCDv(kH;Pbmpiif6cc*x7o* zR@xp0D|_(-bUL8x4zWF1n~}KF=y`M&jmDRk$fpO-T3dvODVisHSNcxAgnA69b2Iw; zGG;OUe7<42uprLUlx!`Popt^=ghmm^r&p8bFkv;#9LC9X_DKWPiLaA?{Hu0E!{qmh z*JZGg?;aO`TeR;8Lsu_~6E#?R)66Q&JIU1NdM}d81t-L-hm4fh>N9s8HyaQysn6T& ztp#SFPL|)YFya+lr}vJ80RM#B6Jo5FTQ^S=;t+W2LyeZw-bHMxJx2qI&yUfD^8Sd^ z^D0uIO-oQs5oJ4pgweljZ@NqhBGGB9|B8kQbM&r!RkyS%ozsGMyGl+~IG0Ky;G z@mNvnl-!RnUawksSvtprv)~$IF)tdUc0apat~0}yd`grTTuXNAJ?zc5w*o%>x>qrN zlv)WfD`~#Xu9Db&GuvxrXQrp#vL9EVDcdk@OnXoG_Zf=!VTwh%og_Y=uh!rf|y-S72XVW2HoF!6>XOhK0g2PLEyV)qD46Jgx?Bi(Xuambn|+;IEu3*= ztzz4$ly0W{;I_%Ktx`ioKwM-h^>NFhLwHM;zw;M6#DbjRPxZtQxk(<$7Pn;9X6zFV z7}0Mi#W&S^@20z3O+}vx+i|;{o`?3(OS6RMkR{3V!h@QKXuSsY-n8bh$CaJVpKtrD zdH7Jm<{um`p+%i=KiH?hTg`g!9zO(92hcFL_~I+Ua?!`aQK9t8wh(85IW;>@*trg!si7AymRl=d9=b zgPZ7JnQY^IX5(!E4yzq&n(lNd^PeY5Dk29RRpmR-+D5a+bsOmW_g+%KJEdB=4Cxn% zF^D$1v3;$mj=9m5%)RxH#3>|H9Ut+ z*zIvRW1X@!#Sr#%J7<*fw)=;0rHHWg8BKv9y{LSMIf!O=4#Ig@h|m+_`}4ZQ{@2Z) z47a2a>${a1MW-;?(N z=liQ8`;i_!2y(tw^@`@#?jSbT(3=7?QqToFeJBi2jf#otoz*-^%0>QoLs+(Oxm<

  • +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 diff --git a/docs/images/flow-build-project.png b/docs/images/flow-build-project.png index 22186213cf1a20ed47c506b41066c717d523ff59..12221c77a086ab57e716bb04a05c611f4472bc49 100644 GIT binary patch literal 70187 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
    - + - - + + @@ -73,9 +74,9 @@ prepareMochaChrome.doLast { } task testMochaChrome(type: NodeTask, dependsOn: prepareMochaChrome) { - script = file("$node.nodeModulesDir/node_modules/mocha-headless-chrome/bin/start") - args = [compileTestJsLegacy.outputFile, '--file', mochaChromeTestPage] - if (project.hasProperty("teamcity")) args += ['--reporter', 'mocha-teamcity-reporter'] + script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha-headless-chrome/bin/start") + args = [compileTestJsLegacy.outputFile.path, '--file', mochaChromeTestPage] + if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter']) } // todo: Commented out because mocha-headless-chrome does not work on TeamCity @@ -90,13 +91,13 @@ task installDependenciesMochaJsdom(type: NpmTask, dependsOn: [npmInstall]) { "jsdom-global@$jsdom_global_version", "source-map-support@$source_map_support_version", '--no-save'] - if (project.hasProperty("teamcity")) args += ["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"] + if (project.hasProperty("teamcity")) args.addAll(["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"]) } task testMochaJsdom(type: NodeTask, dependsOn: [compileTestJsLegacy, installDependenciesMochaJsdom]) { - script = file("$node.nodeModulesDir/node_modules/mocha/bin/mocha") - args = [compileTestJsLegacy.outputFile, '--require', 'source-map-support/register', '--require', 'jsdom-global/register'] - if (project.hasProperty("teamcity")) args += ['--reporter', 'mocha-teamcity-reporter'] + script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha/bin/mocha") + args = [compileTestJsLegacy.outputFile.path, '--require', 'source-map-support/register', '--require', 'jsdom-global/register'] + if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter']) } jsLegacyTestTask.dependsOn testMochaJsdom diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d7ae858e5a..f57489cf8a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -4,6 +4,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index aea4d45203..4e025c58dc 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -98,9 +98,9 @@ dependencies { testImplementation 'junit:junit:4.12' npmTestImplementation 'org.apache.commons:commons-compress:1.18' npmTestImplementation 'com.google.code.gson:gson:2.8.5' - debugAgentTestCompile project(':kotlinx-coroutines-core') - debugAgentTestCompile project(':kotlinx-coroutines-debug') - coreAgentTestCompile project(':kotlinx-coroutines-core') + debugAgentTestImplementation project(':kotlinx-coroutines-core') + debugAgentTestImplementation project(':kotlinx-coroutines-debug') + coreAgentTestImplementation project(':kotlinx-coroutines-core') } compileTestKotlin { diff --git a/integration/kotlinx-coroutines-guava/build.gradle.kts b/integration/kotlinx-coroutines-guava/build.gradle.kts index ebddd3c9ce..2a84ca937e 100644 --- a/integration/kotlinx-coroutines-guava/build.gradle.kts +++ b/integration/kotlinx-coroutines-guava/build.gradle.kts @@ -5,7 +5,7 @@ val guavaVersion = "31.0.1-jre" dependencies { - compile("com.google.guava:guava:$guavaVersion") + api("com.google.guava:guava:$guavaVersion") } java { diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index ac6840d98c..78d2af14b2 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -14,6 +14,8 @@ if (rootProject.ext.native_targets_enabled) { apply from: rootProject.file("gradle/compile-js-multiplatform.gradle") apply from: rootProject.file('gradle/publish-npm-js.gradle') +apply from: rootProject.file('gradle/dokka.gradle.kts') +apply from: rootProject.file('gradle/publish.gradle') /* ========================================================================== Configure source sets structure for kotlinx-coroutines-core: diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index c01e70463f..a420004801 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -21,8 +21,8 @@ configurations { dependencies { compileOnly "junit:junit:$junit_version" compileOnly "org.junit.jupiter:junit-jupiter-api:$junit5_version" - testCompile "org.junit.jupiter:junit-jupiter-engine:$junit5_version" - testCompile "org.junit.platform:junit-platform-testkit:1.7.0" + testImplementation "org.junit.jupiter:junit-jupiter-engine:$junit5_version" + testImplementation "org.junit.platform:junit-platform-testkit:1.7.0" shadowDeps "net.bytebuddy:byte-buddy:$byte_buddy_version" shadowDeps "net.bytebuddy:byte-buddy-agent:$byte_buddy_version" compileOnly "io.projectreactor.tools:blockhound:$blockhound_version" diff --git a/reactive/kotlinx-coroutines-reactive/build.gradle.kts b/reactive/kotlinx-coroutines-reactive/build.gradle.kts index b624069c60..c2e4b5c9f0 100644 --- a/reactive/kotlinx-coroutines-reactive/build.gradle.kts +++ b/reactive/kotlinx-coroutines-reactive/build.gradle.kts @@ -5,8 +5,8 @@ val reactiveStreamsVersion = property("reactive_streams_version") dependencies { - compile("org.reactivestreams:reactive-streams:$reactiveStreamsVersion") - testCompile("org.reactivestreams:reactive-streams-tck:$reactiveStreamsVersion") + api("org.reactivestreams:reactive-streams:$reactiveStreamsVersion") + testImplementation("org.reactivestreams:reactive-streams-tck:$reactiveStreamsVersion") } val testNG by tasks.registering(Test::class) { diff --git a/reactive/kotlinx-coroutines-reactor/build.gradle.kts b/reactive/kotlinx-coroutines-reactor/build.gradle.kts index 1a36ccec28..d4bb135f73 100644 --- a/reactive/kotlinx-coroutines-reactor/build.gradle.kts +++ b/reactive/kotlinx-coroutines-reactor/build.gradle.kts @@ -5,8 +5,8 @@ val reactorVersion = version("reactor") dependencies { - compile("io.projectreactor:reactor-core:$reactorVersion") - compile(project(":kotlinx-coroutines-reactive")) + api("io.projectreactor:reactor-core:$reactorVersion") + api(project(":kotlinx-coroutines-reactive")) } java { diff --git a/settings.gradle b/settings.gradle index d7673a64f9..28a30c7bc7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,7 +18,6 @@ pluginManagement { } rootProject.name = 'kotlinx.coroutines' -enableFeaturePreview('GRADLE_METADATA') def module(String path) { int i = path.lastIndexOf('/') diff --git a/ui/kotlinx-coroutines-swing/build.gradle.kts b/ui/kotlinx-coroutines-swing/build.gradle.kts index b8ca906adf..157ce401b2 100644 --- a/ui/kotlinx-coroutines-swing/build.gradle.kts +++ b/ui/kotlinx-coroutines-swing/build.gradle.kts @@ -3,5 +3,5 @@ */ dependencies { - testCompile(project(":kotlinx-coroutines-jdk8")) + testImplementation(project(":kotlinx-coroutines-jdk8")) } From b2188dda0addd022bba1c769bd31ba7b9141195b Mon Sep 17 00:00:00 2001 From: Louis Wasserman Date: Wed, 18 May 2022 01:07:47 -0700 Subject: [PATCH 284/328] Correct trailing brace in transformWhile docs. (#3290) --- kotlinx-coroutines-core/common/src/flow/operators/Limit.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt b/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt index 734464b557..1b8abad000 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Limit.kt @@ -109,7 +109,6 @@ public fun Flow.takeWhile(predicate: suspend (T) -> Boolean): Flow = f * emit(progress) // always emit progress * !progress.isDone() // continue while download is not done * } - * } * ``` */ public fun Flow.transformWhile( From d14b9c5d847a95db73fb8e0432f68c1033613b0a Mon Sep 17 00:00:00 2001 From: agrieve Date: Wed, 18 May 2022 04:34:21 -0400 Subject: [PATCH 285/328] Remove unnecessary -keep rules for services (#3263) Fixes #3111 --- .../META-INF/com.android.tools/proguard/coroutines.pro | 3 ++- .../com.android.tools/r8-from-1.6.0/coroutines.pro | 4 +--- .../com.android.tools/r8-upto-1.6.0/coroutines.pro | 9 --------- .../com.android.tools/r8-upto-3.0.0/coroutines.pro | 10 ++++++++++ .../resources/META-INF/proguard/coroutines.pro | 3 ++- .../src/AndroidExceptionPreHandler.kt | 2 -- 6 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro create mode 100644 ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro diff --git a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/proguard/coroutines.pro b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/proguard/coroutines.pro index c7cd15fe11..ef42483f56 100644 --- a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/proguard/coroutines.pro +++ b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/proguard/coroutines.pro @@ -1,5 +1,6 @@ # When editing this file, update the following files as well: -# - META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro +# - META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro # - META-INF/proguard/coroutines.pro -keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;} +-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler {*;} diff --git a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro index 0d04990ad9..cf317c41e3 100644 --- a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro +++ b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-from-1.6.0/coroutines.pro @@ -9,8 +9,6 @@ boolean ANDROID_DETECTED return true; } --keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;} - # Disable support for "Missing Main Dispatcher", since we always have Android main dispatcher -assumenosideeffects class kotlinx.coroutines.internal.MainDispatchersKt { boolean SUPPORT_MISSING return false; @@ -21,4 +19,4 @@ boolean getASSERTIONS_ENABLED() return false; boolean getDEBUG() return false; boolean getRECOVER_STACK_TRACES() return false; -} \ No newline at end of file +} diff --git a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro deleted file mode 100644 index 549d0e85a1..0000000000 --- a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro +++ /dev/null @@ -1,9 +0,0 @@ -# When editing this file, update the following files as well: -# - META-INF/com.android.tools/proguard/coroutines.pro -# - META-INF/proguard/coroutines.pro - --keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;} - --assumenosideeffects class kotlinx.coroutines.internal.FastServiceLoader { - boolean ANDROID_DETECTED return true; -} \ No newline at end of file diff --git a/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro new file mode 100644 index 0000000000..1aa2b114c1 --- /dev/null +++ b/ui/kotlinx-coroutines-android/resources/META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro @@ -0,0 +1,10 @@ +# When editing this file, update the following files as well for AGP 3.6.0+: +# - META-INF/com.android.tools/proguard/coroutines.pro +# - META-INF/proguard/coroutines.pro + +# After R8 3.0.0 (or probably sometime before that), R8 learned how to optimize +# classes mentioned in META-INF/services files, and explicitly -keeping them +# disables these optimizations. +# https://github.com/Kotlin/kotlinx.coroutines/issues/3111 +-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;} +-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler {*;} diff --git a/ui/kotlinx-coroutines-android/resources/META-INF/proguard/coroutines.pro b/ui/kotlinx-coroutines-android/resources/META-INF/proguard/coroutines.pro index 6c918d49e7..087f1ce8e7 100644 --- a/ui/kotlinx-coroutines-android/resources/META-INF/proguard/coroutines.pro +++ b/ui/kotlinx-coroutines-android/resources/META-INF/proguard/coroutines.pro @@ -2,6 +2,7 @@ # When editing this file, update the following files as well for AGP 3.6.0+: # - META-INF/com.android.tools/proguard/coroutines.pro -# - META-INF/com.android.tools/r8-upto-1.6.0/coroutines.pro +# - META-INF/com.android.tools/r8-upto-3.0.0/coroutines.pro -keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;} +-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler {*;} diff --git a/ui/kotlinx-coroutines-android/src/AndroidExceptionPreHandler.kt b/ui/kotlinx-coroutines-android/src/AndroidExceptionPreHandler.kt index af32191f53..0bc603ea1e 100644 --- a/ui/kotlinx-coroutines-android/src/AndroidExceptionPreHandler.kt +++ b/ui/kotlinx-coroutines-android/src/AndroidExceptionPreHandler.kt @@ -5,12 +5,10 @@ package kotlinx.coroutines.android import android.os.* -import androidx.annotation.* import kotlinx.coroutines.* import java.lang.reflect.* import kotlin.coroutines.* -@Keep internal class AndroidExceptionPreHandler : AbstractCoroutineContextElement(CoroutineExceptionHandler), CoroutineExceptionHandler { From 9e7c1baeb92682cbc9f28e2eb1c12ab16985b4f3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 19 May 2022 13:46:59 +0600 Subject: [PATCH 286/328] Update guide example to better reflect the intent (#3292) * Update guide example to better reflect the intent Based on #3202 --- docs/topics/coroutine-context-and-dispatchers.md | 4 ++-- kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt | 2 +- .../jvm/test/guide/test/DispatcherGuideTest.kt | 4 ++-- kotlinx-coroutines-core/jvm/test/guide/test/GuideTest.kt | 0 4 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/test/guide/test/GuideTest.kt diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index 4e5ed02b87..6c06b14d07 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -334,8 +334,8 @@ fun main() = runBlocking { } delay(500) request.cancel() // cancel processing of the request - delay(1000) // delay a second to see what happens println("main: Who has survived request cancellation?") + delay(1000) // delay the main thread for a second to see what happens //sampleEnd } ``` @@ -350,8 +350,8 @@ The output of this code is: ```text job1: I run in my own Job and execute independently! job2: I am a child of the request coroutine -job1: I am not affected by cancellation of the request main: Who has survived request cancellation? +job1: I am not affected by cancellation of the request ``` diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt b/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt index c6ad4516da..6796532229 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-context-06.kt @@ -26,6 +26,6 @@ fun main() = runBlocking { } delay(500) request.cancel() // cancel processing of the request - delay(1000) // delay a second to see what happens println("main: Who has survived request cancellation?") + delay(1000) // delay the main thread for a second to see what happens } diff --git a/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt b/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt index 1a84fb9427..e18741e981 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/test/DispatcherGuideTest.kt @@ -59,8 +59,8 @@ class DispatcherGuideTest { test("ExampleContext06") { kotlinx.coroutines.guide.exampleContext06.main() }.verifyLines( "job1: I run in my own Job and execute independently!", "job2: I am a child of the request coroutine", - "job1: I am not affected by cancellation of the request", - "main: Who has survived request cancellation?" + "main: Who has survived request cancellation?", + "job1: I am not affected by cancellation of the request" ) } diff --git a/kotlinx-coroutines-core/jvm/test/guide/test/GuideTest.kt b/kotlinx-coroutines-core/jvm/test/guide/test/GuideTest.kt deleted file mode 100644 index e69de29bb2..0000000000 From 20d47b7bf5e70a548fb982948998c5c616cddbbb Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 19 May 2022 16:31:50 +0600 Subject: [PATCH 287/328] Update binary-compatibility-validator (#3294) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 320f41d0fd..404e79b4fc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.8.0 +binary_compatibility_validator_version=0.10.0 kover_version=0.5.0 blockhound_version=1.0.2.RELEASE jna_version=5.9.0 From 8cdb4d6f232dfcb563abfab42a1d3ca1de9f8624 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 23 May 2022 13:20:31 +0300 Subject: [PATCH 288/328] Fix potential data race in EventLoop (#3289) Fixes #3251 --- .../common/src/EventLoop.common.kt | 8 ++- .../common/src/internal/ThreadSafeHeap.kt | 2 - .../test/internal/ThreadSafeHeapStressTest.kt | 66 +++++++++++++++++++ .../jvm/test/internal/ThreadSafeHeapTest.kt | 2 +- 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapStressTest.kt diff --git a/kotlinx-coroutines-core/common/src/EventLoop.common.kt b/kotlinx-coroutines-core/common/src/EventLoop.common.kt index f4f61b25d4..12940c54e2 100644 --- a/kotlinx-coroutines-core/common/src/EventLoop.common.kt +++ b/kotlinx-coroutines-core/common/src/EventLoop.common.kt @@ -236,8 +236,13 @@ internal abstract class EventLoopImplBase: EventLoopImplPlatform(), Delay { if (timeNanos < MAX_DELAY_NS) { val now = nanoTime() DelayedResumeTask(now + timeNanos, continuation).also { task -> - continuation.disposeOnCancellation(task) + /* + * Order is important here: first we schedule the heap and only then + * publish it to continuation. Otherwise, `DelayedResumeTask` would + * have to know how to be disposed of even when it wasn't scheduled yet. + */ schedule(now, task) + continuation.disposeOnCancellation(task) } } } @@ -410,6 +415,7 @@ internal abstract class EventLoopImplBase: EventLoopImplPlatform(), Delay { */ @JvmField var nanoTime: Long ) : Runnable, Comparable, DisposableHandle, ThreadSafeHeapNode { + @Volatile private var _heap: Any? = null // null | ThreadSafeHeap | DISPOSED_TASK override var heap: ThreadSafeHeap<*>? diff --git a/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt b/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt index 43b7e9de51..2100454be3 100644 --- a/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt +++ b/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt @@ -47,7 +47,6 @@ public open class ThreadSafeHeap : SynchronizedObject() where T: ThreadSafeHe } } - // @Synchronized // NOTE! NOTE! NOTE! inline fun cannot be @Synchronized public inline fun removeFirstIf(predicate: (T) -> Boolean): T? = synchronized(this) { val first = firstImpl() ?: return null if (predicate(first)) { @@ -59,7 +58,6 @@ public open class ThreadSafeHeap : SynchronizedObject() where T: ThreadSafeHe public fun addLast(node: T): Unit = synchronized(this) { addImpl(node) } - // @Synchronized // NOTE! NOTE! NOTE! inline fun cannot be @Synchronized // Condition also receives current first node in the heap public inline fun addLastIf(node: T, cond: (T?) -> Boolean): Boolean = synchronized(this) { if (cond(firstImpl())) { diff --git a/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapStressTest.kt new file mode 100644 index 0000000000..5bc0952ed4 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapStressTest.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.internal + +import kotlinx.coroutines.* +import java.util.concurrent.* +import java.util.concurrent.CancellationException +import kotlin.test.* + +class ThreadSafeHeapStressTest : TestBase() { + private class DisposableNode : EventLoopImplBase.DelayedTask(1L) { + override fun run() { + } + } + + @Test + fun testConcurrentRemoveDispose() = runTest { + val heap = EventLoopImplBase.DelayedTaskQueue(1) + repeat(10_000 * stressTestMultiplierSqrt) { + withContext(Dispatchers.Default) { + val node = DisposableNode() + val barrier = CyclicBarrier(2) + launch { + heap.addLast(node) + barrier.await() + heap.remove(node) + } + launch { + barrier.await() + Thread.yield() + node.dispose() + } + } + } + } + + @Test() + fun testConcurrentAddDispose() = runTest { + repeat(10_000 * stressTestMultiplierSqrt) { + val jobToCancel = Job() + val barrier = CyclicBarrier(2) + val jobToJoin = launch(Dispatchers.Default) { + barrier.await() + jobToCancel.cancelAndJoin() + } + + try { + runBlocking { // Use event loop impl + withContext(jobToCancel) { + // This one is to work around heap allocation optimization + launch(start = CoroutineStart.UNDISPATCHED) { + delay(100_000) + } + barrier.await() + delay(100_000) + } + } + } catch (e: CancellationException) { + // Expected exception + } + jobToJoin.join() + } + } +} diff --git a/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapTest.kt b/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapTest.kt index be7ed91a3f..ee0960c849 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapTest.kt +++ b/kotlinx-coroutines-core/jvm/test/internal/ThreadSafeHeapTest.kt @@ -93,4 +93,4 @@ class ThreadSafeHeapTest : TestBase() { assertEquals(set.size, h.size) } } -} \ No newline at end of file +} From 59488d1d4c7b8a61170f2275ba78db10d575cd5b Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 23 May 2022 15:06:19 +0300 Subject: [PATCH 289/328] Remove TestCoroutineContext.kt completely (#3291) Fixes #3218 --- kotlinx-coroutines-core/README.md | 4 - .../api/kotlinx-coroutines-core.api | 33 --- kotlinx-coroutines-core/build.gradle | 3 +- .../jvm/src/test_/TestCoroutineContext.kt | 260 ------------------ .../src/CoroutinesBlockHoundIntegration.kt | 3 - 5 files changed, 1 insertion(+), 302 deletions(-) delete mode 100644 kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt diff --git a/kotlinx-coroutines-core/README.md b/kotlinx-coroutines-core/README.md index c06cd358ad..38a112e89d 100644 --- a/kotlinx-coroutines-core/README.md +++ b/kotlinx-coroutines-core/README.md @@ -83,10 +83,6 @@ Select expression to perform multiple suspending operations simultaneously until Low-level primitives for finer-grained control of coroutines. -# Package kotlinx.coroutines.test - -Obsolete and deprecated module to test coroutines. Replaced with `kotlinx-coroutines-test` module. - diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 79f3cf4308..d227eb879b 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -1299,36 +1299,3 @@ public final class kotlinx/coroutines/sync/SemaphoreKt { public static final fun withPermit (Lkotlinx/coroutines/sync/Semaphore;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } -public final class kotlinx/coroutines/test/TestCoroutineContext : kotlin/coroutines/CoroutineContext { - public fun ()V - public fun (Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun advanceTimeBy (JLjava/util/concurrent/TimeUnit;)J - public static synthetic fun advanceTimeBy$default (Lkotlinx/coroutines/test/TestCoroutineContext;JLjava/util/concurrent/TimeUnit;ILjava/lang/Object;)J - public final fun advanceTimeTo (JLjava/util/concurrent/TimeUnit;)V - public static synthetic fun advanceTimeTo$default (Lkotlinx/coroutines/test/TestCoroutineContext;JLjava/util/concurrent/TimeUnit;ILjava/lang/Object;)V - public final fun assertAllUnhandledExceptions (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun assertAllUnhandledExceptions$default (Lkotlinx/coroutines/test/TestCoroutineContext;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun assertAnyUnhandledException (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun assertAnyUnhandledException$default (Lkotlinx/coroutines/test/TestCoroutineContext;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun assertExceptions (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun assertExceptions$default (Lkotlinx/coroutines/test/TestCoroutineContext;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun assertUnhandledException (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun assertUnhandledException$default (Lkotlinx/coroutines/test/TestCoroutineContext;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun cancelAllActions ()V - public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; - public final fun getExceptions ()Ljava/util/List; - public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; - public final fun now (Ljava/util/concurrent/TimeUnit;)J - public static synthetic fun now$default (Lkotlinx/coroutines/test/TestCoroutineContext;Ljava/util/concurrent/TimeUnit;ILjava/lang/Object;)J - public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; - public fun toString ()Ljava/lang/String; - public final fun triggerActions ()V -} - -public final class kotlinx/coroutines/test/TestCoroutineContextKt { - public static final fun withTestContext (Lkotlinx/coroutines/test/TestCoroutineContext;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun withTestContext$default (Lkotlinx/coroutines/test/TestCoroutineContext;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V -} - diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 78d2af14b2..9791b445bf 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -274,8 +274,7 @@ tasks.jvmLincheckTest { } def commonKoverExcludes = - ["kotlinx.coroutines.test.*", // Deprecated package for removal - "kotlinx.coroutines.debug.*", // Tested by debug module + ["kotlinx.coroutines.debug.*", // Tested by debug module "kotlinx.coroutines.channels.ChannelsKt__DeprecatedKt.*", // Deprecated "kotlinx.coroutines.scheduling.LimitingDispatcher", // Deprecated "kotlinx.coroutines.scheduling.ExperimentalCoroutineDispatcher" // Deprecated diff --git a/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt deleted file mode 100644 index 6a71a4deb4..0000000000 --- a/kotlinx-coroutines-core/jvm/src/test_/TestCoroutineContext.kt +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.internal.* -import java.util.concurrent.* -import kotlin.coroutines.* - -/** @suppress */ -@Deprecated("This API has been deprecated to integrate with Structured Concurrency.", - ReplaceWith("TestCoroutineScope", "kotlin.coroutines.test"), - level = DeprecationLevel.ERROR) // ERROR in 1.6.0, removed in 1.7.0 -public class TestCoroutineContext(private val name: String? = null) : CoroutineContext { - private val uncaughtExceptions = mutableListOf() - - private val ctxDispatcher = Dispatcher() - - private val ctxHandler = CoroutineExceptionHandler { _, exception -> - uncaughtExceptions += exception - } - - // The ordered queue for the runnable tasks. - private val queue = ThreadSafeHeap() - - // The per-scheduler global order counter. - private var counter = 0L - - // Storing time in nanoseconds internally. - private var time = 0L - - /** - * Exceptions that were caught during a [launch][CoroutineScope.launch] or a [async][CoroutineScope.async] + [Deferred.await]. - */ - public val exceptions: List get() = uncaughtExceptions - - // -- CoroutineContext implementation - - public override fun fold(initial: R, operation: (R, CoroutineContext.Element) -> R): R = - operation(operation(initial, ctxDispatcher), ctxHandler) - - @Suppress("UNCHECKED_CAST") - public override fun get(key: CoroutineContext.Key): E? = when { - key === ContinuationInterceptor -> ctxDispatcher as E - key === CoroutineExceptionHandler -> ctxHandler as E - else -> null - } - - public override fun minusKey(key: CoroutineContext.Key<*>): CoroutineContext = when { - key === ContinuationInterceptor -> ctxHandler - key === CoroutineExceptionHandler -> ctxDispatcher - else -> this - } - - /** - * Returns the current virtual clock-time as it is known to this CoroutineContext. - * - * @param unit The [TimeUnit] in which the clock-time must be returned. - * @return The virtual clock-time - */ - public fun now(unit: TimeUnit = TimeUnit.MILLISECONDS): Long= - unit.convert(time, TimeUnit.NANOSECONDS) - - /** - * Moves the CoroutineContext's virtual clock forward by a specified amount of time. - * - * The returned delay-time can be larger than the specified delay-time if the code - * under test contains *blocking* Coroutines. - * - * @param delayTime The amount of time to move the CoroutineContext's clock forward. - * @param unit The [TimeUnit] in which [delayTime] and the return value is expressed. - * @return The amount of delay-time that this CoroutineContext's clock has been forwarded. - */ - public fun advanceTimeBy(delayTime: Long, unit: TimeUnit = TimeUnit.MILLISECONDS): Long { - val oldTime = time - advanceTimeTo(oldTime + unit.toNanos(delayTime), TimeUnit.NANOSECONDS) - return unit.convert(time - oldTime, TimeUnit.NANOSECONDS) - } - - /** - * Moves the CoroutineContext's clock-time to a particular moment in time. - * - * @param targetTime The point in time to which to move the CoroutineContext's clock. - * @param unit The [TimeUnit] in which [targetTime] is expressed. - */ - public fun advanceTimeTo(targetTime: Long, unit: TimeUnit = TimeUnit.MILLISECONDS) { - val nanoTime = unit.toNanos(targetTime) - triggerActions(nanoTime) - if (nanoTime > time) time = nanoTime - } - - /** - * Triggers any actions that have not yet been triggered and that are scheduled to be triggered at or - * before this CoroutineContext's present virtual clock-time. - */ - public fun triggerActions(): Unit = triggerActions(time) - - /** - * Cancels all not yet triggered actions. Be careful calling this, since it can seriously - * mess with your coroutines work. This method should usually be called on tear-down of a - * unit test. - */ - public fun cancelAllActions() { - // An 'is-empty' test is required to avoid a NullPointerException in the 'clear()' method - if (!queue.isEmpty) queue.clear() - } - - /** - * This method does nothing if there is one unhandled exception that satisfies the given predicate. - * Otherwise it throws an [AssertionError] with the given message. - * - * (this method will clear the list of unhandled exceptions) - * - * @param message Message of the [AssertionError]. Defaults to an empty String. - * @param predicate The predicate that must be satisfied. - */ - public fun assertUnhandledException(message: String = "", predicate: (Throwable) -> Boolean) { - if (uncaughtExceptions.size != 1 || !predicate(uncaughtExceptions[0])) throw AssertionError(message) - uncaughtExceptions.clear() - } - - /** - * This method does nothing if there are no unhandled exceptions or all of them satisfy the given predicate. - * Otherwise it throws an [AssertionError] with the given message. - * - * (this method will clear the list of unhandled exceptions) - * - * @param message Message of the [AssertionError]. Defaults to an empty String. - * @param predicate The predicate that must be satisfied. - */ - public fun assertAllUnhandledExceptions(message: String = "", predicate: (Throwable) -> Boolean) { - if (!uncaughtExceptions.all(predicate)) throw AssertionError(message) - uncaughtExceptions.clear() - } - - /** - * This method does nothing if one or more unhandled exceptions satisfy the given predicate. - * Otherwise it throws an [AssertionError] with the given message. - * - * (this method will clear the list of unhandled exceptions) - * - * @param message Message of the [AssertionError]. Defaults to an empty String. - * @param predicate The predicate that must be satisfied. - */ - public fun assertAnyUnhandledException(message: String = "", predicate: (Throwable) -> Boolean) { - if (!uncaughtExceptions.any(predicate)) throw AssertionError(message) - uncaughtExceptions.clear() - } - - /** - * This method does nothing if the list of unhandled exceptions satisfy the given predicate. - * Otherwise it throws an [AssertionError] with the given message. - * - * (this method will clear the list of unhandled exceptions) - * - * @param message Message of the [AssertionError]. Defaults to an empty String. - * @param predicate The predicate that must be satisfied. - */ - public fun assertExceptions(message: String = "", predicate: (List) -> Boolean) { - if (!predicate(uncaughtExceptions)) throw AssertionError(message) - uncaughtExceptions.clear() - } - - private fun enqueue(block: Runnable) = - queue.addLast(TimedRunnableObsolete(block, counter++)) - - private fun postDelayed(block: Runnable, delayTime: Long) = - TimedRunnableObsolete(block, counter++, time + TimeUnit.MILLISECONDS.toNanos(delayTime)) - .also { - queue.addLast(it) - } - - private fun processNextEvent(): Long { - val current = queue.peek() - if (current != null) { - // Automatically advance time for EventLoop callbacks - triggerActions(current.time) - } - return if (queue.isEmpty) Long.MAX_VALUE else 0L - } - - private fun triggerActions(targetTime: Long) { - while (true) { - val current = queue.removeFirstIf { it.time <= targetTime } ?: break - // If the scheduled time is 0 (immediate) use current virtual time - if (current.time != 0L) time = current.time - current.run() - } - } - - public override fun toString(): String = name ?: "TestCoroutineContext@$hexAddress" - - private inner class Dispatcher : EventLoop(), Delay { - init { - incrementUseCount() // this event loop is never completed - } - - override fun dispatch(context: CoroutineContext, block: Runnable) { - this@TestCoroutineContext.enqueue(block) - } - - // override runBlocking to process this event loop - override fun shouldBeProcessedFromContext(): Boolean = true - - override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - postDelayed(Runnable { - with(continuation) { resumeUndispatched(Unit) } - }, timeMillis) - } - - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - val node = postDelayed(block, timeMillis) - return object : DisposableHandle { - override fun dispose() { - queue.remove(node) - } - } - } - - override fun processNextEvent() = this@TestCoroutineContext.processNextEvent() - - public override fun toString(): String = "Dispatcher(${this@TestCoroutineContext})" - } -} - -private class TimedRunnableObsolete( - private val run: Runnable, - private val count: Long = 0, - @JvmField internal val time: Long = 0 -) : Comparable, Runnable by run, ThreadSafeHeapNode { - override var heap: ThreadSafeHeap<*>? = null - override var index: Int = 0 - - override fun run() = run.run() - - override fun compareTo(other: TimedRunnableObsolete) = if (time == other.time) { - count.compareTo(other.count) - } else { - time.compareTo(other.time) - } - - override fun toString() = "TimedRunnable(time=$time, run=$run)" -} - -/** @suppress */ -@Deprecated("This API has been deprecated to integrate with Structured Concurrency.", - ReplaceWith("testContext.runBlockingTest(testBody)", "kotlin.coroutines.test"), - level = DeprecationLevel.ERROR) // ERROR in 1.6.0, removed in 1.7.0 -@Suppress("DEPRECATION_ERROR") -public fun withTestContext(testContext: TestCoroutineContext = TestCoroutineContext(), testBody: TestCoroutineContext.() -> Unit) { - with (testContext) { - testBody() - if (!exceptions.all { it is CancellationException }) { - throw AssertionError("Coroutine encountered unhandled exceptions:\n$exceptions") - } - } -} diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index 9cafffb038..28e3831f9e 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -77,9 +77,6 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { for (method in listOf("clear", "peek", "removeFirstOrNull", "addLast")) { allowBlockingCallsInside("kotlinx.coroutines.internal.ThreadSafeHeap", method) } - // [addLastIf] is only used in [EventLoop.common]. Users of [removeFirstIf]: - allowBlockingCallsInside("kotlinx.coroutines.test.TestCoroutineDispatcher", "doActionsUntil") - allowBlockingCallsInside("kotlinx.coroutines.test.TestCoroutineContext", "triggerActions") } private fun BlockHound.Builder.allowBlockingCallsInFlow() { From c5b5c660830489d6bd6f426de3b78b79fcdae41d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 24 May 2022 15:17:01 +0300 Subject: [PATCH 290/328] Give a bigger opportunity window for cancellation in our flaky tests (#3301) --- .../common/test/WithTimeoutOrNullDurationTest.kt | 4 ++-- kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt index 992a0b52cc..92dba7b32d 100644 --- a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt +++ b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullDurationTest.kt @@ -132,9 +132,9 @@ class WithTimeoutOrNullDurationTest : TestBase() { @Test fun testOuterTimeout() = runTest { var counter = 0 - val result = withTimeoutOrNull(250.milliseconds) { + val result = withTimeoutOrNull(320.milliseconds) { while (true) { - val inner = withTimeoutOrNull(100.milliseconds) { + val inner = withTimeoutOrNull(150.milliseconds) { while (true) { yield() } diff --git a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt index 90bcf2dac3..ee896c9bf0 100644 --- a/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt +++ b/kotlinx-coroutines-core/common/test/WithTimeoutOrNullTest.kt @@ -129,9 +129,9 @@ class WithTimeoutOrNullTest : TestBase() { @Test fun testOuterTimeout() = runTest { var counter = 0 - val result = withTimeoutOrNull(250) { + val result = withTimeoutOrNull(320) { while (true) { - val inner = withTimeoutOrNull(100) { + val inner = withTimeoutOrNull(150) { while (true) { yield() } From 937f430ff564abc408e50f997caf8b0051878230 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 24 May 2022 15:54:07 +0300 Subject: [PATCH 291/328] Tweak timeout for another Windows test --- kotlinx-coroutines-core/jvm/test/WithTimeoutOrNullJvmTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/test/WithTimeoutOrNullJvmTest.kt b/kotlinx-coroutines-core/jvm/test/WithTimeoutOrNullJvmTest.kt index 377fcf462e..cce77bb617 100644 --- a/kotlinx-coroutines-core/jvm/test/WithTimeoutOrNullJvmTest.kt +++ b/kotlinx-coroutines-core/jvm/test/WithTimeoutOrNullJvmTest.kt @@ -59,7 +59,7 @@ class WithTimeoutOrNullJvmTest : TestBase() { @Test fun testIgnoredTimeoutOnNullThrowsOnYield() = runTest { val value = withTimeoutOrNull(1) { - Thread.sleep(10) + Thread.sleep(75) yield() } assertNull(value) From c38ecb67dab68d9c27e7ba9514112949f60f1ece Mon Sep 17 00:00:00 2001 From: Egor Tolstoy Date: Tue, 24 May 2022 19:56:45 +0300 Subject: [PATCH 292/328] Update README.md (#3303) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c164d1236..f32dbbfe72 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # kotlinx.coroutines -[![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) +[![Kotlin Stable](https://kotl.in/badges/stable.svg)](https://kotlinlang.org/docs/components-stability.html) +[![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) From 9ea4fea065613cbebf04dc09a64186450831805a Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 25 May 2022 12:54:57 +0300 Subject: [PATCH 293/328] Mention swallowing CancellationExceptions in the docs (#3302) --- docs/topics/cancellation-and-timeouts.md | 50 ++++++++++++++++--- .../jvm/test/guide/example-cancel-03.kt | 16 +++--- .../jvm/test/guide/example-cancel-04.kt | 16 +++--- .../jvm/test/guide/example-cancel-05.kt | 6 +-- .../jvm/test/guide/example-cancel-06.kt | 20 ++++++-- .../jvm/test/guide/example-cancel-07.kt | 4 +- .../jvm/test/guide/example-cancel-08.kt | 26 +++------- .../jvm/test/guide/example-cancel-09.kt | 13 ++--- .../jvm/test/guide/example-cancel-10.kt | 36 +++++++++++++ .../test/guide/test/CancellationGuideTest.kt | 24 ++++----- 10 files changed, 137 insertions(+), 74 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/guide/example-cancel-10.kt diff --git a/docs/topics/cancellation-and-timeouts.md b/docs/topics/cancellation-and-timeouts.md index 43977a9b44..f2e642ab22 100644 --- a/docs/topics/cancellation-and-timeouts.md +++ b/docs/topics/cancellation-and-timeouts.md @@ -103,6 +103,42 @@ job: I'm sleeping 4 ... main: Now I can quit. --> +The same problem can be observed by catching a [CancellationException] and not rethrowing it: + +```kotlin +import kotlinx.coroutines.* + +fun main() = runBlocking { +//sampleStart + val job = launch(Dispatchers.Default) { + repeat(5) { i -> + try { + // print a message twice a second + println("job: I'm sleeping $i ...") + delay(500) + } catch (e: Exception) { + // log the exception + println(e) + } + } + } + delay(1300L) // delay a bit + println("main: I'm tired of waiting!") + job.cancelAndJoin() // cancels the job and waits for its completion + println("main: Now I can quit.") +//sampleEnd +} +``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} + +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt). +> +{type="note"} + +While catching `Exception` is an anti-pattern, this issue may surface in more subtle ways, like when using the +[`runCatching`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run-catching.html) function, +which does not know rethrow [CancellationException]. + ## Making computation code cancellable There are two approaches to making computation code cancellable. The first one is to periodically @@ -137,7 +173,7 @@ fun main() = runBlocking { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt). > {type="note"} @@ -182,7 +218,7 @@ fun main() = runBlocking { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt). > {type="note"} @@ -237,7 +273,7 @@ fun main() = runBlocking { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt). > {type="note"} @@ -275,7 +311,7 @@ fun main() = runBlocking { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt). > {type="note"} @@ -318,7 +354,7 @@ fun main() = runBlocking { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt). > {type="note"} @@ -378,7 +414,7 @@ fun main() { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt). > {type="note"} @@ -431,7 +467,7 @@ fun main() { ``` {kotlin-runnable="true" kotlin-min-compiler-version="1.3"} -> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt). +> You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-cancel-10.kt). > {type="note"} diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt index 3daaf49b36..2cf0770a7d 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-03.kt @@ -8,15 +8,15 @@ package kotlinx.coroutines.guide.exampleCancel03 import kotlinx.coroutines.* fun main() = runBlocking { - val startTime = currentTimeMillis() val job = launch(Dispatchers.Default) { - var nextPrintTime = startTime - var i = 0 - while (isActive) { // cancellable computation loop - // print a message twice a second - if (currentTimeMillis() >= nextPrintTime) { - println("job: I'm sleeping ${i++} ...") - nextPrintTime += 500L + repeat(5) { i -> + try { + // print a message twice a second + println("job: I'm sleeping $i ...") + delay(500) + } catch (e: Exception) { + // log the exception + println(e) } } } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt index b1b9a9bfd5..7d7f3bdee2 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-04.kt @@ -8,14 +8,16 @@ package kotlinx.coroutines.guide.exampleCancel04 import kotlinx.coroutines.* fun main() = runBlocking { - val job = launch { - try { - repeat(1000) { i -> - println("job: I'm sleeping $i ...") - delay(500L) + val startTime = currentTimeMillis() + val job = launch(Dispatchers.Default) { + var nextPrintTime = startTime + var i = 0 + while (isActive) { // cancellable computation loop + // print a message twice a second + if (currentTimeMillis() >= nextPrintTime) { + println("job: I'm sleeping ${i++} ...") + nextPrintTime += 500L } - } finally { - println("job: I'm running finally") } } delay(1300L) // delay a bit diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt index 9772ae5739..97ea956ec3 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-05.kt @@ -15,11 +15,7 @@ fun main() = runBlocking { delay(500L) } } finally { - withContext(NonCancellable) { - println("job: I'm running finally") - delay(1000L) - println("job: And I've just delayed for 1 sec because I'm non-cancellable") - } + println("job: I'm running finally") } } delay(1300L) // delay a bit diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt index e1afd057c4..ef66f5df09 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-06.kt @@ -8,10 +8,22 @@ package kotlinx.coroutines.guide.exampleCancel06 import kotlinx.coroutines.* fun main() = runBlocking { - withTimeout(1300L) { - repeat(1000) { i -> - println("I'm sleeping $i ...") - delay(500L) + val job = launch { + try { + repeat(1000) { i -> + println("job: I'm sleeping $i ...") + delay(500L) + } + } finally { + withContext(NonCancellable) { + println("job: I'm running finally") + delay(1000L) + println("job: And I've just delayed for 1 sec because I'm non-cancellable") + } } } + delay(1300L) // delay a bit + println("main: I'm tired of waiting!") + job.cancelAndJoin() // cancels the job and waits for its completion + println("main: Now I can quit.") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt index 8c57b42903..ea4a10353f 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-07.kt @@ -8,12 +8,10 @@ package kotlinx.coroutines.guide.exampleCancel07 import kotlinx.coroutines.* fun main() = runBlocking { - val result = withTimeoutOrNull(1300L) { + withTimeout(1300L) { repeat(1000) { i -> println("I'm sleeping $i ...") delay(500L) } - "Done" // will get cancelled before it produces this result } - println("Result is $result") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt index e7def132ae..79d08091c2 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-08.kt @@ -7,25 +7,13 @@ package kotlinx.coroutines.guide.exampleCancel08 import kotlinx.coroutines.* -var acquired = 0 - -class Resource { - init { acquired++ } // Acquire the resource - fun close() { acquired-- } // Release the resource -} - -fun main() { - runBlocking { - repeat(100_000) { // Launch 100K coroutines - launch { - val resource = withTimeout(60) { // Timeout of 60 ms - delay(50) // Delay for 50 ms - Resource() // Acquire a resource and return it from withTimeout block - } - resource.close() // Release the resource - } +fun main() = runBlocking { + val result = withTimeoutOrNull(1300L) { + repeat(1000) { i -> + println("I'm sleeping $i ...") + delay(500L) } + "Done" // will get cancelled before it produces this result } - // Outside of runBlocking all coroutines have completed - println(acquired) // Print the number of resources still acquired + println("Result is $result") } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt index 95424f5108..13910a6c8a 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-09.kt @@ -18,16 +18,11 @@ fun main() { runBlocking { repeat(100_000) { // Launch 100K coroutines launch { - var resource: Resource? = null // Not acquired yet - try { - withTimeout(60) { // Timeout of 60 ms - delay(50) // Delay for 50 ms - resource = Resource() // Store a resource to the variable if acquired - } - // We can do something else with the resource here - } finally { - resource?.close() // Release the resource if it was acquired + val resource = withTimeout(60) { // Timeout of 60 ms + delay(50) // Delay for 50 ms + Resource() // Acquire a resource and return it from withTimeout block } + resource.close() // Release the resource } } } diff --git a/kotlinx-coroutines-core/jvm/test/guide/example-cancel-10.kt b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-10.kt new file mode 100644 index 0000000000..336f5e3a3a --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/guide/example-cancel-10.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +// This file was automatically generated from cancellation-and-timeouts.md by Knit tool. Do not edit. +package kotlinx.coroutines.guide.exampleCancel10 + +import kotlinx.coroutines.* + +var acquired = 0 + +class Resource { + init { acquired++ } // Acquire the resource + fun close() { acquired-- } // Release the resource +} + +fun main() { + runBlocking { + repeat(100_000) { // Launch 100K coroutines + launch { + var resource: Resource? = null // Not acquired yet + try { + withTimeout(60) { // Timeout of 60 ms + delay(50) // Delay for 50 ms + resource = Resource() // Store a resource to the variable if acquired + } + // We can do something else with the resource here + } finally { + resource?.close() // Release the resource if it was acquired + } + } + } + } + // Outside of runBlocking all coroutines have completed + println(acquired) // Print the number of resources still acquired +} diff --git a/kotlinx-coroutines-core/jvm/test/guide/test/CancellationGuideTest.kt b/kotlinx-coroutines-core/jvm/test/guide/test/CancellationGuideTest.kt index 0cff63a834..871e4911e8 100644 --- a/kotlinx-coroutines-core/jvm/test/guide/test/CancellationGuideTest.kt +++ b/kotlinx-coroutines-core/jvm/test/guide/test/CancellationGuideTest.kt @@ -34,8 +34,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel03() { - test("ExampleCancel03") { kotlinx.coroutines.guide.exampleCancel03.main() }.verifyLines( + fun testExampleCancel04() { + test("ExampleCancel04") { kotlinx.coroutines.guide.exampleCancel04.main() }.verifyLines( "job: I'm sleeping 0 ...", "job: I'm sleeping 1 ...", "job: I'm sleeping 2 ...", @@ -45,8 +45,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel04() { - test("ExampleCancel04") { kotlinx.coroutines.guide.exampleCancel04.main() }.verifyLines( + fun testExampleCancel05() { + test("ExampleCancel05") { kotlinx.coroutines.guide.exampleCancel05.main() }.verifyLines( "job: I'm sleeping 0 ...", "job: I'm sleeping 1 ...", "job: I'm sleeping 2 ...", @@ -57,8 +57,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel05() { - test("ExampleCancel05") { kotlinx.coroutines.guide.exampleCancel05.main() }.verifyLines( + fun testExampleCancel06() { + test("ExampleCancel06") { kotlinx.coroutines.guide.exampleCancel06.main() }.verifyLines( "job: I'm sleeping 0 ...", "job: I'm sleeping 1 ...", "job: I'm sleeping 2 ...", @@ -70,8 +70,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel06() { - test("ExampleCancel06") { kotlinx.coroutines.guide.exampleCancel06.main() }.verifyLinesStartWith( + fun testExampleCancel07() { + test("ExampleCancel07") { kotlinx.coroutines.guide.exampleCancel07.main() }.verifyLinesStartWith( "I'm sleeping 0 ...", "I'm sleeping 1 ...", "I'm sleeping 2 ...", @@ -80,8 +80,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel07() { - test("ExampleCancel07") { kotlinx.coroutines.guide.exampleCancel07.main() }.verifyLines( + fun testExampleCancel08() { + test("ExampleCancel08") { kotlinx.coroutines.guide.exampleCancel08.main() }.verifyLines( "I'm sleeping 0 ...", "I'm sleeping 1 ...", "I'm sleeping 2 ...", @@ -90,8 +90,8 @@ class CancellationGuideTest { } @Test - fun testExampleCancel09() { - test("ExampleCancel09") { kotlinx.coroutines.guide.exampleCancel09.main() }.verifyLines( + fun testExampleCancel10() { + test("ExampleCancel10") { kotlinx.coroutines.guide.exampleCancel10.main() }.verifyLines( "0" ) } From eb9dd554df5d069f68af741988427168a8428abe Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 25 May 2022 23:01:14 +0300 Subject: [PATCH 294/328] Version 1.6.2 --- CHANGES.md | 10 ++++++++++ README.md | 12 ++++++------ gradle.properties | 2 +- gradle/publish-npm-js.gradle | 22 ++++++++++------------ kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2aba4abf59..024d1d0807 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,15 @@ # Change log for kotlinx.coroutines +## Version 1.6.2 + +* Fixed a bug with `ThreadLocalElement` not being correctly updated when the most outer `suspend` function was called directly without `kotlinx.coroutines` (#2930). +* Fixed multiple data races: one that might have been affecting `runBlocking` event loop, and a benign data race in `Mutex` (#3250, #3251). +* Obsolete `TestCoroutineContext` is removed, which fixes the `kotlinx-coroutines-test` JPMS package being split between `kotlinx-coroutines-core` and `kotlinx-coroutines-test` (#3218). +* Updated the ProGuard rules to further shrink the size of the resulting DEX file with coroutines (#3111, #3263). Thanks, @agrieve! +* Atomicfu is updated to `0.17.2`, which includes a more efficient and robust JS IR transformer (#3255). +* Kotlin is updated to `1.6.21`, Gradle version is updated to `7.4.2` (#3281). Thanks, @wojtek-kalicinski! +* Various documentation improvements. + ## Version 1.6.1 * Rollback of time-related functions dispatching on `Dispatchers.Main`. diff --git a/README.md b/README.md index 6fb614c084..41f461dc90 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Kotlin Stable](https://kotl.in/badges/stable.svg)](https://kotlinlang.org/docs/components-stability.html) [![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.2)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.2/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -84,7 +84,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.6.1 + 1.6.2 ``` @@ -102,7 +102,7 @@ Add dependencies (you can also add other modules that you need): ```kotlin dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2") } ``` @@ -132,7 +132,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```kotlin -implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1") +implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2") ``` This gives you access to the Android [Dispatchers.Main] @@ -167,7 +167,7 @@ In common code that should get compiled for different platforms, you can add a d ```kotlin commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2") } } ``` @@ -179,7 +179,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.1/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.2/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index 404e79b4fc..8e96d1605d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.6.1-SNAPSHOT +version=1.6.2-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.21 diff --git a/gradle/publish-npm-js.gradle b/gradle/publish-npm-js.gradle index 382c6749ca..9d4152770c 100644 --- a/gradle/publish-npm-js.gradle +++ b/gradle/publish-npm-js.gradle @@ -40,17 +40,15 @@ task preparePublishNpm(type: Copy) { task publishNpm(type: NpmTask, dependsOn: [preparePublishNpm]) { workingDir = npmDeployDir - - doFirst { - def npmDeployTag = distTag(version) - def deployArgs = ['publish', - "--//registry.npmjs.org/:_authToken=$authToken", - "--tag=$npmDeployTag"] - if (dryRun == "true") { - println("$npmDeployDir \$ npm arguments: $deployArgs") - args = ['pack'] - } else { - args = deployArgs - } + + def npmDeployTag = distTag(version) + def deployArgs = ['publish', + "--//registry.npmjs.org/:_authToken=$authToken", + "--tag=$npmDeployTag"] + if (dryRun == "true") { + println("$npmDeployDir \$ npm arguments: $deployArgs") + args = ['pack'] + } else { + args = deployArgs } } diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 78a217e692..ab8704fb28 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.1.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.2.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 360c3bf178..403a89a4d3 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -26,7 +26,7 @@ Provided [TestDispatcher] implementations: Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index fd4fcf0f72..a9ebc1f940 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 110ca3deb6be320c235bb8af3854ef10e6e53307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Braun?= Date: Mon, 30 May 2022 11:38:41 +0200 Subject: [PATCH 295/328] Update docs about creating custom CoroutineScopes (#3306) --- kotlinx-coroutines-core/common/src/CoroutineScope.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineScope.kt b/kotlinx-coroutines-core/common/src/CoroutineScope.kt index 737c56e1d5..b0928d5c58 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineScope.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineScope.kt @@ -42,14 +42,14 @@ import kotlin.coroutines.intrinsics.* * ### Custom usage * * `CoroutineScope` should be declared as a property on entities with a well-defined lifecycle that are - * responsible for launching children coroutines. The corresponding instance of `CoroutineScope` shall be created - * with either `CoroutineScope()` or `MainScope()` functions. The difference between them is only in the - * [CoroutineDispatcher]: + * responsible for launching child coroutines. The corresponding instance of `CoroutineScope` shall be created + * with either `CoroutineScope()` or `MainScope()`: * - * * `CoroutineScope()` uses [Dispatchers.Default] for its coroutines. - * * `MainScope()` uses [Dispatchers.Main] for its coroutines. + * * `CoroutineScope()` uses the [context][CoroutineContext] provided to it as a parameter for its coroutines + * and adds a [Job] if one is not provided as part of the context. + * * `MainScope()` uses [Dispatchers.Main] for its coroutines and has a [SupervisorJob]. * - * **The key part of custom usage of `CustomScope` is cancelling it at the end of the lifecycle.** + * **The key part of custom usage of `CoroutineScope` is cancelling it at the end of the lifecycle.** * The [CoroutineScope.cancel] extension function shall be used when the entity that was launching coroutines * is no longer needed. It cancels all the coroutines that might still be running on behalf of it. * From cc5b86a73d6e53c570e449a3333aa8d19ca2c1e2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 7 Jun 2022 15:32:35 +0300 Subject: [PATCH 296/328] Remove NPM validation (#3312) We will drop complete support of NPM as soon as JS IR is declared stable and this test is already a deadweight as it was never run due to misconfiguration --- integration-testing/build.gradle | 23 +----- .../npmTest/kotlin/NpmPublicationValidator.kt | 71 ------------------- 2 files changed, 1 insertion(+), 93 deletions(-) delete mode 100644 integration-testing/src/npmTest/kotlin/NpmPublicationValidator.kt diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index 4e025c58dc..97c9201b69 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -14,11 +14,6 @@ repositories { } sourceSets { - npmTest { - kotlin - compileClasspath += sourceSets.test.runtimeClasspath - runtimeClasspath += sourceSets.test.runtimeClasspath - } mavenTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -43,20 +38,6 @@ compileDebugAgentTestKotlin { } } -task npmTest(type: Test) { - def sourceSet = sourceSets.npmTest - environment "projectRoot", project.rootDir - environment "deployVersion", version - def dryRunNpm = project.properties['dryRun'] - def doRun = dryRunNpm == "true" // so that we don't accidentally publish anything, especially before the test - onlyIf { doRun } - if (doRun) { // `onlyIf` only affects execution of the task, not the dependency subtree - dependsOn(project(':').getTasksByName("publishNpm", true)) - } - testClassesDirs = sourceSet.output.classesDirs - classpath = sourceSet.runtimeClasspath -} - task mavenTest(type: Test) { environment "version", version def sourceSet = sourceSets.mavenTest @@ -96,8 +77,6 @@ task coreAgentTest(type: Test) { dependencies { testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" testImplementation 'junit:junit:4.12' - npmTestImplementation 'org.apache.commons:commons-compress:1.18' - npmTestImplementation 'com.google.code.gson:gson:2.8.5' debugAgentTestImplementation project(':kotlinx-coroutines-core') debugAgentTestImplementation project(':kotlinx-coroutines-debug') coreAgentTestImplementation project(':kotlinx-coroutines-core') @@ -108,5 +87,5 @@ compileTestKotlin { } check { - dependsOn([npmTest, mavenTest, debugAgentTest, coreAgentTest]) + dependsOn([mavenTest, debugAgentTest, coreAgentTest]) } diff --git a/integration-testing/src/npmTest/kotlin/NpmPublicationValidator.kt b/integration-testing/src/npmTest/kotlin/NpmPublicationValidator.kt deleted file mode 100644 index 8e1b9f99bf..0000000000 --- a/integration-testing/src/npmTest/kotlin/NpmPublicationValidator.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.coroutines.validator - -import com.google.gson.* -import org.apache.commons.compress.archivers.tar.* -import org.junit.* -import java.io.* -import java.util.zip.* -import org.junit.Assert.* - -class NpmPublicationValidator { - private val VERSION = System.getenv("deployVersion")!! - private val BUILD_DIR = System.getenv("projectRoot")!! - private val NPM_ARTIFACT = "$BUILD_DIR/kotlinx-coroutines-core/build/npm/kotlinx-coroutines-core-$VERSION.tgz" - - @Test - fun testPackageJson() { - println("Checking dependencies of $NPM_ARTIFACT") - val visited = visit("package.json") { - val json = JsonParser().parse(content()).asJsonObject - assertEquals(VERSION, json["version"].asString) - assertNull(json["dependencies"]) - val peerDependencies = json["peerDependencies"].asJsonObject - assertEquals(1, peerDependencies.size()) - assertNotNull(peerDependencies["kotlin"]) - } - assertEquals(1, visited) - } - - @Test - fun testAtomicfuDependencies() { - println("Checking contents of $NPM_ARTIFACT") - val visited = visit(".js") { - val content = content() - assertFalse(content, content.contains("atomicfu", true)) - assertFalse(content, content.contains("atomicint", true)) - assertFalse(content, content.contains("atomicboolean", true)) - } - assertEquals(2, visited) - } - - private fun InputStream.content(): String { - val bais = ByteArrayOutputStream() - val buffer = ByteArray(DEFAULT_BUFFER_SIZE) - var read = read(buffer, 0, DEFAULT_BUFFER_SIZE) - while (read >= 0) { - bais.write(buffer, 0, read) - read = read(buffer, 0, DEFAULT_BUFFER_SIZE) - } - return bais.toString() - } - - private inline fun visit(fileSuffix: String, block: InputStream.(entry: TarArchiveEntry) -> Unit): Int { - var visited = 0 - TarArchiveInputStream(GZIPInputStream(FileInputStream(NPM_ARTIFACT))).use { tais -> - var entry: TarArchiveEntry? = tais.nextTarEntry ?: return 0 - do { - if (entry!!.name.endsWith(fileSuffix)) { - ++visited - tais.block(entry) - } - entry = tais.nextTarEntry - } while (entry != null) - - return visited - } - } -} From aedbcc7c2d409e8ec5c038984eb4c0c7017d291b Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 7 Jun 2022 16:10:39 +0300 Subject: [PATCH 297/328] Clarify implementation contract of ThreadContextElement and CopyableThreadContextElement (#3314) --- .../src/MDCContext.kt | 2 +- .../jvm/src/ThreadContextElement.kt | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/integration/kotlinx-coroutines-slf4j/src/MDCContext.kt b/integration/kotlinx-coroutines-slf4j/src/MDCContext.kt index 9f165fdd50..0fbfece600 100644 --- a/integration/kotlinx-coroutines-slf4j/src/MDCContext.kt +++ b/integration/kotlinx-coroutines-slf4j/src/MDCContext.kt @@ -28,7 +28,7 @@ public typealias MDCContextMap = Map? * } * ``` * - * Note that you cannot update MDC context from inside of the coroutine simply + * Note that you cannot update MDC context from inside the coroutine simply * using [MDC.put]. These updates are going to be lost on the next suspension and * reinstalled to the MDC context that was captured or explicitly specified in * [contextMap] when this object was created on the next resumption. diff --git a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt index d2b6b6b988..bfe999589b 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt @@ -48,6 +48,15 @@ import kotlin.coroutines.* * this coroutine suspends. * * To use [ThreadLocal] variable within the coroutine use [ThreadLocal.asContextElement][asContextElement] function. + * + * ### Reentrancy and thread-safety + * + * Correct implementations of this interface must expect that calls to [restoreThreadContext] + * may happen in parallel to the subsequent [updateThreadContext] and [restoreThreadContext] operations. + * See [CopyableThreadContextElement] for advanced interleaving details. + * + * All implementations of [ThreadContextElement] should be thread-safe and guard their internal mutable state + * within an element accordingly. */ public interface ThreadContextElement : CoroutineContext.Element { /** @@ -133,6 +142,27 @@ public interface ThreadContextElement : CoroutineContext.Element { * * A coroutine using this mechanism can safely call Java code that assumes the corresponding thread local element's * value is installed into the target thread local. + * + * ### Reentrancy and thread-safety + * + * Correct implementations of this interface must expect that calls to [restoreThreadContext] + * may happen in parallel to the subsequent [updateThreadContext] and [restoreThreadContext] operations. + * + * Even though an element is copied for each child coroutine, an implementation should be able to handle the following + * interleaving when a coroutine with the corresponding element is launched on a multithreaded dispatcher: + * + * ``` + * coroutine.updateThreadContext() // Thread #1 + * ... coroutine body ... + * // suspension + immediate dispatch happen here + * coroutine.updateThreadContext() // Thread #2, coroutine is already resumed + * // ... coroutine body after suspension point on Thread #2 ... + * coroutine.restoreThreadContext() // Thread #1, is invoked late because Thread #1 is slow + * coroutine.restoreThreadContext() // Thread #2, may happen in parallel with the previous restore + * ``` + * + * All implementations of [CopyableThreadContextElement] should be thread-safe and guard their internal mutable state + * within an element accordingly. */ @DelicateCoroutinesApi @ExperimentalCoroutinesApi From c4cd1fd5ad708424b6c888bac2a3692ecd0d2585 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 7 Jun 2022 16:52:14 +0300 Subject: [PATCH 298/328] Update withContext KDoc (#3309) Fixes #3167 --- .../common/src/Builders.common.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Builders.common.kt b/kotlinx-coroutines-core/common/src/Builders.common.kt index c360724245..3dea68cfde 100644 --- a/kotlinx-coroutines-core/common/src/Builders.common.kt +++ b/kotlinx-coroutines-core/common/src/Builders.common.kt @@ -126,12 +126,15 @@ private class LazyDeferredCoroutine( * This suspending function is cancellable. It immediately checks for cancellation of * the resulting context and throws [CancellationException] if it is not [active][CoroutineContext.isActive]. * - * This function uses dispatcher from the new context, shifting execution of the [block] into the - * different thread if a new dispatcher is specified, and back to the original dispatcher - * when it completes. Note that the result of `withContext` invocation is - * dispatched into the original context in a cancellable way with a **prompt cancellation guarantee**, - * which means that if the original [coroutineContext], in which `withContext` was invoked, - * is cancelled by the time its dispatcher starts to execute the code, + * Calls to [withContext] whose [context] argument provides a [CoroutineDispatcher] that is + * different from the current one, by necessity, perform additional dispatches: the [block] + * can not be executed immediately and needs to be dispatched for execution on + * the passed [CoroutineDispatcher], and then when the [block] completes, the execution + * has to shift back to the original dispatcher. + * + * Note that the result of `withContext` invocation is dispatched into the original context in a cancellable way + * with a **prompt cancellation guarantee**, which means that if the original [coroutineContext] + * in which `withContext` was invoked is cancelled by the time its dispatcher starts to execute the code, * it discards the result of `withContext` and throws [CancellationException]. * * The cancellation behaviour described above is enabled if and only if the dispatcher is being changed. From 59994e2339af8a52bbfc021de648c4836a9abc83 Mon Sep 17 00:00:00 2001 From: Roland Illig Date: Fri, 10 Jun 2022 10:34:42 +0200 Subject: [PATCH 299/328] Fix typos in Cancellation and Timeouts docs (#3317) --- docs/topics/cancellation-and-timeouts.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/topics/cancellation-and-timeouts.md b/docs/topics/cancellation-and-timeouts.md index f2e642ab22..47f465ad60 100644 --- a/docs/topics/cancellation-and-timeouts.md +++ b/docs/topics/cancellation-and-timeouts.md @@ -137,7 +137,7 @@ fun main() = runBlocking { While catching `Exception` is an anti-pattern, this issue may surface in more subtle ways, like when using the [`runCatching`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run-catching.html) function, -which does not know rethrow [CancellationException]. +which does not rethrow [CancellationException]. ## Making computation code cancellable @@ -190,8 +190,8 @@ main: Now I can quit. ## Closing resources with `finally` -Cancellable suspending functions throw [CancellationException] on cancellation which can be handled in -the usual way. For example, `try {...} finally {...}` expression and Kotlin `use` function execute their +Cancellable suspending functions throw [CancellationException] on cancellation, which can be handled in +the usual way. For example, the `try {...} finally {...}` expression and Kotlin's `use` function execute their finalization actions normally when a coroutine is cancelled: ```kotlin @@ -423,13 +423,13 @@ fun main() { If you run the above code you'll see that it does not always print zero, though it may depend on the timings of your machine you may need to tweak timeouts in this example to actually see non-zero values. -> Note, that incrementing and decrementing `acquired` counter here from 100K coroutines is completely safe, +> Note that incrementing and decrementing `acquired` counter here from 100K coroutines is completely safe, > since it always happens from the same main thread. More on that will be explained in the chapter > on coroutine context. > {type="note"} -To workaround this problem you can store a reference to the resource in the variable as opposed to returning it +To work around this problem you can store a reference to the resource in the variable as opposed to returning it from the `withTimeout` block. ```kotlin From f101f93ed1cacfe53fc5521ab21e70742eec640c Mon Sep 17 00:00:00 2001 From: mvicsokolova <82594708+mvicsokolova@users.noreply.github.com> Date: Wed, 15 Jun 2022 20:22:16 +0300 Subject: [PATCH 300/328] Integration test project (#3307) Test for #3305 Co-authored-by: Vsevolod Tolstopyatov Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- buildSrc/src/main/kotlin/Projects.kt | 4 +- bump-version.sh | 1 + integration-testing/README.md | 15 +- integration-testing/build.gradle | 58 ++--- integration-testing/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + integration-testing/gradlew | 234 ++++++++++++++++++ integration-testing/gradlew.bat | 89 +++++++ integration-testing/settings.gradle | 19 ++ integration-testing/smokeTest/build.gradle | 43 ++++ .../smokeTest/src/commonMain/kotlin/Sample.kt | 9 + .../src/commonTest/kotlin/SampleTest.kt | 13 + .../kotlin/PrecompiledDebugProbesTest.kt | 13 +- .../jvm/resources/DebugProbesKt.bin | Bin 1719 -> 1738 bytes settings.gradle | 2 - 16 files changed, 462 insertions(+), 47 deletions(-) create mode 100644 integration-testing/gradle.properties create mode 100644 integration-testing/gradle/wrapper/gradle-wrapper.jar create mode 100644 integration-testing/gradle/wrapper/gradle-wrapper.properties create mode 100755 integration-testing/gradlew create mode 100644 integration-testing/gradlew.bat create mode 100644 integration-testing/settings.gradle create mode 100644 integration-testing/smokeTest/build.gradle create mode 100644 integration-testing/smokeTest/src/commonMain/kotlin/Sample.kt create mode 100644 integration-testing/smokeTest/src/commonTest/kotlin/SampleTest.kt diff --git a/buildSrc/src/main/kotlin/Projects.kt b/buildSrc/src/main/kotlin/Projects.kt index d19e00ca46..af7098935d 100644 --- a/buildSrc/src/main/kotlin/Projects.kt +++ b/buildSrc/src/main/kotlin/Projects.kt @@ -12,8 +12,8 @@ val testModule = "kotlinx-coroutines-test" val multiplatform = setOf(coreModule, testModule) // Not applicable for Kotlin plugin -val sourceless = setOf("kotlinx.coroutines", "kotlinx-coroutines-bom", "integration-testing") -val internal = setOf("kotlinx.coroutines", "benchmarks", "integration-testing") +val sourceless = setOf("kotlinx.coroutines", "kotlinx-coroutines-bom") +val internal = setOf("kotlinx.coroutines", "benchmarks") // Not published val unpublished = internal + setOf("example-frontend-js", "android-unit-tests") diff --git a/bump-version.sh b/bump-version.sh index ae0fc0b02c..e49910f428 100755 --- a/bump-version.sh +++ b/bump-version.sh @@ -21,6 +21,7 @@ update_version "kotlinx-coroutines-debug/README.md" update_version "kotlinx-coroutines-test/README.md" update_version "ui/coroutines-guide-ui.md" update_version "gradle.properties" +update_version "integration-test/gradle.properties" # Escape dots, e.g. 1.0.0 -> 1\.0\.0 escaped_old_version=$(echo $old_version | sed s/[.]/\\\\./g) diff --git a/integration-testing/README.md b/integration-testing/README.md index 4754081a45..0ede9b254e 100644 --- a/integration-testing/README.md +++ b/integration-testing/README.md @@ -1,14 +1,13 @@ # Integration tests -This is a supplementary subproject of kotlinx.coroutines that provides -integration tests. +This is a supplementary project that provides integration tests. The tests are the following: -* `NpmPublicationValidator` tests that version of NPM artifact is correct and that it has neither source nor package dependencies on atomicfu - In order for the test to work, one needs to run gradle with `-PdryRun=true`. - `-PdryRun` affects `npmPublish` so that it only provides a packed publication - and does not in fact attempt to send the build for publication. -* `MavenPublicationValidator` depends on the published artifacts and tests artifacts binary content and absence of atomicfu in the classpath +* `MavenPublicationValidator` depends on the published artifacts and tests artifacts binary content and absence of atomicfu in the classpath. +* `CoreAgentTest` checks that `kotlinx-coroutines-core` can be run as a Java agent. * `DebugAgentTest` checks that the coroutine debugger can be run as a Java agent. +* `smokeTest` builds the test project that depends on coroutines. -All the available tests can be run with `integration-testing:test`. +The `integration-testing` project is expected to be in a subdirectory of the main `kotlinx.coroutines` project. + +To run all the available tests: `cd integration-testing` + `./gradlew check`. diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index 97c9201b69..60b6cdcd07 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType plugins { - id("kotlin-jvm-conventions") + id "org.jetbrains.kotlin.jvm" } repositories { @@ -13,22 +13,44 @@ repositories { mavenCentral() } +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version" +} + sourceSets { mavenTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath + + dependencies { + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" + } } debugAgentTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath - } + dependencies { + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-debug:$coroutines_version" + } + } coreAgentTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath + + dependencies { + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + } } } @@ -39,28 +61,16 @@ compileDebugAgentTestKotlin { } task mavenTest(type: Test) { - environment "version", version + environment "version", coroutines_version def sourceSet = sourceSets.mavenTest - dependsOn(project(':').getTasksByName("publishToMavenLocal", true)) testClassesDirs = sourceSet.output.classesDirs classpath = sourceSet.runtimeClasspath - // we can't depend on the subprojects because we need to test the classfiles that are published in the end. - // also, we can't put this in the `dependencies` block because the resolution would happen before publication. - def mavenTestClasspathConfiguration = project.configurations.detachedConfiguration( - project.dependencies.create("org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"), - project.dependencies.create("org.jetbrains.kotlinx:kotlinx-coroutines-android:$version")) - - mavenTestClasspathConfiguration.attributes { - attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm) - } - - classpath += mavenTestClasspathConfiguration } task debugAgentTest(type: Test) { def sourceSet = sourceSets.debugAgentTest - dependsOn(project(':kotlinx-coroutines-debug').shadowJar) - jvmArgs ('-javaagent:' + project(':kotlinx-coroutines-debug').shadowJar.outputs.files.getFiles()[0]) + def coroutinesDebugJar = sourceSet.runtimeClasspath.filter {it.name == "kotlinx-coroutines-debug-${coroutines_version}.jar" }.singleFile + jvmArgs ('-javaagent:' + coroutinesDebugJar) testClassesDirs = sourceSet.output.classesDirs classpath = sourceSet.runtimeClasspath systemProperties project.properties.subMap(["overwrite.probes"]) @@ -68,24 +78,16 @@ task debugAgentTest(type: Test) { task coreAgentTest(type: Test) { def sourceSet = sourceSets.coreAgentTest - dependsOn(project(':kotlinx-coroutines-core').jvmJar) - jvmArgs ('-javaagent:' + project(':kotlinx-coroutines-core').jvmJar.outputs.files.getFiles()[0]) + def coroutinesCoreJar = sourceSet.runtimeClasspath.filter {it.name == "kotlinx-coroutines-core-jvm-${coroutines_version}.jar" }.singleFile + jvmArgs ('-javaagent:' + coroutinesCoreJar) testClassesDirs = sourceSet.output.classesDirs classpath = sourceSet.runtimeClasspath } -dependencies { - testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - testImplementation 'junit:junit:4.12' - debugAgentTestImplementation project(':kotlinx-coroutines-core') - debugAgentTestImplementation project(':kotlinx-coroutines-debug') - coreAgentTestImplementation project(':kotlinx-coroutines-core') -} - compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } check { - dependsOn([mavenTest, debugAgentTest, coreAgentTest]) + dependsOn([mavenTest, debugAgentTest, coreAgentTest, 'smokeTest:build']) } diff --git a/integration-testing/gradle.properties b/integration-testing/gradle.properties new file mode 100644 index 0000000000..d89f46c1f6 --- /dev/null +++ b/integration-testing/gradle.properties @@ -0,0 +1,4 @@ +kotlin_version=1.6.21 +coroutines_version=1.6.2-SNAPSHOT + +kotlin.code.style=official diff --git a/integration-testing/gradle/wrapper/gradle-wrapper.jar b/integration-testing/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/integration-testing/gradle/wrapper/gradle-wrapper.properties b/integration-testing/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..92f06b50fd --- /dev/null +++ b/integration-testing/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/integration-testing/gradlew b/integration-testing/gradlew new file mode 100755 index 0000000000..1b6c787337 --- /dev/null +++ b/integration-testing/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/integration-testing/gradlew.bat b/integration-testing/gradlew.bat new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/integration-testing/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/integration-testing/settings.gradle b/integration-testing/settings.gradle new file mode 100644 index 0000000000..67336c9880 --- /dev/null +++ b/integration-testing/settings.gradle @@ -0,0 +1,19 @@ +pluginManagement { + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.jetbrains.kotlin.multiplatform" || requested.id.id == "org.jetbrains.kotlin.jvm") { + useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } + } + } + + repositories { + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } + mavenLocal() + } +} + +include 'smokeTest' + +rootProject.name = "kotlinx-coroutines-integration-testing" diff --git a/integration-testing/smokeTest/build.gradle b/integration-testing/smokeTest/build.gradle new file mode 100644 index 0000000000..ae400e26a3 --- /dev/null +++ b/integration-testing/smokeTest/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'org.jetbrains.kotlin.multiplatform' +} + +repositories { + // Coroutines from the outer project are published by previous CI buils step + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() + js(IR) { + browser() + } + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib-common') + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version" + } + } + jsTest { + dependencies { + implementation kotlin('test-js') + } + } + jvmTest { + dependencies { + implementation kotlin('test') + implementation kotlin('test-junit') + } + } + } +} diff --git a/integration-testing/smokeTest/src/commonMain/kotlin/Sample.kt b/integration-testing/smokeTest/src/commonMain/kotlin/Sample.kt new file mode 100644 index 0000000000..c5da677bb1 --- /dev/null +++ b/integration-testing/smokeTest/src/commonMain/kotlin/Sample.kt @@ -0,0 +1,9 @@ +import kotlinx.coroutines.* + +suspend fun doWorld() = coroutineScope { + launch { + delay(1000L) + println("World!") + } + println("Hello") +} diff --git a/integration-testing/smokeTest/src/commonTest/kotlin/SampleTest.kt b/integration-testing/smokeTest/src/commonTest/kotlin/SampleTest.kt new file mode 100644 index 0000000000..a8c6598e88 --- /dev/null +++ b/integration-testing/smokeTest/src/commonTest/kotlin/SampleTest.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import kotlinx.coroutines.test.* +import kotlin.test.* + +class SampleTest { + @Test + fun test() = runTest { + doWorld() + } +} diff --git a/integration-testing/src/debugAgentTest/kotlin/PrecompiledDebugProbesTest.kt b/integration-testing/src/debugAgentTest/kotlin/PrecompiledDebugProbesTest.kt index ce82e577ca..84886a18ab 100644 --- a/integration-testing/src/debugAgentTest/kotlin/PrecompiledDebugProbesTest.kt +++ b/integration-testing/src/debugAgentTest/kotlin/PrecompiledDebugProbesTest.kt @@ -20,20 +20,19 @@ class PrecompiledDebugProbesTest { val classFileResourcePath = className.replace(".", "/") + ".class" val stream = clz.classLoader.getResourceAsStream(classFileResourcePath)!! val array = stream.readBytes() - val binFile = clz.classLoader.getResourceAsStream("DebugProbesKt.bin")!! - val binContent = binFile.readBytes() + // we expect the integration testing project to be in a subdirectory of the main kotlinx.coroutines project + val base = File("").absoluteFile.parentFile + val probes = File(base, "kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin") + val binContent = probes.readBytes() if (overwrite) { - val url = clz.classLoader.getResource("DebugProbesKt.bin")!! - val base = url.toExternalForm().toString().removePrefix("jar:file:").substringBefore("/build") - val probes = File(base, "jvm/resources/DebugProbesKt.bin") FileOutputStream(probes).use { it.write(array) } println("Content was successfully overwritten!") } else { assertTrue( array.contentEquals(binContent), "Compiled DebugProbesKt.class does not match the file shipped as a resource in kotlinx-coroutines-core. " + - "Typically it happens because of the Kotlin version update (-> binary metadata). In that case, run the same test with -Poverwrite.probes=true and " + - "ensure that classfile has major version equal to 50 (Java 6 compliance)") + "Typically it happens because of the Kotlin version update (-> binary metadata). In that case, run the same test with -Poverwrite.probes=true." + ) } } } diff --git a/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin b/kotlinx-coroutines-core/jvm/resources/DebugProbesKt.bin index 6c1500ae6e012b9ca4643da3671d498b39907235..a6ea0a40e53b7f45e1792c1f1edd5ba3d246f546 100644 GIT binary patch delta 33 ocmdnady02M42y_qc791tW?qGEa(+>MX-Q^YYO(I-Se7Uz0Mn%m6951J delta 14 VcmX@byPbDK3=5;u<^q-|CIBV&1X2J1 diff --git a/settings.gradle b/settings.gradle index 28a30c7bc7..f0a764898b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -58,5 +58,3 @@ module('ui/kotlinx-coroutines-swing') if (!build_snapshot_train) { module('js/example-frontend-js') } - -module('integration-testing') From 923a03762a5757a3803cc2a9f48e92644f9f8e18 Mon Sep 17 00:00:00 2001 From: mvicsokolova <82594708+mvicsokolova@users.noreply.github.com> Date: Thu, 16 Jun 2022 00:01:50 +0300 Subject: [PATCH 301/328] Update atomicfu version to 0.17.3 (#3321) * Update atomicfu version to 0.17.3 * Use nodejs() instead of browser() for js tests --- gradle.properties | 2 +- integration-testing/smokeTest/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 8e96d1605d..7357e56575 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ kotlin_version=1.6.21 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.17.2 +atomicfu_version=0.17.3 knit_version=0.4.0 html_version=0.7.2 lincheck_version=2.14 diff --git a/integration-testing/smokeTest/build.gradle b/integration-testing/smokeTest/build.gradle index ae400e26a3..b200bb2fe8 100644 --- a/integration-testing/smokeTest/build.gradle +++ b/integration-testing/smokeTest/build.gradle @@ -11,7 +11,7 @@ repositories { kotlin { jvm() js(IR) { - browser() + nodejs() } sourceSets { From 16c613dee0ddd69f3cba23a23b64ddacd54c991b Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy Date: Mon, 20 Jun 2022 11:23:14 +0200 Subject: [PATCH 302/328] Version 1.6.3 --- CHANGES.md | 4 ++++ README.md | 12 ++++++------ gradle.properties | 2 +- integration-testing/gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 024d1d0807..fb60da3017 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ # Change log for kotlinx.coroutines +## Version 1.6.3 + +* Updated atomicfu version to 0.17.3 (#3321), fixing the projects using this library with JS IR failing to build (#3305). + ## Version 1.6.2 * Fixed a bug with `ThreadLocalElement` not being correctly updated when the most outer `suspend` function was called directly without `kotlinx.coroutines` (#2930). diff --git a/README.md b/README.md index 41f461dc90..9f9c449917 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Kotlin Stable](https://kotl.in/badges/stable.svg)](https://kotlinlang.org/docs/components-stability.html) [![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.2)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.2/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -84,7 +84,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.6.2 + 1.6.3 ``` @@ -102,7 +102,7 @@ Add dependencies (you can also add other modules that you need): ```kotlin dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") } ``` @@ -132,7 +132,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```kotlin -implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2") +implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.3") ``` This gives you access to the Android [Dispatchers.Main] @@ -167,7 +167,7 @@ In common code that should get compiled for different platforms, you can add a d ```kotlin commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") } } ``` @@ -179,7 +179,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.2/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.3/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index 7357e56575..63fdf28c62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.6.2-SNAPSHOT +version=1.6.3-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.21 diff --git a/integration-testing/gradle.properties b/integration-testing/gradle.properties index d89f46c1f6..1f334cafea 100644 --- a/integration-testing/gradle.properties +++ b/integration-testing/gradle.properties @@ -1,4 +1,4 @@ kotlin_version=1.6.21 -coroutines_version=1.6.2-SNAPSHOT +coroutines_version=1.6.3-SNAPSHOT kotlin.code.style=official diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index ab8704fb28..2243df3020 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.2.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.3.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 403a89a4d3..4ac41e22a0 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -26,7 +26,7 @@ Provided [TestDispatcher] implementations: Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.3' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index a9ebc1f940..ddc39bdd64 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.3" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From 2ee99e269ec37d703f44f2598b4634637d8354d6 Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy Date: Mon, 20 Jun 2022 12:27:50 +0200 Subject: [PATCH 303/328] Mention Kotlin 1.6.21 in the README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9f9c449917..3b24731d25 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.6.20 + 1.6.21 ``` @@ -111,10 +111,10 @@ And make sure that you use the latest Kotlin version: ```kotlin plugins { // For build.gradle.kts (Kotlin DSL) - kotlin("jvm") version "1.6.20" + kotlin("jvm") version "1.6.21" // For build.gradle (Groovy DSL) - id "org.jetbrains.kotlin.jvm" version "1.6.20" + id "org.jetbrains.kotlin.jvm" version "1.6.21" } ``` From 11daf8253689606080940a5d09c82d77154f54bb Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Wed, 22 Jun 2022 11:29:13 +0300 Subject: [PATCH 304/328] Fix a flaky test (#3335) --- .../WithContextCancellationStressTest.kt | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/WithContextCancellationStressTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/WithContextCancellationStressTest.kt index 2995466390..f148a3ae43 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/WithContextCancellationStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/WithContextCancellationStressTest.kt @@ -10,10 +10,11 @@ import org.junit.Test import java.util.concurrent.* import kotlin.coroutines.* import kotlin.test.* +import kotlin.time.Duration.Companion.minutes class WithContextCancellationStressTest : TestBase() { - private val iterations = 15_000 * stressTestMultiplier + private val timeoutAfter = 1.minutes private val pool = newFixedThreadPoolContext(3, "WithContextCancellationStressTest") @After @@ -28,56 +29,54 @@ class WithContextCancellationStressTest : TestBase() { var e1Cnt = 0 var e2Cnt = 0 - repeat(iterations) { - val barrier = CyclicBarrier(4) - val ctx = pool + NonCancellable - var e1 = false - var e2 = false - val jobWithContext = async(ctx) { - withContext(wrapperDispatcher(coroutineContext)) { - launch { - barrier.await() - e1 = true - throw TestException1() - } + withTimeout(timeoutAfter) { + while (eCnt == 0 || e1Cnt == 0 || e2Cnt == 0) { + val barrier = CyclicBarrier(4) + val ctx = pool + NonCancellable + var e1 = false + var e2 = false + val jobWithContext = async(ctx) { + withContext(wrapperDispatcher(coroutineContext)) { + launch { + barrier.await() + e1 = true + throw TestException1() + } + + launch { + barrier.await() + e2 = true + throw TestException2() + } - launch { barrier.await() - e2 = true - throw TestException2() + throw TestException() } - - barrier.await() - throw TestException() } - } - barrier.await() + barrier.await() - try { - jobWithContext.await() - } catch (e: Throwable) { - when (e) { - is TestException -> { - eCnt++ - e.checkSuppressed(e1 = e1, e2 = e2) - } - is TestException1 -> { - e1Cnt++ - e.checkSuppressed(ex = true, e2 = e2) + try { + jobWithContext.await() + } catch (e: Throwable) { + when (e) { + is TestException -> { + eCnt++ + e.checkSuppressed(e1 = e1, e2 = e2) + } + is TestException1 -> { + e1Cnt++ + e.checkSuppressed(ex = true, e2 = e2) + } + is TestException2 -> { + e2Cnt++ + e.checkSuppressed(ex = true, e1 = e1) + } + else -> error("Unexpected exception $e") } - is TestException2 -> { - e2Cnt++ - e.checkSuppressed(ex = true, e1 = e1) - } - else -> error("Unexpected exception $e") } } } - - require(eCnt > 0) { "At least one TestException expected" } - require(e1Cnt > 0) { "At least one TestException1 expected" } - require(e2Cnt > 0) { "At least one TestException2 expected" } } private fun wrapperDispatcher(context: CoroutineContext): CoroutineContext { From dfe6f06761718e5c73b872f900d66e4a57e06d48 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 23 Jun 2022 16:00:00 +0200 Subject: [PATCH 305/328] Ensure that all coroutines throwables in core are serializable (#3337) * Ensure that all coroutines throwables in core are serializable Fixes #3328 --- integration-testing/build.gradle | 19 +++++++- ...ListAllCoroutineThrowableSubclassesTest.kt | 43 +++++++++++++++++++ kotlinx-coroutines-core/common/src/Timeout.kt | 4 +- kotlinx-coroutines-core/jvm/src/Exceptions.kt | 2 +- .../jvm/src/flow/internal/FlowExceptions.kt | 2 +- .../JobCancellationExceptionSerializerTest.kt | 42 ++++++++++++++++++ 6 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 integration-testing/src/withGuavaTest/kotlin/ListAllCoroutineThrowableSubclassesTest.kt create mode 100644 kotlinx-coroutines-core/jvm/test/JobCancellationExceptionSerializerTest.kt diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index 60b6cdcd07..c23d35fbe7 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -23,6 +23,16 @@ dependencies { } sourceSets { + withGuavaTest { + kotlin + compileClasspath += sourceSets.test.runtimeClasspath + runtimeClasspath += sourceSets.test.runtimeClasspath + + dependencies { + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation 'com.google.guava:guava:31.1-jre' + } + } mavenTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -60,6 +70,13 @@ compileDebugAgentTestKotlin { } } +task withGuavaTest(type: Test) { + environment "version", coroutines_version + def sourceSet = sourceSets.withGuavaTest + testClassesDirs = sourceSet.output.classesDirs + classpath = sourceSet.runtimeClasspath +} + task mavenTest(type: Test) { environment "version", coroutines_version def sourceSet = sourceSets.mavenTest @@ -89,5 +106,5 @@ compileTestKotlin { } check { - dependsOn([mavenTest, debugAgentTest, coreAgentTest, 'smokeTest:build']) + dependsOn([withGuavaTest, mavenTest, debugAgentTest, coreAgentTest, 'smokeTest:build']) } diff --git a/integration-testing/src/withGuavaTest/kotlin/ListAllCoroutineThrowableSubclassesTest.kt b/integration-testing/src/withGuavaTest/kotlin/ListAllCoroutineThrowableSubclassesTest.kt new file mode 100644 index 0000000000..fefcc00528 --- /dev/null +++ b/integration-testing/src/withGuavaTest/kotlin/ListAllCoroutineThrowableSubclassesTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import com.google.common.reflect.* +import kotlinx.coroutines.* +import org.junit.Test +import kotlin.test.* + +class ListAllCoroutineThrowableSubclassesTest { + + /* + * These are all the known throwables in kotlinx.coroutines. + * If you add one, this test will fail to make + * you ensure your exception type is java.io.Serializable. + * + * We do not have means to check it automatically, so checks are delegated to humans. + * + * See #3328 for serialization rationale. + */ + private val knownThrowables = setOf( + "kotlinx.coroutines.TimeoutCancellationException", + "kotlinx.coroutines.JobCancellationException", + "kotlinx.coroutines.internal.UndeliveredElementException", + "kotlinx.coroutines.CompletionHandlerException", + "kotlinx.coroutines.DiagnosticCoroutineContextException", + "kotlinx.coroutines.CoroutinesInternalError", + "kotlinx.coroutines.channels.ClosedSendChannelException", + "kotlinx.coroutines.channels.ClosedReceiveChannelException", + "kotlinx.coroutines.flow.internal.ChildCancelledException", + "kotlinx.coroutines.flow.internal.AbortFlowException", + ) + + @Test + fun testThrowableSubclassesAreSerializable() { + val classes = ClassPath.from(this.javaClass.classLoader) + .getTopLevelClassesRecursive("kotlinx.coroutines"); + val throwables = classes.filter { Throwable::class.java.isAssignableFrom(it.load()) }.map { it.toString() } + assertEquals(knownThrowables.sorted(), throwables.sorted()) + } +} diff --git a/kotlinx-coroutines-core/common/src/Timeout.kt b/kotlinx-coroutines-core/common/src/Timeout.kt index 46ab4ae8c8..6a6829df7a 100644 --- a/kotlinx-coroutines-core/common/src/Timeout.kt +++ b/kotlinx-coroutines-core/common/src/Timeout.kt @@ -163,7 +163,7 @@ private class TimeoutCoroutine( */ public class TimeoutCancellationException internal constructor( message: String, - @JvmField internal val coroutine: Job? + @JvmField @Transient internal val coroutine: Job? ) : CancellationException(message), CopyableThrowable { /** * Creates a timeout exception with the given message. @@ -173,7 +173,7 @@ public class TimeoutCancellationException internal constructor( internal constructor(message: String) : this(message, null) // message is never null in fact - override fun createCopy(): TimeoutCancellationException? = + override fun createCopy(): TimeoutCancellationException = TimeoutCancellationException(message ?: "", coroutine).also { it.initCause(this) } } diff --git a/kotlinx-coroutines-core/jvm/src/Exceptions.kt b/kotlinx-coroutines-core/jvm/src/Exceptions.kt index 007a0c98fa..48b4788cc5 100644 --- a/kotlinx-coroutines-core/jvm/src/Exceptions.kt +++ b/kotlinx-coroutines-core/jvm/src/Exceptions.kt @@ -29,7 +29,7 @@ public actual fun CancellationException(message: String?, cause: Throwable?) : C internal actual class JobCancellationException public actual constructor( message: String, cause: Throwable?, - @JvmField internal actual val job: Job + @JvmField @Transient internal actual val job: Job ) : CancellationException(message), CopyableThrowable { init { diff --git a/kotlinx-coroutines-core/jvm/src/flow/internal/FlowExceptions.kt b/kotlinx-coroutines-core/jvm/src/flow/internal/FlowExceptions.kt index d178060ddd..cfe5b69958 100644 --- a/kotlinx-coroutines-core/jvm/src/flow/internal/FlowExceptions.kt +++ b/kotlinx-coroutines-core/jvm/src/flow/internal/FlowExceptions.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.* import kotlinx.coroutines.flow.* internal actual class AbortFlowException actual constructor( - actual val owner: FlowCollector<*> + @JvmField @Transient actual val owner: FlowCollector<*> ) : CancellationException("Flow was aborted, no more elements needed") { override fun fillInStackTrace(): Throwable { diff --git a/kotlinx-coroutines-core/jvm/test/JobCancellationExceptionSerializerTest.kt b/kotlinx-coroutines-core/jvm/test/JobCancellationExceptionSerializerTest.kt new file mode 100644 index 0000000000..c909f27b64 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/JobCancellationExceptionSerializerTest.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import org.junit.* +import java.io.* + + +@Suppress("BlockingMethodInNonBlockingContext") +class JobCancellationExceptionSerializerTest : TestBase() { + + @Test + fun testSerialization() = runTest { + try { + coroutineScope { + expect(1) + + launch { + expect(2) + try { + hang {} + } catch (e: CancellationException) { + throw RuntimeException("RE2", e) + } + } + + launch { + expect(3) + throw RuntimeException("RE1") + } + } + } catch (e: Throwable) { + // Should not fail + ObjectOutputStream(ByteArrayOutputStream()).use { + it.writeObject(e) + } + finish(4) + } + } +} From cb65eb1a18e380b241175d1be0b928a3920d9662 Mon Sep 17 00:00:00 2001 From: Martin Petrov <357181+mpetrov@users.noreply.github.com> Date: Thu, 23 Jun 2022 15:04:16 -0400 Subject: [PATCH 306/328] Remove unused buildIterator import. (#3344) This function has been deprecated for a while. --- .../jvm/test/internal/LockFreeLinkedListLongStressTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListLongStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListLongStressTest.kt index dde4b2f69d..a70a32b5d3 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListLongStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/internal/LockFreeLinkedListLongStressTest.kt @@ -9,7 +9,6 @@ import org.junit.Test import java.util.* import java.util.concurrent.atomic.AtomicInteger import kotlin.concurrent.thread -import kotlin.sequences.buildIterator /** * This stress test has 2 threads adding on one side on list, 2 more threads adding on the other, From c9d3f7bb0cd7a971a2caab758b4ecc38372c7338 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 24 Jun 2022 14:02:23 +0200 Subject: [PATCH 307/328] ConcurrentWeakMap-related minor improvements (#3346) --- .../jvm/src/debug/internal/ConcurrentWeakMap.kt | 3 +-- kotlinx-coroutines-core/jvm/test/TestBase.kt | 3 ++- .../internal/ConcurrentWeakMapOperationStressTest.kt | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt b/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt index b0b2660517..b02eac6397 100644 --- a/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt +++ b/kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt @@ -10,11 +10,10 @@ import java.lang.ref.* // This is very limited implementation, not suitable as a generic map replacement. // It has lock-free get and put with synchronized rehash for simplicity (and better CPU usage on contention) -@OptIn(ExperimentalStdlibApi::class) @Suppress("UNCHECKED_CAST") internal class ConcurrentWeakMap( /** - * Weak reference queue is needed when a small key is mapped to a large value and we need to promptly release a + * Weak reference queue is needed when a small key is mapped to a large value, and we need to promptly release a * reference to the value when the key was already disposed. */ weakRefQueue: Boolean = false diff --git a/kotlinx-coroutines-core/jvm/test/TestBase.kt b/kotlinx-coroutines-core/jvm/test/TestBase.kt index f089241c63..ce94d33acc 100644 --- a/kotlinx-coroutines-core/jvm/test/TestBase.kt +++ b/kotlinx-coroutines-core/jvm/test/TestBase.kt @@ -236,8 +236,9 @@ public actual open class TestBase(private var disableOutCheck: Boolean) { if (expected != null) { if (!expected(e)) error("Unexpected exception: $e", e) - } else + } else { throw e + } } finally { if (ex == null && expected != null) error("Exception was expected but none produced") } diff --git a/kotlinx-coroutines-core/jvm/test/internal/ConcurrentWeakMapOperationStressTest.kt b/kotlinx-coroutines-core/jvm/test/internal/ConcurrentWeakMapOperationStressTest.kt index 49e6cccd77..63b5838442 100644 --- a/kotlinx-coroutines-core/jvm/test/internal/ConcurrentWeakMapOperationStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/internal/ConcurrentWeakMapOperationStressTest.kt @@ -34,7 +34,7 @@ class ConcurrentWeakMapOperationStressTest : TestBase() { var generationOffset = 0L while (!stop.value) { val kvs = (generationOffset + batchSize * index until generationOffset + batchSize * (index + 1)) - .associateBy({ Key(it) }, { it * it }) + .associateBy({ Key(it) }, { it * it }) generationOffset += batchSize * nThreads for ((k, v) in kvs) { assertEquals(null, m.put(k, v)) @@ -45,8 +45,8 @@ class ConcurrentWeakMapOperationStressTest : TestBase() { for ((k, v) in kvs) { assertEquals(v, m.remove(k)) } - for ((k, v) in kvs) { - assertEquals(null, m.get(k)) + for ((k, _) in kvs) { + assertEquals(null, m[k]) } count.incrementAndGet() } @@ -68,6 +68,6 @@ class ConcurrentWeakMapOperationStressTest : TestBase() { } stop.value = true threads.forEach { it.join() } - assertEquals(0, m.size) + assertEquals(0, m.size, "Unexpected map state: $m") } -} \ No newline at end of file +} From 74cf9ea8598a9ab1328faa52ddaea1bb977d4470 Mon Sep 17 00:00:00 2001 From: zoobestik Date: Thu, 23 Jun 2022 16:51:33 +0300 Subject: [PATCH 308/328] Docs: use kotlinlang for API --- CHANGES.md | 10 +- README.md | 90 ++++++++--------- RELEASE.md | 3 +- build.gradle | 4 +- docs/topics/cancellation-and-timeouts.md | 26 ++--- docs/topics/channels.md | 30 +++--- docs/topics/compatibility.md | 12 +-- docs/topics/composing-suspending-functions.md | 20 ++-- .../coroutine-context-and-dispatchers.md | 46 ++++----- docs/topics/coroutines-basics.md | 12 +-- docs/topics/coroutines-guide.md | 2 +- docs/topics/debug-coroutines-with-idea.md | 6 +- docs/topics/debug-flow-with-idea.md | 16 ++-- docs/topics/debugging.md | 8 +- docs/topics/exception-handling.md | 34 +++---- docs/topics/flow.md | 96 +++++++++---------- docs/topics/select-expression.md | 14 +-- .../shared-mutable-state-and-concurrency.md | 18 ++-- .../kotlinx-coroutines-guava/README.md | 10 +- integration/kotlinx-coroutines-jdk8/README.md | 12 +-- .../README.md | 6 +- .../kotlinx-coroutines-slf4j/README.md | 2 +- js/example-frontend-js/README.md | 2 +- kotlinx-coroutines-core/README.md | 84 ++++++++-------- kotlinx-coroutines-core/common/README.md | 94 +++++++++--------- kotlinx-coroutines-core/npm/README.md | 2 +- kotlinx-coroutines-debug/README.md | 20 ++-- kotlinx-coroutines-test/README.md | 34 +++---- .../kotlinx-coroutines-reactive/README.md | 20 ++-- reactive/kotlinx-coroutines-reactor/README.md | 20 ++-- reactive/kotlinx-coroutines-rx2/README.md | 48 +++++----- reactive/kotlinx-coroutines-rx3/README.md | 48 +++++----- site/deploy.sh | 64 ------------- ui/coroutines-guide-ui.md | 34 +++---- 34 files changed, 442 insertions(+), 505 deletions(-) delete mode 100755 site/deploy.sh diff --git a/CHANGES.md b/CHANGES.md index fb60da3017..850cb60e81 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -83,7 +83,7 @@ Note that this is a full changelog relative to the 1.5.2 version. Changelog rela * Support of deprecated `CommonPool` is removed. * `@ExperimentalTime` is no longer needed for methods that use `Duration` (#3041). * JDK 1.6 is no longer required for building the project (#3043). -* New version of Dokka is used, fixing the memory leak when building the coroutines and providing brand new reference visuals (https://kotlin.github.io/kotlinx.coroutines/) (#3051, #3054). +* New version of Dokka is used, fixing the memory leak when building the coroutines and providing brand new reference visuals (https://kotlinlang.org/api/kotlinx.coroutines/) (#3051, #3054). ### Changelog relative to version 1.6.0-RC3 @@ -106,7 +106,7 @@ Note that this is a full changelog relative to the 1.5.2 version. Changelog rela * `SendChannel.trySendBlocking` is now available on Kotlin/Native (#3064). * Fixed the bug due to which `Dispatchers.Main` was not used for `delay` and `withTimeout` (#3046). * JDK 1.6 is no longer required for building the project (#3043). -* New version of Dokka is used, fixing the memory leak when building the coroutines and providing brand new reference visuals (https://kotlin.github.io/kotlinx.coroutines/) (#3051, #3054). +* New version of Dokka is used, fixing the memory leak when building the coroutines and providing brand new reference visuals (https://kotlinlang.org/api/kotlinx.coroutines/) (#3051, #3054). ## Version 1.6.0-RC @@ -519,7 +519,7 @@ Gradle version 5.3 or later to use this version of kotlinx.coroutines in your Ko ### Flow -This version is the first stable release with [`Flow`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html) API. +This version is the first stable release with [`Flow`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html) API. All `Flow` API not marked with `@FlowPreview` or `@ExperimentalCoroutinesApi` annotations are stable and here to stay. Flow declarations marked with `@ExperimentalCoroutinesApi` have [the same guarantees](/docs/topics/compatibility.md#experimental-api) as regular experimental API. @@ -848,9 +848,9 @@ Visible consequences of include more robust exception handling for large corouti * All coroutine builders are now extensions on `CoroutineScope` and inherit its `coroutineContext`. Standalone builders are deprecated. * As a consequence, all nested coroutines launched via builders now automatically establish parent-child relationship and inherit `CoroutineDispatcher`. * All coroutine builders use `Dispatchers.Default` by default if `CoroutineInterceptor` is not present in their context. - * [CoroutineScope](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/) became the first-class citizen in `kolinx.coroutines`. + * [CoroutineScope](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html) became the first-class citizen in `kolinx.coroutines`. * `withContext` `block` argument has `CoroutineScope` as a receiver. - * [GlobalScope](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/) is introduced to simplify migration to new API and to launch global-level coroutines. + * [GlobalScope](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html) is introduced to simplify migration to new API and to launch global-level coroutines. * `currentScope` and `coroutineScope` builders are introduced to extract and provide `CoroutineScope`. * Factory methods to create `CoroutineScope` from `CoroutineContext` are introduced. * `CoroutineScope.isActive` became an extension property. diff --git a/README.md b/README.md index 3b24731d25..304d7b4214 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ suspend fun main() = coroutineScope { * [Compatibility policy and experimental annotations](docs/topics/compatibility.md) * [Change log for kotlinx.coroutines](CHANGES.md) * [Coroutines design document (KEEP)](https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md) -* [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines) +* [Full kotlinx.coroutines API reference](https://kotlinlang.org/api/kotlinx.coroutines/) ## Using in your projects @@ -203,102 +203,102 @@ See [Contributing Guidelines](CONTRIBUTING.md). -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[Dispatchers]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/index.html -[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html -[_supervisorScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/supervisor-scope.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html -[MainScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html -[SupervisorJob()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html -[CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html -[Dispatchers.IO]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-i-o.html -[asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html -[Promise.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await.html -[promise]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/promise.html -[Window.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[Dispatchers]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/index.html +[Dispatchers.Main]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[yield]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[_coroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html +[_supervisorScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/supervisor-scope.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[withTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html +[MainScope()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html +[SupervisorJob()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html +[CoroutineExceptionHandler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html +[Dispatchers.IO]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-i-o.html +[asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html +[Promise.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await.html +[promise]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/promise.html +[Window.asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[_flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html -[filter]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/filter.html -[map]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[_flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html +[filter]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/filter.html +[map]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map.html -[Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html +[Channel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html +[select]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html -[Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html -[Semaphore]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-semaphore/index.html +[Mutex]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html +[Semaphore]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-semaphore/index.html -[Dispatchers.setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html -[TestCoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scope/index.html +[Dispatchers.setMain]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html +[TestCoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scope/index.html -[DebugProbes]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/index.html +[DebugProbes]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/index.html -[CoroutinesTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug.junit4/-coroutines-timeout/index.html +[CoroutinesTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug.junit4/-coroutines-timeout/index.html -[MDCContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-slf4j/kotlinx.coroutines.slf4j/-m-d-c-context/index.html +[MDCContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-slf4j/kotlinx.coroutines.slf4j/-m-d-c-context/index.html -[CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html +[CompletionStage.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html -[ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html +[ListenableFuture.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html -[Task.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html +[Task.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html -[Publisher.collect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/collect.html -[Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html -[kotlinx.coroutines.reactive.publish]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html +[Publisher.collect]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/collect.html +[Publisher.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html +[kotlinx.coroutines.reactive.publish]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html -[rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html -[rxSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-single.html +[rxFlowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html +[rxSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-single.html -[flux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/flux.html -[mono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html +[flux]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/flux.html +[mono]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html diff --git a/RELEASE.md b/RELEASE.md index e297abd3c4..5e3144de99 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -63,7 +63,8 @@ To release a new `` of `kotlinx-coroutines`: * Cut & paste lines from [`CHANGES.md`](CHANGES.md) into description. 4. Build and publish the documentation for the web-site:
    - `site/deploy.sh push` + * Set new value for [`kotlinx.coroutines.release.tag`](https://buildserver.labs.intellij.net/admin/editProject.html?projectId=Kotlin_KotlinSites_Builds_KotlinlangOrg_LibrariesAPIs&tab=projectParams) + * And run deploy [configuration](https://buildserver.labs.intellij.net/buildConfiguration/Kotlin_KotlinSites_Builds_KotlinlangOrg_KotlinCoroutinesApi?branch=%3Cdefault%3E&buildTypeTab=overview&mode=builds) 5. Announce the new release in [Slack](https://kotlinlang.slack.com) diff --git a/build.gradle b/build.gradle index 649434bba8..4d6af16570 100644 --- a/build.gradle +++ b/build.gradle @@ -231,7 +231,7 @@ configure(subprojects.findAll { } } -def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/" +def core_docs_url = "https://kotlinlang.org/api/kotlinx.coroutines/$coreModule/" def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/htmlPartial/package-list" apply plugin: "org.jetbrains.dokka" @@ -313,7 +313,7 @@ clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') } apply plugin: 'kotlinx-knit' knit { - siteRoot = "https://kotlin.github.io/kotlinx.coroutines" + siteRoot = "https://kotlinlang.org/api/kotlinx.coroutines" moduleRoots = [".", "integration", "reactive", "ui"] moduleDocs = "build/dokka/htmlPartial" dokkaMultiModuleRoot = "build/dokka/htmlMultiModule/" diff --git a/docs/topics/cancellation-and-timeouts.md b/docs/topics/cancellation-and-timeouts.md index 47f465ad60..0cbafb59a4 100644 --- a/docs/topics/cancellation-and-timeouts.md +++ b/docs/topics/cancellation-and-timeouts.md @@ -480,18 +480,18 @@ This example always prints zero. Resources do not leak. -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[cancelAndJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-and-join.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[CancellationException]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html -[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[isActive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/is-active.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html -[withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html -[withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[cancelAndJoin]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-and-join.html +[Job.cancel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html +[Job.join]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[CancellationException]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html +[yield]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[isActive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/is-active.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[NonCancellable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[withTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html +[withTimeoutOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html diff --git a/docs/topics/channels.md b/docs/topics/channels.md index 7cf222c8a0..3b8b11fbbe 100644 --- a/docs/topics/channels.md +++ b/docs/topics/channels.md @@ -627,26 +627,26 @@ delay between elements. -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[kotlin.coroutines.CoroutineContext.cancelChildren]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-children.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[kotlin.coroutines.CoroutineContext.cancelChildren]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel-children.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html -[ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html -[SendChannel.close]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/close.html -[produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html -[consumeEach]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/consume-each.html -[Channel()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel.html -[ticker]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/ticker.html -[ReceiveChannel.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/cancel.html -[TickerMode.FIXED_DELAY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-ticker-mode/-f-i-x-e-d_-d-e-l-a-y/index.html +[Channel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html +[SendChannel.send]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html +[ReceiveChannel.receive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html +[SendChannel.close]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/close.html +[produce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html +[consumeEach]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/consume-each.html +[Channel()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel.html +[ticker]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/ticker.html +[ReceiveChannel.cancel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/cancel.html +[TickerMode.FIXED_DELAY]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-ticker-mode/-f-i-x-e-d_-d-e-l-a-y/index.html -[select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html +[select]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html diff --git a/docs/topics/compatibility.md b/docs/topics/compatibility.md index 974481161c..9570f1985b 100644 --- a/docs/topics/compatibility.md +++ b/docs/topics/compatibility.md @@ -75,7 +75,7 @@ When some API is deprecated, it goes through multiple stages and there is at lea this option in case of unforeseen problems such as security holes. ## Using annotated API -All API annotations are [kotlin.Experimental](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-experimental/index.html). +All API annotations are [kotlin.Experimental](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-experimental/). It is done in order to produce compilation warning about using experimental or obsolete API. Warnings can be disabled either programmatically for a specific call site or globally for the whole module. @@ -117,13 +117,13 @@ For the Maven project, a warning can be disabled by passing a compiler flag in y -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[ExperimentalCoroutinesApi]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-experimental-coroutines-api/index.html -[FlowPreview]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-flow-preview/index.html -[ObsoleteCoroutinesApi]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-obsolete-coroutines-api/index.html -[InternalCoroutinesApi]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-internal-coroutines-api/index.html +[ExperimentalCoroutinesApi]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-experimental-coroutines-api/index.html +[FlowPreview]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-flow-preview/index.html +[ObsoleteCoroutinesApi]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-obsolete-coroutines-api/index.html +[InternalCoroutinesApi]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-internal-coroutines-api/index.html diff --git a/docs/topics/composing-suspending-functions.md b/docs/topics/composing-suspending-functions.md index e244d8c218..8ed7336199 100644 --- a/docs/topics/composing-suspending-functions.md +++ b/docs/topics/composing-suspending-functions.md @@ -402,15 +402,15 @@ Computation failed with ArithmeticException -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[CoroutineStart.LAZY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-l-a-z-y/index.html -[Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html -[Job.start]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/start.html -[GlobalScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[CoroutineStart.LAZY]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-l-a-z-y/index.html +[Deferred.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html +[Job.start]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/start.html +[GlobalScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[_coroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index 6c06b14d07..32d1891955 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -658,28 +658,28 @@ that should be implemented. -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[newSingleThreadContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html -[ExecutorCoroutineDispatcher.close]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-executor-coroutine-dispatcher/close.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[DEBUG_PROPERTY_NAME]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[isActive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/is-active.html -[CoroutineScope.coroutineContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/coroutine-context.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[CoroutineName]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-name/index.html -[CoroutineScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope.html -[MainScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html -[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html -[asContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-context-element.html -[ensurePresent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-present.html -[ThreadContextElement]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/index.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[Dispatchers.Unconfined]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[newSingleThreadContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html +[ExecutorCoroutineDispatcher.close]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-executor-coroutine-dispatcher/close.html +[runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[DEBUG_PROPERTY_NAME]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[isActive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/is-active.html +[CoroutineScope.coroutineContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/coroutine-context.html +[Job.join]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[CoroutineName]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-name/index.html +[CoroutineScope()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope.html +[MainScope()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html +[Dispatchers.Main]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html +[asContextElement]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-context-element.html +[ensurePresent]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-present.html +[ThreadContextElement]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/index.html diff --git a/docs/topics/coroutines-basics.md b/docs/topics/coroutines-basics.md index 68ae97886f..ad33dcfbd1 100644 --- a/docs/topics/coroutines-basics.md +++ b/docs/topics/coroutines-basics.md @@ -281,11 +281,11 @@ likely consume too much memory and throw an out-of-memory error. -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[_coroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html diff --git a/docs/topics/coroutines-guide.md b/docs/topics/coroutines-guide.md index 0c6432f61c..73c4c1ac32 100644 --- a/docs/topics/coroutines-guide.md +++ b/docs/topics/coroutines-guide.md @@ -33,6 +33,6 @@ In order to use coroutines as well as follow the examples in this guide, you nee * [Guide to UI programming with coroutines](https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md) * [Coroutines design document (KEEP)](https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md) -* [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines) +* [Full kotlinx.coroutines API reference](https://kotlinlang.org/api/kotlinx.coroutines/) * [Best practices for coroutines in Android](https://developer.android.com/kotlin/coroutines/coroutines-best-practices) * [Additional Android resources for Kotlin coroutines and flow](https://developer.android.com/kotlin/coroutines/additional-resources) diff --git a/docs/topics/debug-coroutines-with-idea.md b/docs/topics/debug-coroutines-with-idea.md index 8bbbb98585..2541c92469 100644 --- a/docs/topics/debug-coroutines-with-idea.md +++ b/docs/topics/debug-coroutines-with-idea.md @@ -18,9 +18,9 @@ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-gui 3. Change code in the `main()` function: - * Use the [`runBlocking()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. - * Use the [`async()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html) function to create coroutines that compute deferred values `a` and `b`. - * Use the [`await()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html) function to await the computation result. + * Use the [`runBlocking()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. + * Use the [`async()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html) function to create coroutines that compute deferred values `a` and `b`. + * Use the [`await()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html) function to await the computation result. * Use the [`println()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/println.html) function to print computing status and the result of multiplication to the output. ```kotlin diff --git a/docs/topics/debug-flow-with-idea.md b/docs/topics/debug-flow-with-idea.md index edc841d3b5..b769e79510 100644 --- a/docs/topics/debug-flow-with-idea.md +++ b/docs/topics/debug-flow-with-idea.md @@ -10,7 +10,7 @@ The tutorial assumes you have prior knowledge of the [coroutines](coroutines-gui ## Create a Kotlin flow -Create a Kotlin [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html) with a slow emitter and a slow collector: +Create a Kotlin [flow](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html) with a slow emitter and a slow collector: 1. Open a Kotlin project in IntelliJ IDEA. If you don't have a project, [create one](jvm-get-started.md#create-an-application). @@ -20,8 +20,8 @@ Create a Kotlin [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-corou 3. Create the `simple()` function that returns a flow of three numbers: - * Use the [`delay()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html) function to imitate CPU-consuming blocking code. It suspends the coroutine for 100 ms without blocking the thread. - * Produce the values in the `for` loop using the [`emit()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/emit.html) function. + * Use the [`delay()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html) function to imitate CPU-consuming blocking code. It suspends the coroutine for 100 ms without blocking the thread. + * Produce the values in the `for` loop using the [`emit()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/emit.html) function. ```kotlin import kotlinx.coroutines.* @@ -38,9 +38,9 @@ Create a Kotlin [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-corou 4. Change the code in the `main()` function: - * Use the [`runBlocking()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. - * Collect the emitted values using the [`collect()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect.html) function. - * Use the [`delay()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html) function to imitate CPU-consuming code. It suspends the coroutine for 300 ms without blocking the thread. + * Use the [`runBlocking()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html) block to wrap a coroutine. + * Collect the emitted values using the [`collect()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect.html) function. + * Use the [`delay()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html) function to imitate CPU-consuming code. It suspends the coroutine for 300 ms without blocking the thread. * Print the collected value from the flow using the [`println()`](https://kotlinlang.org/api/latest/jvm/stdlib/stdlib/kotlin.io/println.html) function. ```kotlin @@ -88,7 +88,7 @@ Create a Kotlin [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-corou 2. Enhance the code to run the emitter and collector concurrently: - * Add a call to the [`buffer()`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html) function to run the emitter and collector concurrently. `buffer()` stores emitted values and runs the flow collector in a separate coroutine. + * Add a call to the [`buffer()`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html) function to run the emitter and collector concurrently. `buffer()` stores emitted values and runs the flow collector in a separate coroutine. ```kotlin fun main() = runBlocking { @@ -123,4 +123,4 @@ Create a Kotlin [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-corou Now the collector coroutine has the **RUNNING** status, while the emitter coroutine has the **SUSPENDED** status. - You can dig deeper into each coroutine to debug your code. \ No newline at end of file + You can dig deeper into each coroutine to debug your code. diff --git a/docs/topics/debugging.md b/docs/topics/debugging.md index 6faad018bd..a2c32e0b18 100644 --- a/docs/topics/debugging.md +++ b/docs/topics/debugging.md @@ -99,10 +99,10 @@ For more details see ["Optimization" section for Android](../../ui/kotlinx-corou -[DEBUG_PROPERTY_NAME]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html -[CoroutineName]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-name/index.html -[CopyableThrowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-copyable-throwable/index.html -[CopyableThrowable.createCopy]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-copyable-throwable/create-copy.html +[DEBUG_PROPERTY_NAME]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html +[CoroutineName]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-name/index.html +[CopyableThrowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-copyable-throwable/index.html +[CopyableThrowable.createCopy]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-copyable-throwable/create-copy.html diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index c3e6135dd0..8bf8c106ca 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -506,25 +506,25 @@ The scope is completed -[CancellationException]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html -[GlobalScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html -[CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[SupervisorJob()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html -[Job()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job.html -[_coroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html -[_supervisorScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/supervisor-scope.html +[CancellationException]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[Deferred.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html +[GlobalScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html +[CoroutineExceptionHandler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[Job.cancel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html +[runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[SupervisorJob()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html +[Job()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job.html +[_coroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/coroutine-scope.html +[_supervisorScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/supervisor-scope.html -[actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html -[produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html -[ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html +[actor]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html +[produce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html +[ReceiveChannel.receive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html diff --git a/docs/topics/flow.md b/docs/topics/flow.md index 311411f8ef..538a9d6725 100644 --- a/docs/topics/flow.md +++ b/docs/topics/flow.md @@ -1832,9 +1832,9 @@ Integration modules include conversions from and to `Flow`, integration with Rea [collections]: https://kotlinlang.org/docs/reference/collections-overview.html -[List]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html +[List]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/ [forEach]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/for-each.html -[Sequence]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/index.html +[Sequence]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/ [Sequence.zip]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/zip.html [Sequence.flatten]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/flatten.html [Sequence.flatMap]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/flat-map.html @@ -1843,54 +1843,54 @@ Integration modules include conversions from and to `Flow`, integration with Rea -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[ensureActive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-active.html -[CancellationException]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[withTimeoutOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[Dispatchers.Main]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[Job.cancel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html +[Job.join]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[ensureActive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-active.html +[CancellationException]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-cancellation-exception/index.html -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[_flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html -[FlowCollector.emit]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/emit.html -[collect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect.html -[flowOf]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow-of.html -[map]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map.html -[filter]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/filter.html -[transform]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/transform.html -[take]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/take.html -[toList]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/to-list.html -[toSet]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/to-set.html -[first]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/first.html -[single]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/single.html -[reduce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/reduce.html -[fold]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/fold.html -[flowOn]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow-on.html -[buffer]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html -[conflate]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/conflate.html -[collectLatest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect-latest.html -[zip]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/zip.html -[combine]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/combine.html -[onEach]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/on-each.html -[flatMapConcat]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-concat.html -[flattenConcat]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flatten-concat.html -[flatMapMerge]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-merge.html -[flattenMerge]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flatten-merge.html -[DEFAULT_CONCURRENCY]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-d-e-f-a-u-l-t_-c-o-n-c-u-r-r-e-n-c-y.html -[flatMapLatest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-latest.html -[catch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/catch.html -[onCompletion]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/on-completion.html -[launchIn]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/launch-in.html -[IntRange.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/as-flow.html -[cancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/cancellable.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[_flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow.html +[FlowCollector.emit]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/emit.html +[collect]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect.html +[flowOf]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow-of.html +[map]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/map.html +[filter]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/filter.html +[transform]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/transform.html +[take]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/take.html +[toList]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/to-list.html +[toSet]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/to-set.html +[first]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/first.html +[single]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/single.html +[reduce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/reduce.html +[fold]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/fold.html +[flowOn]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flow-on.html +[buffer]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/buffer.html +[conflate]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/conflate.html +[collectLatest]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/collect-latest.html +[zip]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/zip.html +[combine]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/combine.html +[onEach]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/on-each.html +[flatMapConcat]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-concat.html +[flattenConcat]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flatten-concat.html +[flatMapMerge]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-merge.html +[flattenMerge]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flatten-merge.html +[DEFAULT_CONCURRENCY]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-d-e-f-a-u-l-t_-c-o-n-c-u-r-r-e-n-c-y.html +[flatMapLatest]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/flat-map-latest.html +[catch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/catch.html +[onCompletion]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/on-completion.html +[launchIn]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/launch-in.html +[IntRange.asFlow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/as-flow.html +[cancellable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/cancellable.html diff --git a/docs/topics/select-expression.md b/docs/topics/select-expression.md index fd40fe2e32..f3055737c8 100644 --- a/docs/topics/select-expression.md +++ b/docs/topics/select-expression.md @@ -490,18 +490,18 @@ Channel was closed -[Deferred.onAwait]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html +[Deferred.onAwait]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html -[ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html -[ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html -[SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html -[SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html +[ReceiveChannel.receive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html +[ReceiveChannel.onReceive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html +[ReceiveChannel.onReceiveCatching]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html +[SendChannel.send]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html +[SendChannel.onSend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html -[select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html +[select]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html diff --git a/docs/topics/shared-mutable-state-and-concurrency.md b/docs/topics/shared-mutable-state-and-concurrency.md index 1b84f136ce..99cc42bc2e 100644 --- a/docs/topics/shared-mutable-state-and-concurrency.md +++ b/docs/topics/shared-mutable-state-and-concurrency.md @@ -494,20 +494,20 @@ have to switch to a different context at all. -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[CompletableDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-completable-deferred/index.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[CompletableDeferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-completable-deferred/index.html -[Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html -[Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[Mutex.unlock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/unlock.html -[withLock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/with-lock.html +[Mutex]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html +[Mutex.lock]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html +[Mutex.unlock]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/unlock.html +[withLock]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/with-lock.html -[actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html -[produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html +[actor]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html +[produce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html diff --git a/integration/kotlinx-coroutines-guava/README.md b/integration/kotlinx-coroutines-guava/README.md index b930a6194c..41611252fa 100644 --- a/integration/kotlinx-coroutines-guava/README.md +++ b/integration/kotlinx-coroutines-guava/README.md @@ -51,17 +51,17 @@ Integration with Guava [ListenableFuture](https://github.com/google/guava/wiki/L -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/future.html -[com.google.common.util.concurrent.ListenableFuture.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html -[kotlinx.coroutines.Deferred.asListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/as-listenable-future.html +[future]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/future.html +[com.google.common.util.concurrent.ListenableFuture.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/await.html +[kotlinx.coroutines.Deferred.asListenableFuture]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-guava/kotlinx.coroutines.guava/as-listenable-future.html -[com.google.common.util.concurrent.ListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/https://google.github.io/guava/releases/31.0.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html +[com.google.common.util.concurrent.ListenableFuture]: https://google.github.io/guava/releases/31.0.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html diff --git a/integration/kotlinx-coroutines-jdk8/README.md b/integration/kotlinx-coroutines-jdk8/README.md index 35808c6f3d..321e293414 100644 --- a/integration/kotlinx-coroutines-jdk8/README.md +++ b/integration/kotlinx-coroutines-jdk8/README.md @@ -54,15 +54,15 @@ Integration with JDK8 [CompletableFuture] (Android API level 24). -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[future]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/future.html -[java.util.concurrent.CompletionStage.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html -[java.util.concurrent.CompletionStage.asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-deferred.html -[kotlinx.coroutines.Deferred.asCompletableFuture]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-completable-future.html +[future]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/future.html +[java.util.concurrent.CompletionStage.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/await.html +[java.util.concurrent.CompletionStage.asDeferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-deferred.html +[kotlinx.coroutines.Deferred.asCompletableFuture]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-jdk8/kotlinx.coroutines.future/as-completable-future.html diff --git a/integration/kotlinx-coroutines-play-services/README.md b/integration/kotlinx-coroutines-play-services/README.md index 647dafd2c1..17b6500a3e 100644 --- a/integration/kotlinx-coroutines-play-services/README.md +++ b/integration/kotlinx-coroutines-play-services/README.md @@ -38,8 +38,8 @@ val currentLocation = currentLocationTask.await(cancellationTokenSource) // canc -[asDeferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-deferred.html -[await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html -[asTask]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-task.html +[asDeferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-deferred.html +[await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/await.html +[asTask]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-play-services/kotlinx.coroutines.tasks/as-task.html diff --git a/integration/kotlinx-coroutines-slf4j/README.md b/integration/kotlinx-coroutines-slf4j/README.md index e23d390703..37f87008d6 100644 --- a/integration/kotlinx-coroutines-slf4j/README.md +++ b/integration/kotlinx-coroutines-slf4j/README.md @@ -21,6 +21,6 @@ Integration with SLF4J [MDC](https://logback.qos.ch/manual/mdc.html). -[MDCContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-slf4j/kotlinx.coroutines.slf4j/-m-d-c-context/index.html +[MDCContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-slf4j/kotlinx.coroutines.slf4j/-m-d-c-context/index.html diff --git a/js/example-frontend-js/README.md b/js/example-frontend-js/README.md index ad61372dc9..55e7088685 100644 --- a/js/example-frontend-js/README.md +++ b/js/example-frontend-js/README.md @@ -15,4 +15,4 @@ gradlew :example-frontend-js:run ``` Built and deployed application is available at the library documentation site -[here](https://kotlin.github.io/kotlinx.coroutines/example-frontend-js/index.html). +[here](https://kotlinlang.org/api/kotlinx.coroutines/example-frontend-js/index.html). diff --git a/kotlinx-coroutines-core/README.md b/kotlinx-coroutines-core/README.md index 38a112e89d..6f59b68233 100644 --- a/kotlinx-coroutines-core/README.md +++ b/kotlinx-coroutines-core/README.md @@ -86,57 +86,57 @@ Low-level primitives for finer-grained control of coroutines. -[kotlinx.coroutines.launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[kotlinx.coroutines.Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[kotlinx.coroutines.CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[kotlinx.coroutines.async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[kotlinx.coroutines.Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[kotlinx.coroutines.runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[kotlinx.coroutines.Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[kotlinx.coroutines.Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[kotlinx.coroutines.NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html -[kotlinx.coroutines.CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html -[kotlinx.coroutines.delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[kotlinx.coroutines.yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[kotlinx.coroutines.withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[kotlinx.coroutines.withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html -[kotlinx.coroutines.withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html -[kotlinx.coroutines.awaitAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html -[kotlinx.coroutines.joinAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html -[suspendCancellableCoroutine]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html -[kotlinx.coroutines.Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[kotlinx.coroutines.Job.onJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html -[kotlinx.coroutines.Job.isCompleted]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html -[kotlinx.coroutines.Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html -[kotlinx.coroutines.Deferred.onAwait]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html +[kotlinx.coroutines.launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[kotlinx.coroutines.Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[kotlinx.coroutines.CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[kotlinx.coroutines.async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[kotlinx.coroutines.Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[kotlinx.coroutines.runBlocking]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[kotlinx.coroutines.Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[kotlinx.coroutines.Dispatchers.Unconfined]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[kotlinx.coroutines.NonCancellable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[kotlinx.coroutines.CoroutineExceptionHandler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html +[kotlinx.coroutines.delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[kotlinx.coroutines.yield]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[kotlinx.coroutines.withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[kotlinx.coroutines.withTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html +[kotlinx.coroutines.withTimeoutOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html +[kotlinx.coroutines.awaitAll]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html +[kotlinx.coroutines.joinAll]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html +[suspendCancellableCoroutine]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html +[NonCancellable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[kotlinx.coroutines.Job.join]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[kotlinx.coroutines.Job.onJoin]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html +[kotlinx.coroutines.Job.isCompleted]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html +[kotlinx.coroutines.Deferred.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html +[kotlinx.coroutines.Deferred.onAwait]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html -[kotlinx.coroutines.sync.Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html -[kotlinx.coroutines.sync.Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html +[kotlinx.coroutines.sync.Mutex]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html +[kotlinx.coroutines.sync.Mutex.lock]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[kotlinx.coroutines.channels.produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html -[kotlinx.coroutines.channels.ReceiveChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html -[kotlinx.coroutines.channels.ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[kotlinx.coroutines.channels.Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[kotlinx.coroutines.channels.SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html -[kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html -[kotlinx.coroutines.channels.SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html -[kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html -[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html -[kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html -[kotlinx.coroutines.channels.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html -[kotlinx.coroutines.channels.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html +[kotlinx.coroutines.channels.produce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html +[kotlinx.coroutines.channels.ReceiveChannel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html +[kotlinx.coroutines.channels.ProducerScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html +[kotlinx.coroutines.channels.Channel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html +[kotlinx.coroutines.channels.SendChannel.send]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html +[kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html +[kotlinx.coroutines.channels.SendChannel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html +[kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html +[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html +[kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html +[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html +[kotlinx.coroutines.channels.receiveCatching]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html +[kotlinx.coroutines.channels.onReceiveCatching]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html -[kotlinx.coroutines.selects.select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html -[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html +[kotlinx.coroutines.selects.select]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html +[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html diff --git a/kotlinx-coroutines-core/common/README.md b/kotlinx-coroutines-core/common/README.md index b09c44c75e..041cd3ec64 100644 --- a/kotlinx-coroutines-core/common/README.md +++ b/kotlinx-coroutines-core/common/README.md @@ -93,61 +93,61 @@ Low-level primitives for finer-grained control of coroutines. -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[Deferred]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[newSingleThreadContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html -[newFixedThreadPoolContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-fixed-thread-pool-context.html -[asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html -[NonCancellable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html -[CoroutineExceptionHandler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[withTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html -[withTimeoutOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html -[awaitAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html -[joinAll]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html -[suspendCancellableCoroutine]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html -[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html -[Job.onJoin]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html -[Job.isCompleted]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html -[Deferred.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html -[Deferred.onAwait]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html -[newCoroutineContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-coroutine-context.html -[DEBUG_PROPERTY_NAME]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[Deferred]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[Dispatchers.Unconfined]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[newSingleThreadContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-single-thread-context.html +[newFixedThreadPoolContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-fixed-thread-pool-context.html +[asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/as-coroutine-dispatcher.html +[NonCancellable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-non-cancellable/index.html +[CoroutineExceptionHandler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[yield]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[withTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout.html +[withTimeoutOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-timeout-or-null.html +[awaitAll]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/await-all.html +[joinAll]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/join-all.html +[suspendCancellableCoroutine]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html +[Job.join]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html +[Job.onJoin]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/on-join.html +[Job.isCompleted]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/is-completed.html +[Deferred.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/await.html +[Deferred.onAwait]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-deferred/on-await.html +[newCoroutineContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/new-coroutine-context.html +[DEBUG_PROPERTY_NAME]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-d-e-b-u-g_-p-r-o-p-e-r-t-y_-n-a-m-e.html -[kotlinx.coroutines.sync.Mutex]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html -[kotlinx.coroutines.sync.Mutex.lock]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html +[kotlinx.coroutines.sync.Mutex]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/index.html +[kotlinx.coroutines.sync.Mutex.lock]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-mutex/lock.html -[kotlinx.coroutines.channels.produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html -[kotlinx.coroutines.channels.ReceiveChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html -[kotlinx.coroutines.channels.ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[kotlinx.coroutines.channels.actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html -[kotlinx.coroutines.channels.SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html -[kotlinx.coroutines.channels.ActorScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-actor-scope/index.html -[kotlinx.coroutines.channels.Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[kotlinx.coroutines.channels.SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html -[kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html -[kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html -[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html -[kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html -[kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html -[kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html +[kotlinx.coroutines.channels.produce]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html +[kotlinx.coroutines.channels.ReceiveChannel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html +[kotlinx.coroutines.channels.ProducerScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html +[kotlinx.coroutines.channels.actor]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html +[kotlinx.coroutines.channels.SendChannel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html +[kotlinx.coroutines.channels.ActorScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-actor-scope/index.html +[kotlinx.coroutines.channels.Channel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html +[kotlinx.coroutines.channels.SendChannel.send]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html +[kotlinx.coroutines.channels.ReceiveChannel.receive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html +[kotlinx.coroutines.channels.SendChannel.onSend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/on-send.html +[kotlinx.coroutines.channels.SendChannel.trySend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html +[kotlinx.coroutines.channels.ReceiveChannel.onReceive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive.html +[kotlinx.coroutines.channels.ReceiveChannel.tryReceive]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/try-receive.html +[kotlinx.coroutines.channels.ReceiveChannel.receiveCatching]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive-catching.html +[kotlinx.coroutines.channels.ReceiveChannel.onReceiveCatching]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/on-receive-catching.html -[kotlinx.coroutines.selects.select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html -[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html +[kotlinx.coroutines.selects.select]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html +[kotlinx.coroutines.selects.SelectBuilder.onTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/on-timeout.html diff --git a/kotlinx-coroutines-core/npm/README.md b/kotlinx-coroutines-core/npm/README.md index 7f88ea393f..868fb6569c 100644 --- a/kotlinx-coroutines-core/npm/README.md +++ b/kotlinx-coroutines-core/npm/README.md @@ -16,4 +16,4 @@ suspend fun main() = coroutineScope { ## Documentation * [Guide to kotlinx.coroutines by example on JVM](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) (**read it first**) -* [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines) +* [Full kotlinx.coroutines API reference](https://kotlinlang.org/api/kotlinx.coroutines/) diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 2243df3020..b21161ec39 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -264,22 +264,22 @@ More than one file was found with OS independent path 'win32-x86-64/attach_hotsp -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[DebugProbes]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/index.html -[DebugProbes.install]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/install.html -[DebugProbes.dumpCoroutines]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/dump-coroutines.html -[DebugProbes.dumpCoroutinesInfo]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/dump-coroutines-info.html -[DebugProbes.printJob]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/print-job.html -[DebugProbes.printScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/print-scope.html -[DebugProbes.enableCreationStackTraces]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/enable-creation-stack-traces.html +[DebugProbes]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/index.html +[DebugProbes.install]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/install.html +[DebugProbes.dumpCoroutines]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/dump-coroutines.html +[DebugProbes.dumpCoroutinesInfo]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/dump-coroutines-info.html +[DebugProbes.printJob]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/print-job.html +[DebugProbes.printScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/print-scope.html +[DebugProbes.enableCreationStackTraces]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug/-debug-probes/enable-creation-stack-traces.html -[CoroutinesTimeout]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug.junit4/-coroutines-timeout/index.html +[CoroutinesTimeout]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-debug/kotlinx.coroutines.debug.junit4/-coroutines-timeout/index.html diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 4ac41e22a0..4f78298ac1 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -368,26 +368,26 @@ If you have any suggestions for improvements to this experimental API please sha -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html -[Dispatchers.Main]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html -[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html -[ExperimentalCoroutinesApi]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-experimental-coroutines-api/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[Dispatchers.Unconfined]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html +[Dispatchers.Main]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-main.html +[yield]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html +[ExperimentalCoroutinesApi]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-experimental-coroutines-api/index.html -[runTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html -[TestCoroutineScheduler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scheduler/index.html -[TestScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/index.html -[TestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-dispatcher/index.html -[Dispatchers.setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html -[StandardTestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-standard-test-dispatcher.html -[UnconfinedTestDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-unconfined-test-dispatcher.html -[setMain]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html -[TestScope.testScheduler]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/test-scheduler.html -[TestScope.runTest]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html -[runCurrent]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-current.html +[runTest]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html +[TestCoroutineScheduler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-scheduler/index.html +[TestScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/index.html +[TestDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-dispatcher/index.html +[Dispatchers.setMain]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html +[StandardTestDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-standard-test-dispatcher.html +[UnconfinedTestDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-unconfined-test-dispatcher.html +[setMain]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/set-main.html +[TestScope.testScheduler]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-scope/test-scheduler.html +[TestScope.runTest]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html +[runCurrent]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-current.html diff --git a/reactive/kotlinx-coroutines-reactive/README.md b/reactive/kotlinx-coroutines-reactive/README.md index ec59d3d9fd..cd27b27d97 100644 --- a/reactive/kotlinx-coroutines-reactive/README.md +++ b/reactive/kotlinx-coroutines-reactive/README.md @@ -33,23 +33,23 @@ Suspending extension functions and suspending iteration: -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html +[ProducerScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[kotlinx.coroutines.reactive.publish]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html -[Publisher.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-flow.html -[Flow.asPublisher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-publisher.html -[org.reactivestreams.Publisher.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first.html -[org.reactivestreams.Publisher.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-default.html -[org.reactivestreams.Publisher.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-else.html -[org.reactivestreams.Publisher.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-null.html -[org.reactivestreams.Publisher.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html +[kotlinx.coroutines.reactive.publish]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html +[Publisher.asFlow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-flow.html +[Flow.asPublisher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/as-publisher.html +[org.reactivestreams.Publisher.awaitFirst]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first.html +[org.reactivestreams.Publisher.awaitFirstOrDefault]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-default.html +[org.reactivestreams.Publisher.awaitFirstOrElse]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-else.html +[org.reactivestreams.Publisher.awaitFirstOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-first-or-null.html +[org.reactivestreams.Publisher.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/await-single.html diff --git a/reactive/kotlinx-coroutines-reactor/README.md b/reactive/kotlinx-coroutines-reactor/README.md index 69157afc55..577385a074 100644 --- a/reactive/kotlinx-coroutines-reactor/README.md +++ b/reactive/kotlinx-coroutines-reactor/README.md @@ -32,24 +32,24 @@ Conversion functions: -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[mono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html -[flux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/flux.html -[Flow.asFlux]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-flux.html -[ReactorContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/-reactor-context/index.html -[kotlinx.coroutines.Job.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html -[kotlinx.coroutines.Deferred.asMono]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html -[reactor.core.scheduler.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-coroutine-dispatcher.html +[mono]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/mono.html +[flux]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/flux.html +[Flow.asFlux]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-flux.html +[ReactorContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/-reactor-context/index.html +[kotlinx.coroutines.Job.asMono]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html +[kotlinx.coroutines.Deferred.asMono]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-mono.html +[reactor.core.scheduler.Scheduler.asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-reactor/kotlinx.coroutines.reactor/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx2/README.md b/reactive/kotlinx-coroutines-rx2/README.md index d93f569ac9..4131716554 100644 --- a/reactive/kotlinx-coroutines-rx2/README.md +++ b/reactive/kotlinx-coroutines-rx2/README.md @@ -50,40 +50,40 @@ Conversion functions: -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html +[ProducerScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[rxCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-completable.html -[rxMaybe]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-maybe.html -[rxSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-single.html -[rxObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-observable.html -[rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html -[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flowable.html -[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-observable.html -[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flow.html -[io.reactivex.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html -[io.reactivex.MaybeSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html -[io.reactivex.MaybeSource.awaitSingleOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single-or-null.html -[io.reactivex.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html -[io.reactivex.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first.html -[io.reactivex.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-default.html -[io.reactivex.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-else.html -[io.reactivex.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-null.html -[io.reactivex.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html -[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-completable.html -[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-single.html -[io.reactivex.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-coroutine-dispatcher.html +[rxCompletable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-completable.html +[rxMaybe]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-maybe.html +[rxSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-single.html +[rxObservable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-observable.html +[rxFlowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html +[Flow.asFlowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flowable.html +[Flow.asObservable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-observable.html +[ObservableSource.asFlow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-flow.html +[io.reactivex.CompletableSource.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html +[io.reactivex.MaybeSource.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html +[io.reactivex.MaybeSource.awaitSingleOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single-or-null.html +[io.reactivex.SingleSource.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await.html +[io.reactivex.ObservableSource.awaitFirst]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first.html +[io.reactivex.ObservableSource.awaitFirstOrDefault]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-default.html +[io.reactivex.ObservableSource.awaitFirstOrElse]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-else.html +[io.reactivex.ObservableSource.awaitFirstOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-first-or-null.html +[io.reactivex.ObservableSource.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/await-single.html +[kotlinx.coroutines.Job.asCompletable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-completable.html +[kotlinx.coroutines.Deferred.asSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-single.html +[io.reactivex.Scheduler.asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/as-coroutine-dispatcher.html diff --git a/reactive/kotlinx-coroutines-rx3/README.md b/reactive/kotlinx-coroutines-rx3/README.md index 1530558ce2..753df277de 100644 --- a/reactive/kotlinx-coroutines-rx3/README.md +++ b/reactive/kotlinx-coroutines-rx3/README.md @@ -50,40 +50,40 @@ Conversion functions: -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[CoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[CoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/index.html -[ProducerScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html +[ProducerScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-producer-scope/index.html -[Flow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html +[Flow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/index.html -[rxCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-completable.html -[rxMaybe]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-maybe.html -[rxSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-single.html -[rxObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-observable.html -[rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-flowable.html -[Flow.asFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flowable.html -[Flow.asObservable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-observable.html -[ObservableSource.asFlow]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flow.html -[io.reactivex.rxjava3.core.CompletableSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html -[io.reactivex.rxjava3.core.MaybeSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html -[io.reactivex.rxjava3.core.MaybeSource.awaitSingleOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single-or-null.html -[io.reactivex.rxjava3.core.SingleSource.await]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirst]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-default.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrElse]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-else.html -[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrNull]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-null.html -[io.reactivex.rxjava3.core.ObservableSource.awaitSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html -[kotlinx.coroutines.Job.asCompletable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-completable.html -[kotlinx.coroutines.Deferred.asSingle]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-single.html -[io.reactivex.rxjava3.core.Scheduler.asCoroutineDispatcher]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-coroutine-dispatcher.html +[rxCompletable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-completable.html +[rxMaybe]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-maybe.html +[rxSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-single.html +[rxObservable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-observable.html +[rxFlowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/rx-flowable.html +[Flow.asFlowable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flowable.html +[Flow.asObservable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-observable.html +[ObservableSource.asFlow]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-flow.html +[io.reactivex.rxjava3.core.CompletableSource.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html +[io.reactivex.rxjava3.core.MaybeSource.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html +[io.reactivex.rxjava3.core.MaybeSource.awaitSingleOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single-or-null.html +[io.reactivex.rxjava3.core.SingleSource.await]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirst]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrDefault]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-default.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrElse]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-else.html +[io.reactivex.rxjava3.core.ObservableSource.awaitFirstOrNull]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-first-or-null.html +[io.reactivex.rxjava3.core.ObservableSource.awaitSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/await-single.html +[kotlinx.coroutines.Job.asCompletable]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-completable.html +[kotlinx.coroutines.Deferred.asSingle]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-single.html +[io.reactivex.rxjava3.core.Scheduler.asCoroutineDispatcher]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-rx3/kotlinx.coroutines.rx3/as-coroutine-dispatcher.html diff --git a/site/deploy.sh b/site/deploy.sh deleted file mode 100755 index a04e49258d..0000000000 --- a/site/deploy.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -# -# Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. -# - -# Abort on first error -set -e - -# Directories -SITE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -ROOT_DIR="$SITE_DIR/.." -BUILD_DIR="$ROOT_DIR/build" -DIST_DIR="$BUILD_DIR/dokka/htmlMultiModule" -PAGES_DIR="$BUILD_DIR/pages" - -# Init options -GRADLE_OPT= -PUSH_OPT= - -# Set dry run if needed -if [ "$2" == "push" ] ; then - echo "--- Doing LIVE site deployment, so do clean build" - GRADLE_OPT=clean -else - echo "--- Doing dry-run. To commit do 'deploy.sh push'" - PUSH_OPT=--dry-run -fi - -# Makes sure that site is built -"$ROOT_DIR/gradlew" $GRADLE_OPT dokkaHtmlMultiModule - -# Cleanup dist directory (and ignore errors) -rm -rf "$PAGES_DIR" || true - -# Prune worktrees to avoid errors from previous attempts -git --work-tree "$ROOT_DIR" worktree prune - -# Create git worktree for gh-pages branch -git --work-tree "$ROOT_DIR" worktree add -B gh-pages "$PAGES_DIR" origin/gh-pages - -# Now work in newly created workspace -cd "$PAGES_DIR" - -# Fixup all the old documentation files -# Remove non-.html files -git rm `find . -type f -not -name '*.html' -not -name '.git'` > /dev/null - -# Remove all the old documentation -git rm -r * > /dev/null - -# Copy new documentation from dist -cp -r "$DIST_DIR"/* "$PAGES_DIR" - -# Add it all to git -git add * - -# Commit docs for the new version -if [ -z "$1" ] ; then - echo "No argument with version supplied -- skipping commit" -else - git commit -m "Version $1 docs" - git push $PUSH_OPT origin gh-pages:gh-pages -fi diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index ddc39bdd64..da461b34e2 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -608,30 +608,30 @@ After delay -[launch]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html -[delay]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html -[Job]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html -[Job.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html -[CoroutineScope]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html -[MainScope()]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html -[withContext]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html -[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html -[CoroutineStart]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/index.html -[async]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html -[CoroutineStart.UNDISPATCHED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-u-n-d-i-s-p-a-t-c-h-e-d/index.html +[launch]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html +[delay]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/delay.html +[Job]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/index.html +[Job.cancel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/cancel.html +[CoroutineScope]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-scope/index.html +[MainScope()]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html +[withContext]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html +[Dispatchers.Default]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html +[CoroutineStart]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/index.html +[async]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/async.html +[CoroutineStart.UNDISPATCHED]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-start/-u-n-d-i-s-p-a-t-c-h-e-d/index.html -[actor]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html -[SendChannel.trySend]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html -[SendChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html -[Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html -[Channel.Factory.CONFLATED]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/-factory/-c-o-n-f-l-a-t-e-d.html +[actor]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/actor.html +[SendChannel.trySend]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/try-send.html +[SendChannel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/index.html +[Channel]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html +[Channel.Factory.CONFLATED]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/-factory/-c-o-n-f-l-a-t-e-d.html -[kotlinx.coroutines.Dispatchers.JavaFx]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-javafx/kotlinx.coroutines.javafx/-java-fx.html +[kotlinx.coroutines.Dispatchers.JavaFx]: https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-javafx/kotlinx.coroutines.javafx/-java-fx.html From 4262e3fea14773767690c4ed3636f6578008dd5b Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 28 Jun 2022 18:15:47 +0200 Subject: [PATCH 309/328] Additional comment in CoroutineScheduler --- kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt b/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt index 6b7fecf553..e08d1cef90 100644 --- a/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt +++ b/kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt @@ -683,6 +683,7 @@ internal class CoroutineScheduler( * No tasks were found: * 1) Either at least one of the workers has stealable task in its FIFO-buffer with a stealing deadline. * Then its deadline is stored in [minDelayUntilStealableTask] + * // '2)' can be found below * * Then just park for that duration (ditto re-scanning). * While it could potentially lead to short (up to WORK_STEALING_TIME_RESOLUTION_NS ns) starvations, From 8b65a479dfa43240daf2e08efd37793adc274104 Mon Sep 17 00:00:00 2001 From: zoobestik Date: Wed, 29 Jun 2022 22:40:55 +0300 Subject: [PATCH 310/328] breakleg; knit validation fix --- RELEASE.md | 18 +++++++++--------- integration/kotlinx-coroutines-guava/README.md | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 5e3144de99..ef7cc23365 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -62,20 +62,20 @@ To release a new `` of `kotlinx-coroutines`: * Create a release named ``, creating the `` tag. * Cut & paste lines from [`CHANGES.md`](CHANGES.md) into description. -4. Build and publish the documentation for the web-site:
    - * Set new value for [`kotlinx.coroutines.release.tag`](https://buildserver.labs.intellij.net/admin/editProject.html?projectId=Kotlin_KotlinSites_Builds_KotlinlangOrg_LibrariesAPIs&tab=projectParams) - * And run deploy [configuration](https://buildserver.labs.intellij.net/buildConfiguration/Kotlin_KotlinSites_Builds_KotlinlangOrg_KotlinCoroutinesApi?branch=%3Cdefault%3E&buildTypeTab=overview&mode=builds) - -5. Announce the new release in [Slack](https://kotlinlang.slack.com) +4. Announce the new release in [Slack](https://kotlinlang.slack.com) -6. Switch onto the `develop` branch:
    +5. Switch onto the `develop` branch:
    `git checkout develop` -7. Fetch the latest `master`:
    +6. Fetch the latest `master`:
    `git fetch` -8. Merge the release from `master`:
    +7. Merge the release from `master`:
    `git merge origin/master` -9. Push the updates to GitHub:
    +8. Push the updates to GitHub:
    `git push` + +9. Build and publish the documentation for the web-site:
    + * Set new value for [`kotlinx.coroutines.release.tag`](https://buildserver.labs.intellij.net/admin/editProject.html?projectId=Kotlin_KotlinSites_Builds_KotlinlangOrg_LibrariesAPIs&tab=projectParams) + * And run deploy [configuration](https://buildserver.labs.intellij.net/buildConfiguration/Kotlin_KotlinSites_Builds_KotlinlangOrg_KotlinCoroutinesApi?branch=%3Cdefault%3E&buildTypeTab=overview&mode=builds) diff --git a/integration/kotlinx-coroutines-guava/README.md b/integration/kotlinx-coroutines-guava/README.md index 41611252fa..c84fb8610c 100644 --- a/integration/kotlinx-coroutines-guava/README.md +++ b/integration/kotlinx-coroutines-guava/README.md @@ -62,6 +62,6 @@ Integration with Guava [ListenableFuture](https://github.com/google/guava/wiki/L -[com.google.common.util.concurrent.ListenableFuture]: https://google.github.io/guava/releases/31.0.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html +[com.google.common.util.concurrent.ListenableFuture]: https://kotlinlang.org/api/kotlinx.coroutines/https://google.github.io/guava/releases/31.0.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html From 793403272dde4f992d3e513d67e4d6d2c1fc5104 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 30 Jun 2022 15:29:35 +0200 Subject: [PATCH 311/328] Reduce reachable references of disposed invokeOnTimeout handle (#3353) * Reduce reachable references of disposed invokeOnTimeout handle Fixes #3351 --- .../native/src/MultithreadedDispatchers.kt | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt index d991fc169e..1c1306c291 100644 --- a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt +++ b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt @@ -35,9 +35,25 @@ internal class WorkerDispatcher(name: String) : CloseableCoroutineDispatcher(), } override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - // No API to cancel on timeout - worker.executeAfter(timeMillis.toMicrosSafe()) { block.run() } - return NonDisposableHandle + // Workers don't have an API to cancel sent "executeAfter" block, but we are trying + // to control the damage and reduce reachable objects by nulling out `block` + // that may retain a lot of references, and leaving only an empty shell after a timely disposal + // This is a class and not an object with `block` in a closure because that would defeat the purpose. + class DisposableBlock(block: Runnable) : DisposableHandle, Function0 { + private val disposableHolder = AtomicReference(block) + + override fun invoke() { + disposableHolder.value?.run() + } + + override fun dispose() { + disposableHolder.value = null + } + } + + val disposableBlock = DisposableBlock(block) + worker.executeAfter(timeMillis.toMicrosSafe(), disposableBlock) + return disposableBlock } override fun close() { From 10261a76b0c4cd0bdfd73bcb8c50e2eb6b44fb06 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 4 Jul 2022 13:42:23 +0200 Subject: [PATCH 312/328] Update readme (#3343) --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3b24731d25..395682d95f 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ [![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.6.21-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.6.0` release. +This is a companion version for the Kotlin `1.6.21` release. ```kotlin suspend fun main() = coroutineScope { @@ -188,14 +188,6 @@ Kotlin/Native version of `kotlinx.coroutines` is published as [`kotlinx-coroutines-core-$platform`](https://mvnrepository.com/search?q=kotlinx-coroutines-core-) where `$platform` is the target Kotlin/Native platform. [List of currently supported targets](https://github.com/Kotlin/kotlinx.coroutines/blob/master/gradle/compile-native-multiplatform.gradle#L16). - -Only single-threaded code (JS-style) on Kotlin/Native is supported in stable versions. -Additionally, a special `-native-mt` version is released on a regular basis, for the state of multi-threaded coroutines support -please follow the [corresponding issue](https://github.com/Kotlin/kotlinx.coroutines/issues/462) for the additional details. - -Since Kotlin/Native does not generally provide binary compatibility between versions, -you should use the same version of the Kotlin/Native compiler as was used to build `kotlinx.coroutines`. - ## Building and Contributing See [Contributing Guidelines](CONTRIBUTING.md). From 8b6473df0336128ca4bac79811d858db330bd251 Mon Sep 17 00:00:00 2001 From: Yehor Kulbachka <38127655+EgorKulbachka@users.noreply.github.com> Date: Fri, 8 Jul 2022 13:38:30 +0200 Subject: [PATCH 313/328] Comply with Subscriber rule 2.7 in the `await*` impl (#3360) There is a possibility of a race between Subscription.request and Subscription.cancel methods since cancellation handler could be executed in a separate thread. Rule [2.7](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2-subscriber-code) requires Subscription methods to be executed serially. --- .../kotlinx-coroutines-reactive/src/Await.kt | 30 ++++++++++--- .../test/AwaitCancellationStressTest.kt | 43 +++++++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 reactive/kotlinx-coroutines-reactive/test/AwaitCancellationStressTest.kt diff --git a/reactive/kotlinx-coroutines-reactive/src/Await.kt b/reactive/kotlinx-coroutines-reactive/src/Await.kt index da8632bffc..3d9a0f8567 100644 --- a/reactive/kotlinx-coroutines-reactive/src/Await.kt +++ b/reactive/kotlinx-coroutines-reactive/src/Await.kt @@ -198,12 +198,20 @@ private suspend fun Publisher.awaitOne( /** cancelling the new subscription due to rule 2.5, though the publisher would either have to * subscribe more than once, which would break 2.12, or leak this [Subscriber]. */ if (subscription != null) { - sub.cancel() + withSubscriptionLock { + sub.cancel() + } return } subscription = sub - cont.invokeOnCancellation { sub.cancel() } - sub.request(if (mode == Mode.FIRST || mode == Mode.FIRST_OR_DEFAULT) 1 else Long.MAX_VALUE) + cont.invokeOnCancellation { + withSubscriptionLock { + sub.cancel() + } + } + withSubscriptionLock { + sub.request(if (mode == Mode.FIRST || mode == Mode.FIRST_OR_DEFAULT) 1 else Long.MAX_VALUE) + } } override fun onNext(t: T) { @@ -228,12 +236,16 @@ private suspend fun Publisher.awaitOne( return } seenValue = true - sub.cancel() + withSubscriptionLock { + sub.cancel() + } cont.resume(t) } Mode.LAST, Mode.SINGLE, Mode.SINGLE_OR_DEFAULT -> { if ((mode == Mode.SINGLE || mode == Mode.SINGLE_OR_DEFAULT) && seenValue) { - sub.cancel() + withSubscriptionLock { + sub.cancel() + } /* the check for `cont.isActive` is needed in case `sub.cancel() above calls `onComplete` or `onError` on its own. */ if (cont.isActive) { @@ -289,6 +301,14 @@ private suspend fun Publisher.awaitOne( inTerminalState = true return true } + + /** + * Enforce rule 2.7: [Subscription.request] and [Subscription.cancel] must be executed serially + */ + @Synchronized + private fun withSubscriptionLock(block: () -> Unit) { + block() + } }) } diff --git a/reactive/kotlinx-coroutines-reactive/test/AwaitCancellationStressTest.kt b/reactive/kotlinx-coroutines-reactive/test/AwaitCancellationStressTest.kt new file mode 100644 index 0000000000..aaf8df6e69 --- /dev/null +++ b/reactive/kotlinx-coroutines-reactive/test/AwaitCancellationStressTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.reactive + +import kotlinx.coroutines.* +import org.junit.* +import org.reactivestreams.* +import java.util.concurrent.locks.* + +/** + * This test checks implementation of rule 2.7 for await methods - serial execution of subscription methods + */ +class AwaitCancellationStressTest : TestBase() { + private val iterations = 10_000 * stressTestMultiplier + + @Test + fun testAwaitCancellationOrder() = runTest { + repeat(iterations) { + val job = launch(Dispatchers.Default) { + testPublisher().awaitFirst() + } + job.cancelAndJoin() + } + } + + private fun testPublisher() = Publisher { s -> + val lock = ReentrantLock() + s.onSubscribe(object : Subscription { + override fun request(n: Long) { + check(lock.tryLock()) + s.onNext(42) + lock.unlock() + } + + override fun cancel() { + check(lock.tryLock()) + lock.unlock() + } + }) + } +} From 562902b0dc2ce1af58e37ff203ed0f06675562dc Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 11 Jul 2022 10:48:44 +0200 Subject: [PATCH 314/328] Fix debug module publication with shadow plugin (#3357) Fixes #3345 Fixes #3334 --- gradle/publish.gradle | 6 +-- integration-testing/build.gradle | 25 ++++++++++++- .../kotlin/DynamicAttachDebugTest.kt | 29 +++++++++++++++ kotlinx-coroutines-debug/build.gradle | 37 +++++++++++++------ 4 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 integration-testing/src/debugDynamicAgentTest/kotlin/DynamicAttachDebugTest.kt diff --git a/gradle/publish.gradle b/gradle/publish.gradle index 00034bfa87..f3b1561dde 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -45,11 +45,7 @@ publishing { // Configure java publications for regular non-MPP modules publications { maven(MavenPublication) { - if (project.name == "kotlinx-coroutines-debug") { - project.shadow.component(it) - } else { - from components.java - } + from components.java artifact sourcesJar } } diff --git a/integration-testing/build.gradle b/integration-testing/build.gradle index c23d35fbe7..985a40ed96 100644 --- a/integration-testing/build.gradle +++ b/integration-testing/build.gradle @@ -23,6 +23,7 @@ dependencies { } sourceSets { + // Test that relies on Guava to reflectively check all Throwable subclasses in coroutines withGuavaTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -33,6 +34,7 @@ sourceSets { implementation 'com.google.guava:guava:31.1-jre' } } + // Checks correctness of Maven publication (JAR resources) and absence of atomicfu symbols mavenTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -43,6 +45,7 @@ sourceSets { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" } } + // Checks that kotlinx-coroutines-debug can be used as -javaagent parameter debugAgentTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -53,6 +56,20 @@ sourceSets { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-debug:$coroutines_version" } } + + // Checks that kotlinx-coroutines-debug agent can self-attach dynamically to JVM as standalone dependency + debugDynamicAgentTest { + kotlin + compileClasspath += sourceSets.test.runtimeClasspath + runtimeClasspath += sourceSets.test.runtimeClasspath + + dependencies { + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-debug:$coroutines_version" + } + } + + // Checks that kotlinx-coroutines-core can be used as -javaagent parameter coreAgentTest { kotlin compileClasspath += sourceSets.test.runtimeClasspath @@ -93,6 +110,12 @@ task debugAgentTest(type: Test) { systemProperties project.properties.subMap(["overwrite.probes"]) } +task debugDynamicAgentTest(type: Test) { + def sourceSet = sourceSets.debugDynamicAgentTest + testClassesDirs = sourceSet.output.classesDirs + classpath = sourceSet.runtimeClasspath +} + task coreAgentTest(type: Test) { def sourceSet = sourceSets.coreAgentTest def coroutinesCoreJar = sourceSet.runtimeClasspath.filter {it.name == "kotlinx-coroutines-core-jvm-${coroutines_version}.jar" }.singleFile @@ -106,5 +129,5 @@ compileTestKotlin { } check { - dependsOn([withGuavaTest, mavenTest, debugAgentTest, coreAgentTest, 'smokeTest:build']) + dependsOn([withGuavaTest, debugDynamicAgentTest, mavenTest, debugAgentTest, coreAgentTest, 'smokeTest:build']) } diff --git a/integration-testing/src/debugDynamicAgentTest/kotlin/DynamicAttachDebugTest.kt b/integration-testing/src/debugDynamicAgentTest/kotlin/DynamicAttachDebugTest.kt new file mode 100644 index 0000000000..ff9cac847c --- /dev/null +++ b/integration-testing/src/debugDynamicAgentTest/kotlin/DynamicAttachDebugTest.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +import org.junit.* +import kotlinx.coroutines.* +import kotlinx.coroutines.debug.* +import org.junit.Test +import java.io.* +import java.lang.IllegalStateException + +class DynamicAttachDebugTest { + + @Test + fun testAgentDumpsCoroutines() = + DebugProbes.withDebugProbes { + runBlocking { + val baos = ByteArrayOutputStream() + DebugProbes.dumpCoroutines(PrintStream(baos)) + // if the agent works, then dumps should contain something, + // at least the fact that this test is running. + Assert.assertTrue(baos.toString().contains("testAgentDumpsCoroutines")) + } + } + + @Test(expected = IllegalStateException::class) + fun testAgentIsNotInstalled() { + DebugProbes.dumpCoroutines(PrintStream(ByteArrayOutputStream())) + } +} diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index a420004801..9165a41f9b 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -8,14 +8,6 @@ configurations { shadowDeps // shaded dependencies, not included into the resulting .pom file compileOnly.extendsFrom(shadowDeps) runtimeOnly.extendsFrom(shadowDeps) - - /* - * It is possible to extend a particular configuration with shadow, - * but in that case it changes dependency type to "runtime" and resolves it - * (so it cannot be further modified). Otherwise, shadow just ignores all dependencies. - */ - shadow.extendsFrom(api) // shadow - resulting configuration with shaded jar file - configureKotlinJvmPlatform(shadow) } dependencies { @@ -39,17 +31,38 @@ java { } jar { - manifest { - attributes "Premain-Class": "kotlinx.coroutines.debug.AgentPremain" - attributes "Can-Redefine-Classes": "true" + setEnabled(false) +} + +// This is a rough estimation of what shadow plugin has been doing with our default configuration prior to +// 1.6.2: https://github.com/johnrengelman/shadow/blob/1ff12fc816629ae5bc331fa3889c8ecfcaee7b27/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.groovy#L72-L82 +// We just emulate it here for backwards compatibility +shadowJar.configure { + def classpath = project.objects.fileCollection().from { -> + project.configurations.findByName('runtimeClasspath') + } + doFirst { + manifest.attributes 'Class-Path': classpath.collect { "${it.name}" }.findAll { it }.join(' ') } } -shadowJar { +def shadowJarTask = shadowJar { classifier null // Shadow only byte buddy, do not package kotlin stdlib configurations = [project.configurations.shadowDeps] relocate('net.bytebuddy', 'kotlinx.coroutines.repackaged.net.bytebuddy') + + manifest { + attributes "Premain-Class": "kotlinx.coroutines.debug.AgentPremain" + attributes "Can-Redefine-Classes": "true" + } +} + +configurations { + artifacts { + add("apiElements", shadowJarTask) + add("runtimeElements", shadowJarTask) + } } def commonKoverExcludes = From 143bdfa2da4c34f961651e63fcc6c33667693029 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Tue, 12 Jul 2022 15:16:37 +0300 Subject: [PATCH 315/328] Add a scope for launching background work in tests (#3348) Fixes https://github.com/Kotlin/kotlinx.coroutines/issues/3287 --- .../api/kotlinx-coroutines-core.api | 6 + .../common/src/JobSupport.kt | 1 + .../src/internal/StackTraceRecovery.common.kt | 2 +- .../common/src/internal/ThreadSafeHeap.kt | 10 + .../api/kotlinx-coroutines-test.api | 1 + .../common/src/TestBuilders.kt | 60 +++- .../common/src/TestCoroutineDispatchers.kt | 5 +- .../common/src/TestCoroutineScheduler.kt | 62 ++-- .../common/src/TestDispatcher.kt | 13 +- .../common/src/TestScope.kt | 53 ++- .../src/internal/ReportingSupervisorJob.kt | 24 ++ .../common/test/RunTestTest.kt | 12 + .../common/test/TestScopeTest.kt | 312 +++++++++++++++++- .../js/src/TestBuilders.kt | 4 +- .../jvm/src/TestBuildersJvm.kt | 4 +- .../src/migration/TestBuildersDeprecated.kt | 7 +- .../src/migration/TestCoroutineDispatcher.kt | 10 +- .../RunBlockingTestOnTestScopeTest.kt | 210 +++++++++++- .../native/src/TestBuilders.kt | 2 +- 19 files changed, 738 insertions(+), 60 deletions(-) create mode 100644 kotlinx-coroutines-test/common/src/internal/ReportingSupervisorJob.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index d227eb879b..57b33056b3 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -381,6 +381,12 @@ public final class kotlinx/coroutines/Job$DefaultImpls { public final class kotlinx/coroutines/Job$Key : kotlin/coroutines/CoroutineContext$Key { } +public class kotlinx/coroutines/JobImpl : kotlinx/coroutines/JobSupport, kotlinx/coroutines/CompletableJob { + public fun (Lkotlinx/coroutines/Job;)V + public fun complete ()Z + public fun completeExceptionally (Ljava/lang/Throwable;)Z +} + public final class kotlinx/coroutines/JobKt { public static final fun Job (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; public static final synthetic fun Job (Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; diff --git a/kotlinx-coroutines-core/common/src/JobSupport.kt b/kotlinx-coroutines-core/common/src/JobSupport.kt index 0a3dd23472..1b5975c8bc 100644 --- a/kotlinx-coroutines-core/common/src/JobSupport.kt +++ b/kotlinx-coroutines-core/common/src/JobSupport.kt @@ -1312,6 +1312,7 @@ private class Empty(override val isActive: Boolean) : Incomplete { override fun toString(): String = "Empty{${if (isActive) "Active" else "New" }}" } +@PublishedApi // for a custom job in the test module internal open class JobImpl(parent: Job?) : JobSupport(true), CompletableJob { init { initParentJob(parent) } override val onCancelComplete get() = true diff --git a/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt b/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt index 8e0b558cc4..2812b931de 100644 --- a/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt +++ b/kotlinx-coroutines-core/common/src/internal/StackTraceRecovery.common.kt @@ -40,7 +40,7 @@ internal expect suspend inline fun recoverAndThrow(exception: Throwable): Nothin * The opposite of [recoverStackTrace]. * It is guaranteed that `unwrap(recoverStackTrace(e)) === e` */ -@PublishedApi // only published for the multiplatform tests in our own code +@PublishedApi // published for the multiplatform implementation of kotlinx-coroutines-test internal expect fun unwrap(exception: E): E internal expect class StackTraceElement diff --git a/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt b/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt index 2100454be3..ad88103142 100644 --- a/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt +++ b/kotlinx-coroutines-core/common/src/internal/ThreadSafeHeap.kt @@ -37,6 +37,16 @@ public open class ThreadSafeHeap : SynchronizedObject() where T: ThreadSafeHe _size.value = 0 } + public fun find( + predicate: (value: T) -> Boolean + ): T? = synchronized(this) block@{ + for (i in 0 until size) { + val value = a?.get(i)!! + if (predicate(value)) return@block value + } + null + } + public fun peek(): T? = synchronized(this) { firstImpl() } public fun removeFirstOrNull(): T? = synchronized(this) { diff --git a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api index 4786b81bf9..bf639235d0 100644 --- a/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api +++ b/kotlinx-coroutines-test/api/kotlinx-coroutines-test.api @@ -105,6 +105,7 @@ public final class kotlinx/coroutines/test/TestDispatchers { } public abstract interface class kotlinx/coroutines/test/TestScope : kotlinx/coroutines/CoroutineScope { + public abstract fun getBackgroundScope ()Lkotlinx/coroutines/CoroutineScope; public abstract fun getTestScheduler ()Lkotlinx/coroutines/test/TestCoroutineScheduler; } diff --git a/kotlinx-coroutines-test/common/src/TestBuilders.kt b/kotlinx-coroutines-test/common/src/TestBuilders.kt index d8e9357611..80dc8d6083 100644 --- a/kotlinx-coroutines-test/common/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/common/src/TestBuilders.kt @@ -164,7 +164,11 @@ public fun TestScope.runTest( ): TestResult = asSpecificImplementation().let { it.enter() createTestResult { - runTestCoroutine(it, dispatchTimeoutMs, TestScopeImpl::tryGetCompletionCause, testBody) { it.leave() } + runTestCoroutine(it, dispatchTimeoutMs, TestScopeImpl::tryGetCompletionCause, testBody) { + backgroundScope.cancel() + testScheduler.advanceUntilIdleOr { false } + it.leave() + } } } @@ -172,7 +176,7 @@ public fun TestScope.runTest( * Runs [testProcedure], creating a [TestResult]. */ @Suppress("NO_ACTUAL_FOR_EXPECT") // actually suppresses `TestResult` -internal expect fun createTestResult(testProcedure: suspend () -> Unit): TestResult +internal expect fun createTestResult(testProcedure: suspend CoroutineScope.() -> Unit): TestResult /** A coroutine context element indicating that the coroutine is running inside `runTest`. */ internal object RunningInRunTest : CoroutineContext.Key, CoroutineContext.Element { @@ -195,7 +199,7 @@ internal const val DEFAULT_DISPATCH_TIMEOUT_MS = 60_000L * The [cleanup] procedure may either throw [UncompletedCoroutinesError] to denote that child coroutines were leaked, or * return a list of uncaught exceptions that should be reported at the end of the test. */ -internal suspend fun > runTestCoroutine( +internal suspend fun > CoroutineScope.runTestCoroutine( coroutine: T, dispatchTimeoutMs: Long, tryGetCompletionCause: T.() -> Throwable?, @@ -207,6 +211,27 @@ internal suspend fun > runTestCoroutine( coroutine.start(CoroutineStart.UNDISPATCHED, coroutine) { testBody() } + /** + * The general procedure here is as follows: + * 1. Try running the work that the scheduler knows about, both background and foreground. + * + * 2. Wait until we run out of foreground work to do. This could mean one of the following: + * * The main coroutine is already completed. This is checked separately; then we leave the procedure. + * * It's switched to another dispatcher that doesn't know about the [TestCoroutineScheduler]. + * * Generally, it's waiting for something external (like a network request, or just an arbitrary callback). + * * The test simply hanged. + * * The main coroutine is waiting for some background work. + * + * 3. We await progress from things that are not the code under test: + * the background work that the scheduler knows about, the external callbacks, + * the work on dispatchers not linked to the scheduler, etc. + * + * When we observe that the code under test can proceed, we go to step 1 again. + * If there is no activity for [dispatchTimeoutMs] milliseconds, we consider the test to have hanged. + * + * The background work is not running on a dedicated thread. + * Instead, the test thread itself is used, by spawning a separate coroutine. + */ var completed = false while (!completed) { scheduler.advanceUntilIdle() @@ -216,16 +241,29 @@ internal suspend fun > runTestCoroutine( completed = true continue } - select { - coroutine.onJoin { - completed = true - } - scheduler.onDispatchEvent { - // we received knowledge that `scheduler` observed a dispatch event, so we reset the timeout + // in case progress depends on some background work, we need to keep spinning it. + val backgroundWorkRunner = launch(CoroutineName("background work runner")) { + while (true) { + scheduler.tryRunNextTaskUnless { !isActive } + // yield so that the `select` below has a chance to check if its conditions are fulfilled + yield() } - onTimeout(dispatchTimeoutMs) { - handleTimeout(coroutine, dispatchTimeoutMs, tryGetCompletionCause, cleanup) + } + try { + select { + coroutine.onJoin { + // observe that someone completed the test coroutine and leave without waiting for the timeout + completed = true + } + scheduler.onDispatchEvent { + // we received knowledge that `scheduler` observed a dispatch event, so we reset the timeout + } + onTimeout(dispatchTimeoutMs) { + handleTimeout(coroutine, dispatchTimeoutMs, tryGetCompletionCause, cleanup) + } } + } finally { + backgroundWorkRunner.cancelAndJoin() } } coroutine.getCompletionExceptionOrNull()?.let { exception -> diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt b/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt index 4cc48f47d0..e99fe8b124 100644 --- a/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt +++ b/kotlinx-coroutines-test/common/src/TestCoroutineDispatchers.kt @@ -96,7 +96,7 @@ private class UnconfinedTestDispatcherImpl( @Suppress("INVISIBLE_MEMBER") override fun dispatch(context: CoroutineContext, block: Runnable) { checkSchedulerInContext(scheduler, context) - scheduler.sendDispatchEvent() + scheduler.sendDispatchEvent(context) /** copy-pasted from [kotlinx.coroutines.Unconfined.dispatch] */ /** It can only be called by the [yield] function. See also code of [yield] function. */ @@ -151,8 +151,7 @@ private class StandardTestDispatcherImpl( ) : TestDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) { - checkSchedulerInContext(scheduler, context) - scheduler.registerEvent(this, 0, block) { false } + scheduler.registerEvent(this, 0, block, context) { false } } override fun toString(): String = "${name ?: "StandardTestDispatcher"}[scheduler=$scheduler]" diff --git a/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt b/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt index 9aa90fac1d..e735c6d4de 100644 --- a/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt +++ b/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt @@ -62,17 +62,20 @@ public class TestCoroutineScheduler : AbstractCoroutineContextElement(TestCorout dispatcher: TestDispatcher, timeDeltaMillis: Long, marker: T, + context: CoroutineContext, isCancelled: (T) -> Boolean ): DisposableHandle { require(timeDeltaMillis >= 0) { "Attempted scheduling an event earlier in time (with the time delta $timeDeltaMillis)" } + checkSchedulerInContext(this, context) val count = count.getAndIncrement() + val isForeground = context[BackgroundWork] === null return synchronized(lock) { val time = addClamping(currentTime, timeDeltaMillis) - val event = TestDispatchEvent(dispatcher, count, time, marker as Any) { isCancelled(marker) } + val event = TestDispatchEvent(dispatcher, count, time, marker as Any, isForeground) { isCancelled(marker) } events.addLast(event) /** can't be moved above: otherwise, [onDispatchEvent] could consume the token sent here before there's * actually anything in the event queue. */ - sendDispatchEvent() + sendDispatchEvent(context) DisposableHandle { synchronized(lock) { events.remove(event) @@ -82,10 +85,12 @@ public class TestCoroutineScheduler : AbstractCoroutineContextElement(TestCorout } /** - * Runs the next enqueued task, advancing the virtual time to the time of its scheduled awakening. + * Runs the next enqueued task, advancing the virtual time to the time of its scheduled awakening, + * unless [condition] holds. */ - private fun tryRunNextTask(): Boolean { + internal fun tryRunNextTaskUnless(condition: () -> Boolean): Boolean { val event = synchronized(lock) { + if (condition()) return false val event = events.removeFirstOrNull() ?: return false if (currentTime > event.time) currentTimeAheadOfEvents() @@ -105,9 +110,15 @@ public class TestCoroutineScheduler : AbstractCoroutineContextElement(TestCorout * functionality, query [currentTime] before and after the execution to achieve the same result. */ @ExperimentalCoroutinesApi - public fun advanceUntilIdle() { - while (!synchronized(lock) { events.isEmpty }) { - tryRunNextTask() + public fun advanceUntilIdle(): Unit = advanceUntilIdleOr { events.none(TestDispatchEvent<*>::isForeground) } + + /** + * [condition]: guaranteed to be invoked under the lock. + */ + internal fun advanceUntilIdleOr(condition: () -> Boolean) { + while (true) { + if (!tryRunNextTaskUnless(condition)) + return } } @@ -169,24 +180,19 @@ public class TestCoroutineScheduler : AbstractCoroutineContextElement(TestCorout /** * Checks that the only tasks remaining in the scheduler are cancelled. */ - internal fun isIdle(strict: Boolean = true): Boolean { + internal fun isIdle(strict: Boolean = true): Boolean = synchronized(lock) { - if (strict) - return events.isEmpty - // TODO: also completely empties the queue, as there's no nondestructive way to iterate over [ThreadSafeHeap] - val presentEvents = mutableListOf>() - while (true) { - presentEvents += events.removeFirstOrNull() ?: break - } - return presentEvents.all { it.isCancelled() } + if (strict) events.isEmpty else events.none { !it.isCancelled() } } - } /** * Notifies this scheduler about a dispatch event. + * + * [context] is the context in which the task will be dispatched. */ - internal fun sendDispatchEvent() { - dispatchEvents.trySend(Unit) + internal fun sendDispatchEvent(context: CoroutineContext) { + if (context[BackgroundWork] !== BackgroundWork) + dispatchEvents.trySend(Unit) } /** @@ -216,6 +222,8 @@ private class TestDispatchEvent( private val count: Long, @JvmField val time: Long, @JvmField val marker: T, + @JvmField val isForeground: Boolean, + // TODO: remove once the deprecated API is gone @JvmField val isCancelled: () -> Boolean ) : Comparable>, ThreadSafeHeapNode { override var heap: ThreadSafeHeap<*>? = null @@ -224,7 +232,7 @@ private class TestDispatchEvent( override fun compareTo(other: TestDispatchEvent<*>) = compareValuesBy(this, other, TestDispatchEvent<*>::time, TestDispatchEvent<*>::count) - override fun toString() = "TestDispatchEvent(time=$time, dispatcher=$dispatcher)" + override fun toString() = "TestDispatchEvent(time=$time, dispatcher=$dispatcher${if (isForeground) "" else ", background"})" } // works with positive `a`, `b` @@ -238,3 +246,17 @@ internal fun checkSchedulerInContext(scheduler: TestCoroutineScheduler, context: } } } + +/** + * A coroutine context key denoting that the work is to be executed in the background. + * @see [TestScope.backgroundScope] + */ +internal object BackgroundWork : CoroutineContext.Key, CoroutineContext.Element { + override val key: CoroutineContext.Key<*> + get() = this + + override fun toString(): String = "BackgroundWork" +} + +private fun ThreadSafeHeap.none(predicate: (T) -> Boolean) where T: ThreadSafeHeapNode, T: Comparable = + find(predicate) == null diff --git a/kotlinx-coroutines-test/common/src/TestDispatcher.kt b/kotlinx-coroutines-test/common/src/TestDispatcher.kt index f434572663..348cc2f185 100644 --- a/kotlinx-coroutines-test/common/src/TestDispatcher.kt +++ b/kotlinx-coroutines-test/common/src/TestDispatcher.kt @@ -10,14 +10,14 @@ import kotlin.jvm.* /** * A test dispatcher that can interface with a [TestCoroutineScheduler]. - * + * * The available implementations are: * * [StandardTestDispatcher] is a dispatcher that places new tasks into a queue. * * [UnconfinedTestDispatcher] is a dispatcher that behaves like [Dispatchers.Unconfined] while allowing to control * the virtual time. */ @ExperimentalCoroutinesApi -public abstract class TestDispatcher internal constructor(): CoroutineDispatcher(), Delay { +public abstract class TestDispatcher internal constructor() : CoroutineDispatcher(), Delay { /** The scheduler that this dispatcher is linked to. */ @ExperimentalCoroutinesApi public abstract val scheduler: TestCoroutineScheduler @@ -30,16 +30,13 @@ public abstract class TestDispatcher internal constructor(): CoroutineDispatcher /** @suppress */ override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation) { - checkSchedulerInContext(scheduler, continuation.context) val timedRunnable = CancellableContinuationRunnable(continuation, this) - scheduler.registerEvent(this, timeMillis, timedRunnable, ::cancellableRunnableIsCancelled) + scheduler.registerEvent(this, timeMillis, timedRunnable, continuation.context, ::cancellableRunnableIsCancelled) } /** @suppress */ - override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle { - checkSchedulerInContext(scheduler, context) - return scheduler.registerEvent(this, timeMillis, block) { false } - } + override fun invokeOnTimeout(timeMillis: Long, block: Runnable, context: CoroutineContext): DisposableHandle = + scheduler.registerEvent(this, timeMillis, block, context) { false } } /** diff --git a/kotlinx-coroutines-test/common/src/TestScope.kt b/kotlinx-coroutines-test/common/src/TestScope.kt index 60585a1d50..15d48a2ae2 100644 --- a/kotlinx-coroutines-test/common/src/TestScope.kt +++ b/kotlinx-coroutines-test/common/src/TestScope.kt @@ -6,6 +6,7 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* import kotlinx.coroutines.internal.* +import kotlinx.coroutines.test.internal.* import kotlin.coroutines.* import kotlin.time.* @@ -46,6 +47,43 @@ public sealed interface TestScope : CoroutineScope { */ @ExperimentalCoroutinesApi public val testScheduler: TestCoroutineScheduler + + /** + * A scope for background work. + * + * This scope is automatically cancelled when the test finishes. + * Additionally, while the coroutines in this scope are run as usual when + * using [advanceTimeBy] and [runCurrent], [advanceUntilIdle] will stop advancing the virtual time + * once only the coroutines in this scope are left unprocessed. + * + * Failures in coroutines in this scope do not terminate the test. + * Instead, they are reported at the end of the test. + * Likewise, failure in the [TestScope] itself will not affect its [backgroundScope], + * because there's no parent-child relationship between them. + * + * A typical use case for this scope is to launch tasks that would outlive the tested code in + * the production environment. + * + * In this example, the coroutine that continuously sends new elements to the channel will get + * cancelled: + * ``` + * @Test + * fun testExampleBackgroundJob() = runTest { + * val channel = Channel() + * backgroundScope.launch { + * var i = 0 + * while (true) { + * channel.send(i++) + * } + * } + * repeat(100) { + * assertEquals(it, channel.receive()) + * } + * } + * ``` + */ + @ExperimentalCoroutinesApi + public val backgroundScope: CoroutineScope } /** @@ -170,6 +208,11 @@ internal class TestScopeImpl(context: CoroutineContext) : private val uncaughtExceptions = mutableListOf() private val lock = SynchronizedObject() + override val backgroundScope: CoroutineScope = + CoroutineScope(coroutineContext + BackgroundWork + ReportingSupervisorJob { + if (it !is CancellationException) reportException(it) + }) + /** Called upon entry to [runTest]. Will throw if called more than once. */ fun enter() { val exceptions = synchronized(lock) { @@ -190,8 +233,7 @@ internal class TestScopeImpl(context: CoroutineContext) : /** Called at the end of the test. May only be called once. */ fun leave(): List { val exceptions = synchronized(lock) { - if(!entered || finished) - throw IllegalStateException("An internal error. Please report to the Kotlinx Coroutines issue tracker") + check(entered && !finished) finished = true uncaughtExceptions } @@ -218,6 +260,12 @@ internal class TestScopeImpl(context: CoroutineContext) : if (finished) { throw throwable } else { + @Suppress("INVISIBLE_MEMBER") + for (existingThrowable in uncaughtExceptions) { + // avoid reporting exceptions that already were reported. + if (unwrap(throwable) == unwrap(existingThrowable)) + return + } uncaughtExceptions.add(throwable) if (!entered) throw UncaughtExceptionsBeforeTest().apply { addSuppressed(throwable) } @@ -233,6 +281,7 @@ internal class TestScopeImpl(context: CoroutineContext) : } /** Use the knowledge that any [TestScope] that we receive is necessarily a [TestScopeImpl]. */ +@Suppress("NO_ELSE_IN_WHEN") // TODO: a problem with `sealed` in MPP not allowing total pattern-matching internal fun TestScope.asSpecificImplementation(): TestScopeImpl = when (this) { is TestScopeImpl -> this } diff --git a/kotlinx-coroutines-test/common/src/internal/ReportingSupervisorJob.kt b/kotlinx-coroutines-test/common/src/internal/ReportingSupervisorJob.kt new file mode 100644 index 0000000000..e3091bc263 --- /dev/null +++ b/kotlinx-coroutines-test/common/src/internal/ReportingSupervisorJob.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.test.internal + +import kotlinx.coroutines.* + +/** + * A variant of [SupervisorJob] that additionally notifies about child failures via a callback. + */ +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "CANNOT_OVERRIDE_INVISIBLE_MEMBER") +internal class ReportingSupervisorJob(parent: Job? = null, val onChildCancellation: (Throwable) -> Unit) : + JobImpl(parent) { + override fun childCancelled(cause: Throwable): Boolean = + try { + onChildCancellation(cause) + } catch (e: Throwable) { + cause.addSuppressed(e) + /* the coroutine context does not matter here, because we're only interested in reporting this exception + to the platform-specific global handler, not to a [CoroutineExceptionHandler] of any sort. */ + handleCoroutineException(this, cause) + }.let { false } +} diff --git a/kotlinx-coroutines-test/common/test/RunTestTest.kt b/kotlinx-coroutines-test/common/test/RunTestTest.kt index 3b6272c062..1430d830cc 100644 --- a/kotlinx-coroutines-test/common/test/RunTestTest.kt +++ b/kotlinx-coroutines-test/common/test/RunTestTest.kt @@ -71,6 +71,7 @@ class RunTestTest { /** Tests that a dispatch timeout of `0` will fail the test if there are some dispatches outside the scheduler. */ @Test + @NoNative // TODO: timeout leads to `Cannot execute task because event loop was shut down` on Native fun testRunTestWithZeroTimeoutWithUncontrolledDispatches() = testResultMap({ fn -> assertFailsWith { fn() } }) { @@ -357,4 +358,15 @@ class RunTestTest { } } } + + /** + * Tests that if the main coroutine is completed without a dispatch, [runTest] will not consider this to be + * inactivity. + * + * The test will hang if this is not the case. + */ + @Test + fun testCoroutineCompletingWithoutDispatch() = runTest(dispatchTimeoutMs = Long.MAX_VALUE) { + launch(Dispatchers.Default) { delay(100) } + } } diff --git a/kotlinx-coroutines-test/common/test/TestScopeTest.kt b/kotlinx-coroutines-test/common/test/TestScopeTest.kt index 7031056f11..4138ca058f 100644 --- a/kotlinx-coroutines-test/common/test/TestScopeTest.kt +++ b/kotlinx-coroutines-test/common/test/TestScopeTest.kt @@ -5,11 +5,13 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.flow.* import kotlin.coroutines.* import kotlin.test.* class TestScopeTest { - /** Tests failing to create a [TestCoroutineScope] with incorrect contexts. */ + /** Tests failing to create a [TestScope] with incorrect contexts. */ @Test fun testCreateThrowsOnInvalidArguments() { for (ctx in invalidContexts) { @@ -19,7 +21,7 @@ class TestScopeTest { } } - /** Tests that a newly-created [TestCoroutineScope] provides the correct scheduler. */ + /** Tests that a newly-created [TestScope] provides the correct scheduler. */ @Test fun testCreateProvidesScheduler() { // Creates a new scheduler. @@ -169,6 +171,312 @@ class TestScopeTest { } } + /** Tests that the background work is being run at all. */ + @Test + fun testBackgroundWorkBeingRun(): TestResult = runTest { + var i = 0 + var j = 0 + backgroundScope.launch { + ++i + } + backgroundScope.launch { + delay(10) + ++j + } + assertEquals(0, i) + assertEquals(0, j) + delay(1) + assertEquals(1, i) + assertEquals(0, j) + delay(10) + assertEquals(1, i) + assertEquals(1, j) + } + + /** + * Tests that the background work gets cancelled after the test body finishes. + */ + @Test + fun testBackgroundWorkCancelled(): TestResult { + var cancelled = false + return testResultMap({ + it() + assertTrue(cancelled) + }) { + runTest { + var i = 0 + backgroundScope.launch { + try { + while (isActive) { + ++i + yield() + } + } catch (e: CancellationException) { + cancelled = true + } + } + repeat(5) { + assertEquals(i, it) + yield() + } + } + } + } + + /** Tests the interactions between the time-control commands and the background work. */ + @Test + fun testBackgroundWorkTimeControl(): TestResult = runTest { + var i = 0 + var j = 0 + backgroundScope.launch { + while (true) { + ++i + delay(100) + } + } + backgroundScope.launch { + while (true) { + ++j + delay(50) + } + } + advanceUntilIdle() // should do nothing, as only background work is left. + assertEquals(0, i) + assertEquals(0, j) + val job = launch { + delay(1) + // the background work scheduled for earlier gets executed before the normal work scheduled for later does + assertEquals(1, i) + assertEquals(1, j) + } + job.join() + advanceTimeBy(199) // should work the same for the background tasks + assertEquals(2, i) + assertEquals(4, j) + advanceUntilIdle() // once again, should do nothing + assertEquals(2, i) + assertEquals(4, j) + runCurrent() // should behave the same way as for the normal work + assertEquals(3, i) + assertEquals(5, j) + launch { + delay(1001) + assertEquals(13, i) + assertEquals(25, j) + } + advanceUntilIdle() // should execute the normal work, and with that, the background one, too + } + + /** + * Tests that an error in a background coroutine does not cancel the test, but is reported at the end. + */ + @Test + fun testBackgroundWorkErrorReporting(): TestResult { + var testFinished = false + val exception = RuntimeException("x") + return testResultMap({ + try { + it() + fail("unreached") + } catch (e: Throwable) { + assertSame(e, exception) + assertTrue(testFinished) + } + }) { + runTest { + backgroundScope.launch { + throw exception + } + delay(1000) + testFinished = true + } + } + } + + /** + * Tests that the background work gets to finish what it's doing after the test is completed. + */ + @Test + fun testBackgroundWorkFinalizing(): TestResult { + var taskEnded = 0 + val nTasks = 10 + return testResultMap({ + try { + it() + fail("unreached") + } catch (e: TestException) { + assertEquals(2, e.suppressedExceptions.size) + assertEquals(nTasks, taskEnded) + } + }) { + runTest { + repeat(nTasks) { + backgroundScope.launch { + try { + while (true) { + delay(1) + } + } finally { + ++taskEnded + if (taskEnded <= 2) + throw TestException() + } + } + } + delay(100) + throw TestException() + } + } + } + + /** + * Tests using [Flow.stateIn] as a background job. + */ + @Test + fun testExampleBackgroundJob1() = runTest { + val myFlow = flow { + var i = 0 + while (true) { + emit(++i) + delay(1) + } + } + val stateFlow = myFlow.stateIn(backgroundScope, SharingStarted.Eagerly, 0) + var j = 0 + repeat(100) { + assertEquals(j++, stateFlow.value) + delay(1) + } + } + + /** + * A test from the documentation of [TestScope.backgroundScope]. + */ + @Test + fun testExampleBackgroundJob2() = runTest { + val channel = Channel() + backgroundScope.launch { + var i = 0 + while (true) { + channel.send(i++) + } + } + repeat(100) { + assertEquals(it, channel.receive()) + } + } + + /** + * Tests that the test will timeout due to idleness even if some background tasks are running. + */ + @Test + fun testBackgroundWorkNotPreventingTimeout(): TestResult = testResultMap({ + try { + it() + fail("unreached") + } catch (_: UncompletedCoroutinesError) { + + } + }) { + runTest(dispatchTimeoutMs = 100) { + backgroundScope.launch { + while (true) { + yield() + } + } + backgroundScope.launch { + while (true) { + delay(1) + } + } + val deferred = CompletableDeferred() + deferred.await() + } + + } + + /** + * Tests that the background work will not prevent the test from timing out even in some cases + * when the unconfined dispatcher is used. + */ + @Test + fun testUnconfinedBackgroundWorkNotPreventingTimeout(): TestResult = testResultMap({ + try { + it() + fail("unreached") + } catch (_: UncompletedCoroutinesError) { + + } + }) { + runTest(UnconfinedTestDispatcher(), dispatchTimeoutMs = 100) { + /** + * Having a coroutine like this will still cause the test to hang: + backgroundScope.launch { + while (true) { + yield() + } + } + * The reason is that even the initial [advanceUntilIdle] will never return in this case. + */ + backgroundScope.launch { + while (true) { + delay(1) + } + } + val deferred = CompletableDeferred() + deferred.await() + } + } + + /** + * Tests that even the exceptions in the background scope that don't typically get reported and need to be queried + * (like failures in [async]) will still surface in some simple scenarios. + */ + @Test + fun testAsyncFailureInBackgroundReported() = testResultMap({ + try { + it() + fail("unreached") + } catch (e: TestException) { + assertEquals("z", e.message) + assertEquals(setOf("x", "y"), e.suppressedExceptions.map { it.message }.toSet()) + } + }) { + runTest { + backgroundScope.async { + throw TestException("x") + } + backgroundScope.produce { + throw TestException("y") + } + delay(1) + throw TestException("z") + } + } + + /** + * Tests that, if an exception reaches the [TestScope] exception reporting mechanism via several + * channels, it will only be reported once. + */ + @Test + fun testNoDuplicateExceptions() = testResultMap({ + try { + it() + fail("unreached") + } catch (e: TestException) { + assertEquals("y", e.message) + assertEquals(listOf("x"), e.suppressedExceptions.map { it.message }) + } + }) { + runTest { + backgroundScope.launch { + throw TestException("x") + } + delay(1) + throw TestException("y") + } + } + companion object { internal val invalidContexts = listOf( Dispatchers.Default, // not a [TestDispatcher] diff --git a/kotlinx-coroutines-test/js/src/TestBuilders.kt b/kotlinx-coroutines-test/js/src/TestBuilders.kt index 3976885991..9da91ffc39 100644 --- a/kotlinx-coroutines-test/js/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/js/src/TestBuilders.kt @@ -9,7 +9,7 @@ import kotlin.js.* @Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") public actual typealias TestResult = Promise -internal actual fun createTestResult(testProcedure: suspend () -> Unit): TestResult = +internal actual fun createTestResult(testProcedure: suspend CoroutineScope.() -> Unit): TestResult = GlobalScope.promise { testProcedure() - } \ No newline at end of file + } diff --git a/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt b/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt index 7cafb54753..06fbe81064 100644 --- a/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt +++ b/kotlinx-coroutines-test/jvm/src/TestBuildersJvm.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.* @Suppress("ACTUAL_WITHOUT_EXPECT") public actual typealias TestResult = Unit -internal actual fun createTestResult(testProcedure: suspend () -> Unit) { +internal actual fun createTestResult(testProcedure: suspend CoroutineScope.() -> Unit) { runBlocking { testProcedure() } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt b/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt index a60d65c1b8..eabdffb2c8 100644 --- a/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt +++ b/kotlinx-coroutines-test/jvm/src/migration/TestBuildersDeprecated.kt @@ -87,11 +87,14 @@ public fun runBlockingTestOnTestScope( scope.testBody() } scope.testScheduler.advanceUntilIdle() - try { + val throwable = try { scope.getCompletionExceptionOrNull() } catch (e: IllegalStateException) { null // the deferred was not completed yet; `scope.leave()` should complain then about unfinished jobs - }?.let { + } + scope.backgroundScope.cancel() + scope.testScheduler.advanceUntilIdleOr { false } + throwable?.let { val exceptions = try { scope.leave() } catch (e: UncompletedCoroutinesError) { diff --git a/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt index ec2a3046ee..08f428f249 100644 --- a/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt +++ b/kotlinx-coroutines-test/jvm/src/migration/TestCoroutineDispatcher.kt @@ -41,24 +41,24 @@ public class TestCoroutineDispatcher(public override val scheduler: TestCoroutin override fun dispatch(context: CoroutineContext, block: Runnable) { checkSchedulerInContext(scheduler, context) if (dispatchImmediately) { - scheduler.sendDispatchEvent() + scheduler.sendDispatchEvent(context) block.run() } else { - post(block) + post(block, context) } } /** @suppress */ override fun dispatchYield(context: CoroutineContext, block: Runnable) { checkSchedulerInContext(scheduler, context) - post(block) + post(block, context) } /** @suppress */ override fun toString(): String = "TestCoroutineDispatcher[scheduler=$scheduler]" - private fun post(block: Runnable) = - scheduler.registerEvent(this, 0, block) { false } + private fun post(block: Runnable, context: CoroutineContext) = + scheduler.registerEvent(this, 0, block, context) { false } /** @suppress */ override suspend fun pauseDispatcher(block: suspend () -> Unit) { diff --git a/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt b/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt index 174baa0819..806592079c 100644 --- a/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt +++ b/kotlinx-coroutines-test/jvm/test/migration/RunBlockingTestOnTestScopeTest.kt @@ -5,6 +5,7 @@ package kotlinx.coroutines.test import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* import kotlinx.coroutines.flow.* import kotlin.test.* @@ -162,4 +163,211 @@ class RunBlockingTestOnTestScopeTest { } } } -} \ No newline at end of file + + @Test + fun testBackgroundWorkBeingRun() = runBlockingTestOnTestScope { + var i = 0 + var j = 0 + backgroundScope.launch { + yield() + ++i + } + backgroundScope.launch { + yield() + delay(10) + ++j + } + assertEquals(0, i) + assertEquals(0, j) + delay(1) + assertEquals(1, i) + assertEquals(0, j) + delay(10) + assertEquals(1, i) + assertEquals(1, j) + } + + @Test + fun testBackgroundWorkCancelled() { + var cancelled = false + runBlockingTestOnTestScope { + var i = 0 + backgroundScope.launch { + yield() + try { + while (isActive) { + ++i + yield() + } + } catch (e: CancellationException) { + cancelled = true + } + } + repeat(5) { + assertEquals(i, it) + yield() + } + } + assertTrue(cancelled) + } + + @Test + fun testBackgroundWorkTimeControl(): TestResult = runBlockingTestOnTestScope { + var i = 0 + var j = 0 + backgroundScope.launch { + yield() + while (true) { + ++i + delay(100) + } + } + backgroundScope.launch { + yield() + while (true) { + ++j + delay(50) + } + } + advanceUntilIdle() // should do nothing, as only background work is left. + assertEquals(0, i) + assertEquals(0, j) + val job = launch { + delay(1) + // the background work scheduled for earlier gets executed before the normal work scheduled for later does + assertEquals(1, i) + assertEquals(1, j) + } + job.join() + advanceTimeBy(199) // should work the same for the background tasks + assertEquals(2, i) + assertEquals(4, j) + advanceUntilIdle() // once again, should do nothing + assertEquals(2, i) + assertEquals(4, j) + runCurrent() // should behave the same way as for the normal work + assertEquals(3, i) + assertEquals(5, j) + launch { + delay(1001) + assertEquals(13, i) + assertEquals(25, j) + } + advanceUntilIdle() // should execute the normal work, and with that, the background one, too + } + + @Test + fun testBackgroundWorkErrorReporting() { + var testFinished = false + val exception = RuntimeException("x") + try { + runBlockingTestOnTestScope { + backgroundScope.launch { + throw exception + } + delay(1000) + testFinished = true + } + fail("unreached") + } catch (e: Throwable) { + assertSame(e, exception) + assertTrue(testFinished) + } + } + + @Test + fun testBackgroundWorkFinalizing() { + var taskEnded = 0 + val nTasks = 10 + try { + runBlockingTestOnTestScope { + repeat(nTasks) { + backgroundScope.launch { + try { + while (true) { + delay(1) + } + } finally { + ++taskEnded + if (taskEnded <= 2) + throw TestException() + } + } + } + delay(100) + throw TestException() + } + fail("unreached") + } catch (e: TestException) { + assertEquals(2, e.suppressedExceptions.size) + assertEquals(nTasks, taskEnded) + } + } + + @Test + fun testExampleBackgroundJob1() = runBlockingTestOnTestScope { + val myFlow = flow { + yield() + var i = 0 + while (true) { + emit(++i) + delay(1) + } + } + val stateFlow = myFlow.stateIn(backgroundScope, SharingStarted.Eagerly, 0) + var j = 0 + repeat(100) { + assertEquals(j++, stateFlow.value) + delay(1) + } + } + + @Test + fun testExampleBackgroundJob2() = runBlockingTestOnTestScope { + val channel = Channel() + backgroundScope.launch { + var i = 0 + while (true) { + channel.send(i++) + } + } + repeat(100) { + assertEquals(it, channel.receive()) + } + } + + @Test + fun testAsyncFailureInBackgroundReported() = + try { + runBlockingTestOnTestScope { + backgroundScope.async { + throw TestException("x") + } + backgroundScope.produce { + throw TestException("y") + } + delay(1) + throw TestException("z") + } + fail("unreached") + } catch (e: TestException) { + assertEquals("z", e.message) + assertEquals(setOf("x", "y"), e.suppressedExceptions.map { it.message }.toSet()) + } + + @Test + fun testNoDuplicateExceptions() = + try { + runBlockingTestOnTestScope { + backgroundScope.launch { + throw TestException("x") + } + delay(1) + throw TestException("y") + } + fail("unreached") + } catch (e: TestException) { + assertEquals("y", e.message) + assertEquals(listOf("x"), e.suppressedExceptions.map { it.message }) + } +} diff --git a/kotlinx-coroutines-test/native/src/TestBuilders.kt b/kotlinx-coroutines-test/native/src/TestBuilders.kt index c3176a03de..a959901919 100644 --- a/kotlinx-coroutines-test/native/src/TestBuilders.kt +++ b/kotlinx-coroutines-test/native/src/TestBuilders.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.* @Suppress("ACTUAL_WITHOUT_EXPECT") public actual typealias TestResult = Unit -internal actual fun createTestResult(testProcedure: suspend () -> Unit) { +internal actual fun createTestResult(testProcedure: suspend CoroutineScope.() -> Unit) { runBlocking { testProcedure() } From ac4f57eed45be38229ef009bfcfd984f70def13a Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 12 Jul 2022 15:19:44 +0200 Subject: [PATCH 316/328] Update binary compatibility validator to 0.11.0 (#3362) --- gradle.properties | 2 +- kotlinx-coroutines-core/api/kotlinx-coroutines-core.api | 4 ++++ .../api/kotlinx-coroutines-reactive.api | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 63fdf28c62..734dbe3304 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.10.0 +binary_compatibility_validator_version=0.11.0 kover_version=0.5.0 blockhound_version=1.0.2.RELEASE jna_version=5.9.0 diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index 57b33056b3..dd7f889edf 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -287,6 +287,10 @@ public final class kotlinx/coroutines/DelayKt { public abstract interface annotation class kotlinx/coroutines/DelicateCoroutinesApi : java/lang/annotation/Annotation { } +public final class kotlinx/coroutines/DispatchedTaskKt { + public static final field MODE_CANCELLABLE I +} + public final class kotlinx/coroutines/Dispatchers { public static final field INSTANCE Lkotlinx/coroutines/Dispatchers; public static final fun getDefault ()Lkotlinx/coroutines/CoroutineDispatcher; diff --git a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api index c82880233a..b52df185db 100644 --- a/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api +++ b/reactive/kotlinx-coroutines-reactive/api/kotlinx-coroutines-reactive.api @@ -15,6 +15,7 @@ public final class kotlinx/coroutines/reactive/ChannelKt { public static final synthetic fun openSubscription (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; public static synthetic fun openSubscription$default (Lorg/reactivestreams/Publisher;IILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; public static final fun toChannel (Lorg/reactivestreams/Publisher;I)Lkotlinx/coroutines/channels/ReceiveChannel; + public static synthetic fun toChannel$default (Lorg/reactivestreams/Publisher;IILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; } public abstract interface class kotlinx/coroutines/reactive/ContextInjector { From c8271ad83147205f41129105dfc7716fef20e072 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 12 Jul 2022 15:34:48 +0200 Subject: [PATCH 317/328] Improve CoroutineDispatcher documentation (#3359) Fixes #3354 --- .../common/src/CoroutineDispatcher.kt | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index 71b7ec726f..568353bf4a 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -45,6 +45,9 @@ public abstract class CoroutineDispatcher : * potentially forming an event-loop to prevent stack overflows. * The event loop is an advanced topic and its implications can be found in [Dispatchers.Unconfined] documentation. * + * The [context] parameter represents the context of the coroutine that is being dispatched, + * or [EmptyCoroutineContext] if a non-coroutine-specific [Runnable] is dispatched instead. + * * A dispatcher can override this method to provide a performance optimization and avoid paying a cost of an unnecessary dispatch. * E.g. [MainCoroutineDispatcher.immediate] checks whether we are already in the required UI thread in this method and avoids * an additional dispatch when it is not required. @@ -58,6 +61,9 @@ public abstract class CoroutineDispatcher : * * This method should generally be exception-safe. An exception thrown from this method * may leave the coroutines that use this dispatcher in the inconsistent and hard to debug state. + * + * @see dispatch + * @see Dispatchers.Unconfined */ public open fun isDispatchNeeded(context: CoroutineContext): Boolean = true @@ -102,18 +108,31 @@ public abstract class CoroutineDispatcher : } /** - * Dispatches execution of a runnable [block] onto another thread in the given [context]. + * Requests execution of a runnable [block]. + * The dispatcher guarantees that [block] will eventually execute, typically by dispatching it to a thread pool, + * using a dedicated thread, or just executing the block in place. + * The [context] parameter represents the context of the coroutine that is being dispatched, + * or [EmptyCoroutineContext] if a non-coroutine-specific [Runnable] is dispatched instead. + * Implementations may use [context] for additional context-specific information, + * such as priority, whether the dispatched coroutine can be invoked in place, + * coroutine name, and additional diagnostic elements. + * * This method should guarantee that the given [block] will be eventually invoked, * otherwise the system may reach a deadlock state and never leave it. - * Cancellation mechanism is transparent for [CoroutineDispatcher] and is managed by [block] internals. + * The cancellation mechanism is transparent for [CoroutineDispatcher] and is managed by [block] internals. * * This method should generally be exception-safe. An exception thrown from this method - * may leave the coroutines that use this dispatcher in the inconsistent and hard to debug state. + * may leave the coroutines that use this dispatcher in an inconsistent and hard-to-debug state. + * + * This method must not immediately call [block]. Doing so may result in `StackOverflowError` + * when `dispatch` is invoked repeatedly, for example when [yield] is called in a loop. + * In order to execute a block in place, it is required to return `false` from [isDispatchNeeded] + * and delegate the `dispatch` implementation to `Dispatchers.Unconfined.dispatch` in such cases. + * To support this, the coroutines machinery ensures in-place execution and forms an event-loop to + * avoid unbound recursion. * - * This method must not immediately call [block]. Doing so would result in [StackOverflowError] - * when [yield] is repeatedly called from a loop. However, an implementation that returns `false` from - * [isDispatchNeeded] can delegate this function to `dispatch` method of [Dispatchers.Unconfined], which is - * integrated with [yield] to avoid this problem. + * @see isDispatchNeeded + * @see Dispatchers.Unconfined */ public abstract fun dispatch(context: CoroutineContext, block: Runnable) From 81e17dd37003a7105e542eb725f51ee0dc353354 Mon Sep 17 00:00:00 2001 From: Dmitry Khalanskiy Date: Tue, 12 Jul 2022 16:00:15 +0200 Subject: [PATCH 318/328] Version 1.6.4 --- CHANGES.md | 10 ++++++++++ README.md | 12 ++++++------ gradle.properties | 2 +- integration-testing/gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 7 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 850cb60e81..adadf234c3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,15 @@ # Change log for kotlinx.coroutines +## Version 1.6.4 + +* Added `TestScope.backgroundScope` for launching coroutines that perform work in the background and need to be cancelled at the end of the test (#3287). +* Fixed the POM of `kotlinx-coroutines-debug` having an incorrect reference to `kotlinx-coroutines-bom`, which cause the builds of Maven projects using the debug module to break (#3334). +* Fixed the `Publisher.await` functions in `kotlinx-coroutines-reactive` not ensuring that the `Subscriber` methods are invoked serially (#3360). Thank you, @EgorKulbachka! +* Fixed a memory leak in `withTimeout` on K/N with the new memory model (#3351). +* Added the guarantee that all `Throwable` implementations in the core library are serializable (#3328). +* Moved the documentation to (#3342). +* Various documentation improvements. + ## Version 1.6.3 * Updated atomicfu version to 0.17.3 (#3321), fixing the projects using this library with JS IR failing to build (#3305). diff --git a/README.md b/README.md index 8bc54a7793..d9019dc335 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Kotlin Stable](https://kotl.in/badges/stable.svg)](https://kotlinlang.org/docs/components-stability.html) [![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.3/pom) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.4)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.4/pom) [![Kotlin](https://img.shields.io/badge/kotlin-1.6.21-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) @@ -84,7 +84,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.6.3 + 1.6.4 ``` @@ -102,7 +102,7 @@ Add dependencies (you can also add other modules that you need): ```kotlin dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") } ``` @@ -132,7 +132,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```kotlin -implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.3") +implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") ``` This gives you access to the Android [Dispatchers.Main] @@ -167,7 +167,7 @@ In common code that should get compiled for different platforms, you can add a d ```kotlin commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") } } ``` @@ -179,7 +179,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.3/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.4/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index 734dbe3304..e452a07eef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.6.3-SNAPSHOT +version=1.6.4-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.21 diff --git a/integration-testing/gradle.properties b/integration-testing/gradle.properties index 1f334cafea..1038d81718 100644 --- a/integration-testing/gradle.properties +++ b/integration-testing/gradle.properties @@ -1,4 +1,4 @@ kotlin_version=1.6.21 -coroutines_version=1.6.3-SNAPSHOT +coroutines_version=1.6.4-SNAPSHOT kotlin.code.style=official diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index b21161ec39..5f302d2052 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.3.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.4.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 4f78298ac1..f45ccd0cac 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -26,7 +26,7 @@ Provided [TestDispatcher] implementations: Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.3' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index da461b34e2..4ee898e2a4 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.3" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From bb2a49a50dc50cd16ae0d29305d7ec19cc6d4235 Mon Sep 17 00:00:00 2001 From: Danil Pavlov Date: Tue, 2 Aug 2022 15:55:23 +0200 Subject: [PATCH 319/328] feat: moving coroutines hands-on to docs (#3369) --- .../coroutines-and-channels/aggregate.png | Bin 0 -> 129077 bytes .../coroutines-and-channels/background.png | Bin 0 -> 107019 bytes .../coroutines-and-channels/blocking.png | Bin 0 -> 99456 bytes .../buffered-channel.png | Bin 0 -> 30655 bytes .../coroutines-and-channels/callbacks.png | Bin 0 -> 206521 bytes .../coroutines-and-channels/concurrency.png | Bin 0 -> 205920 bytes .../conflated-channel.gif | Bin 0 -> 359844 bytes .../generating-token.png | Bin 0 -> 132593 bytes .../initial-window.png | Bin 0 -> 77777 bytes .../coroutines-and-channels/loading.gif | Bin 0 -> 1015914 bytes .../progress-and-concurrency.png | Bin 0 -> 228802 bytes .../coroutines-and-channels/progress.png | Bin 0 -> 201234 bytes .../rendezvous-channel.png | Bin 0 -> 24552 bytes .../run-configuration.png | Bin 0 -> 179147 bytes .../suspend-requests.png | Bin 0 -> 195151 bytes .../suspension-process.gif | Bin 0 -> 573925 bytes .../time-comparison.png | Bin 0 -> 134085 bytes .../unlimited-channel.png | Bin 0 -> 28302 bytes .../using-channel-many-coroutines.png | Bin 0 -> 99723 bytes .../coroutines-and-channels/using-channel.png | Bin 0 -> 49784 bytes docs/kc.tree | 2 +- docs/topics/coroutines-and-channels.md | 1549 +++++++++++++++++ 22 files changed, 1550 insertions(+), 1 deletion(-) create mode 100644 docs/images/coroutines-and-channels/aggregate.png create mode 100644 docs/images/coroutines-and-channels/background.png create mode 100644 docs/images/coroutines-and-channels/blocking.png create mode 100644 docs/images/coroutines-and-channels/buffered-channel.png create mode 100644 docs/images/coroutines-and-channels/callbacks.png create mode 100644 docs/images/coroutines-and-channels/concurrency.png create mode 100644 docs/images/coroutines-and-channels/conflated-channel.gif create mode 100644 docs/images/coroutines-and-channels/generating-token.png create mode 100644 docs/images/coroutines-and-channels/initial-window.png create mode 100644 docs/images/coroutines-and-channels/loading.gif create mode 100644 docs/images/coroutines-and-channels/progress-and-concurrency.png create mode 100644 docs/images/coroutines-and-channels/progress.png create mode 100644 docs/images/coroutines-and-channels/rendezvous-channel.png create mode 100644 docs/images/coroutines-and-channels/run-configuration.png create mode 100644 docs/images/coroutines-and-channels/suspend-requests.png create mode 100644 docs/images/coroutines-and-channels/suspension-process.gif create mode 100644 docs/images/coroutines-and-channels/time-comparison.png create mode 100644 docs/images/coroutines-and-channels/unlimited-channel.png create mode 100644 docs/images/coroutines-and-channels/using-channel-many-coroutines.png create mode 100644 docs/images/coroutines-and-channels/using-channel.png create mode 100644 docs/topics/coroutines-and-channels.md diff --git a/docs/images/coroutines-and-channels/aggregate.png b/docs/images/coroutines-and-channels/aggregate.png new file mode 100644 index 0000000000000000000000000000000000000000..fed7b85861e9f1ff9ad6a208a94f1d9d4d2a00ef GIT binary patch literal 129077 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 z z;aFZ*FE_Y3_@GNaPt9+)1t_%cp?%d~-Ab3pI9Wt(<6+p#XK=1#FA~TUbA|Lj^_S@< zpBQOWm9vlCUbL(c`coiq>NE%{qBn+ZFydKVDL;~byWfYJU9O0qtKl1-nHu2uT4eSs zq#WJts-3<@Jhh7ch%V^m92aKxDHfcQDVBh%$9DDL z;7<;JbwTI2M$M8x_Y(-G(SW*IRXD3;$Ta|ne(Gh)s)L!k6||IEgYn^MSpp}!SO3Xl z;8IVj=oRXgx2U5?qVcaDwDl2r`-hlxN~=EwE9v`%8fU4C`#Ei=CX>D+jwXNu$x(qE<0nit z5lEKoM{x$0=034}6YceR7-RIYL-Z9FZ|=_Bz^tfa#WFdCD&jDK2B%GBy7uxN&+(3x zSHB4`!Ao#Q4+QVOnU@kZWcV0?d9i|US=x9i{D?$QSTNF;a6I_Fqn!HwgofNX;3Dzd zUm`7>4Fv`fE$o}Mn^|2qv`^*JmH5!I6JLIpR(|!fnGf(?dL!RK1^w_15G}N=&rWN7 zc4__PQnIZ@f*%z3p1d{wG_fn+ZH_#VR_Rw@uFzfX0l_ntD{QsCV!usfBF2VqVjYQL z9VEFD1n&u#;eAj|A~AR`6ZjH~Z?Q9;s@*8N*z;FIK{JY`Db+ENA*g0fQ{M>9zPM^X zQaaYuz+%)+!(&QWo{nHSz;+h?_l-rNgc%ixDeyVrnyd4vQ-zNjwW*J{hoF=~n9#%m z`b9~Y*bh{aW0@(zhgV4V=3lVLjx0K+xd9hdf+cYY4;VhLrtiNte%#sO9S`^4gAne6 zf<`70ZeYWqILRw!NbFvbuO))$RAoT)YkyuZj=i-t`(HP}j8D?G8}puuk?;+VBT|dd zI)(UAon(32rEhtZXo=X>f*%ywht8We3Q-KaQA`52VaK&*hQ9Kn1FW_WfYHhSS^}`6 zmaABoI}g|-5wDNTiMb7zfu97Xk_Okqe-Yz&g*_Bs=Q6HOc*!G?C1|up>bKormY%^aW9!`e+XXEy>$+RQFP%Mq3Bb*M{e@^U5 zimH_1%7kTHte1z&b0G*x+xAsD+i?u*n0aammOM!=rzF6I^0I~3-|+dGY%=7grBT;W zgDdq9WOeVu{fn!lBU;crJ3XM4>i65QIPvlyI#W&qpM;bQF{VgpA?C~hdTsgAb2>-1 zB|ukB=c#C2+!hIyCJ}@F&q?1Od*e>Z@q^Pje>-Sl4FVEl0oT?WFDe8xs7d8i`f*S4 zZMr(M?$#B$pPIpTx3Y(aLfeXqk0a+Oj9h-Pr;G6E8r1*Yt(e}<{cHd${h?$ z__7PO1SY3vzne*)`g>u0qD_KuCxQKpC42IX?*Kz~(D7osx2-A||GNI8e>{)F%rdY7 z_g!7@IxPMm#=tAjUqQ_CDOc*) zj|sk=^LP@alc!$hR0qR~HrU8bOe~Rq)9yIb$pkP-zO9QtesMzo(!ZH)gS<8M^ilXj zE0&s|pwS~4H?6SMkj>Wez>LTgair#z_EZZ%g|Cp^n7*SQtGP}DyoRm~&b2Wg|K*v0 z=K{!Sb3v-{rB{LaCA8R6Yr{}i>g_&HdK03qPTmZ2adTJi=Kb?+G%;%KiToW($vnb? zY4XzM8e4^=0n^xKH2!J#y3wp$+{PzRRaUokHl1YnIJgrfi$lFu!f1FnaX%i%m~$WI z2j=P$RiFq;@F?OS_&d70%;2Jy%X=6+EI7nS$F{?bAsoMjXY8cawK1g zSIdJS-~M%P7#&Fl;yywe-c+-JEOnzw`-DxY6SxhKg{$Yvx~8ud9^Mb1HD>p-;=$rG zDv^Fffixe|(2E6x8K2I!nYmmK%RPf>c0Ud5&onSI)crAYyY2IBa7LJFrk-z3^YmZr z@w#;3`M@gx%FH8N|GcJq>Z*x$%|?S{&(1!DNzOfd z>N#338V;3})3k5FF_^E-f_#}EYBSZ4FP~_7{9OgNhvRTgJm|tY^b9U=0a31{TomJb zx=s4IKo94vtml0EJ>!EMx+%XN6uioJ&{2L^h5JpIa8ixbwo77uzAFy;+Y@Ye27V~4 zQWh-)imb1{-8I|q0HuHLxd?8M1H2!0<=mdEcgqa&3!DhD5q$p-ur=lX2qpXurnYq1 zfwThA*|+vsnjM)9O}yp&busD0zf~boxUM{>HA=F%-F;nTX-$x{H4VGD$^Dz2o{ak< z3z?ZmVp2|BZ}fvmm2#jo7=LWR1bkcYf(+L9@k1n$-{uIPc8-dQduZR~j(9AuAh?ig&@o88_2Cu>EFYlxPhB4}?@)Z1a#VTu})c{Jl79PWgMQaIdvi zv^PoTc(Q?&5@FFN0=Aqk1M#2v@wAL2WFvcDo*1okn7g;epF{qiQA84@YquVDm;TPq zm&mnF3UiAh_j9@19&pQ*U2|S@df(ec0kW(V0NzVUI7a@*_aO9Q6MMc z5qptls#ILk`e?>TS+453g<4|3f$IYTf6fyrzlth zZ*Nc%zWjZ6IAd><<)|j8p58#$&4LbU)Y2A7^C%%wgpTGo!fOVRP#V9He_7@{E>n0| zbrL4AJD~Uo>r3$8y-2dd;Q^liYU9GU{g=Ar(yxQnR#$?)dlK@J@4!GkZ(o1Z)F9PW zlm;WFD-Ek39z)cjb|z?#6kyh+n|JxP>)=&6gK8upVUuu7g8JB6_ZXUWRm`gPIPJy^ z;%HyC31t8?&`G-wtDD}xe)u3BvZ9Mm&HN!WKJz)UM;n9uU!m2cR0UV(>i{23@_3hVu~z!rJ+QIojG! z;ElCe_<>~fpUWcRdVchlEQgk*lnsmvV8u8z0D!NBO=M)h%Or!T33PktfR;Rd;MD7X6DuqnyFyvb- zyjRZ%GyMt|sF$AYThixxNGzI-0RG|J-l0#zJ~2S2F%k-Yp4wc`yrgG!&GVNmJ-J_|im!d3Qh>Z|t-h=93E zRu9&Yz5+cy{1fi-Thkp0YNY!PV7$v{BQg8$VgVPVuZcy|@f=Haeu!sa^**x>Z$mK_ zUK0OW$ou%O9;6HeTcM>43Rg2FOheVLcu%;!PSJWlGuCZ9(uQ2ONnnBGh34nwdA9~qN#q=ET4!#^2w^At0b z<*ENlm*p+6dc+*OQvZ7P7m=(PHCMY~`SsrcQJBMmhyrNf)X%Rvh0!Q}VG*Em9o+R} zUrfXUAKq1T?BOR5BUfIBu9vJ5j&}Osln|(r*}1u5waFlGU$dd9>E!pa7l(CL?#Hfm zvM?M>epTnSSTKeozOV(g-G*}i%|MMLDkt|=i;I43~H8p(|L z&+Ea7q#vuKp8E0P7W?PiIkc-djXNdF*;r5Y7ggn?t&FMirzh`z0a>I;$#HLN z(AN@(d6BsB&zwo4fG8z!`R1e@As;`~`>Z;K1EMWyk|KKG1N7ppEX9WcYMarQ$4Y8v zSql&Pxd6Ozc|bt`^DXRh9fkWa6u-jibKb-=Kj7HBkPv5Nl{mDGhMN+h5q~Y}(z6Q; zSiMSUkO2o=N}{`kGlM0LUh7U%we#LiJf?bC$>+w6It4@n(s7Jk|vjX zGyI9g<`{?b8OY~z^sndjJ|Ln~)Y8|&B0ug>rB<*`n??}`zXx4L~872}98wc*TLuC5qiKWtR8}NVK9RLQz>cp*2 z*5_nbLW(sEx{@x~Jv*$OyZQSn4o(VF(b?Sz6okr%W+KAngfMYH00@MFFcxG#B5oYy zk$Nl@jL-fF(#_4sGA&;?bX_-lIY0$W!o+cwR#N9}PS=aF?ZQi=28y*HNAq^WY!YE% z6jrSF^Pfz!r-;!?kEskaS`TYLqb6IXsQssq)namHFClB@K{QhMn z_ke*{H=Kfset+jqlMs#O$nFjF;W;e3EI}HiGEMeAw8_+4OFmObz+1|dbW73NLkH~6 z1$|FiIK`6=Nx3u)wn-;0<|vaiYapTD^%wquA0cNlVJ?#hB?X6oFh2u=bfDRfBQ1e| z_z5#VDXXjAF*g4wp-(^wohJ5P?hX1dYrI@VOc4`zRC)fGryrzhJ9+AwmrzL3r#(B& zM6Jb>)L6Mf+9uwl(U#wEQcmZr@jt(juLMhFrnPFGQFXYO=V&{ zYhj&d(I%T`!Z+_N92eVPganE^T_=+*xS-i(o|}}i+jWC_h$FAJDOeHF#$e2a4k~%L ziuOr!B)tQaqC_k+TqxM5Syw#iG$Q{B!ezpzect8tXjDPk@**U0{{k2z_w-Q)mrpy5 zpDP+q$^qMCbxko)JAjhJ?PE&05g&3V;mO6gZ*{%I?)8MsykR$K%j)9gLdzWz^9)dIGT zF`&TF2RE_3S6Kq>BVtz>bvzwMSzp7ot0tP)T7P;2{xuDEeni^ssqH3_5Q$j^5nDTu zp3YD7=b|V^U()aao)`-)_^9uRVo^tKqkl)?Jes4RH}Kp7fK+o7y#faw4%14{A~DnA z&8=Tco-AoQ^XX4LCCRw~`8xMzCW2-m$fz*hwWl#_kk-8GG9#iG#k25@T}nkMy?_Q* zcMJiq-}v17J9|R33@y5GYw3h*Cr41!vxa4;iizNfd|R>>r+k?FLsi5lODJv3JpA?6 zKpi1*fGH<<(kTgzs=J@DMubd}KaA9cBa>+&2ZAk*A0Edo9jkK(Us1xj1q9lpKkQAY z>I0cvf)dHc;lhSx(B@?o_Yapi9SK8@ZSH8_b1Y0mwxEa4INxpdv15HN4K z_OC~w!z1vYjWBRVsk)EME;Q625Va#@k|R-DFtt=(aDI84%ceD)wo2mC3>=)^t68%`2* zqY41pi?MwJYDk0}!j@ph5AHx;+8lVX%Rx^MVnMjvArf?rn;#oQZfSeu!ZjhR?!#Ej z9w~l_*!L$*E#>wSHX+}>z(u3mXLq`3Q6Uu6+=%L&^#g!ctWdslZT9DHjetK+mTclN z#pOM2Uq755V5cCe_lK)HOzid3w4U^ng=6YfSKbLC>6jR*L#C%_Rynj$%=EH3&5Wc= z0zRv=dU<8w!V2$as@cCiPjXTcp|@I39#Ho4`aB_kP$e)#O>E*K;$S@!dhv5#t{RLp zOvp|>0F!iT@1%nrp*9WYgEurP?aC}aB5ydnlhVh4;1C7Zc=nNgZO~<>4{DbtEfXA9 zye4TE9EfNK#%KFIKYy0kI|96w)d|KQm665Q`uOO%H6O>bBncP_^_ugYc69}PPrvu{*Dw<{#mEocW5dkEEyzBoOGnJ;8Z2^Jm9(9*@oJ4Da_5;iSm}3xB<; zWjJ%7FTZq4zT@;REC!bc^exwJ0_Rgr0;+fn!uwzeaY6ooQhxy+OSQpwZLF?h_b0-r zk|8-Y7tz(UC(&X1SUAA#RxQyF$D1+#o&9zgQ4>cgj4dAlMbx9N)B-pI*3{Ksx(e`I z5Fm)vSRpW!%1Id8AF=VkV)GZ*?FVaD!rJT50GUoq%TtDp(FzS)J^@E)sq<2$-OqU9eH`IA$UX_~1}FEiyelq`%o>oy313tI*b!NlD>%V^mF;1e&Q$9B6ECMxQ^eF%_pPRWwaV)x_f1z}MnNDDR*B{YxSv8o zQ>QBh-K*O7sKg65x3U5@AhfG&En;l`ywIJ$DxLV(Gj>0RK4B<(|4&~Ljx^T)wh_9nfav`8+bpz&Ubk2OjAB6 z*9a;>c3JObw=v4^ovt6d2Dq1U7iU5Okhr(b*%uCeru;>n>vpewLqa|r?j7pCkeON< zZtD7Uj1Hkv;voL;JlysvNt1&I3}yZV+V17`12&ZIJMl@aMDMxxjavDpwdKBB?4PHf zQn_9XL{u$bz{z^e^Za6IkvC)`&VXz!{pb5eZyx|sbI)bSrTZg_<5B7LpS~~Q*|U7^ zhoBzjM;emIj#_i!>|E#_AQ$HAi1Q06n`nw2mhdCbH-287tg3dY3SIpyn7Z{p_Wt`H z%m4o$fO9&D?7cZ{sq8)Kv`3K{$sW-ldqp|zL`H<7%(6!^l5~a;k_MS&W)~tWxgJNa z=>7TLu0P=V;kw;kKb)^yojDxG^LRcVkNe|3#x4Ku)Bj$)H%LbZE&K_@Uzm-s&K3XU z8g$tm6oh5O?aYQ?O_RWr+jcgv-639C0LaEBZY2Laa!Lu;8SARUg{hR5LR!vVFdrEU zUH)i%8c{YAUAl`}rx$%mwE%W)D(;IGAPW&;QS>eGOvQyB{4}3oye=KDV=C5imL%=N zKnLPBZ3?`GI>a?o=Zp)VxAG-I5u#t2*jYjq1(Ui*2=3|$@fo_HP#ce1n*ZMPv$K$O zFzz(^*|OIlVNtJ7;@6p3qYXXATS(`H?W#k}2`!e?SYx80hMX68JK zASgTeHh+8kt}LLK#eE(?EsZ%bekING+pzpS{zD~_m_+Nh!?(>?zN`Z~GJm|ZZf$uR zZp~K&B)V&R7U@XmrN*831Y9q{9Vv;c`19mnYh$`8dTJCN-)MPyQTV1h$D@uu?v@yv zACYxR&;C*VxCy=-ld@H|i}?{%jd<)3hywGM{&aeFn^RYsA;1WE#d9P_62i4DyAC-? zBkGvn2((R<}N zzcp1;b^qy@#sosP8Br!chgp+==@3JUJo_bhx^h2T<@XN)9yN$`i~OKq4|8T@B=M!J z%zdn>=II0~zJCrU++G*Dz~X_^vU(<8RgTEXm$xXmjt}<{&&PsTRD5C>CjYi<6D4vZ z`i&6i<;*0`z&bdn>gRbg*RK9v2+MyiKhMj4fM1Os?uLgP-{I>_W9BD%*vB@Wkx8BS z+ffVqsfq2=nEq6Sow- zZ_mFg53pi#_&1k3MY|-!LGoeB@eiG(Yj%_vcZ$0r9GjrU@uO*ht|SN)!zu!Z)sgn@ z?;WBO<96v{-ZMS6YRYeUDYY=9ju&tqBtbu+dLMci(y3!aOzXi57(bXQSXjx%!}e{d$UTKzX!}})D6;tSOiM@L>wmad6pVoKY{3b&lFdF?5Nli{AI9$Y^-OM)>1NoSEaXx z3#~>5v2)H9*Ystn(S(4u?(TfQ?rNNNh$3SH$x?w+zjjLrQbP%9aY0l#!eDy<6g4Y)-oGCC+0Rs-#YQ%Q2 zrk}TaLEuc=buzd$Pp?%3dhS}ujihJU{#B2(2!@0VbniN+f;YysHgpYa^{CpH-}W!- zwK{C|t%!4tINNa9hjhwn$Ja?UZX}Ku5Rc`Sfyf^u^a^0QTU8u0V0UThDWc{dI`see z<;0L71mh9p>_wCi1;s#d{e;9q)XG$c$imFzAKpl0dHt~zSi4Ek zGFY6$vc~~Mqa%S^?PKGZe%L`VM@J;#J#?K|mP7X4fL_LQhMVA)(iZQ19kCm$fiHhL z+&}&81z8@Oj1$OZgvCk+{^J_td84$+Ze@LTLmkm^6kvma`r<0gCCBfsbuCPOYA`1h z3GKhP=^_03jaNPU>uJ*4M0?shm4cfSBE2)?9=_>lodoJz`Q-2|MUzNx!<~w81)l?k3bW`TJQNOst7Kj90&K z{qBaCYJPw`P5LA%n47*7d`RL=zU1&{coNNkY8Q$0H#d*~vY3_aNb2$6K*X{CD9GQD z)T?Lo=61K3#hd!Ro>>OrNJQ!(*c`mh^VTzmN&e~j!wHt?1IzEXe@ zP<8T;pI7XNUKaxuh(AtxEJ-3@#W7`$;rC;UB|@X!G<7yhk*pa&<)XY7AQRB|4o$_J zOK(vMrYh>odpPM4sV)*NOOOg;BEwwG!;-^bZsTtr{vOR zB2Hs~WgQy?3hkO$OWf8(2G@_fheyLouiQVqAm>H-PZH6jh4)LP`{k~AQSVVeV*qKo zgp<)XCJ;!kOR0c@xI}ji`q+D}l`5M8oU(AWSgwhJFovX#0=NcBleN}iQAB@yTj=#plA^zNnE;qh45)iM9q@OT9J*2btcq^xTq^UzYNWM)!R9@y=4e~b9Y&*UclQb zUnLhQkqUaC2B3}W7tSVRpp0C%9?Z!-D%0c09z^YgZKOX`H_5gW>H7c9Dw-tCqmPLE zE+Uw?d$EpZuMpbf#=we6!0IBbBHi7{fZ+XG_U}Uiic~#CmGFYtSXl0f_A{#cus8;% zO=~N2Tl@W2i@$$6!5>AVGo)~-@94l&uSeA<^PZ}o-w&lrz;+0VId#y>gZ`l2z)@7? zXB8HKUVx^rnI)p~mRrsXc;#U~)eh$2Y=9rB`)miwfufLcWE=0uV0@2W*aycFjv_-U zW-$4L9I`L``*^4>1+C#qP z_aIVWJzVAG0ST2FVPg^N2A4B?tP3D`sG?{LUDU^XyiV@ljN^3uf7wFE%afL7zt>Gr z=J#lCXy5vWvk0IJ8Ps_1;@w5}zjXr~f1>utKpQ$itcXv|gY#dX?Ej5KK9HzTq{TJ8 zL5GGs0KhnIQrh#_UWI@op_>7T48TiDhQ)n*3Z6=L*FO{wad&xAJ}`ny1tS$*z%@TQ z!(c!HJYcYD{8!7lGIu?)2$rI+ufsl|i|HW!^jh2Vga81Ns#-;t!}70$TR5l4w#QRx@62q-C5U%}&((Lpfz}(dI6v?kk-I z8ru298Q^rndH<>?%826M*qIVm*9z1 z%(y5PN!Lp-#iA|g!Bef3H*R%o31s;*1A1b*E{rc(1?aCv{{-kX?x+%etyrpE3+z$d zhS8c6cq14+(&yL&8+6)+E0@Oj=pni-o0IxN{4B)0D%o6AF3vMU(D z=203H^lW>i2yIFfC`#{uPqxKLULnEc#cLgV5}!N%i`AdW(`bNY*8g0~uN4R@5t!VZTH4LZj0%`*vGsz61G+Mo+B4I(IGX+$_Mk ze84IsXyc#a`?ma$=sYwFL}z>d%}32BanW@d;e^gGutNfEs(0{FouolN&mC81-r0Y> zD_bflMhy8Hwm35K&^zfy;GH&gK2(ka&|#BDVxIs}x*WscbxN+YqF(Haw;kYqjpvSU zFG$`SBKx@u#6cmMhbsaZSI747JnCpH9I%tn;Z^@>(f`;c_?$RYajK=0g2bq)ndd{7 z#dzD@jNALKc|A!>Yy@$IJh+DDehvzec*jE`M9*rGaK9AfCG|zO#PnVbu|JYf^Xo_x z&-GmI@nNsM^2O~;@DW~odVp(xu5o%clhza87A6&wfIWu3dJ-N?QXQd~>r3+28C~BY zS`du?LnVsAbij1&?w@*0HopjX%O10RO{h zrTkgL?u|he`j7WE0=|SCgkhfxqsb0Eb?2Rappzk5%>+N|P8gU!9P}PJ!d!4Xp4Zak z+OK7;0XQ|-mHZ7T+2yisf!bN>S->4oH3cA4tLaT!LFyU0c&k7+P*&t{f*jfQGgL6t|1c#z;!PC)t6u+jJ__XwPVD-IVRLYy>ZaEI*6ahgl zF>Cjp!5XzV3Q-dJeGX`=;e20ne7S|LM#gFr&@>-I4j89hI(tUOZP@(V^L6W?fbv5q z+&EGA9nhx$%X{zr2a?ilY}a9_CFz%oE#wPx)WfB#B?HV`3+$c>!nYOD`}O+w&saM33AC%g)?7kb4JPw{^=t_-y8n;CjX zPBPQ3ZSQQ=2vsAOQxA??LH?=jv3-fo|JWg!apKZUTue$WOcV5dz*l>YO%dtUmh3geiS1%SC=0+lI9JsR6to}f@oH?K$$FMpP%Mcx*HopLh(N}{Lz)Lcf zVJd!U81j7ucCUFCr#--`>2wwp%Mx}?;R%A8GRa6D`dmD@(;)5pi>pF-3aB2wJjrwg zJRd(5zR$98ccRl~C{BH#=;w9;{5)K@sgzd}O20W}+C2<@6=Lw2a`wg>TgUo0@ww^M zL_a1Llg)bG!%5Wvnhb7ty*=j%tS--ih{hkkqfGYwSKuItJ_|8w3h0AtN!XWIQLB1K zwi@u`@uaKO#>RN)Z$oIGe8Ao@-6&g?Nag6U{f+1VY0DE;!ZYL$iIF*9JHtRupVkym(J2mcdcaqY>BC=>A4~ED+|J1z8Wl>^>1G zYD$rsYshz$k-WDLwY(i{vJ-_(g)e|V+5Gy{lv`*wN!eL2)EJV>yBC&(F)OnSrT0X1=3r3#zV9GI%jW{~ z%A5wU5nb+%cs2$V2_stH>kwx_29+t|WryU>^+6OK8|9h**0g=>0YHr}l-F8Afns%P zl}5bA_La*um;^iBqgprlq0|AUf>mpF|IovLKR0S7VX-A$w-@$EO$v>6kj6~pUsVe+ zl%&*vCfgBeHY8AFHhYfb<}KKN$%e7N=p7Xh!4JY%M^p!&@`3;M5^HCOc(0!05|+9w zXZ~MR8!e7PgzAgT>(u~B4h_;8iyPMnItJOd@jFud{2z@2R{e3tXldl(?)u}?m;L&D zPW&(j-VDRJrl1*8{uH*OQfJC64&H=0W$mzS#pPlmz1OS${f%gD-s3v-H4{_?M>ey@0fc){}+I`3Y@)zZ4 zkXb`)EA*ja)oaQwSr62)J=c|=)bAl;T)8i=#*m}SVzv{51~MMmz6?Dt?eg?dflH>z5J^KyWas z_r8$A@``+Lwym1qTfc?)EMUsg3-EfQrpWi7)&KA`r2bG$n8-osQeiD6r_AO31*s5hrZQ41=VVzt%Dx?;Ex&+`P8&X_z4+T_F#83w17-qSMr?4Q!ssu0V3!!iOzwrK##vDc4TW8}&AK*|Skr77Zr%(^< zMP1FwFF!c9KmOluzA!j6P4s3~7HPeO?_c)(zKzA755NTj^#zR$ujsziWB(_Gpv#V; z#J_ubIt5!bSnLgr|5M(LTXA>lz{3u;ZrKyY489%6hG&+feAU;v%5?pb^(BITh!Kw_ za9X0XzpDQ2@Z6_p(!g)wiOaht-!bj-TdUJJM+nIXeKJLw0*5s*`RL-O2GSA1?fn*r zFY|zveo}XWB+{V&`LB)|dQT=ozh~}tbbDPq)*m6IaNf$;e`a_L;@cXqF%~riPgApa z_Z5`2TaTk{er!EHyU+hHBLVkMOKuw}(Y?}i&NQ>J_alQHiXuJl0ys08%u#D)(MiA-dT`j zYlBMD+iWch%$kL(Q$YmM0lkSMVBK>;AiW`afFwA=u2m{-O;jG7wF^Nej*#vC*keLd z8fufxUY{D^eE?l~O4_Nx7kvhaTP3>MI{iOw`o=OX8l{Z|!cpzHgy9 z-I7Dk*Smth1#bn}luxJ2LmL(}t=yUUBlG+E)rVJy;8I!@zk=BNq{u}l2sBrRU))sO zeG9mkF@RBZdWGx4ubCuTgky96&p{S1aPoj=ETAAapr+||5QFrtO1Kf_T`YTW1H?aS zU>*@uFpDdA&tPm@DyCo#Nh_v+h53f4I7BAmvOhJUMRmk1gkJXlnE41)_%pv?@^G;- z<2Q`Pty$bEpmVkzC1bR10IBdX7#1A6CI6LK9GIFHgqB$=&i`87fFa;iWs!r?J$(OT zmv=k_yxJg-d6lIS_OS>*3+KTU**I*bu?jsuAX%FM+Ap*JhSi}a7ra*{$X0RyujY&eO9yk-q31*y|8tdXXwUI%@k@Or z_RCcye%R?csIu*E9;->PCWC^32EgdVsAz*I#D*u38B)RJD=E)?e{!XE#1|GYV-C=; z#{qa|0+E<#Un>Z;jx_61*Hprx-d=ALv>Y)58BS?1sW9WRx#LzhM*Q^iIc5p3!3&Q_ zTd0p9qvGmY541`#s~Nr+pF&Q3DhvP8>*SqKaN9D<~=q{jI+WV zh>ODvvBzDw%3i9VL@7svK0s$-ZYQj==pp}S`@+uh9mrLTblCyo<0JvkFE6mCvInf$ z*B8H3hD296X$v)}jz!Gy=(rdyDk!?k?8AT5+8B>8Vsbh&>wx@heBq<}!p-taO}Tl{ zo3Y_7tHpipTMffB9u%-O!a~-R^@oCmG8i-;xHC}s~Ma6iUsibWk6CJ zXnu!Igb1F5p)th-;oLkbmu7B;m^M5koJ9%@7DU_^bZ0WNwcY;Mcb?(5RC0BCP?sWf(in+oW26HK0o`@Rw02L{j5YAa2mNyQNv&uKk>U8S{; z#+r{TOVuA;ZBO8q5HGNZ>`6c(UhF67MP;FNA(uLzg&T5vrpKy(*&*^`1MG?tU1}-f zKr<_}j?K_Y`T%V^=|~zbj#6Vx}3Cj;4${sC@jMSak0VJr^Mo zT?haqcfvEZxS}Mzd;KznzE!<9hxSi5dclM`6$d~RTCIWV%~LaQp3NcMstyKkaT+u2 zZ8Ur|KGNTmX>ZT1z{SnJ>Iv|V#F#k1OT1cY25bz6O*k}TB@W5R`fG&;;}8dEc3hsh z+F&TOxMcp1W>6FH4{Z7F0`so*TtuodbKo9`lSN{iC(ifVEA$? z0TuUn-Ndciyg9Bn3q40Ch!O@!n((*uI#es<@vQu8k2y)2{VkX;1Op`N&_ATRz8q zRy61;H1uvOB3QaEYhHRxbj%;T6>TBKjwGygh)^7UjlNLmMF1 z)FQ*#?~`b$$N$}A9yFB?&sW`TGJn!csp#(-1me?iAo?wLq^Vd_1+(17!5HhmG6C?L z-w%Nq6nK>Srw3Ri2TtXk_x%#=$D$D9euj_OG&JM%hD#3Z?V>45X@uJSo_X8d#auIU!yHA-SzTM2zrBEkdWY}N0$k{Z?P)HW( zs^NL%#5=DGb~|8Mxe!1+&KsI}rK6nUDoZR2VnIxvZ=y*a`+E%zw@#Xm3tJwY|IZ~; zKfvY?$ANJ->s|a0p0fT;R^UG9LYFCk%(1j+-wm}KU*-ubmtrn#q1^777m$Bp*G!xn zplIE1o~}Y*Cm7iD79jON-qO*0YGO+MQ^ZC4y9NouDt!}Z9Gk&lw)!O<9>ICX9(*I{ z*@U9Rp>r;)od;H$=#el@U~A}l{&(U*QHv+VsjKNH1X!km7UUf>v5AfI+aYT@-*dh@ zbxz?%qnD_g%#$n+|4VRPmUJm%->rqqjre3 zyO4rVsO({={5Tq2qFwP2t@d1#-^0{L{%=Qxv!pA4W1{k;GI^_c;(6{u-w!5Xz59MW zsw8}K*#uV(hNl;V+X3CEJVeo@XNF7nbhuwXF@@R0fFA@yXAzd?0gycoF?xot8q%87 z(4TqQRZs*}K@?sro?b7BnA%I0=0cXM$jDAAjj)!#mi@Lk=Rba*x})8e{+HK$NFSfwhCF!QXI^ScwpNw^%fc+$S4jTb9` z^RucjfS8}zcodhN2X4Lr&RrpHOT@U;R)FGDitGXE^^~H$f|CyGpF*OHELbgDZn^-C z`1#}oa2QM&nEm2EL2)G)ru{d8{rUEY*WM$+9^j3LWtA3|A&-qj1m5MxHTxfH(fv5{ zP(F9J%;7^p%dp42(?uh7+s?{+wHVF?bt5vvb{!~!l24eG{3{H99_iAnVf=?IIQ6ZW(RVVT=JC{)>2f}Dki$FS9Xc{Gj48BZ zxe}tW2)-u(o0&v;6~*>)Be664oZpbEtj8+`Gv+PT6aH?tBxWt-yiaGNX?W3|x3QN` zGma!UO0C)uxSEz(4qQpGl`yb5YWW|ym%xjH7Q3j6YpPb!Uk@A!7VYsN1g&#GB8rAl zH%sS&s?p-$w%tE!e*o&nbPt|;b*}ehYq!X`np2!KNme`!1RTDxHI)PB@7+KwLnu>< zxFj0>s2ze0&-~CX3cwQ_jHWvAtLM_e=B_yKHew}hQk9`Tc{6retilq`=g&WNx)E9} zN;4KT-0%D29@yoBHt2o(G9+pE`{a_dj(&z*>33ksc7;v4*_}=!)cDV;!X;rs-nEWa z--xGy@lFcy1|&mRP!=ACscj`hR;nEfie*O1)2?zTMy_p-OYE;jN7BibEL;yMUnb&j zk|t&s>Zi`k=?zjz>$49KbD)q)Zed(Oquxg)g(WdcOnUn9_pgD%=`{HOft7}3$;IkZ z(eP&gCr^|58}J=to<+AZ&I|z<+3cmU$o5pst$tRZ@R6&_4GEVlidf(GFRov2-VT3_ zWw6r!@8#9Kdw@1#LiE&6@SxosQ>W@BFOK(t?YP>e>_6`+Sjg^LnB@ezd|}PQD%LU3 z0Ujb>C!PpBW=?Eo$VZt8h>WdV_+WQ8ja{m#a_}LlIK&W(-Lsv0%U=EkFducP$o<`s zI3UZQytWw$t ziX7-JlzVd}#4xT+oS2)B5H%E$GKi;H`C5e1@#x^6Q z&6!=NXhd%NJjdSsCa6VsQ@P1I1RK3F<% zKo+H=u3|z^YpFcx2+A*%=3OzBjnlwcd+cy?Bv((t8Czwm-=8D?CU!$|^!t3@Y<@?k@~q#p=>ToEo$OOBTGr%m7JJ z_=l`S3Kh4Le^p7}NGACvTQch}?*nyN21tRTl-Tk?r}~_bWuf5S&4z%(o~)NgaC@Uk zygUv8wKIZ$4%owb(;w0=vU;TZSbXo2aT(OM?K=8mUV{0F2Zry^oJXlV9)gi>N^5i1 zR$BYvOW~J8(1()nU}DY(XX~`(`sG1oq(=u$c={cE64wAY&Yrtcd+wJ6wCz+VDVNE% zfGkEL?JVd7i3)tanF>4_mYn9)$;u;bfOcaX^xN)bnl+2xDw-*Cpf##o3-!|hAf;go zI%Ot+d{;XDb>Tv1QRMQ6&;B0XlPo6-qmUuE957oo3=I>N%D{T(EJA2F%jICS7^aIKOPQ2|bg68RbA}yb16L zDZ3WL`8K$U{eTua2I0IQqqw7R>Xi*aORoXrwpYNr#{dAKnA>PY^1it&Reuxi5F=uW zU;7#qTf%S~zNSocU#tuBt&~i(!GJwrGBNQ@U4zK&QTl)bCD1Pz z@Sv9#Wq)IjH#DfrRRQ50%Y^GwFOG>R*!joW6*9RWD3d3HlNrL?z9yseI1Gg`W>J)*y(lph(2F6 zGAx>48tltYwYFG=Ga#a7>d~V?Ov;g$E+C0|YgVlKsIa@R(yGX7t{0+zY~KMZ2X(fXPhb@I*>> zShss|X^pThi-?k`QDl5h^1O%bPO^BRkdy7o-1eJ|*+jkP2pCad`P4H~ALL>WY;Jp| zfBEh49fU0%E^5;W9czZ(05TBQ++ZjxKY2oVhd%n;+bicpfQt^V2$CYP{Ojq$@=l{7TR<`iEAsjex;a2f&yGtb#2U^Ks=tFyH0JlO zAE!5?etXtmpDCZet}?U>2Fe;6#yJZlv;CX~X0=wfjq0lU34G)>Hvr(uoV!FsmgN5O zBrlOr1-KjSs233m8o8t9ZHXEmkIo-z9Czl~cwE{E05*}*sT?#XRlTL>Ykq5*`ve{@ zEZ#s=Cx*r%*|Bp1hC!0P;+~V*x$Gt(vLUqoCoxsQWqfN%ho6hV_?Nn_^J5%8(t;U9 zQW3=CKIkjz1)_;uLuB9uXMHlb>FIwP>412AZU?$HOA?YwPaJBDZep8)kUNrLzO@51 zg|~2N5>C3dnS5oP_)HH#P_c#FOR&yj0DTK+3!6+wP)W0HZ-GMJ=2aaQ+ZJd}r%j(O z)(oiw?%E*XyuanIgkf(mOZ8kpG@D8&l2RAwQRF}x^Gasu^2D*WF3|UB7(7y#x`9#L z?9fi!IwZREei?F3NE;4}MW9LX$qn#!+Ji52QCc5;?%6yg-3C|0rh_0?GYu1@{@s#? zyjk>=(~xT|!{K-;@yq>U1RN(eC+S#15wG>!0A~NDSgeRYJGdR%11R|8Ct0v9nuM-G z|7=@>uydx*9dd$YMn0tv;Nc$M2|xGPNM>RzWwt^+{s57g3v+qdnr?d| zkW~vf60d38=$f#W0}>@b{@Z%B zGq5)%dki-Ddd9-F2v&53HUU)07mWD!R16$L2M!NG#DuAIC4ltVejPGjg1o>i=Ss91 zmGZ~pFiK%1$gnZqM$~v3!X-_`bbjXnIi&_7gw*4ECw}%j7?o$qAc)vt zA_;P?7r$0+_B*9oedM_^w^F~#It4NpY@xt`_!=a*K(Q5aYP4a?K5i}lAsxB92Q}S- zo`l$HyZKu@+*YEz^k9B}bq>>Lm$yy2y;zxV1JVw;1M%IcgM_q>bD`nc%m=Mg!Q;$Q zK*^-D$L>QM%SCxw?)x6CEJZ?y9|52!izy${E1UHb{0*<;J`9Bt5D`=G&&bUM+R8Ve zmU`P{&KI~MHeI8^S)CwxS<8|Ao)pF58`@H;5}JD4yD^2`e-t;Kphju1PCie$ z&;@;F+971Jy?iS2B@36v9!`iwZR%vHle2CF4g*07%d?^D7Ikiho1)(x5RlfN*Eq~f z3BLWR$9Hnm6}>5nLdu6c_}RiV;c#$Fi(b*)fTG!{fKb!GFjR~v z{DcsxE^$$x!yyN9&k($O*gFV)m}#E{%ilb+ADO2^4-Q{W%vEQ(LA?@YNnfA(8qv@* zXHpwEM7_<6BuUw14`PU~q_)}0(PSf)IKLtNK;P=cqSaBg97F%d1uc0llG0tJUFk`B z+hTJOIs)RO1D2_F_3j+-Mvu|e!Pf7@{78W|e3^Se>>N_sJYTx%3pW~`ra)1A|9I)> zKZ%<)P5Zg9$VK0BHnGqZ?H2yxS_VHhQ!1PL30)>{<8h)B^(us!#>{7vy}_pX4dXoo zlcDZ`gNO-ocH|&W&$Yhs4n7MK}-(CFa@iTE= zp@yjwCNHdaEoDA!*rCpow+%D-b_#-UZl25fOtJnx?=+ZZZ#D#sOi+<6U(Jp! z(f(Mv@*BFcN7{IDTAVQ9@uF2oERwz8iT`SOYR~z=Koz~xmt_}qW+qqM@!luwuEc#( zzwpc%VhTPV6JAZcDI-9n*Ir|L>tX&!8s3L6PA?{AG?CeZ%{w*FlAht)83N^Q7%sn1 zHBzGX%^_#)XK2z-R&fB2a7|jd7QO9=JiM6w)u9azwH}F`hJ(F_SEoc9H*)aQl^&{< zo*pG-Wu2BY9l>1We*cR$#-6fSNsEf=r{(=** zovx%|Z}1VtH51w~)q{D<$Ppg-Mp{xRPNUd ziYE=qugPPmlS0dl>c!Op)G--EH{`@)5Npw?>Ijyho-ik!Wvqm$^7kgtT%lDjW90Oi zJ(4#9oNYO1i|p>5+NIty8bqI6^(m{nHkw}v91+?RCaIsCZg7z^Ajlq$1hs()>CuKM z(5%tX-K56*e;I}_#MxBCTv3*~90t|9w9>^H@}}rYu=4LIO9Cb z|MAe0rB%#d#n$@{v`SVvAv9#f$Lh{~hjWQPvTe%eto^~498eSR=^uz(^^QCrp<>Ck zN%r}g@MInc$?iAmRL?Ks@4me96FQ9N`R!Hoi~@6}lmD~YsbRGf+k5!DQ(Mc>KKy}P1lna`lQdz28`}?PldTPj z;)S7_Qjd&BnZ9?0kkprm56oy_`trch%x6*SwiqyruR8eDTr7rC^_J%`9m~|G$BDni zqqQ-zXkg9rQ4D(k%(MZ=XT#jau}ZCzO&xiIYrZ9KFy1TOir+upA;C@d`BIAJqW;nG z0yHq9YWhe*Q+kMzpwl!HQW388<^ar!8k*8YHhb!%?9Q{!nfXi_34W2s7mmpEywGQ% z*q~p{bK08A^B-9ORSEv$VOiL7eGc&iK7*F!APn3DOY>g&B!XV!%&+_VFr_H0UlVf z%VWzvY&s303cp%gZyoY&v%Vs8lw}4?o7ajwXN<412-|+7^ADaua)+MJyb*j&Xw6zb z!|?^?bYJx(PFl68rfc1zzM6M{y!R@g5H~L0e*Ul%-$)FuD548aE|Qt^5>_1M4-l}x zQ^OWHW6J<@6HMT}xd)u_8OWhK0H&YWZDZ1#wF0*HlP6c!bkm>ARqfHL_W3CPeQ4-; zFQ%oAdgo=6?RmrBMg8LIL;G{p|MP)b6*Hfg#nAbk{k@XezI62e{A(dxIGbOLt=5`U zas376`-JCxun0b2Y)BjzvzPs!FB}!#M1=Ne}6xVM7{Ck-yD}OSKMsJtKt(9FvcolXUJ^C3++yq;?$|ym(@Y zc+D+I7@bu31Aq28MZDrSIm1#5={<%MPVXi*dq+eGfSMdI(Xj`2pGLupP#TOwXMX28 z(hU6R%K?-U`8nce^JVKAnbs}#!$_b9f^#@XcK{`x5tM@rqcTAo?(aa>ntQ8LwQ*)_ zC9R(k_E$R^Kr-zzMKA8brpQxEXhTD*#NpDlWPBCE9>()->r1Sh+Uzy%1n)Qk51{_i zOP()SySN2+ip)PQXNQl^W>tHFK}8r9pZ&S_q+LA;A9di_GxnXKOx?@i(`s7OlxVF4f3JG}+ zsoa9Lj+)UiNx)*mK;q_P4$O58Okat&vGYQP%2Y~k*ZF&{0-V9Ch8`_6TH58*N3VlH zrPBzk7;Do`f4EVOK?jBtpcgYiRzjgdrV{gB^MSmas@(1{HDD`h%A(<0n(LVY=}+?g z*ewZZs^(Ye&i4yr>|sFizF_QFyFGH-#;NNL!x}iugQbcy@|Fk?%8x(rIHh^V#7S)z z#=GcoyF^ls+(INwE7ExZaO_G-PMaOzPb=fNmk@oCeAf`5D!jELU^|8Wt*^K!g`m2v z7f+iaL^ni()q*IpU?|6tUa&A4M#TugG!w$gtS_oJ`~Wdh9dfp&-(!xHQ3Je`DIEBr zA`qw)47r+dNddg>h);PEPz8IqOD}&%LSGRH8oy*vqD9sDIJ}4S<$eRtHhF*8)ut+s zyh`Y&5dTnyRzsZtQUP()(hdR4JfkCCw&2^m2|ADdKST8^Qep`O`pStj*`|LQ5zATa=-xOCKJ>q z<&o4T!uW$nLRazCKfpDKbW#+8y5J9bUt>U4bjBCy&TRm+7NEV zHSk$hrC;ew!I)uC1BGnKoCqD+0@|F)ak2Ki67i$z&;dEp)2=b~ak=MH3iT%m=ON5&;)ZOWYuzT149ys2%R%7`^w(R~;{jCg`hl-IVp9M~PVk3#DI_Pn5 z8|bB`QmUaCrdt)=>ce;JTCl@nVEi3=l~Juq8vGMV?$*JC!Ksb;M4w@3DxWv`4ms)1 znwclqx3D6HiX8(wkJZuxdU#KYct-RLG9>`u-MG>f%41jZp%_XP06pz{hu{^;7nxbz zB()wFdA9J_p0xMZ+;RBZkH5jA_*!d`ch#~nPW@<${4-$lzXE;=jRl=eCn8V!s3OQD zYUJSv=H9QYW38-22j&QJfuDiMFzY`3x<&En8+1%Fr4}`p)A2rIf&)vYi!V)o0rF_5 z;Q@|XHxazU$xPC}6~lQQ3v+#hLphBz6wW^s;na$GYDXi^0~paRpKyF9iV+*WS&Vmk367ct9| z8^H%(6ERt0ZmWmhJ_Zl3==tR}gT;cv`RRs>vfre>1uPX$ulRA7HO_v7WxO5xg^&4_ zoqvrJFy2-MjXJ@flN$-vi)l3eMLgQv1|afuDb<$Vny`8oJV;$VrnerwcjmWSd%e!h zw!zB}!?aPt2oZAmcNg66qgTQYkkij3tFuUEiMU<#F37R>T~_00OT)>Cvub8c+HC}W zhH)X*fp{=96_2^nqJVJ~|b93*2C47T*Y z0H$VF^2B*pv5(EuTh@{y6uM=PU1*$Tr%u{@sm^hpBtZVm+zOYpJi+9kER>0Wq5qG`YqBjU?bpT+w+0H-4-$CdVbdhwqRhr;G?O^ zRjn3$SA9IbE-s$brJ9*rk^i>U=&?3@%S+!p3N7P<`u%`U#z$D`8m*8D3JDratYj}j zyjpxKV6cJRk_x*a#B z!S!v6LD*!;m6F4HC>piC2*iKgRJS0Ow#ryGSrNfZPw$x3ZnEKL%Q@9R<|3d%k8~0c zlX?68LUYQ%$&pog$kJ{Uf0KLI^(6-^X$o~s2k}F44}1?&wnde{k+W$xk009|Ri&W9 zW%>>lninfy{h6F8<$o7w>n-QvMbkhC9B#zUBNHNb6yd|`}a`=it09R4qQa!Gg zo}5aKi(2WDtz}3mN(tqi+m57fZkWJ6ZbFxB94^4Ebegn5X;d$&o4L_o;%OFoomxrL zHsg&6=#A}|aWr4UuQGG0Ewx}>Sd~X5IL0fK7>Ex@-Ok0&0^safzYj`af(p56w1dP}4RUC%) z#=%%&NU5(uFoescp=U0XyPw)9E9&}aKBwr#0!1LImn$gDwG)45y7C!D8tL*JnfA{J zV<`_>H;9L`H%6+05>bfy5tn06PqUT*ms-n9A77{dwG3MeCSH+eGX6R|anmv#f5NE? zt0ZA*Fjkt4uE*ulG7~0HHB)Nf%`C#(W>B^Mb-Q!FUNQ$95P81(-XNa(d8YSQ@HZqY zH;!J^KfdW0a4L{ZtS_9UJXr-z%si5X)4%7r_GzeU`p;%%H$RoL5L*78aFf~glu2j< zRT-MY^VR9<8x0ud97C=-!&0((&ZMBSg5cspiSvja{dn!_@KLc=uy#IWDy`aS8-jPC zm>Y;#VpY1mL~ay1FIT3b#v++ON74X{+U&cD>xB39>Q!jD-Th^@B5?j}#9gCj1K`)Z zdTE(FoQXNMRo9l>^>f415N_RBUm&%!j_DQ@cl!yfm!4Ek{=E4!!z}PsX8nd$^s{pB zdG1sSPxV>U>7!10A5$GZr*OY?Yx{iKWZ?5>nKZQPl}}Yeq=OsBeG_^7FzDR@wf<`$;eETEUtE}jh=&)Z&Gc%Bai5{5shaKn`Fgl=8FsJ znSr0_@|i4Ot~o@GAyb6<_UQxP>6C9aSfnnR$YQgO@ili<*ELvsmR|k%+j8ZVPl#jH zoTyurqOKOuNnZe`o6Qtng+LpJNW<5{e4Cb)zWg`E7!hBAnO5?W1H9)(Y2$AxH!vlO z6Z(vf*?u`Erv8u@@-Y*LZGa)YIJQh2Pi~cPz#lZkTRHtdKz}UVO-Eh;7@ahFf=MY4 zj$i&EF`iz=hp>fxf-S7e<7?H9RdiMSskzaukKez8`8`?qVe}2%(bB#l2vQrqKe+Z- znh*B)vilQd-`ULGx^62y2IQ0a6cnqrGL~v6dBG)^*|2US{Rz=0mM9u$XQfR75_}Bs%TsJ{GzbV*t9Cs%e*I!V)8Z``_N0y0x< z6^@me(zTpVjDNf7efH^wmA2mlkGW=BrNC8}a^Y*!aL6y)Yhue)FSg3?_20h}Xchcf zCc1fBknJ^-vZZpH)t{M zfQ*2lW)z3-iOMyE4!=`0<;{{5Jjj8uB2a8-`QE=U@mP!U-Ox!-P8-j)^4|7cf^xdL zYF-lo8@_LANupcA%7-Elf8~@8&%m(=rbyQQ*ba-Ajb*ok%4|(IPdE^NtcJc;oro<8^$)sQmnRn}9DMuk;0=+*o$!E!ERm$OLjOzEu0ZSRy{!L8 zd(I#FOl{eqYKI1ri79p)Jv$c_E$SPTUfctgqECB7M}jBWY)oA&^5#?!zV|LPX8X&gSs^{Fn7?|nVyt%(dYVRinuo;6-s_=%Ul zJ?$$q9W|7Mf2a+wg5Gk;k2DB8^OPNRGAC^e-H7}Dv~}g-P_}EF$r8qzvM*zaQX$)9 zmpvjCLk(l7M99cG_QBvY_9ZHNLcT1OeaXJW$0!;kd)XRUvLuu9jIZyU>pJJmU-QSj zGuL}v?>zT?|L)&nmHT1kT4RPxI77O)O?r;b5m{Z22m1YY1#7O^id1P4oXSJ^F0RJa zVxKE-V3_aJ1ESDJSsQG?(tu+G-xKkUxn&&NX-_dxMw(>aNg#CgyneJPzSN(G6f0wk ztVv-HY>#I`v66oRJjMn6c(<&t^FgO?H+==s$EL=1X-*JFnTUQBXV=5Q$=FV=RqCdFX~0X+afk-quouXoXC4o8?6n?a#Ir`^Q(d2|=dUAeWzEt& zN3D%F<5anSV)cSPj;K9n{nLD}j>|AA@P%Vk))?9u^S%1hk2%)@QkYZ(3+C{q8tk*& z1=h+M=95jp9@yZ#PFZAa7xe3UP#hwo@B`q^463o(QLZ_^53nrR1whTrXCeaE8_s)) z+Ga;bQK*o;C8-Nu&$EhJ%=tcPhi&=X1j;pTs!TS^zAA_sdgQPnZ~3!DTEt~kd-xS< zx3WL}-i}FG3^wwlj~|n|oxP&8b323QQ_&9xpi@krud9%IgY-79@_h3I**a}YCjux_T8ykc?984rDIBD&a!#)J~sTbK_?y1qxi`VvPU#I!!j;5>|PfA+%Ol-^V)TQ+)X>jODQ1 zwCyzg=Z-0(a1a;AK}E@i2-e|ro)>e0P|_fZTlV5MOHGcLhe-`9|8~M@0{7m-BTz~- zrw(A5!3Q&DNYzv48|D&Z1-B9QZ^#=#HUKh-TwQ{cWp)fpVV?Augu>2%0owA1m}|m0 zNR79eqNIQZ(oS}4F{!sYGjM%CX$syQ*$C&&)8Pp+LI?Se1||=tRZvc}ss8-oA`mhw zc*Ik5F-9{fN-AZO+X;pCMy^=g$k{|gQ>>$$P7!!6$wizA4tTG0$3CE8GY;)tFb_8S z+<-6Ej9?X!Jug4u&-(NZIF@Xs`kgieeS@ZIvF;zcsTOkDa9V!FwjUm6ndVbNDft{u z#b!{YqvjCFMY<)lsGlTII@0j3(`=-rwoWq-rxlRRBDkQNE zlo%0~nC3EI4CJsnQFmU?=sq&UdF0{8O$(u55-GMR#4`S!?#TNhUb3XAo!?BPLyQ|) zog4kp(Y89UVBFlPDT^q#jD@wM;?6CJV~`n!!Z$aIs5VVj6@gc*uXU5n1gAqX9w}MqtAfNkbysd zC=B=*;%ae2XZJf+cg2V9W~hUa*E1r%LiI-l+Yf24*1lpgCI3UgW+2#r@by}c)ITli zDfa}DL_Scvdn{zg6?wUH7F#K`c0`|gtaQ-#A!mD{_6dKju*U~frrDXKXHBR#Zsglb zYgIMgHkx2p6!(S0>N{YZ3G~f!C;OFkjNR8Hwf3+Bnw`RRg2HeqsOphGhr%B#@AX3C zWrPLHptae(VD+Zr(v5_7druO=v{p_7U*}_B_)r{Q0wqhnpw0r8AL;}%Fdm`@@}GI| z!{@C);?J10)72gxjeM_!pT8drLm?3=nP*=MJQ=@o=ogG~JDBW?%{0EwP(j8zP8|2m zm$zavfM~yR4=>;@_qN)p0|a#3a%U^J`aG293vj68ja{ejF{h#jXAA<@K=csd_H&P^ zpq<`*Aqy1Al9K#H%&|V3aC~*HM;^Bs8n2j~(+Yp^ISuiauoc`rFSfw2;VVkg$ygK$ z8h-VLxx|gE=LtVRCwFY&D21g_?}k>dHvuA$OPY$lp$JNND5j!wP`6zY6%cZ+FS@B_ zZUht3E+ZpkJX@DM@XI8B6@-vT$z3%}q{izR@Y(^hrVd~YE^=MN%O6NeBZL_kR1Sc+ zGg>s<nH;w)U>wia<>7ZAnqXN?P5hcuVeV2;GsKTG5^{E%u0q=H zq@28beJBH%z+BPPT^H<}I#u*Utc~l=$-=0->w2vtze|J=W)}&f#&f|yq#NF9!{wo4 z4SDGgQH%Wd==^) zr?4l0;$i`I)914LQp;=c3Z@4Z6%8mHi;tPTf+?yIU?D6&VYNOB9vFdj;M2_VnjPWJ zd)^E_Lq`pS*sDf=l{RONjxaO`Abmi|GnR8A^P#*Y5p$(R-T1|tM}VS1AgzNFKe z=}1a_`unX^OfOHK=Av}57V=veT~`$t#Q(a>MiO5Q@MCYCeny9OstsB9q#8(8S(~N! zmGP?ev{P5%dO#C?s~MsZ!jbI+&|wZL8!xXaNQ+NKoEaQ2#}}=aaT3jIyBjR@;dze0 zR$>;g!nmm{$7YbCh}yB(Ijih-SoH!Dk3G_fUH}ph!UuFHo|6nz6omcvQ9eri#>Y9# zupexk{A1DTYTz#&>4xm?LBK=yzSU4Zeo;z()cT4$kFd;6Dhi%j^p?*_72XbRd;3p= zPp)uWPzC633XS0fdH)JMh|MvgAybSCbduKx?-6)83oKZyn*-}61iK(!u1PzP%4|RR z8;yRILzz1I9i6~c0^we8&|Z8L;HNoBH|_f~Z& zOn*&JhJcR+^yNw+T_|+D^=qC9dD@${#7dna;DH{4f4&!+cY}7vR^s^ksLS4HqV`X@ z>#dFqA=7beY>me~nu(YZjZ-e9vao^9k{>ZZ;N{ye0b-bMZ(j8|GQh zWWqgd_Jo!u`~uxCsuJ*rskVdl?OW|i&ao>Ce|!qoOy}GVGZRuTr|x~L$6aKcU8_=f zeF1Hk|LMyM49EZ~F^+1MMuMuw0M^ZG)73u$yt;*aQwIao5osz(Wcobif$zbX5<}akw<(9r%q_+z6ne}0Qi#sY3n#TWq-(b;^@3AEu=>UQn4!DL7UB2KWzeS ze$@X+sT81E28@5U_Yuy@g^FSdKMi%ohAz)L2za?C#Zf@{mwVJ=a>1_SdwFYdC|mOC zWe3-%$2o9Rp=BRiWHtQ06Z+OgMiCTdh<4+cgk5CpIjHI)aXCKYy-KWC zaNv!5f9SbgtU&5rwk`s7VKJ&CIM!Q%~-Kp7we@0?8RlcSmG zQ)o+bbu<8){Lh=ck-tE`Ou8`7c2l&I3L%lol+j+e#;4G>ow-E8Dcc@aTJ+b=AfZNa zd-(g1Z|iCiMDu+g7@c{DFtCh~o^x{KjSU>qUCID$@aLc-SxEJokxC5U2n+{4Wq5FKZCAJNmWhbc-D^W(eQtwZkX(xHrsBj^z^}CcR|kx5mTKjoRp*Yg(Mt9zyidfD=gQs#{bSu^QGGY zQeP>>SeHL!8$jSo;soH*OQd*+J)vQ`f}XcnZ742?{gqrIYwje>aN6%P@Iza4Yq@+P zPj{CqYDLs^jh-LI+(53rX{~hM7W@bJ&A~~=u}VLGcD;c;v4Li%h02Dn=-%7H?FAdq zJPh2T=%5<@jE6lw)o4nr)Qc(vtdmYc%5yj5991Ew6LWynLR6rBYBH+@3q}QNesvqc z6qhtjo-4%$U-L_Zh0v7U{%FE@+fN-f%w~6c8{4E2kb~}yB74M%n?eoXTIPHs%Fv#k zYaH`7h2xhNnl0T*-E0?=h9B6Glm-GPHaTjt$DQimu(&i-I1ejvRiFJZ);*07xsY<_ zS)*dS*00@`6`nVoe(r4zeabJ#+{RTIHPpytqKmrw)#R0K#obk{l}Q*?o$xp7(&G9%@OHa4s{>lrATDcz_rjSm7s zHr_1gh_EVo_gy$8SGai%&&0LXI&yq<=Wub<##;TF1=+sE!N?1@m++L_g|L$xOgY~Z zs?jYisNoBh-YpMZo&-n)bXL*Kv6K~xikn^~nbc#8=UN`RSAdP|pkx#{Gfc#@CXKDU z=ge$3;u;2BS70cHY({uOk0fqDezgwd*pQ4)3s#9Bz+6C?chI<~LJUJd5}pCXzgMhz zVs?zquJ*n?Hx47kgG;<9fzdw-YlEQoUw}9dZO!c3_8=2&N5qPn>#o%)q1= z$P6n#BM%8HfAbLz_uEj=1}4wEwF12|b84uD3lrA{j7jp>KAkwx|z-9ktBmd`33m@$lq6a>i^}nwBn-nwu2MsHKo!DQL|I4+3i))AD j6;fTJ|KAsjBItgxXJzOIauq>+X~4@^-%PLUqCM_k8nZwY literal 0 HcmV?d00001 diff --git a/docs/images/coroutines-and-channels/background.png b/docs/images/coroutines-and-channels/background.png new file mode 100644 index 0000000000000000000000000000000000000000..0882eba35b6efe7b8026188c26c7ec382c56f2e8 GIT binary patch literal 107019 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

    {Qa01u z%>(f}-X}^;!ozsOKfNDNHVb ziP2Y{D0MH~aIDs0?jMX97TreQ#b`+oR884MocFs1PzwKSw?sNS$5LK^p@p-*LnAMuzV1FU#-U{KRt( zk@*eoe{4zuMy43vz`DofQsGx@tk_6K3v*8k&t*D;^&~X-W#4y+H``P8PUrrf#bWRU z-z~#>{?t-!$$It6RL;vU^4Ym{?Qpo^DaoZ|2>)r%@qZ*E|7S*WB@>_Wd)OpN=}G<% zIwT{D?VxO?eB_Lgr20Ww@6?$}^pH3-#F1a47{j5#8tX}FLFi;^^z@L*^b_f3-a&NG z_cNRME&e?WVb8!p?8jinlcc*k1`n6+xua|Rh_#eKm^B?I|1?HVlkrE?;2Sq2^-~pV z_d-UJNcrHZEW;{n1fcG{WaFyUR-&C?2!7CA9&EPQc63BGx^?7yNO+wUbc%B+BxrZw zzvjE2@78BHJ0MY4+%2BbmdTd-;h1qau&t>k!S3+TbRK$g~-{HQ#a;Kv4PgQNES zu$;0ggLAp!^t?Xud`95*RJT6qC(K@xJ?IH}`Xu?OyX~;Z2NQ1nlZbNY&$0H3MFi%p@Gi$sWi4_f^*b*yq92j(_-P)ff5noTULgxZI{Z6n6bZiR93b1L z9H7%LYd@&qG4K8ax8B5wr`uDzz}FkZQl&C_Uop-`5F>X&g*v7weBPLc)i5k+avEJ_ zO2~084|C=`U<{l_qCDT0#QH?$V4R$Fik3JdH%fV%)D!fe!j2sLt^@=tNWPUDw%o{h znPyL!pn(6nCY_B;4Fq0__S0-;$+DD3gOHOq1odeZ2!<$gyIf{ebgW|!1u6KPe=i!O zzqx#C(_6OuZec4_QRR;FUFxILwOCs;WbN3l@nfX4M%IFEVLd?!Ma&hi;8mJ>g)77<_%~!W?-1vp+p#LakEjK2Tgxt*#~s zf=$A?H*aP9%yMPF>XHWjnlLg|?tBL}L+q&M969iL9|WXytJWX?$nrhM@@bgww+@-g zZ{8wjz4+wG`re0~#y#7&bZn&72ePpeNLRVU$2+O`9_7$4Vz&9zZebE#=oqS!RNt&= zw*7^;4l9YiQ^|R~I0Uf=zOF{r>3gmVbI~uv;K9&Xl=jffpIBm_c8~YhW5d}d`+Ir~ z2W-NZQ~NLsrKC3WH#~yTu4OYWk#;9aLgvgJGPAy8EZ@T4=VSXU7#qCd$V+*Bbddvc ziOyY3U;c|M+c2t{~y{5CIvmPl41-?;vFVG~Hg zhS5A6NOFSnkf0k702JhUqP@$8(lwh%!ovDGNq*j}I$q;*=C3EoizW9|9d|wO>jSs@ z3^o^cVd072W|wO7eJO~J;mnmxlPPAeTa)-j|7Kl;Cr557A`3F+?&RLnaVNm8vKQo9 z*C5(_=bC}l>z`7Kf_bf}52y~CszK}u zDVb$l9CtMj`IC1jOqF@#qm<8?Vb1-c(`xm$P_I+*5#{z1J-@e*FCDSJigWxIF?pGy z9Y1aGG9em}-0g*Ic^1#J4YPC8!$m`&>2Jm-nDP$ifkWxd@3&g3T_Ypgxls#$rz`%5 z@~|cdL5sl^S5H?&Fo?RR1@sz65~sxG?8U=n26e3BMeV0dMO(U@{qJ3LH~w>1_}>kg zNBE7Rp|XlA{KvQ0|L)Czb23(~Jr2EAwjO=cR!}iYW|XkK6;Gh2q{vs6&l}60i&Qf` z?|#!Q6HC3jY*!Q^w1sJhh8iAC|7d-eR6)csOKKJ7>G*jx;dvqH8XZTUs7wJ-M*tNM zu}X;Q^OXo7@!Qcwnb(|#EuBH zngIzxmCeW+Sqcol@lgQwpZPsAi%p~HZx7uPG+Ro7PK)9{%1cn>o6Wj~cL@py z<7VzufOG7rZ%}pqWwYDQ2J_9{bRO`g^AczOTw^u#j5sgu8p|16HS$Dn6oBIea0s^@ zq)j2s;X20V7hiD-NF)t2^e6#fjFwjn^xe!xHe9U@AvxP{QSh^ltthy7UgHJWASaU^ zoptQgVB@o+Z|r%-n+`1nFWQEt@2e3R0WTM&mR;5GewQgcn-y^#*EI1WZbAF|J<|LNzUM=7hr+l17X4=r)mxRoG*I-^(UvvAd; zzSjXa{6RTx4Jx*ObsFqDZ#4RlJ_psM9dwO{UsSe=+V}6rU@<+&BN~t}EYu*vGU!4@ zv6xz|$Dsb^-8a&0)6p zduIM;(Gi#O>TH8Wflb|vevui{#tr@HU#HvOYf2(+&(V|#{IHP88E@*YWA~)%wJUg+!o4^n3Dk*YC6Tq2r#@BT!@l=&fz2 zuj=x*<2#nu6~hsRL6dqBhe2J&@JSB82@ieW1Q}7&7a)bvrIF>oUCz2RgBPB*sr%9W zEUa?aA6I&j)Cao;IDtnvn~+{9c5cf?D-{jgnmZL zbh#k!F2)L+jz#4H8-mvmk^r(M3lmx|)AvA0H8aT;#AsjtmCs2P8}_@CUF@cp=?ws5 zxgsXH!ce>=5zf{qoaG_TV@Sr;M{b4Dtf3}G(R0$n8Sy)L!eT&pf6s9FC{YYNWGXnP zeG`*+zHCp~((dRuwzBeN+SRmLZtrK5eWBD@MvtKXiwnfI#z?yTgT9$gPf&`N=TdqA zJ{WAR3ACzGxKG^JtV4e8$f}DkJJ;QNeeL@QqCGz?J0oiK+3rxjxw0`^SJqs{4%%N`LATT)Z-t{e1O+Tt1pZy z?HSEqN#6&b*|t@m?UqT!?M)i$cZh0c8t+9)l?~1bSBLJIeNtWcYjz2G{-py!4*Fx^ zePtPp9Y>sYo-K}EbxKom;!&>LtPQWIfd?s(Qw@=avMYwCS>Kl!eF2;-(92Ok%;RJJ zQ-xypBLzRNc&4qxCc(<|MIVW<7o^+wC+ADq)(@K|7<#J9h%zERq|cRgM~wOR)4MyeHY)Cz#T z94@vEp>WJq?5Nw|%N}0)MIZlm;u{U!WzDc)oRV|jNgx;Sne{;MvH2*+l`#*O`PKF) z_3X+o=Q*}O?SREW*yV5M>l3Vi_GLX`XE3y-V|2gek$voa<0M%q)!Epl=X z(0(%3?~+%ij;FDfh5uiI2}(UOlqM7%J;UcZIXoHnZ+|TlFGG zN6}fdZmw&(sK2+8#J=243n^pog`GIRVbnefAlWLp!vPl*w#}0WWz_m0lJeOyx-VSx zJ;gCKFB9XdyJRx~tW4vhuMHRC>^kE)Jms@bR+YRb`C~iempvwS%46~QVV2{%_mx~B zF7o=@$n+0#Hbj}`}9yYhq za|1>-Amnr-(%1u{#A2uXWKbDr=SuBbk*nm{v^oAoRBX5#{TvBDd-wZ zRdMv7EfdE%U>sJAVk=e225Xozh+MXyGE5_9ueNQ&rbCAGTcx5ax=B=yA)+*w&*Fhz zLz))IFMdZ4hnuzq)`wC${_e`RVtm*?<{#<32+^y2h%7Ysab9BpA3bCTd77CE?>^ii z%3%65ZRvT_f^IQ3wQbP8c4(f_ZT81+)U4mQ0NI``*g>SoW|(|ESd7UA!1>*^u+vku5OMq%_u8h|Ssk$w)31|EbN zu9*0FHjmsS`Tu;;7fc_{lmA8BoO7u~*oQUPVq|i;@y9I}`UJ)8xvuGhEoXOj==zf3 zTZLce`AegOWwHpvHdJO8`6~%e`GcEp?_W8GA+1G$sx`YARoW|Q`cG$?G;tojtdVU7=x549;$MCA5TP!Y2#8|R0{D2>VjiDqsAhipq`V&c z)Y7&#rmGC$Maa5P!80>>Fc0%Z2ax=1ey&5Q&8(&Oe6~DlP23jxad8;pXP)46I`K3) z`m;zYJzgizpyO+;)Avz6N<>~@=s65B^;D+8^7lwzP(mk1B#}-4%Xc;4F1+WUn)l0g{sTackFhacEsA~ zKZL(`^ghmc&~QP%atl>>PaM%766PF{1OC&ZbUa_z%bowCq2?yuPyy2JDxvXOoHTaL z5j+-Ou_D!Hpf7I6HlVhO$dCyXY|3bn0ps>u?3ZB6^6eLG3-f<9yb!Grgq@`A%t3MR z*%~s^;v9u+bqPY8D$8GJyEl3?O1RP)ZdDbk{|yv_jVL~7vfCZmT!v-I(j7~$c=uw` zVk(4QHA%e~bmN}N+x_tHQgIXV{!_CLcpq2&n3T~c?|kaybjLNA_c85=!TCB>J66T7 zkWpeNf!1z6Vzu`W!yL5prwe1m$_GgYhr(RLBkK6|(DK!{50x_%BRBB2{~F~0F~sfC zr-O(V#a97kQkkTNq@zrmGwvEIFwW>-RGA)ssygI{KBklY0pGQ2%jc+l*CJH7?=)=l zoH?0mc0n{$Y-eBI1C0A+i9Zfx%@PgV_2#ssQ_~bc_gr}Jq@K4wvfiV-Rr~>Z7Gy}% zuv`bCGtQ9%iVB*Uo1Kaq`<(Ci1=gY(4}YPR@NRMim5(dQ%WU)p(@=FN%QV=(vF)^Y(7&mT!gDWqO+itvmp4c#aT0edx%p0U+QV)1+|RQ zj8qoo6Tr>nFpmxyDSH0xxg@PC2EFuZdqA7XFzmWDJrD9=lWN6J#8rg0m~;U{0h6zc+P#VSiJM#M1&K`XF)pvAemH8{?i&8Pez=w)_0Cr2b%wdrM7op_VFU4+ ztO$E2p|;2mH?{&UT)=Njv;`bst4;x6U=g3T74l{BhnpU8+c=d}HwPU+4=uIjg}B}8 z{9S=&c})*Z8t`alplT(2wf$m7n}#!Rse|)h!#gsc^U|S9=t};kIVw^+aE%T=dx;sP zGL2_Vb?Yu1C!|IA%_h$EX%CQ3MS^ThHLV)CBfhl!jTQ7953qDy43CNgeF!MeXlTBC zL$5rfExY>e*nAmA30Dskve32_padEnxL3!)SCW;1>UzdM$f#mmTj5S(s@-+m(5+OJ z5%%B=CACs=R+7YV)Ojclptcn>~nSy9LgzQU(&UY#9-u8-jfgn<2b`n-7I-46!h2nh8iiC3Cb)i5S6;6>!Fta;_Ls7e zx7p+a2%!o4s0IT{5&%aYou$9NsjCkQQ-rbWKq>c;E80bx{KHU=*vn!#q2Msk1e@j|l2)_X!5zuE=Wys{oX z_t%17!)7Y#`3e_+fZzn+bMv9O3~gJ~>H?Y&HGm1w%g}Htzf>vqI5&6Xef&zsRBGK| zLvvc_YlYM7Rxg*vaF;^lafO$PT%G;$;1vKNyv+iC|! z3tBQa&i}_uSLn4$7K|Z_w8W=cGH2udT-(T;@&hJzl<6IBtk3F`u)iu&Q{nlosh&dE z(AdY$;f1oruB2%{Ml8=5t(a~vO#69S445Y?mKB_uzY(jx2pwo$Pneg;e2A|Hc=eyb z&0CHYqz4_adFN42OA{UojzhiL(Hszh=)A41cDd0~j!>jJX_E7~f^wf3Dk@+YcxaF^ zL~(u4FJL)H$9CgE-H!7MssGL00h; zbWSbCOkAi^lvI9B`(YkxYWy`;!mV5($oo~qT7yXKmixH9q_~O85@2-r+ue-|L;RL= zz59}g5k4S*XJN;_XWUQndJw%f{1kR7&db>Vk#XBC+Oa=q3!r!E@(NH>aU-x@hK zf!wW>@>x#(rYMCgy&hHoq;4L-TL9SjhgGL~m1_cKIf;aU9Jx=@L+$OxNu=P`UZu#CEN%Nw*Tn#ra^8@i|vrK!i@E6 zIA=Dcy$9xy=n48A>uIP@4+9fvYY~h-c0$T1j&9}y-1f)dK>e1S8(g%n-jYg#F48Og zwmH=Kl?Eo?65N|?kllM6&xoymiDU+;Iab6aV(;Z#n9KX7ym-m9m__C%)6@>%H@0Bf z1+;ARAxp=mYK?Mt=DE#VUc`E;0B^c(1lNCI5>`BBne3{xYVNCe{v%5qoSrIif!7ng zyTk-%&Kv&$1a z_$!~ZfIDs2W3A}0RY5bhZC$;0U6excsIBrVM$P^^pqV|-UUkhSlZ_$v3wB>O96=lE ztY^vgRoLP=&w3HK_$;yr^$ELPJ>C{!)wAOpyUX(hwU!6l&*%H#OKba#=jmx?YQqG< z%{Iyi9WSgkQ%$+BEw>AO2L1OPeqO?xGy$ED0u%7vC%n~5?gcKrfKLuIniVr2*o@mEo2}G5h=mm02GPMKaeS(2-h8GMG5$!% z|MaIpa&GRfRAEzUtNdZBAa;U$W_)W-%^g_&_kJrjf+O%1Xue`)nK65+v=UQ*O)XK0l`swBXZ<^A^Ag%Ned^b6QG%6pw` z7M7yJe6G`ab#SqYN>;@z@r=qglFIIspU*-o=utLxSDk9x2QBCEZXRn>Lry;YAT^)U zLcF1A?fD1tJqIRL6Rd4rI^^y4+rl6ZZo2HG$cjoz26M9Ljws8|2mBgBZ(b@5sb_Oi6J((h`-+yN7z$&+`_hX z4KRH(8AH*@>^Htt^Zy#l>2eWZrHLq${Q?bv-FpN%h1Z6M%+qg7uSSLjqT9u@S;g+X{=rb?ppxINlF{O~ zWG+_jJN!9z(lR9k2yy&oYAaI6P&Dgzh3zWT@Ic6yfxaj{>suD9=4F69GtRVM@9>Hi zshwu-&Sh{JTwj!x_czNh7a97T0UeRa!-fN*-coAXZ`md zXC@XJLd5byMDKmeM)|iguLD~Qb4O!-ad4Ity!AVYzEl5)wgfxit z)^E?vpP;6ZshU7XMpQU2voZp$FcF+A_z=I%S;O_WQrJ!;NuV%>4eZlKSOd7DIdAG> zarr>TV@ovxzxio1xZ?}sQD-c9+OIueWpmWb^cev2L(y|9X8}jt5+|rsv1{3&?o+-H z;}1X5<7^p`qGa=C;?;UI!h2Sq7elqmu z#&p-GOw=x$5z?x4OJgT#b0>EE1;6G6p>)olz;3SSADWV^vG>CcBjBtNH>pC(ua!4c z-aX3_d#gNnn7NNeOeh2iK-gKF(Qha@r;8(UhLOdo`9>G#wwgzcNnXO^MpNH>0jw>*PH8YvRSv}aGd;t;BCfsJ1 z8U{-Cyl3lA8fWhPOf!-3B9tf*)2tZxMvoXK4tzG)(+*+&y+LETy#ui=}+FiE(x>2Noa*6kJs9==Zng|ZMlV#@AVY#9vnir zK6;1xt~kWJ>rjtnFpq7D>FY_F?6O>ur+tG-E8{W@qUO$7o-JNkMYW9F<@xR;Hl?tB zr@Femg|4A}ax&5-8fobNNxJsjj`yy#>)cxyB#x+$;rBMpkyv$#3wwWv71!<)I^;}x zMqsU@`uVBGj1aMX`@LBAG49bJ4HHS7672VC)vui26%b0AM-M;(m98b4!To?PeW|uQ zgWyiE8mS=fp#hC_MISG_maL0Oj;Nsrep^NJfsq=%^4@4)ycH_vyfARJ{7SBJO9hTV z{Yj*7s640TXxs(ZkhQYQcCsdStT3FmSXl&zBUZY~ zU8&r|5w4?_vdv6=C8^HR=D8-k+|@ZBfg%45I?)kk+Jg@_rPJmuE1T`|Sm%6ba9J=Q zUVjA@Ly2C!dGp%zYnQ}qgv*r`UrAxqvZSbTUK^DPmT%NFnG_uHm&3|0XmzD_$Z)fR zD&v6A*(t=~pV8lqVr5Uci@j4c>1Z;x+z8B9Z_SfG>Xg=U?E3Zj`#7=7(JK==g*bRt zSJw08zYDf}>dTEI$r9zQ`*OW2pUAK?$rPBc!B_fo0`X&a48XGq{we`$$A@Bq@aF_s z{B27}2Ck>$m@jaAFsAk}Avt}6F>s$;#e$`QFi1By(y*Bqyhiu6DQ-p2zB}`}+||tZ zEpwsb$(@L%xMFiHuQm7PIKPFa$`(7_KGPu#-z$D^e%@4OM2clY<&9#jOpEm0&~II+ zp36Df{1Q?7trekCr9%6MkL8mhcTh%fAuS1CewDeTlaFo+Y?>M#8|$_5)(Dy6)M(3m3kkS_zgSsW=v4o zd01IY$f1CkM)6Ix9*)CIyeR5p#j%wdbEYcrrKL^=8D!~xFQ!OyTTiL@mRG&aX-Z_C zHiuGxrhxV9KTeXSUb>qx3_vdrX4(o)LsokufCBml8H9{fhGp)R2;!F7NocdNtY_Sz__2a(PjJelW zFSSxLy_Xv-ZI1c~0}s4x3CrC54-z$C_v8yS*Ai(FApa-YCU)gz%pI@PsmVAI%FT3w z*t`3$+}8=KXN{M|4V%nl=h z29fb<1DTXyfRcgp-1}cXxXe~+)Al!XcA-7ZdWgwe1iA`c_B=ctWLq?QL|R0Z-+9q4 zoyTTmrpolWnM+ARKf7#bIF+hutHKP3Bkc%4raA#<=oWSiLXPajr{a z()OUe=9p^x4kL$6Wo72KOqu$yPQ%m3o6mL`3%D&Y7pc$Z{j`QkAf`TottDc2g`hh> z&h@s7o(0nIubhffSHcwe&}`YCV}xyUe;;+FE!==@cXdvFjo>G2S~9rlU$?u&|9{2< zms^V1A)6wHe{YLqkI5)snv>R%>SjJil+ZIV43gTU_z8zeF_MVlf^_%}xgYNPrS@;X;r7*+{<;?nHi8dL+rAK$%ky+v;5P(tK|32%h(=JNSmD;pOs%|YxxppEL0bN1dEQxdmDoQ7$>j|F<8tO3<6JVvboG030AzGXEYE0muk!Gw{8hT=gsxem@===r@5LYjh1ho8026{kHG_%H-$7fDOcebxRVT^s?^7P=inb=>i<-lv_Mjqh8Ul-h_WHg%Eb zJC_o5qEO;HRK^k0{L2}qVnSI-ElK57v{{pQ|C|v~t0>H({3(ex2kkR5FJS;P5r`OB zzxQ@CAT{KJgp||zxx|`GHQ-1Vt7Vz?Qh)=mR&k%i#$=G)OK{c3YZ#pYe1K4fsA}20 z*X(X_{}^ytD;NSq!CSGv)U2(LDS!$d1d5}AUT8Y~{x|i+)boS^fLH3?`!8mLH4J0Z z*YsIP>x1(ou}tyKBKK4Ps zslTolV^v_qYJM>_aMe!!!qt!W9(vw%V*B23{D(HhD7o+t*4vc{I-ow$z5(7-wX4v_ zF040MZn#s1$WwgNlxd@;#iSvlHqq$+O<(27d;wJchhF^8He)t}IM$m~m((@0%aAHb zT%_nOI-D`~j1r;t*!j!DVCB!cY%jO_|LGU8#n7lwEz@<7x+wc+djsIQ6RZqh)_o00 z{V?5*{~+RXWC%;+!!&`cC6sH0x2zbP*vsn=iLZk4LXM-AlGscY`A~H+gZP z(QW6Li_TOz_a{{@cSoLannAedU~N)5M2PrKvr@i(&qR`MvHP$(KGAKQ1^z_3J<>Cz z7bKP__AQ?Y&@0L1w`Hm=n?0@LO0WXzgIe{Jy;FuA9y6+Q7~sQ&399X#d4F1JnP0As zEjI(+8q|@i=iI+GB7U*lI7A*--~2G4JKKu|c&)1&$!J^9A46#LCujfY@^eu_yQ`4i z5+R*^?_Rp~GfXP7)5#7L?QJVuK|rrm@$@-gQF4p~SCqdab{=+vRMsj*%1}N^6(;U` zUWH#aCLfQzHJH;1BJb7X9QU86)}TUnCs`84^QnY2eFt3wO4WBS!NZ+h zM&eo?g6}ti|D`Jed)Xe54XvjCRXM25gbAf`Nte1R3xDCR_p@L%)(KKNu&Gf*dl&>I zU0nR#Q(vi*lHYP+MbGh7KcRa9DzZPz;G@g8&7!?|_EKeS8{~v`%O1R~W#S+JNg6=i z^oG*S%ibc_;0_}j@T!YlLhMbJw0Mt!AsT$doA?LYCKd&OSwr2{ycP8$hHzb`Q z^_ba+C%2OedBz545cqU6jpjOQWz@1!*9@tt^yyxyjM zHsBg_&5V3@Ut)fgx#JJA?DGg3mP<8sDp1RKM^B^s$i+p)jd2v-uv7U!_zmxi_KUoyOyKkrjz<=V!E_+J~S$wxp9LxsgXAglS^BergkR zR_iRPs7J8zAX4M@=P*XV`1_=gn<+OxX14MGo1Eib@d$=3`~2TI{(o$kpVvBX&`@5q zHILnY(2yV*pD_fag{rt%s|=+dJ!Z9srF*91?kTKeEWeW9bZ-R5XDh1Gtuy`>auvzX%mu`tv1zu$p$+zER3(|2beN>x&BpjK& z!OMblXdYY7oBBwTBZEWbPN-!!hElYxwP5~{jivx`eC#4VN_&ys%HY~WvChZnQW!@H z#^tLcvhnag3A=LSvw6wXyyboS>{?a(WB^5-a4-keJ?qQ};sqSc?HLL}Yk9;MNCbl- zg-lwg;eg)6qTE-oz!V^oG$U( zJoj=iT5f2dudAEjjYcWyggVd0X6)u+mZ2IvH0asQlP>j$H(Gka-YI2;w;oD^kSLWd zo-PxeSBpHZLl)8RqKy_@(w@j|CuTX^B90Wl*pU^B*ASdf0pE)TA|46Bwi&-_y(|_Is)M zw>*^_;!_owvS@yXP(g$rBklt)E`JA&z6ajfZ{{ z3V6tJLTr6ewFLVgGzLo@ga_(hmS;U33|Psn09W2eJ>0*|6BG;&2;Qa8(R&}FZnQ+^|hI~wAq42rkyd@ zH#QT!Lz`CziX%flRO7)(g)%lYY+F%w=f-HlPzMvwV-Cw+mI+FW4td~|4%FoJVu5v` z9sr{(PB<#@CkxS~SN6dmfV*j$TY`Ve(VGV^ucDoA)j?=4qYEY}SB{QoY;8}t@@OS^ zyN|_n!QnLJGL_JehTeSjJxy#cd3A(+@x4$-_@jXp_Ol=Lz3p zz9lwsr9E1omNnxgmaaZq=Cc)%)JQ6{e{{C=EeAITH~N4kJ{0lxt1neK(ND(~Jh-ZI z(i`VG>HxLp?Np-bIIh&Y5lDtl)bmR^J*Le)yqfMQ_QC4ds{w@m1~*w@&l2~4s_NR? zA12-o^foqlh86Ww^|j7)Rte#{h>X~`Ji;w*#z#tQXu>hXky}nJ8t_(QT-Cv=(D|Xh zmaT@fXx_8wW`gt*q38bhp~&5SPq*PRGU}AwcP~ZfTjEnkwncfrcxniFy6kbo7E@Ut z(s(UTC~ISKdiFr1cd!`oTv*(fnvTUV$jCR7IoSb!SibA($*#Rn`@~`B_;+DAeO|%!ePNtoz^c? zT2sF~J2hnV$Ihfne!9sgTjTuQ8>ONc(nt{;GlfpU_Ei^6kk6pSn^>o>lVp>Q$IfrYyuZAb-w^NVIMUN944vN$+h^T~@eW#2tnXo4 z;WdTC-3+|YA2^wceDgYy@Db6YGqp9s!1VPGxae|TrvUY~6l*GGU1(k_#c;#`)6-pCde^iz;ZhOVSKpJMgq`$Ov z2%yUGUMmPGbs}k#*N6$>Q8K^%#TJfUp^yj3Lsr%m->q?Of*)}7{%Hi;DLXu9Nv+oAa`(mD))W$?rGFNVKRdqQ4}8}Nl&-nz%H@|`)xTCDBbAQi68JU!4d_tfQkYaG59h^- zjXkCVxEt{k)VvXo(`ChDy6kDD@iIYU$VAA5%WfVcoGsXB@)tfM`{YM2SXJDpm?YIz zmP@}oKBw@BHEdq`s6zRC1|-8DrE^i4uDqFv6EBXf-4MtXbpV#zyX4Qu{MEEWa5k z*TG964p3=4J$CI$X{jMPAd`n5wJhR$J7RYi)Em)Tx*rwR#L${V+BB^4hYwqlB}d?GfuEpytmvWqtxu&Kz$K zbxW4aIllN)aPMb(b$u;frY2h5e3RzX46#@u8Tc{qwX_w5hsP$?qtwY;viud|%IB4d zS8rc5dT8w|aItt#f;d+Om2|3x%M7pgFwb&w52CQye-@d=Xj6faIm%bVCF9B<-j(_;78s^n(=vd z4+YjNOZ5RYGc}xI-uak@gBf3-{93_9_R!BO=HHahID|NiD-T72_%NZFnzXF1a2ta| zV;-TQZgGWhPv>W{2MWaB7X@Qs90=36rQ!305iNa~gknN<&m?V!h(CQpxoDeu=sBey zVx`C{o?q;hv`2)|dVk0J_tJmjDIb?dSfts&uAXx7eSSz{g0{Wb5677>_q4M7qxDTS zMKe7mfJ&#^@`(R4F6rmaodAvl|J2X$Z)q4h-viP|Zp9>(^7wOS$-bt%@h*kUO7Nj( zdif1z?bmRo7&nm6x#8_ZRnY)VCS01kS65z#B!6)RklFOeg!s$DeGp zD!2rR?=}3I*aWW~jJtGqrysr8L4(>OHnMdowX-x$;iuTWh*I#qk35_3t4uwy8SBcE z)q`CBB28yv)1J}@iv11sKPoc~FVwEs#lJuE@>B6yd_RchWZ-MYr)lD%T<#D{3L(ae z0W4u=B%IThWIQ@@ntP0?p0}dD{+%W$Cc`^AZe*kKqk4Y~$hYAeWM#H2Ho2*d58t6Q zWIF8Tv(c@4qKtb8j_PK&Y-XV$*Tyh4s7{{)tC*O&vhSut+N5JTzO+z5_)*j9+j!a3 z{U}g)`nPVWviewNBUSr@z}> zynnSN42{kBRg9mOI&R0UB{xpjXNxcB$A12~3m03{CYG)?pU2ONUo`d3@n<;qmqf5c z%CK7C9GYcVbAh1qb(|Mha;m+>L7^_(pPR}kiO%#z%1ZHy0C3}jFB#gT<|sVz7a&Hu zb-2hnf^p)f*W=8EHvsVnX=Tr%$>XZlDmJF z0=PIp+On@xZoFOj8%h7qaO4Q=QO$v9>2bxuf0WJ8rOoxrz7N4o$L+HDv=yI(Yhnm= z^%w5>!~cS%?=RoZBx(~p6{LS6f6I@!Oh1&2>OF%;`&fHgFtz6<`eYoNbaF1hhYdQr+V#@SHy~2K`TOdg28{SMVPe3IF4Ok=iBp40 zOLfaC*sn68`aH}Iz^oDfR!DK~z70?SPMmUM`}9+|Euyoy>}YGzd6sJvZfAFX@Vb+u$0LQz2geC2a>CZ+@AC^{x)F+Da}ePcY?30IID+0Xf6xLBT`?^J*G0z zQ9U;^Gz`dw$8a=PFi%1MZRwK8PNLHDXTL-&`LsRk8V zO^6AAp`-YIcIGYUBbn!Fzt#KYSkof!k2~H-kf~I)7bnTFtd@E$3RJ%}5x~|>FD33_ zgCf8c!<)z&Y>OSTWO0aLryg3Kd?1~HiF0WkB4P!}rJ#hfFRbcRa8n?H^veG@Fn@?w z@%xpUO$FL~nhw;8FGFu}iN>v28TgdDV;8Q=Oe3gUmZ>{^F{v4T{l2?C7;h)V+R$XT zLSD!P@YsDt(^ASOijHo8*B#h78^aa-o!0%AgvtJ>fo$yTx{oZi3pdanh$`-W9dUDk z%Z9+uZr9UK-CGxB)9IF|=`cy-Ghk)SkOJH#`8Cg+;2HeOF^*cp)InoB(;xN@yKP_o z!pQseDfC*&;97q~<#o5*{v65Ek*j>4SG=jC#Zp}p8p9)1n;%7%-tCw%7PE|!S221& z^NGt4F-6!#@1?Yp({}XkS6pb_9v41U$;xR8Q*+e|`FE<=PMu<6f z#!YeS%*|FnU^p5ply0UU*T_`7bj!v0VovQd_c_`&gMQY=pu^bIPu6DsTkh}xh#{>d z!025+`ma>tckr^M%TJA6ZPIM$lYb@ASdXkF!?W9Csyp4Q<_9YKi}*KC??3p73#}0t zuk@?HJ@wnEF0}qCQ_Fqu-M`S!%HD0&Ahf&r{TB~hnT(bUe=KcnU5;YxiM`fEBhmOG zFbu9^^g3_$JP5nKWlwGQ?zE&kPT2DF<2gQ&X!cP0x=c>V0L@wFjI@|fyz(*)Wn$`b z@C@+mRKQCYg&6uoA-ay&7R=t%V`F@^s7j2Pkye19<&p?@!hiM4l-PHdI|Vq-XYx$k{K^#`3LqD|bI|D}w7Yl#51QB<{)?~i@tx6j zO3XIQev-ZZN1vmpuE8?wkISgw`&!l?MD^JW%6eA*791ZDx-1d}MFr*e5bWIFw@jQQ z$xZV_bT;_wS-g8xeV*L$IX2bh9&Q`<8eUSvk%9cJ516ht!Qbt=H94L9gEA}8D*?qC z5giL(;G}jYmK<|TO_UC?>6KQ}9oN5z5Y@ze8QvR%IrX=<+YJPhwpv>7n%gDC2M>Z} zjkojJ|BNZb3d8U)nn0B;XgJ=1%((kImZy}a= z?^XHm6D4_HWIlP1kM;bC`p2{-z(q}Z<(+$*x>S?`=l}-wOgp^x+!L(d(mT~&(7*It zXgK+~duPlk9lcEdFew8tfBN(yPATO(BTW$R?PZ!`@?1TDbj@VOPo2!zm#E#@Wlc0} z*HURlNiQxn-F-J;Z)x8CiLgz-ri`P!K%$}7UTEHE@@Xrn9uUx+YZHw6cIbBLv7$^r zFC#kz&)3R+GQa)14nc^l2=ZzDA+g4Mv<}W>3M=&=%}|bT-sh8fA6V;eq~0iuw`gco zpsIqUTZcs?=^aTG`932uK}E>+C9vGJY9|>L34%dllezYKOnhk8B%HE*CSAO;cYq|U znw@q?Ginzh&N?uB^wc?lxzJ|iGOF>5`;iXvlAiO#!8+t&HpMe+W^5^Th zI+hb%sQS*pF!cs$qGB=*k!uD68COEDDNds2+?gLhf*t#u-=3rtH+f^I{SaQV=SARJf1a};wT28goDD;o3$3LRFlNU6>@vN;+pF7(=-QZ=T5EuCu7De# zL#;@v2idGt8@-=pQxojOmahMtI6Ue^Cns|1fu6aVkH#Y)@dEZw4D*$n2zlJ<< zdhd5vzKU!RT1x#iR#_kBieAIh16cJH_gu-M(wf@KzXSmSNAW`nZq5|M>4lZ(iSh$D z@QgQ|eyIW^AEtN1-LTFruyw@O`>J+SL``#D zS6O^EUxOkywl?Bcf-cdLRG2HM+)wd-Lj~(yf74J-5*0MCr}#sqC%|PzptpbTowIyH);S$On5OT556RNE`0k3f zt$o!sa2LU0Z zJ5WwA+_)K;9MkdJy4T1Y;{XE{NcE~ar(vYgjx3i}<6MDPbiQ%j9zQFaZdVr+Og zBc78miLCK!(6vWcv=J^}WmE#7D)1FtX?yTGEG_SSf1xikH z<#fFPSZ}O4|1+HgB3uI5MLkJ|ff@)G3?#Tv+9z^7a5x991jDD>TyHU=V7m{r(22d@ ze7^RE4)fcnYt*N-HDKI3R%Ov5BhbSBlMr}0C}(vRSwDu6YvY?4l~#TLqX8Bl)gxcU zj7krVPSGj1K#GzfaVySPS6d)EVI=GpbSgu5WlP_d?%VYvO_p|Ga*Q;G zZ*5dWTp-b5UJ7qO5_b5!%#R;dmn361^`Vz-}}(BgQlyj2*L!wc?8^rNt7qX z1h?24yq@E^!!UO#wrS$|DXQix&RfrQ$xS*OpA7E#FGXd;8{abO_^2}?*34FIPuc=5 z+(vMAM1H%rEh_4*cUMrk$1(a+73%=W7iwTPJ-0-OeC9bMgAijCw+sPjsCc-sM|i{m zP0URO@zEN<5AsHABUGI1iqcON;pf3I3UNFC?VR$SE-FIQ_FZOivIKs+Gkqwxl^{aw z@JG!R)8CdSvZ&_Dw}yR-6QM$zjCWTS=b~TxfRB;B)8f9bFsMWliQJrMQkmzMhtZ|i z2T8`^gluV04~-cZ8g&LK4Xvkjl;=8m=tp!D)VAFoV82mk(otgX-7 zy{!mr_`5?Eg2oTiPWqGfEq1727NAaChmEEay-Jm)EFvUZS`#ph zpv%_xr;UB8b#BnB$UG>97D0iGeW0^U(5`~p4spcVNp~NPzji-8qjil?@wPTU4-@SK zqryciV%^XJJ{AB-35WlB#I9mg+F9As zyP3W`zO2vh3zxtKTRyIiwVS7+()x}5l+AVWY=Md}M=y%CFLRb-9VK%=)PHqp922j~x}^B3ETt;b%($ieh|e%UKO^NCUNm)7#Px7j4AZ7s}4ZDs(X6 zFO&dNoVALM7axxnhg-udse|R@>A;YR zs>scz0hv4sTs+ZT0b<1?xrkwbo!+Jdk_n8`0t228kikfya$RoST@VSx9eNN+xj9VZ zF9ZdN_ib{7|LJ=GL_qpt2YRfC#({tMUbh8%?c`9lMhgJ`geX(~WRn5zwNvq?b^YOd zkwIefR=M|`>t=H<{r72!is+B3!0ELJ4b!xG8Hf+>?}5@05ZMbz`ysGDc)kAJLIz3x zJy&ALX5@ja=S)*x`jAg+OAN;JnTFHL$nEwD0QZq<=2GhOE~D=>wWZTkMaHv1sE!J* zTYCo7YZc?#5mWnym2Vt?mJ7-EQ-*EB|#^+=e1DE7MO9vc^x zn+Xt#V;(Pv3TR~ffejs7l@{o{XS%lasH_eKieK0?&y>6{96)w;Mh_xjz19sOVOBu{ z>KjZxU{m$$Jo6K0v#Ehf3T~K8uPIw`E5i;iG}??hw>0rF9GB`V>5iuY)UXI^0e&58;oQ4JPu~y zY3=%Jv31F-v3RcvBZ0seAtbNOuia?mLtJ#`Ld0pq-p|{`Zv~M-S^cRDUBWY1zHe8g zJGV)k;QSoOpjS@Gmb8PAM?5A2PZ1SCUKM$?Wh%E(c;5DE^#Y7jG>fl6CXcTop^jwX z=Z(WWyqSa46!ztIGdv-uVDZMV@N`$?9&pD;#&3_?I6Ja|l7%m8e6azp!+Y`>-TAnd z!rv4y(-r!u{);ybY9mq-1_y$vf^e$3+ATF?);*M&BMy3+M8;wo_I6Owk;DEpTD&Ki zBC%i1l;UedJ^Z_Tp(+S5+@;NgL$YI1cBnNhBWtOo?QF)8QDZg^6ds#$F=PYdDen=u zq)Y|*M%#$nQv1Imy>2vm9H~1UdOzv3g^X1aRwD@f9ofYQQsO9DmuVE?RwMEA#yln| zAFvv3vZQQbe2O?f@HtJ%nbo#lf8$+2LbdKqi9`Y?r0p+a8(Z&xg*4oiKR?7nT}K~1 zu*sM&%KR+#Y6r>`S5Z_O*+)px8t49kcwXcO6BA#EBy!1Qu`{3gdenUV+aYU7=vSF6 zvf7aZzL+EIRf2jz%^KGSq3efuo3^@`2uQoUa1lx8tV+`eeJ4SrPA5B*rm)p3mpyaqvwp_eOsJ!wqU!z|G8wT6067==URRDpCqsN&Xvd#P^5oqY{| zK%s&7lOSV+lnrEVI__H4(Soo4AKl^b?NfJIRi$n7TpHD94Fv(ic&!yIda1Ck}h@bgr+yShQ5 zrI~A|l{V-ax45mV^%)P1sy?PZlBe4D??0i^8=gt)!aASVnyiz?IMriD$vsM_hfiX!=4y#+-t7tVrd zO09egkm}?|c7a_D&x>Rb%pB^SL$>{?Sc#Xr4iDY)&E+GG(8cqGHWilm_2DLB@L|bm z*+za_`V6j1*NM~^CfhNW^Q4B4*e*fz+wb~T&OY8eR^oPGE^t1!AJaqKw_ZKdrYa(n zF6F$@zftacF1g$FO2^?lcRqdAqZ-s+-%Jd7M|bUbb*!oEU5)qWBaz0z9_Fotjko#6 z)>MglK1dZZf0Rfh)`de;T3@Vp6AHVFGJFfz*tZUEbM2qpqrXg)xinOqB6U4AR#QHa z47vywCG~w9?Xt8kBd@W`${jP}I(Afa7HLq8QnJ7hx8?gBt|d-f&lBcz9-q`xd3T;K z@2)|+H_Eyo^9`_DhaP4jZP0Dx(Xh{r?X=umCh39IPqzg*P}Mm8l`4=I7|e!~rdU`X zODc&RCbU!8U3ZiZPZ)%0_5d>uSl3o)dFf;hY5O3jD(@8k?9Nx^wJ`gF7H}s*L}Ye* zYxOfaLWFd8X&h!729#dJOHppb({`Bq>J788#ZyZ?o+$}U3fej`vC^1Ijq9~UY|lZv zWoL7p%F;aGSq`8Xxd%L_NOl3v$Ud`F_lYx4Yu2z?2KyTuCGYt|`0u5+?bmz0w<~fg z9wTD%^FEh5z2$c$lRVo8@q3lXG;LQLSfK6|T)O(0n8XUXrc)R|SN}pmV%mH4skkHk zCMcxXtnufmsDYrMZw%vuPAcOosYxKG#`auK$h!won1B2O;sYMH zI>*3hvO9L{uh(65Jhp#eUj%&g*M*zs`1|vJW^C(rcrw3i#oh5|9XP9=<$K&hk-rY^ z(vz{dy}WxOnPApwROyuc(mnmuy_Y=wtlhJn=FYOJH^y2xPg|&&_1G#*Rn$$#T=-Mb zW1@ok<~XYgCaR=c>1qzxZ|My)lWl~5>A4@2&#Ye z=YPLCNsJ}(^)~`w^Zma_t^es6KPkKt|Nq{=KSuNad|7kCu zGS=_85dEJ`{6j+i`|Bpj{_1ZQlTF~i)89LKF7h9y@V{*BpMBDKd$;N*IA!(!^V0t? z5I?Xd`To6`P`Jal^D&VXRR2S3|7^+W9vJuE8ZT>tyHC>@i58OlH|99%E3qN+|MC5Q z@17sm9nyDG5E(K1wmHC`nwI8OKMdb2J}C|`!^vp{EzVdB}M-c-oNSAe^%bV?KuBgdH=TK{AcC; z+m7=e*zgyw_z!IO8~FGSZ1@js_$Lni4{Z4V88#UDDoh&*+>xc^XS;hhyDQ5bVS7$K z0*#)J-L6o8Ca=jL@5wqDW1H-MWhqt<;Ct0EWqweySqTE<)z4P9Mb&og;0 zGF@Ta9|*3f@V9B%uBdvn-eFB}`P~r@;=MWx7vozRzE7J(a2n53o7~UKcrMHGnRN61 zwZY=cjU~L`b%?pkuDCkL($@OdT}6UemzS5l*$Rn8f|X zy%UukF1Ed|K=GboWi-T~eL&guylrWCc&Y5Sa3eoh&I+x4To1+4%7XNzfxE}7kw}@W zm&oYS@;VtO;>(~ffw{-};R!h=J=;5J+QcLzFJjLSh%PywS74Fwg7%&5EO~)hta_dp?kl6rglv16x z&meJrk$x1fz{$cTCxd2VU?W9DsHe*+dR=m8S%96xMW0YRbK3|NIMCw$ap&<)yN;Gv z35F`$)gMRnrWzbSdw6%?_D?1G=g%St7Rh-R9#76-TG5Wh>qkR5|CI}1x~_ymuq2{^ z6PKaytssw)lEA(e?NXlIY~4x|yRP|FZM+lB&|y z((H&T`)V1Q7y>#%4)^Xy4@{!m$K+;s04nF*8kbBL5f`}F%Q`-D1Fx*($7C*ZysRDT zN}IqhYka9>WNT>nj%FmmvzX>ROEp+jI% z;w7R$WA3LS#>Kj_F@wSzCq#(Rce;}`!fBIvmwl&&wQiU$P%hOtx++R~KGL-3K+l?T zrpjL=#;%O%0Vq}q$&QScXi9$?EkQc>wa8JzGX(KqnB~&guAPqFFbp8le-&=!6u3jH zxz10eemk4fmuqD&u4;KKWj+nwETH~VT%Rd%U&&)vR^N%aud4O%X_MDX@KG^N5!M|a zp?Uw;^I{S#z=g1c$&^GJ4lnEdiq+>|;9p%&_(=<6t?A;CibPvZF=25p)9obJWhtTD0v;Z3u}gQtD>Y_q;e|Zl!bE= zVOo!zyS99httHJ0sOtv8I?{065EpT^uI|$&+&|B# zjKN>a%p~`D2r%>YWpi#ff|lsNW>eu2icSlm@*dy1Y_I6lEyz&euBy)Mli;3Tm3j!v zJ8*@cf2M0*GW=Kk1J(q#ABoQh9@pBgqZugDCWp9_J>uFDRT0u)iF(&+*lu2lZPdF7 z=`lQgZrCdl%w;=$By>=!r35A`j?G8BbkC6txiAwe@9TUMMos`WqHRI9jk|6tI+;mS zz1p0S@cxC_S`5F2zSq&+Y=#FP5~k808y(WP@Y9yJnN47w``=Vv7m|*O0}rDIa!$&% zglvlY`8~*>;sVxA!EnByNS9bjD*FHeQ+5@0L^~69=E^rN{`1ngongRI^FhVNpVA;@ zxzy|6$Z}$nwqM80aAQn@<7OtjiUYF#?#dc)tQjO&NNDs0N-OjZgL%X1(dUybdXQRL zvYO%hOJ@^iZ4NeXSf|^e8H&B&D9__WCf=pvQ9fFs1zVN=Oq1|!^zMFyQ{KR9tlNK* zfqmQ$={l&P8IZbJZ~H03Zv4#~?WD^}Ox2Fy++l-5rf#5-m4AvJR@!iYXNJWU;IDpx zrV|8t+DlEj`vI&{5=#(Mq zp&zVkJ?98x!t>5eFU`ZId>)uD#ekT)+d@>ZP{difK&R(4u`*`u`f;zb*p6Vqj-7)+ zUZ`(BU5QBt3DU!1&8Tn|0J$_Gtd=EJJI#u0|~UE1O4V!euqpvooe;bhX(JqWiy34MET53#GxDtB7l~%#DTS^ZCZ|DRjrf7=P0E0yo15?683hK*ABci;yRW>kq=yXJd`8Pm!F zlRtk7^TsD&Cb`t119Irlke`!5+g3+5<61-1bF`K>gXQVB-{+uY-{RgKmc4I`q@z^| zLBgw2Rnm0UQ`}%`z|c)yd1_@wYs<+RA?J6*80Ah?fKWk=4b8aAV<;V@Di3@vNsm!C zNP}(5*wR(5`$wLSkp^1RR!_yGm*L6fUvpiSuo~C|L@R;2C2vGX$Ym~P%&IsPUJKK@ zhU6wgfoH8adS(WKzG$iSs8lX%eA6%(Z6ZtbRFLKjz1En}@egiHOpcbZx@i3q8taRs zlONzqF7g}>{!f!{86q0r2yK61dPH%Q-}f-w76kY6xRa`C7|7M7OKBR7BVf`eCHjZ) zWGL2Kqo!N3aTL;-DZ#%aHy!t99PPIH2HS0Ms9j&o`Nbi6ixRP0S!_X44^f7Tdsb~a zDmJN`RRxQH;c6#uM=00U%hS0;_~to;kp%9&FLW>&093ZI`JZS98%GnhXN^a9t~O0o zd`P-ekTk2u5bm_>4_edQ^rNW(&uu2xLc7s~c2%Sa7N^tnk>f~DwD_P;6I;H1-SAVP zRG;9NoA6r3{EMHu&KWmelQ}$=Ox~9#1DY~*C{Kk;BC=}gJ8swD(XXC*ZhZUa3(&*( z5Y(B4?&Iyw`!nQDv37DlI8Sa4W5_79ORFj7oAM8 zLUWaMfso`lk#4he2gNLt*UH?2NFN6&-P6;ux6hFLoRQ>jmd1NYDPBAGNV9pBf!$vU zQV1HqrJ<0mvn27z6d*U$%Iaa-?319+f3q&7&9eecgY4#dM;1uPg>D`z>Z~LOYc2+kIcl@r7-GH6VD?L|J0qak+ z=}w}RMPotg56yWZdBc@GyF$HpMh-q5Ypu~lc6hO;%gj|0J4w!nv=4z-O43PH(tu-= zr zFcXQ%=s#*XqbFM9wh?Wps&tQ5(%Mu!@BYz>!SmjFqCaYJ>O>}Nx6C1N=@Z-&ItR>M z5fFpUg;POv%Mg}ohMU@Q@pnl`64NyOu+}!8q2qI1&~(*att9_H7Q|FSXWR>)?$4) z@69b#E6U3M%oW8&c7`k%IUgwR-a|A% zz5urGk`NhVvPtg8zQ9mXDC*+3WO=0~e4vb(_$R{u-*Laa-s9$*DoCTDu0pODyG!N< z!{@L%E7XsW9Rg2U7Xd7x%$mVaDVXu-fspl=L^@GtVrlvVpzG$kT*GACm%|?Mvb<`lB;h)qlQ zBcGWCd8mv<6q15~*+Vp``a3TDBD7F-iRv`#Q>sllT^op^EKYotrkX%dt0$dEd7u&SkZG$SFP7zotPF+BWomc1ui)U0B8X?s!hOe*$Zf zxU)7D5gTk->W)wvchTp2A?3B4rm{xoEBiVbVORD{BsS^WQNxX&wwQfHM215S0>VYu zn2gI>#>GbK9-h7PJ_1}YoCbQ%;G?Y!n@7i(Al0m81EO-6z z8u3(|7bLMsSr9%MTyS4og=}7y=B3x2HjG3npv;0Q%&YwOxG?PCWCk*-BSMdlEm{-p(>_D{VF$-6j2 z^<|ZJfDEpuNICpLAV(=Yto09w4|$U1GMRPKK>9XJXQw! zaxYqvm-)V^;-VY0A%Bad*gQ$!14&qYNDiGMFnQO3Pw|15Lv&2_9PopupX&=#NY#Kx znd#?ERP5Hv$jGcJ>k|QY{%HD=FT(Op&kOY>0Y@v|^?1V&-4ZF)p3V@(`FW6ZevCLz zHSz)Pz^v|M)=OxDc;F%Fz#2sLJCXhF67!nDk)bp14x-SSgrq$2c17|oz*#5QTEcAb z|Dpgp}imo^1YPGu#vtSgPvGiS8uxX4{wrYHNgX*6K2_oYp%zHCyT{c^NMM7fH{ zjvb8}H#oi=uts%X3;38rrKUUAOO4Hxpu%`uie^!g_8Lgnh;Ew#_QuU=v+Xp)rW`Cu zFy@U4OV9SLv^%?dLPf{4(jF^&Ps){NzqGVxfmd^PcDro4v(}c7)vu^jab*T?y_mHI z(~r<&IjsE}GFkRr5#qzEPLTr~Ke{W|#px&-HQ%VHf7G@cqI^W)wb=TJkzRp~HqYWP ztxKF}h$OkZaI7ZQ*hvPrtT(o?%ZEya-qezuvs%(T%hY$WK*qB>jOe1VR_f&CLYXDD zNCuCMA0Kjk#z%=R05kY(t_P%pj>f~=iIcn7rdS^6I1ugJf78UdwkOhb-dN>bs` zaTP>uwVszw*F)`8^uj3`71lqnh9DHTda7!p65KFjr0IA1Ct``0VLI+p(@d$0`l%av ztFXp7atDXB|AIqYWjzh61SMG2`F1EGG&3E~m%%Amm224`bGUjm`HeFDqX+>?JZ4T4 zSG5G!lV!?PNGs46>Hul!Zi2=SJp35C_?pfU-*wlNzvX_9$zwJSC}oB|EIuguV-9z` zjPgQq?^q0~k1MS{dO?oOAt@<04D)1Tb8`D5?tmI=3fgFS`}@0jw&tvMRGg(N+gKM} zEWdL_Otge+bq1S9N%lNDK#cs4h`Q0{O6FHC50jjkDyH-4s&=(pk=OwygHJoKUr9n* z9W$8~glk+j@^Ir9@;^*xZScO*9U=2*PqgSGp37y29O-fQIKajnVA<+Qy=rh0Wy=dl z!B=9$(Ui|7-Ff$4VQByRn*R?)s2(R++!qn0<$RKZdXQ%2uWcg@^t5*|!fsm)C=c`A z{^ZBJ0qgiP3}o?P?;{pEyTP0DWm(w>vXTc(^y9yzElv_5bFEVESQe) ze6o!_%<&0bl!|^N!Ca@$M{|0Yg7x92X;U&Pv@vl;05FA3em~)L48@c)b#ZO1{>-P5 z9+rdkFuF2lQw5(Mqwgrbk@fG0!W~AtO}UI|k{s+bV9yUi%SoCL6y>>Bi7*D|&34=$ zE|JBkg4h_Z_4=M%JwDU**eUo4h4Z1DMOt2tJ2^5zD2{PQ_poebxI=yI{Gr4&$h4*S z`WY44+;_8;Z-b)sn=3lglP;oLQqTY6(_i|P`DV~pJsLUdl9!8vlv(=Q$byFwPj&V? zfO7c~voR#elkQuJit{I&2O*NeJ*X!#LPDmPC3KF&v~PD%comC#osv5x1NNNAv!T1$ zqaPs;POo*0eN$%b1UIFkVE&LE_a>*x`40d@%S53yHhjZmuo=X1F|vBzU`*uTh_f=( zaKQuyn83Cd=-KS-UK$b=nhtq8P!@~~@LJAw$tM?SL$Ac2d#{WI8J4A!c&mCdIXe8H zRmwZB7{X$~**VFp|eOd}Y7oxE-Q3%Q}-c{#D(C{I=`no{Tj0_YRn-tct z`As|@6(<)H!bkX7b8TbDnWAC&X#2a;1AeJOiXXrx#9ekkI#CleJMk9&mM2TDqvEb& zmoXN7EaQ%Xz`3LsU9qCZ>~TD}rtD{uSN{{`vCskCn`XBXIla8}pTA9}V+y!r;B&lh z&vZ9Lo#=?I(9fBsdhg8{4M<%Kf3M*5mR$#j)C?&~J9SKX63BpAbRe%3K>q(q4WgQl zCGXWe7UHa`FLn{B+Wev9wWDT9yss(q0&wPVmKfYXm%pA{kLcGEngo5s?;h z`Z&(Etje7{Xk!jt91AaNE}>WnwkC3WFcmMjxB#7|EQv7;>#UNa>#~~RW(Q}<@j(ShMUigaB`DD0Z`ahEJ^X{s?xHU|qDei1km z;y^BaWh!%L+kacbXC=!EiI1^#jAR?_roqL*Fd28MN0RJVT}6Bep?RDq{8YZPpJ#NZ04+&z;=>d7m5pauk-wgaB! zRn);hX{`OUrcS&Xj{ViP=;ZXvb~yFpATS&<5|b#}>r<5n4RPY}Sf)ktDS<6HT*Xfs zm_cS_yAL-L%tz=c*t+~lu(n`>;+&PS2%8@fxqMJ{sLXv)v_HtCQ?b+ljTIEuj(!pml&#IWLjhw$SazdPM3NNjsnCMeK zW0tG)=_Ny^tJ#GmO{D=E$;!x=$Nk=$Im*+)tA zdsl157PBad#2zKouD$o35qs|~u?aDQ$m9Dw&wcLuocs4Z=l$pB&(HOKU)S|oR3RH* z*ct%iyl&=+)XU!jh>oYJ!beMvNQmz8qbcW3vI)oOfxBj!)CRq*Kd-;3%a-%rY`4!1 zYvaH7iQm`RQA(bpR+#|0HB@&il3E&ME_swa`wPcKt;4^O@i08N@qSKHWyL@w)k3N2 zEFe3>W%iTHjgS=bC~?9+8tFX6;XzJX-njAd)!-y(YI24;wOP2F+w@O(dnzkYwW+1a zXpCMvIvcR?9Rff-4IG4rNX zCsyCQ*Hfs|b_ z?G@2lGdKUMd|SyV#wIC2YBxSOlSb6x{rt&H4tuHH;O?&Zo7H{ZEj`}`!w-xN4-6lr z^@I5AokjB{1nBXTCV)C+_X9m(wTh(zTa}7a##_X`5Mk-xmBi{`l419asgUWi@y{(x zp#QoEppI5}wGH&i1&&Hrkf4af2^{UsFa1kcJsfDs)WzVxZGC_9`3huk@5)_WFQo&z z)wdRqNvr=zDp?odAjrHqW8t)9pt9;7dhztuyZEq>C)3C-$nG499%(WyaQLCYZC1E; z$5i9U?nYZI<-!G`F(%=JbHF+K#(#MTUO}#*?m_6RBu3zsGYNfmdUm~FNfgQ$Vaf=<wGz`$%3_Hrt5-}a!prB6rw&h%z=gy(J73Q%#6MGd;QQQ4uW?GoF zE-zT?$-4d=RC)boQ=FQ6KTZYxoi?bJnjCY3k}?w8Xu>FFVb zx{LvDTgGQZKZ5TC55#)5ZYxf|m7F1={Tdx^@$MMSB2kuqYTwD-E)AESXY7k&9!W=w zo!i0b4?A)s&h5cM|59+boGJ}06)}|!z_Uf&?e5VbFNlOt548K;v;M(xdN<70WY^`r zy#(ybp6}Mn-7ipOh^c-7f}@6wsY;;m{%Am7;-IKm%JiSxbzOYv7`ZC9-Z~^_h?l@~ zk|_i{n36rLzx?8_M>w@ZcLi?5YdNd1+-UPFB7rb?BSFf`h$L{NB^2fKl-1` zcakvpKsYX23d@Q6tS_vmcLVgU#(y0x16(BIaFg=$kdR&s0=SSn#r(kAT_2?(xtH#W zM7rI|-iUO2MtY&(CekCrty~7?;O65HLIcUD^fY%$pFIhN+20ht4seb%VM5=0eCMSb zzuxb?jLfd;b+(11ryrw~f|Xd$>p%PqHb*Ero4)ThvjWDXQ(8`V^g7JM)Mdn%fBKi_ zF)@zc{khK+t{iK>y({m%TKetrl(t^aN~$`OzNPZvQyk-xTF=Wt+6wL68Ocq}gjvr3 zxLz;=2S)sNnM-~WeAsfnWysb0y_pM_N|8X#GFvt~dR$_Njd&eFl#i8j1WEiQ`)G7% z!JNvdA-Mreme-^n(FD2N==TEZPQSTzr78a(XuZB$Kd&82Y|DYHijNjE@>w~~Ct>8E zd^^4|`X`b!I!PbDRDG9wuMZF#*{2!NMr5m#*MKa#B#{!^E4}G9$2opJ>ER{-$*y!h zz~?SdLJ`#_CI!Bc#SY#d4KYE0x>F_dyz>^O^*4=U9E8UBeqCB?;nQf2Wi-7b;eH`I z9&1)k9DLVj<~(i~9YLh*M}w7?`s zvnj6LzcLRdcLJw94Ns;v`CjRJsZcfb)^ym*hK=06g~#kqGB3pRte9tNRW9*aoagkL zXA)M!LFq^(Ts4QZnP{FqXWZfOhr{Ij!GN*3e0TOi)h_JYTiqjkR@t+?vJKH&=kZZ= zj{qyKiqtpEzRK*6@sz{9Szc+R6)f=2aig^hiPGyM0M;<)HrNO*IDH_e z>?l>vw7lW*BB*o@nsv-({hZ5%uZUGhrVOz1KP7^|Jk~R+HQ~K zFFgzQoUyLr<@Z>k%%g~!PkA!G_e;zQALWwV4vDQh=$9<&auC{K-0{XJdSN8ri|#bN z@J+AxJ2`z!)tU57+}8r$%o%cU9Hf!E9!VpO27wd))_xTm(pB!GU=>#8h*sv&CjQB( zjgrm!qkLBx17c?VMVmi0)n}5z00mBGc1ghx9Q5n&-TLxSd9DVO(-t2h^FH)!3j4x` z!dw?1w7(}4awI5v4lskN$nd58^Ts)HOm3g-_iMbMap?w@SkIyF&g#ozs>4(oqUWd? zKzj&M`gKb!AWAv%y0b@8$k(J=bTikyuAcdA#wZv6Os058exdYMz4;T;QN3Vfii8X3wJ&sER?BtEqmZ3O>0O<%?g-%9e zv#`(q|NOFeb1=jGl15>lKu_BvW98s|0q9TB4P z+hp5(jsxuc5e+x)h~TCYVVuS*Y(VhB$Ok?ed_W7_!}L0jC-@?eEiy3Qv1Ul?lP4@9bWx+?fb3J`o$rTpZ13E1tU^Dh-$Q&I2=*LlH- zJh<6!Fp;TrZon9bA7rXT9jY9z<|H~;?Rlo(ci@RY*i)vWf7Ozg;UsLr6J;-t30#3D z-Kk_dX*?#kWinDJLsD*-q|@zVBU}%!KthOV0rqL#d5z@FUokZIhx|O_AN`B-xi?)* zkK+6=U&(ro7U)(p=pHQmpgm|7-aK|?TeEb9T3n0qBtB|Z>!PT2`P9KVsZlR}eMNJ& zjUoxO`{G&DJ-YWGmV{FW<2C=jtM_ITBDw!|`Q}cC3ftmdpVZ(W+DFNk;)RQD#9HrV z0=A7ApNf3?C%8A~ta8RyN1rr4VFo_hNBbvysEh6~E$K0p;v-K0x$los#452ee-CPO z5-q~R@j)hzGE$hr+M_g9$lS{mp)SLptA)+8;$sr5nYD$81f^$D2FPV?+TQp29Q~e5 zF@BH;`vanl{x0m;t7pe$uCabq#rq18O}m92qP7sHGV>7-KQ3X7=*f7OUiUoAIgK?` z-RAI)hd8o>mo$k&5V&vCn>;JOB zf{-t|nwUMu4HgLBJO8o`o^*Hp4meJg2!V!Llh5c|yQ16dkw(!<&6*nL29=ZBS?Ylz z7(-C&PX#9BckODo#p$xtgGzJAbSBD!`!u@OeU*p5(oy~M-;9RdG+m1SlV^dRaeqOR zO)q5kT}4}OuBI}F3b^?Ns}5J(ND~un$f47jZsuA+`$z$2)QM4RKDPk&X`g;|dhfx! z-(edr!uWfB#w=wh*y36Je3Y$h0Ta)wH%HE*AYe5*o_9d-jD%sC>Y3y0bA-tmPt2%N zkO?(#)+3YgoWa5z|Cc}SPj)(7YqVluh<~GOcN0Kxpj5xgPGgP2`%7??u@^vQ*Y9gt zwSwGwgza1{c!i2bj1&D|m(PcSr(YA`30<_CG5?ChVxmx`->1+ z%Uaa#>#U&X&Hsz;XIBDsDwnJdcRl`8L{Ms0esh;c_=|LCT;z! zbYh{l{%8;0!h;$OmX?+@{U$|t8e%<=3$*u`Mp?3Q$B1X~y+O(2Tm7q#^_Inmv7Vh2 zo{G}z^;g7=$U({C4m8UBTgp(l=s*3;`x8AKKmn5r7q zB|%qoj$9X0l{=!)Ad`^YSvwyp+Y^t9V_@n3k8+dfb7YQ75PDy3d7RkEK}?0ER_F)5 z$efpfVNA|F?LVqT$+z+UOaX!757&m-qUNi8dPZB5TCKz%_jxVoC8F^HhzIlttInZ6 z6o}B8=H`brDJU4ABlQc=9JA`y5h2X+@}^L#-HEPwDmLp}<{Kebm9Po(Io&llE5urO ztz}EV^&xBn{Sv$VAd5GNr3g!2}iO;1^OIzc0DD+?K2N)bSp> zEu(Kl7;j9ee?rq8g1QBdr@ua0&igMJ^RjEb12X2yptCldy3P^3`V=Ts4~(0446m-_ zrWG20N%o`Fs%@KW`grkN+SP43`_h)REx2jntZbqFV)%o1$rZ6N)nIEt<~n19oX*ml znc#GAcY<=T;z>g6z4Vkwe|X#=Z4Kv)Gkb&eI|;bw4T;F?qruDeu*PRQh))G6piRF! z2u{R5saSCYM6oG4M+L0onBwhO6@OpoeBdJ17gcP4d3FO(i-Ff@$BQ+P^e)Yz+YypX~;VSp6dr>@5di*RJk!`~CC&G^?Q9|%>LcvMoA~p; z7EQAwCY6hduGKNN<7LJ4;_^48XUzB$V(rwiV0p=N6~!sXNkF^47}CfIv&hqWT+v;) z@*^y-P1HGiqpQXI7Xa|C!p$iCH`C-;*Ng`mp&n(zbl)Qw#SFBWym%|wHKE~;4m_Ys zU?mj`Et*_2 zb97gKxhzv^qhhQ86^(Rm8&7awi%naZ!+SPxHwlL9mS@f9HP~;0h zmNsW3N>%Ghtdmv5rxoHQSQwJqqq5=hfcCuk(EyvS?}_L*5vzd#1`i^ez$a4>yAl-EnQWK>vKb4Co-g=ME!<~ zo;8md!^rZ1iw`6sbi~t!iz?~wx(YHnm00gkE5@0R&p8m5S+?b8KJjI4x){chmhr4j z`=s)nc2%U28q@mk`i#DkPtq^)2sG3>XVItQNKj?|ZdUiyS~kRt2Q?oCZ&%TqX)I2a z>bKbRqrfkLw*1h93KHx}5VnuFSxEIC8g5|Try{Z&P7j>fza=5WIoELU_sVuMkTfv!P6k9UTSkrjo6a z^Ya?@(S$FJ=<_6N$1UR=-)!|)9*yaXCRt}xG*;+Zf6FLJ zMQC>>#DF$m%haax@BBG4B+pNtiiA89Z6A*Vb!!H889hh$oxoD2DL5A-EF@;ty(E69 zku`!COQ`$Z|0I_$U3B~cO)F*Yh<(9~+yZt5F~&@^jnTi?!6%sflu0Z4vM4tfEeG6O zd^m?ua5;-1t|FArz8%14woU3(DyNeo zB&O2oYM;j)w`CE-@uNx%IM{AuPv1#{Ta79cFwARRe!lX#Tel#APg1rm3ZLWW{Ggj* z6^)qhT9iw;_Cx(tX0f~g>00qBJF?QRQebsbh(pxm*<3_|KvQ6sDKle_;L+}?oX*pt zQJscT1uARB&d~}d`P(Z#vXl~qrETxs@t>%)F<6Jv?O9tR(z`{jE4Km<+P_@*GnPRb z+t1Rv{CDk=p~D@5@thpMAAGCT-29M*_M;nuCqriLeM-_mV!a|=HdmB95COTDu)SB? z|ASR3^kM*w6hNlSf0}6N7=4Jc5q^d0irQeIc@ecMJa>vqK}Bh2!0Oc{)C;oF)|7-}zkWS)ME0Djs@7V7giCS#7 zh%?TwBgvpu_h8mT-A@$VqyKs7N~N-RDvLYzkTwS?WGu5=8(eap5B?Xf$`x75l4b;A z4Sg9(%!UYWf0)cJWgl>qHLA)>2Udz~TTadt3y!%3&b>V50VqsXWX**LjTp%>nhdp? zDNgHJzo*BK_y5}GB$eFnzeTYQ-EZv}zjA=`pQN>H-jK+S^x7|!aGfdaTL0d$9-#h6 zQj<>fisFR$h2%!92SL#xO#YQ7SRZ{SL-zX&PtRFLzOa;vL)ajBmFzshDORy1e=9q_ zQ|s+SjOvX?gd9+zo?`P@XQB<6A^zwnPZ6ZMgA^HLWZ%7Nzi|Q@#-r?BMw&!vqwapQ z$|!FDqzNO$f6=G*53G;UW`xn76-xp-Hb%NwJ~oQBccrV`tOV_SF?>^3oar3kc+Bw0 z7U}zg5!B*Ve{8C#?HKacT#-r2Jn{R4f_dk){hhV0KN}UKVFPqq^_0#`Z+upm0M1oO zdzfNp01(%b&yD34*6A)?sLbNq{MHa1%+w_}kWlpI0I24KZ?insOUOS;13R5a3jL96 zROAfeEAx!vy|LyRd?RKGsFKB(lxdbyI~YcUf7ra@*Lb_#XWhptNqz!LXfFp=7cROE$cyQt8_8BN7Tn?#*@EM6_k**r3*P9ke|3WVR# zfk(7}Y`rtQrsY6xjeqP_u87?Kr<`Ly&>7!9)pXb5?nW@UD8OtL=l|vz$*v0;iPG-P zfi-cvB=|?ZBH6iqO4ew7CnxG{_h3b8x4n40?fq8{?xb|yg(%WsD!gZV`LTKFqS~|3 zLCQ#7yHU=h;4%aq*y*Y>gGrgXO~M*+&~v>ietyp#W*%D^(kg_nftB;D^jS?5L%};w zwSNdrH@ofz)O}pZto;%ki?#LWz}Jd3ad54+vV|#Dtp<=GA|Z*t`tQ_iZ8gLx%B+*c zNviL56v6C!sve@JQQV4NGd=b)4U@kw=PaP1!gLGUf7^A%lV(v%;yCyVCnyUusrppz z$&LhQ(b&vd>xjYir1kvN-!EP%>4H<=&9h$V=?lp?3GTR;XyyOLZQ&y?enS&Dd(Ww| zeb=8gh`O>^A|3+L{R6!94uvkG)1mRDjliruEa16(_iJgp+qs*uvSPBvIEs}DMpIFy zppVVqfwLtq2gZy?;!g=>BAxx>?t=PAp6R+RVZ+P+I`%?nb&J zRj&%DKSCJP)?cXVC*QuOw!Cms)V z)(9ntwp~X$w_*!Tu7`1lK}0pXvx5yGkJsIyUUQwFlx_%KtAdQQd?{t-)zmS z^SO1;7Jj+`?z=9AdWUM8R^2{$iM3je5Ag$e#?W&2%-@eg?(F3V3ll?3!hs^ogVI$n z^O^}y=HhxRyb5!W1sBw;y~GBR#Cj6;ye&aZo5$eLFp;-ohf3m^FRGVx8x}Us`EVqC zT+?j4P?2j}Pn^~Tnp@)6rmG5lcb`U4d4y|Hx7gfP7PiIB$SwbcBebYdUig zC>yueS+m$|e(lMX=eLWrw~L;*)`)G@2`m$oU`eFiIIqi&Wq>SP+rx&@Eev|GC4Yo$ zq`)g;==MV+C<*=HaDD$(v);ftl@r*kAC#IlL0GdA%aeVGfd zZOA1f^^y!@{m64tP-yC%**%}o{c|4M#sig}yoE!>p1k>sKs~oPoIa}A?qb+>9X)Bw zTo~$7YPhxj()kEeke(#?hk60Gv6yvW!LY%)X_0Suo&qZWH&fYnJaOJ?lp&pV~u~ zyZZ2-A7K8@YO`TlsE2*m-S+Gb^xDLOFJlG@n1qo#2e!l* z>_*d`H;)UT(OMT!@>@*e;{=TjAs%bHHg_Kvh02|kuE$>J#M*lISMfDn{xb8lG50r9NkFKL{+NxPl(+ig0S!xgHiND7XY$DYYgc!ErlR0*- zmb0Gq6+6wajGxbo}v+*9oJAnyJst?Dm>)B&kuUQ<%d9

    rv=+aZ5N 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 K;6Q;UHtat@3kMYd diff --git a/docs/images/flow-debug-project.png b/docs/images/flow-debug-project.png index 98d392e2cc21d1d5ed8c797c79d563229de4bdc4..f5b20bd9f2354e27c11e0a391269043e72383268 100644 GIT binary patch literal 80132 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 Date: Tue, 23 Nov 2021 16:26:32 +0300 Subject: [PATCH 199/328] Rename DefaultExecutor backing working accodring to the name of the outer class (#3040) --- kotlinx-coroutines-core/native/src/Builders.kt | 2 +- kotlinx-coroutines-core/native/src/CoroutineContext.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/native/src/Builders.kt b/kotlinx-coroutines-core/native/src/Builders.kt index 030e876d2b..f5b2222409 100644 --- a/kotlinx-coroutines-core/native/src/Builders.kt +++ b/kotlinx-coroutines-core/native/src/Builders.kt @@ -84,7 +84,7 @@ private class BlockingCoroutine( } else { parkNanos = Long.MAX_VALUE } - // note: process next even may loose unpark flag, so check if completed before parking + // note: processNextEvent may lose unpark flag, so check if completed before parking if (isCompleted) break joinWorker.park(parkNanos / 1000L, true) } diff --git a/kotlinx-coroutines-core/native/src/CoroutineContext.kt b/kotlinx-coroutines-core/native/src/CoroutineContext.kt index c3a376b2be..e1e29581a7 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineContext.kt @@ -10,7 +10,7 @@ import kotlin.native.concurrent.* internal actual object DefaultExecutor : CoroutineDispatcher(), Delay { - private val delegate = WorkerDispatcher(name = "Dispatchers.Default") + private val delegate = WorkerDispatcher(name = "DefaultExecutor") override fun dispatch(context: CoroutineContext, block: Runnable) { checkState() From cf7b0834dcac8c1e22b1acebe7f3c337ff118ff9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 24 Nov 2021 15:24:54 +0300 Subject: [PATCH 200/328] Remove JDK 1.6 from the build dependencies (#3043) --- kotlinx-coroutines-core/build.gradle | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 0d4d708962..72c893bc17 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -190,17 +190,6 @@ kotlin.sourceSets { } } -task checkJdk16() { - // only fail w/o JDK_16 when actually trying to compile, not during project setup phase - doLast { - if (!System.env.JDK_16) { - throw new GradleException("JDK_16 environment variable is not defined. " + - "Can't build against JDK 1.6 runtime and run JDK 1.6 compatibility tests. " + - "Please ensure JDK 1.6 is installed and that JDK_16 points to it.") - } - } -} - jvmTest { minHeapSize = '1g' maxHeapSize = '1g' @@ -273,21 +262,8 @@ static void configureJvmForLincheck(task) { task.systemProperty 'kotlinx.coroutines.semaphore.maxSpinCycles', '1' // better for the model checking mode } -task jdk16Test(type: Test, dependsOn: [compileTestKotlinJvm, checkJdk16]) { - classpath = files { jvmTest.classpath } - testClassesDirs = files { jvmTest.testClassesDirs } - executable = "$System.env.JDK_16/bin/java" - exclude '**/*LincheckTest.*' // Lincheck tests use LinChecker which needs JDK8 - exclude '**/exceptions/**' // exceptions tests check suppressed exception which needs JDK8 - exclude '**/ExceptionsGuideTest.*' - exclude '**/RunInterruptibleStressTest.*' // fails on JDK 1.6 due to JDK bug -} - -// Run jdk16Test test only during nightly stress test -jdk16Test.onlyIf { project.properties['stressTest'] != null } - // Always check additional test sets -task moreTest(dependsOn: [jvmStressTest, jvmLincheckTest, jdk16Test]) +task moreTest(dependsOn: [jvmStressTest, jvmLincheckTest]) check.dependsOn moreTest task testsJar(type: Jar, dependsOn: jvmTestClasses) { From ff9359a9370c26a81405e1eb895ee1c4686ffc91 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 25 Nov 2021 16:48:06 +0300 Subject: [PATCH 201/328] Get rid of @ExperimentalTime where it is no longer necessary (#3041) * Get rid of @ExperimentalTime where it is no longer necessary Fixes #3039 --- kotlinx-coroutines-core/common/src/Delay.kt | 2 - kotlinx-coroutines-core/common/src/Timeout.kt | 2 - .../common/src/flow/SharingStarted.kt | 1 - .../common/src/flow/operators/Delay.kt | 4 -- .../common/src/selects/Select.kt | 1 - .../common/test/DelayDurationTest.kt | 1 - .../common/test/WithTimeoutDurationTest.kt | 31 ++++++------- .../test/WithTimeoutOrNullDurationTest.kt | 43 ++++++++++--------- .../test/flow/operators/DebounceTest.kt | 28 ++++++------ .../common/test/flow/operators/SampleTest.kt | 14 +++--- .../SharingStartedWhileSubscribedTest.kt | 3 +- .../test/selects/SelectTimeoutDurationTest.kt | 19 ++++---- .../examples/example-delay-duration-01.kt | 1 - .../examples/example-delay-duration-02.kt | 1 - .../examples/example-delay-duration-03.kt | 1 - .../jvm/test/flow/SharedFlowStressTest.kt | 5 +-- .../common/test/Helpers.kt | 1 - 17 files changed, 70 insertions(+), 88 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Delay.kt b/kotlinx-coroutines-core/common/src/Delay.kt index d95dc52f9f..301ed2d322 100644 --- a/kotlinx-coroutines-core/common/src/Delay.kt +++ b/kotlinx-coroutines-core/common/src/Delay.kt @@ -133,7 +133,6 @@ public suspend fun delay(timeMillis: Long) { * * Implementation note: how exactly time is tracked is an implementation detail of [CoroutineDispatcher] in the context. */ -@ExperimentalTime public suspend fun delay(duration: Duration): Unit = delay(duration.toDelayMillis()) /** Returns [Delay] implementation of the given context */ @@ -143,6 +142,5 @@ internal val CoroutineContext.delay: Delay get() = get(ContinuationInterceptor) * Convert this duration to its millisecond value. * Positive durations are coerced at least `1`. */ -@ExperimentalTime internal fun Duration.toDelayMillis(): Long = if (this > Duration.ZERO) inWholeMilliseconds.coerceAtLeast(1) else 0 diff --git a/kotlinx-coroutines-core/common/src/Timeout.kt b/kotlinx-coroutines-core/common/src/Timeout.kt index 264a2b9d1b..46ab4ae8c8 100644 --- a/kotlinx-coroutines-core/common/src/Timeout.kt +++ b/kotlinx-coroutines-core/common/src/Timeout.kt @@ -64,7 +64,6 @@ public suspend fun withTimeout(timeMillis: Long, block: suspend CoroutineSco * * > Implementation note: how the time is tracked exactly is an implementation detail of the context's [CoroutineDispatcher]. */ -@ExperimentalTime public suspend fun withTimeout(timeout: Duration, block: suspend CoroutineScope.() -> T): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) @@ -131,7 +130,6 @@ public suspend fun withTimeoutOrNull(timeMillis: Long, block: suspend Corout * * > Implementation note: how the time is tracked exactly is an implementation detail of the context's [CoroutineDispatcher]. */ -@ExperimentalTime public suspend fun withTimeoutOrNull(timeout: Duration, block: suspend CoroutineScope.() -> T): T? = withTimeoutOrNull(timeout.toDelayMillis(), block) diff --git a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt index a5ae63667f..0554142408 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharingStarted.kt @@ -135,7 +135,6 @@ public fun interface SharingStarted { * are negative. */ @Suppress("FunctionName") -@ExperimentalTime public fun SharingStarted.Companion.WhileSubscribed( stopTimeout: Duration = Duration.ZERO, replayExpiration: Duration = Duration.INFINITE diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index e893f44ea5..258dc3eeb1 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -17,7 +17,6 @@ import kotlin.time.* /* Scaffolding for Knit code examples @@ -77,12 +76,6 @@ additionally enhancing stacktraces with information where coroutine was created. The full tutorial of how to use debug agent can be found in the corresponding [readme](../../kotlinx-coroutines-debug/README.md). -### Debug agent and Android - -Unfortunately, Android runtime does not support Instrument API necessary for `kotlinx-coroutines-debug` to function, triggering `java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;`. - -Nevertheless, it will be possible to support debug agent on Android as soon as [GradleAspectJ-Android](https://github.com/Archinamon/android-gradle-aspectj) will support android-gradle 3.3 - -[com.google.common.util.concurrent.ListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/https://google.github.io/guava/releases/28.0-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html +[com.google.common.util.concurrent.ListenableFuture]: https://kotlin.github.io/kotlinx.coroutines/https://google.github.io/guava/releases/31.0.1-jre/api/docs/com/google/common/util/concurrent/ListenableFuture.html diff --git a/integration/kotlinx-coroutines-guava/build.gradle.kts b/integration/kotlinx-coroutines-guava/build.gradle.kts index 12a6ca70b7..ebddd3c9ce 100644 --- a/integration/kotlinx-coroutines-guava/build.gradle.kts +++ b/integration/kotlinx-coroutines-guava/build.gradle.kts @@ -2,12 +2,17 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -val guavaVersion = "28.0-jre" +val guavaVersion = "31.0.1-jre" dependencies { compile("com.google.guava:guava:$guavaVersion") } +java { + targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 +} + externalDocumentationLink( url = "https://google.github.io/guava/releases/$guavaVersion/api/docs/" ) diff --git a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt index d214cc6b1a..0820f1f101 100644 --- a/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt +++ b/integration/kotlinx-coroutines-guava/src/ListenableFuture.kt @@ -135,10 +135,8 @@ public fun ListenableFuture.asDeferred(): Deferred { // Finally, if this isn't done yet, attach a Listener that will complete the Deferred. val deferred = CompletableDeferred() Futures.addCallback(this, object : FutureCallback { - override fun onSuccess(result: T?) { - // Here we work with flexible types, so we unchecked cast to trick the type system - @Suppress("UNCHECKED_CAST") - runCatching { deferred.complete(result as T) } + override fun onSuccess(result: T) { + runCatching { deferred.complete(result) } .onFailure { handleCoroutineException(EmptyCoroutineContext, it) } } @@ -351,7 +349,7 @@ private class JobListenableFuture(private val jobToCancel: Job): ListenableFu * * To preserve Coroutine's [CancellationException], this future points to either `T` or [Cancelled]. */ - private val auxFuture = SettableFuture.create() + private val auxFuture = SettableFuture.create() /** * `true` if [auxFuture.get][ListenableFuture.get] throws [ExecutionException]. @@ -436,7 +434,7 @@ private class JobListenableFuture(private val jobToCancel: Job): ListenableFu } /** See [get()]. */ - private fun getInternal(result: Any): T = if (result is Cancelled) { + private fun getInternal(result: Any?): T = if (result is Cancelled) { throw CancellationException().initCause(result.exception) } else { // We know that `auxFuture` can contain either `T` or `Cancelled`. From 15815923970b5da2e9a1bd0d68293869341714c1 Mon Sep 17 00:00:00 2001 From: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> Date: Tue, 18 Jan 2022 18:06:04 +0300 Subject: [PATCH 240/328] Update the migration guide to highlight how to test all emissions (#3144) Addresses #3143 Addresses #3120 --- kotlinx-coroutines-test/MIGRATION.md | 138 +++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 8 deletions(-) diff --git a/kotlinx-coroutines-test/MIGRATION.md b/kotlinx-coroutines-test/MIGRATION.md index 5124864745..10c197f49e 100644 --- a/kotlinx-coroutines-test/MIGRATION.md +++ b/kotlinx-coroutines-test/MIGRATION.md @@ -146,18 +146,140 @@ No action on your part is required, other than replacing `runBlocking` with `run By now, calls to `pauseDispatcher` and `resumeDispatcher` should be purged from the code base, so only the unpaused variant of `TestCoroutineDispatcher` should be used. -This version of the dispatcher, which can be observed has the property of eagerly entering `launch` and `async` blocks: +This version of the dispatcher has the property of eagerly entering `launch` and `async` blocks: code until the first suspension is executed without dispatching. -We ensured sure that, when run with an `UnconfinedTestDispatcher`, `runTest` also eagerly enters `launch` and `async` -blocks, but *this only works at the top level*: if a child coroutine also called `launch` or `async`, we don't provide +There are two common ways in which this property is useful. + +#### `TestCoroutineDispatcher` for the top-level coroutine + +Some tests that rely on `launch` and `async` blocks being entered immediately have a form similar to this: +```kotlin +runTest(TestCoroutineDispatcher()) { + launch { + updateSomething() + } + checkThatSomethingWasUpdated() + launch { + updateSomethingElse() + } + checkThatSomethingElseWasUpdated() +} +``` + +If the `TestCoroutineDispatcher()` is simply removed, `StandardTestDispatcher()` will be used, which will cause +the test to fail. + +In these cases, `UnconfinedTestDispatcher()` should be used. +We ensured that, when run with an `UnconfinedTestDispatcher`, `runTest` also eagerly enters `launch` and `async` +blocks. + +Note though that *this only works at the top level*: if a child coroutine also called `launch` or `async`, we don't provide any guarantees about their dispatching order. -So, using `UnconfinedTestDispatcher` as an argument to `runTest` will probably lead to the test being executed as it -did, but in the possible case that the test relies on the specific dispatching order of `TestCoroutineDispatcher`, it -will need to be tweaked. -If the test expects some code to have run at some point, but it hasn't, use `runCurrent` to force the tasks scheduled +#### `TestCoroutineDispatcher` for testing intermediate emissions + +Some code tests `StateFlow` or channels in a manner similar to this: + +```kotlin +@Test +fun testAllEmissions() = runTest(TestCoroutineDispatcher()) { + val values = mutableListOf() + val stateFlow = MutableStateFlow(0) + val job = launch { + stateFlow.collect { + values.add(it) + } + } + stateFlow.value = 1 + stateFlow.value = 2 + stateFlow.value = 3 + job.cancel() + // each assignment will immediately resume the collecting child coroutine, + // so no values will be skipped. + assertEquals(listOf(0, 1, 2, 3), values) +} +``` + +Such code will fail when `TestCoroutineDispatcher()` is not used: not every emission will be listed. +In this particular case, none will be listed at all. + +The reason for this is that setting `stateFlow.value` (as is sending to a channel, as are some other things) wakes up +the coroutine waiting for the new value, but *typically* does not immediately run the collecting code, instead simply +dispatching it. +The exceptions are the coroutines running in dispatchers that don't (always) go through a dispatch, +`Dispatchers.Unconfined`, `Dispatchers.Main.immediate`, `UnconfinedTestDispatcher`, or `TestCoroutineDispatcher` in +the unpaused state. + +Therefore, a solution is to launch the collection in an unconfined dispatcher: + +```kotlin +@Test +fun testAllEmissions() = runTest { + val values = mutableListOf() + val stateFlow = MutableStateFlow(0) + val job = launch(UnconfinedTestDispatcher(testScheduler)) { // <------ + stateFlow.collect { + values.add(it) + } + } + stateFlow.value = 1 + stateFlow.value = 2 + stateFlow.value = 3 + job.cancel() + // each assignment will immediately resume the collecting child coroutine, + // so no values will be skipped. + assertEquals(listOf(0, 1, 2, 3), values) +} +``` + +Note that `testScheduler` is passed so that the unconfined dispatcher is linked to `runTest`. +Also, note that `UnconfinedTestDispatcher` is not passed to `runTest`. +This is due to the fact that, *inside* the `UnconfinedTestDispatcher`, there are no execution order guarantees, +so it would not be guaranteed that setting `stateFlow.value` would immediately run the collecting code +(though in this case, it does). + +#### Other considerations + +Using `UnconfinedTestDispatcher` as an argument to `runTest` will probably lead to the test being executed as it +did, but it's still possible that the test relies on the specific dispatching order of `TestCoroutineDispatcher`, +so it will need to be tweaked. + +If some code is expected to have run at some point, but it hasn't, use `runCurrent` to force the tasks scheduled at this moment of time to run. +For example, the `StateFlow` example above can also be forced to succeed by doing this: + +```kotlin +@Test +fun testAllEmissions() = runTest { + val values = mutableListOf() + val stateFlow = MutableStateFlow(0) + val job = launch { + stateFlow.collect { + values.add(it) + } + } + runCurrent() + stateFlow.value = 1 + runCurrent() + stateFlow.value = 2 + runCurrent() + stateFlow.value = 3 + runCurrent() + job.cancel() + // each assignment will immediately resume the collecting child coroutine, + // so no values will be skipped. + assertEquals(listOf(0, 1, 2, 3), values) +} +``` + +Be wary though of this approach: using `runCurrent`, `advanceTimeBy`, or `advanceUntilIdle` is, essentially, +simulating some particular execution order, which is not guaranteed to happen in production code. +For example, using `UnconfinedTestDispatcher` to fix this test reflects how, in production code, one could use +`Dispatchers.Unconfined` to observe all emitted values without conflation, but the `runCurrent()` approach only +states that the behavior would be observed if a dispatch were to happen at some chosen points. +It is, therefore, recommended to structure tests in a way that does not rely on a particular interleaving, unless +that is the intention. ### The job hierarchy is completely different. @@ -322,4 +444,4 @@ fun testFoo() = runTest { ``` The reason this works is that all entities that depend on `TestCoroutineScheduler` will attempt to acquire one from -the current `Dispatchers.Main`. \ No newline at end of file +the current `Dispatchers.Main`. From 648f694c84bc0fd6bff5e9501178c0b1e8a2fb35 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 18 Jan 2022 18:30:46 +0300 Subject: [PATCH 241/328] Prevent LimitedParallelismStressTest from allocating too much memory, but still keep the pattern of the load roughly the same (#3147) --- .../jvm/test/LimitedParallelismStressTest.kt | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt b/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt index 4de1862b0f..58f2b6b35a 100644 --- a/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/LimitedParallelismStressTest.kt @@ -23,7 +23,7 @@ class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBas @get:Rule val executor = ExecutorRule(targetParallelism * 2) - private val iterations = 100_000 * stressTestMultiplier + private val iterations = 100_000 private val parallelism = AtomicInteger(0) @@ -37,9 +37,11 @@ class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBas @Test fun testLimitedExecutor() = runTest { val view = executor.limitedParallelism(targetParallelism) - repeat(iterations) { - launch(view) { - checkParallelism() + doStress { + repeat(iterations) { + launch(view) { + checkParallelism() + } } } } @@ -47,9 +49,11 @@ class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBas @Test fun testLimitedDispatchersIo() = runTest { val view = Dispatchers.IO.limitedParallelism(targetParallelism) - repeat(iterations) { - launch(view) { - checkParallelism() + doStress { + repeat(iterations) { + launch(view) { + checkParallelism() + } } } } @@ -57,7 +61,7 @@ class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBas @Test fun testLimitedDispatchersIoDispatchYield() = runTest { val view = Dispatchers.IO.limitedParallelism(targetParallelism) - repeat(iterations) { + doStress { launch(view) { yield() checkParallelism() @@ -68,16 +72,26 @@ class LimitedParallelismStressTest(private val targetParallelism: Int) : TestBas @Test fun testLimitedExecutorReachesTargetParallelism() = runTest { val view = executor.limitedParallelism(targetParallelism) - repeat(iterations) { - val barrier = CyclicBarrier(targetParallelism + 1) - repeat(targetParallelism) { - launch(view) { - barrier.await() + doStress { + repeat(iterations) { + val barrier = CyclicBarrier(targetParallelism + 1) + repeat(targetParallelism) { + launch(view) { + barrier.await() + } } + // Successfully awaited parallelism + 1 + barrier.await() + coroutineContext.job.children.toList().joinAll() + } + } + } + + private suspend inline fun doStress(crossinline block: suspend CoroutineScope.() -> Unit) { + repeat(stressTestMultiplier) { + coroutineScope { + block() } - // Successfully awaited parallelism + 1 - barrier.await() - coroutineContext.job.children.toList().joinAll() } } } From a0a95e2c80cea492b0e0a4108169ae420c7d2bbe Mon Sep 17 00:00:00 2001 From: Pablo Baxter Date: Tue, 18 Jan 2022 20:20:31 -0800 Subject: [PATCH 242/328] Update based on recent changes --- .../common/src/flow/operators/Delay.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt index 3410b2b8eb..cfa1dfe6b3 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Delay.kt @@ -382,7 +382,7 @@ public fun Flow.sample(period: Duration): Flow = sample(period.toDelay * @param timeout Timeout period * @param action Action to invoke on timeout. Default is to throw [FlowTimeoutException] */ -@ExperimentalTime +@FlowPreview public fun Flow.timeout( timeout: Duration, @BuilderInference action: suspend FlowCollector.() -> Unit = { throw FlowTimeoutException(timeout.toDelayMillis()) } @@ -422,13 +422,12 @@ public fun Flow.timeout( * @param timeoutMillis Timeout period in millis * @param action Action to invoke on timeout. Default is to throw [FlowTimeoutException] */ -@ExperimentalTime +@FlowPreview public fun Flow.timeout( timeoutMillis: Long, @BuilderInference action: suspend FlowCollector.() -> Unit = { throw FlowTimeoutException(timeoutMillis) } ): Flow = timeoutInternal(timeoutMillis, action) -@ExperimentalTime private fun Flow.timeoutInternal( timeoutMillis: Long, action: suspend FlowCollector.() -> Unit @@ -463,17 +462,17 @@ private fun Flow.timeoutInternal( // Await for values from our producer now whileSelect { - values.onReceiveOrNull { value -> + values.onReceive { value -> if (value !== DONE) { if (value === TIMEOUT) { downStream.action() values.cancel(ChildCancelledException()) - return@onReceiveOrNull false // Just end the loop here. Nothing more to be done. + return@onReceive false // Just end the loop here. Nothing more to be done. } downStream.emit(NULL.unbox(value)) - return@onReceiveOrNull true + return@onReceive true } - return@onReceiveOrNull false // We got the DONE signal, so exit the while loop + return@onReceive false // We got the DONE signal, so exit the while loop } } } @@ -486,7 +485,7 @@ private fun Flow.timeoutInternal( public class FlowTimeoutException internal constructor(message: String) : CancellationException(message), CopyableThrowable { // message is never null in fact - override fun createCopy(): FlowTimeoutException? = + override fun createCopy(): FlowTimeoutException = FlowTimeoutException(message ?: "").also { it.initCause(this) } } From 5e5dcd7d5d30b51b96c5adb64560f8fd0b73828d Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 19 Jan 2022 13:32:57 +0300 Subject: [PATCH 243/328] Integrate Kover (#3141) --- build.gradle | 6 ++- buildSrc/build.gradle.kts | 1 + ...s => animalsniffer-conventions.gradle.kts} | 0 .../main/kotlin/kover-conventions.gradle.kts | 54 +++++++++++++++++++ gradle.properties | 3 +- kotlinx-coroutines-core/build.gradle | 24 ++++++++- .../build.gradle.kts | 7 +++ 7 files changed, 91 insertions(+), 4 deletions(-) rename buildSrc/src/main/kotlin/{animalsniffer-convention.gradle.kts => animalsniffer-conventions.gradle.kts} (100%) create mode 100644 buildSrc/src/main/kotlin/kover-conventions.gradle.kts diff --git a/build.gradle b/build.gradle index 636a6f57f4..d07f4767d9 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,7 @@ buildscript { classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version" classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.3" // Android API check + classpath "org.jetbrains.kotlinx:kover:$kover_version" // JMH plugins classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0" @@ -105,7 +106,8 @@ allprojects { } apply plugin: "binary-compatibility-validator" -apply plugin: 'base' +apply plugin: "base" +apply plugin: "kover-conventions" apiValidation { ignoredProjects += unpublished + ["kotlinx-coroutines-bom"] @@ -303,7 +305,7 @@ def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm" task deploy(dependsOn: publishTasks) -apply plugin: 'animalsniffer-convention' +apply plugin: "animalsniffer-conventions" clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 8517a5aeee..2637980a24 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -60,4 +60,5 @@ dependencies { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") } implementation("ru.vyarus:gradle-animalsniffer-plugin:1.5.3") // Android API check + implementation("org.jetbrains.kotlinx:kover:${version("kover")}") } diff --git a/buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts b/buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts similarity index 100% rename from buildSrc/src/main/kotlin/animalsniffer-convention.gradle.kts rename to buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts diff --git a/buildSrc/src/main/kotlin/kover-conventions.gradle.kts b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts new file mode 100644 index 0000000000..3a40331a8e --- /dev/null +++ b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts @@ -0,0 +1,54 @@ +import kotlinx.kover.api.* +import kotlinx.kover.tasks.* + +/* + * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ +apply(plugin = "kover") + +val notCovered = sourceless + internal + unpublished + +val expectedCoverage = mutableMapOf( + // These have lower coverage in general, it can be eventually fixed + "kotlinx-coroutines-swing" to 70, + "kotlinx-coroutines-android" to 50, + "kotlinx-coroutines-javafx" to 39, // JavaFx is not tested on TC because its graphic subsystem cannot be initialized in headless mode + + // TODO figure it out, these probably should be fixed + "kotlinx-coroutines-debug" to 84, + "kotlinx-coroutines-reactive" to 65, + "kotlinx-coroutines-reactor" to 65, + "kotlinx-coroutines-rx2" to 78, + "kotlinx-coroutines-slf4j" to 81 +) + +extensions.configure { + disabledProjects = notCovered + /* + * Is explicitly enabled on TC in a separate build step. + * Examples: + * ./gradlew :p:check -- doesn't verify coverage + * ./gradlew :p:check -Pkover.enabled=true -- verifies coverage + * ./gradlew :p:koverReport -Pkover.enabled=true -- generates report + */ + isDisabled = !(properties["kover.enabled"]?.toString()?.toBoolean() ?: false) +} + +subprojects { + val projectName = name + if (projectName in notCovered) return@subprojects + tasks.withType { + rule { + bound { + /* + * 85 is our baseline that we aim to raise to 90+. + * Missing coverage is typically due to bugs in the agent + * (e.g. signatures deprecated with an error are counted), + * sometimes it's various diagnostic `toString` or `catch` for OOMs/VerificationErrors, + * but some places are definitely worth visiting. + */ + minValue = expectedCoverage[projectName] ?: 85 // COVERED_LINES_PERCENTAGE + } + } + } +} diff --git a/gradle.properties b/gradle.properties index ba143d84e0..922f786fb1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,8 @@ rxjava2_version=2.2.8 rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 -binary_compatibility_validator_version=0.8.0-RC +binary_compatibility_validator_version=0.8.0 +kover_version=0.5.0-RC2 blockhound_version=1.0.2.RELEASE jna_version=5.9.0 diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle index 487527b22b..ac6840d98c 100644 --- a/kotlinx-coroutines-core/build.gradle +++ b/kotlinx-coroutines-core/build.gradle @@ -256,7 +256,7 @@ static void configureJvmForLincheck(task) { task.minHeapSize = '1g' task.maxHeapSize = '4g' // we may need more space for building an interleaving tree in the model checking mode task.jvmArgs = ['--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED', // required for transformation - '--add-exports', 'java.base/jdk.internal.util=ALL-UNNAMED'] // in the model checking mode + '--add-exports', 'java.base/jdk.internal.util=ALL-UNNAMED'] // in the model checking mode task.systemProperty 'kotlinx.coroutines.semaphore.segmentSize', '2' task.systemProperty 'kotlinx.coroutines.semaphore.maxSpinCycles', '1' // better for the model checking mode } @@ -265,6 +265,28 @@ static void configureJvmForLincheck(task) { task moreTest(dependsOn: [jvmStressTest, jvmLincheckTest]) check.dependsOn moreTest +tasks.jvmLincheckTest { + kover { + enabled = false // Always disabled, lincheck doesn't really support coverage + } +} + +def commonKoverExcludes = + ["kotlinx.coroutines.test.*", // Deprecated package for removal + "kotlinx.coroutines.debug.*", // Tested by debug module + "kotlinx.coroutines.channels.ChannelsKt__DeprecatedKt.*", // Deprecated + "kotlinx.coroutines.scheduling.LimitingDispatcher", // Deprecated + "kotlinx.coroutines.scheduling.ExperimentalCoroutineDispatcher" // Deprecated + ] + +tasks.koverHtmlReport { + excludes = commonKoverExcludes +} + +tasks.koverVerify { + excludes = commonKoverExcludes +} + task testsJar(type: Jar, dependsOn: jvmTestClasses) { classifier = 'tests' from compileTestKotlinJvm.destinationDir diff --git a/ui/kotlinx-coroutines-android/build.gradle.kts b/ui/kotlinx-coroutines-android/build.gradle.kts index 9cec1dc9f0..145ad9f6b4 100644 --- a/ui/kotlinx-coroutines-android/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/build.gradle.kts @@ -2,6 +2,8 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +import kotlinx.kover.api.* + configurations { create("r8") } @@ -103,3 +105,8 @@ open class RunR8 : JavaExec() { } } +tasks.withType { + extensions.configure { + excludes = excludes + listOf("com.android.*", "android.*") // Exclude robolectric-generated classes + } +} From eac7bba54b2c8f49cff57f3e14b090797c95d56a Mon Sep 17 00:00:00 2001 From: Krzysztof Date: Fri, 21 Jan 2022 11:40:56 +0100 Subject: [PATCH 244/328] docs: typo in conflate docs (#3151) --- kotlinx-coroutines-core/common/src/flow/operators/Context.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt index ace01e1d44..8ed5606b83 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Context.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Context.kt @@ -171,7 +171,7 @@ public fun Flow.buffer(capacity: Int = BUFFERED): Flow = buffer(capaci * ``` * * Note that `conflate` operator is a shortcut for [buffer] with `capacity` of [Channel.CONFLATED][Channel.CONFLATED], - * with is, in turn, a shortcut to a buffer that only keeps the latest element as + * which is, in turn, a shortcut to a buffer that only keeps the latest element as * created by `buffer(onBufferOverflow = `[`BufferOverflow.DROP_OLDEST`][BufferOverflow.DROP_OLDEST]`)`. * * ### Operator fusion From 3e7466a86436a68afc06cc50a24d514da3c36311 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 24 Jan 2022 18:50:35 +0300 Subject: [PATCH 245/328] Fix typo in CoroutineDispatcher documentation Fixes #3110 --- kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt index c717d559e9..71b7ec726f 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineDispatcher.kt @@ -84,7 +84,7 @@ public abstract class CoroutineDispatcher : * // At most 2 threads will be processing images as it is really slow and CPU-intensive * private val imageProcessingDispatcher = backgroundDispatcher.limitedParallelism(2) * // At most 3 threads will be processing JSON to avoid image processing starvation - * private val imageProcessingDispatcher = backgroundDispatcher.limitedParallelism(3) + * private val jsonProcessingDispatcher = backgroundDispatcher.limitedParallelism(3) * // At most 1 thread will be doing IO * private val fileWriterDispatcher = backgroundDispatcher.limitedParallelism(1) * ``` From 8136179efb3c2d752c4be409698eb8d425af23e7 Mon Sep 17 00:00:00 2001 From: Doug Marques Date: Tue, 25 Jan 2022 17:25:33 +1000 Subject: [PATCH 246/328] Fixing typo: `distinctUtilChanged` to `distinctUntilChanged` (#3154) --- kotlinx-coroutines-core/common/src/flow/operators/Distinct.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Distinct.kt b/kotlinx-coroutines-core/common/src/flow/operators/Distinct.kt index 3166786bec..f211a1b2bf 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Distinct.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Distinct.kt @@ -15,7 +15,7 @@ import kotlin.native.concurrent.* /** * Returns flow where all subsequent repetitions of the same value are filtered out. * - * Note that any instance of [StateFlow] already behaves as if `distinctUtilChanged` operator is + * Note that any instance of [StateFlow] already behaves as if `distinctUntilChanged` operator is * applied to it, so applying `distinctUntilChanged` to a `StateFlow` has no effect. * See [StateFlow] documentation on Operator Fusion. * Also, repeated application of `distinctUntilChanged` operator on any flow has no effect. From b5b254b1f84876ebae20486d1539f9cf4d5003cb Mon Sep 17 00:00:00 2001 From: OliverO2 Date: Thu, 27 Jan 2022 14:17:32 +0100 Subject: [PATCH 247/328] Fix example code in comment of CopyableThreadContextElement (#3157) --- .../jvm/src/ThreadContextElement.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt index 1b825cef01..1a960699c7 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt @@ -97,26 +97,25 @@ public interface ThreadContextElement : CoroutineContext.Element { * is in a coroutine: * * ``` - * class TraceContextElement(val traceData: TraceData?) : CopyableThreadContextElement { - * companion object Key : CoroutineContext.Key - * override val key: CoroutineContext.Key - * get() = Key + * class TraceContextElement(private val traceData: TraceData?) : CopyableThreadContextElement { + * companion object Key : CoroutineContext.Key + * override val key: CoroutineContext.Key = Key * * override fun updateThreadContext(context: CoroutineContext): TraceData? { * val oldState = traceThreadLocal.get() - * traceThreadLocal.set(data) + * traceThreadLocal.set(traceData) * return oldState * } * - * override fun restoreThreadContext(context: CoroutineContext, oldData: TraceData?) { + * override fun restoreThreadContext(context: CoroutineContext, oldState: TraceData?) { * traceThreadLocal.set(oldState) * } * - * override fun copyForChildCoroutine(): CopyableThreadContextElement { + * override fun copyForChildCoroutine(): CopyableThreadContextElement { * // Copy from the ThreadLocal source of truth at child coroutine launch time. This makes * // ThreadLocal writes between resumption of the parent coroutine and the launch of the * // child coroutine visible to the child. - * return CopyForChildCoroutineElement(traceThreadLocal.get()) + * return TraceContextElement(traceThreadLocal.get()?.copy()) * } * } * ``` From 649d03e971e287355468dce0dcd3b9ffe9adf964 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 1 Feb 2022 12:29:11 +0300 Subject: [PATCH 248/328] =?UTF-8?q?Confine=20context-specific=20state=20to?= =?UTF-8?q?=20the=20thread=20in=20UndispatchedCoroutine=E2=80=A6=20(#3155)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Confine context-specific state to the thread in UndispatchedCoroutine in order to avoid state interference when the coroutine is updated concurrently. Concurrency is inevitable in this scenario: when the coroutine that has UndispatchedCoroutine as its completion suspends, we have to clear the thread context, but while we are doing so, concurrent resume of the coroutine could've happened that also ends up in save/clear/update context Fixes #2930 --- .../jvm/src/CoroutineContext.kt | 32 +++++---- .../jvm/test/ThreadLocalStressTest.kt | 72 +++++++++++++++++++ 2 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index d562207f8b..6291ea2b97 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -107,7 +107,7 @@ internal tailrec fun CoroutineStackFrame.undispatchedCompletion(): UndispatchedC /** * Marker indicating that [UndispatchedCoroutine] exists somewhere up in the stack. - * Used as a performance optimization to avoid stack walking where it is not nesessary. + * Used as a performance optimization to avoid stack walking where it is not necessary. */ private object UndispatchedMarker: CoroutineContext.Element, CoroutineContext.Key { override val key: CoroutineContext.Key<*> @@ -120,26 +120,34 @@ internal actual class UndispatchedCoroutineactual constructor ( uCont: Continuation ) : ScopeCoroutine(if (context[UndispatchedMarker] == null) context + UndispatchedMarker else context, uCont) { - private var savedContext: CoroutineContext? = null - private var savedOldValue: Any? = null + /* + * The state is thread-local because this coroutine can be used concurrently. + * Scenario of usage (withContinuationContext): + * val state = saveThreadContext(ctx) + * try { + * invokeSmthWithThisCoroutineAsCompletion() // Completion implies that 'afterResume' will be called + * // COROUTINE_SUSPENDED is returned + * } finally { + * thisCoroutine().clearThreadContext() // Concurrently the "smth" could've been already resumed on a different thread + * // and it also calls saveThreadContext and clearThreadContext + * } + */ + private var threadStateToRecover = ThreadLocal>() fun saveThreadContext(context: CoroutineContext, oldValue: Any?) { - savedContext = context - savedOldValue = oldValue + threadStateToRecover.set(context to oldValue) } fun clearThreadContext(): Boolean { - if (savedContext == null) return false - savedContext = null - savedOldValue = null + if (threadStateToRecover.get() == null) return false + threadStateToRecover.set(null) return true } override fun afterResume(state: Any?) { - savedContext?.let { context -> - restoreThreadContext(context, savedOldValue) - savedContext = null - savedOldValue = null + threadStateToRecover.get()?.let { (ctx, value) -> + restoreThreadContext(ctx, value) + threadStateToRecover.set(null) } // resume undispatched -- update context but stay on the same dispatcher val result = recoverResult(state, uCont) diff --git a/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt b/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt new file mode 100644 index 0000000000..f9941d0215 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlin.test.* + + +class ThreadLocalStressTest : TestBase() { + + private val threadLocal = ThreadLocal() + + // See the comment in doStress for the machinery + @Test + fun testStress() = runTest { + repeat (100 * stressTestMultiplierSqrt) { + withContext(Dispatchers.Default) { + repeat(100) { + launch { + doStress(null) + } + } + } + } + } + + @Test + fun testStressWithOuterValue() = runTest { + repeat (100 * stressTestMultiplierSqrt) { + withContext(Dispatchers.Default + threadLocal.asContextElement("bar")) { + repeat(100) { + launch { + doStress("bar") + } + } + } + } + } + + private suspend fun doStress(expectedValue: String?) { + assertEquals(expectedValue, threadLocal.get()) + try { + /* + * Here we are using very specific code-path to trigger the execution we want to. + * The bug, in general, has a larger impact, but this particular code pinpoints it: + * + * 1) We use _undispatched_ withContext with thread element + * 2) We cancel the coroutine + * 3) We use 'suspendCancellableCoroutineReusable' that does _postponed_ cancellation check + * which makes the reproduction of this race pretty reliable. + * + * Now the following code path is likely to be triggered: + * + * T1 from within 'withContinuationContext' method: + * Finds 'oldValue', finds undispatched completion, invokes its 'block' argument. + * 'block' is this coroutine, it goes to 'trySuspend', checks for postponed cancellation and *dispatches* it. + * The execution stops _right_ before 'undispatchedCompletion.clearThreadContext()'. + * + * T2 now executes the dispatched cancellation and concurrently mutates the state of the undispatched completion. + * All bets are off, now both threads can leave the thread locals state inconsistent. + */ + withContext(threadLocal.asContextElement("foo")) { + yield() + cancel() + suspendCancellableCoroutineReusable { } + } + } finally { + assertEquals(expectedValue, threadLocal.get()) + } + } +} From 76989f739796f409fb3147939e086c3d1af725bf Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 1 Feb 2022 13:51:36 +0300 Subject: [PATCH 249/328] =?UTF-8?q?Coverage:=20improve=20test=20coverage,?= =?UTF-8?q?=20disable=20deprecations,=20add=20missing=20test=E2=80=A6=20(#?= =?UTF-8?q?3161)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses #3156 --- .../main/kotlin/kover-conventions.gradle.kts | 14 +- .../test/MDCContextTest.kt | 3 +- kotlinx-coroutines-debug/build.gradle | 12 + kotlinx-coroutines-debug/test/ToStringTest.kt | 11 + .../build.gradle.kts | 14 ++ .../build.gradle.kts | 12 + .../src/HandlerDispatcher.kt | 2 +- .../test/AndroidExceptionPreHandlerTest.kt | 35 +++ .../test/HandlerDispatcherAsyncTest.kt | 145 ++++++++++++ .../test/HandlerDispatcherTest.kt | 214 +++++++----------- 10 files changed, 325 insertions(+), 137 deletions(-) create mode 100644 ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt create mode 100644 ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt diff --git a/buildSrc/src/main/kotlin/kover-conventions.gradle.kts b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts index 3a40331a8e..125ddb19ea 100644 --- a/buildSrc/src/main/kotlin/kover-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts @@ -10,16 +10,12 @@ val notCovered = sourceless + internal + unpublished val expectedCoverage = mutableMapOf( // These have lower coverage in general, it can be eventually fixed - "kotlinx-coroutines-swing" to 70, - "kotlinx-coroutines-android" to 50, + "kotlinx-coroutines-swing" to 70, // awaitFrame is not tested "kotlinx-coroutines-javafx" to 39, // JavaFx is not tested on TC because its graphic subsystem cannot be initialized in headless mode - // TODO figure it out, these probably should be fixed - "kotlinx-coroutines-debug" to 84, - "kotlinx-coroutines-reactive" to 65, + // Re-evaluate this along with Kover update where deprecated with error+ functions are not considered as uncovered: IDEA-287459 "kotlinx-coroutines-reactor" to 65, - "kotlinx-coroutines-rx2" to 78, - "kotlinx-coroutines-slf4j" to 81 + "kotlinx-coroutines-rx2" to 78 ) extensions.configure { @@ -51,4 +47,8 @@ subprojects { } } } + + tasks.withType { + htmlReportDir.set(file(rootProject.buildDir.toString() + "/kover/" + project.name + "/html")) + } } diff --git a/integration/kotlinx-coroutines-slf4j/test/MDCContextTest.kt b/integration/kotlinx-coroutines-slf4j/test/MDCContextTest.kt index 7d18359c5d..532c47e9ed 100644 --- a/integration/kotlinx-coroutines-slf4j/test/MDCContextTest.kt +++ b/integration/kotlinx-coroutines-slf4j/test/MDCContextTest.kt @@ -102,9 +102,10 @@ class MDCContextTest : TestBase() { val mainDispatcher = kotlin.coroutines.coroutineContext[ContinuationInterceptor]!! withContext(Dispatchers.Default + MDCContext()) { assertEquals("myValue", MDC.get("myKey")) + assertEquals("myValue", coroutineContext[MDCContext]?.contextMap?.get("myKey")) withContext(mainDispatcher) { assertEquals("myValue", MDC.get("myKey")) } } } -} \ No newline at end of file +} diff --git a/kotlinx-coroutines-debug/build.gradle b/kotlinx-coroutines-debug/build.gradle index 4830670d24..c01e70463f 100644 --- a/kotlinx-coroutines-debug/build.gradle +++ b/kotlinx-coroutines-debug/build.gradle @@ -51,3 +51,15 @@ shadowJar { configurations = [project.configurations.shadowDeps] relocate('net.bytebuddy', 'kotlinx.coroutines.repackaged.net.bytebuddy') } + +def commonKoverExcludes = + // Never used, safety mechanism + ["kotlinx.coroutines.debug.internal.NoOpProbesKt"] + +tasks.koverHtmlReport { + excludes = commonKoverExcludes +} + +tasks.koverVerify { + excludes = commonKoverExcludes +} diff --git a/kotlinx-coroutines-debug/test/ToStringTest.kt b/kotlinx-coroutines-debug/test/ToStringTest.kt index 0a9e84efad..0ea412b55d 100644 --- a/kotlinx-coroutines-debug/test/ToStringTest.kt +++ b/kotlinx-coroutines-debug/test/ToStringTest.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import org.junit.* import org.junit.Test +import java.io.* import kotlin.coroutines.* import kotlin.test.* @@ -105,6 +106,8 @@ class ToStringTest : TestBase() { expect(6) assertEquals(expected, DebugProbes.jobToString(root).trimEnd().trimStackTrace().trimPackage()) assertEquals(expected, DebugProbes.scopeToString(CoroutineScope(root)).trimEnd().trimStackTrace().trimPackage()) + assertEquals(expected, printToString { DebugProbes.printScope(CoroutineScope(root), it) }.trimEnd().trimStackTrace().trimPackage()) + assertEquals(expected, printToString { DebugProbes.printJob(root, it) }.trimEnd().trimStackTrace().trimPackage()) root.cancelAndJoin() finish(7) @@ -145,4 +148,12 @@ class ToStringTest : TestBase() { } } } + + private inline fun printToString(block: (PrintStream) -> Unit): String { + val baos = ByteArrayOutputStream() + val ps = PrintStream(baos) + block(ps) + ps.close() + return baos.toString() + } } diff --git a/reactive/kotlinx-coroutines-reactive/build.gradle.kts b/reactive/kotlinx-coroutines-reactive/build.gradle.kts index 128d4d86ab..b624069c60 100644 --- a/reactive/kotlinx-coroutines-reactive/build.gradle.kts +++ b/reactive/kotlinx-coroutines-reactive/build.gradle.kts @@ -34,3 +34,17 @@ tasks.check { externalDocumentationLink( url = "https://www.reactive-streams.org/reactive-streams-$reactiveStreamsVersion-javadoc/" ) + +val commonKoverExcludes = listOf( + "kotlinx.coroutines.reactive.FlowKt", // Deprecated + "kotlinx.coroutines.reactive.FlowKt__MigrationKt", // Deprecated + "kotlinx.coroutines.reactive.ConvertKt" // Deprecated +) + +tasks.koverHtmlReport { + excludes = commonKoverExcludes +} + +tasks.koverVerify { + excludes = commonKoverExcludes +} diff --git a/reactive/kotlinx-coroutines-reactor/build.gradle.kts b/reactive/kotlinx-coroutines-reactor/build.gradle.kts index 03af7f4fda..5abf3862dc 100644 --- a/reactive/kotlinx-coroutines-reactor/build.gradle.kts +++ b/reactive/kotlinx-coroutines-reactor/build.gradle.kts @@ -27,3 +27,15 @@ tasks { externalDocumentationLink( url = "https://projectreactor.io/docs/core/$reactorVersion/api/" ) + +val commonKoverExcludes = listOf( + "kotlinx.coroutines.reactor.FlowKt" // Deprecated +) + +tasks.koverHtmlReport { + excludes = commonKoverExcludes +} + +tasks.koverVerify { + excludes = commonKoverExcludes +} diff --git a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt index ffd5df060c..5e33169dd1 100644 --- a/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt +++ b/ui/kotlinx-coroutines-android/src/HandlerDispatcher.kt @@ -190,7 +190,7 @@ public suspend fun awaitFrame(): Long { postFrameCallback(choreographer, cont) } } - // post into looper thread thread to figure it out + // post into looper thread to figure it out return suspendCancellableCoroutine { cont -> Dispatchers.Main.dispatch(EmptyCoroutineContext, Runnable { updateChoreographerAndPostFrameCallback(cont) diff --git a/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt b/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt new file mode 100644 index 0000000000..4aa44eceaf --- /dev/null +++ b/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.android + +import kotlinx.coroutines.* +import org.junit.Test +import org.junit.runner.* +import org.robolectric.* +import org.robolectric.annotation.* +import kotlin.test.* + +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE, sdk = [27]) +class AndroidExceptionPreHandlerTest : TestBase() { + @Test + fun testUnhandledException() = runTest { + val previousHandler = Thread.getDefaultUncaughtExceptionHandler() + try { + Thread.setDefaultUncaughtExceptionHandler { _, e -> + expect(3) + assertIs(e) + } + expect(1) + GlobalScope.launch(Dispatchers.Main) { + expect(2) + throw TestException() + }.join() + finish(4) + } finally { + Thread.setDefaultUncaughtExceptionHandler(previousHandler) + } + } +} diff --git a/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt b/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt new file mode 100644 index 0000000000..7b03e771f9 --- /dev/null +++ b/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt @@ -0,0 +1,145 @@ +/* + * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.android + +import android.os.* +import kotlinx.coroutines.* +import org.junit.Test +import org.junit.runner.* +import org.robolectric.* +import org.robolectric.Shadows.* +import org.robolectric.annotation.* +import org.robolectric.shadows.* +import org.robolectric.util.* +import java.util.concurrent.* +import kotlin.test.* + +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE, sdk = [28]) +class HandlerDispatcherAsyncTest : TestBase() { + + /** + * Because [Dispatchers.Main] is a singleton, we cannot vary its initialization behavior. As a + * result we only test its behavior on the newest API level and assert that it uses async + * messages. We rely on the other tests to exercise the variance of the mechanism that the main + * dispatcher uses to ensure it has correct behavior on all API levels. + */ + @Test + fun mainIsAsync() = runTest { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) + + val mainLooper = shadowOf(Looper.getMainLooper()) + mainLooper.pause() + val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + + val job = launch(Dispatchers.Main) { + expect(2) + } + + val message = mainMessageQueue.head + assertTrue(message.isAsynchronous) + job.join(mainLooper) + } + + @Test + fun asyncMessagesApi14() = runTest { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 14) + + val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() + + val mainLooper = shadowOf(Looper.getMainLooper()) + mainLooper.pause() + val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + + val job = launch(main) { + expect(2) + } + + val message = mainMessageQueue.head + assertFalse(message.isAsynchronous) + job.join(mainLooper) + } + + @Test + fun asyncMessagesApi16() = runTest { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 16) + + val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() + + val mainLooper = shadowOf(Looper.getMainLooper()) + mainLooper.pause() + val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + + val job = launch(main) { + expect(2) + } + + val message = mainMessageQueue.head + assertTrue(message.isAsynchronous) + job.join(mainLooper) + } + + @Test + fun asyncMessagesApi28() = runTest { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) + + val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() + + val mainLooper = shadowOf(Looper.getMainLooper()) + mainLooper.pause() + val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + + val job = launch(main) { + expect(2) + } + + val message = mainMessageQueue.head + assertTrue(message.isAsynchronous) + job.join(mainLooper) + } + + @Test + fun noAsyncMessagesIfNotRequested() = runTest { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) + + val main = Looper.getMainLooper().asHandler(async = false).asCoroutineDispatcher() + + val mainLooper = shadowOf(Looper.getMainLooper()) + mainLooper.pause() + val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + + val job = launch(main) { + expect(2) + } + + val message = mainMessageQueue.head + assertFalse(message.isAsynchronous) + job.join(mainLooper) + } + + @Test + fun testToString() { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) + val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher("testName") + assertEquals("testName", main.toString()) + assertEquals("testName.immediate", main.immediate.toString()) + assertEquals("testName.immediate", main.immediate.immediate.toString()) + } + + private suspend fun Job.join(mainLooper: ShadowLooper) { + expect(1) + mainLooper.unPause() + join() + finish(3) + } + + // TODO compile against API 23+ so this can be invoked without reflection. + private val Looper.queue: MessageQueue + get() = Looper::class.java.getDeclaredMethod("getQueue").invoke(this) as MessageQueue + + // TODO compile against API 22+ so this can be invoked without reflection. + private val Message.isAsynchronous: Boolean + get() = Message::class.java.getDeclaredMethod("isAsynchronous").invoke(this) as Boolean +} diff --git a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt index af17adfc00..24758444b0 100644 --- a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt +++ b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ package kotlinx.coroutines.android @@ -9,173 +9,131 @@ import kotlinx.coroutines.* import org.junit.Test import org.junit.runner.* import org.robolectric.* -import org.robolectric.Shadows.* import org.robolectric.annotation.* import org.robolectric.shadows.* -import org.robolectric.util.* +import java.util.concurrent.* import kotlin.test.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) class HandlerDispatcherTest : TestBase() { - - /** - * Because [Dispatchers.Main] is a singleton, we cannot vary its initialization behavior. As a - * result we only test its behavior on the newest API level and assert that it uses async - * messages. We rely on the other tests to exercise the variance of the mechanism that the main - * dispatcher uses to ensure it has correct behavior on all API levels. - */ @Test - fun mainIsAsync() = runTest { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) - - val mainLooper = shadowOf(Looper.getMainLooper()) - mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) - - val job = launch(Dispatchers.Main) { + fun testImmediateDispatcherYield() = runBlocking(Dispatchers.Main) { + expect(1) + // launch in the immediate dispatcher + launch(Dispatchers.Main.immediate) { expect(2) + yield() + expect(4) } - - val message = mainMessageQueue.head - assertTrue(message.isAsynchronous) - job.join(mainLooper) + expect(3) // after yield + yield() // yield back + finish(5) } @Test - fun asyncMessagesApi14() = runTest { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 14) - - val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - - val mainLooper = shadowOf(Looper.getMainLooper()) - mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) - - val job = launch(main) { - expect(2) - } - - val message = mainMessageQueue.head - assertFalse(message.isAsynchronous) - job.join(mainLooper) + fun testMainDispatcherToString() { + assertEquals("Dispatchers.Main", Dispatchers.Main.toString()) + assertEquals("Dispatchers.Main.immediate", Dispatchers.Main.immediate.toString()) } @Test - fun asyncMessagesApi16() = runTest { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 16) - - val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - - val mainLooper = shadowOf(Looper.getMainLooper()) + fun testDefaultDelayIsNotDelegatedToMain() = runTest { + val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) + assertFalse { mainLooper.scheduler.areAnyRunnable() } - val job = launch(main) { - expect(2) + val job = launch(Dispatchers.Default, start = CoroutineStart.UNDISPATCHED) { + expect(1) + delay(Long.MAX_VALUE) + expectUnreached() } - - val message = mainMessageQueue.head - assertTrue(message.isAsynchronous) - job.join(mainLooper) + expect(2) + assertEquals(0, mainLooper.scheduler.size()) + job.cancelAndJoin() + finish(3) } @Test - fun asyncMessagesApi28() = runTest { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) - - val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher() - - val mainLooper = shadowOf(Looper.getMainLooper()) + fun testWithTimeoutIsDelegatedToMain() = runTest { + val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) - - val job = launch(main) { - expect(2) + assertFalse { mainLooper.scheduler.areAnyRunnable() } + val job = launch(Dispatchers.Main, start = CoroutineStart.UNDISPATCHED) { + withTimeout(1) { + expect(1) + hang { expect(3) } + } + expectUnreached() } - - val message = mainMessageQueue.head - assertTrue(message.isAsynchronous) - job.join(mainLooper) + expect(2) + assertEquals(1, mainLooper.scheduler.size()) + // Schedule cancellation + mainLooper.runToEndOfTasks() + job.join() + finish(4) } @Test - fun noAsyncMessagesIfNotRequested() = runTest { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) - - val main = Looper.getMainLooper().asHandler(async = false).asCoroutineDispatcher() - - val mainLooper = shadowOf(Looper.getMainLooper()) + fun testDelayDelegatedToMain() = runTest { + val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) - - val job = launch(main) { - expect(2) + val job = launch(Dispatchers.Main, start = CoroutineStart.UNDISPATCHED) { + expect(1) + delay(1) + expect(3) } - - val message = mainMessageQueue.head - assertFalse(message.isAsynchronous) - job.join(mainLooper) + expect(2) + assertEquals(1, mainLooper.scheduler.size()) + // Schedule cancellation + mainLooper.runToEndOfTasks() + job.join() + finish(4) } @Test - fun testToString() { - ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 28) - val main = Looper.getMainLooper().asHandler(async = true).asCoroutineDispatcher("testName") - assertEquals("testName", main.toString()) - assertEquals("testName.immediate", main.immediate.toString()) - assertEquals("testName.immediate", main.immediate.immediate.toString()) - } + fun testAwaitFrame() = runTest { + doTestAwaitFrame() - private suspend fun Job.join(mainLooper: ShadowLooper) { - expect(1) - mainLooper.unPause() - join() - finish(3) - } + reset() - // TODO compile against API 23+ so this can be invoked without reflection. - private val Looper.queue: MessageQueue - get() = Looper::class.java.getDeclaredMethod("getQueue").invoke(this) as MessageQueue - - // TODO compile against API 22+ so this can be invoked without reflection. - private val Message.isAsynchronous: Boolean - get() = Message::class.java.getDeclaredMethod("isAsynchronous").invoke(this) as Boolean - - @Test - fun testImmediateDispatcherYield() = runBlocking(Dispatchers.Main) { - expect(1) - // launch in the immediate dispatcher - launch(Dispatchers.Main.immediate) { - expect(2) - yield() - expect(4) - } - expect(3) // after yield - yield() // yield back - finish(5) + // Now the second test: we cannot test it separately because we're caching choreographer in HandlerDispatcher + doTestAwaitWithDetectedChoreographer() } - @Test - fun testMainDispatcherToString() { - assertEquals("Dispatchers.Main", Dispatchers.Main.toString()) - assertEquals("Dispatchers.Main.immediate", Dispatchers.Main.immediate.toString()) + private fun CoroutineScope.doTestAwaitFrame() { + ShadowChoreographer.setPostFrameCallbackDelay(100) + val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) + mainLooper.pause() + launch(Dispatchers.Main, start = CoroutineStart.UNDISPATCHED) { + expect(1) + awaitFrame() + expect(5) + } + expect(2) + // Run choreographer detection + mainLooper.runOneTask() + expect(3) + mainLooper.scheduler.advanceBy(50, TimeUnit.MILLISECONDS) + expect(4) + mainLooper.scheduler.advanceBy(51, TimeUnit.MILLISECONDS) + finish(6) } - @Test - fun testDelayIsNotDelegatedToMain() = runTest { - val mainLooper = shadowOf(Looper.getMainLooper()) - mainLooper.pause() - val mainMessageQueue = shadowOf(Looper.getMainLooper().queue) - assertNull(mainMessageQueue.head) - val job = launch(Dispatchers.Default, start = CoroutineStart.UNDISPATCHED) { + private fun CoroutineScope.doTestAwaitWithDetectedChoreographer() { + ShadowChoreographer.reset() + ShadowChoreographer.setPostFrameCallbackDelay(100) + val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) + launch(Dispatchers.Main, start = CoroutineStart.UNDISPATCHED) { expect(1) - delay(Long.MAX_VALUE) - expectUnreached() + awaitFrame() + expect(4) } + // Run choreographer detection expect(2) - assertNull(mainMessageQueue.head) - job.cancelAndJoin() - finish(3) + mainLooper.scheduler.advanceBy(50, TimeUnit.MILLISECONDS) + expect(3) + mainLooper.scheduler.advanceBy(51, TimeUnit.MILLISECONDS) + finish(5) } } From ff80ba2f8eeadf73396e100b08e0df138d2c8618 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 1 Feb 2022 16:51:01 +0300 Subject: [PATCH 250/328] Introduce private DiagnosticCoroutineContextException and add it to the original exception prior to passing it to the Thread.currentThread().uncaughtExceptionHandler() (#3170) Fixes #3153 --- .../jvm/src/CoroutineExceptionHandlerImpl.kt | 21 +++++++++++++++++++ .../CoroutineExceptionHandlerJvmTest.kt | 12 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt index 4c8c81b8db..dd39210d25 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt @@ -27,6 +27,24 @@ internal actual fun initializeDefaultExceptionHandlers() { CoroutineExceptionHandler } +/** + * Private exception without stacktrace that is added to suppressed exceptions of the original exception + * when it is reported to the last-ditch current thread 'uncaughtExceptionHandler'. + * + * The purpose of this exception is to add an otherwise inaccessible diagnostic information and to + * be able to poke the failing coroutine context in the debugger. + */ +private class DiagnosticCoroutineContextException(private val context: CoroutineContext) : RuntimeException() { + override fun getLocalizedMessage(): String { + return context.toString() + } + + override fun fillInStackTrace(): Throwable { + // Prevent Android <= 6.0 bug, #1866 + stackTrace = emptyArray() + return this + } +} internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // use additional extension handlers @@ -42,5 +60,8 @@ internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exce // use thread's handler val currentThread = Thread.currentThread() + // addSuppressed is never user-defined and cannot normally throw with the only exception being OOM + // we do ignore that just in case to definitely deliver the exception + runCatching { exception.addSuppressed(DiagnosticCoroutineContextException(context)) } currentThread.uncaughtExceptionHandler.uncaughtException(currentThread, exception) } diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/CoroutineExceptionHandlerJvmTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/CoroutineExceptionHandlerJvmTest.kt index cea9713f4a..2095f14886 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/CoroutineExceptionHandlerJvmTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/CoroutineExceptionHandlerJvmTest.kt @@ -39,4 +39,16 @@ class CoroutineExceptionHandlerJvmTest : TestBase() { finish(3) } + + @Test + fun testLastDitchHandlerContainsContextualInformation() = runBlocking { + expect(1) + GlobalScope.launch(CoroutineName("last-ditch")) { + expect(2) + throw TestException() + }.join() + assertTrue(caughtException is TestException) + assertContains(caughtException.suppressed[0].toString(), "last-ditch") + finish(3) + } } From 70d0ec7b81e7a1fa4f6ad9de9b0b38c98e34611b Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 11 Feb 2022 02:36:27 -0800 Subject: [PATCH 251/328] Update Dokka to 1.6.10 (#3184) * Update Dokka to 1.6.10 --- build.gradle | 2 -- buildSrc/build.gradle.kts | 1 - buildSrc/settings.gradle.kts | 1 - gradle.properties | 2 +- gradle/dokka.gradle.kts | 6 +----- 5 files changed, 2 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index d07f4767d9..bbf24f21d8 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,6 @@ buildscript { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } - maven { url 'https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev' } mavenLocal() } @@ -128,7 +127,6 @@ allprojects { google() mavenCentral() maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" } - maven { url 'https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev' } } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2637980a24..f4b64b3560 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -19,7 +19,6 @@ repositories { maven("https://plugins.gradle.org/m2") } maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev") - maven("https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev") if (buildSnapshotTrain) { mavenLocal() } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index e30c3ee597..c2e859f65d 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -4,7 +4,6 @@ pluginManagement { val build_snapshot_train: String? by settings repositories { - maven(url = "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/") val cacheRedirectorEnabled = System.getenv("CACHE_REDIRECTOR")?.toBoolean() == true if (cacheRedirectorEnabled) { println("Redirecting repositories for buildSrc buildscript") diff --git a/gradle.properties b/gradle.properties index 922f786fb1..7794ba71aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ atomicfu_version=0.17.0 knit_version=0.3.0 html_version=0.7.2 lincheck_version=2.14 -dokka_version=1.6.0-dev-138 +dokka_version=1.6.10 byte_buddy_version=1.10.9 reactor_version=3.4.1 reactive_streams_version=1.0.3 diff --git a/gradle/dokka.gradle.kts b/gradle/dokka.gradle.kts index a4926f7e61..8be4fbe231 100644 --- a/gradle/dokka.gradle.kts +++ b/gradle/dokka.gradle.kts @@ -37,7 +37,7 @@ tasks.withType(DokkaTaskPartial::class).configureEach { packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL()) } - if (project.name != "kotlinx-coroutines-core" && project.name != "kotlinx-coroutines-test") { + if (!project.isMultiplatform) { dependsOn(project.configurations["compileClasspath"]) doFirst { // resolve classpath only during execution @@ -66,10 +66,6 @@ if (project.name == "kotlinx-coroutines-core") { val jvmMain by getting { makeLinkMapping(project.file("jvm")) } - - configureEach { - classpath.from(project.configurations["jvmCompileClasspath"].files) - } } } } From 5841effaf9cee6f0839b072bd8aa8e05d01e054e Mon Sep 17 00:00:00 2001 From: Greg Tener Date: Mon, 14 Feb 2022 01:46:42 -0800 Subject: [PATCH 252/328] Modify the KDoc for awaitAll (#3187) It seems like there is an extra "when" and a missing "for". --- kotlinx-coroutines-core/common/src/Await.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Await.kt b/kotlinx-coroutines-core/common/src/Await.kt index e06ed33025..c1669e2554 100644 --- a/kotlinx-coroutines-core/common/src/Await.kt +++ b/kotlinx-coroutines-core/common/src/Await.kt @@ -29,8 +29,8 @@ public suspend fun awaitAll(vararg deferreds: Deferred): List = * when all deferred computations are complete or resumes with the first thrown exception if any of computations * complete exceptionally including cancellation. * - * This function is **not** equivalent to `this.map { it.await() }` which fails only when when it sequentially - * gets to wait the failing deferred, while this `awaitAll` fails immediately as soon as any of the deferreds fail. + * This function is **not** equivalent to `this.map { it.await() }` which fails only when it sequentially + * gets to wait for the failing deferred, while this `awaitAll` fails immediately as soon as any of the deferreds fail. * * This suspending function is cancellable. * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, From ed09ff858385a4e68fdcd7f126b6d02addc91798 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 16 Feb 2022 01:13:32 -0800 Subject: [PATCH 253/328] Update Kover to 0.5.0 (#3183) * Update Kover to 0.5.0 * Update robolectric to workaround https://github.com/robolectric/robolectric/issues/5456 and then workaround all the update consequences --- buildSrc/build.gradle.kts | 6 +++- buildSrc/src/main/kotlin/UnpackAar.kt | 33 ++++++++++++++++++- .../main/kotlin/kover-conventions.gradle.kts | 8 ++--- gradle.properties | 4 +-- .../build.gradle.kts | 31 ++++------------- .../build.gradle.kts | 3 +- .../android-unit-tests/build.gradle.kts | 9 ++++- .../tests/CustomizedRobolectricTest.kt | 3 +- .../ordered/tests/FirstRobolectricTest.kt | 1 + .../build.gradle.kts | 12 +++++-- .../test/AndroidExceptionPreHandlerTest.kt | 1 + .../test/DisabledHandlerTest.kt | 1 + .../test/HandlerDispatcherAsyncTest.kt | 1 + .../test/HandlerDispatcherTest.kt | 2 +- 14 files changed, 76 insertions(+), 39 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index f4b64b3560..eaa03f2f15 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -59,5 +59,9 @@ dependencies { exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") } implementation("ru.vyarus:gradle-animalsniffer-plugin:1.5.3") // Android API check - implementation("org.jetbrains.kotlinx:kover:${version("kover")}") + implementation("org.jetbrains.kotlinx:kover:${version("kover")}") { + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8") + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7") + exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib") + } } diff --git a/buildSrc/src/main/kotlin/UnpackAar.kt b/buildSrc/src/main/kotlin/UnpackAar.kt index b3152d7ab0..afe2627a3d 100644 --- a/buildSrc/src/main/kotlin/UnpackAar.kt +++ b/buildSrc/src/main/kotlin/UnpackAar.kt @@ -2,18 +2,49 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +import org.gradle.api.* import org.gradle.api.artifacts.transform.InputArtifact import org.gradle.api.artifacts.transform.TransformAction import org.gradle.api.artifacts.transform.TransformOutputs import org.gradle.api.artifacts.transform.TransformParameters +import org.gradle.api.attributes.* import org.gradle.api.file.FileSystemLocation import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.* import java.io.File import java.nio.file.Files import java.util.zip.ZipEntry import java.util.zip.ZipFile -// TODO move back to kotlinx-coroutines-play-services when it's migrated to the kts +// Attributes used by aar dependencies +val artifactType = Attribute.of("artifactType", String::class.java) +val unpackedAar = Attribute.of("unpackedAar", Boolean::class.javaObjectType) + +fun Project.configureAar() = configurations.configureEach { + afterEvaluate { + if (isCanBeResolved && !isCanBeConsumed) { + attributes.attribute(unpackedAar, true) // request all AARs to be unpacked + } + } +} + +fun DependencyHandlerScope.configureAarUnpacking() { + attributesSchema { + attribute(unpackedAar) + } + + artifactTypes { + create("aar") { + attributes.attribute(unpackedAar, false) + } + } + + registerTransform(UnpackAar::class.java) { + from.attribute(unpackedAar, false).attribute(artifactType, "aar") + to.attribute(unpackedAar, true).attribute(artifactType, "jar") + } +} + @Suppress("UnstableApiUsage") abstract class UnpackAar : TransformAction { @get:InputArtifact diff --git a/buildSrc/src/main/kotlin/kover-conventions.gradle.kts b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts index 125ddb19ea..052e2bb684 100644 --- a/buildSrc/src/main/kotlin/kover-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kover-conventions.gradle.kts @@ -13,10 +13,8 @@ val expectedCoverage = mutableMapOf( "kotlinx-coroutines-swing" to 70, // awaitFrame is not tested "kotlinx-coroutines-javafx" to 39, // JavaFx is not tested on TC because its graphic subsystem cannot be initialized in headless mode - // Re-evaluate this along with Kover update where deprecated with error+ functions are not considered as uncovered: IDEA-287459 - "kotlinx-coroutines-reactor" to 65, - "kotlinx-coroutines-rx2" to 78 -) + // Reactor has lower coverage in general due to various fatal error handling features + "kotlinx-coroutines-reactor" to 75) extensions.configure { disabledProjects = notCovered @@ -28,6 +26,8 @@ extensions.configure { * ./gradlew :p:koverReport -Pkover.enabled=true -- generates report */ isDisabled = !(properties["kover.enabled"]?.toString()?.toBoolean() ?: false) + // TODO remove when updating Kover to version 0.5.x + intellijEngineVersion.set("1.0.657") } subprojects { diff --git a/gradle.properties b/gradle.properties index 7794ba71aa..e06f587df7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,14 +23,14 @@ rxjava3_version=3.0.2 javafx_version=11.0.2 javafx_plugin_version=0.0.8 binary_compatibility_validator_version=0.8.0 -kover_version=0.5.0-RC2 +kover_version=0.5.0 blockhound_version=1.0.2.RELEASE jna_version=5.9.0 # Android versions android_version=4.1.1.4 androidx_annotation_version=1.1.0 -robolectric_version=4.0.2 +robolectric_version=4.4 baksmali_version=2.2.7 # JS diff --git a/integration/kotlinx-coroutines-play-services/build.gradle.kts b/integration/kotlinx-coroutines-play-services/build.gradle.kts index 59f3b0bd5a..9f8a128703 100644 --- a/integration/kotlinx-coroutines-play-services/build.gradle.kts +++ b/integration/kotlinx-coroutines-play-services/build.gradle.kts @@ -4,36 +4,17 @@ val tasksVersion = "16.0.1" -val artifactType = Attribute.of("artifactType", String::class.java) -val unpackedAar = Attribute.of("unpackedAar", Boolean::class.javaObjectType) - -configurations.configureEach { - afterEvaluate { - if (isCanBeResolved) { - attributes.attribute(unpackedAar, true) // request all AARs to be unpacked - } - } -} +project.configureAar() dependencies { - attributesSchema { - attribute(unpackedAar) - } - - artifactTypes { - create("aar") { - attributes.attribute(unpackedAar, false) - } - } - - registerTransform(UnpackAar::class.java) { - from.attribute(unpackedAar, false).attribute(artifactType, "aar") - to.attribute(unpackedAar, true).attribute(artifactType, "jar") - } - + configureAarUnpacking() api("com.google.android.gms:play-services-tasks:$tasksVersion") { exclude(group="com.android.support") } + + // Required by robolectric + testImplementation("androidx.test:core:1.2.0") + testImplementation("androidx.test:monitor:1.2.0") } externalDocumentationLink( diff --git a/reactive/kotlinx-coroutines-reactor/build.gradle.kts b/reactive/kotlinx-coroutines-reactor/build.gradle.kts index 5abf3862dc..1a36ccec28 100644 --- a/reactive/kotlinx-coroutines-reactor/build.gradle.kts +++ b/reactive/kotlinx-coroutines-reactor/build.gradle.kts @@ -29,7 +29,8 @@ externalDocumentationLink( ) val commonKoverExcludes = listOf( - "kotlinx.coroutines.reactor.FlowKt" // Deprecated + "kotlinx.coroutines.reactor.FlowKt", // Deprecated + "kotlinx.coroutines.reactor.ConvertKt\$asFlux$1" // Deprecated ) tasks.koverHtmlReport { diff --git a/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts b/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts index 2fd0b81479..625ce728b1 100644 --- a/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/android-unit-tests/build.gradle.kts @@ -2,10 +2,17 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +project.configureAar() + dependencies { - kotlinCompilerPluginClasspathMain(project(":kotlinx-coroutines-core")) + configureAarUnpacking() + testImplementation("com.google.android:android:${version("android")}") testImplementation("org.robolectric:robolectric:${version("robolectric")}") + // Required by robolectric + testImplementation("androidx.test:core:1.2.0") + testImplementation("androidx.test:monitor:1.2.0") + testImplementation(project(":kotlinx-coroutines-test")) testImplementation(project(":kotlinx-coroutines-android")) } diff --git a/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/CustomizedRobolectricTest.kt b/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/CustomizedRobolectricTest.kt index bcc12d5441..676ee4310d 100644 --- a/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/CustomizedRobolectricTest.kt +++ b/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/CustomizedRobolectricTest.kt @@ -26,6 +26,7 @@ class InitMainDispatcherBeforeRobolectricTestRunner(testClass: Class<*>) : Robol @Config(manifest = Config.NONE, sdk = [28]) @RunWith(InitMainDispatcherBeforeRobolectricTestRunner::class) +@LooperMode(LooperMode.Mode.LEGACY) class CustomizedRobolectricTest : TestBase() { @Test fun testComponent() { @@ -52,4 +53,4 @@ class CustomizedRobolectricTest : TestBase() { mainLooper.unPause() assertTrue(component.launchCompleted) } -} \ No newline at end of file +} diff --git a/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/FirstRobolectricTest.kt b/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/FirstRobolectricTest.kt index eab6fc17fb..99744f897f 100644 --- a/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/FirstRobolectricTest.kt +++ b/ui/kotlinx-coroutines-android/android-unit-tests/test/ordered/tests/FirstRobolectricTest.kt @@ -15,6 +15,7 @@ import kotlin.test.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) +@LooperMode(LooperMode.Mode.LEGACY) open class FirstRobolectricTest { @Test fun testComponent() { diff --git a/ui/kotlinx-coroutines-android/build.gradle.kts b/ui/kotlinx-coroutines-android/build.gradle.kts index 145ad9f6b4..7618c529f7 100644 --- a/ui/kotlinx-coroutines-android/build.gradle.kts +++ b/ui/kotlinx-coroutines-android/build.gradle.kts @@ -10,16 +10,24 @@ configurations { repositories { mavenCentral() - jcenter() // https://youtrack.jetbrains.com/issue/IDEA-261387 } + +project.configureAar() + dependencies { + configureAarUnpacking() + compileOnly("com.google.android:android:${version("android")}") compileOnly("androidx.annotation:annotation:${version("androidx_annotation")}") testImplementation("com.google.android:android:${version("android")}") testImplementation("org.robolectric:robolectric:${version("robolectric")}") - testImplementation("org.smali:baksmali:${version("baksmali")}") + // Required by robolectric + testImplementation("androidx.test:core:1.2.0") + testImplementation("androidx.test:monitor:1.2.0") + + testImplementation("org.smali:baksmali:${version("baksmali")}") "r8"("com.android.tools.build:builder:7.1.0-alpha01") } diff --git a/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt b/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt index 4aa44eceaf..1220797009 100644 --- a/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt +++ b/ui/kotlinx-coroutines-android/test/AndroidExceptionPreHandlerTest.kt @@ -13,6 +13,7 @@ import kotlin.test.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [27]) +@LooperMode(LooperMode.Mode.LEGACY) class AndroidExceptionPreHandlerTest : TestBase() { @Test fun testUnhandledException() = runTest { diff --git a/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt b/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt index a1f0a03d4a..a5b5ec95ee 100644 --- a/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt +++ b/ui/kotlinx-coroutines-android/test/DisabledHandlerTest.kt @@ -13,6 +13,7 @@ import org.robolectric.annotation.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) +@LooperMode(LooperMode.Mode.LEGACY) class DisabledHandlerTest : TestBase() { private var delegateToSuper = false diff --git a/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt b/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt index 7b03e771f9..c2091f339f 100644 --- a/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt +++ b/ui/kotlinx-coroutines-android/test/HandlerDispatcherAsyncTest.kt @@ -18,6 +18,7 @@ import kotlin.test.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) +@LooperMode(LooperMode.Mode.LEGACY) class HandlerDispatcherAsyncTest : TestBase() { /** diff --git a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt index 24758444b0..fe97ae8d27 100644 --- a/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt +++ b/ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt @@ -16,6 +16,7 @@ import kotlin.test.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) +@LooperMode(LooperMode.Mode.LEGACY) class HandlerDispatcherTest : TestBase() { @Test fun testImmediateDispatcherYield() = runBlocking(Dispatchers.Main) { @@ -121,7 +122,6 @@ class HandlerDispatcherTest : TestBase() { } private fun CoroutineScope.doTestAwaitWithDetectedChoreographer() { - ShadowChoreographer.reset() ShadowChoreographer.setPostFrameCallbackDelay(100) val mainLooper = Shadows.shadowOf(Looper.getMainLooper()) launch(Dispatchers.Main, start = CoroutineStart.UNDISPATCHED) { From 1029ad1f1ad3e18c15fa7445757f10a59d949a9c Mon Sep 17 00:00:00 2001 From: Roman Elizarov Date: Wed, 16 Feb 2022 13:39:23 +0300 Subject: [PATCH 254/328] docs: Clarify MutableSharedFlow.emit/tryEmit on subscribers and overflow (#3185) The details on how buffering conceptually works and what happens without subscribers are buried deep inside the SharedFlow docs. This clarification puts the important information right into the doc of emit and tryEmit methods. Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- .../common/src/flow/SharedFlow.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt index beb4255c09..0a291f258f 100644 --- a/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt +++ b/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt @@ -167,8 +167,15 @@ public interface SharedFlow : Flow { */ public interface MutableSharedFlow : SharedFlow, FlowCollector { /** - * Emits a [value] to this shared flow, suspending on buffer overflow if the shared flow was created - * with the default [BufferOverflow.SUSPEND] strategy. + * Emits a [value] to this shared flow, suspending on buffer overflow. + * + * This call can suspend only when the [BufferOverflow] strategy is + * [SUSPEND][BufferOverflow.SUSPEND] **and** there are subscribers collecting this shared flow. + * + * If there are no subscribers, the buffer is not used. + * Instead, the most recently emitted value is simply stored into + * the replay cache if one was configured, displacing the older elements there, + * or dropped if no replay cache was configured. * * See [tryEmit] for a non-suspending variant of this function. * @@ -179,12 +186,16 @@ public interface MutableSharedFlow : SharedFlow, FlowCollector { /** * Tries to emit a [value] to this shared flow without suspending. It returns `true` if the value was - * emitted successfully. When this function returns `false`, it means that the call to a plain [emit] - * function will suspend until there is a buffer space available. + * emitted successfully (see below). When this function returns `false`, it means that a call to a plain [emit] + * function would suspend until there is buffer space available. + * + * This call can return `false` only when the [BufferOverflow] strategy is + * [SUSPEND][BufferOverflow.SUSPEND] **and** there are subscribers collecting this shared flow. * - * A shared flow configured with a [BufferOverflow] strategy other than [SUSPEND][BufferOverflow.SUSPEND] - * (either [DROP_OLDEST][BufferOverflow.DROP_OLDEST] or [DROP_LATEST][BufferOverflow.DROP_LATEST]) never - * suspends on [emit], and thus `tryEmit` to such a shared flow always returns `true`. + * If there are no subscribers, the buffer is not used. + * Instead, the most recently emitted value is simply stored into + * the replay cache if one was configured, displacing the older elements there, + * or dropped if no replay cache was configured. In any case, `tryEmit` returns `true`. * * This method is **thread-safe** and can be safely invoked from concurrent coroutines without * external synchronization. From 70ae22b3f0cd718a9ef4f8b2d3147372c2324bd9 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 17 Feb 2022 02:27:01 -0800 Subject: [PATCH 255/328] Revert "Eagerly load CoroutineExceptionHandler and load corresponding service (#2957)" (#3190) This reverts commit 0b65246a32a81da724fc920d9f62f1670dff7d35. --- .../common/src/CoroutineExceptionHandler.kt | 8 +------- kotlinx-coroutines-core/common/src/Job.kt | 8 +------- .../js/src/CoroutineExceptionHandlerImpl.kt | 4 ---- .../jvm/src/CoroutineExceptionHandlerImpl.kt | 5 ----- .../native/src/CoroutineExceptionHandlerImpl.kt | 4 ---- 5 files changed, 2 insertions(+), 27 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt b/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt index 819f205b17..49923a92e7 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineExceptionHandler.kt @@ -1,19 +1,13 @@ /* * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ + package kotlinx.coroutines import kotlin.coroutines.* -import kotlin.jvm.* internal expect fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) -/** - * JVM kludge: trigger loading of all the classes and service loading - * **before** any exception occur because it may be OOM, SOE or VerifyError - */ -internal expect fun initializeDefaultExceptionHandlers() - /** * Helper function for coroutine builder implementations to handle uncaught and unexpected exceptions in coroutines, * that could not be otherwise handled in a normal way through structured concurrency, saving them to a future, and diff --git a/kotlinx-coroutines-core/common/src/Job.kt b/kotlinx-coroutines-core/common/src/Job.kt index 085ef7e8af..31d90eeef0 100644 --- a/kotlinx-coroutines-core/common/src/Job.kt +++ b/kotlinx-coroutines-core/common/src/Job.kt @@ -113,13 +113,7 @@ public interface Job : CoroutineContext.Element { /** * Key for [Job] instance in the coroutine context. */ - public companion object Key : CoroutineContext.Key { - init { - // `Job` will necessarily be accessed early, so this is as good a place as any for the - // initialization logic that we want to happen as soon as possible - initializeDefaultExceptionHandlers() - } - } + public companion object Key : CoroutineContext.Key // ------------ state query ------------ diff --git a/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt index a4d671dc65..54a65e10a6 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineExceptionHandlerImpl.kt @@ -6,10 +6,6 @@ package kotlinx.coroutines import kotlin.coroutines.* -internal actual fun initializeDefaultExceptionHandlers() { - // Do nothing -} - internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // log exception console.error(exception) diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt index dd39210d25..4259092e78 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt @@ -22,11 +22,6 @@ private val handlers: List = ServiceLoader.load( CoroutineExceptionHandler::class.java.classLoader ).iterator().asSequence().toList() -internal actual fun initializeDefaultExceptionHandlers() { - // Load CEH and handlers - CoroutineExceptionHandler -} - /** * Private exception without stacktrace that is added to suppressed exceptions of the original exception * when it is reported to the last-ditch current thread 'uncaughtExceptionHandler'. diff --git a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt index d97743b4bf..434813dc29 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineExceptionHandlerImpl.kt @@ -7,10 +7,6 @@ package kotlinx.coroutines import kotlin.coroutines.* import kotlin.native.* -internal actual fun initializeDefaultExceptionHandlers() { - // Do nothing -} - @OptIn(ExperimentalStdlibApi::class) internal actual fun handleCoroutineExceptionImpl(context: CoroutineContext, exception: Throwable) { // log exception From d5f852c3345438d9b8196a59af3482afc50d857b Mon Sep 17 00:00:00 2001 From: rechee Date: Sun, 19 Apr 2020 00:58:52 -0700 Subject: [PATCH 256/328] Provide a way to use CoroutineDispatcher as an Rx's Scheduler. Fixes #968 Fixes #548 --- .../api/kotlinx-coroutines-rx2.api | 4 +- .../kotlinx-coroutines-rx2/src/RxScheduler.kt | 139 +++++- .../test/SchedulerStressTest.kt | 87 ++++ .../test/SchedulerTest.kt | 470 +++++++++++++++++- .../api/kotlinx-coroutines-rx3.api | 4 +- .../kotlinx-coroutines-rx3/src/RxScheduler.kt | 138 ++++- .../test/SchedulerStressTest.kt | 87 ++++ .../test/SchedulerTest.kt | 468 ++++++++++++++++- 8 files changed, 1379 insertions(+), 18 deletions(-) create mode 100644 reactive/kotlinx-coroutines-rx2/test/SchedulerStressTest.kt create mode 100644 reactive/kotlinx-coroutines-rx3/test/SchedulerStressTest.kt diff --git a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api index 7cc594496e..c2d1c4bf1d 100644 --- a/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api +++ b/reactive/kotlinx-coroutines-rx2/api/kotlinx-coroutines-rx2.api @@ -69,7 +69,9 @@ public final class kotlinx/coroutines/rx2/RxObservableKt { } public final class kotlinx/coroutines/rx2/RxSchedulerKt { - public static final fun asCoroutineDispatcher (Lio/reactivex/Scheduler;)Lkotlinx/coroutines/rx2/SchedulerCoroutineDispatcher; + public static final fun asCoroutineDispatcher (Lio/reactivex/Scheduler;)Lkotlinx/coroutines/CoroutineDispatcher; + public static final synthetic fun asCoroutineDispatcher (Lio/reactivex/Scheduler;)Lkotlinx/coroutines/rx2/SchedulerCoroutineDispatcher; + public static final fun asScheduler (Lkotlinx/coroutines/CoroutineDispatcher;)Lio/reactivex/Scheduler; } public final class kotlinx/coroutines/rx2/RxSingleKt { diff --git a/reactive/kotlinx-coroutines-rx2/src/RxScheduler.kt b/reactive/kotlinx-coroutines-rx2/src/RxScheduler.kt index 0262fc12f7..d7d5f6cfbf 100644 --- a/reactive/kotlinx-coroutines-rx2/src/RxScheduler.kt +++ b/reactive/kotlinx-coroutines-rx2/src/RxScheduler.kt @@ -4,16 +4,143 @@ package kotlinx.coroutines.rx2 -import io.reactivex.Scheduler +import io.reactivex.* +import io.reactivex.disposables.* +import io.reactivex.plugins.* +import kotlinx.atomicfu.* import kotlinx.coroutines.* -import java.util.concurrent.TimeUnit -import kotlin.coroutines.CoroutineContext +import kotlinx.coroutines.channels.* +import java.util.concurrent.* +import kotlin.coroutines.* /** * Converts an instance of [Scheduler] to an implementation of [CoroutineDispatcher] * and provides native support of [delay] and [withTimeout]. */ -public fun Scheduler.asCoroutineDispatcher(): SchedulerCoroutineDispatcher = SchedulerCoroutineDispatcher(this) +public fun Scheduler.asCoroutineDispatcher(): CoroutineDispatcher = + if (this is DispatcherScheduler) { + dispatcher + } else { + SchedulerCoroutineDispatcher(this) + } + +@Deprecated(level = DeprecationLevel.HIDDEN, message = "Since 1.4.2, binary compatibility with earlier versions") +@JvmName("asCoroutineDispatcher") +public fun Scheduler.asCoroutineDispatcher0(): SchedulerCoroutineDispatcher = + SchedulerCoroutineDispatcher(this) + +/** + * Converts an instance of [CoroutineDispatcher] to an implementation of [Scheduler]. + */ +public fun CoroutineDispatcher.asScheduler(): Scheduler = + if (this is SchedulerCoroutineDispatcher) { + scheduler + } else { + DispatcherScheduler(this) + } + +private class DispatcherScheduler(@JvmField val dispatcher: CoroutineDispatcher) : Scheduler() { + + private val schedulerJob = SupervisorJob() + + /** + * The scope for everything happening in this [DispatcherScheduler]. + * + * Running tasks, too, get launched under this scope, because [shutdown] should cancel the running tasks as well. + */ + private val scope = CoroutineScope(schedulerJob + dispatcher) + + /** + * The counter of created workers, for their pretty-printing. + */ + private val workerCounter = atomic(1L) + + override fun scheduleDirect(block: Runnable, delay: Long, unit: TimeUnit): Disposable = + scope.scheduleTask(block, unit.toMillis(delay)) { task -> + Runnable { scope.launch { task() } } + } + + override fun createWorker(): Worker = DispatcherWorker(workerCounter.getAndIncrement(), dispatcher, schedulerJob) + + override fun shutdown() { + schedulerJob.cancel() + } + + private class DispatcherWorker( + private val counter: Long, + private val dispatcher: CoroutineDispatcher, + parentJob: Job + ) : Worker() { + + private val workerJob = SupervisorJob(parentJob) + private val workerScope = CoroutineScope(workerJob + dispatcher) + private val blockChannel = Channel Unit>(Channel.UNLIMITED) + + init { + workerScope.launch { + blockChannel.consumeEach { + it() + } + } + } + + override fun schedule(block: Runnable, delay: Long, unit: TimeUnit): Disposable = + workerScope.scheduleTask(block, unit.toMillis(delay)) { task -> + Runnable { blockChannel.trySend(task) } + } + + override fun isDisposed(): Boolean = !workerScope.isActive + + override fun dispose() { + blockChannel.close() + workerJob.cancel() + } + + override fun toString(): String = "$dispatcher (worker $counter, ${if (isDisposed) "disposed" else "active"})" + } + + override fun toString(): String = dispatcher.toString() +} + +private typealias Task = suspend () -> Unit + +/** + * Schedule [block] so that an adapted version of it, wrapped in [adaptForScheduling], executes after [delayMillis] + * milliseconds. + */ +private fun CoroutineScope.scheduleTask( + block: Runnable, + delayMillis: Long, + adaptForScheduling: (Task) -> Runnable +): Disposable { + val ctx = coroutineContext + var handle: DisposableHandle? = null + val disposable = Disposables.fromRunnable { + // null if delay <= 0 + handle?.dispose() + } + val decoratedBlock = RxJavaPlugins.onSchedule(block) + suspend fun task() { + if (disposable.isDisposed) return + try { + runInterruptible { + decoratedBlock.run() + } + } catch (e: Throwable) { + handleUndeliverableException(e, ctx) + } + } + + val toSchedule = adaptForScheduling(::task) + if (!isActive) return Disposables.disposed() + if (delayMillis <= 0) { + toSchedule.run() + } else { + @Suppress("INVISIBLE_MEMBER") + ctx.delay.invokeOnTimeout(delayMillis, toSchedule, ctx).let { handle = it } + } + return disposable +} /** * Implements [CoroutineDispatcher] on top of an arbitrary [Scheduler]. @@ -45,8 +172,10 @@ public class SchedulerCoroutineDispatcher( /** @suppress */ override fun toString(): String = scheduler.toString() + /** @suppress */ override fun equals(other: Any?): Boolean = other is SchedulerCoroutineDispatcher && other.scheduler === scheduler + /** @suppress */ override fun hashCode(): Int = System.identityHashCode(scheduler) -} +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx2/test/SchedulerStressTest.kt b/reactive/kotlinx-coroutines-rx2/test/SchedulerStressTest.kt new file mode 100644 index 0000000000..ea33a9fa58 --- /dev/null +++ b/reactive/kotlinx-coroutines-rx2/test/SchedulerStressTest.kt @@ -0,0 +1,87 @@ +/* + * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.rx2 + +import kotlinx.coroutines.* +import org.junit.* +import java.util.concurrent.* + +class SchedulerStressTest : TestBase() { + @Before + fun setup() { + ignoreLostThreads("RxCachedThreadScheduler-", "RxCachedWorkerPoolEvictor-", "RxSchedulerPurge-") + } + + /** + * Test that we don't get an OOM if we schedule many jobs at once. + * It's expected that if you don't dispose you'd see an OOM error. + */ + @Test + fun testSchedulerDisposed(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableDisposed(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerDisposed(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableDisposed(worker::schedule) + } + + private suspend fun testRunnableDisposed(block: RxSchedulerBlockNoDelay) { + val n = 2000 * stressTestMultiplier + repeat(n) { + val a = ByteArray(1000000) //1MB + val disposable = block(Runnable { + keepMe(a) + expectUnreached() + }) + disposable.dispose() + yield() // allow the scheduled task to observe that it was disposed + } + } + + /** + * Test function that holds a reference. Used for testing OOM situations + */ + private fun keepMe(a: ByteArray) { + Thread.sleep(a.size / (a.size + 1) + 10L) + } + + /** + * Test that we don't get an OOM if we schedule many delayed jobs at once. It's expected that if you don't dispose that you'd + * see a OOM error. + */ + @Test + fun testSchedulerDisposedDuringDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableDisposedDuringDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerDisposedDuringDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableDisposedDuringDelay(worker::schedule) + } + + private fun testRunnableDisposedDuringDelay(block: RxSchedulerBlockWithDelay) { + val n = 2000 * stressTestMultiplier + repeat(n) { + val a = ByteArray(1000000) //1MB + val delayMillis: Long = 10 + val disposable = block(Runnable { + keepMe(a) + expectUnreached() + }, delayMillis, TimeUnit.MILLISECONDS) + disposable.dispose() + } + } +} \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx2/test/SchedulerTest.kt b/reactive/kotlinx-coroutines-rx2/test/SchedulerTest.kt index 26dbe8f4cf..194186718d 100644 --- a/reactive/kotlinx-coroutines-rx2/test/SchedulerTest.kt +++ b/reactive/kotlinx-coroutines-rx2/test/SchedulerTest.kt @@ -4,10 +4,18 @@ package kotlinx.coroutines.rx2 -import io.reactivex.schedulers.Schedulers +import io.reactivex.* +import io.reactivex.disposables.* +import io.reactivex.plugins.* +import io.reactivex.schedulers.* import kotlinx.coroutines.* -import org.junit.Before +import kotlinx.coroutines.sync.* +import org.junit.* import org.junit.Test +import java.lang.Runnable +import java.util.concurrent.* +import java.util.concurrent.atomic.AtomicReference +import kotlin.coroutines.* import kotlin.test.* class SchedulerTest : TestBase() { @@ -17,7 +25,7 @@ class SchedulerTest : TestBase() { } @Test - fun testIoScheduler(): Unit = runBlocking { + fun testIoScheduler(): Unit = runTest { expect(1) val mainThread = Thread.currentThread() withContext(Schedulers.io().asCoroutineDispatcher()) { @@ -31,4 +39,458 @@ class SchedulerTest : TestBase() { } finish(4) } -} \ No newline at end of file + + /** Tests [toString] implementations of [CoroutineDispatcher.asScheduler] and its [Scheduler.Worker]. */ + @Test + fun testSchedulerToString() { + val name = "Dispatchers.Default" + val scheduler = Dispatchers.Default.asScheduler() + assertContains(scheduler.toString(), name) + val worker = scheduler.createWorker() + val activeWorkerName = worker.toString() + assertContains(worker.toString(), name) + worker.dispose() + val disposedWorkerName = worker.toString() + assertNotEquals(activeWorkerName, disposedWorkerName) + } + + private fun runSchedulerTest(nThreads: Int = 1, action: (Scheduler) -> Unit) { + val future = CompletableFuture() + try { + newFixedThreadPoolContext(nThreads, "test").use { dispatcher -> + RxJavaPlugins.setErrorHandler { + if (!future.completeExceptionally(it)) { + handleUndeliverableException(it, dispatcher) + } + } + action(dispatcher.asScheduler()) + } + } finally { + RxJavaPlugins.setErrorHandler(null) + } + future.complete(Unit) + future.getNow(Unit) // rethrow any encountered errors + } + + private fun ensureSeparateThread(schedule: (Runnable, Long, TimeUnit) -> Unit, scheduleNoDelay: (Runnable) -> Unit) { + val mainThread = Thread.currentThread() + val cdl1 = CountDownLatch(1) + val cdl2 = CountDownLatch(1) + expect(1) + val thread = AtomicReference(null) + fun checkThread() { + val current = Thread.currentThread() + thread.getAndSet(current)?.let { assertEquals(it, current) } + } + schedule({ + assertNotSame(mainThread, Thread.currentThread()) + checkThread() + cdl2.countDown() + }, 300, TimeUnit.MILLISECONDS) + scheduleNoDelay { + expect(2) + checkThread() + assertNotSame(mainThread, Thread.currentThread()) + cdl1.countDown() + } + cdl1.await() + cdl2.await() + finish(3) + } + + /** + * Tests [Scheduler.scheduleDirect] for [CoroutineDispatcher.asScheduler] on a single-threaded dispatcher. + */ + @Test + fun testSingleThreadedDispatcherDirect(): Unit = runSchedulerTest(1) { + ensureSeparateThread(it::scheduleDirect, it::scheduleDirect) + } + + /** + * Tests [Scheduler.Worker.schedule] for [CoroutineDispatcher.asScheduler] running its tasks on the correct thread. + */ + @Test + fun testSingleThreadedWorker(): Unit = runSchedulerTest(1) { + val worker = it.createWorker() + ensureSeparateThread(worker::schedule, worker::schedule) + } + + private fun checkCancelling(schedule: (Runnable, Long, TimeUnit) -> Disposable) { + // cancel the task before it has a chance to run. + val handle1 = schedule({ + throw IllegalStateException("should have been successfully cancelled") + }, 10_000, TimeUnit.MILLISECONDS) + handle1.dispose() + // cancel the task after it started running. + val cdl1 = CountDownLatch(1) + val cdl2 = CountDownLatch(1) + val handle2 = schedule({ + cdl1.countDown() + cdl2.await() + if (Thread.interrupted()) + throw IllegalStateException("cancelling the task should not interrupt the thread") + }, 100, TimeUnit.MILLISECONDS) + cdl1.await() + handle2.dispose() + cdl2.countDown() + } + + /** + * Test cancelling [Scheduler.scheduleDirect] for [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testCancellingDirect(): Unit = runSchedulerTest { + checkCancelling(it::scheduleDirect) + } + + /** + * Test cancelling [Scheduler.Worker.schedule] for [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testCancellingWorker(): Unit = runSchedulerTest { + val worker = it.createWorker() + checkCancelling(worker::schedule) + } + + /** + * Test shutting down [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testShuttingDown() { + val n = 5 + runSchedulerTest(nThreads = n) { scheduler -> + val cdl1 = CountDownLatch(n) + val cdl2 = CountDownLatch(1) + val cdl3 = CountDownLatch(n) + repeat(n) { + scheduler.scheduleDirect { + cdl1.countDown() + try { + cdl2.await() + } catch (e: InterruptedException) { + // this is the expected outcome + cdl3.countDown() + } + } + } + cdl1.await() + scheduler.shutdown() + if (!cdl3.await(1, TimeUnit.SECONDS)) { + cdl2.countDown() + error("the tasks were not cancelled when the scheduler was shut down") + } + } + } + + /** Tests that there are no uncaught exceptions if [Disposable.dispose] on a worker happens when tasks are present. */ + @Test + fun testDisposingWorker() = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + yield() // so that the worker starts waiting on the channel + assertFalse(worker.isDisposed) + worker.dispose() + assertTrue(worker.isDisposed) + } + + /** Tests trying to use a [Scheduler.Worker]/[Scheduler] after [Scheduler.Worker.dispose]/[Scheduler.shutdown]. */ + @Test + fun testSchedulingAfterDisposing() = runSchedulerTest { + expect(1) + val worker = it.createWorker() + // use CDL to ensure that the worker has properly initialized + val cdl1 = CountDownLatch(1) + setScheduler(2, 3) + val disposable1 = worker.schedule { + cdl1.countDown() + } + cdl1.await() + expect(4) + assertFalse(disposable1.isDisposed) + setScheduler(6, -1) + // check that the worker automatically disposes of the tasks after being disposed + assertFalse(worker.isDisposed) + worker.dispose() + assertTrue(worker.isDisposed) + expect(5) + val disposable2 = worker.schedule { + expectUnreached() + } + assertTrue(disposable2.isDisposed) + setScheduler(7, 8) + // ensure that the scheduler still works + val cdl2 = CountDownLatch(1) + val disposable3 = it.scheduleDirect { + cdl2.countDown() + } + cdl2.await() + expect(9) + assertFalse(disposable3.isDisposed) + // check that the scheduler automatically disposes of the tasks after being shut down + it.shutdown() + setScheduler(10, -1) + val disposable4 = it.scheduleDirect { + expectUnreached() + } + assertTrue(disposable4.isDisposed) + RxJavaPlugins.setScheduleHandler(null) + finish(11) + } + + @Test + fun testSchedulerWithNoDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithNoDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerWithNoDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithNoDelay(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableWithNoDelay(block: RxSchedulerBlockNoDelay) { + expect(1) + suspendCancellableCoroutine { + block(Runnable { + expect(2) + it.resume(Unit) + }) + } + yield() + finish(3) + } + + @Test + fun testSchedulerWithDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect, 300) + } + + @Test + fun testSchedulerWorkerWithDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule, 300) + } + + @Test + fun testSchedulerWithZeroDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerWithZeroDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableWithDelay(block: RxSchedulerBlockWithDelay, delayMillis: Long = 0) { + expect(1) + suspendCancellableCoroutine { + block({ + expect(2) + it.resume(Unit) + }, delayMillis, TimeUnit.MILLISECONDS) + } + finish(3) + } + + @Test + fun testAsSchedulerWithNegativeDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect, -1) + } + + @Test + fun testAsSchedulerWorkerWithNegativeDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule, -1) + } + + @Test + fun testSchedulerImmediateDispose(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableImmediateDispose(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerImmediateDispose(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableImmediateDispose(scheduler.createWorker()::schedule) + } + + private fun testRunnableImmediateDispose(block: RxSchedulerBlockNoDelay) { + val disposable = block { + expectUnreached() + } + disposable.dispose() + } + + @Test + fun testConvertDispatcherToOriginalScheduler(): Unit = runTest { + val originalScheduler = Schedulers.io() + val dispatcher = originalScheduler.asCoroutineDispatcher() + val scheduler = dispatcher.asScheduler() + assertSame(originalScheduler, scheduler) + } + + @Test + fun testConvertSchedulerToOriginalDispatcher(): Unit = runTest { + val originalDispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = originalDispatcher.asScheduler() + val dispatcher = scheduler.asCoroutineDispatcher() + assertSame(originalDispatcher, dispatcher) + } + + @Test + fun testSchedulerExpectRxPluginsCall(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCall(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerExpectRxPluginsCall(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCall(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableExpectRxPluginsCall(block: RxSchedulerBlockNoDelay) { + expect(1) + setScheduler(2, 4) + suspendCancellableCoroutine { + block(Runnable { + expect(5) + it.resume(Unit) + }) + expect(3) + } + RxJavaPlugins.setScheduleHandler(null) + finish(6) + } + + @Test + fun testSchedulerExpectRxPluginsCallWithDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCallDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerExpectRxPluginsCallWithDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableExpectRxPluginsCallDelay(worker::schedule) + } + + private suspend fun testRunnableExpectRxPluginsCallDelay(block: RxSchedulerBlockWithDelay) { + expect(1) + setScheduler(2, 4) + suspendCancellableCoroutine { + block({ + expect(5) + it.resume(Unit) + }, 10, TimeUnit.MILLISECONDS) + expect(3) + } + RxJavaPlugins.setScheduleHandler(null) + finish(6) + } + + private fun setScheduler(expectedCountOnSchedule: Int, expectCountOnRun: Int) { + RxJavaPlugins.setScheduleHandler { + expect(expectedCountOnSchedule) + Runnable { + expect(expectCountOnRun) + it.run() + } + } + } + + /** + * Tests that [Scheduler.Worker] runs all work sequentially. + */ + @Test + fun testWorkerSequentialOrdering() = runTest { + expect(1) + val scheduler = Dispatchers.Default.asScheduler() + val worker = scheduler.createWorker() + val iterations = 100 + for (i in 0..iterations) { + worker.schedule { + expect(2 + i) + } + } + suspendCoroutine { + worker.schedule { + it.resume(Unit) + } + } + finish((iterations + 2) + 1) + } + + /** + * Test that ensures that delays are actually respected (tasks scheduled sooner in the future run before tasks scheduled later, + * even when the later task is submitted before the earlier one) + */ + @Test + fun testSchedulerRespectsDelays(): Unit = runTest { + val scheduler = Dispatchers.Default.asScheduler() + testRunnableRespectsDelays(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerRespectsDelays(): Unit = runTest { + val scheduler = Dispatchers.Default.asScheduler() + testRunnableRespectsDelays(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableRespectsDelays(block: RxSchedulerBlockWithDelay) { + expect(1) + val semaphore = Semaphore(2, 2) + block({ + expect(3) + semaphore.release() + }, 100, TimeUnit.MILLISECONDS) + block({ + expect(2) + semaphore.release() + }, 1, TimeUnit.MILLISECONDS) + semaphore.acquire() + semaphore.acquire() + finish(4) + } + + /** + * Tests that cancelling a runnable in one worker doesn't affect work in another scheduler. + * + * This is part of expected behavior documented. + */ + @Test + fun testMultipleWorkerCancellation(): Unit = runTest { + expect(1) + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + suspendCancellableCoroutine { + val workerOne = scheduler.createWorker() + workerOne.schedule({ + expect(3) + it.resume(Unit) + }, 50, TimeUnit.MILLISECONDS) + val workerTwo = scheduler.createWorker() + workerTwo.schedule({ + expectUnreached() + }, 1000, TimeUnit.MILLISECONDS) + workerTwo.dispose() + expect(2) + } + finish(4) + } +} + +typealias RxSchedulerBlockNoDelay = (Runnable) -> Disposable +typealias RxSchedulerBlockWithDelay = (Runnable, Long, TimeUnit) -> Disposable \ No newline at end of file diff --git a/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api b/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api index f6f3f1d06d..5776214b0a 100644 --- a/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api +++ b/reactive/kotlinx-coroutines-rx3/api/kotlinx-coroutines-rx3.api @@ -58,7 +58,9 @@ public final class kotlinx/coroutines/rx3/RxObservableKt { } public final class kotlinx/coroutines/rx3/RxSchedulerKt { - public static final fun asCoroutineDispatcher (Lio/reactivex/rxjava3/core/Scheduler;)Lkotlinx/coroutines/rx3/SchedulerCoroutineDispatcher; + public static final fun asCoroutineDispatcher (Lio/reactivex/rxjava3/core/Scheduler;)Lkotlinx/coroutines/CoroutineDispatcher; + public static final synthetic fun asCoroutineDispatcher (Lio/reactivex/rxjava3/core/Scheduler;)Lkotlinx/coroutines/rx3/SchedulerCoroutineDispatcher; + public static final fun asScheduler (Lkotlinx/coroutines/CoroutineDispatcher;)Lio/reactivex/rxjava3/core/Scheduler; } public final class kotlinx/coroutines/rx3/RxSingleKt { diff --git a/reactive/kotlinx-coroutines-rx3/src/RxScheduler.kt b/reactive/kotlinx-coroutines-rx3/src/RxScheduler.kt index 24c3f11834..abaf02450a 100644 --- a/reactive/kotlinx-coroutines-rx3/src/RxScheduler.kt +++ b/reactive/kotlinx-coroutines-rx3/src/RxScheduler.kt @@ -4,16 +4,144 @@ package kotlinx.coroutines.rx3 -import io.reactivex.rxjava3.core.Scheduler +import io.reactivex.rxjava3.core.* +import io.reactivex.rxjava3.disposables.* +import io.reactivex.rxjava3.plugins.* +import kotlinx.atomicfu.* import kotlinx.coroutines.* -import java.util.concurrent.TimeUnit -import kotlin.coroutines.CoroutineContext +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.channels.* +import java.util.concurrent.* +import kotlin.coroutines.* /** * Converts an instance of [Scheduler] to an implementation of [CoroutineDispatcher] * and provides native support of [delay] and [withTimeout]. */ -public fun Scheduler.asCoroutineDispatcher(): SchedulerCoroutineDispatcher = SchedulerCoroutineDispatcher(this) +public fun Scheduler.asCoroutineDispatcher(): CoroutineDispatcher = + if (this is DispatcherScheduler) { + dispatcher + } else { + SchedulerCoroutineDispatcher(this) + } + +@Deprecated(level = DeprecationLevel.HIDDEN, message = "Since 1.4.2, binary compatibility with earlier versions") +@JvmName("asCoroutineDispatcher") +public fun Scheduler.asCoroutineDispatcher0(): SchedulerCoroutineDispatcher = + SchedulerCoroutineDispatcher(this) + +/** + * Converts an instance of [CoroutineDispatcher] to an implementation of [Scheduler]. + */ +public fun CoroutineDispatcher.asScheduler(): Scheduler = + if (this is SchedulerCoroutineDispatcher) { + scheduler + } else { + DispatcherScheduler(this) + } + +private class DispatcherScheduler(@JvmField val dispatcher: CoroutineDispatcher) : Scheduler() { + + private val schedulerJob = SupervisorJob() + + /** + * The scope for everything happening in this [DispatcherScheduler]. + * + * Running tasks, too, get launched under this scope, because [shutdown] should cancel the running tasks as well. + */ + private val scope = CoroutineScope(schedulerJob + dispatcher) + + /** + * The counter of created workers, for their pretty-printing. + */ + private val workerCounter = atomic(1L) + + override fun scheduleDirect(block: Runnable, delay: Long, unit: TimeUnit): Disposable = + scope.scheduleTask(block, unit.toMillis(delay)) { task -> + Runnable { scope.launch { task() } } + } + + override fun createWorker(): Worker = DispatcherWorker(workerCounter.getAndIncrement(), dispatcher, schedulerJob) + + override fun shutdown() { + schedulerJob.cancel() + } + + private class DispatcherWorker( + private val counter: Long, + private val dispatcher: CoroutineDispatcher, + parentJob: Job + ) : Worker() { + + private val workerJob = SupervisorJob(parentJob) + private val workerScope = CoroutineScope(workerJob + dispatcher) + private val blockChannel = Channel Unit>(Channel.UNLIMITED) + + init { + workerScope.launch { + blockChannel.consumeEach { + it() + } + } + } + + override fun schedule(block: Runnable, delay: Long, unit: TimeUnit): Disposable = + workerScope.scheduleTask(block, unit.toMillis(delay)) { task -> + Runnable { blockChannel.trySend(task) } + } + + override fun isDisposed(): Boolean = !workerScope.isActive + + override fun dispose() { + blockChannel.close() + workerJob.cancel() + } + + override fun toString(): String = "$dispatcher (worker $counter, ${if (isDisposed) "disposed" else "active"})" + } + + override fun toString(): String = dispatcher.toString() +} + +private typealias Task = suspend () -> Unit + +/** + * Schedule [block] so that an adapted version of it, wrapped in [adaptForScheduling], executes after [delayMillis] + * milliseconds. + */ +private fun CoroutineScope.scheduleTask( + block: Runnable, + delayMillis: Long, + adaptForScheduling: (Task) -> Runnable +): Disposable { + val ctx = coroutineContext + var handle: DisposableHandle? = null + val disposable = Disposable.fromRunnable { + // null if delay <= 0 + handle?.dispose() + } + val decoratedBlock = RxJavaPlugins.onSchedule(block) + suspend fun task() { + if (disposable.isDisposed) return + try { + runInterruptible { + decoratedBlock.run() + } + } catch (e: Throwable) { + handleUndeliverableException(e, ctx) + } + } + + val toSchedule = adaptForScheduling(::task) + if (!isActive) return Disposable.disposed() + if (delayMillis <= 0) { + toSchedule.run() + } else { + @Suppress("INVISIBLE_MEMBER") + ctx.delay.invokeOnTimeout(delayMillis, toSchedule, ctx).let { handle = it } + } + return disposable +} /** * Implements [CoroutineDispatcher] on top of an arbitrary [Scheduler]. @@ -45,8 +173,10 @@ public class SchedulerCoroutineDispatcher( /** @suppress */ override fun toString(): String = scheduler.toString() + /** @suppress */ override fun equals(other: Any?): Boolean = other is SchedulerCoroutineDispatcher && other.scheduler === scheduler + /** @suppress */ override fun hashCode(): Int = System.identityHashCode(scheduler) } diff --git a/reactive/kotlinx-coroutines-rx3/test/SchedulerStressTest.kt b/reactive/kotlinx-coroutines-rx3/test/SchedulerStressTest.kt new file mode 100644 index 0000000000..5abb511d72 --- /dev/null +++ b/reactive/kotlinx-coroutines-rx3/test/SchedulerStressTest.kt @@ -0,0 +1,87 @@ +/* + * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.rx3 + +import kotlinx.coroutines.* +import org.junit.* +import java.util.concurrent.* + +class SchedulerStressTest : TestBase() { + @Before + fun setup() { + ignoreLostThreads("RxCachedThreadScheduler-", "RxCachedWorkerPoolEvictor-", "RxSchedulerPurge-") + } + + /** + * Test that we don't get an OOM if we schedule many jobs at once. + * It's expected that if you don't dispose you'd see an OOM error. + */ + @Test + fun testSchedulerDisposed(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableDisposed(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerDisposed(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableDisposed(worker::schedule) + } + + private suspend fun testRunnableDisposed(block: RxSchedulerBlockNoDelay) { + val n = 2000 * stressTestMultiplier + repeat(n) { + val a = ByteArray(1000000) //1MB + val disposable = block(Runnable { + keepMe(a) + expectUnreached() + }) + disposable.dispose() + yield() // allow the scheduled task to observe that it was disposed + } + } + + /** + * Test function that holds a reference. Used for testing OOM situations + */ + private fun keepMe(a: ByteArray) { + Thread.sleep(a.size / (a.size + 1) + 10L) + } + + /** + * Test that we don't get an OOM if we schedule many delayed jobs at once. It's expected that if you don't dispose that you'd + * see a OOM error. + */ + @Test + fun testSchedulerDisposedDuringDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableDisposedDuringDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerDisposedDuringDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableDisposedDuringDelay(worker::schedule) + } + + private fun testRunnableDisposedDuringDelay(block: RxSchedulerBlockWithDelay) { + val n = 2000 * stressTestMultiplier + repeat(n) { + val a = ByteArray(1000000) //1MB + val delayMillis: Long = 10 + val disposable = block(Runnable { + keepMe(a) + expectUnreached() + }, delayMillis, TimeUnit.MILLISECONDS) + disposable.dispose() + } + } +} diff --git a/reactive/kotlinx-coroutines-rx3/test/SchedulerTest.kt b/reactive/kotlinx-coroutines-rx3/test/SchedulerTest.kt index 9e95c213d0..c966cdfd08 100644 --- a/reactive/kotlinx-coroutines-rx3/test/SchedulerTest.kt +++ b/reactive/kotlinx-coroutines-rx3/test/SchedulerTest.kt @@ -4,10 +4,18 @@ package kotlinx.coroutines.rx3 -import io.reactivex.rxjava3.schedulers.Schedulers +import io.reactivex.rxjava3.core.* +import io.reactivex.rxjava3.disposables.* +import io.reactivex.rxjava3.plugins.* +import io.reactivex.rxjava3.schedulers.* import kotlinx.coroutines.* -import org.junit.Before +import kotlinx.coroutines.sync.* +import org.junit.* import org.junit.Test +import java.lang.Runnable +import java.util.concurrent.* +import java.util.concurrent.atomic.AtomicReference +import kotlin.coroutines.* import kotlin.test.* class SchedulerTest : TestBase() { @@ -17,7 +25,7 @@ class SchedulerTest : TestBase() { } @Test - fun testIoScheduler(): Unit = runBlocking { + fun testIoScheduler(): Unit = runTest { expect(1) val mainThread = Thread.currentThread() withContext(Schedulers.io().asCoroutineDispatcher()) { @@ -31,4 +39,458 @@ class SchedulerTest : TestBase() { } finish(4) } + + /** Tests [toString] implementations of [CoroutineDispatcher.asScheduler] and its [Scheduler.Worker]. */ + @Test + fun testSchedulerToString() { + val name = "Dispatchers.Default" + val scheduler = Dispatchers.Default.asScheduler() + assertContains(scheduler.toString(), name) + val worker = scheduler.createWorker() + val activeWorkerName = worker.toString() + assertContains(worker.toString(), name) + worker.dispose() + val disposedWorkerName = worker.toString() + assertNotEquals(activeWorkerName, disposedWorkerName) + } + + private fun runSchedulerTest(nThreads: Int = 1, action: (Scheduler) -> Unit) { + val future = CompletableFuture() + try { + newFixedThreadPoolContext(nThreads, "test").use { dispatcher -> + RxJavaPlugins.setErrorHandler { + if (!future.completeExceptionally(it)) { + handleUndeliverableException(it, dispatcher) + } + } + action(dispatcher.asScheduler()) + } + } finally { + RxJavaPlugins.setErrorHandler(null) + } + future.complete(Unit) + future.getNow(Unit) // rethrow any encountered errors + } + + private fun ensureSeparateThread(schedule: (Runnable, Long, TimeUnit) -> Unit, scheduleNoDelay: (Runnable) -> Unit) { + val mainThread = Thread.currentThread() + val cdl1 = CountDownLatch(1) + val cdl2 = CountDownLatch(1) + expect(1) + val thread = AtomicReference(null) + fun checkThread() { + val current = Thread.currentThread() + thread.getAndSet(current)?.let { assertEquals(it, current) } + } + schedule({ + assertNotSame(mainThread, Thread.currentThread()) + checkThread() + cdl2.countDown() + }, 300, TimeUnit.MILLISECONDS) + scheduleNoDelay { + expect(2) + checkThread() + assertNotSame(mainThread, Thread.currentThread()) + cdl1.countDown() + } + cdl1.await() + cdl2.await() + finish(3) + } + + /** + * Tests [Scheduler.scheduleDirect] for [CoroutineDispatcher.asScheduler] on a single-threaded dispatcher. + */ + @Test + fun testSingleThreadedDispatcherDirect(): Unit = runSchedulerTest(1) { + ensureSeparateThread(it::scheduleDirect, it::scheduleDirect) + } + + /** + * Tests [Scheduler.Worker.schedule] for [CoroutineDispatcher.asScheduler] running its tasks on the correct thread. + */ + @Test + fun testSingleThreadedWorker(): Unit = runSchedulerTest(1) { + val worker = it.createWorker() + ensureSeparateThread(worker::schedule, worker::schedule) + } + + private fun checkCancelling(schedule: (Runnable, Long, TimeUnit) -> Disposable) { + // cancel the task before it has a chance to run. + val handle1 = schedule({ + throw IllegalStateException("should have been successfully cancelled") + }, 10_000, TimeUnit.MILLISECONDS) + handle1.dispose() + // cancel the task after it started running. + val cdl1 = CountDownLatch(1) + val cdl2 = CountDownLatch(1) + val handle2 = schedule({ + cdl1.countDown() + cdl2.await() + if (Thread.interrupted()) + throw IllegalStateException("cancelling the task should not interrupt the thread") + }, 100, TimeUnit.MILLISECONDS) + cdl1.await() + handle2.dispose() + cdl2.countDown() + } + + /** + * Test cancelling [Scheduler.scheduleDirect] for [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testCancellingDirect(): Unit = runSchedulerTest { + checkCancelling(it::scheduleDirect) + } + + /** + * Test cancelling [Scheduler.Worker.schedule] for [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testCancellingWorker(): Unit = runSchedulerTest { + val worker = it.createWorker() + checkCancelling(worker::schedule) + } + + /** + * Test shutting down [CoroutineDispatcher.asScheduler]. + */ + @Test + fun testShuttingDown() { + val n = 5 + runSchedulerTest(nThreads = n) { scheduler -> + val cdl1 = CountDownLatch(n) + val cdl2 = CountDownLatch(1) + val cdl3 = CountDownLatch(n) + repeat(n) { + scheduler.scheduleDirect { + cdl1.countDown() + try { + cdl2.await() + } catch (e: InterruptedException) { + // this is the expected outcome + cdl3.countDown() + } + } + } + cdl1.await() + scheduler.shutdown() + if (!cdl3.await(1, TimeUnit.SECONDS)) { + cdl2.countDown() + error("the tasks were not cancelled when the scheduler was shut down") + } + } + } + + /** Tests that there are no uncaught exceptions if [Disposable.dispose] on a worker happens when tasks are present. */ + @Test + fun testDisposingWorker() = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + yield() // so that the worker starts waiting on the channel + assertFalse(worker.isDisposed) + worker.dispose() + assertTrue(worker.isDisposed) + } + + /** Tests trying to use a [Scheduler.Worker]/[Scheduler] after [Scheduler.Worker.dispose]/[Scheduler.shutdown]. */ + @Test + fun testSchedulingAfterDisposing() = runSchedulerTest { + expect(1) + val worker = it.createWorker() + // use CDL to ensure that the worker has properly initialized + val cdl1 = CountDownLatch(1) + setScheduler(2, 3) + val disposable1 = worker.schedule { + cdl1.countDown() + } + cdl1.await() + expect(4) + assertFalse(disposable1.isDisposed) + setScheduler(6, -1) + // check that the worker automatically disposes of the tasks after being disposed + assertFalse(worker.isDisposed) + worker.dispose() + assertTrue(worker.isDisposed) + expect(5) + val disposable2 = worker.schedule { + expectUnreached() + } + assertTrue(disposable2.isDisposed) + setScheduler(7, 8) + // ensure that the scheduler still works + val cdl2 = CountDownLatch(1) + val disposable3 = it.scheduleDirect { + cdl2.countDown() + } + cdl2.await() + expect(9) + assertFalse(disposable3.isDisposed) + // check that the scheduler automatically disposes of the tasks after being shut down + it.shutdown() + setScheduler(10, -1) + val disposable4 = it.scheduleDirect { + expectUnreached() + } + assertTrue(disposable4.isDisposed) + RxJavaPlugins.setScheduleHandler(null) + finish(11) + } + + @Test + fun testSchedulerWithNoDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithNoDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerWithNoDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithNoDelay(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableWithNoDelay(block: RxSchedulerBlockNoDelay) { + expect(1) + suspendCancellableCoroutine { + block(Runnable { + expect(2) + it.resume(Unit) + }) + } + yield() + finish(3) + } + + @Test + fun testSchedulerWithDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect, 300) + } + + @Test + fun testSchedulerWorkerWithDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule, 300) + } + + @Test + fun testSchedulerWithZeroDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerWithZeroDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableWithDelay(block: RxSchedulerBlockWithDelay, delayMillis: Long = 0) { + expect(1) + suspendCancellableCoroutine { + block({ + expect(2) + it.resume(Unit) + }, delayMillis, TimeUnit.MILLISECONDS) + } + finish(3) + } + + @Test + fun testAsSchedulerWithNegativeDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler::scheduleDirect, -1) + } + + @Test + fun testAsSchedulerWorkerWithNegativeDelay(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableWithDelay(scheduler.createWorker()::schedule, -1) + } + + @Test + fun testSchedulerImmediateDispose(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableImmediateDispose(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerImmediateDispose(): Unit = runTest { + val scheduler = (currentDispatcher() as CoroutineDispatcher).asScheduler() + testRunnableImmediateDispose(scheduler.createWorker()::schedule) + } + + private fun testRunnableImmediateDispose(block: RxSchedulerBlockNoDelay) { + val disposable = block { + expectUnreached() + } + disposable.dispose() + } + + @Test + fun testConvertDispatcherToOriginalScheduler(): Unit = runTest { + val originalScheduler = Schedulers.io() + val dispatcher = originalScheduler.asCoroutineDispatcher() + val scheduler = dispatcher.asScheduler() + assertSame(originalScheduler, scheduler) + } + + @Test + fun testConvertSchedulerToOriginalDispatcher(): Unit = runTest { + val originalDispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = originalDispatcher.asScheduler() + val dispatcher = scheduler.asCoroutineDispatcher() + assertSame(originalDispatcher, dispatcher) + } + + @Test + fun testSchedulerExpectRxPluginsCall(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCall(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerExpectRxPluginsCall(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCall(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableExpectRxPluginsCall(block: RxSchedulerBlockNoDelay) { + expect(1) + setScheduler(2, 4) + suspendCancellableCoroutine { + block(Runnable { + expect(5) + it.resume(Unit) + }) + expect(3) + } + RxJavaPlugins.setScheduleHandler(null) + finish(6) + } + + @Test + fun testSchedulerExpectRxPluginsCallWithDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + testRunnableExpectRxPluginsCallDelay(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerExpectRxPluginsCallWithDelay(): Unit = runTest { + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + val worker = scheduler.createWorker() + testRunnableExpectRxPluginsCallDelay(worker::schedule) + } + + private suspend fun testRunnableExpectRxPluginsCallDelay(block: RxSchedulerBlockWithDelay) { + expect(1) + setScheduler(2, 4) + suspendCancellableCoroutine { + block({ + expect(5) + it.resume(Unit) + }, 10, TimeUnit.MILLISECONDS) + expect(3) + } + RxJavaPlugins.setScheduleHandler(null) + finish(6) + } + + private fun setScheduler(expectedCountOnSchedule: Int, expectCountOnRun: Int) { + RxJavaPlugins.setScheduleHandler { + expect(expectedCountOnSchedule) + Runnable { + expect(expectCountOnRun) + it.run() + } + } + } + + /** + * Tests that [Scheduler.Worker] runs all work sequentially. + */ + @Test + fun testWorkerSequentialOrdering() = runTest { + expect(1) + val scheduler = Dispatchers.Default.asScheduler() + val worker = scheduler.createWorker() + val iterations = 100 + for (i in 0..iterations) { + worker.schedule { + expect(2 + i) + } + } + suspendCoroutine { + worker.schedule { + it.resume(Unit) + } + } + finish((iterations + 2) + 1) + } + + /** + * Test that ensures that delays are actually respected (tasks scheduled sooner in the future run before tasks scheduled later, + * even when the later task is submitted before the earlier one) + */ + @Test + fun testSchedulerRespectsDelays(): Unit = runTest { + val scheduler = Dispatchers.Default.asScheduler() + testRunnableRespectsDelays(scheduler::scheduleDirect) + } + + @Test + fun testSchedulerWorkerRespectsDelays(): Unit = runTest { + val scheduler = Dispatchers.Default.asScheduler() + testRunnableRespectsDelays(scheduler.createWorker()::schedule) + } + + private suspend fun testRunnableRespectsDelays(block: RxSchedulerBlockWithDelay) { + expect(1) + val semaphore = Semaphore(2, 2) + block({ + expect(3) + semaphore.release() + }, 100, TimeUnit.MILLISECONDS) + block({ + expect(2) + semaphore.release() + }, 1, TimeUnit.MILLISECONDS) + semaphore.acquire() + semaphore.acquire() + finish(4) + } + + /** + * Tests that cancelling a runnable in one worker doesn't affect work in another scheduler. + * + * This is part of expected behavior documented. + */ + @Test + fun testMultipleWorkerCancellation(): Unit = runTest { + expect(1) + val dispatcher = currentDispatcher() as CoroutineDispatcher + val scheduler = dispatcher.asScheduler() + suspendCancellableCoroutine { + val workerOne = scheduler.createWorker() + workerOne.schedule({ + expect(3) + it.resume(Unit) + }, 50, TimeUnit.MILLISECONDS) + val workerTwo = scheduler.createWorker() + workerTwo.schedule({ + expectUnreached() + }, 1000, TimeUnit.MILLISECONDS) + workerTwo.dispose() + expect(2) + } + finish(4) + } } + +typealias RxSchedulerBlockNoDelay = (Runnable) -> Disposable +typealias RxSchedulerBlockWithDelay = (Runnable, Long, TimeUnit) -> Disposable \ No newline at end of file From 83ffd171466f840bca59561112e2e5a3dc62bde7 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 24 Feb 2022 01:25:43 -0800 Subject: [PATCH 257/328] =?UTF-8?q?Properly=20cleanup=20completion=20in=20?= =?UTF-8?q?SafeCollector=20to=20avoid=20unintended=20memo=E2=80=A6=20(#319?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Properly cleanup completion in SafeCollector to avoid unintended memory leak that regular coroutines (e.g. unsafe flow) are not prone to Also, FieldWalker is improved to avoid "illegal reflective access" Fixes #3197 Co-authored-by: Roman Elizarov --- .../jvm/src/flow/internal/SafeCollector.kt | 43 +++++++++++------ .../jvm/test/FieldWalker.kt | 14 ++++-- .../test/flow/SafeCollectorMemoryLeakTest.kt | 48 +++++++++++++++++++ 3 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/flow/SafeCollectorMemoryLeakTest.kt diff --git a/kotlinx-coroutines-core/jvm/src/flow/internal/SafeCollector.kt b/kotlinx-coroutines-core/jvm/src/flow/internal/SafeCollector.kt index ea973287a7..cad3f1aea4 100644 --- a/kotlinx-coroutines-core/jvm/src/flow/internal/SafeCollector.kt +++ b/kotlinx-coroutines-core/jvm/src/flow/internal/SafeCollector.kt @@ -29,15 +29,22 @@ internal actual class SafeCollector actual constructor( @JvmField // Note, it is non-capturing lambda, so no extra allocation during init of SafeCollector internal actual val collectContextSize = collectContext.fold(0) { count, _ -> count + 1 } + + // Either context of the last emission or wrapper 'DownstreamExceptionContext' private var lastEmissionContext: CoroutineContext? = null + // Completion if we are currently suspended or within completion body or null otherwise private var completion: Continuation? = null - // ContinuationImpl + /* + * This property is accessed in two places: + * * ContinuationImpl invokes this in its `releaseIntercepted` as `context[ContinuationInterceptor]!!` + * * When we are within a callee, it is used to create its continuation object with this collector as completion + */ override val context: CoroutineContext - get() = completion?.context ?: EmptyCoroutineContext + get() = lastEmissionContext ?: EmptyCoroutineContext override fun invokeSuspend(result: Result): Any { - result.onFailure { lastEmissionContext = DownstreamExceptionElement(it) } + result.onFailure { lastEmissionContext = DownstreamExceptionContext(it, context) } completion?.resumeWith(result as Result) return COROUTINE_SUSPENDED } @@ -59,7 +66,9 @@ internal actual class SafeCollector actual constructor( emit(uCont, value) } catch (e: Throwable) { // Save the fact that exception from emit (or even check context) has been thrown - lastEmissionContext = DownstreamExceptionElement(e) + // Note, that this can the first emit and lastEmissionContext may not be saved yet, + // hence we use `uCont.context` here. + lastEmissionContext = DownstreamExceptionContext(e, uCont.context) throw e } } @@ -72,9 +81,18 @@ internal actual class SafeCollector actual constructor( val previousContext = lastEmissionContext if (previousContext !== currentContext) { checkContext(currentContext, previousContext, value) + lastEmissionContext = currentContext } completion = uCont - return emitFun(collector as FlowCollector, value, this as Continuation) + val result = emitFun(collector as FlowCollector, value, this as Continuation) + /* + * If the callee hasn't suspended, that means that it won't (it's forbidden) call 'resumeWith` (-> `invokeSuspend`) + * and we don't have to retain a strong reference to it to avoid memory leaks. + */ + if (result != COROUTINE_SUSPENDED) { + completion = null + } + return result } private fun checkContext( @@ -82,14 +100,13 @@ internal actual class SafeCollector actual constructor( previousContext: CoroutineContext?, value: T ) { - if (previousContext is DownstreamExceptionElement) { + if (previousContext is DownstreamExceptionContext) { exceptionTransparencyViolated(previousContext, value) } checkContext(currentContext) - lastEmissionContext = currentContext } - private fun exceptionTransparencyViolated(exception: DownstreamExceptionElement, value: Any?) { + private fun exceptionTransparencyViolated(exception: DownstreamExceptionContext, value: Any?) { /* * Exception transparency ensures that if a `collect` block or any intermediate operator * throws an exception, then no more values will be received by it. @@ -122,14 +139,12 @@ internal actual class SafeCollector actual constructor( For a more detailed explanation, please refer to Flow documentation. """.trimIndent()) } - } -internal class DownstreamExceptionElement(@JvmField val e: Throwable) : CoroutineContext.Element { - companion object Key : CoroutineContext.Key - - override val key: CoroutineContext.Key<*> = Key -} +internal class DownstreamExceptionContext( + @JvmField val e: Throwable, + originalContext: CoroutineContext +) : CoroutineContext by originalContext private object NoOpContinuation : Continuation { override val context: CoroutineContext = EmptyCoroutineContext diff --git a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt index 52bcce3c69..7b2aaf63fc 100644 --- a/kotlinx-coroutines-core/jvm/test/FieldWalker.kt +++ b/kotlinx-coroutines-core/jvm/test/FieldWalker.kt @@ -9,6 +9,7 @@ import java.lang.reflect.* import java.text.* import java.util.* import java.util.Collections.* +import java.util.concurrent.* import java.util.concurrent.atomic.* import java.util.concurrent.locks.* import kotlin.test.* @@ -26,11 +27,11 @@ object FieldWalker { // excluded/terminal classes (don't walk them) fieldsCache += listOf( Any::class, String::class, Thread::class, Throwable::class, StackTraceElement::class, - WeakReference::class, ReferenceQueue::class, AbstractMap::class, - ReentrantReadWriteLock::class, SimpleDateFormat::class + WeakReference::class, ReferenceQueue::class, AbstractMap::class, Enum::class, + ReentrantLock::class, ReentrantReadWriteLock::class, SimpleDateFormat::class, ThreadPoolExecutor::class, ) .map { it.java } - .associateWith { emptyList() } + .associateWith { emptyList() } } /* @@ -159,6 +160,13 @@ object FieldWalker { && !(it.type.isArray && it.type.componentType.isPrimitive) && it.name != "previousOut" // System.out from TestBase that we store in a field to restore later } + check(fields.isEmpty() || !type.name.startsWith("java.")) { + """ + Trying to walk trough JDK's '$type' will get into illegal reflective access on JDK 9+. + Either modify your test to avoid usage of this class or update FieldWalker code to retrieve + the captured state of this class without going through reflection (see how collections are handled). + """.trimIndent() + } fields.forEach { it.isAccessible = true } // make them all accessible result.addAll(fields) type = type.superclass diff --git a/kotlinx-coroutines-core/jvm/test/flow/SafeCollectorMemoryLeakTest.kt b/kotlinx-coroutines-core/jvm/test/flow/SafeCollectorMemoryLeakTest.kt new file mode 100644 index 0000000000..b75ec60ed5 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/flow/SafeCollectorMemoryLeakTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines.flow + +import kotlinx.coroutines.* +import org.junit.* + +class SafeCollectorMemoryLeakTest : TestBase() { + // custom List.forEach impl to avoid using iterator (FieldWalker cannot scan it) + private inline fun List.listForEach(action: (T) -> Unit) { + for (i in indices) action(get(i)) + } + + @Test + fun testCompletionIsProperlyCleanedUp() = runBlocking { + val job = flow { + emit(listOf(239)) + expect(2) + hang {} + }.transform { l -> l.listForEach { _ -> emit(42) } } + .onEach { expect(1) } + .launchIn(this) + yield() + expect(3) + FieldWalker.assertReachableCount(0, job) { it == 239 } + job.cancelAndJoin() + finish(4) + } + + @Test + fun testCompletionIsNotCleanedUp() = runBlocking { + val job = flow { + emit(listOf(239)) + hang {} + }.transform { l -> l.listForEach { _ -> emit(42) } } + .onEach { + expect(1) + hang { finish(3) } + } + .launchIn(this) + yield() + expect(2) + FieldWalker.assertReachableCount(1, job) { it == 239 } + job.cancelAndJoin() + } +} From b545807d00425ac1838a2105a3578795eaab1167 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 24 Feb 2022 01:48:42 -0800 Subject: [PATCH 258/328] Validate that throwing tryCopy does not crash with an internal error (#3063) Motivated by #3031 --- .../StackTraceRecoveryCustomExceptionsTest.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt index dba738a8d3..d4e19040a5 100644 --- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt +++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt @@ -124,4 +124,22 @@ class StackTraceRecoveryCustomExceptionsTest : TestBase() { assertTrue(ex is CopyableWithCustomMessage) assertEquals("Recovered: [OK]", ex.message) } + + @Test + fun testTryCopyThrows() = runTest { + class FailingException : Exception(), CopyableThrowable { + override fun createCopy(): FailingException? { + TODO("Not yet implemented") + } + } + + val e = FailingException() + val result = runCatching { + coroutineScope { + throw e + } + } + + assertSame(e, result.exceptionOrNull()) + } } From d0c82ebd5cf7f4ccabcf028c0c0eca00e4683df9 Mon Sep 17 00:00:00 2001 From: Ali Khaleqi Yekta Date: Wed, 2 Mar 2022 14:35:03 +0330 Subject: [PATCH 259/328] docs(Dispatchers.common): Improve & fix grammar (#3209) --- .../common/src/Dispatchers.common.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/Dispatchers.common.kt b/kotlinx-coroutines-core/common/src/Dispatchers.common.kt index 8681b182d8..28e67a423d 100644 --- a/kotlinx-coroutines-core/common/src/Dispatchers.common.kt +++ b/kotlinx-coroutines-core/common/src/Dispatchers.common.kt @@ -26,9 +26,9 @@ public expect object Dispatchers { * * Access to this property may throw an [IllegalStateException] if no main dispatchers are present in the classpath. * - * Depending on platform and classpath it can be mapped to different dispatchers: + * Depending on platform and classpath, it can be mapped to different dispatchers: * - On JS and Native it is equivalent to the [Default] dispatcher. - * - On JVM it either the Android main thread dispatcher, JavaFx or Swing EDT dispatcher. It is chosen by the + * - On JVM it is either the Android main thread dispatcher, JavaFx or Swing EDT dispatcher. It is chosen by the * [`ServiceLoader`](https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html). * * In order to work with the `Main` dispatcher, the following artifact should be added to the project runtime dependencies: @@ -48,7 +48,7 @@ public expect object Dispatchers { * stack overflows. * * ### Event loop - * Event loop semantics is a purely internal concept and have no guarantees on the order of execution + * Event loop semantics is a purely internal concept and has no guarantees on the order of execution * except that all queued coroutines will be executed on the current thread in the lexical scope of the outermost * unconfined coroutine. * @@ -63,11 +63,11 @@ public expect object Dispatchers { * } * println("Done") * ``` - * Can print both "1 2 3" and "1 3 2", this is an implementation detail that can be changed. - * But it is guaranteed that "Done" will be printed only when both `withContext` calls are completed. + * Can print both "1 2 3" and "1 3 2". This is an implementation detail that can be changed. + * However, it is guaranteed that "Done" will be printed only when both `withContext` calls are completed. * * If you need your coroutine to be confined to a particular thread or a thread-pool after resumption, - * but still want to execute it in the current call-frame until its first suspension, then you can use + * but still want to execute it in the current call-frame until its first suspension, you can use * an optional [CoroutineStart] parameter in coroutine builders like * [launch][CoroutineScope.launch] and [async][CoroutineScope.async] setting it to * the value of [CoroutineStart.UNDISPATCHED]. From 3b423b9e3933e03e36cdfdec3114bb8cc5e0b8be Mon Sep 17 00:00:00 2001 From: NWuensche Date: Wed, 9 Mar 2022 08:57:35 +0000 Subject: [PATCH 260/328] Fix a typo (#3214) --- kotlinx-coroutines-test/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index d913ed0154..7b6cf7308c 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -11,7 +11,7 @@ This package provides utilities for efficiently testing coroutines. | [runTest] | Runs the test code, automatically skipping delays and handling uncaught exceptions. | | [TestCoroutineScheduler] | The shared source of virtual time, used for controlling execution order and skipping delays. | | [TestScope] | A [CoroutineScope] that integrates with [runTest], providing access to [TestCoroutineScheduler]. | -| [TestDispatcher] | A [CoroutineDispatcher] that whose delays are controlled by a [TestCoroutineScheduler]. | +| [TestDispatcher] | A [CoroutineDispatcher] whose delays are controlled by a [TestCoroutineScheduler]. | | [Dispatchers.setMain] | Mocks the main dispatcher using the provided one. If mocked with a [TestDispatcher], its [TestCoroutineScheduler] is used everywhere by default. | Provided [TestDispatcher] implementations: From bc120a18ef7cf66571574536c726a1048a4889b6 Mon Sep 17 00:00:00 2001 From: Yakov Burtsev Date: Wed, 9 Mar 2022 09:58:15 +0100 Subject: [PATCH 261/328] Fix a typo (#3213) --- docs/topics/coroutine-context-and-dispatchers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/coroutine-context-and-dispatchers.md b/docs/topics/coroutine-context-and-dispatchers.md index c5a869dff8..4e5ed02b87 100644 --- a/docs/topics/coroutine-context-and-dispatchers.md +++ b/docs/topics/coroutine-context-and-dispatchers.md @@ -306,7 +306,7 @@ However, this parent-child relation can be explicitly overriden in one of two wa 1. When a different scope is explicitly specified when launching a coroutine (for example, `GlobalScope.launch`), then it does not inherit a `Job` from the parent scope. -2. When a different `Job` object is passed as the context for the new coroutine (as show in the example below), +2. When a different `Job` object is passed as the context for the new coroutine (as shown in the example below), then it overrides the `Job` of the parent scope. In both cases, the launched coroutine is not tied to the scope it was launched from and operates independently. From 584b3c4377660d348ec6f96d53d8045de9ea7c3e Mon Sep 17 00:00:00 2001 From: CeH9 Date: Wed, 16 Mar 2022 11:21:23 +0200 Subject: [PATCH 262/328] Fix typo: onDeliveredElement (#3217) onDeliveredElement -> onUndeliveredElement --- kotlinx-coroutines-core/common/src/channels/Channel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/channels/Channel.kt b/kotlinx-coroutines-core/common/src/channels/Channel.kt index 68ed5f1e78..5ad79fdcff 100644 --- a/kotlinx-coroutines-core/common/src/channels/Channel.kt +++ b/kotlinx-coroutines-core/common/src/channels/Channel.kt @@ -684,7 +684,7 @@ public interface ChannelIterator { * exception which is either rethrown from the caller method or handed off to the exception handler in the current context * (see [CoroutineExceptionHandler]) when one is available. * - * A typical usage for `onDeliveredElement` is to close a resource that is being transferred via the channel. The + * A typical usage for `onUndeliveredElement` is to close a resource that is being transferred via the channel. The * following code pattern guarantees that opened resources are closed even if producer, consumer, and/or channel * are cancelled. Resources are never lost. * From 0d26d6c389ab29661383591f6e3c3f21caceb402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Braun?= Date: Thu, 17 Mar 2022 09:31:43 +0100 Subject: [PATCH 263/328] Add references to available implementations in TestDispatcher docs (#3200) Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- kotlinx-coroutines-test/common/src/TestDispatcher.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kotlinx-coroutines-test/common/src/TestDispatcher.kt b/kotlinx-coroutines-test/common/src/TestDispatcher.kt index 3b756b19e9..f434572663 100644 --- a/kotlinx-coroutines-test/common/src/TestDispatcher.kt +++ b/kotlinx-coroutines-test/common/src/TestDispatcher.kt @@ -10,6 +10,11 @@ import kotlin.jvm.* /** * A test dispatcher that can interface with a [TestCoroutineScheduler]. + * + * The available implementations are: + * * [StandardTestDispatcher] is a dispatcher that places new tasks into a queue. + * * [UnconfinedTestDispatcher] is a dispatcher that behaves like [Dispatchers.Unconfined] while allowing to control + * the virtual time. */ @ExperimentalCoroutinesApi public abstract class TestDispatcher internal constructor(): CoroutineDispatcher(), Delay { From f9917429de77cd6a55285bd711db62fc1f6a4f8b Mon Sep 17 00:00:00 2001 From: Scott Olsen Date: Thu, 31 Mar 2022 04:59:08 -0400 Subject: [PATCH 264/328] docs: clarify section on coroutine memory consumption (#3225) Updates the section "Coroutines are light-weight" to clarify its comparison of the resource-intensiveness of coroutines and threads. The content is much the same. This commit also makes the code sample in this section runnable and omits the surrounding runBlocking block. --- docs/topics/coroutines-basics.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/topics/coroutines-basics.md b/docs/topics/coroutines-basics.md index 885c29fc28..68ae97886f 100644 --- a/docs/topics/coroutines-basics.md +++ b/docs/topics/coroutines-basics.md @@ -245,14 +245,17 @@ Done -## Coroutines ARE light-weight +## Coroutines are light-weight -Run the following code: +Coroutines are less resource-intensive than JVM threads. Code that exhausts the +JVM's available memory when using threads can be expressed using coroutines +without hitting resource limits. For example, the following code launches +100000 distinct coroutines that each wait 5 seconds and then print a period +('.') while consuming very little memory: ```kotlin import kotlinx.coroutines.* -//sampleStart fun main() = runBlocking { repeat(100_000) { // launch a lot of coroutines launch { @@ -261,8 +264,9 @@ fun main() = runBlocking { } } } -//sampleEnd ``` + > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-basic-06.kt). > @@ -270,10 +274,9 @@ fun main() = runBlocking { -It launches 100K coroutines and, after 5 seconds, each coroutine prints a dot. - -Now, try that with threads (remove `runBlocking`, replace `launch` with `thread`, and replace `delay` with `Thread.sleep`). -What would happen? (Most likely your code will produce some sort of out-of-memory error) +If you write the same program using threads (remove `runBlocking`, replace +`launch` with `thread`, and replace `delay` with `Thread.sleep`), it will +likely consume too much memory and throw an out-of-memory error. From 6c326e414c569c5e116e321156272bb241d2e6e0 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 31 Mar 2022 02:20:45 -0700 Subject: [PATCH 265/328] Do not mention service loading for CoroutineExceptionHandler as it is not meant to be a public mechanism (#3228) --- docs/topics/exception-handling.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index 9e14ff2afd..5ee55437db 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -75,12 +75,6 @@ You cannot recover from the exception in the `CoroutineExceptionHandler`. The co with the corresponding exception when the handler is called. Normally, the handler is used to log the exception, show some kind of error message, terminate, and/or restart the application. -On JVM it is possible to redefine global exception handler for all coroutines by registering [CoroutineExceptionHandler] via -[`ServiceLoader`](https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html). -Global exception handler is similar to -[`Thread.defaultUncaughtExceptionHandler`](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)) -which is used when no more specific handlers are registered. -On Android, `uncaughtExceptionPreHandler` is installed as a global coroutine exception handler. `CoroutineExceptionHandler` is invoked only on **uncaught** exceptions — exceptions that were not handled in any other way. In particular, all _children_ coroutines (coroutines created in the context of another [Job]) delegate handling of From 8133c973bfa339d89c8df09e2889c9f884fa2b04 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 31 Mar 2022 03:48:19 -0700 Subject: [PATCH 266/328] Fix limitedParallelism implementation on K/N (#3226) The initial implementation predates new memory model and was never working on it Fixes #3223 --- .../common/src/internal/LimitedDispatcher.kt | 9 +-- .../test/LimitedParallelismSharedTest.kt | 34 +++++++++++ .../test/LimitedParallelismConcurrentTest.kt | 59 +++++++++++++++++++ ...mitedParallelismUnhandledExceptionTest.kt} | 25 +------- 4 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 kotlinx-coroutines-core/common/test/LimitedParallelismSharedTest.kt create mode 100644 kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt rename kotlinx-coroutines-core/jvm/test/{LimitedParallelismTest.kt => LimitedParallelismUnhandledExceptionTest.kt} (51%) diff --git a/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt b/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt index 892375b89f..28f37ecf1d 100644 --- a/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt +++ b/kotlinx-coroutines-core/common/src/internal/LimitedDispatcher.kt @@ -23,6 +23,9 @@ internal class LimitedDispatcher( private val queue = LockFreeTaskQueue(singleConsumer = false) + // A separate object that we can synchronize on for K/N + private val workerAllocationLock = SynchronizedObject() + @ExperimentalCoroutinesApi override fun limitedParallelism(parallelism: Int): CoroutineDispatcher { parallelism.checkParallelism() @@ -50,8 +53,7 @@ internal class LimitedDispatcher( continue } - @Suppress("CAST_NEVER_SUCCEEDS") - synchronized(this as SynchronizedObject) { + synchronized(workerAllocationLock) { --runningWorkers if (queue.size == 0) return ++runningWorkers @@ -87,8 +89,7 @@ internal class LimitedDispatcher( } private fun tryAllocateWorker(): Boolean { - @Suppress("CAST_NEVER_SUCCEEDS") - synchronized(this as SynchronizedObject) { + synchronized(workerAllocationLock) { if (runningWorkers >= parallelism) return false ++runningWorkers return true diff --git a/kotlinx-coroutines-core/common/test/LimitedParallelismSharedTest.kt b/kotlinx-coroutines-core/common/test/LimitedParallelismSharedTest.kt new file mode 100644 index 0000000000..d01e85716b --- /dev/null +++ b/kotlinx-coroutines-core/common/test/LimitedParallelismSharedTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlin.test.* + +class LimitedParallelismSharedTest : TestBase() { + + @Test + fun testLimitedDefault() = runTest { + // Test that evaluates the very basic completion of tasks in limited dispatcher + // for all supported platforms. + // For more specific and concurrent tests, see 'concurrent' package. + val view = Dispatchers.Default.limitedParallelism(1) + val view2 = Dispatchers.Default.limitedParallelism(1) + val j1 = launch(view) { + while (true) { + yield() + } + } + val j2 = launch(view2) { j1.cancel() } + joinAll(j1, j2) + } + + @Test + fun testParallelismSpec() { + assertFailsWith { Dispatchers.Default.limitedParallelism(0) } + assertFailsWith { Dispatchers.Default.limitedParallelism(-1) } + assertFailsWith { Dispatchers.Default.limitedParallelism(Int.MIN_VALUE) } + Dispatchers.Default.limitedParallelism(Int.MAX_VALUE) + } +} diff --git a/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt b/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt new file mode 100644 index 0000000000..964f678e74 --- /dev/null +++ b/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import kotlinx.atomicfu.* +import kotlinx.coroutines.* +import kotlinx.coroutines.exceptions.* +import kotlin.test.* + +class LimitedParallelismConcurrentTest : TestBase() { + + private val targetParallelism = 4 + private val iterations = 100_000 + private val parallelism = atomic(0) + + private fun checkParallelism() { + val value = parallelism.incrementAndGet() + randomWait() + assertTrue { value <= targetParallelism } + parallelism.decrementAndGet() + } + + @Test + fun testLimitedExecutor() = runMtTest { + val executor = newFixedThreadPoolContext(targetParallelism, "test") + val view = executor.limitedParallelism(targetParallelism) + doStress { + repeat(iterations) { + launch(view) { + checkParallelism() + } + } + } + executor.close() + } + + private suspend inline fun doStress(crossinline block: suspend CoroutineScope.() -> Unit) { + repeat(stressTestMultiplier) { + coroutineScope { + block() + } + } + } + + @Test + fun testTaskFairness() = runMtTest { + val executor = newSingleThreadContext("test") + val view = executor.limitedParallelism(1) + val view2 = executor.limitedParallelism(1) + val j1 = launch(view) { + while (true) { + yield() + } + } + val j2 = launch(view2) { j1.cancel() } + joinAll(j1, j2) + executor.close() + } +} diff --git a/kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt b/kotlinx-coroutines-core/jvm/test/LimitedParallelismUnhandledExceptionTest.kt similarity index 51% rename from kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt rename to kotlinx-coroutines-core/jvm/test/LimitedParallelismUnhandledExceptionTest.kt index 30c54117a9..8d48aa43b3 100644 --- a/kotlinx-coroutines-core/jvm/test/LimitedParallelismTest.kt +++ b/kotlinx-coroutines-core/jvm/test/LimitedParallelismUnhandledExceptionTest.kt @@ -9,30 +9,7 @@ import java.util.concurrent.* import kotlin.coroutines.* import kotlin.test.* -class LimitedParallelismTest : TestBase() { - - @Test - fun testParallelismSpec() { - assertFailsWith { Dispatchers.Default.limitedParallelism(0) } - assertFailsWith { Dispatchers.Default.limitedParallelism(-1) } - assertFailsWith { Dispatchers.Default.limitedParallelism(Int.MIN_VALUE) } - Dispatchers.Default.limitedParallelism(Int.MAX_VALUE) - } - - @Test - fun testTaskFairness() = runTest { - val executor = newSingleThreadContext("test") - val view = executor.limitedParallelism(1) - val view2 = executor.limitedParallelism(1) - val j1 = launch(view) { - while (true) { - yield() - } - } - val j2 = launch(view2) { j1.cancel() } - joinAll(j1, j2) - executor.close() - } +class LimitedParallelismUnhandledExceptionTest : TestBase() { @Test fun testUnhandledException() = runTest { From a5dd74b2b325113586768b8b61af6e2833a139c2 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 4 Apr 2022 03:57:56 -0700 Subject: [PATCH 267/328] CopyableThreadContextElement implementation (#3227) New approach eagerly copies corresponding elements to avoid accidental top-level reuse and also provides merge capability in case when an element is being overwritten. Merge capability is crucial in tracing scenarios to properly preserve the state of linked thread locals Co-authored-by: dkhalanskyjb <52952525+dkhalanskyjb@users.noreply.github.com> --- .../api/kotlinx-coroutines-core.api | 4 +- .../common/src/Builders.common.kt | 3 +- .../common/src/CoroutineContext.common.kt | 12 +- .../js/src/CoroutineContext.kt | 4 + .../jvm/src/CoroutineContext.kt | 87 +++++++++--- .../jvm/src/ThreadContextElement.kt | 33 ++++- .../jvm/test/ThreadContextElementTest.kt | 13 +- .../test/ThreadContextMutableCopiesTest.kt | 134 ++++++++++++++++++ .../native/src/CoroutineContext.kt | 4 + 9 files changed, 259 insertions(+), 35 deletions(-) create mode 100644 kotlinx-coroutines-core/jvm/test/ThreadContextMutableCopiesTest.kt diff --git a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api index d1fc624a5e..79f3cf4308 100644 --- a/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api +++ b/kotlinx-coroutines-core/api/kotlinx-coroutines-core.api @@ -141,7 +141,8 @@ public final class kotlinx/coroutines/CompletionHandlerException : java/lang/Run } public abstract interface class kotlinx/coroutines/CopyableThreadContextElement : kotlinx/coroutines/ThreadContextElement { - public abstract fun copyForChildCoroutine ()Lkotlinx/coroutines/CopyableThreadContextElement; + public abstract fun copyForChild ()Lkotlinx/coroutines/CopyableThreadContextElement; + public abstract fun mergeForChild (Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; } public final class kotlinx/coroutines/CopyableThreadContextElement$DefaultImpls { @@ -156,6 +157,7 @@ public abstract interface class kotlinx/coroutines/CopyableThrowable { } public final class kotlinx/coroutines/CoroutineContextKt { + public static final fun newCoroutineContext (Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; public static final fun newCoroutineContext (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; } diff --git a/kotlinx-coroutines-core/common/src/Builders.common.kt b/kotlinx-coroutines-core/common/src/Builders.common.kt index a11ffe9eb4..c360724245 100644 --- a/kotlinx-coroutines-core/common/src/Builders.common.kt +++ b/kotlinx-coroutines-core/common/src/Builders.common.kt @@ -148,7 +148,8 @@ public suspend fun withContext( return suspendCoroutineUninterceptedOrReturn sc@ { uCont -> // compute new context val oldContext = uCont.context - val newContext = oldContext + context + // Copy CopyableThreadContextElement if necessary + val newContext = oldContext.newCoroutineContext(context) // always check for cancellation of new context newContext.ensureActive() // FAST PATH #1 -- new context is the same as the old one diff --git a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt index da094e152d..9153f39821 100644 --- a/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt +++ b/kotlinx-coroutines-core/common/src/CoroutineContext.common.kt @@ -7,11 +7,19 @@ package kotlinx.coroutines import kotlin.coroutines.* /** - * Creates a context for the new coroutine. It installs [Dispatchers.Default] when no other dispatcher or - * [ContinuationInterceptor] is specified, and adds optional support for debugging facilities (when turned on). + * Creates a context for a new coroutine. It installs [Dispatchers.Default] when no other dispatcher or + * [ContinuationInterceptor] is specified and adds optional support for debugging facilities (when turned on) + * and copyable-thread-local facilities on JVM. */ public expect fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext +/** + * Creates a context for coroutine builder functions that do not launch a new coroutine, e.g. [withContext]. + * @suppress + */ +@InternalCoroutinesApi +public expect fun CoroutineContext.newCoroutineContext(addedContext: CoroutineContext): CoroutineContext + @PublishedApi @Suppress("PropertyName") internal expect val DefaultDelay: Delay diff --git a/kotlinx-coroutines-core/js/src/CoroutineContext.kt b/kotlinx-coroutines-core/js/src/CoroutineContext.kt index 95cb3c2964..8036c88a10 100644 --- a/kotlinx-coroutines-core/js/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/js/src/CoroutineContext.kt @@ -42,6 +42,10 @@ public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): combined + Dispatchers.Default else combined } +public actual fun CoroutineContext.newCoroutineContext(addedContext: CoroutineContext): CoroutineContext { + return this + addedContext +} + // No debugging facilities on JS internal actual inline fun withCoroutineContext(context: CoroutineContext, countOrElement: Any?, block: () -> T): T = block() internal actual inline fun withContinuationContext(continuation: Continuation<*>, countOrElement: Any?, block: () -> T): T = block() diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index 6291ea2b97..e08b805295 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -9,36 +9,83 @@ import kotlin.coroutines.* import kotlin.coroutines.jvm.internal.CoroutineStackFrame /** - * Creates context for the new coroutine. It installs [Dispatchers.Default] when no other dispatcher nor - * [ContinuationInterceptor] is specified, and adds optional support for debugging facilities (when turned on). - * + * Creates a context for a new coroutine. It installs [Dispatchers.Default] when no other dispatcher or + * [ContinuationInterceptor] is specified and adds optional support for debugging facilities (when turned on) + * and copyable-thread-local facilities on JVM. * See [DEBUG_PROPERTY_NAME] for description of debugging facilities on JVM. */ @ExperimentalCoroutinesApi public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): CoroutineContext { - val combined = coroutineContext.foldCopiesForChildCoroutine() + context + val combined = foldCopies(coroutineContext, context, true) val debug = if (DEBUG) combined + CoroutineId(COROUTINE_ID.incrementAndGet()) else combined return if (combined !== Dispatchers.Default && combined[ContinuationInterceptor] == null) debug + Dispatchers.Default else debug } /** - * Returns the [CoroutineContext] for a child coroutine to inherit. - * - * If any [CopyableThreadContextElement] is in the [this], calls - * [CopyableThreadContextElement.copyForChildCoroutine] on each, returning a new [CoroutineContext] - * by folding the returned copied elements into [this]. - * - * Returns [this] if `this` has zero [CopyableThreadContextElement] in it. + * Creates a context for coroutine builder functions that do not launch a new coroutine, e.g. [withContext]. + * @suppress */ -private fun CoroutineContext.foldCopiesForChildCoroutine(): CoroutineContext { - val hasToCopy = fold(false) { result, it -> - result || it is CopyableThreadContextElement<*> +@InternalCoroutinesApi +public actual fun CoroutineContext.newCoroutineContext(addedContext: CoroutineContext): CoroutineContext { + /* + * Fast-path: we only have to copy/merge if 'addedContext' (which typically has one or two elements) + * contains copyable elements. + */ + if (!addedContext.hasCopyableElements()) return this + addedContext + return foldCopies(this, addedContext, false) +} + +private fun CoroutineContext.hasCopyableElements(): Boolean = + fold(false) { result, it -> result || it is CopyableThreadContextElement<*> } + +/** + * Folds two contexts properly applying [CopyableThreadContextElement] rules when necessary. + * The rules are the following: + * * If neither context has CTCE, the sum of two contexts is returned + * * Every CTCE from the left-hand side context that does not have a matching (by key) element from right-hand side context + * is [copied][CopyableThreadContextElement.copyForChild] if [isNewCoroutine] is `true`. + * * Every CTCE from the left-hand side context that has a matching element in the right-hand side context is [merged][CopyableThreadContextElement.mergeForChild] + * * Every CTCE from the right-hand side context that hasn't been merged is copied + * * Everything else is added to the resulting context as is. + */ +private fun foldCopies(originalContext: CoroutineContext, appendContext: CoroutineContext, isNewCoroutine: Boolean): CoroutineContext { + // Do we have something to copy left-hand side? + val hasElementsLeft = originalContext.hasCopyableElements() + val hasElementsRight = appendContext.hasCopyableElements() + + // Nothing to fold, so just return the sum of contexts + if (!hasElementsLeft && !hasElementsRight) { + return originalContext + appendContext + } + + var leftoverContext = appendContext + val folded = originalContext.fold(EmptyCoroutineContext) { result, element -> + if (element !is CopyableThreadContextElement<*>) return@fold result + element + // Will this element be overwritten? + val newElement = leftoverContext[element.key] + // No, just copy it + if (newElement == null) { + // For 'withContext'-like builders we do not copy as the element is not shared + return@fold result + if (isNewCoroutine) element.copyForChild() else element + } + // Yes, then first remove the element from append context + leftoverContext = leftoverContext.minusKey(element.key) + // Return the sum + @Suppress("UNCHECKED_CAST") + return@fold result + (element as CopyableThreadContextElement).mergeForChild(newElement) } - if (!hasToCopy) return this - return fold(EmptyCoroutineContext) { combined, it -> - combined + if (it is CopyableThreadContextElement<*>) it.copyForChildCoroutine() else it + + if (hasElementsRight) { + leftoverContext = leftoverContext.fold(EmptyCoroutineContext) { result, element -> + // We're appending new context element -- we have to copy it, otherwise it may be shared with others + if (element is CopyableThreadContextElement<*>) { + return@fold result + element.copyForChild() + } + return@fold result + element + } } + return folded + leftoverContext } /** @@ -77,7 +124,7 @@ internal actual inline fun withContinuationContext(continuation: Continuatio internal fun Continuation<*>.updateUndispatchedCompletion(context: CoroutineContext, oldValue: Any?): UndispatchedCoroutine<*>? { if (this !is CoroutineStackFrame) return null /* - * Fast-path to detect whether we have unispatched coroutine at all in our stack. + * Fast-path to detect whether we have undispatched coroutine at all in our stack. * * Implementation note. * If we ever find that stackwalking for thread-locals is way too slow, here is another idea: @@ -88,8 +135,8 @@ internal fun Continuation<*>.updateUndispatchedCompletion(context: CoroutineCont * Both options should work, but it requires more careful studying of the performance * and, mostly, maintainability impact. */ - val potentiallyHasUndispatchedCorotuine = context[UndispatchedMarker] !== null - if (!potentiallyHasUndispatchedCorotuine) return null + val potentiallyHasUndispatchedCoroutine = context[UndispatchedMarker] !== null + if (!potentiallyHasUndispatchedCoroutine) return null val completion = undispatchedCompletion() completion?.saveThreadContext(context, oldValue) return completion diff --git a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt index 1a960699c7..d2b6b6b988 100644 --- a/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt +++ b/kotlinx-coroutines-core/jvm/src/ThreadContextElement.kt @@ -80,7 +80,7 @@ public interface ThreadContextElement : CoroutineContext.Element { /** * A [ThreadContextElement] copied whenever a child coroutine inherits a context containing it. * - * When an API uses a _mutable_ `ThreadLocal` for consistency, a [CopyableThreadContextElement] + * When an API uses a _mutable_ [ThreadLocal] for consistency, a [CopyableThreadContextElement] * can give coroutines "coroutine-safe" write access to that `ThreadLocal`. * * A write made to a `ThreadLocal` with a matching [CopyableThreadContextElement] by a coroutine @@ -99,6 +99,7 @@ public interface ThreadContextElement : CoroutineContext.Element { * ``` * class TraceContextElement(private val traceData: TraceData?) : CopyableThreadContextElement { * companion object Key : CoroutineContext.Key + * * override val key: CoroutineContext.Key = Key * * override fun updateThreadContext(context: CoroutineContext): TraceData? { @@ -111,24 +112,35 @@ public interface ThreadContextElement : CoroutineContext.Element { * traceThreadLocal.set(oldState) * } * - * override fun copyForChildCoroutine(): CopyableThreadContextElement { + * override fun copyForChild(): TraceContextElement { * // Copy from the ThreadLocal source of truth at child coroutine launch time. This makes * // ThreadLocal writes between resumption of the parent coroutine and the launch of the * // child coroutine visible to the child. * return TraceContextElement(traceThreadLocal.get()?.copy()) * } + * + * override fun mergeForChild(overwritingElement: CoroutineContext.Element): CoroutineContext { + * // Merge operation defines how to handle situations when both + * // the parent coroutine has an element in the context and + * // an element with the same key was also + * // explicitly passed to the child coroutine. + * // If merging does not require special behavior, + * // the copy of the element can be returned. + * return TraceContextElement(traceThreadLocal.get()?.copy()) + * } * } * ``` * - * A coroutine using this mechanism can safely call Java code that assumes it's called using a - * `Thread`. + * A coroutine using this mechanism can safely call Java code that assumes the corresponding thread local element's + * value is installed into the target thread local. */ +@DelicateCoroutinesApi @ExperimentalCoroutinesApi public interface CopyableThreadContextElement : ThreadContextElement { /** * Returns a [CopyableThreadContextElement] to replace `this` `CopyableThreadContextElement` in the child - * coroutine's context that is under construction. + * coroutine's context that is under construction if the added context does not contain an element with the same [key]. * * This function is called on the element each time a new coroutine inherits a context containing it, * and the returned value is folded into the context given to the child. @@ -136,7 +148,16 @@ public interface CopyableThreadContextElement : ThreadContextElement { * Since this method is called whenever a new coroutine is launched in a context containing this * [CopyableThreadContextElement], implementations are performance-sensitive. */ - public fun copyForChildCoroutine(): CopyableThreadContextElement + public fun copyForChild(): CopyableThreadContextElement + + /** + * Returns a [CopyableThreadContextElement] to replace `this` `CopyableThreadContextElement` in the child + * coroutine's context that is under construction if the added context does contain an element with the same [key]. + * + * This method is invoked on the original element, accepting as the parameter + * the element that is supposed to overwrite it. + */ + public fun mergeForChild(overwritingElement: CoroutineContext.Element): CoroutineContext } /** diff --git a/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt b/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt index baba4aa8e6..ec45406bce 100644 --- a/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt +++ b/kotlinx-coroutines-core/jvm/test/ThreadContextElementTest.kt @@ -126,8 +126,7 @@ class ThreadContextElementTest : TestBase() { @Test fun testCopyableThreadContextElementImplementsWriteVisibility() = runTest { newFixedThreadPoolContext(nThreads = 4, name = "withContext").use { - val startData = MyData() - withContext(it + CopyForChildCoroutineElement(startData)) { + withContext(it + CopyForChildCoroutineElement(MyData())) { val forBlockData = MyData() myThreadLocal.setForBlock(forBlockData) { assertSame(myThreadLocal.get(), forBlockData) @@ -153,7 +152,7 @@ class ThreadContextElementTest : TestBase() { assertSame(myThreadLocal.get(), forBlockData) } } - assertSame(myThreadLocal.get(), startData) // Asserts value was restored. + assertNull(myThreadLocal.get()) // Asserts value was restored to its origin } } } @@ -187,7 +186,7 @@ class MyElement(val data: MyData) : ThreadContextElement { } /** - * A [ThreadContextElement] that implements copy semantics in [copyForChildCoroutine]. + * A [ThreadContextElement] that implements copy semantics in [copyForChild]. */ class CopyForChildCoroutineElement(val data: MyData?) : CopyableThreadContextElement { companion object Key : CoroutineContext.Key @@ -201,6 +200,10 @@ class CopyForChildCoroutineElement(val data: MyData?) : CopyableThreadContextEle return oldState } + override fun mergeForChild(overwritingElement: CoroutineContext.Element): CopyForChildCoroutineElement { + TODO("Not used in tests") + } + override fun restoreThreadContext(context: CoroutineContext, oldState: MyData?) { myThreadLocal.set(oldState) } @@ -216,7 +219,7 @@ class CopyForChildCoroutineElement(val data: MyData?) : CopyableThreadContextEle * will be reflected in the parent coroutine's [CopyForChildCoroutineElement] when it yields the * thread and calls [restoreThreadContext]. */ - override fun copyForChildCoroutine(): CopyableThreadContextElement { + override fun copyForChild(): CopyForChildCoroutineElement { return CopyForChildCoroutineElement(myThreadLocal.get()) } } diff --git a/kotlinx-coroutines-core/jvm/test/ThreadContextMutableCopiesTest.kt b/kotlinx-coroutines-core/jvm/test/ThreadContextMutableCopiesTest.kt new file mode 100644 index 0000000000..34e5955fd7 --- /dev/null +++ b/kotlinx-coroutines-core/jvm/test/ThreadContextMutableCopiesTest.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.coroutines + +import kotlin.coroutines.* +import kotlin.test.* + +class ThreadContextMutableCopiesTest : TestBase() { + companion object { + val threadLocalData: ThreadLocal> = ThreadLocal.withInitial { ArrayList() } + } + + class MyMutableElement( + val mutableData: MutableList + ) : CopyableThreadContextElement> { + + companion object Key : CoroutineContext.Key + + override val key: CoroutineContext.Key<*> + get() = Key + + override fun updateThreadContext(context: CoroutineContext): MutableList { + val st = threadLocalData.get() + threadLocalData.set(mutableData) + return st + } + + override fun restoreThreadContext(context: CoroutineContext, oldState: MutableList) { + threadLocalData.set(oldState) + } + + override fun copyForChild(): MyMutableElement { + return MyMutableElement(ArrayList(mutableData)) + } + + override fun mergeForChild(overwritingElement: CoroutineContext.Element): MyMutableElement { + overwritingElement as MyMutableElement // <- app-specific, may be another subtype + return MyMutableElement((mutableData.toSet() + overwritingElement.mutableData).toMutableList()) + } + } + + @Test + fun testDataIsCopied() = runTest { + val root = MyMutableElement(ArrayList()) + runBlocking(root) { + val data = threadLocalData.get() + expect(1) + launch(root) { + assertNotSame(data, threadLocalData.get()) + assertEquals(data, threadLocalData.get()) + finish(2) + } + } + } + + @Test + fun testDataIsNotOverwritten() = runTest { + val root = MyMutableElement(ArrayList()) + runBlocking(root) { + expect(1) + val originalData = threadLocalData.get() + threadLocalData.get().add("X") + launch { + threadLocalData.get().add("Y") + // Note here, +root overwrites the data + launch(Dispatchers.Default + root) { + assertEquals(listOf("X", "Y"), threadLocalData.get()) + assertNotSame(originalData, threadLocalData.get()) + finish(2) + } + } + } + } + + @Test + fun testDataIsMerged() = runTest { + val root = MyMutableElement(ArrayList()) + runBlocking(root) { + expect(1) + val originalData = threadLocalData.get() + threadLocalData.get().add("X") + launch { + threadLocalData.get().add("Y") + // Note here, +root overwrites the data + launch(Dispatchers.Default + MyMutableElement(mutableListOf("Z"))) { + assertEquals(listOf("X", "Y", "Z"), threadLocalData.get()) + assertNotSame(originalData, threadLocalData.get()) + finish(2) + } + } + } + } + + @Test + fun testDataIsNotOverwrittenWithContext() = runTest { + val root = MyMutableElement(ArrayList()) + runBlocking(root) { + val originalData = threadLocalData.get() + threadLocalData.get().add("X") + expect(1) + launch { + threadLocalData.get().add("Y") + // Note here, +root overwrites the data + withContext(Dispatchers.Default + root) { + assertEquals(listOf("X", "Y"), threadLocalData.get()) + assertNotSame(originalData, threadLocalData.get()) + finish(2) + } + } + } + } + + @Test + fun testDataIsCopiedForRunBlocking() = runTest { + val root = MyMutableElement(ArrayList()) + val originalData = root.mutableData + runBlocking(root) { + assertNotSame(originalData, threadLocalData.get()) + } + } + + @Test + fun testDataIsCopiedForCoroutine() = runTest { + val root = MyMutableElement(ArrayList()) + val originalData = root.mutableData + expect(1) + launch(root) { + assertNotSame(originalData, threadLocalData.get()) + finish(2) + } + } +} diff --git a/kotlinx-coroutines-core/native/src/CoroutineContext.kt b/kotlinx-coroutines-core/native/src/CoroutineContext.kt index e1e29581a7..6e2dac1a29 100644 --- a/kotlinx-coroutines-core/native/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/native/src/CoroutineContext.kt @@ -49,6 +49,10 @@ public actual fun CoroutineScope.newCoroutineContext(context: CoroutineContext): combined + (DefaultDelay as CoroutineContext.Element) else combined } +public actual fun CoroutineContext.newCoroutineContext(addedContext: CoroutineContext): CoroutineContext { + return this + addedContext +} + // No debugging facilities on native internal actual inline fun withCoroutineContext(context: CoroutineContext, countOrElement: Any?, block: () -> T): T = block() internal actual inline fun withContinuationContext(continuation: Continuation<*>, countOrElement: Any?, block: () -> T): T = block() From 429b5d1b35d1d63cd3de52aa46df5a01118b0c05 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 1 Apr 2022 20:10:16 +0300 Subject: [PATCH 268/328] Version 1.6.1 --- CHANGES.md | 14 ++++++++++++++ README.md | 16 ++++++++-------- gradle.properties | 2 +- kotlinx-coroutines-debug/README.md | 2 +- kotlinx-coroutines-test/README.md | 2 +- ui/coroutines-guide-ui.md | 2 +- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 424959f9a7..2aba4abf59 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,19 @@ # Change log for kotlinx.coroutines +## Version 1.6.1 + +* Rollback of time-related functions dispatching on `Dispatchers.Main`. + This behavior was introduced in 1.6.0 and then found inconvenient and erroneous (#3106, #3113). +* Reworked the newly-introduced `CopyableThreadContextElement` to solve issues uncovered after the initial release (#3227). +* Fixed a bug with `ThreadLocalElement` not being properly updated in racy scenarios (#2930). +* Reverted eager loading of default `CoroutineExceptionHandler` that triggered ANR on some devices (#3180). +* New API to convert a `CoroutineDispatcher` to a Rx scheduler (#968, #548). Thanks @recheej! +* Fixed a memory leak with the very last element emitted from `flow` builder being retained in memory (#3197). +* Fixed a bug with `limitedParallelism` on K/N with new memory model throwing `ClassCastException` (#3223). +* `CoroutineContext` is added to the exception printed to the default `CoroutineExceptionHandler` to improve debuggability (#3153). +* Static memory consumption of `Dispatchers.Default` was significantly reduced (#3137). +* Updated slf4j version in `kotlinx-coroutines-slf4j` from 1.7.25 to 1.7.32. + ## Version 1.6.0 Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end. diff --git a/README.md b/README.md index 7f7558c81e..10910f9e22 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) -[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.0)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.0/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1/pom) +[![Kotlin](https://img.shields.io/badge/kotlin-1.6.1-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.6.0` release. +This is a companion version for the Kotlin `1.6.1` release. ```kotlin suspend fun main() = coroutineScope { @@ -83,7 +83,7 @@ Add dependencies (you can also add other modules that you need): org.jetbrains.kotlinx kotlinx-coroutines-core - 1.6.0 + 1.6.1 ``` @@ -101,7 +101,7 @@ Add dependencies (you can also add other modules that you need): ```kotlin dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1") } ``` @@ -131,7 +131,7 @@ Add [`kotlinx-coroutines-android`](ui/kotlinx-coroutines-android) module as a dependency when using `kotlinx.coroutines` on Android: ```kotlin -implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0") +implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1") ``` This gives you access to the Android [Dispatchers.Main] @@ -166,7 +166,7 @@ In common code that should get compiled for different platforms, you can add a d ```kotlin commonMain { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1") } } ``` @@ -178,7 +178,7 @@ Platform-specific dependencies are recommended to be used only for non-multiplat #### JS Kotlin/JS version of `kotlinx.coroutines` is published as -[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.0/jar) +[`kotlinx-coroutines-core-js`](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core-js/1.6.1/jar) (follow the link to get the dependency declaration snippet) and as [`kotlinx-coroutines-core`](https://www.npmjs.com/package/kotlinx-coroutines-core) NPM package. #### Native diff --git a/gradle.properties b/gradle.properties index e06f587df7..e91e8dadaa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ # # Kotlin -version=1.6.0-SNAPSHOT +version=1.6.1-SNAPSHOT group=org.jetbrains.kotlinx kotlin_version=1.6.0 diff --git a/kotlinx-coroutines-debug/README.md b/kotlinx-coroutines-debug/README.md index 5504b31f19..78a217e692 100644 --- a/kotlinx-coroutines-debug/README.md +++ b/kotlinx-coroutines-debug/README.md @@ -61,7 +61,7 @@ stacktraces will be dumped to the console. ### Using as JVM agent Debug module can also be used as a standalone JVM agent to enable debug probes on the application startup. -You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.0.jar`. +You can run your application with an additional argument: `-javaagent:kotlinx-coroutines-debug-1.6.1.jar`. Additionally, on Linux and Mac OS X you can use `kill -5 $pid` command in order to force your application to print all alive coroutines. When used as Java agent, `"kotlinx.coroutines.debug.enable.creation.stack.trace"` system property can be used to control [DebugProbes.enableCreationStackTraces] along with agent startup. diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 7b6cf7308c..24d2f4e207 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -26,7 +26,7 @@ Provided [TestDispatcher] implementations: Add `kotlinx-coroutines-test` to your project test dependencies: ``` dependencies { - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1' } ``` diff --git a/ui/coroutines-guide-ui.md b/ui/coroutines-guide-ui.md index b7e8737868..fd4fcf0f72 100644 --- a/ui/coroutines-guide-ui.md +++ b/ui/coroutines-guide-ui.md @@ -110,7 +110,7 @@ Add dependencies on `kotlinx-coroutines-android` module to the `dependencies { . `app/build.gradle` file: ```groovy -implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0" +implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1" ``` You can clone [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) project from GitHub onto your From a97d9dbe35f423457114450c9833241ed2a4ccdf Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 6 Apr 2022 01:58:51 -0700 Subject: [PATCH 269/328] Dispatchers.IO doc clarification (#3236) Addresses #3234 --- kotlinx-coroutines-core/jvm/src/Dispatchers.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt index 4b1b03337d..251a567c54 100644 --- a/kotlinx-coroutines-core/jvm/src/Dispatchers.kt +++ b/kotlinx-coroutines-core/jvm/src/Dispatchers.kt @@ -125,8 +125,9 @@ public actual object Dispatchers { * * This dispatcher and its views share threads with the [Default][Dispatchers.Default] dispatcher, so using * `withContext(Dispatchers.IO) { ... }` when already running on the [Default][Dispatchers.Default] - * dispatcher does not lead to an actual switching to another thread — typically execution - * continues in the same thread. + * dispatcher typically does not lead to an actual switching to another thread. In such scenarios, + * the underlying implementation attempts to keep the execution on the same thread on a best-effort basis. + * * As a result of thread sharing, more than 64 (default parallelism) threads can be created (but not used) * during operations over IO dispatcher. */ From 15aba8d96eaaeee5472ea6ed144a664f25e8f89e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 6 Apr 2022 03:29:38 -0700 Subject: [PATCH 270/328] Update Kotlin to 1.6.20 (#3235) --- README.md | 6 +-- .../benchmarks/ParametrizedDispatcherBase.kt | 1 - gradle.properties | 2 +- .../jvm/test/DispatcherKeyTest.kt | 2 +- .../common/test/TestDispatchersTest.kt | 1 - .../js/test/FailingTests.kt | 37 ------------------- 6 files changed, 5 insertions(+), 44 deletions(-) delete mode 100644 kotlinx-coroutines-test/js/test/FailingTests.kt diff --git a/README.md b/README.md index 10910f9e22..9495af170c 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ And make sure that you use the latest Kotlin version: ```xml - 1.6.0 + 1.6.20 ``` @@ -110,10 +110,10 @@ And make sure that you use the latest Kotlin version: ```kotlin plugins { // For build.gradle.kts (Kotlin DSL) - kotlin("jvm") version "1.6.0" + kotlin("jvm") version "1.6.20" // For build.gradle (Groovy DSL) - id "org.jetbrains.kotlin.jvm" version "1.6.0" + id "org.jetbrains.kotlin.jvm" version "1.6.20" } ``` diff --git a/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt b/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt index 80e15a1b4f..ce64c6a49b 100644 --- a/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt +++ b/benchmarks/src/jmh/kotlin/benchmarks/ParametrizedDispatcherBase.kt @@ -25,7 +25,6 @@ abstract class ParametrizedDispatcherBase : CoroutineScope { private var closeable: Closeable? = null @Setup - @UseExperimental(InternalCoroutinesApi::class) open fun setup() { coroutineContext = when { dispatcher == "fjp" -> ForkJoinPool.commonPool().asCoroutineDispatcher() diff --git a/gradle.properties b/gradle.properties index e91e8dadaa..8faae9eb68 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ # Kotlin version=1.6.1-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.6.0 +kotlin_version=1.6.20 # Dependencies junit_version=4.12 diff --git a/kotlinx-coroutines-core/jvm/test/DispatcherKeyTest.kt b/kotlinx-coroutines-core/jvm/test/DispatcherKeyTest.kt index e2d8ffaa47..303e8cc8fe 100644 --- a/kotlinx-coroutines-core/jvm/test/DispatcherKeyTest.kt +++ b/kotlinx-coroutines-core/jvm/test/DispatcherKeyTest.kt @@ -8,7 +8,7 @@ import org.junit.Test import kotlin.coroutines.* import kotlin.test.* -@UseExperimental(ExperimentalStdlibApi::class) +@OptIn(ExperimentalStdlibApi::class) class DispatcherKeyTest : TestBase() { companion object CustomInterceptor : AbstractCoroutineContextElement(ContinuationInterceptor), diff --git a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt index 66a6c24e8f..bcf016b3d3 100644 --- a/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt +++ b/kotlinx-coroutines-test/common/test/TestDispatchersTest.kt @@ -23,7 +23,6 @@ class TestDispatchersTest: OrderedExecutionTestBase() { /** Tests that asynchronous execution of tests does not happen concurrently with [AfterTest]. */ @Test - @NoJs fun testMainMocking() = runTest { val mainAtStart = TestMainDispatcher.currentTestDispatcher assertNotNull(mainAtStart) diff --git a/kotlinx-coroutines-test/js/test/FailingTests.kt b/kotlinx-coroutines-test/js/test/FailingTests.kt deleted file mode 100644 index 4746a737fa..0000000000 --- a/kotlinx-coroutines-test/js/test/FailingTests.kt +++ /dev/null @@ -1,37 +0,0 @@ -package kotlinx.coroutines.test - -import kotlinx.coroutines.* -import kotlinx.coroutines.test.internal.* -import kotlin.test.* - -/** These are tests that we want to fail. They are here so that, when the issue is fixed, their failure indicates that - * everything is better now. */ -class FailingTests { - - private var tearDownEntered = false - - @BeforeTest - fun setUp() { - Dispatchers.setMain(StandardTestDispatcher()) - } - - @AfterTest - fun tearDown() { - Dispatchers.resetMain() - tearDownEntered = true - } - - /** [TestDispatchersTest.testMainMocking]. */ - @Test - fun testAfterTestIsConcurrent() = runTest { - try { - val mainAtStart = TestMainDispatcher.currentTestDispatcher ?: return@runTest - withContext(Dispatchers.Default) { - // context switch - } - assertNotSame(mainAtStart, TestMainDispatcher.currentTestDispatcher!!) - } finally { - assertTrue(tearDownEntered) - } - } -} From 88da9b71f9388961975d69aeb30110a4055004c3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 8 Apr 2022 21:12:14 +0300 Subject: [PATCH 271/328] Use actual Kotlin version in the README badge Fixes #3242 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 10910f9e22..0c164d1236 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![official JetBrains project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) [![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1)](https://search.maven.org/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.6.1/pom) -[![Kotlin](https://img.shields.io/badge/kotlin-1.6.1-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-1.6.0-blue.svg?logo=kotlin)](http://kotlinlang.org) [![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/coroutines/) Library support for Kotlin coroutines with [multiplatform](#multiplatform) support. -This is a companion version for the Kotlin `1.6.1` release. +This is a companion version for the Kotlin `1.6.0` release. ```kotlin suspend fun main() = coroutineScope { From 774e66d506603825e10659313820cf8985fc59b8 Mon Sep 17 00:00:00 2001 From: Mohammad Ershad Nasri Date: Mon, 11 Apr 2022 01:10:54 -0700 Subject: [PATCH 272/328] Fix a typo (#3245) Remove additional 'them' --- kotlinx-coroutines-test/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-test/README.md b/kotlinx-coroutines-test/README.md index 24d2f4e207..360c3bf178 100644 --- a/kotlinx-coroutines-test/README.md +++ b/kotlinx-coroutines-test/README.md @@ -362,7 +362,7 @@ This API is experimental and it is may change before migrating out of experiment Changes during experimental may have deprecation applied when possible, but it is not advised to use the API in stable code before it leaves experimental due to possible breaking changes. -If you have any suggestions for improvements to this experimental API please share them them on the +If you have any suggestions for improvements to this experimental API please share them on the [issue tracker](https://github.com/Kotlin/kotlinx.coroutines/issues). From 52cbf01c63c0737ee745ff08568f26385271a9ab Mon Sep 17 00:00:00 2001 From: Martin Petrov <357181+mpetrov@users.noreply.github.com> Date: Tue, 12 Apr 2022 07:26:03 -0400 Subject: [PATCH 273/328] Lock when reading a ConflatedChannel's value. (#3248) Reads in `isBufferEmpty()` were detected as a race by internal tests. The relevant stack snippets are: ``` Read of size 4 at 0x0000cf809644 by thread T10 (mutexes: write M0, write M1): #0 kotlinx.coroutines.channels.ConflatedChannel.isBufferEmpty()Z ConflatedChannel.kt:22 ``` and: ``` Previous write of size 4 at 0x0000cf809644 by thread T32 (mutexes: write M2, write M3, write M4, write M5, write M6, write M7): #0 kotlinx.coroutines.channels.ConflatedChannel.updateValueLocked(Ljava/lang/Object;)Lkotlinx/coroutines/internal/UndeliveredElementException; ConflatedChannel.kt:131 ``` --- .../common/src/channels/ConflatedChannel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt index f7f60cf97d..177e80cb49 100644 --- a/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt +++ b/kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt @@ -19,7 +19,7 @@ import kotlinx.coroutines.selects.* */ internal open class ConflatedChannel(onUndeliveredElement: OnUndeliveredElement?) : AbstractChannel(onUndeliveredElement) { protected final override val isBufferAlwaysEmpty: Boolean get() = false - protected final override val isBufferEmpty: Boolean get() = value === EMPTY + protected final override val isBufferEmpty: Boolean get() = lock.withLock { value === EMPTY } protected final override val isBufferAlwaysFull: Boolean get() = false protected final override val isBufferFull: Boolean get() = false @@ -139,5 +139,5 @@ internal open class ConflatedChannel(onUndeliveredElement: OnUndeliveredEleme // ------ debug ------ override val bufferDebugString: String - get() = "(value=$value)" + get() = lock.withLock { "(value=$value)" } } From 163a55edce3924e262887df3b93925b6d05a2c3d Mon Sep 17 00:00:00 2001 From: shmuelr Date: Wed, 13 Apr 2022 07:14:44 -0400 Subject: [PATCH 274/328] Add missing package statement to test file (#3249) --- .../concurrent/test/LimitedParallelismConcurrentTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt b/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt index 964f678e74..8d38f05b4b 100644 --- a/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt +++ b/kotlinx-coroutines-core/concurrent/test/LimitedParallelismConcurrentTest.kt @@ -2,6 +2,8 @@ * Copyright 2016-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ +package kotlinx.coroutines + import kotlinx.atomicfu.* import kotlinx.coroutines.* import kotlinx.coroutines.exceptions.* From c1cd02c0a9ec62162408c5d3bdd1de7780298a93 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 18 Apr 2022 07:04:38 -0700 Subject: [PATCH 275/328] Properly preserve thread local values for coroutines that are not intercepted with DispatchedContinuation (#3252) * Properly preserve thread local values for coroutines that are not intercepted with DispatchedContinuation Fixes #2930 --- .../jvm/src/CoroutineContext.kt | 31 ++++++ .../jvm/test/ThreadLocalStressTest.kt | 95 ++++++++++++++++++- 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt index e08b805295..7209bee803 100644 --- a/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt +++ b/kotlinx-coroutines-core/jvm/src/CoroutineContext.kt @@ -181,6 +181,37 @@ internal actual class UndispatchedCoroutineactual constructor ( */ private var threadStateToRecover = ThreadLocal>() + init { + /* + * This is a hack for a very specific case in #2930 unless #3253 is implemented. + * 'ThreadLocalStressTest' covers this change properly. + * + * The scenario this change covers is the following: + * 1) The coroutine is being started as plain non kotlinx.coroutines related suspend function, + * e.g. `suspend fun main` or, more importantly, Ktor `SuspendFunGun`, that is invoking + * `withContext(tlElement)` which creates `UndispatchedCoroutine`. + * 2) It (original continuation) is then not wrapped into `DispatchedContinuation` via `intercept()` + * and goes neither through `DC.run` nor through `resumeUndispatchedWith` that both + * do thread context element tracking. + * 3) So thread locals never got chance to get properly set up via `saveThreadContext`, + * but when `withContext` finishes, it attempts to recover thread locals in its `afterResume`. + * + * Here we detect precisely this situation and properly setup context to recover later. + * + */ + if (uCont.context[ContinuationInterceptor] !is CoroutineDispatcher) { + /* + * We cannot just "read" the elements as there is no such API, + * so we update-restore it immediately and use the intermediate value + * as the initial state, leveraging the fact that thread context element + * is idempotent and such situations are increasingly rare. + */ + val values = updateThreadContext(context, null) + restoreThreadContext(context, values) + saveThreadContext(context, values) + } + } + fun saveThreadContext(context: CoroutineContext, oldValue: Any?) { threadStateToRecover.set(context to oldValue) } diff --git a/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt b/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt index f9941d0215..20621d12bf 100644 --- a/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt +++ b/kotlinx-coroutines-core/jvm/test/ThreadLocalStressTest.kt @@ -4,6 +4,10 @@ package kotlinx.coroutines +import kotlinx.coroutines.sync.* +import java.util.concurrent.* +import kotlin.coroutines.* +import kotlin.coroutines.intrinsics.* import kotlin.test.* @@ -63,10 +67,99 @@ class ThreadLocalStressTest : TestBase() { withContext(threadLocal.asContextElement("foo")) { yield() cancel() - suspendCancellableCoroutineReusable { } + suspendCancellableCoroutineReusable { } } } finally { assertEquals(expectedValue, threadLocal.get()) } } + + /* + * Another set of tests for undispatcheable continuations that do not require stress test multiplier. + * Also note that `uncaughtExceptionHandler` is used as the only available mechanism to propagate error from + * `resumeWith` + */ + + @Test + fun testNonDispatcheableLeak() { + repeat(100) { + doTestWithPreparation( + ::doTest, + { threadLocal.set(null) }) { threadLocal.get() == null } + assertNull(threadLocal.get()) + } + } + + @Test + fun testNonDispatcheableLeakWithInitial() { + repeat(100) { + doTestWithPreparation(::doTest, { threadLocal.set("initial") }) { threadLocal.get() == "initial" } + assertEquals("initial", threadLocal.get()) + } + } + + @Test + fun testNonDispatcheableLeakWithContextSwitch() { + repeat(100) { + doTestWithPreparation( + ::doTestWithContextSwitch, + { threadLocal.set(null) }) { threadLocal.get() == null } + assertNull(threadLocal.get()) + } + } + + @Test + fun testNonDispatcheableLeakWithInitialWithContextSwitch() { + repeat(100) { + doTestWithPreparation( + ::doTestWithContextSwitch, + { threadLocal.set("initial") }) { true /* can randomly wake up on the non-main thread */ } + // Here we are always on the main thread + assertEquals("initial", threadLocal.get()) + } + } + + private fun doTestWithPreparation(testBody: suspend () -> Unit, setup: () -> Unit, isValid: () -> Boolean) { + setup() + val latch = CountDownLatch(1) + testBody.startCoroutineUninterceptedOrReturn(Continuation(EmptyCoroutineContext) { + if (!isValid()) { + Thread.currentThread().uncaughtExceptionHandler.uncaughtException( + Thread.currentThread(), + IllegalStateException("Unexpected error: thread local was not cleaned") + ) + } + latch.countDown() + }) + latch.await() + } + + private suspend fun doTest() { + withContext(threadLocal.asContextElement("foo")) { + try { + coroutineScope { + val semaphore = Semaphore(1, 1) + cancel() + semaphore.acquire() + } + } catch (e: CancellationException) { + // Ignore cancellation + } + } + } + + private suspend fun doTestWithContextSwitch() { + withContext(threadLocal.asContextElement("foo")) { + try { + coroutineScope { + val semaphore = Semaphore(1, 1) + GlobalScope.launch { }.join() + cancel() + semaphore.acquire() + } + } catch (e: CancellationException) { + // Ignore cancellation + } + } + } } From 31b9269a8cc7b295af985b8a554cab3fb735415e Mon Sep 17 00:00:00 2001 From: mvicsokolova <82594708+mvicsokolova@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:32:50 +0300 Subject: [PATCH 276/328] Update atomicfu 0.17.2 (#3255) * Update kotlinx.atomicfu to 0.17.2 * Turn on atomicfu IR transformation for Kotlin/JS --- gradle.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8faae9eb68..9040425dbe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ kotlin_version=1.6.20 # Dependencies junit_version=4.12 junit5_version=5.7.0 -atomicfu_version=0.17.0 +atomicfu_version=0.17.2 knit_version=0.3.0 html_version=0.7.2 lincheck_version=2.14 @@ -58,3 +58,4 @@ org.gradle.jvmargs=-Xmx3g kotlin.mpp.enableCompatibilityMetadataVariant=true kotlin.mpp.stability.nowarn=true +kotlinx.atomicfu.enableIrTransformation=true From 194e6b659890b2ecc6c14d904e8d2d7c5bf424a9 Mon Sep 17 00:00:00 2001 From: koo-taejin Date: Fri, 22 Apr 2022 17:09:34 +0900 Subject: [PATCH 277/328] Remove duplicate allowed method in BlockHound integration (#3260) --- kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt index 9cafffb038..f172bd4288 100644 --- a/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt +++ b/kotlinx-coroutines-debug/src/CoroutinesBlockHoundIntegration.kt @@ -120,7 +120,7 @@ public class CoroutinesBlockHoundIntegration : BlockHoundIntegration { private fun BlockHound.Builder.allowBlockingCallsInArrayChannel() { for (method in listOf( "pollInternal", "isEmpty", "isFull", "isClosedForReceive", "offerInternal", "offerSelectInternal", - "enqueueSend", "pollInternal", "pollSelectInternal", "enqueueReceiveInternal", "onCancelIdempotent")) + "enqueueSend", "pollSelectInternal", "enqueueReceiveInternal", "onCancelIdempotent")) { allowBlockingCallsInside("kotlinx.coroutines.channels.ArrayChannel", method) } From 35cd6d4074b7eeb6c06c60eba0a346198d152cc1 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 26 Apr 2022 05:54:14 -0700 Subject: [PATCH 278/328] Update Dokka and Knit (#3264) Fixes #3177 Fixes #2991 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 9040425dbe..08d156f744 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,10 @@ kotlin_version=1.6.20 junit_version=4.12 junit5_version=5.7.0 atomicfu_version=0.17.2 -knit_version=0.3.0 +knit_version=0.4.0 html_version=0.7.2 lincheck_version=2.14 -dokka_version=1.6.10 +dokka_version=1.6.21 byte_buddy_version=1.10.9 reactor_version=3.4.1 reactive_streams_version=1.0.3 From d3a9c9d118bb7d16ddef56b7f42723ab598facba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=97=B0=EC=84=9D?= Date: Mon, 16 May 2022 16:12:08 +0900 Subject: [PATCH 279/328] Fix typo in Flow.scan and runningFold documentation (#3284) --- .../common/src/flow/operators/Transform.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt index 35fc96d55d..0f9e3959e3 100644 --- a/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt +++ b/kotlinx-coroutines-core/common/src/flow/operators/Transform.kt @@ -81,7 +81,7 @@ public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform * ``` * flowOf(1, 2, 3).scan(emptyList()) { acc, value -> acc + value }.toList() * ``` - * will produce `[], [1], [1, 2], [1, 2, 3]]`. + * will produce `[], [1], [1, 2], [1, 2, 3]`. * * This function is an alias to [runningFold] operator. */ @@ -94,7 +94,7 @@ public fun Flow.scan(initial: R, @BuilderInference operation: suspend * ``` * flowOf(1, 2, 3).runningFold(emptyList()) { acc, value -> acc + value }.toList() * ``` - * will produce `[], [1], [1, 2], [1, 2, 3]]`. + * will produce `[], [1], [1, 2], [1, 2, 3]`. */ public fun Flow.runningFold(initial: R, @BuilderInference operation: suspend (accumulator: R, value: T) -> R): Flow = flow { var accumulator: R = initial From 0fe8f92b3e638c4a8aa7b926468bb8040d991af3 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 16 May 2022 18:56:15 +0600 Subject: [PATCH 280/328] Fix data-race in Mutex owner when mutex is locked/released inconsistently (#3286) Fixes #3250 --- kotlinx-coroutines-core/common/src/sync/Mutex.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlinx-coroutines-core/common/src/sync/Mutex.kt b/kotlinx-coroutines-core/common/src/sync/Mutex.kt index d2a2fcd41b..681d5db6b0 100644 --- a/kotlinx-coroutines-core/common/src/sync/Mutex.kt +++ b/kotlinx-coroutines-core/common/src/sync/Mutex.kt @@ -361,7 +361,7 @@ internal class MutexImpl(locked: Boolean) : Mutex, SelectClause2 { } private class LockedQueue( - @JvmField var owner: Any + @Volatile @JvmField var owner: Any ) : LockFreeLinkedListHead() { override fun toString(): String = "LockedQueue[$owner]" } From 5896b731e45164dae8ddd7c1072e16b6f5bb896e Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Mon, 16 May 2022 19:20:26 +0600 Subject: [PATCH 281/328] Improve videos section in readme (#3285) * Add a link to talk about the history of structured concurrency in kotlinx.coroutines * Sightly reorder videos section and remove way too obsolete introduction that is covered by coroutines in practice Fixes #3273 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9d7970316a..e08235ffb0 100644 --- a/README.md +++ b/README.md @@ -61,9 +61,9 @@ suspend fun main() = coroutineScope { ## Documentation * Presentations and videos: - * [Introduction to Coroutines](https://www.youtube.com/watch?v=_hfBv0a09Jc) (Roman Elizarov at KotlinConf 2017, [slides](https://www.slideshare.net/elizarov/introduction-to-coroutines-kotlinconf-2017)) - * [Deep dive into Coroutines](https://www.youtube.com/watch?v=YrrUCSi72E8) (Roman Elizarov at KotlinConf 2017, [slides](https://www.slideshare.net/elizarov/deep-dive-into-coroutines-on-jvm-kotlinconf-2017)) * [Kotlin Coroutines in Practice](https://www.youtube.com/watch?v=a3agLJQ6vt8) (Roman Elizarov at KotlinConf 2018, [slides](https://www.slideshare.net/elizarov/kotlin-coroutines-in-practice-kotlinconf-2018)) + * [Deep Dive into Coroutines](https://www.youtube.com/watch?v=YrrUCSi72E8) (Roman Elizarov at KotlinConf 2017, [slides](https://www.slideshare.net/elizarov/deep-dive-into-coroutines-on-jvm-kotlinconf-2017)) + * [History of Structured Concurrency in Coroutines](https://www.youtube.com/watch?v=Mj5P47F6nJg) (Roman Elizarov at Hydra 2019, [slides](https://speakerdeck.com/elizarov/structured-concurrency)) * Guides and manuals: * [Guide to kotlinx.coroutines by example](https://kotlinlang.org/docs/coroutines-guide.html) (**read it first**) * [Guide to UI programming with coroutines](ui/coroutines-guide-ui.md) From b8c9aae762f20e6202d406e62f5c6ef9fdca8dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=B2?= Date: Tue, 17 May 2022 20:44:47 +0800 Subject: [PATCH 282/328] Add missing playground runnable comments (#3258) --- docs/topics/channels.md | 3 +++ docs/topics/exception-handling.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/docs/topics/channels.md b/docs/topics/channels.md index 7f41eaec2b..7cf222c8a0 100644 --- a/docs/topics/channels.md +++ b/docs/topics/channels.md @@ -573,6 +573,7 @@ Now let's see how it works in practice: import kotlinx.coroutines.* import kotlinx.coroutines.channels.* +//sampleStart fun main() = runBlocking { val tickerChannel = ticker(delayMillis = 100, initialDelayMillis = 0) // create ticker channel var nextElement = withTimeoutOrNull(1) { tickerChannel.receive() } @@ -596,7 +597,9 @@ fun main() = runBlocking { tickerChannel.cancel() // indicate that no more elements are needed } +//sampleEnd ``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-channel-10.kt). > diff --git a/docs/topics/exception-handling.md b/docs/topics/exception-handling.md index 5ee55437db..c3e6135dd0 100644 --- a/docs/topics/exception-handling.md +++ b/docs/topics/exception-handling.md @@ -28,6 +28,7 @@ It can be demonstrated by a simple example that creates root coroutines using th ```kotlin import kotlinx.coroutines.* +//sampleStart @OptIn(DelicateCoroutinesApi::class) fun main() = runBlocking { val job = GlobalScope.launch { // root coroutine with launch @@ -47,7 +48,9 @@ fun main() = runBlocking { println("Caught ArithmeticException") } } +//sampleEnd ``` +{kotlin-runnable="true" kotlin-min-compiler-version="1.3"} > You can get the full code [here](../../kotlinx-coroutines-core/jvm/test/guide/example-exceptions-01.kt). > From 155868f6d1a025f075e9f85126015b76f8f2677b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojtek=20Kalici=C5=84ski?= Date: Tue, 17 May 2022 18:00:08 +0200 Subject: [PATCH 283/328] Update to Gradle 7.4.2, Kotlin 1.6.21, other plugin updates (#3281) --- .gitignore | 1 + benchmarks/build.gradle.kts | 9 +++-- build.gradle | 13 +++---- buildSrc/src/main/kotlin/Publishing.kt | 6 ++++ .../animalsniffer-conventions.gradle.kts | 20 ++++++----- gradle.properties | 4 +-- gradle/compile-js-multiplatform.gradle | 2 +- gradle/dokka.gradle.kts | 4 --- gradle/node-js.gradle | 6 ++-- gradle/publish.gradle | 5 +-- gradle/test-mocha-js.gradle | 35 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- integration-testing/build.gradle | 6 ++-- .../kotlinx-coroutines-guava/build.gradle.kts | 2 +- kotlinx-coroutines-core/build.gradle | 2 ++ kotlinx-coroutines-debug/build.gradle | 4 +-- .../build.gradle.kts | 4 +-- .../build.gradle.kts | 4 +-- settings.gradle | 1 - ui/kotlinx-coroutines-swing/build.gradle.kts | 2 +- 20 files changed, 72 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 52843ca5b7..36de0e50da 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ build out target local.properties +/kotlin-js-store diff --git a/benchmarks/build.gradle.kts b/benchmarks/build.gradle.kts index b7dcb57968..f64c4aaa21 100644 --- a/benchmarks/build.gradle.kts +++ b/benchmarks/build.gradle.kts @@ -8,7 +8,6 @@ import me.champeau.gradle.* import org.jetbrains.kotlin.gradle.tasks.* plugins { - id("net.ltgt.apt") id("com.github.johnrengelman.shadow") id("me.champeau.gradle.jmh") apply false } @@ -31,8 +30,6 @@ tasks.named("compileJmhKotlin") { } } - - // It is better to use the following to run benchmarks, otherwise you may get unexpected errors: // ./gradlew --no-daemon cleanJmhJar jmh -Pjmh="MyBenchmark" extensions.configure("jmh") { @@ -54,6 +51,12 @@ val jmhJarTask = tasks.named("jmhJar") { } tasks { + // For some reason the DuplicatesStrategy from jmh is not enough + // and errors with duplicates appear unless I force it to WARN only: + withType { + duplicatesStrategy = DuplicatesStrategy.WARN + } + build { dependsOn(jmhJarTask) } diff --git a/build.gradle b/build.gradle index bbf24f21d8..649434bba8 100644 --- a/build.gradle +++ b/build.gradle @@ -54,13 +54,13 @@ buildscript { classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version" classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version" classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version" - classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version" + classpath "com.github.node-gradle:gradle-node-plugin:$gradle_node_version" classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version" - classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.3" // Android API check + classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.4" // Android API check classpath "org.jetbrains.kotlinx:kover:$kover_version" // JMH plugins - classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0" + classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.2" } CacheRedirector.configureBuildScript(buildscript, rootProject) @@ -130,6 +130,9 @@ allprojects { } } +// needs to be before evaluationDependsOn due to weird Gradle ordering +apply plugin: "animalsniffer-conventions" + // Add dependency to core source sets. Core is configured in kx-core/build.gradle configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) { evaluationDependsOn(":$coreModule") @@ -232,7 +235,7 @@ def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/" def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/htmlPartial/package-list" apply plugin: "org.jetbrains.dokka" -configure(subprojects.findAll { !unpublished.contains(it.name) }) { +configure(subprojects.findAll { !unpublished.contains(it.name) && it.name != coreModule }) { if (it.name != 'kotlinx-coroutines-bom') { apply from: rootProject.file('gradle/dokka.gradle.kts') } @@ -303,8 +306,6 @@ def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm" task deploy(dependsOn: publishTasks) -apply plugin: "animalsniffer-conventions" - clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') } // --------------- Knit configuration --------------- diff --git a/buildSrc/src/main/kotlin/Publishing.kt b/buildSrc/src/main/kotlin/Publishing.kt index 8c6dd5de3d..cb612c5077 100644 --- a/buildSrc/src/main/kotlin/Publishing.kt +++ b/buildSrc/src/main/kotlin/Publishing.kt @@ -7,6 +7,7 @@ import org.gradle.api.Project import org.gradle.api.artifacts.dsl.* import org.gradle.api.publish.maven.* +import org.gradle.kotlin.dsl.* import org.gradle.plugins.signing.* import java.net.* @@ -56,6 +57,11 @@ fun configureMavenPublication(rh: RepositoryHandler, project: Project) { password = project.getSensitiveProperty("libs.sonatype.password") } } + + // Something that's easy to "clean" for development, not mavenLocal + rh.maven("${project.rootProject.buildDir}/repo") { + name = "buildRepo" + } } fun signPublicationIfKeyPresent(project: Project, publication: MavenPublication) { diff --git a/buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts b/buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts index 32b4931e57..f00a0b315f 100644 --- a/buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/animalsniffer-conventions.gradle.kts @@ -4,17 +4,19 @@ import ru.vyarus.gradle.plugin.animalsniffer.* -subprojects { +configure(subprojects) { // Skip JDK 8 projects or unpublished ones - if (!shouldSniff()) return@subprojects + if (!shouldSniff()) return@configure apply(plugin = "ru.vyarus.animalsniffer") - configure { - sourceSets = listOf((project.extensions.getByName("sourceSets") as SourceSetContainer).getByName("main")) - } - val signature: Configuration by configurations - dependencies { - signature("net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature") - signature("org.codehaus.mojo.signature:java17:1.0@signature") + project.plugins.withType(JavaPlugin::class.java) { + configure { + sourceSets = listOf((project.extensions.getByName("sourceSets") as SourceSetContainer).getByName("main")) + } + val signature: Configuration by configurations + dependencies { + signature("net.sf.androidscents.signature:android-api-level-14:4.0_r4@signature") + signature("org.codehaus.mojo.signature:java17:1.0@signature") + } } } diff --git a/gradle.properties b/gradle.properties index 08d156f744..320f41d0fd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ # Kotlin version=1.6.1-SNAPSHOT group=org.jetbrains.kotlinx -kotlin_version=1.6.20 +kotlin_version=1.6.21 # Dependencies junit_version=4.12 @@ -35,7 +35,7 @@ baksmali_version=2.2.7 # JS kotlin.js.compiler=both -gradle_node_version=1.2.0 +gradle_node_version=3.1.1 node_version=10.0.0 npm_version=5.7.1 mocha_version=6.2.2 diff --git a/gradle/compile-js-multiplatform.gradle b/gradle/compile-js-multiplatform.gradle index d6df7e403a..c6fc757c7d 100644 --- a/gradle/compile-js-multiplatform.gradle +++ b/gradle/compile-js-multiplatform.gradle @@ -60,7 +60,7 @@ compileTestJsLegacy.configure { task populateNodeModules(type: Copy, dependsOn: compileTestJsLegacy) { // we must copy output that is transformed by atomicfu from(kotlin.js().compilations.main.output.allOutputs) - into "$node.nodeModulesDir/node_modules" + into node.nodeProjectDir.dir("node_modules") def configuration = configurations.hasProperty("jsLegacyTestRuntimeClasspath") ? configurations.jsLegacyTestRuntimeClasspath diff --git a/gradle/dokka.gradle.kts b/gradle/dokka.gradle.kts index 8be4fbe231..2470ded3ea 100644 --- a/gradle/dokka.gradle.kts +++ b/gradle/dokka.gradle.kts @@ -39,10 +39,6 @@ tasks.withType(DokkaTaskPartial::class).configureEach { if (!project.isMultiplatform) { dependsOn(project.configurations["compileClasspath"]) - doFirst { - // resolve classpath only during execution - classpath.from(project.configurations["compileClasspath"].files)// + project.sourceSets.main.output.files) - } } } } diff --git a/gradle/node-js.gradle b/gradle/node-js.gradle index 42f101c5f4..5eddc5fa37 100644 --- a/gradle/node-js.gradle +++ b/gradle/node-js.gradle @@ -2,13 +2,13 @@ * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ -apply plugin: 'com.moowork.node' +apply plugin: 'com.github.node-gradle.node' node { version = "$node_version" npmVersion = "$npm_version" download = true - nodeModulesDir = file(buildDir) + nodeProjectDir = file(buildDir) } // Configures testing for JS modules @@ -25,7 +25,7 @@ task prepareNodePackage(type: Copy) { from("npm") { exclude 'package.json' } - into "$node.nodeModulesDir" + into node.nodeProjectDir } npmInstall.dependsOn prepareNodePackage diff --git a/gradle/publish.gradle b/gradle/publish.gradle index fa2bbb8544..00034bfa87 100644 --- a/gradle/publish.gradle +++ b/gradle/publish.gradle @@ -6,7 +6,6 @@ import org.gradle.util.VersionNumber // Configures publishing of Maven artifacts to Maven Central -apply plugin: 'maven' apply plugin: 'maven-publish' apply plugin: 'signing' @@ -16,7 +15,9 @@ def isMultiplatform = project.name == "kotlinx-coroutines-core" || project.name def isBom = project.name == "kotlinx-coroutines-bom" if (!isBom) { - apply plugin: "com.github.johnrengelman.shadow" + if (project.name == "kotlinx-coroutines-debug") { + apply plugin: "com.github.johnrengelman.shadow" + } // empty xxx-javadoc.jar task javadocJar(type: Jar) { diff --git a/gradle/test-mocha-js.gradle b/gradle/test-mocha-js.gradle index d011eeaa20..27d2e5b394 100644 --- a/gradle/test-mocha-js.gradle +++ b/gradle/test-mocha-js.gradle @@ -9,7 +9,7 @@ task installDependenciesMochaNode(type: NpmTask, dependsOn: [npmInstall]) { "mocha@$mocha_version", "source-map-support@$source_map_support_version", '--no-save'] - if (project.hasProperty("teamcity")) args += ["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"] + if (project.hasProperty("teamcity")) args.addAll(["mocha-teamcity-reporter@$mocha_teamcity_reporter_version"]) } def compileJsLegacy = tasks.hasProperty("compileKotlinJsLegacy") @@ -22,9 +22,9 @@ def compileTestJsLegacy = tasks.hasProperty("compileTestKotlinJsLegacy") // todo: use atomicfu-transformed test files here (not critical) task testMochaNode(type: NodeTask, dependsOn: [compileTestJsLegacy, installDependenciesMochaNode]) { - script = file("$node.nodeModulesDir/node_modules/mocha/bin/mocha") - args = [compileTestJsLegacy.outputFile, '--require', 'source-map-support/register'] - if (project.hasProperty("teamcity")) args += ['--reporter', 'mocha-teamcity-reporter'] + script = file("${node.nodeProjectDir.getAsFile().get()}/node_modules/mocha/bin/mocha") + args = [compileTestJsLegacy.outputFile.path, '--require', 'source-map-support/register'] + if (project.hasProperty("teamcity")) args.addAll(['--reporter', 'mocha-teamcity-reporter']) } def jsLegacyTestTask = project.tasks.findByName('jsLegacyTest') ? jsLegacyTest : jsTest @@ -40,8 +40,8 @@ task installDependenciesMochaChrome(type: NpmTask, dependsOn: [npmInstall]) { "kotlin@$kotlin_version", "kotlin-test@$kotlin_version", '--no-save'] - if (project.hasProperty("teamcity")) args += [ - "mocha-teamcity-reporter@$mocha_teamcity_reporter_version"] + if (project.hasProperty("teamcity")) args.addAll([ + "mocha-teamcity-reporter@$mocha_teamcity_reporter_version"]) } def mochaChromeTestPage = file("$buildDir/test-page.html") @@ -51,19 +51,20 @@ task prepareMochaChrome(dependsOn: [compileTestJsLegacy, installDependenciesMoch } prepareMochaChrome.doLast { + def nodeProjDir = node.nodeProjectDir.getAsFile().get() mochaChromeTestPage.text = """ Mocha Tests - +