in ktor-io/jvm/src/io/ktor/utils/io/ByteBufferChannel.kt [118:148]
override fun close(cause: Throwable?): Boolean {
if (closed != null) return false
val newClosed = if (cause == null) ClosedElement.EmptyCause else ClosedElement(cause)
state.capacity.flush()
if (!Closed.compareAndSet(this, null, newClosed)) return false
state.capacity.flush()
if (state.capacity.isEmpty() || cause != null) tryTerminate()
resumeClosed(cause)
if (state === ReadWriteBufferState.Terminated) {
joining?.let { ensureClosedJoined(it) }
}
if (cause != null) {
attachedJob?.cancel()
readSuspendContinuationCache.close(cause)
writeSuspendContinuationCache.close(cause)
} else {
// don't cancel job
// any further attempt to suspend should be resumed immediately
// with exception for write
writeSuspendContinuationCache.close(ClosedWriteChannelException(DEFAULT_CLOSE_MESSAGE))
// and with computed result for read
readSuspendContinuationCache.close(state.capacity.flush())
}
return true
}