blob: 62532664d86d21434b8aae0257833fee52a70942 (
plain) (
tree)
|
|
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
|