• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
unTrackTasknull47 internal inline fun unTrackTask() {
48     timeSource?.unTrackTask()
49 }
50 
51 @InlineOnly
registerTimeLoopThreadnull52 internal inline fun registerTimeLoopThread() {
53     timeSource?.registerTimeLoopThread()
54 }
55 
56 @InlineOnly
unregisterTimeLoopThreadnull57 internal inline fun unregisterTimeLoopThread() {
58     timeSource?.unregisterTimeLoopThread()
59 }
60 
61 @InlineOnly
parkNanosnull62 internal inline fun parkNanos(blocker: Any, nanos: Long) {
63     timeSource?.parkNanos(blocker, nanos) ?: LockSupport.parkNanos(blocker, nanos)
64 }
65 
66 @InlineOnly
unparknull67 internal inline fun unpark(thread: Thread) {
68     timeSource?.unpark(thread) ?: LockSupport.unpark(thread)
69 }
70