Package kotlin.native.concurrent
Types
AtomicInt
Atomic values and freezing: atomics AtomicInt, AtomicLong, AtomicNativePtr and AtomicReference are unique types with regard to freezing. Namely, they provide mutating operations, while can participate in frozen subgraphs. So shared frozen objects can have fields of atomic types.
class AtomicInt
AtomicLong
class AtomicLong
AtomicNativePtr
class AtomicNativePtr
AtomicReference
An atomic reference to a frozen Kotlin object. Can be used in concurrent scenarious but frequently shall be of nullable type and be zeroed out once no longer needed. Otherwise memory leak could happen. To detect such leaks kotlin.native.internal.GC.detectCycles in debug mode could be helpful.
class AtomicReference<T>
Continuation0
class Continuation0 : () -> Unit
Continuation1
class Continuation1<T1> : (T1) -> Unit
Continuation2
class Continuation2<T1, T2> : (T1, T2) -> Unit
DetachedObjectGraph
Detached object graph encapsulates transferrable detached subgraph which cannot be accessed externally, until it is attached with the attach extension function.
class DetachedObjectGraph<T>
FreezableAtomicReference
An atomic reference to a Kotlin object. Can be used in concurrent scenarious, but must be frozen first, otherwise behaves as regular box for the value. If frozen, shall be zeroed out once no longer needed. Otherwise memory leak could happen. To detect such leaks kotlin.native.internal.GC.detectCycles in debug mode could be helpful.
class FreezableAtomicReference<T>
FreezingException
Exception thrown whenever freezing is not possible.
class FreezingException : RuntimeException
Future
Class representing abstract computation, whose result may become available in the future.
class Future<T>
FutureState
State of the future object.
enum class FutureState
InvalidMutabilityException
Exception thrown whenever we attempt to mutate frozen objects.
class InvalidMutabilityException : RuntimeException
MutableData
Mutable concurrently accessible data buffer. Could be accessed from several workers simulteniously.
class MutableData
TransferMode
Object Transfer Basics.
enum class TransferMode
Worker
Class representing worker.
class Worker
Annotations
SharedImmutable
Marks a top level variable with a backing field or an object as immutable. It is possible to share such object between multiple threads, but it becomes deeply frozen, so no changes can be made to its state or the state of objects it refers to.
annotation class SharedImmutable
ThreadLocal
Marks a top level variable with a backing field or an object as thread local. The object remains mutable and it is possible to change its state, but every thread will have a distinct copy of this object, so changes in one thread are not reflected in another.
annotation class ThreadLocal
Properties
isFrozen
Checks if given object is null or frozen or permanent (i.e. instantiated at compile-time).
val Any?.isFrozen: Boolean
Functions
atomicLazy
Atomic lazy initializer, could be used in frozen objects, freezes initializing lambda,
so use very carefully. Also, as with other uses of an AtomicReference may potentially
leak memory, so it is recommended to use atomicLazy
in cases of objects living forever,
such as object signletons, or in cases where it's guaranteed not to have cyclical garbage.
fun <T> atomicLazy(initializer: () -> T): Lazy<T>
attach
Attaches previously detached object subgraph created by DetachedObjectGraph. Please note, that once object graph is attached, the DetachedObjectGraph.stable pointer does not make sense anymore, and shall be discarded, so attach of one DetachedObjectGraph object can only happen once.
fun <T> DetachedObjectGraph<T>.attach(): T
callContinuation0
fun COpaquePointer.callContinuation0()
callContinuation1
fun <T1> COpaquePointer.callContinuation1()
callContinuation2
fun <T1, T2> COpaquePointer.callContinuation2()
ensureNeverFrozen
This function ensures that if we see such an object during freezing attempt - freeze fails and FreezingException is thrown.
fun Any.ensureNeverFrozen()
freeze
Freezes object subgraph reachable from this object. Frozen objects can be freely shared between threads/workers.
fun <T> T.freeze(): T
waitForMultipleFutures
fun <T> Collection<Future<T>>.waitForMultipleFutures(
millis: Int
): Set<Future<T>>
withWorker
Executes block with new Worker as resource, by starting the new worker, calling provided block (in current context) with newly started worker as this and terminating worker after the block completes. Note that this operation is pretty heavyweight, use preconfigured worker or worker pool if need to execute it frequently.
fun <R> withWorker(
name: String? = null,
errorReporting: Boolean = true,
block: Worker.() -> R
): R