[Wasm/WASI] Use K/JVM implementation of MonotonicTimeSource

Fixed #KT-60963
This commit is contained in:
Igor Yakovlev
2024-01-03 15:18:56 +01:00
committed by Space Team
parent 567fc6b140
commit 1e9bc1abc7
@@ -5,12 +5,10 @@
package kotlin.time
import kotlin.time.Duration.Companion.nanoseconds
import kotlin.time.TimeSource.Monotonic.ValueTimeMark
import kotlin.wasm.WasiError
import kotlin.wasm.WasiErrorCode
import kotlin.wasm.WasmImport
import kotlin.wasm.unsafe.Pointer
import kotlin.wasm.unsafe.withScopedMemoryAllocator
private const val MONOTONIC = 1
@@ -29,31 +27,27 @@ private fun clockTimeGet(): Long = withScopedMemoryAllocator { allocator ->
resultPtr = rp0.address.toInt()
)
if (ret == 0) {
(Pointer(rp0.address.toInt().toUInt())).loadLong()
rp0.loadLong()
} else {
throw WasiError(WasiErrorCode.values()[ret])
}
}
@SinceKotlin("1.3")
//TODO: Try use implementation of K/JVM since it uses a Long nanosecond counter similar to System.nanoTime (KT-60963)
internal actual object MonotonicTimeSource : TimeSource.WithComparableMarks {
actual override fun markNow(): ValueTimeMark =
ValueTimeMark(clockTimeGet())
private val zero: Long = clockTimeGet()
private fun read(): Long = clockTimeGet() - zero
override fun toString(): String = "TimeSource(clock_time_get())"
actual override fun markNow(): ValueTimeMark = ValueTimeMark(read())
actual fun elapsedFrom(timeMark: ValueTimeMark): Duration =
(clockTimeGet() - timeMark.reading).nanoseconds
saturatingDiff(read(), timeMark.reading, DurationUnit.NANOSECONDS)
actual fun differenceBetween(one: ValueTimeMark, another: ValueTimeMark): Duration =
saturatingOriginsDiff(one.reading, another.reading, DurationUnit.NANOSECONDS)
actual fun adjustReading(timeMark: ValueTimeMark, duration: Duration): ValueTimeMark =
ValueTimeMark(timeMark.reading + duration.toLong(DurationUnit.NANOSECONDS))
actual fun differenceBetween(one: ValueTimeMark, another: ValueTimeMark): Duration {
val ms1 = one.reading
val ms2 = another.reading
return if (ms1 == ms2) Duration.ZERO else (ms1 - ms2).nanoseconds
}
override fun toString(): String = "WASI monotonic time source"
ValueTimeMark(saturatingAdd(timeMark.reading, DurationUnit.NANOSECONDS, duration))
}
@Suppress("ACTUAL_WITHOUT_EXPECT") // visibility