mirror of
https://github.com/logos-storage/nim-chronos.git
synced 2026-01-10 17:33:13 +00:00
54 lines
1.4 KiB
Nim
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
|
|
|