Guest User

Multicore async, works with no release

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