Releases: Kotlin/kotlinx.coroutines
Releases · Kotlin/kotlinx.coroutines
1.6.0-RC2
@ExperimentalTime
is no longer needed for methods that useDuration
(#3041).FlowCollector
is 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
TestCoroutineScope
is no longer sealed, to simplify migration from it (#3072). runTest
gives more informative errors when it times out waiting for external completion (#3071).SendChannel.trySendBlocking
is now available on Kotlin/Native (#3064).- Fixed the bug due to which
Dispatchers.Main
was not used fordelay
andwithTimeout
(#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-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), and the migration path is designed to be graceful: migration guide
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 ofDispatchers.IO
itself to avoid starvation (#2943).- Introduced new
Dispatchers.shutdown
method for containerized environments (#2558). newSingleThreadContext
andnewFixedThreadPoolContext
are promoted to delicate API (#2919).
Breaking changes
- When racing with cancellation, the
future
builder no longer reports unhandled exceptions into the globalCoroutineExceptionHandler
. Thanks @vadimsemenov! (#2774, #2791). Mutex.onLock
is deprecated for removal (#2794).Dispatchers.Main
is now used as the default source of time fordelay
andwithTimeout
when present(#2972).- To opt-out from this behaviour,
kotlinx.coroutines.main.delay
system 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.memoryModel
is enabled (#2914). - Introduced
CopyableThreadContextElement
for mutable context elements shared among multiple coroutines. Thanks @yorickhenning! (#2839 ). transformWhile
,awaitClose
,ProducerScope
,merge
,runningFold
,runingReduce
, andscan
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 returnsNothing
(#2789, #2502).FlowCollector
is 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
Task
callbacks inkotlinx-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 invokeServiceLoader
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.
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 properly received elements on JS (#2826). - Fixed
Dispatchers.Default
on React Native, it now fully relies onsetTimeout
instead of stubprocess.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.
1.5.1
- Atomic
update
,getAndUpdate
, andupdateAndGet
operations ofMutableStateFlow
(#2720). Executor.asCoroutineDispatcher
implementation improvements (#2601):- If the target executor is
ScheduledExecutorService
, then itsschedule
API is used for time-related coroutine operations. RemoveOnCancelPolicy
is now part of the public contract.
- If the target executor is
- Introduced overloads for
Task.asDeferred
andTask.await
that acceptCancellationTokenSource
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 afinal
method (#2785).- Closing a Handler underlying
Handler.asCoroutineDispatcher
now causes the dispatched coroutines to be canceled onDispatchers.IO (#2778)
. - Kotlin is updated to 1.5.20.
- Fixed a spurious
ClassCastException
inreleaseInterceptedContinuation
andIllegalStateException
fromtryReleaseClaimedContinuation
(#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 fromdebug
tocore
module.
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
, andsendBlocking
methods are deprecated, internalreceiveCatching
andonReceiveCatching
removed,receiveOrNull
andonReceiveOrNull
are completely deprecated. Previously deprecatedSendChannel.isFull
declaration is removed. Channel operators deprecated withERROR
are nowHIDDEN
. - New methods
receiveCatching
,onReceiveCatching
trySend
,tryReceive
, andtrySendBlocking
along with the new result typeChannelResult
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. BroadcastChannel
andConflatedBroadcastChannel
are marked asObsoleteCoroutinesApi
in the favor orSharedFlow
andStateFlow
. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release.callbackFlow
andchannelFlow
are 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-jdk9
were revisited and promoted to stable (#2545). publish
is no longer allowed to emitnull
values (#2646).- Misleading
awaitSingleOr*
functions onPublisher
type are deprecated (#2591). MaybeSource.await
is deprecated in the favor ofawaitSingle
, additional lint functions forMono
are added in order to prevent ambiguousPublisher
usages (#2628, #1587).ContextView
support inkotlinx-coroutines-reactor
(#2575).- All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646).
MaybeSource.collect
andMaybe.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
- Kotlin version is upgraded to 1.5.0 and JVM target is updated to 1.8.
Flow.last
andFlow.lastOrNull
operators (#2246).Flow.runningFold
operator (#2641).CoroutinesTimeout
rule for JUnit5 (#2197).- Internals of
Job
andAbstractCoroutine
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
DelicateCoroutinesApi
annotation 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.3
whenkotlinx-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 cancelledonCompletion
operator (#2700). - Flows returned by
stateIn
/shareIn
keep strong reference to sharing job (#2557). - Rename internal
TimeSource
toAbstractTimeSource
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.
1.5.0-RC
Channels API
- Major channels API rework (#330, #974). Existing
offer
,poll
, andsendBlocking
methods are deprecated, internalreceiveCatching
andonReceiveCatching
removed,receiveOrNull
andonReceiveOrNull
are completely deprecated. Previously deprecatedSendChannel.isFull
declaration is removed. Channel operators deprecated withERROR
are nowHIDDEN
. - New methods
receiveCatching
,onReceiveCatching
trySend
,tryReceive
, andtrySendBlocking
along with the new result typeChannelResult
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. BroadcastChannel
andConflatedBroadcastChannel
are marked asObsoleteCoroutinesApi
in the favor orSharedFlow
andStateFlow
. The migration scheme can be found in their documentation. These classes will be deprecated in the next major release.callbackFlow
andchannelFlow
are 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-jdk9
were revisited and promoted to stable (#2545). publish
is no longer allowed to emitnull
values (#2646).- Misleading
awaitSingleOr*
functions onPublisher
type are deprecated (#2591). MaybeSource.await
is deprecated in the favor ofawaitSingle
, additional lint functions forMono
are added in order to prevent ambiguousPublisher
usages (#2628, #1587).ContextView
support inkotlinx-coroutines-reactor
(#2575).- All reactive builders no longer ignore inner cancellation exceptions preventing their completion (#2262, #2646).
MaybeSource.collect
andMaybe.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
andFlow.lastOrNull
operators (#2246).Flow.runningFold
operator (#2641).CoroutinesTimeout
rule for JUnit5 (#2197).- Internals of
Job
andAbstractCoroutine
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 isGlobalScope
(#2637). - Fixed bug introduced in
1.4.3
whenkotlinx-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).
1.4.3
General changes
- Thread context is properly preserved and restored for coroutines without
ThreadContextElement
(#985) ThreadContextElement
s 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-reactor
to3.4.1
, thanks to @sokomishalov (#2432) callsInPlace
contract added toReceiveChannel.consume
(#941)CoroutineStart.UNDISPATCHED
promoted to stable API (#1393)- Kotlin updated to 1.4.30
kotlinx.coroutines
are now released directly to MavenCentral- Reduced the size of
DispatchedCoroutine
by a field - Internal class
TimeSource
renamed toSchedulerTimeSource
to prevent wildcard import issues (#2537)
Bug fixes
- 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
forMinimalStage
implementations in jdk8 module (#2456) - Fixed bug when
onUndeliveredElement
wasn't called for unlimited channels (#2435) - Fixed a bug when
ListenableFuture.isCancelled
returned fromasListenableFuture
could have thrown an exception, thanks to @vadimsemenov (#2421) - Coroutine in
callbackFlow
andproduce
is properly cancelled when the channel was closed separately (#2506)
1.4.2
- Fixed
StackOverflowError
inJob.toString
whenJob
is observed in its intermediate state (#2371). - Improved liveness and latency of
Dispatchers.Default
andDispatchers.IO
in low-loaded mode (#2381). - Improved performance of consecutive
Channel.cancel
invocations (#2384). SharingStarted
is nowfun
interface (#2397).- Additional lint settings for
SharedFlow
to catch programmatic errors early (#2376). - Fixed bug when mutex and semaphore were not released during cancellation (#2390, thanks to @Tilps for reproducing).
- Some corner cases in cancellation propagation between coroutines and listenable futures are repaired (#1442, thanks to @vadimsemenov).
- Fixed unconditional cast to
CoroutineStackFrame
in exception recovery that triggered failures of instrumented code (#2386). - Platform-specific dependencies are removed from
kotlinx-coroutines-javafx
(#2360).
1.4.1
1.4.0
Improvements
StateFlow
,SharedFlow
and corresponding operators are promoted to stable API (#2316).Flow.debounce
operator with timeout selector based on each individual element is added (#1216, thanks to @mkano9!).CoroutineContext.job
extension property is introduced (#2159).Flow.combine operator
is reworked:- Complete fairness is maintained for single-threaded dispatchers.
- Its performance is improved, depending on the use-case, by at least 50% (#2296).
- Quadratic complexity depending on the number of upstream flows is eliminated (#2296).
crossinline
andinline
-heavy internals are removed, fixing sporadic SIGSEGV on Mediatek Android devices (#1683, #1743).
Flow.zip
operator performance is improved by 40%.- Various API has been promoted to stable or its deprecation level has been raised (#2316).
Bug fixes
- Suspendable
stateIn
operator propagates exception to the caller when upstream fails to produce initial value (#2329). - Fix
SharedFlow
with replay for subscribers working at different speed (#2325). - Do not fail debug agent installation when security manager does not provide access to system properties (#2311).
- Cancelled lazy coroutines are properly cleaned up from debug agent output (#2294).
BlockHound
false-positives are correctly filtered out (#2302, #2190, #2303).- Potential crash during a race between cancellation and upstream in
Observable.asFlow
is fixed (#2104, #2299, thanks to @LouisCAD and @drinkthestars).