Hi. Why does crash "socket.close" when it called from second thread? 
server.nim: 
    
    
    ...
    
    type
      Server* = ref object
        socket: AsyncSocket
        ...
    ...
    ...
    
    proc newServer*(): Server =
      Server(
        socket: nil,
        ...
      )
    
    proc loopThr(server: Server, serverPort: int) =
      server.socket = newAsyncSocket()
      server.started = true
      server.socket.bindAddr(serverPort.Port)
      server.socket.listen()
      server.loopTask = loop(server)
      waitFor server.loopTask
    
    proc start*(server: Server, serverPort: int) =
      spawn loopThr(server, serverPort)
      sleep(250)
    
    ...
    ...
    
    proc stop*(server: Server) =
      server.started = false
      server.clients.setLen(0)
      if server.loopTask != nil:
        server.loopTask.complete()
        server.loopTask = nil
      server.socket.close()
      server.socket = nil
    

main.nim: 
    
    
    ...
    var srv* {.threadvar.}: Server
    srv = newServer()
    srv.start(port)
    srv.stop()
    ...
    

exception: 
    
    
    Thread
    1 "main" received signal SIGSEGV, Segmentation fault.
    0x0000000000443294 in close_4mI4pLGMcv9cE68sJstU7IQ (socket=0x0) at 
/usr/lib/nim/pure/asyncnet.nim:628
    628   socket.closed = true # TODO: Add extra debugging checks for this.
    undefinedTraceback (most recent call last)
    main.nim(22)             main
    server.nim(78)           stop
    asyncnet.nim(628)        close
    SIGSEGV: Illegal storage access. (Attempt to read from nil?)
    Couldn't get registers: No such process.
    [Thread 0x7ffff6be5700 (LWP 30355) exited]
    [Thread 0x7ffff6e64700 (LWP 30354) exited]
    [Thread 0x7ffff70e3700 (LWP 30353) exited]
    [Thread 0x7ffff72e2700 (LWP 30352) exited]
    [Inferior 1 (process 30348) exited with code 01]
    Program exited with code 01
    

What I'm doing wrong?

Reply via email to