Added debug code for futures.
This commit is contained in:
parent
8332e6e160
commit
41bb0bf9dc
1 changed files with 19 additions and 3 deletions
|
|
@ -41,6 +41,7 @@ type
|
||||||
cb: proc () {.closure,gcsafe.}
|
cb: proc () {.closure,gcsafe.}
|
||||||
finished: bool
|
finished: bool
|
||||||
error*: ref EBase
|
error*: ref EBase
|
||||||
|
stackTrace: string ## For debugging purposes only.
|
||||||
|
|
||||||
PFuture*[T] = ref object of PFutureBase
|
PFuture*[T] = ref object of PFutureBase
|
||||||
value: T
|
value: T
|
||||||
|
|
@ -49,10 +50,23 @@ proc newFuture*[T](): PFuture[T] =
|
||||||
## Creates a new future.
|
## Creates a new future.
|
||||||
new(result)
|
new(result)
|
||||||
result.finished = false
|
result.finished = false
|
||||||
|
result.stackTrace = getStackTrace()
|
||||||
|
|
||||||
|
proc checkFinished[T](future: PFuture[T]) =
|
||||||
|
if future.finished:
|
||||||
|
echo("<----->")
|
||||||
|
echo(future.stackTrace)
|
||||||
|
echo("-----")
|
||||||
|
when T is string:
|
||||||
|
echo("Contents: ", future.value.repr)
|
||||||
|
echo("<----->")
|
||||||
|
echo("Future already finished, cannot finish twice.")
|
||||||
|
assert false
|
||||||
|
|
||||||
proc complete*[T](future: PFuture[T], val: T) =
|
proc complete*[T](future: PFuture[T], val: T) =
|
||||||
## Completes ``future`` with value ``val``.
|
## Completes ``future`` with value ``val``.
|
||||||
assert(not future.finished, "Future already finished, cannot finish twice.")
|
#assert(not future.finished, "Future already finished, cannot finish twice.")
|
||||||
|
checkFinished(future)
|
||||||
assert(future.error == nil)
|
assert(future.error == nil)
|
||||||
future.value = val
|
future.value = val
|
||||||
future.finished = true
|
future.finished = true
|
||||||
|
|
@ -61,7 +75,8 @@ proc complete*[T](future: PFuture[T], val: T) =
|
||||||
|
|
||||||
proc complete*(future: PFuture[void]) =
|
proc complete*(future: PFuture[void]) =
|
||||||
## Completes a void ``future``.
|
## Completes a void ``future``.
|
||||||
assert(not future.finished, "Future already finished, cannot finish twice.")
|
#assert(not future.finished, "Future already finished, cannot finish twice.")
|
||||||
|
checkFinished(future)
|
||||||
assert(future.error == nil)
|
assert(future.error == nil)
|
||||||
future.finished = true
|
future.finished = true
|
||||||
if future.cb != nil:
|
if future.cb != nil:
|
||||||
|
|
@ -69,7 +84,8 @@ proc complete*(future: PFuture[void]) =
|
||||||
|
|
||||||
proc fail*[T](future: PFuture[T], error: ref EBase) =
|
proc fail*[T](future: PFuture[T], error: ref EBase) =
|
||||||
## Completes ``future`` with ``error``.
|
## Completes ``future`` with ``error``.
|
||||||
assert(not future.finished, "Future already finished, cannot finish twice.")
|
#assert(not future.finished, "Future already finished, cannot finish twice.")
|
||||||
|
checkFinished(future)
|
||||||
future.finished = true
|
future.finished = true
|
||||||
future.error = error
|
future.error = error
|
||||||
if future.cb != nil:
|
if future.cb != nil:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue