blob: c4d6719be53785848402f09944fa3e7e422b2d30 [file] [log] [blame]
package kotlinx.coroutines.experimental.scheduling
import java.util.*
internal typealias Task = TimedTask
internal typealias GlobalQueue = Queue<Task>
internal val WORK_STEALING_TIME_RESOLUTION = readFromSystemProperties(
"kotlinx.coroutines.scheduler.resolution.us", 500L, String::toLongOrNull)
internal val FORKED_TASK_OFFLOAD_THRESHOLD = readFromSystemProperties(
"kotlinx.coroutines.scheduler.fork.threshold", 64L, String::toLongOrNull)
internal var schedulerTimeSource: TimeSource = NanoTimeSource
internal data class TimedTask(val submissionTime: Long, val task: Runnable)
internal abstract class TimeSource {
abstract fun nanoTime(): Long
}
internal object NanoTimeSource : TimeSource() {
override fun nanoTime() = System.nanoTime()
}
private fun <T> readFromSystemProperties(propertyName: String, defaultValue: T, parser: (String) -> T?): T {
val value = try {
System.getProperty(propertyName)
} catch (e: SecurityException) {
null
} ?: return defaultValue
val parsed = parser(value)
return parsed ?: error("System property '$propertyName' has unrecognized value '$value'")
}