2023-11-22 19:31:42 -03:00

54 lines
1.4 KiB
Nim

import std/sequtils
import std/sugar
import ".."/".."/chronos
import ".."/".."/chronos/profiler/events
type
SimpleEvent* = object
procedure*: string
state*: ExtendedFutureState
# XXX this is sort of bad cause we get global state all over, but the fact we
# can't use closures on callbacks and that callbacks themselves are just
# global vars means we can't really do much better for now.
var recording: seq[SimpleEvent]
proc forProcs*(self: seq[SimpleEvent], procs: varargs[string]): seq[SimpleEvent] =
collect:
for e in self:
if e.procedure in procs:
e
# FIXME bad, this needs to be refactored into a callback interface for the profiler.
var oldHandleFutureEvent: proc(event: Event) {.nimcall, gcsafe, raises: [].} = nil
var installed: bool = false
proc recordEvent(event: Event) {.nimcall, gcsafe, raises: [].} =
{.cast(gcsafe).}:
recording.add(
SimpleEvent(
procedure: $(event.location.procedure),
state: event.newState
)
)
proc getRecording*(): seq[SimpleEvent] = {.cast(gcsafe).}: recording
proc clearRecording*(): void = recording = @[]
proc installCallbacks*() =
assert not installed, "Callbacks already installed"
oldHandleFutureEvent = handleFutureEvent
handleFutureEvent = recordEvent
installed = true
proc revertCallbacks*() =
assert installed, "Callbacks already uninstalled"
handleFutureEvent = oldHandleFutureEvent
installed = false