This is a minor update with various fixes:
Note: Kotlin/Native artifacts are now published with Gradle metadata format version 1.0, so you will need Gradle version 5.3 or later to use this version of kotlinx.coroutines in your Kotlin/Native project.
This version is the first stable release with Flow 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 as regular experimental API. Please note that API marked with @FlowPreview have weak guarantees on source, binary and semantic compatibility.
CoroutineDispatcher.asExecutor extension (#1450).select statement could report the same exception twice (#1433).flatMapMerge in a case when collected values were immediately emitted to another flow (#1440).Operators for UI programming are reworked for the sake of consistency, naming scheme for operator overloads is introduced:
combineLatest is deprecated in the favor of combine.combineTransform operator for non-trivial transformations (#1224).combine and combineTransform overloads for multiple flows (#1262).switchMap is deprecated. flatMapLatest, mapLatest and transformLatest are introduced instead (#1335).collectLatest terminal operator (#1269).Improved cancellation support in flattenMerge (#1392).
channelFlow cancellation does not leak to the parent (#1334).
Fixed flow invariant enforcement for suspend fun main (#1421).
delayEach and delayFlow are deprecated (#1429).
Integration with Reactor context
await calls into Mono/Flux builder.collect call to the Publisher.Flow.asFlux builder.ServiceLoader-code is adjusted to avoid I/O on the Main thread on newer (3.6.0+) Android toolchain.
Stacktrace recovery support for minified builds on Android (#1416).
Guava version in kotlinx-coroutines-guava updated to 28.0.
setTimeout-based JS dispatcher for platforms where process is unavailable (#1404).
Native, JS and common modules are added to kotlinx-coroutines-bom.
Fixed bug with ignored acquiredPermits in Semaphore (#1423).
Flow API is promoted to stableFlow operators: withIndex, collectIndexed, distinctUntilChanged overloadFlow operators: onStart and onCompletionReceiveChannel.consumeAsFlow and emitAll (#1340)kotlinx-coroutines-bom with Maven Bill of Materials (#1110)CoroutineScope and prohibit Job instance in their context to simplify lifecycle managementsuspend fun main (#1328)CoroutineScope.cancel extension with message (#1338)delay (#1312)Duration.ZERO is handled properly in JDK 8 extensions (#1349)Flow exception transparency concept.Flow operators: onCompletion, catch, retryWhen, launchIn. onError* operators are deprecated in favour of catch. (#1263)Publisher.asFlow is integrated with buffer operator.Publisher.openSubscription default request size is 1 instead of 0 (#1267).Flow:
Flow interfaces and operators are graduated from preview status to experimental.channelFlow and callbackFlow replacements for flowViaChannel for concurrent flows or callback-based APIs.flow prohibits emissions from non-scoped coroutines by default and recommends to use channelFlow instead to avoid most of the concurrency-related bugs.AbstractFlow is introduced for extension (e.g. for managing state) and ensures all context preservation invariants.buffer operator can be used to adjust buffer size of any buffer-dependent operator (e.g. channelFlow, flowOn and flatMapMerge).conflate operator is introduced.scan, scanReduce, first, emitAll.flowWith and flowViaChannel are deprecated.retry ignores cancellation exceptions from upstream when the flow was externally cancelled (#1122).combineLatest overloads for multiple flows (#1193).drop operator.Channels:
consumeEach is promoted to experimental API (#1080).ChannelIterator.next to improve iteration performance (#1162).produce and are no longer swallowed as cancellation exceptions in case of programmatic errors (#957, #1128).Flow.General changes:
Semaphore implementation (#1088)Dispatchers.Main is tweaked so the latest version of R8 can completely remove I/O when loading it (#1231).withContext checks cancellation status on exit to make reasoning about sequential concurrent code easier (#1177).CoroutinesTimeout.seconds (#1184).nanosleep as delay in runBlocking in K/N (#1225).Major:
kotlinx-coroutines-test: runBlockingTest, TestCoroutineScope and TestCoroutineDispatcher, contributed by Sean McQuillan (@objcode). Obsolete TestCoroutineContext from kotlinx-coroutines-core is deprecated.Job.asCompletableFuture extension in jdk8 module (#1113).Flow improvements:
flowViaChannel rework: block parameter is no longer suspending, but provides CoroutineScope receiver and allows conflated channel (#1081, #1112).switchMap, sample, debounce (#1107).consumerEach is deprecated on Publisher, ObservableSource and MaybeSource, collect extension is introduced instead (#1080).Other:
CancellableContinuation.resume with onCancelling lambda (#1044) to consistently handle closeable resources.ReceiveChannel.isEmpty is no longer deprecatedA lot of Flow improvements:
zip and combineLatest operators.flatMap, merge and concatenate are replaced with flattenConcat, flattenMerge, flatMapConcat and flatMapMerge.Note that Flow is not leaving its preview status.
This release contains major feature preview: cold streams aka Flow (#254).
Performance:
Dispatcher.Main initialization is significantly improved (#878).CoroutineTimeout rule or JUnit4 is introduced to simplify coroutines debugging (#938).CopyableThrowable interface is introduced, machinery is documented (#921, #950).Dispatchers.Unconfined, MainCoroutineDispatcher.immediate, MainScope and CoroutineScope.cancel are promoted to stable API (#972).CompletableJob is introduced (#971).ensurePresent and isPresent extensions for ThreadLocal (#1028).ensureActive extensions for CoroutineContext, CoroutineScope and Job (#963).SendChannel.isFull and ReceiveChannel.isEmpty are deprecated (#1053).withContext checks cancellation on entering (#962).invoke on CoroutineDispatcher (#428).delay and withTimeout now properly handle too large values (#428).Bug fixes:
select support in debug agent (#931).supervisorScope support in debug agent (#915).initCause does no longer trigger an internal error (#933).close in order to cleanup their resources (#939).CancellableContinuation in the final state produce IllegalStateException (#901). This change does not affect #830, races between resume and cancellation do not lead to an exceptional situation.runBlocking is integrated with Dispatchers.Unconfined by sharing an internal event loop. This change does not affect the semantics of the previously correct code but allows to mix multiple runBlocking and unconfined tasks (#860).kotlinx-coroutines-debug. Debug agent that improves coroutines stacktraces, allows to print all active coroutines and its hierarchies and can be installed as Java agent.kotlinx-coroutines-test. Allows setting arbitrary Dispatchers.Main implementation for tests (#810).kotlinx.coroutines.debug system property (#493).MainScope factory and CoroutineScope.cancel extension (#829). One line CoroutineScope integration!CancellableContinuation race between resumeWithException and cancel is addressed, exceptions during cancellation are no longer reported to exception handler (#830, #892).Dispatchers.Default now consumes much less CPU on JVM (#840).DisposableHandle (#835).JavaFx initialization bug (#816).TimeoutCancellationException is thrown by withTimeout instead of CancellationException if negative timeout is supplied (#870).Dispatchers.Default on JS.kotlinx-coroutines-guava.publisher implementation with Reactive TCK.future coroutine builders on top of AbstractCoroutine (#751).Dispatchers.Default and Dispatchers.IO.JavaFx instantiation, fixes warnings on Java 9 and build on Java 11 (#463).CancellableContinuation.resumeWithException (documentation fix, see #712).withContext, coroutineScope, supervisorScope, withTimeout and withTimeoutOrNull).ExperimentalCoroutineDispatcher (#661).ExperimentalCoroutineDispatcher could end up in inconsistent state if Thread constructor throws an exception (#748).HandlerDispatcher.scheduleResumeAfterDelay, thanks @cbeyls.yield support for Unconfined and immediate dispatchers (#737).internal.kotlin.experimental.Experimental annotation. If you are using @ExperimentalCoroutinesApi or @InternalCoroutinesApi you should explicitly opt-in, otherwise compilation warning (or error) will be produced.Unconfined dispatcher (and all dispatchers which support immediate invocation) forms event-loop on top of current thread, thus preventing all StackOverflowErrors. Unconfined dispatcher is now much safer for the general use and may leave its experimental status soon (#704).kotlinx.coroutines (#537).runBlocking (#692).ReceiveChannel.receiveOrNull is marked as obsolete and deprecated.Job.cancel(cause) and ReceiveChannel.cancel(cause) are deprecated, cancel() returns Unit (#713).Dispatchers.Main is instantiated lazily (see #658 and #665).withContext cancellation (#675).Maintenance release:
Dispatchers.Main to common dispatchers, which can be used from Android, Swing and JavaFx projects if a corresponding integration library is added to dependencies.Dispatchers.Main improvement tooling bug in Android Studio #626 is mitigated, so Android users now can safely start the migration to the latest kotlinx.coroutines version.EventLoop.close contract similar to Java Executor, so it can be safely instantiated and closed multiple times (affects only unit tests).async and async-like builders cancel parent on failure (it affects CompletableDeferred, and all reactive integration builders).awaitAll (see #552).Job() wih parent now also cancels parent on failure consistently with other scopes.Job implementations propagate failure to the parent unless it is a CancellationException.SupervisorJob() and supervisorScope { ... } are introduced, allowing for a flexible implementation of custom exception-handling policies, see a new section in the guide on supervision.awaitAll in documentation and rewrote currentScope section (see #624).Dispatchers.Default by default instead of deprecated CommonPool.DefaultDispatcher” is used as a public name of the default impl (you'll see it thread names and in the guide).-Dkotlinx.coroutines.scheduler=off can be used to switch back to CommonPool for a time being (until deprecated CommonPool is removed).CoroutineStart.ATOMIC experimental as it covers important use-case with resource cleanup in finally block (see #627).Executor.asCoroutineDispatcher (see #629).Dispatchers.Unconfined (see #621).1.0 release:@Deprecated API. All API marked as deprecated will be removed in 1.0 release without replacement.@ExperimentalCoroutinesApi API. This API is experimental and may change in the future, but migration mechanisms will be provided. Signature, binary compatibility and semantics can be changed.@InternalCoroutinesApi. This API is intended to be used only from within kotlinx.coroutines. It can and will be changed, broken and removed in the future releases without any warnings and migration aids. If you find yourself using this API, it is better to report your use-case to Github issues, so decent, stable and well-tested alternative can be provided.@ObsoleteCoroutinesApi. This API has serious known flaws and will be replaced with a better alternative in the nearest releases.CancellationException, transparent parallel decomposition and consistent view of coroutines hierarchy in terms of its state (see #220 and #585).withContext is now aligned with structured concurrency and awaits for all launched tasks, its performance is significantly improved (see #553 and #617).CompletableFuture.await and ListenableFuture.await now propagate cancellation to the future (see #611).runBlocking machinery is improved (see #589).CoroutineScope factory methods add Job if it is missing from the context to enforce structured concurrency (see #610).Handler.asCoroutineDispatcher has a name parameter for better debugging (see #615).CoroutineSchedule was closed from one of its threads (see #612).CoroutineExceptionHandler are reported by default exception handler (see #562).CoroutineName is now available from common modules (see #570).Main dispatcher is async by default which may significantly improve UI performance. Contributed by @JakeWharton (see #427).CoroutineScope.plus operator (see #559).kotlinx.coroutines concurrency model (see #410 for a full explanation of the rationale behind this change):CoroutineScope and inherit its coroutineContext. Standalone builders are deprecated.CoroutineDispatcher.Dispatchers.Default by default if CoroutineInterceptor is not present in their context.kolinx.coroutines.withContext block argument has CoroutineScope as a receiver.currentScope and coroutineScope builders are introduced to extract and provide CoroutineScope.CoroutineScope from CoroutineContext are introduced.CoroutineScope.isActive became an extension property.CommonPool are deprecated.invokeOnCompletion(onCancelling = true).Thread.contextClassLoader is mocked (see #530).IO dispatcher silently hung (see #524 and #525) .Job.cancel resulting Boolean value changed — true means exception was handled by the job, caller shall handle otherwise.CoroutineExceptionHandler for a family of coroutines receives one aggregated exception in case of failure.handleCoroutineException contract, so custom exception handlers can't break coroutines machinery.JobCancellationException properly to provide exception transparency over whole call chain.ThreadContextElement API for custom thread-context sensitive context elements.ThreadLocal.asContextElement() extension function to convert an arbitrary thread-local into coroutine context element.MDCContext element defined in kotlinx-coroutines-slf4j integration module.ExecutorCoroutineDispatcher instead of CloseableCoroutineDispatcher (see #385).kotlinx-coroutines are now JEP 238 multi-release JAR files.VarHandle is used for atomic operations instead of Atomic*FieldUpdater for better performance.BlockingChecker extension point to control where runBlocking can be used (see #227).runBlocking can be used anywhere without limitations (again), but it would still cause problems if improperly used on UI thread.EventLoop pseudo-constructor (see #477, PR by @Groostav).as*Future() integration functions to catch all Throwable exceptions (see #469).runBlocking cancellation (see #501).withTimeoutOrNull (see #498).EventLoop.invokeOnTimeout in DefaultDispatcher to allow busy-wait loops inside runBlocking (see #479).kotlinx-coroutines-io module from the project, it has moved to kotlinx-io.runBlocking event loop is supported at this moment.SendChannel.invokeOnClose (see #341).close, cancel, isClosedForSend, isClosedForReceive and offer linearizable with other operations (see #359).BlockingChecker mechanism which checks current context (see #227).runBlocking from any supported UI thread (Android, JavaFx, Swing) will result in exception.UI.immediate extension as performance-optimization to immediately execute tasks which are invoked from the UI thread (see #381).cause exception for Job onCancelling handlers (see #436).UI on Java 9 (see #443).-Dkotlinx.coroutines.scheduler option. In this case DefaultDispatcher is set to new experimental scheduler instead of FJP-based CommonPool.openChannel().use { ... } pattern by providing deprecated extension function use on ReceiveChannel.broadcast coroutine builder (see #280):BroadcastChannel.cancel method to drop the buffer.ReceiveChannel.broadcast() extension.CancellableContinuation is not a Job anymore (see #219):suspendCancellableCoroutine, since all the typically used functions are still there.CancellableContinuation.invokeOnCompletion is deprecated now and its semantics had subtly changed:invokeOnCancellation is a replacement for invokeOnCompletion to install a handler.resume which corresponds to the typical usage pattern.cont.isCancelled in a typical handler code anymore (since handler is invoked only when continuation is cancelled).CancellableContinuation implementation has simpler state machine and is implemented more efficiently.AbstractContinuation (that implements CancellableContinuation) is now consistent:CoroutineScope.coroutineContext:coroutineContext function from Kotlin standard library.ReceiveChannel operators implementations to guarantee closing of the source channels under all circumstances (see #279):onCompletion parameter added to produce and all other coroutine builders.ReceiveChannel.consumes(): CompletionHandler extension function.SubscriptionReceiveChannel with ReceiveChannel (see #283, PR by @deva666).ReceiveChannel.use extension is introduced to preserve source compatibility, but is deprecated.consume or consumeEach extensions should be used for channels.produce(onCompletion=consumes()) { ... } pattern shall be used (see #279 above).awaitAll and joinAll for Deferred and Job lists correspondingly (see #171).CompletionException exception in CompletionStage.await slow-path to provide consistent results (see #375).ExecutorService to return CloseableCoroutineDispatcher (see #278, PR by @deva666).delay, withTimeout and onTimeout (see #310).delay:clearTimeout on cancellation in JSDispatcher.ticker function to create “ticker channels” (see #327):Observable.timer for coroutine channels.TestCoroutineContext (see #297, PR by @streetsofboston).CoroutineContext.DEBUG value (see #316, PR by @dmytrodanylyk):CoroutineContext.DEBUG_PROPERTY_NAME constant public."on", "off", "auto" values.CommonPool parallelism (see #343):CommonPool.DEFAULT_PARALLELISM_PROPERTY_NAME constant is introduced with a value of “kotlinx.coroutines.default.parallelism”.Channel.filterNot (PR by @jcornaz).toString for channels (see #185).CompletionStage to Deferred (see #262, PR by @jcornaz).CompletionStage.await and make it cancellable.produce builder to close the channel on completion instead of cancelling it, which lead to lost elements with buffered channels (see #256).ForkJoinPool if there is a SecurityManager present to work around JNLP problems (see #216, PR by @NikolayMetchev).window.addEventListener when choosing default coroutine dispatcher (see #230, PR by @ScottPierce).1.3.6.2.1.9.24.0-jre.awaitFirstOrDefault and awaitFirstOrNull extensions (see #224, PR by @konrad-kaminski).withTimeout and withTimeoutOrNull that should not use equals on result (see #212, PR by @konrad-kaminski).actor builder documentation (see #210) and fixed bugs in rendered documentation due to multiplatform.runBlocking to properly support specified dispatchers (see #209).Job implementation (it was hanging at LockFreeLinkedList.helpDelete on certain stress tests).AbstractCoroutine.onCancellation is invoked before cancellation handler that is set via invokeOnCompletion.launch handles uncaught exception before another coroutine that uses join on it resumes (see #208).AbstractCoroutine:Job, Continuation, and CoroutineScope.onStart, onCancellation, onCompleted and onCompletedExceptionally functions.launch handles uncaught exceptions before “joining” coroutines wakeup (see #208).openSubscription extension for reactive Publisher/Observable/Flowable when used with select { ... } and added an optional request parameter to specify how many elements are requested from publisher in advance on subscription (see #197).Channel.flatMap using toChannel function to work around Android 5.0 APK install SIGSEGV (see #205).DispatchTask instance is no longer allocated).Job.cancel and CompletableDeferred.complete to support cancelling/completing states and properly wait for their children to complete on join/await (see #199).delay) which could have resulted in wrong delay time in rare circumstances.Promise.asDeferred immediately installs handlers to avoid “Unhandled promise rejection” warning.window.postMessage instead of setTimeout for coroutines inside the browser to avoid timeout throttling (see #194).Window.awaitAnimationFrame to align all animations and reduce overhead.Window.asCoroutineDispatcher() extension function.launch and async coroutine builders.Job and Deferred light-weight future with cancellation support.delay and yield top-level suspending functions.await extension for JS Promise and asPromise/asDeferred conversions.promise coroutine builder.Job() and CompletableDeferred() factories.Window.awaitAnimationFrame extension function.run is deprecated and renamed to withContext (see #134).runBlocking and EventLoop implementations optimized (see #190).filter, map, etc extensions on ReceiveChannel are introduced (see #88 by @fvasco and #69 by @konrad-kaminski).ReceiveChannel.cancel method.ReceiveChannel fully consume the original channel (cancel it when they are done) using a helper consume extension.ActorJob and ProducerJob; actor now returns SendChannel and produce returns ReceiveChannel (see #127).SendChannel.sendBlocking extension method (see #157 by @@fvasco).parent job parameter for all coroutine builders so that code with an explict parent Job is more natural.parent parameter to CompletableDeferred constructor.Job.children property.Job.cancelChildren is now an extension (member is deprecated and hidden).Job.joinChildren extension is introduced.Job.attachChild as a error-prone API.java.util.ServiceLoader to find default instances of CoroutineExceptionHandler.Thread.getUncaughtExceptionPreHandler to make sure that exceptions are logged before crash (see #148).UI.awaitFrame for animation; added sample coroutine-based animation application for Android here.delay(Long.MAX_VALUE) (see #161)DefaultDispatcher on some reactive operators (see #174 by @fvasco)actor and produce so that a cancellation of a Job cancels the underlying channel (closes and removes all the pending messages).example-context-06 (see #160)Job.start on lazy coroutine with attached invokeOnCompletion handler.runBlocking and coroutines in the guide (see #166).send/openSubscription race in ArrayBroadcastChannel. This race lead to stalled (hanged) send/receive invocations.ArrayBroadcastChannel receive of stale elements on openSubscription. Only elements that are sent after invocation of openSubscription are received now.context parameter to rxFlowable (see #146 by @PhilGlass).UnexpectedCoroutineException is no longer used to report those cases as is removed.run uses cancelling state & propagates exceptions when cancelled (see #147):run is cancelled, the run invocation does not complete immediately, but waits until the body completes.Job in newSingleThreadContext and newFixedThreadPoolContext anymore (see #149, #151):run(ctx) where ctx comes from either newSingleThreadContext or newFixedThreadPoolContext invocation. They both used to return a combination of dispatcher + job, and this job was overriding the parent job, thus preventing propagation of cancellation. Not anymore.ThreadPoolDispatcher class is now public and is the result type for both functions. It has the close method to release the thread pool.try/catch or other exception handlers.ArrayBroadcastChannel between send and openChannel invocations (see #138).runBlocking that resulted in AssertionError. Unfortunately, cannot write a reliable stress-test to reproduce it.DefaultDispatcher is introduced (see #136):launch, async, produce, actor and other integration-specific coroutine builders now use DefaultDispatcher as the default value for their context parameter.newCoroutineContext function checks if there is any interceptor/dispatcher defined in the context and uses DefaultDispatcher if there is none.DefaultDispatcher is currently defined to be equal to CommonPool.launch { ... } code and explanation on the nature and the need for coroutine context starts in “Coroutine context and dispatchers” section.Job.attachChild and Job.cancelChildren are introduced.Job.join now always checks cancellation status of invoker coroutine for predictable behavior when joining failed child coroutine.Job.cancelAndJoin extension is introduced.CoroutineContext.cancel and CoroutineContext.cancelChildren extensions are introduced for convenience.withTimeout/withTimeoutOrNull blocks become proper coroutines that have CoroutineScope and wait for children, too.CancellationException (as was documented before) even when the coroutine is cancelled with another application-specific exception.JobCancellationException is introduced as a specific subclass of CancellationException which is used for coroutines that are cancelled without cause and to wrap application-specific exceptions.Job.getCompletionException is renamed to Job.getCancellationException and return a wrapper exception if needed.Deferred.getCompletionExceptionOrNull to get not-wrapped exception result of async task.Job & Deferred to explain parent/child relations.select expression is modularized:SelectClause(0,1,2) interfaces are introduced, so that synchronization constructs can define their select clauses without having to modify the source of the SelectBuilder in kotlinx-corounes-core module.Job.onJoin, Deferred.onAwait, Mutex.onLock, SendChannel.onSend, ReceiveChannel.onReceive, etc that were functions before are now properties returning the corresponding select clauses. Old functions are left in bytecode for backwards compatibility on use-site, but any outside code that was implementing those interfaces by itself must be updated.TimeoutException to TimeoutCancellationException (old name is deprecated).JavaFx context (see #108).delay in arbitrary contexts (see #133).kotlinx-coroutines-io module is introduced. It is a work-in-progress on ByteReadChannel and ByteWriteChannel interfaces, their implementations, and related classes to enable convenient coroutine integration with various asynchronous I/O libraries and sockets. It is currently unstable and will change in the next release.withLock and consumeEach functions are now inline suspend functions.JobSupport class implementation is optimized (one fewer field).TimeoutException is public (see #89).Mutex (courtesy of @fvasco):holdsLock (see #92).Mutex fairness (see #90).ArrayBroadcastChannel is closed concurrently with receive (see #97).setCancellation with onDipose and updated to Aluminium-SR3 release (courtesy of @yxf07, see #96)java.time classes (courtesy of @fvasco, see #93)CompletableDeferred is introduced as a set-once event-like communication primitive (see #70).CompletableDeferred is an interface with private impl (courtesy of @fvasco, see #86).Deferred interface with complete and completeExceptionally functions.Job.join and Deferred.await wait until a cancelled coroutine stops execution (see #64).Job and Deferred have a new cancelling state which they enter on invocation of cancel.Job.invokeOnCompletion has an additional overload with onCancelling: Boolean parameter to install handlers that are fired as soon as coroutine enters cancelling state as opposed to waiting until it completes.select implementation is refactored to decouple it from JobSupport internal class and to optimize its state-machine.AbstractCoroutine class is refactored so that it is extended only by true coroutines, all of which support the new cancelling state.CoroutineScope.context is renamed to coroutineContext to avoid conflicts with other usages of context in applications (like Android context, see #75).BroadcastChannel.open is renamed to openSubscription (see #54).StackOverflowError in a convoy of Mutex.unlock invokers with Unconfined dispatcher (see #80).SecurityException when trying to use coroutines library with installed SecurityManager.withTimeoutOrNull in case with nested timeouts when coroutine was cancelled before it was ever suspended.awaitFirst on reactive streams that would have resulted in spurious stack-traces printed on the console when used with publishers/observables that continue to invoke onNext despite being cancelled/disposed (which they are technically allowed to do by specification).Job, Channel, BroadcastChannel, Mutex, EventLoop, and CoroutineExceptionHandler). Previous approach of using operator invoke on their companion objects is deprecated.toString implementations for coroutine dispatcher tasks and continuations.delay is rewritten and now shares code with EventLoopImpl that is used by runBlocking. It internally supports non-default TimeSource so that delay-using tests can be written with “virtual time” by replacing their time source for the duration of tests (this feature is not available outside of the library).suspendAtomicCancellableCoroutine function is introduced for funs like send/receive/receiveOrNull that require atomic cancellation (they cannot be cancelled after decision was made)async/launch/actor builders can be cancelled before their execution startsCoroutineStart.ATOMIC is introduced as a start mode to specify that coroutine cannot be cancelled before its execution startsrun function is also cancellable in the same way and accepts an optional CoroutineStart parameter to change this default.BroadcastChannel factory function is introducedCoroutineExceptionHandler factory function is introduced by @konrad-kaminskiintegration directory is introduced for all 3rd party integration projectsListenableFuture in the new kotlinx-coroutines-guava moduleChannel and BroadcastChannel implementation bugs related to concurrent send/close/close of channels that lead to hanging send, offer or close operations (see #66). Thanks to @chrisly42 and @cy6erGn0m for finding them.withTimeoutOrNull which was returning null on timeout of inner or outer withTimeout blocks (see #67). Thanks to @gregschlom for finding the problem.Job fails to dispose a handler when it is the only handler by @uchuhimoCoroutineStart enum is introduced for launch/async/actor builders:luanch(context, start = false) is deprecated and is replaced with launch(context, CoroutineStart.LAZY)CoroutineStart.UNDISPATCHED is introduced to start coroutine execution immediately in the invoker thread, so that async(context, CoroutineStart.UNDISPATCHED) is similar to the behavior of C# async.BroadcastChannel interface in kotlinx-coroutines-core module:SendChannel interface and provides open function to create subscriptions.SubscriptionReceiveChannel interface.SubscriptionReceiveChannel interfaces are removed from reactive implementation modules. They use an interface defined in kotlinx-coroutines-core module.ConflatedBroadcastChannel implementation is provided for state-observation-like use-cases, where a coroutine or a regular code (in UI, for example) updates the state that subscriber coroutines shall react to.ArrayBroadcastChannel implementation is provided for event-bus-like use-cases, where a sequence of events shall be received by multiple subscribers without any omissions.Mono and Flux. See kotlinx-coroutines-reactor module.Completable.awaitCompleted.Maybe.withTimeoutOrNull function.onTimeout clause for select expressions.withTimeout blocks on their cancellation.withTimeout when CancellationException is suppressed inside the block. Invocation of withTimeout now always returns the result of execution of its inner block.channel property in ActorScope is promoted to a wider Channel type, so that an actor can have an easy access to its own inbox send channel.Mutex.withMutex to Mutex.withLock, old name is deprecated.consumeEach helper function for channels and reactive streams, Rx 1.x, and Rx 2.x.for loop on reactive streams is deprecated.awaitFirstOrDefault extension for reactive streams, Rx 1.x, and Rx 2.x.Mutex.withMutex helper function.kotlinx-coroutines-android module has provided dependency on of Android APIs to eliminate warnings when using it in android project.kotlinx-coroutinex-android module with Android UI context implementation.whileSelect convenience function.ConflatedChannel.toXXX conversion functions to asXXX (old names are deprecated).run is optimized with fast-path case and no longer has CoroutineScope in its block.withTimeout (removed extra dispatch).EventLoop that is used by runBlocking now implements Delay, giving more predictable test behavior.Job.Registration is renamed to DisposableHandle.EmptyRegistration is renamed to NonDisposableHandle.Job.unregisterOnCompletion is renamed to Job.disposeOnCompletion.Delay.invokeOnTimeout is introduced.withTimeout now uses Delay.invokeOnTimeout when available.rxFlowable builder for Rx 2.x.Scheduler.asCoroutineDispatcher extension for Rx 2.x.onComplete in publish, rxObservable, and rxFlowable builders.Closeable.CompletableSource.await and added test for it.rx.Completable.await due to name conflict.LinkedListChannel with unlimited buffer (offer always succeeds).onLock select clause and an optional owner parameter in all Mutex functions.selectUnbiased function.actor coroutine builder.select expression with onJoin/onAwait/onSend/onReceive clauses.Mutex is moved to kotlinx.coroutines.sync package.ClosedSendChannelException is a subclass of CancellationException now.Mutex synchronization primitive is introduced.buildChannel is renamed to produce, old name is deprecated.Job.onCompletion is renamed to Job.invokeOnCompletion, old name is deprecated.delay implementation in Swing, JavaFx, and scheduled executors is fixed to avoid an extra dispatch.CancellableContinuation.resumeUndispatched is introduced to make this efficient implementation possible.CancellationException to improve performance, plus other performance improvements.defer coroutine builder is renamed to async.lazyDefer is deprecated, async has an optional start parameter instead.LazyDeferred interface is deprecated, lazy start functionality is integrated into Job interface.launch has an optional start parameter for lazily started coroutines.Job.start and Job.isCompleted are introduced.Deferred.isCompletedExceptionally and Deferred.isCancelled are introduced.Job.getInactiveCancellationException is renamed to getCompletionException.Job.join is now a member function.JobSupport state machine is enhanced to support new (not-started-yet) state. So, lazy coroutines do not need a separate state variable to track their started/not-started (new/active) status.Job.cancel (original cause is rethrown).Job/CancellableContinuation/Deferred in docs.Channel, SendChannel, and ReceiveChannel interfaces, RendezvousChannel and ArrayChannel implementations, Channel() factory function and buildChannel{} coroutines builder.Here context is renamed to Unconfined (the old name is deprecated).currentCoroutineContext and related thread-locals without replacement. Explicitly pass coroutine context around if needed.lazyDefer(context) {...} coroutine builder and LazyDeferred interface are introduced.CoroutineDispatcher.isDispatchNeeded function has a default implementation that returns true.NonCancellable context is introduced.CoroutineDispatcher methods now have context parameter.CancellableContinuation.isCancelledEventLoop dispatcher and made it a default for runBlocking { ... }CoroutineScope interface with isActive and context properties; standard coroutine builders include it as receiver for convenience.Executor.toCoroutineDispatcher() extension.newCoroutineContext can be explicitly disabled with -Dkotlinx.coroutines.debug=off.kotlinx-coroutines-nio module