tdestroy_in_loopcond.nim 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. discard """
  2. output: '''400 true'''
  3. cmd: "nim c --gc:orc $file"
  4. """
  5. type HeapQueue*[T] = object
  6. data: seq[T]
  7. proc len*[T](heap: HeapQueue[T]): int {.inline.} =
  8. heap.data.len
  9. proc `[]`*[T](heap: HeapQueue[T], i: Natural): T {.inline.} =
  10. heap.data[i]
  11. proc push*[T](heap: var HeapQueue[T], item: T) =
  12. heap.data.add(item)
  13. proc pop*[T](heap: var HeapQueue[T]): T =
  14. result = heap.data.pop
  15. proc clear*[T](heap: var HeapQueue[T]) = heap.data.setLen 0
  16. type
  17. Future = ref object of RootObj
  18. s: string
  19. callme: proc()
  20. var called = 0
  21. proc consume(f: Future) =
  22. inc called
  23. proc newFuture(s: string): Future =
  24. var r: Future
  25. r = Future(s: s, callme: proc() =
  26. consume r)
  27. result = r
  28. var q: HeapQueue[tuple[finishAt: int64, fut: Future]]
  29. proc sleep(f: int64): Future =
  30. result = nil
  31. q.push (finishAt: f, fut: newFuture("async-sleep"))
  32. proc processTimers =
  33. # Pop the timers in the order in which they will expire (smaller `finishAt`).
  34. var count = q.len
  35. let t = high(int64)
  36. while count > 0 and t >= q[0].finishAt:
  37. q.pop().fut.callme()
  38. dec count
  39. var futures: seq[Future]
  40. proc main =
  41. for i in 1..200:
  42. futures.add sleep(56020904056300)
  43. futures.add sleep(56020804337500)
  44. #futures.add sleep(2.0)
  45. #futures.add sleep(4.0)
  46. processTimers()
  47. #q.pop()[1].callme()
  48. #q.pop()[1].callme()
  49. futures.setLen 0
  50. q.clear()
  51. main()
  52. GC_fullCollect()
  53. echo called, " ", getOccupiedMem() < 160