Advertisement
Guest User

Asyncthread problem with -d:release on

a guest
Aug 6th, 2015
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.00 KB | None | 0 0
  1. #Problem: Errors with -d:release on, otherwise no problems.
  2. #Problem is on windows(haven't tested on others) that it closes without giving any warning. So it just crashes.
  3. #Nim version 0.11.2
  4.  
  5. import asyncdispatch
  6. import rawsockets
  7. import threadpool
  8. import net
  9.  
  10. type
  11.     ChannelServerWorker = ref object
  12.         SockChan: TChannel[TAsyncFD]
  13.         S: Server
  14.  
  15.     Server = ref object
  16.         Workers: seq[ChannelServerWorker]
  17.         Sockets: seq[TAsyncFD]
  18.         Listener: Socket
  19.  
  20. proc Idle(csw: ChannelServerWorker) {.async.} =
  21.     while true:
  22.         await sleepAsync(100)
  23.  
  24. proc HandleSock(sock: TAsyncFD) {.async.} =
  25.     while true:
  26.         let data = await sock.recv(1023)
  27.         if data != "":
  28.             echo(data)
  29.         else:
  30.             break
  31.     closeSocket(sock)
  32.    
  33. proc Run(csw: ChannelServerWorker) =
  34.     csw.SockChan.open()
  35.     asyncCheck csw.Idle()
  36.     while true:
  37.         let sockTuple = csw.SockChan.tryRecv()
  38.         if sockTuple.dataAvailable:
  39.             let sock = sockTuple.msg
  40.             register(sock)
  41.             asyncCheck sock.HandleSock()
  42.         else:
  43.             poll(1)
  44.  
  45. proc NewServer():Server =
  46.     var server = Server()
  47.     server.Workers = @[]
  48.     server.Sockets = @[]
  49.     server.Listener = newSocket()
  50.     return server
  51.  
  52. proc Run(server: Server, numCores:int=3) =
  53.     var threads = newSeq[TThread[ChannelServerWorker]](numCores)
  54.     #Start the threads:
  55.     for t in threads.mitems:
  56.         var csw = ChannelServerWorker()
  57.         csw.S = server
  58.         server.Workers.add(csw)
  59.         t.createThread Run, csw
  60.  
  61.     server.Listener.bindAddr(Port(5587), "127.0.0.1")
  62.     server.Listener.listen()
  63.  
  64.     #Loop forever, accept new sock for every worker
  65.     while true:
  66.         for worker in server.Workers:
  67.           var client: Socket = Socket()
  68.           accept(server.Listener, client)
  69.           client.getFd().setBlocking(false)
  70.           worker.SockChan.send(client.getFd().TAsyncFD)
  71.      
  72.  
  73. var server = NewServer()
  74. server.Run(3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement