Add timer driver

This commit is contained in:
Emery Hemingway 2021-07-08 23:46:21 +02:00
parent 6a4eb032ad
commit 6920c26183
2 changed files with 57 additions and 0 deletions

View File

@ -0,0 +1,31 @@
# SPDX-License-Identifier: ISC
import std/[asyncdispatch, times]
import preserves, preserves/records
import syndicate
const TimeLaterThan* = RecordClass(label: symbol"TimeLaterThan", arity: 1)
proc toPreserveHook*(time: Time): Preserve =
%time.toUnixFloat
proc fromPreserveHook*(result: var Time; p: Preserve) =
if p.kind != pkDouble:
raise newException(ValueError, "not a preserved time: " & $p)
result = fromUnixFloat(p.double)
syndicate timerDriver:
spawn "timer":
during(Observe % (TimeLaterThan % `?*`)) do (deadline: Time):
let
now = getTime()
period = inMilliseconds(deadline - now)
if period > 0:
getCurrentFacet().beginExternalTask()
addTimer(period.int, oneshot = true) do (fd: AsyncFD) -> bool:
react: assert(TimeLaterThan % deadline)
getCurrentFacet().endExternalTask()
true
else:
react: assert(TimeLaterThan % deadline)

26
tests/test_timer.nim Normal file
View File

@ -0,0 +1,26 @@
# SPDX-License-Identifier: ISC
import std/[asyncdispatch, times]
import preserves, preserves/records
import syndicate
import syndicate/drivers/timers
syndicate plainTimerDemo:
boot timerDriver
spawn "laterThanDemo":
field(deadline, Time, getTime())
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)
onStop:
echo "dataspace stopped"
quit(0)
runForever()