File: tasync_prototype.nim

package info (click to toggle)
nim 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,911,644 kB
  • sloc: sh: 24,603; ansic: 1,761; python: 1,492; makefile: 1,013; sql: 298; asm: 141; xml: 13
file content (59 lines) | stat: -rw-r--r-- 1,355 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
discard """
  output: '''asdas
processClient end
false
MEMORY 0
'''
  cmd: '''nim c --gc:arc $file'''
"""

type
  PAsyncHttpServer = ref object
    value: string
  PFutureBase {.acyclic.} = ref object
    callback: proc () {.closure.}
    value: string
    failed: bool

proc accept(server: PAsyncHttpServer): PFutureBase =
  new(result)
  result.callback = proc () =
    discard
  server.value = "hahaha"

proc processClient(): PFutureBase =
  new(result)

proc serve(server: PAsyncHttpServer): PFutureBase =
  iterator serveIter(): PFutureBase {.closure.} =
    echo server.value
    while true:
      var acceptAddrFut = server.accept()
      yield acceptAddrFut
      var fut = acceptAddrFut.value

      # with the new scope based destruction, this cannot
      # possibly work:
      var f {.cursor.} = processClient()
      # It also seems to be the wrong way how to avoid the
      # cycle. The cycle is caused by capturing the 'env'
      # part from 'env.f'.
      when true:
        f.callback =
          proc () =
            echo("processClient end")
            echo(f.failed)
      yield f
  var x = serveIter
  for i in 0 .. 1:
    result = x()
    if result.callback != nil:
      result.callback()

let mem = getOccupiedMem()

proc main =
  discard serve(PAsyncHttpServer(value: "asdas"))

main()
echo "MEMORY ", getOccupiedMem() - mem