Skip to content

Commit 40f3fe5

Browse files
author
Sergey Mashkov
committed
IO: don't suspend inside of writing block during joining
1 parent ec2af2f commit 40f3fe5

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

core/kotlinx-coroutines-io/src/main/kotlin/kotlinx/coroutines/experimental/io/ByteBufferChannel.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,7 +2042,11 @@ internal class ByteBufferChannel(
20422042
while (true) {
20432043
val writeOp = writeOp ?: return
20442044
val closed = closed
2045-
if (closed == null && joining != null && state !== ReadWriteBufferState.Terminated) return
2045+
if (closed == null && joining != null) {
2046+
val state = state
2047+
if (state is ReadWriteBufferState.Writing || state is ReadWriteBufferState.ReadingWriting) {
2048+
} else if (state !== ReadWriteBufferState.Terminated) return
2049+
}
20462050
if (WriteOp.compareAndSet(this, writeOp, null)) {
20472051
if (closed == null) writeOp.resume(Unit) else writeOp.resumeWithException(closed.sendException)
20482052
return
@@ -2135,7 +2139,7 @@ internal class ByteBufferChannel(
21352139
return when {
21362140
closed != null -> false
21372141
joined == null -> state.capacity.availableForWrite < size && state !== ReadWriteBufferState.IdleEmpty
2138-
else -> state !== ReadWriteBufferState.Terminated
2142+
else -> state !== ReadWriteBufferState.Terminated && state !is ReadWriteBufferState.Writing && state !is ReadWriteBufferState.ReadingWriting
21392143
}
21402144
}
21412145

0 commit comments

Comments
 (0)