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?