Advertisement
Guest User

multiasync eedee

a guest
Nov 7th, 2015
523
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.34 KB | None | 0 0
  1. import nativesockets
  2. import asyncdispatch
  3. import net
  4.  
  5. const content = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  6. const response = "HTTP/1.1 200 OK\r\LContent-Length: " & $content.len & "\r\LConnection:keep-alive\r\L\r\L" & content
  7.  
  8. proc Idle() {.async.} =
  9.     while true:
  10.         await sleepAsync(100)
  11.  
  12. type
  13.     MultiAsyncCore = ref object
  14.         Workers: seq[Worker]
  15.         Listener: Socket
  16.  
  17.  
  18.     Worker = ref object
  19.         SockChan: Channel[Socket]
  20.         FCore: MultiAsyncCore
  21.  
  22.  
  23. proc NewMultiAsyncCore*(port: int, address = "127.0.0.1"): MultiAsyncCore =
  24.     var fcb = MultiAsyncCore()
  25.     fcb.Workers = @[]
  26.  
  27.     fcb.Listener = newSocket()
  28.     fcb.Listener.bindAddr(Port(port), address)
  29.     fcb.Listener.listen()
  30.  
  31.     #GC_unref(fcb)-
  32.     #GC_unref(fcb.Listener)
  33.     #GC_unref(fcb.Workers)
  34.     return fcb
  35.  
  36. proc NewWorker(fc: MultiAsyncCore): Worker =
  37.     var wb = Worker()
  38.     wb.SockChan.open()
  39.     wb.FCore = fc
  40.     #GC_unref(wb)
  41.     return wb
  42.  
  43. proc HandleSock(sock: AsyncFD) {.async.} =
  44.     while true:
  45.         let data = await sock.recv(1024)
  46.         if data.len != 0:
  47.             discard sock.send(response)
  48.         else:
  49.             sock.closeSocket()
  50.             break
  51.  
  52. proc Run(worker: Worker) {.thread.} =
  53.     discard Idle()
  54.     while true:
  55.         let sockTuple = worker.SockChan.tryRecv()
  56.         if sockTuple.dataAvailable:
  57.             #GC_unref(sockTuple.msg)
  58.             var afd = sockTuple.msg.getFd.AsyncFD()
  59.             register(afd)
  60.             discard HandleSock(afd)
  61.         else:
  62.             poll(1)
  63.  
  64. proc AddWorker*(fc: MultiAsyncCore, num=3) =
  65.     var threads = newSeq[Thread[Worker]](num)
  66.     for thread in threads.mitems:
  67.         var worker = NewWorker(fc)
  68.         fc.Workers.add(worker)
  69.         thread.createThread(Run, worker)
  70.  
  71. proc Accept(fc: MultiAsyncCore, worker: Worker) =
  72.     try:
  73.         var client: Socket = newSocket()
  74.         accept(fc.Listener, client)
  75.         #GC_unref(client)
  76.         client.getFd().setBlocking(false)
  77.         worker.SockChan.send(client)
  78.     except:
  79.         discard
  80.  
  81. proc Run*(fc: MultiAsyncCore) =
  82.     while true:
  83.         for worker in fc.Workers:
  84.             fc.Accept(worker)
  85.  
  86. var fcv = NewMultiAsyncCore(80)
  87. fcv.AddWorker(3) # 1 thread per core minus the listener loop.
  88. fcv.Run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement