blob: 1356a9339c79f1ea2ef66bab49e037562468c476 [file] [log] [blame]
Roman Elizarovf16fd272017-02-07 11:26:00 +03001/*
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03002 * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarovf16fd272017-02-07 11:26:00 +03003 */
4
Roman Elizarov01934df2017-01-31 09:18:34 +03005package kotlinx.coroutines.experimental
6
7import kotlinx.coroutines.experimental.NonCancellable.isActive
Roman Elizarovaa461cf2018-04-11 13:20:29 +03008import kotlinx.coroutines.experimental.selects.*
9import kotlin.coroutines.experimental.*
Roman Elizarov01934df2017-01-31 09:18:34 +030010
11/**
Roman Elizarovf9e13f52017-12-21 12:23:15 +030012 * A non-cancelable job that is always [active][isActive]. It is designed for [withContext] function
13 * to prevent cancellation of code blocks that need to be executed without cancellation.
Roman Elizarovb7c46de2017-02-08 12:35:24 +030014 *
15 * Use it like this:
Roman Elizarov01934df2017-01-31 09:18:34 +030016 * ```
Roman Elizarovf9e13f52017-12-21 12:23:15 +030017 * withContext(NonCancellable) {
Roman Elizarov01934df2017-01-31 09:18:34 +030018 * // this code will not be cancelled
19 * }
20 * ```
21 */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030022public object NonCancellable : AbstractCoroutineContextElement(Job), Job {
Roman Elizarov32d95322017-02-09 15:57:31 +030023 /** Always returns `true`. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030024 override val isActive: Boolean get() = true
Roman Elizarov32d95322017-02-09 15:57:31 +030025
26 /** Always returns `false`. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030027 override val isCompleted: Boolean get() = false
Roman Elizarov32d95322017-02-09 15:57:31 +030028
29 /** Always returns `false`. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030030 override val isCancelled: Boolean get() = false
Roman Elizarovd82b3a92017-06-23 21:52:08 +030031
32 /** Always returns `false`. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030033 override fun start(): Boolean = false
Roman Elizarov32d95322017-02-09 15:57:31 +030034
35 /** Always throws [UnsupportedOperationException]. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030036 override suspend fun join() {
Roman Elizarovd84dbc22017-02-22 14:56:58 +030037 throw UnsupportedOperationException("This job is always active")
38 }
39
Roman Elizarovdb0e22d2017-08-29 18:15:57 +030040 override val onJoin: SelectClause0
41 get() = throw UnsupportedOperationException("This job is always active")
Roman Elizarov32d95322017-02-09 15:57:31 +030042
43 /** Always throws [IllegalStateException]. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030044 override fun getCancellationException(): CancellationException = throw IllegalStateException("This job is always active")
Roman Elizarov32d95322017-02-09 15:57:31 +030045
Roman Elizarovdaa1d9d2017-03-02 19:00:50 +030046 /** Always returns [NonDisposableHandle]. */
Roman Elizarov8b38fa22017-09-27 17:44:31 +030047 @Suppress("OverridingDeprecatedMember")
Roman Elizarove1c0b652017-12-01 14:02:57 +030048 override fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle =
49 NonDisposableHandle
Roman Elizarovd82b3a92017-06-23 21:52:08 +030050
51 /** Always returns [NonDisposableHandle]. */
Roman Elizarov8b38fa22017-09-27 17:44:31 +030052 @Suppress("OverridingDeprecatedMember")
Roman Elizarove1c0b652017-12-01 14:02:57 +030053 override fun invokeOnCompletion(handler: CompletionHandler, onCancelling: Boolean): DisposableHandle =
54 NonDisposableHandle
Roman Elizarov32d95322017-02-09 15:57:31 +030055
Roman Elizarov8b38fa22017-09-27 17:44:31 +030056 /** Always returns [NonDisposableHandle]. */
Roman Elizarove1c0b652017-12-01 14:02:57 +030057 @Suppress("OverridingDeprecatedMember")
Roman Elizarova12ee152017-12-20 10:50:17 +030058 override fun invokeOnCompletion(onCancelling_: Boolean, handler: CompletionHandler): DisposableHandle =
Roman Elizarove1c0b652017-12-01 14:02:57 +030059 NonDisposableHandle
Roman Elizarov8b38fa22017-09-27 17:44:31 +030060
Roman Elizarove1c0b652017-12-01 14:02:57 +030061 /** Always returns [NonDisposableHandle]. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030062 override fun invokeOnCompletion(onCancelling: Boolean, invokeImmediately: Boolean, handler: CompletionHandler): DisposableHandle =
Roman Elizarove1c0b652017-12-01 14:02:57 +030063 NonDisposableHandle
Roman Elizarov447b88a2017-12-01 15:37:48 +030064
Roman Elizarov32d95322017-02-09 15:57:31 +030065 /** Always returns `false`. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030066 override fun cancel(cause: Throwable?): Boolean = false
Roman Elizarov8b38fa22017-09-27 17:44:31 +030067
Roman Elizarov3e387b82017-12-04 13:49:11 +030068 /** Always returns [emptySequence]. */
Roman Elizarovaa461cf2018-04-11 13:20:29 +030069 override val children: Sequence<Job>
Roman Elizarov3e387b82017-12-04 13:49:11 +030070 get() = emptySequence()
71
Roman Elizarov8b38fa22017-09-27 17:44:31 +030072 /** Always returns [NonDisposableHandle] and does not do anything. */
Roman Elizarov3e387b82017-12-04 13:49:11 +030073 @Suppress("OverridingDeprecatedMember")
Roman Elizarovaa461cf2018-04-11 13:20:29 +030074 override fun attachChild(child: Job): DisposableHandle = NonDisposableHandle
Roman Elizarov8b38fa22017-09-27 17:44:31 +030075
76 /** Does not do anything. */
Roman Elizarov3e387b82017-12-04 13:49:11 +030077 @Suppress("OverridingDeprecatedMember")
Roman Elizarov8b38fa22017-09-27 17:44:31 +030078 override fun cancelChildren(cause: Throwable?) {}
Roman Elizarov01934df2017-01-31 09:18:34 +030079}