ArrayBroadcastChannel

class ArrayBroadcastChannel<E> : 
    AbstractSendChannel<E>,
    BroadcastChannel<E>

Broadcast channel with array buffer of a fixed capacity. Sender suspends only when buffer is full due to one of the receives being slow to consume and receiver suspends only when buffer is empty.

Note, that elements that are sent to this channel while there are no openSubscription subscribers are immediately lost.

This channel is created by BroadcastChannel(capacity) factory function invocation.

This implementation uses lock to protect the buffer, which is held only during very short buffer-update operations. The lock at each subscription is also used to manage concurrent attempts to receive from the same subscriber. The lists of suspended senders or receivers are lock-free.

Constructors

<init>

ArrayBroadcastChannel(capacity: Int)

Broadcast channel with array buffer of a fixed capacity. Sender suspends only when buffer is full due to one of the receives being slow to consume and receiver suspends only when buffer is empty.

Properties

bufferDebugString

val bufferDebugString: String

capacity

val capacity: Int

Buffer capacity.

Inherited Properties

isClosedForSend

val isClosedForSend: Boolean

Returns true if this channel was closed by invocation of close and thus the send and offer attempts throws exception.

isFull

val isFull: Boolean

Returns true if the channel is full (out of capacity) and the send attempt will suspend. This function returns false for isClosedForSend channel.

onSend

val onSend: SelectClause2<E, SendChannel<E>>

Clause for select expression of send suspending function that selects when the element that is specified as parameter is sent to the channel. When the clause is selected the reference to this channel is passed into the corresponding block.

Functions

cancel

fun cancel(cause: Throwable?): Boolean

Cancels reception of remaining elements from this channel. This function closes the channel with the specified cause (unless it was already closed), removes all buffered sent elements from it, and cancels all open subscriptions. This function returns true if the channel was not closed previously, or false otherwise.

close

fun close(cause: Throwable?): Boolean

Closes this channel with an optional exceptional cause. This is an idempotent operation – repeated invocations of this function have no effect and return false. Conceptually, its sends a special “close token” over this channel.

openSubscription

fun openSubscription(): ReceiveChannel<E>

Subscribes to this BroadcastChannel and returns a channel to receive elements from it. The resulting channel shall be cancelled to unsubscribe from this broadcast channel.

Inherited Functions

afterClose

open fun afterClose(cause: Throwable?): Unit

Invoked after successful close.

invokeOnClose

open fun invokeOnClose(handler: Handler): Unit

Registers handler which is synchronously invoked once the channel is closed or receiving side of this channel is cancelled. Only one handler can be attached to the channel during channel’s lifetime. Handler is invoked when isClosedForSend starts to return true. If channel is already closed, handler is invoked immediately.

offer

fun offer(element: E): Boolean

Adds element into this queue if it is possible to do so immediately without violating capacity restrictions and returns true. Otherwise, it returns false immediately or throws exception if the channel isClosedForSend (see close for details).

send

suspend fun send(element: E): Unit

Adds element into to this channel, suspending the caller while this channel isFull, or throws exception if the channel isClosedForSend (see close for details).

toString

open fun toString(): String

Extension Functions

consume

fun <E, R> BroadcastChannel<E>.consume(
    block: ReceiveChannel<E>.() -> R
): R

Opens subscription to this BroadcastChannel and makes sure that the given block consumes all elements from it by always invoking cancel after the execution of the block.

consumeEach

suspend fun <E> BroadcastChannel<E>.consumeEach(
    action: (E) -> Unit
): Unit

Subscribes to this BroadcastChannel and performs the specified action for each received element.

sendBlocking

fun <E> SendChannel<E>.sendBlocking(element: E): Unit

Adds element into to this channel, blocking the caller while this channel Channel.isFull, or throws exception if the channel Channel.isClosedForSend (see Channel.close for details).