In my test, I have this code: type TstMsg = Msg[int] TstRep = Msg[float] var dst: QueueID initThreadID(ThreadID(0)) var m: TstMsg m.content = 42 when USE_TOPICS: initTopicID(TopicID(33)) let pid = myProcessID() dst = queueID(pid, ThreadID(1), TopicID(99)) else: dst = queueID(myProcessID(), ThreadID(1)) assert(not pendingMsg()) sendMsgNow(dst, addr m) echo("First msg sent from Thread 0.")
which in sendMsgNow() indirectly accesses this threadvar: var myPendingRequests {.threadvar.}: HashSet[ptr MsgBase] myPendingRequests.init() And it works. However, if I refactor my code like this (moving all code after "var dst: QueueID" to a proc, and calling it): type TstMsg = Msg[int] TstRep = Msg[float] var dst: QueueID proc startTest() = initThreadID(ThreadID(0)) var m: TstMsg m.content = 42 when USE_TOPICS: initTopicID(TopicID(33)) let pid = myProcessID() dst = queueID(pid, ThreadID(1), TopicID(99)) else: dst = queueID(myProcessID(), ThreadID(1)) assert(not pendingMsg()) sendMsgNow(dst, addr m) echo("First msg sent from Thread 0.") startTest() Then I get this error: Traceback (most recent call last) test_kueues.nim(128) receiver kueues.nim(830) recvMsgs kueues.nim(785) collectReceived kueues.nim(771) validateRequest sets.nim(204) contains system.nim(3613) failedAssertImpl system.nim(3605) raiseAssert system.nim(2724) sysFatal Error: unhandled exception: isValid(s) The set needs to be initialized. [AssertionError] Error: execution of an external program failed: '../bin/test_kueues ' The terminal process terminated with exit code: 1 kueues.nim(771) is accessing myPendingRequests. All the rest of the code is unchanged. How could myPendingRequests ever _not_ be initialized, and why is that only so if I move some top level code to a proc, which I then call at the exact same place the top level code was before? Even if myPendingRequests.init() ran only once, and not once per thread (does it? and if yes, how do you say "do this in every thread"?), I still don't think it would explain that the error only comes when the code is not "top level".