Skip to content

Commit 402006a

Browse files
committed
Fix reading an uninitialized value of defaultMainDelayOptIn due to initialization cycle and add a test that ensures this behaviour in the future
Fixes #3044
1 parent 773ab97 commit 402006a

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

kotlinx-coroutines-core/jvm/src/DefaultExecutor.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import kotlinx.coroutines.internal.*
88
import java.util.concurrent.*
99
import kotlin.coroutines.*
1010

11-
internal actual val DefaultDelay: Delay = initializeDefaultDelay()
12-
1311
private val defaultMainDelayOptIn = systemProp("kotlinx.coroutines.main.delay", true)
1412

13+
internal actual val DefaultDelay: Delay = initializeDefaultDelay()
14+
1515
private fun initializeDefaultDelay(): Delay {
1616
// Opt-out flag
1717
if (!defaultMainDelayOptIn) return DefaultExecutor

ui/kotlinx-coroutines-android/test/HandlerDispatcherTest.kt

+18
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,22 @@ class HandlerDispatcherTest : TestBase() {
161161
assertEquals("Dispatchers.Main", Dispatchers.Main.toString())
162162
assertEquals("Dispatchers.Main.immediate", Dispatchers.Main.immediate.toString())
163163
}
164+
165+
@Test
166+
fun testDelayIsDelegatedToMain() = runTest {
167+
val mainLooper = shadowOf(Looper.getMainLooper())
168+
mainLooper.pause()
169+
val mainMessageQueue = shadowOf(Looper.getMainLooper().queue)
170+
assertNull(mainMessageQueue.head)
171+
val job = launch(Dispatchers.Default, start = CoroutineStart.UNDISPATCHED) {
172+
expect(1)
173+
delay(10_000_000)
174+
expect(3)
175+
}
176+
expect(2)
177+
assertNotNull(mainMessageQueue.head)
178+
mainLooper.runOneTask()
179+
job.join()
180+
finish(4)
181+
}
164182
}

0 commit comments

Comments
 (0)