1 /* 2 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 // Need InlineOnly for efficient bytecode on Android 6 @file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "NOTHING_TO_INLINE") 7 8 package kotlinx.coroutines 9 10 import java.util.concurrent.locks.* 11 import kotlin.internal.InlineOnly 12 13 internal abstract class AbstractTimeSource { currentTimeMillisnull14 abstract fun currentTimeMillis(): Long 15 abstract fun nanoTime(): Long 16 abstract fun wrapTask(block: Runnable): Runnable 17 abstract fun trackTask() 18 abstract fun unTrackTask() 19 abstract fun registerTimeLoopThread() 20 abstract fun unregisterTimeLoopThread() 21 abstract fun parkNanos(blocker: Any, nanos: Long) // should return immediately when nanos <= 0 22 abstract fun unpark(thread: Thread) 23 } 24 25 // For tests only 26 // @JvmField: Don't use JvmField here to enable R8 optimizations via "assumenosideeffects" 27 internal var timeSource: AbstractTimeSource? = null 28 29 @InlineOnly 30 internal inline fun currentTimeMillis(): Long = 31 timeSource?.currentTimeMillis() ?: System.currentTimeMillis() 32 33 @InlineOnly 34 internal actual inline fun nanoTime(): Long = 35 timeSource?.nanoTime() ?: System.nanoTime() 36 37 @InlineOnly 38 internal inline fun wrapTask(block: Runnable): Runnable = 39 timeSource?.wrapTask(block) ?: block 40 41 @InlineOnly 42 internal inline fun trackTask() { 43 timeSource?.trackTask() 44 } 45 46 @InlineOnly unTrackTasknull47internal inline fun unTrackTask() { 48 timeSource?.unTrackTask() 49 } 50 51 @InlineOnly registerTimeLoopThreadnull52internal inline fun registerTimeLoopThread() { 53 timeSource?.registerTimeLoopThread() 54 } 55 56 @InlineOnly unregisterTimeLoopThreadnull57internal inline fun unregisterTimeLoopThread() { 58 timeSource?.unregisterTimeLoopThread() 59 } 60 61 @InlineOnly parkNanosnull62internal inline fun parkNanos(blocker: Any, nanos: Long) { 63 timeSource?.parkNanos(blocker, nanos) ?: LockSupport.parkNanos(blocker, nanos) 64 } 65 66 @InlineOnly unparknull67internal inline fun unpark(thread: Thread) { 68 timeSource?.unpark(thread) ?: LockSupport.unpark(thread) 69 } 70