summary refs log tree commit diff stats
path: root/tests/arc/tdestroy_in_loopcond.nim
blob: 62532664d86d21434b8aae0257833fee52a70942 (plain) (blame)
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
discard """
  output: '''400 true'''
  cmd: "nim c --gc:orc $file"
"""

type HeapQueue*[T] = object
  data: seq[T]


proc len*[T](heap: HeapQueue[T]): int {.inline.} =
  heap.data.len

proc `[]`*[T](heap: HeapQueue[T], i: Natural): T {.inline.} =
  heap.data[i]

proc push*[T](heap: var HeapQueue[T], item: T) =
  heap.data.add(item)

proc pop*[T](heap: var HeapQueue[T]): T =
  result = heap.data.pop

proc clear*[T](heap: var HeapQueue[T]) = heap.data.setLen 0


type
  Future = ref object of RootObj
    s: string
    callme: proc()

var called = 0

proc consume(f: Future) =
  inc called

proc newFuture(s: string): Future =
  var r: Future
  r = Future(s: s, callme: proc() =
    consume r)
  result = r

var q: HeapQueue[tuple[finishAt: int64, fut: Future]]

proc sleep(f: int64): Future =
  q.push (finishAt: f, fut: newFuture("async-sleep"))

proc processTimers =
  # Pop the timers in the order in which they will expire (smaller `finishAt`).
  var count = q.len
  let t = high(int64)
  while count > 0 and t >= q[0].finishAt:
    q.pop().fut.callme()
    dec count

var futures: seq[Future]

proc main =
  for i in 1..200:
    futures.add sleep(56020904056300)
    futures.add sleep(56020804337500)
    #futures.add sleep(2.0)

    #futures.add sleep(4.0)

    processTimers()
    #q.pop()[1].callme()
    #q.pop()[1].callme()

    futures.setLen 0

  q.clear()

main()
GC_fullCollect()
echo called, " ", getOccupiedMem() < 160