diff --git a/.gitignore b/.gitignore index 2de5750..7ab75ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ tests/test_box_and_client tests/test_dsl +tests/test_timer diff --git a/src/syndicate/drivers/timers.nim b/src/syndicate/drivers/timers.nim index 3a29b48..a4d3ef0 100644 --- a/src/syndicate/drivers/timers.nim +++ b/src/syndicate/drivers/timers.nim @@ -1,25 +1,25 @@ # SPDX-License-Identifier: ISC -import std/[asyncdispatch, times] +import std/[asyncdispatch, monotimes, times] import preserves, preserves/records import syndicate const TimeLaterThan* = RecordClass(label: symbol"TimeLaterThan", arity: 1) -proc toPreserveHook*(time: Time): Preserve = - %time.toUnixFloat +proc toPreserveHook*(time: Monotime): Preserve = + %time.ticks -proc fromPreserveHook*(result: var Time; p: Preserve) = - if p.kind != pkDouble: +proc fromPreserveHook*(result: var Monotime; p: Preserve) = + if p.kind != pkSignedInteger: raise newException(ValueError, "not a preserved time: " & $p) - result = fromUnixFloat(p.double) + result = cast[MonoTime]((p.int.int64,)) syndicate timerDriver: spawn "timer": - during(Observe % (TimeLaterThan % `?*`)) do (deadline: Time): + during(Observe % (TimeLaterThan % `?*`)) do (deadline: MonoTime): let - now = getTime() + now = getMonoTime() period = inMilliseconds(deadline - now) if period > 0: getCurrentFacet().beginExternalTask() diff --git a/tests/test_timer.nim b/tests/test_timer.nim index f94b52c..2fd5360 100644 --- a/tests/test_timer.nim +++ b/tests/test_timer.nim @@ -1,6 +1,6 @@ # SPDX-License-Identifier: ISC -import std/[asyncdispatch, times] +import std/[asyncdispatch, monotimes, times] import preserves, preserves/records import syndicate @@ -10,14 +10,14 @@ syndicate plainTimerDemo: boot timerDriver spawn "laterThanDemo": - field(deadline, Time, getTime()) + field(deadline, MonoTime, getMonoTime()) field(count, int, 0) onAsserted(TimeLaterThan % deadline.get) do (): echo "TimeLaterThan ticked for deadline ", deadline.get count.set(count.get.succ) if count.get < 5: - deadline.set(deadline.get + 500.milliseconds) + deadline.set(getMonoTime() + initDuration(milliseconds = 500)) onStop: echo "dataspace stopped"