• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Need InlineOnly for efficient bytecode on Android
2 @file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "NOTHING_TO_INLINE")
3 
4 package kotlinx.coroutines
5 
6 import java.util.concurrent.locks.*
7 import kotlin.internal.InlineOnly
8 
9 internal abstract class AbstractTimeSource {
currentTimeMillisnull10     abstract fun currentTimeMillis(): Long
11     abstract fun nanoTime(): Long
12     abstract fun wrapTask(block: Runnable): Runnable
13     abstract fun trackTask()
14     abstract fun unTrackTask()
15     abstract fun registerTimeLoopThread()
16     abstract fun unregisterTimeLoopThread()
17     abstract fun parkNanos(blocker: Any, nanos: Long) // should return immediately when nanos <= 0
18     abstract fun unpark(thread: Thread)
19 }
20 
21 // For tests only
22 // @JvmField: Don't use JvmField here to enable R8 optimizations via "assumenosideeffects"
23 private var timeSource: AbstractTimeSource? = null
24 
25 // TODO: without this, there's a compilation error. Why?
26 internal inline fun mockTimeSource(source: AbstractTimeSource?) {
27     timeSource = source
28 }
29 
30 @InlineOnly
currentTimeMillisnull31 internal inline fun currentTimeMillis(): Long =
32     timeSource?.currentTimeMillis() ?: System.currentTimeMillis()
33 
34 @InlineOnly
35 internal actual inline fun nanoTime(): Long =
36     timeSource?.nanoTime() ?: System.nanoTime()
37 
38 @InlineOnly
39 internal inline fun wrapTask(block: Runnable): Runnable =
40     timeSource?.wrapTask(block) ?: block
41 
42 @InlineOnly
43 internal inline fun trackTask() {
44     timeSource?.trackTask()
45 }
46 
47 @InlineOnly
unTrackTasknull48 internal inline fun unTrackTask() {
49     timeSource?.unTrackTask()
50 }
51 
52 @InlineOnly
registerTimeLoopThreadnull53 internal inline fun registerTimeLoopThread() {
54     timeSource?.registerTimeLoopThread()
55 }
56 
57 @InlineOnly
unregisterTimeLoopThreadnull58 internal inline fun unregisterTimeLoopThread() {
59     timeSource?.unregisterTimeLoopThread()
60 }
61 
62 @InlineOnly
parkNanosnull63 internal inline fun parkNanos(blocker: Any, nanos: Long) {
64     timeSource?.parkNanos(blocker, nanos) ?: LockSupport.parkNanos(blocker, nanos)
65 }
66 
67 @InlineOnly
unparknull68 internal inline fun unpark(thread: Thread) {
69     timeSource?.unpark(thread) ?: LockSupport.unpark(thread)
70 }
71