@@ -7,16 +7,29 @@ package kotlinx.coroutines.experimental.scheduling
7
7
import kotlinx.atomicfu.*
8
8
import kotlinx.coroutines.experimental.*
9
9
import org.junit.Test
10
+ import org.junit.runner.*
11
+ import org.junit.runners.*
10
12
import java.util.*
13
+ import java.util.concurrent.*
11
14
import kotlin.test.*
12
15
13
- class CoroutineSchedulerCloseStressTest : TestBase () {
16
+ @RunWith(Parameterized ::class )
17
+ class CoroutineSchedulerCloseStressTest (private val mode : Mode ) : TestBase() {
18
+ enum class Mode { CPU , BLOCKING , CPU_LIMITED }
19
+
20
+ companion object {
21
+ @Parameterized.Parameters (name = " mode={0}" )
22
+ @JvmStatic
23
+ fun params (): Collection <Array <Any >> = Mode .values().map { arrayOf<Any >(it) }
24
+ }
25
+
14
26
private val N_REPEAT = 2 * stressTestMultiplier
15
27
private val MAX_LEVEL = 5
16
28
private val N_COROS = (1 shl (MAX_LEVEL + 1 )) - 1
17
29
private val N_THREADS = 4
18
30
private val rnd = Random ()
19
31
32
+ private lateinit var closeableDispatcher: ExperimentalCoroutineDispatcher
20
33
private lateinit var dispatcher: ExecutorCoroutineDispatcher
21
34
private var closeIndex = - 1
22
35
@@ -28,7 +41,7 @@ class CoroutineSchedulerCloseStressTest : TestBase() {
28
41
try {
29
42
launchCoroutines()
30
43
} finally {
31
- dispatcher .close()
44
+ closeableDispatcher .close()
32
45
}
33
46
}
34
47
@@ -41,7 +54,12 @@ class CoroutineSchedulerCloseStressTest : TestBase() {
41
54
}
42
55
43
56
private fun launchCoroutines () = runBlocking {
44
- dispatcher = ExperimentalCoroutineDispatcher (N_THREADS )
57
+ closeableDispatcher = ExperimentalCoroutineDispatcher (N_THREADS )
58
+ dispatcher = when (mode) {
59
+ Mode .CPU -> closeableDispatcher
60
+ Mode .CPU_LIMITED -> closeableDispatcher.limited(N_THREADS ) as ExecutorCoroutineDispatcher
61
+ Mode .BLOCKING -> closeableDispatcher.blocking(N_THREADS ) as ExecutorCoroutineDispatcher
62
+ }
45
63
started.value = 0
46
64
finished.value = 0
47
65
withContext(dispatcher) {
@@ -54,15 +72,19 @@ class CoroutineSchedulerCloseStressTest : TestBase() {
54
72
private fun CoroutineScope.launchChild (index : Int , level : Int ): Job = launch(start = CoroutineStart .ATOMIC ) {
55
73
started.incrementAndGet()
56
74
try {
57
- if (index == closeIndex) dispatcher .close()
75
+ if (index == closeIndex) closeableDispatcher .close()
58
76
if (level < MAX_LEVEL ) {
59
77
launchChild(2 * index + 1 , level + 1 )
60
78
launchChild(2 * index + 2 , level + 1 )
61
79
} else {
62
- delay(1000 )
80
+ if (rnd.nextBoolean()) {
81
+ delay(1000 )
82
+ } else {
83
+ yield ()
84
+ }
63
85
}
64
86
} finally {
65
87
finished.incrementAndGet()
66
88
}
67
89
}
68
- }
90
+ }
0 commit comments