Add timer driver
This commit is contained in:
parent
6a4eb032ad
commit
6920c26183
|
@ -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)
|
|
@ -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()
|
Loading…
Reference in New Issue