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 currentTimeMillisnull31internal 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 unTrackTasknull48internal inline fun unTrackTask() { 49 timeSource?.unTrackTask() 50 } 51 52 @InlineOnly registerTimeLoopThreadnull53internal inline fun registerTimeLoopThread() { 54 timeSource?.registerTimeLoopThread() 55 } 56 57 @InlineOnly unregisterTimeLoopThreadnull58internal inline fun unregisterTimeLoopThread() { 59 timeSource?.unregisterTimeLoopThread() 60 } 61 62 @InlineOnly parkNanosnull63internal inline fun parkNanos(blocker: Any, nanos: Long) { 64 timeSource?.parkNanos(blocker, nanos) ?: LockSupport.parkNanos(blocker, nanos) 65 } 66 67 @InlineOnly unparknull68internal inline fun unpark(thread: Thread) { 69 timeSource?.unpark(thread) ?: LockSupport.unpark(thread) 70 } 71