From f1b51c6d4ffff6b05fb3e647125ca6b2fb203fd1 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 21 Feb 2024 21:20:17 +0100 Subject: [PATCH] Replace custom time handling with kotlin.time.TimeSource (#260) * Replace custom time handling with kotlin.time.TimeSource * Use hashcode --------- Co-authored-by: hfhbd Co-authored-by: Leonid Stashevsky --- api/kotlinx-html.api | 22 +++--------------- src/commonMain/kotlin/measure-consumer.kt | 15 +++++-------- src/commonMain/kotlin/trace-consumer.kt | 2 +- src/commonMain/kotlin/util.kt | 2 -- src/jsMain/kotlin/utilsImpl-js.kt | 5 ----- src/jvmMain/kotlin/utilsImpl-jvm.kt | 3 --- src/jvmTest/kotlin/streaming.kt | 27 +++++++++-------------- src/nativeMain/kotlin/utilNative.kt | 13 ----------- src/wasmJsMain/kotlin/utilsImpl-js.kt | 8 ------- 9 files changed, 21 insertions(+), 76 deletions(-) delete mode 100644 src/jsMain/kotlin/utilsImpl-js.kt delete mode 100644 src/jvmMain/kotlin/utilsImpl-jvm.kt delete mode 100644 src/nativeMain/kotlin/utilNative.kt delete mode 100644 src/wasmJsMain/kotlin/utilsImpl-js.kt diff --git a/api/kotlinx-html.api b/api/kotlinx-html.api index a86f84c7..233341af 100644 --- a/api/kotlinx-html.api +++ b/api/kotlinx-html.api @@ -5177,10 +5177,6 @@ public final class kotlinx/html/UtilKt { public static final fun styleLink (Lkotlinx/html/HEAD;Ljava/lang/String;)V } -public final class kotlinx/html/UtilsImpl_jvmKt { - public static final fun currentTimeMillis ()J -} - public class kotlinx/html/VAR : kotlinx/html/HTMLTag, kotlinx/html/HtmlBlockInlineTag { public fun (Ljava/util/Map;Lkotlinx/html/TagConsumer;)V public fun getConsumer ()Lkotlinx/html/TagConsumer; @@ -5360,8 +5356,9 @@ public final class kotlinx/html/consumers/Finalize_consumerKt { } public final class kotlinx/html/consumers/Measure_consumerKt { - public static final fun getOut (Lkotlinx/html/consumers/TimedResult;)Ljava/lang/Appendable; - public static final fun measureTime (Lkotlinx/html/TagConsumer;)Lkotlinx/html/TagConsumer; + public static final fun getOut (Lkotlin/time/TimedValue;)Ljava/lang/Appendable; + public static final fun measureTime (Lkotlinx/html/TagConsumer;Lkotlin/time/TimeSource;)Lkotlinx/html/TagConsumer; + public static synthetic fun measureTime$default (Lkotlinx/html/TagConsumer;Lkotlin/time/TimeSource;ILjava/lang/Object;)Lkotlinx/html/TagConsumer; } public final class kotlinx/html/consumers/PredicateResult : java/lang/Enum { @@ -5380,19 +5377,6 @@ public final class kotlinx/html/consumers/PredicateResults { public final fun getSKIP ()Lkotlinx/html/consumers/PredicateResult; } -public final class kotlinx/html/consumers/TimedResult { - public fun (Ljava/lang/Object;J)V - public final fun component1 ()Ljava/lang/Object; - public final fun component2 ()J - public final fun copy (Ljava/lang/Object;J)Lkotlinx/html/consumers/TimedResult; - public static synthetic fun copy$default (Lkotlinx/html/consumers/TimedResult;Ljava/lang/Object;JILjava/lang/Object;)Lkotlinx/html/consumers/TimedResult; - public fun equals (Ljava/lang/Object;)Z - public final fun getResult ()Ljava/lang/Object; - public final fun getTime ()J - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - public final class kotlinx/html/consumers/TraceConsumer : kotlinx/html/TagConsumer { public fun (Lkotlinx/html/TagConsumer;Lkotlin/jvm/functions/Function1;)V public fun finalize ()Ljava/lang/Object; diff --git a/src/commonMain/kotlin/measure-consumer.kt b/src/commonMain/kotlin/measure-consumer.kt index 5c44fe1c..ffec48ca 100644 --- a/src/commonMain/kotlin/measure-consumer.kt +++ b/src/commonMain/kotlin/measure-consumer.kt @@ -2,15 +2,12 @@ package kotlinx.html.consumers import kotlinx.html.* import kotlinx.html.org.w3c.dom.events.Event +import kotlin.time.* -data class TimedResult(val result: T, val time: Long) - -val TimedResult.out: O - get() = result - -private class TimeMeasureConsumer(val downstream: TagConsumer) : TagConsumer> { - private val start = currentTimeMillis() +val TimedValue.out: O + get() = value +private class TimeMeasureConsumer(val downstream: TagConsumer, val start: TimeMark) : TagConsumer> { override fun onTagStart(tag: Tag) { downstream.onTagStart(tag) } @@ -43,7 +40,7 @@ private class TimeMeasureConsumer(val downstream: TagConsumer) : TagConsum downstream.onTagComment(content) } - override fun finalize(): TimedResult = TimedResult(downstream.finalize(), currentTimeMillis() - start) + override fun finalize(): TimedValue = TimedValue(downstream.finalize(), start.elapsedNow()) } -fun TagConsumer.measureTime(): TagConsumer> = TimeMeasureConsumer(this) \ No newline at end of file +fun TagConsumer.measureTime(timeSource: TimeSource = TimeSource.Monotonic): TagConsumer> = TimeMeasureConsumer(this, timeSource.markNow()) diff --git a/src/commonMain/kotlin/trace-consumer.kt b/src/commonMain/kotlin/trace-consumer.kt index dd684412..4aa5f7bd 100644 --- a/src/commonMain/kotlin/trace-consumer.kt +++ b/src/commonMain/kotlin/trace-consumer.kt @@ -3,7 +3,7 @@ package kotlinx.html.consumers import kotlinx.html.* class TraceConsumer(val downstream: TagConsumer, val println: (String) -> Unit) : TagConsumer by downstream { - private val id = "ID-${currentTimeMillis() % 16384}" + private val id = "ID-${hashCode()}" private val path = ArrayList(1024) override fun onTagStart(tag: Tag) { diff --git a/src/commonMain/kotlin/util.kt b/src/commonMain/kotlin/util.kt index 1a54561f..7910f149 100644 --- a/src/commonMain/kotlin/util.kt +++ b/src/commonMain/kotlin/util.kt @@ -13,5 +13,3 @@ val Tag.br: Unit consumer.onTagStart(tag) consumer.onTagEnd(tag) } - -expect fun currentTimeMillis(): Long diff --git a/src/jsMain/kotlin/utilsImpl-js.kt b/src/jsMain/kotlin/utilsImpl-js.kt deleted file mode 100644 index c39bd7e7..00000000 --- a/src/jsMain/kotlin/utilsImpl-js.kt +++ /dev/null @@ -1,5 +0,0 @@ -package kotlinx.html - -import kotlin.js.* - -actual fun currentTimeMillis(): Long = Date().getTime().toLong() diff --git a/src/jvmMain/kotlin/utilsImpl-jvm.kt b/src/jvmMain/kotlin/utilsImpl-jvm.kt deleted file mode 100644 index ba554ab6..00000000 --- a/src/jvmMain/kotlin/utilsImpl-jvm.kt +++ /dev/null @@ -1,3 +0,0 @@ -package kotlinx.html - -actual fun currentTimeMillis(): Long = System.currentTimeMillis() diff --git a/src/jvmTest/kotlin/streaming.kt b/src/jvmTest/kotlin/streaming.kt index 4f50d7fb..5212800f 100644 --- a/src/jvmTest/kotlin/streaming.kt +++ b/src/jvmTest/kotlin/streaming.kt @@ -5,6 +5,7 @@ import kotlinx.html.consumers.* import kotlinx.html.stream.* import java.io.* import kotlin.test.* +import kotlin.time.* class TestStreaming { @Test fun `we should be able to construct at least simple things`() { @@ -233,29 +234,23 @@ class TestStreaming { val count = 1000 val builder = StringBuilder(26 * (count + 1)).appendHTML(false) - var minStart: Long - var maxStart = 0L - var minEnd = 0L - var maxEnd: Long + val timeSource = TimeSource.Monotonic + val now = timeSource.markNow() + var measuredDuration = Duration.INFINITE - minStart = currentTimeMillis() - val rs = builder.measureTime().div { - maxStart = currentTimeMillis() + val rs = builder.measureTime(timeSource = timeSource).div { + val measuredStart = timeSource.markNow() for (i in 1..count) { div { p { +"node$i" } } } - minEnd = currentTimeMillis() + measuredDuration = measuredStart.elapsedNow() } - maxEnd = currentTimeMillis() + val realDuration = now.elapsedNow() - val maxTime = maxEnd - minStart - val minTime = minEnd - maxStart - - val errorMessage = "Expected time should be between $minTime and $maxTime ms, but actual is ${rs.time} ms" - assertTrue(errorMessage) { rs.time >= minTime } - assertTrue(errorMessage) { rs.time <= maxTime } + val errorMessage = "Expected time should be between $measuredDuration and $realDuration, but actual is ${rs.duration}" + assertTrue(errorMessage) { rs.duration in measuredDuration..realDuration } val expected = StringBuilder().apply { append("
") @@ -268,7 +263,7 @@ class TestStreaming { append("
") } - assertEquals(expected.toString(), rs.result.toString()) + assertEquals(expected.toString(), rs.value.toString()) } @Test fun `escape bad chars`() { diff --git a/src/nativeMain/kotlin/utilNative.kt b/src/nativeMain/kotlin/utilNative.kt deleted file mode 100644 index e4a888b4..00000000 --- a/src/nativeMain/kotlin/utilNative.kt +++ /dev/null @@ -1,13 +0,0 @@ -package kotlinx.html - -import kotlinx.cinterop.* -import platform.posix.* - -@OptIn(UnsafeNumber::class, ExperimentalForeignApi::class) -actual fun currentTimeMillis(): Long { - memScoped { - val timeHolder = alloc() - time(timeHolder.ptr) - return timeHolder.value * 1000L - } -} diff --git a/src/wasmJsMain/kotlin/utilsImpl-js.kt b/src/wasmJsMain/kotlin/utilsImpl-js.kt deleted file mode 100644 index 9c782550..00000000 --- a/src/wasmJsMain/kotlin/utilsImpl-js.kt +++ /dev/null @@ -1,8 +0,0 @@ -package kotlinx.html - -import kotlin.js.* - -actual fun currentTimeMillis(): Long = currentTimeMillisJs().toLong() - -private fun currentTimeMillisJs(): Double = - js("new Date().getTime()") \ No newline at end of file