I'm trying to define a "configurable proc", to be called by threads. Although I would assume procs cannot be garbage collected(?), I get told calling it is not GC-safe. I have tried defining the proc "value" as gcsafe through it's type, but that doesn't seem to work either.
I guess the "user" could just define the "now" proc directly as a normal proc, but I'm still wondering what I'm doing wrong here. Also, I might want to instead have now as a hidden global var, setup at runtime, before creating any thread. In that case, defining it as a "simple proc" in the "configuration module" would not work.
# This part in "configuration module":
type
Timestamp* = float
TimestampProvider* = proc (): Timestamp {.gcsafe.}
import times
let now*: TimestampProvider = cpuTime
# This part in "implementation module":
proc caller() {.thread.} =
echo("NOW: " & $now())
var thread: Thread[void]
createThread[void](thread, caller)
joinThread(thread)
Change the calling convention for TimestampProvider to be {.nimcall.}. By default proc values are considered {.closure.} which implies they use GC'ed memory.
TimestampProvider* = proc (): Timestamp {.nimcall.}