Skip to content

Commit cbd8e40

Browse files
committed
Fixed ChannelSendReceiveStressTest memory consumption for stress test mode
1 parent dd77cb5 commit cbd8e40

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/channels/AbstractChannel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public abstract class AbstractChannel<E> : Channel<E> {
289289
override fun finishOnSuccess(affected: LockFreeLinkedListNode, next: LockFreeLinkedListNode) {
290290
super.finishOnSuccess(affected, next)
291291
// we can actually remove on select start, but this is also Ok (it'll get removed if discovered there)
292-
(node as SendSelect<*>).removeOnSelectCompletion()
292+
node.removeOnSelectCompletion()
293293
}
294294
}
295295

kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/channels/ChannelSendReceiveStressTest.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import org.junit.Assert.assertTrue
2323
import org.junit.Test
2424
import org.junit.runner.RunWith
2525
import org.junit.runners.Parameterized
26-
import java.util.concurrent.ConcurrentHashMap
2726
import java.util.concurrent.atomic.AtomicInteger
27+
import java.util.concurrent.atomic.AtomicIntegerArray
2828

2929
@RunWith(Parameterized::class)
3030
class ChannelSendReceiveStressTest(
@@ -50,7 +50,8 @@ class ChannelSendReceiveStressTest(
5050
val sendersCompleted = AtomicInteger()
5151
val receiversCompleted = AtomicInteger()
5252
val dupes = AtomicInteger()
53-
val received = ConcurrentHashMap<Int,Int>()
53+
val received = AtomicIntegerArray(nEvents)
54+
val receivedTotal = AtomicInteger()
5455
val receivedBy = IntArray(nReceivers)
5556

5657
@Test
@@ -89,15 +90,15 @@ class ChannelSendReceiveStressTest(
8990
println("Tested $kind with nSenders=$nSenders, nReceivers=$nReceivers")
9091
println("Completed successfully ${sendersCompleted.get()} sender coroutines")
9192
println("Completed successfully ${receiversCompleted.get()} receiver coroutines")
92-
println(" Received ${received.size} events")
93+
println(" Received ${receivedTotal.get()} events")
9394
println(" Received dupes ${dupes.get()}")
9495
repeat(nReceivers) { receiveIndex ->
9596
println(" Received by #$receiveIndex ${receivedBy[receiveIndex]}")
9697
}
9798
assertEquals(nSenders, sendersCompleted.get())
9899
assertEquals(nReceivers, receiversCompleted.get())
99100
assertEquals(0, dupes.get())
100-
assertEquals(nEvents, received.size)
101+
assertEquals(nEvents, receivedTotal.get())
101102
repeat(nReceivers) { receiveIndex ->
102103
assertTrue("Each receiver should have received something", receivedBy[receiveIndex] > 0)
103104
}
@@ -114,10 +115,11 @@ class ChannelSendReceiveStressTest(
114115
}
115116

116117
private fun doReceived(receiverIndex: Int, event: Int) {
117-
if (received.put(event, event) != null) {
118+
if (!received.compareAndSet(event, 0, 1)) {
118119
println("Duplicate event $event at $receiverIndex")
119120
dupes.incrementAndGet()
120121
}
122+
receivedTotal.incrementAndGet()
121123
receivedBy[receiverIndex]++
122124
}
123125

0 commit comments

Comments
 (0)