Guest User

new

a guest
Aug 6th, 2015
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.02 KB | None | 0 0
  1. #Problem: Errors with -d:release on, if --checks:on it works with -d:release.
  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.  
  21. proc HandleSock(sock: TAsyncFD) {.async.}=
  22.     while true:
  23.         let data = await sock.recv(1023)
  24.         if data == "":
  25.             break
  26.         else:
  27.             echo(data)
  28.     echo("sock closed!")
  29.  
  30. proc Idle() =
  31.     var sleepF = sleepAsync(100)
  32.     sleepF.callback = proc() =
  33.      Idle()
  34.    
  35. proc Run(csw: ChannelServerWorker) {.thread.} =
  36.     Idle()
  37.     while true:
  38.         let sockTuple = csw.SockChan.tryRecv()
  39.         if sockTuple.dataAvailable:
  40.             let sock = sockTuple.msg
  41.             register(sock)
  42.             asyncCheck sock.HandleSock()
  43.         else:
  44.             poll(1)
  45.  
  46. proc NewServer():Server =
  47.     var server = Server()
  48.     server.Workers = @[]
  49.     server.Sockets = @[]
  50.     server.Listener = newSocket()
  51.     return server
  52.  
  53. proc Run(server: Server, numCores:int=3) =
  54.     var threads = newSeq[TThread[ChannelServerWorker]](numCores)
  55.     #Start the threads:
  56.     for t in threads.mitems:
  57.         var csw = ChannelServerWorker()
  58.         csw.S = server
  59.         csw.SockChan.open()
  60.         server.Workers.add(csw)
  61.         t.createThread Run, csw
  62.  
  63.     server.Listener.bindAddr(Port(5555), "127.0.0.1")
  64.     server.Listener.listen()
  65.  
  66.     #Loop forever, accept new sock for every worker
  67.     while true:
  68.         for worker in server.Workers:
  69.           var client: Socket = Socket()
  70.           accept(server.Listener, client)
  71.           client.getFd().setBlocking(false)
  72.           worker.SockChan.send(client.getFd().TAsyncFD)
  73.      
  74.  
  75. var server = NewServer()
  76. server.Run(3)
Advertisement
Add Comment
Please, Sign In to add comment