try queue setup

This commit is contained in:
Jaremy Creechley 2024-05-20 18:13:34 +03:00
parent 9e2820944d
commit f90c4cdb66
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 15 additions and 12 deletions

View File

@ -16,9 +16,7 @@ type AsyncCircomCompat* = object
tp*: Taskpool
proc proveTask[H](
circom: CircomCompat,
data: ProofInputs[H],
results: SignalQueuePtr[?!CircomProof],
circom: CircomCompat, data: ProofInputs[H], results: SignalQueuePtr[?!CircomProof]
) =
let proof = circom.prove(data)
@ -35,6 +33,7 @@ proc prove*[H](
template spawnTask() =
self.tp.spawn proveTask(self.circom, input, queue)
spawnTask()
let taskRes = await queue.recvAsync()

View File

@ -7,9 +7,12 @@ import pkg/questionable/results
const
CompletionRetryDelay* = 10.millis
CompletionTimeout* = 1.seconds # Maximum await time for completition after receiving a signal
CompletionTimeout* = 1.seconds
# Maximum await time for completition after receiving a signal
proc awaitThreadResult*[T](signal: ThreadSignalPtr, handle: Flowvar[T]): Future[?!T] {.async.} =
proc awaitThreadResult*[T](
signal: ThreadSignalPtr, handle: Flowvar[T]
): Future[?!T] {.async.} =
await wait(signal)
var
@ -23,7 +26,9 @@ proc awaitThreadResult*[T](signal: ThreadSignalPtr, handle: Flowvar[T]): Future[
awaitTotal += CompletionRetryDelay
await sleepAsync(CompletionRetryDelay)
return failure("Task signaled finish but didn't return any result within " & $CompletionRetryDelay)
return failure(
"Task signaled finish but didn't return any result within " & $CompletionRetryDelay
)
type
SignalQueue[T] = object
@ -40,9 +45,7 @@ proc release*[T](queue: SignalQueuePtr[T]): ?!void =
result = failure(err.msg)
deallocShared(queue)
proc newSignalQueue*[T](
maxItems: int = 0
): ?!SignalQueuePtr[T] =
proc newSignalQueue*[T](maxItems: int = 0): ?!SignalQueuePtr[T] =
## Create a signal queue compatible with Chronos async.
result = success cast[ptr SignalQueue[T]](allocShared0(sizeof(SignalQueue[T])))
without signal =? ThreadSignalPtr.new().mapFailure, err:
@ -59,9 +62,10 @@ proc send*[T](queue: SignalQueuePtr[T], msg: T): ?!void {.raises: [].} =
except Exception as exc:
return failure(exc.msg)
let res = queue[].signal.fireSync()
if res.isErr():
return failure(res.error())
without wasSent =? queue[].signal.fireSync(InfiniteDuration).mapFailure, err:
return failure(err)
if not wasSent:
return failure("ThreadSignalPtr not signalled in time")
result = ok()
proc recvAsync*[T](queue: SignalQueuePtr[T]): Future[?!T] {.async.} =