Skip to content

Commit 84dac3b

Browse files
mpetrovpablobaxter
authored andcommitted
Lock when reading a ConflatedChannel's value. (Kotlin#3248)
Reads in `isBufferEmpty()` were detected as a race by internal tests. The relevant stack snippets are: ``` Read of size 4 at 0x0000cf809644 by thread T10 (mutexes: write M0, write M1): #0 kotlinx.coroutines.channels.ConflatedChannel.isBufferEmpty()Z ConflatedChannel.kt:22 ``` and: ``` Previous write of size 4 at 0x0000cf809644 by thread T32 (mutexes: write M2, write M3, write M4, write M5, write M6, write M7): #0 kotlinx.coroutines.channels.ConflatedChannel.updateValueLocked(Ljava/lang/Object;)Lkotlinx/coroutines/internal/UndeliveredElementException; ConflatedChannel.kt:131 ```
1 parent abb91be commit 84dac3b

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kotlinx-coroutines-core/common/src/channels/ConflatedChannel.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.coroutines.selects.*
1919
*/
2020
internal open class ConflatedChannel<E>(onUndeliveredElement: OnUndeliveredElement<E>?) : AbstractChannel<E>(onUndeliveredElement) {
2121
protected final override val isBufferAlwaysEmpty: Boolean get() = false
22-
protected final override val isBufferEmpty: Boolean get() = value === EMPTY
22+
protected final override val isBufferEmpty: Boolean get() = lock.withLock { value === EMPTY }
2323
protected final override val isBufferAlwaysFull: Boolean get() = false
2424
protected final override val isBufferFull: Boolean get() = false
2525

@@ -139,5 +139,5 @@ internal open class ConflatedChannel<E>(onUndeliveredElement: OnUndeliveredEleme
139139
// ------ debug ------
140140

141141
override val bufferDebugString: String
142-
get() = "(value=$value)"
142+
get() = lock.withLock { "(value=$value)" }
143143
}

0 commit comments

Comments
 (0)