Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce CloseableCoroutineDispatcher abstract class #2903

Merged
merged 7 commits into from
Sep 9, 2021
13 changes: 13 additions & 0 deletions kotlinx-coroutines-core/common/src/Annotations.kt
Expand Up @@ -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

Expand Down
28 changes: 28 additions & 0 deletions 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
qwwdfsad marked this conversation as resolved.
Show resolved Hide resolved
* might be added to this interface in the future, but is stable for use.
*/
@ExperimentalCoroutinesApi
public expect abstract class CloseableCoroutineDispatcher() : CoroutineDispatcher {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It also worth checking if we can make it experimental without propagating experimentality to ExecutorCoroutineDispatcher, will do


/**
* 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()
}
@@ -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()
}
3 changes: 3 additions & 0 deletions kotlinx-coroutines-core/jvm/src/Executors.kt
Expand Up @@ -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].
*
Expand Down
@@ -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()
}