From 55e8aefbea2c6a152af903e60832a026b8bbf091 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 9 Jul 2019 20:15:40 +0200 Subject: [PATCH] newruntime: async progress --- compiler/injectdestructors.nim | 2 +- lib/pure/asyncfutures.nim | 32 ++++++++++++++++++++++++-------- lib/pure/asyncmacro.nim | 4 ++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index c2d135e860..7893db61d1 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -154,7 +154,7 @@ type uninit: IntSet # set of uninit'ed vars uninitComputed: bool -const toDebug = "" +const toDebug = "" # "server_continue" template dbg(body) = when toDebug.len > 0: diff --git a/lib/pure/asyncfutures.nim b/lib/pure/asyncfutures.nim index 4a80056e24..1243a17f2e 100644 --- a/lib/pure/asyncfutures.nim +++ b/lib/pure/asyncfutures.nim @@ -144,16 +144,32 @@ proc checkFinished[T](future: Future[T]) = raise err proc call(callbacks: var CallbackList) = - var current = callbacks + when not defined(nimV2): + # strictly speaking a little code duplication here, but we strive + # to minimize regressions and I'm not sure I got the 'nimV2' logic + # right: + var current = callbacks + while true: + if not current.function.isNil: + callSoon(current.function) - while true: - if not current.function.isNil: - callSoon(current.function) + if current.next.isNil: + break + else: + current = current.next[] + else: + var currentFunc = unown callbacks.function + var currentNext = unown callbacks.next - if current.next.isNil: - break - else: - current = current.next[] + while true: + if not currentFunc.isNil: + callSoon(currentFunc) + + if currentNext.isNil: + break + else: + currentFunc = currentNext.function + currentNext = unown currentNext.next # callback will be called only once, let GC collect them now callbacks.next = nil diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index f48a18afb9..8e537ac258 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -31,10 +31,10 @@ template createCb(retFutureSym, iteratorNameSym, proc identName {.closure.} = try: if not nameIterVar.finished: - var next = nameIterVar() + var next = unown nameIterVar() # Continue while the yielded future is already finished. while (not next.isNil) and next.finished: - next = nameIterVar() + next = unown nameIterVar() if nameIterVar.finished: break