Thanks for testing it!

I tried different combinations for writing thread instance to sharedTable. 
Seems that creating temporary variable may help, but other cases simply don't 
work:
    
    
    import sharedtables
    import strformat
    import os
    import typetraits
    
    
    type ThreadInfo = object
      thread: Thread[void]
    
    
    var threads: SharedTable[string, ThreadInfo]
    threads.init()
    
    
    proc threadEntrypoint() {.thread.} =
      while true:
        echo "OK"
    
    
    when isMainModule:
      let key = "key"
      
      # 1) works (well, if it didn't work nim would worth nothing)
      
      var value = ThreadInfo()
      value.thread.createThread(tp=threadEntrypoint)
      
      
      
      # 2) illegal storage access
      
      threads.withKey(key) do (key: string, value: var ThreadInfo, pairExists: 
var bool):
        if pairExists:
          raise newException(ValueError, "Thread with this name was already 
registered")
        
        value = ThreadInfo()
        value.thread.createThread(tp=threadEntrypoint)
        
        pairExists = true
      
      
      
      # 3) works
      
      threads.withValue(key, value) do:
        echo "Value already exists"
      do:
        var info = ThreadInfo()
        info.thread.createThread(tp=threadEntrypoint)
        threads[key] = info
      
      
      
      # 4) hangs forever
      
      threads.withValue(key, _) do:
        echo "Value already exists"
      do:
        threads[key] = ThreadInfo()
        threads.mget(key).thread.createThread(tp=threadEntrypoint)
      
      
      
      sleep(1000)
    
    
    Run

Reply via email to