Releases: Kotlin/kotlinx.coroutines
Releases · Kotlin/kotlinx.coroutines
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
CopyableThreadContextElementto solve issues uncovered after the initial release (#3227). - Fixed a bug with
ThreadLocalElementnot being properly updated in racy scenarios (#2930). - Reverted eager loading of default
CoroutineExceptionHandlerthat triggered ANR on some devices (#3180). - New API to convert a
CoroutineDispatcherto a Rx scheduler (#968, #548). Thanks @recheej! - Fixed a memory leak with the very last element emitted from
flowbuilder being retained in memory (#3197). - Fixed a bug with
limitedParallelismon K/N with new memory model throwingClassCastException(#3223). CoroutineContextis added to the exception printed to the defaultCoroutineExceptionHandlerto improve debuggability (#3153).- Static memory consumption of
Dispatchers.Defaultwas significantly reduced (#3137). - Updated slf4j version in
kotlinx-coroutines-slf4jfrom 1.7.25 to 1.7.32.
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.
kotlinx-coroutines-test rework
kotlinx-coroutines-testbecame 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), and the migration path is designed to be graceful: migration guide.
Dispatchers
- Introduced
CoroutineDispatcher.limitedParallelismthat allows obtaining a view of the original dispatcher with limited parallelism (#2919). Dispatchers.IO.limitedParallelismusages ignore the bound on the parallelism level ofDispatchers.IOitself to avoid starvation (#2943).- Introduced new
Dispatchers.shutdownmethod for containerized environments (#2558). newSingleThreadContextandnewFixedThreadPoolContextare promoted to delicate API (#2919).
Breaking changes
- When racing with cancellation, the
futurebuilder no longer reports unhandled exceptions into the globalCoroutineExceptionHandler. Thanks @vadimsemenov! (#2774, #2791). Mutex.onLockis deprecated for removal (#2794).Dispatchers.Mainis now used as the default source of time fordelayandwithTimeoutwhen present (#2972).- To opt-out from this behaviour,
kotlinx.coroutines.main.delaysystem property can be set tofalse.
- To opt-out from this behaviour,
- Java target of coroutines build is now 8 instead of 6 (#1589).
- Source-breaking change: extension
collectno longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #3107 for the additional details.
Bug fixes and improvements
- Kotlin is updated to 1.6.0.
- Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether
kotlin.native.binary.memoryModelis enabled (#2914). - Introduced
CopyableThreadContextElementfor mutable context elements shared among multiple coroutines. Thanks @yorickhenning! (#2893). transformWhile,awaitClose,ProducerScope,merge,runningFold,runingReduce, andscanare promoted to stable API (#2971).SharedFlow.subscriptionCountno longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).Flowexception 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.collectnow returnsNothing(#2789, #2502).DisposableHandleis nowfun interface, and corresponding inline extension is removed (#2790).FlowCollectoris nowfun interface, and corresponding inline extension is removed (#3047).- 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
Taskcallbacks inkotlinx-coroutines-play-services(#2990). - Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
- Default
CoroutineExceptionHandleris loaded eagerly and does not invokeServiceLoaderon its exception-handling path (#2552). - Fixed the R8 rules for
ServiceLoaderoptimization (#2880). - Fixed BlockHound integration false-positives (#2894, #2866, #2937).
- Fixed the exception handler being invoked several times on Android, thanks to @1zaman (#3056).
SendChannel.trySendBlockingis now available on Kotlin/Native (#3064).- The exception recovery mechanism now uses
ClassValuewhen available (#2997). - JNA is updated to 5.9.0 to support Apple M1 (#3001).
- Obsolete method on internal
Delayinterface is deprecated (#2979). - Support of deprecated
CommonPoolis removed. @ExperimentalTimeis no longer needed for methods that useDuration(#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).
1.6.0-RC3
- Fixed the error in 1.6.0-RC2 because of which
Flow.collectcouldn't be called due to the@InternalCoroutinesApiannotation (#3082) - Fixed some R8 warnings introduced in 1.6.0-RC (#3090)
TestCoroutineSchedulernow provides aTimeSourcewith its virtual time via thetimeSourceproperty. Thanks @hfhbd! (#3087)
1.6.0-RC2
@ExperimentalTimeis no longer needed for methods that useDuration(#3041).FlowCollectoris nowfun interface, and corresponding inline extension is removed (#3047).- Fixed the exception handler being invoked several times on Android, thanks to @1zaman (#3056).
- The deprecated
TestCoroutineScopeis no longer sealed, to simplify migration from it (#3072). runTestgives more informative errors when it times out waiting for external completion (#3071).SendChannel.trySendBlockingis now available on Kotlin/Native (#3064).- Fixed the bug due to which
Dispatchers.Mainwas not used fordelayandwithTimeout(#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).
1.6.0-RC
kotlinx-coroutines-test rework
kotlinx-coroutines-testbecame 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), and the migration path is designed to be graceful: migration guide
Dispatchers
- Introduced
CoroutineDispatcher.limitedParallelismthat allows obtaining a view of the original dispatcher with limited parallelism (#2919). Dispatchers.IO.limitedParallelismusages ignore the bound on the parallelism level ofDispatchers.IOitself to avoid starvation (#2943).- Introduced new
Dispatchers.shutdownmethod for containerized environments (#2558). newSingleThreadContextandnewFixedThreadPoolContextare promoted to delicate API (#2919).
Breaking changes
- When racing with cancellation, the
futurebuilder no longer reports unhandled exceptions into the globalCoroutineExceptionHandler. Thanks @vadimsemenov! (#2774, #2791). Mutex.onLockis deprecated for removal (#2794).Dispatchers.Mainis now used as the default source of time fordelayandwithTimeoutwhen present(#2972).- To opt-out from this behaviour,
kotlinx.coroutines.main.delaysystem property can be set tofalse.
- To opt-out from this behaviour,
- 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 is now supported in regular builds of coroutines conditionally depending on whether
kotlin.native.binary.memoryModelis enabled (#2914). - Introduced
CopyableThreadContextElementfor mutable context elements shared among multiple coroutines. Thanks @yorickhenning! (#2839 ). transformWhile,awaitClose,ProducerScope,merge,runningFold,runingReduce, andscanare promoted to stable API (#2971).SharedFlow.subscriptionCountno longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).Flowexception 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.collectnow returnsNothing(#2789, #2502).FlowCollectoris nowfun 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
Taskcallbacks inkotlinx-coroutines-play-services(#2990). - Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
- Default
CoroutineExceptionHandleris loaded eagerly and does not invokeServiceLoaderon its exception-handling path (#2552). - Fixed the R8 rules for
ServiceLoaderoptimization (#2880). - Fixed BlockHound integration false-positives (#2894, #2866, #2937).
- The exception recovery mechanism now uses
ClassValuewhen available (#2997). - JNA is updated to 5.9.0 to support Apple M1 (#3001).
- Obsolete method on internal
Delayinterface is deprecated (#2979). - Support of deprecated
CommonPoolis removed.
1.5.2
- Kotlin is updated to 1.5.30.
- New native targets for Apple Silicon are introduced.
- Fixed a bug when
onUndeliveredElementwas incorrectly called on properly received elements on JS (#2826). - Fixed
Dispatchers.Defaulton React Native, it now fully relies onsetTimeoutinstead of stubprocess.nextTick. Thanks to @Legion2 (#2843). - Optimizations of
Muteximplementation (#2581). Muteximplementation is made completely lock-free as stated (#2590).- Various documentation and guides improvements. Thanks to @MasoodFallahpoor and @pihanya.
1.5.1
- Atomic
update,getAndUpdate, andupdateAndGetoperations ofMutableStateFlow(#2720). Executor.asCoroutineDispatcherimplementation improvements (#2601):- If the target executor is
ScheduledExecutorService, then itsscheduleAPI is used for time-related coroutine operations. RemoveOnCancelPolicyis now part of the public contract.
- If the target executor is
- Introduced overloads for
Task.asDeferredandTask.awaitthat acceptCancellationTokenSourcefor bidirectional cancellation (#2527). - Reactive streams are updated to
1.0.3(#2740). CopyableThrowableis allowed to modify the exception message during stacktrace recovery (#1931).CoroutineDispatcher.releaseInterceptedContinuationis now afinalmethod (#2785).- Closing a Handler underlying
Handler.asCoroutineDispatchernow causes the dispatched coroutines to be canceled onDispatchers.IO (#2778). - Kotlin is updated to 1.5.20.
- Fixed a spurious
ClassCastExceptioninreleaseInterceptedContinuationandIllegalStateExceptionfromtryReleaseClaimedContinuation(#2736, #2768). - Fixed inconsistent exception message during stacktrace recovery for non-suspending channel iterators (#2749).
- Fixed linear stack usage for
CompletableFuture.asDeferredwhen the target future has a long chain of listeners (#2730). - Any exceptions from
CoroutineDispatcher.isDispatchNeededare now considered as fatal and are propagated to the caller (#2733). - Internal
DebugProbesKt(used in the debugger implementation) are moved fromdebugtocoremodule.
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, andsendBlockingmethods are deprecated, internalreceiveCatchingandonReceiveCatchingremoved,receiveOrNullandonReceiveOrNullare completely deprecated. Previously deprecatedSendChannel.isFulldeclaration is removed. Channel operators deprecated withERRORare nowHIDDEN. - New methods
receiveCatching,onReceiveCatchingtrySend,tryReceive, andtrySendBlockingalong with the new result typeChannelResultare 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. BroadcastChannelandConflatedBroadcastChannelare marked asObsoleteCoroutinesApiin the favor orSharedFlowandStateFlow. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release.callbackFlowandchannelFloware promoted to stable API.
Reactive integrations
- All existing API in modules
kotlinx-coroutines-rx2,kotlinx-coroutines-rx3,kotlinx-coroutines-reactive,kotlinx-coroutines-reactor, andkotlinx-coroutines-jdk9were revisited and promoted to stable (#2545). publishis no longer allowed to emitnullvalues (#2646).- Misleading
awaitSingleOr*functions onPublishertype are deprecated (#2591). MaybeSource.awaitis deprecated in the favor ofawaitSingle, additional lint functions forMonoare added in order to prevent ambiguousPublisherusages (#2628, #1587).ContextViewsupport inkotlinx-coroutines-reactor(#2575).- All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646).
MaybeSource.collectandMaybe.collectproperly 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
- Kotlin version is upgraded to 1.5.0 and JVM target is updated to 1.8.
Flow.lastandFlow.lastOrNulloperators (#2246).Flow.runningFoldoperator (#2641).CoroutinesTimeoutrule for JUnit5 (#2197).- Internals of
JobandAbstractCoroutinewas reworked, resulting in smaller code size, less memory footprint, and better performance (#2513, #2512). CancellationExceptionfrom Kotlin standard library is used for cancellation on Koltin/JS and Kotlin/Native (#2638).- Introduced new
DelicateCoroutinesApiannotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now isGlobalScope(#2637). - Fixed bug introduced in
1.4.3whenkotlinx-coroutines-core.jartriggered IDEA debugger failure (#2619). - Fixed memory leak of
ChildHandlerNodewith 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
emitAllcalled from cancelledonCompletionoperator (#2700). - Flows returned by
stateIn/shareInkeep strong reference to sharing job (#2557). - Rename internal
TimeSourcetoAbstractTimeSourcedue to import issues (#2691). - Reverted the change that triggered IDEA coroutines debugger crash (#2695, reverted #2291).
watchosX64target support for Kotlin/Native (#2524).- Various documentation fixes and improvements.
1.5.0-RC
Channels API
- Major channels API rework (#330, #974). Existing
offer,poll, andsendBlockingmethods are deprecated, internalreceiveCatchingandonReceiveCatchingremoved,receiveOrNullandonReceiveOrNullare completely deprecated. Previously deprecatedSendChannel.isFulldeclaration is removed. Channel operators deprecated withERRORare nowHIDDEN. - New methods
receiveCatching,onReceiveCatchingtrySend,tryReceive, andtrySendBlockingalong with the new result typeChannelResultare 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. BroadcastChannelandConflatedBroadcastChannelare marked asObsoleteCoroutinesApiin the favor orSharedFlowandStateFlow. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release.callbackFlowandchannelFloware promoted to stable API.
Reactive integrations
- All existing API in modules
kotlinx-coroutines-rx2,kotlinx-coroutines-rx3,kotlinx-coroutines-reactive,kotlinx-coroutines-reactor, andkotlinx-coroutines-jdk9were revisited and promoted to stable (#2545). publishis no longer allowed to emitnullvalues (#2646).- Misleading
awaitSingleOr*functions onPublishertype are deprecated (#2591). MaybeSource.awaitis deprecated in the favor ofawaitSingle, additional lint functions forMonoare added in order to prevent ambiguousPublisherusages (#2628, #1587).ContextViewsupport inkotlinx-coroutines-reactor(#2575).- All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646).
MaybeSource.collectandMaybe.collectproperly 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.lastandFlow.lastOrNulloperators (#2246).Flow.runningFoldoperator (#2641).CoroutinesTimeoutrule for JUnit5 (#2197).- Internals of
JobandAbstractCoroutinewas reworked, resulting in smaller code size, less memory footprint, and better performance (#2513, #2512). CancellationExceptionfrom Kotlin standard library is used for cancellation on Koltin/JS and Kotlin/Native (#2638).- Introduced new
DelicateCoroutineApiannotation that warns users about potential target API pitfalls and suggests studying API's documentation first. The only delicate API right now isGlobalScope(#2637). - Fixed bug introduced in
1.4.3whenkotlinx-coroutines-core.jartriggered IDEA debugger failure (#2619). - Fixed memory leak of
ChildHandlerNodewith reusable continuations (#2564). - Various documentation improvements (#2555, #2589, #2592, #2583, #2437, #2616, #2633, #2560).
1.4.3
General changes
- Thread context is properly preserved and restored for coroutines without
ThreadContextElement(#985) ThreadContextElements are now restored in the opposite order from update (#2195)- Improved performance of combine with 4 parameters, thanks to @alexvanyo (#2419)
- Debug agent sanitizer leaves at least one frame with source location (#1437)
- Update Reactor version in
kotlinx-coroutines-reactorto3.4.1, thanks to @sokomishalov (#2432) callsInPlacecontract added toReceiveChannel.consume(#941)CoroutineStart.UNDISPATCHEDpromoted to stable API (#1393)- Kotlin updated to 1.4.30
kotlinx.coroutinesare now released directly to MavenCentral- Reduced the size of
DispatchedCoroutineby a field - Internal class
TimeSourcerenamed toSchedulerTimeSourceto prevent wildcard import issues (#2537)
Bug fixes
- Fixed the problem that prevented implementation via delegation for
Jobinterface (#2423) - Fixed incorrect ProGuard rules that allowed shrinking volatile felds (#1564)
- Fixed
await/asDeferredforMinimalStageimplementations in jdk8 module (#2456) - Fixed bug when
onUndeliveredElementwasn't called for unlimited channels (#2435) - Fixed a bug when
ListenableFuture.isCancelledreturned fromasListenableFuturecould have thrown an exception, thanks to @vadimsemenov (#2421) - Coroutine in
callbackFlowandproduceis properly cancelled when the channel was closed separately (#2506)