in ktor-io/jvm/src/io/ktor/utils/io/ByteBufferChannel.kt [1572:1612]
override fun writeAvailable(min: Int, block: (ByteBuffer) -> Unit): Int {
require(min > 0) { "min should be positive" }
require(min <= BYTE_BUFFER_CAPACITY) { "Min($min) shouldn't be greater than $BYTE_BUFFER_CAPACITY" }
var result = 0
var written = false
writing { dst, state ->
val locked = state.tryWriteAtLeast(min)
if (locked > 0) {
// here we have locked all remaining for write bytes
// however we don't know how many bytes will be actually written
// so later we have to return (locked - actuallyWritten) bytes back
// it is important to lock bytes to fail concurrent tryLockForRelease
// once we have locked some bytes, tryLockForRelease will fail so it is safe to use buffer
val position = dst.position()
val l = dst.limit()
block(dst)
if (l != dst.limit()) throw IllegalStateException("buffer limit modified")
result = dst.position() - position
if (result < 0) throw IllegalStateException("position has been moved backward: pushback is not supported")
dst.bytesWritten(state, result)
if (result < locked) {
state.completeRead(locked - result) // return back extra bytes (see note above)
// we use completeRead in spite of that it is write block
// we don't need to resume write as we are already in writing block
}
written = true
}
}
if (!written) return -1
return result
}