2024-05-17 00:39:07 +03:00
|
|
|
|
|
|
|
import pkg/taskpools
|
|
|
|
import pkg/taskpools/flowvars
|
|
|
|
import pkg/chronos
|
|
|
|
import pkg/chronos/threadsync
|
|
|
|
import pkg/questionable/results
|
|
|
|
|
|
|
|
const
|
|
|
|
CompletionRetryDelay* = 10.millis
|
|
|
|
CompletionTimeout* = 1.seconds # Maximum await time for completition after receiving a signal
|
|
|
|
|
|
|
|
proc awaitThreadResult*[T](signal: ThreadSignalPtr, handle: Flowvar[T]): Future[?!T] {.async.} =
|
|
|
|
await wait(signal)
|
|
|
|
|
2024-05-17 01:36:04 +03:00
|
|
|
proc closeSig() =
|
|
|
|
let sigRes = signal.close()
|
|
|
|
if sigRes.isErr:
|
|
|
|
return failure(sigRes.error())
|
|
|
|
|
2024-05-17 00:39:07 +03:00
|
|
|
var
|
|
|
|
res: T
|
|
|
|
awaitTotal: Duration
|
2024-05-17 01:31:53 +03:00
|
|
|
|
2024-05-17 00:39:07 +03:00
|
|
|
while awaitTotal < CompletionTimeout:
|
2024-05-17 01:36:04 +03:00
|
|
|
if handle.tryComplete(res): ## TODO: pretty sure this leaks currently
|
|
|
|
closeSig()
|
2024-05-17 01:31:53 +03:00
|
|
|
return success(res)
|
|
|
|
else:
|
|
|
|
awaitTotal += CompletionRetryDelay
|
|
|
|
await sleepAsync(CompletionRetryDelay)
|
2024-05-17 00:39:07 +03:00
|
|
|
|
2024-05-17 01:36:04 +03:00
|
|
|
closeSig()
|
2024-05-17 01:31:53 +03:00
|
|
|
return failure("Task signaled finish but didn't return any result within " & $CompletionRetryDelay)
|