diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt index f1cdefb2498..46a8342c5b9 100644 --- a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt +++ b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt @@ -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