in reactive/kotlinx-coroutines-reactive/src/Channel.kt [40:54]
override fun onReceiveEnqueued() {
_requested.loop { wasRequested ->
val subscription = _subscription.value
val needRequested = wasRequested - 1
if (subscription != null && needRequested < 0) { // need to request more from subscription
// try to fixup by making request
if (wasRequested != request && !_requested.compareAndSet(wasRequested, request))
return@loop // continue looping if failed
subscription.request((request - needRequested).toLong())
return
}
// just do book-keeping
if (_requested.compareAndSet(wasRequested, needRequested)) return
}
}