diff --git a/codex/slots/proofs/backends/asynccircoms.nim b/codex/slots/proofs/backends/asynccircoms.nim index eaafb1b7..a82bc450 100644 --- a/codex/slots/proofs/backends/asynccircoms.nim +++ b/codex/slots/proofs/backends/asynccircoms.nim @@ -52,6 +52,10 @@ proc prove*[H]( without signal =? ThreadSignalPtr.new().mapFailure, err: return failure(err) + defer: + let sigRes = signal.close() + if sigRes.isErr: + raise (ref Defect)(msg: sigRes.error()) let args = ProveTaskArgs(signal: signal, params: self.params) proc spawnTask(): Flowvar[Result[CircomProof, string]] = @@ -59,8 +63,7 @@ proc prove*[H]( let flowvar = spawnTask() without taskRes =? await awaitThreadResult(signal, flowvar), err: - let res: ?!CircomProof = failure(err) - return res + return failure(err) without proof =? taskRes.mapFailure, err: let res: ?!CircomProof = failure(err) @@ -69,6 +72,7 @@ proc prove*[H]( let pf: CircomProof = proof success(pf) + proc verify*[H]( self: AsyncCircomCompat, proof: CircomProof, inputs: ProofInputs[H] ): Future[?!bool] {.async.} = diff --git a/codex/utils/asyncthreads.nim b/codex/utils/asyncthreads.nim index 3a3db170..341f57f1 100644 --- a/codex/utils/asyncthreads.nim +++ b/codex/utils/asyncthreads.nim @@ -12,22 +12,15 @@ const proc awaitThreadResult*[T](signal: ThreadSignalPtr, handle: Flowvar[T]): Future[?!T] {.async.} = await wait(signal) - template closeSig() = - let sigRes = signal.close() - if sigRes.isErr: - raise (ref Defect)(msg: sigRes.error()) - var res: T awaitTotal: Duration while awaitTotal < CompletionTimeout: if handle.tryComplete(res): ## TODO: pretty sure this leaks currently - closeSig() return success(res) else: awaitTotal += CompletionRetryDelay await sleepAsync(CompletionRetryDelay) - closeSig() return failure("Task signaled finish but didn't return any result within " & $CompletionRetryDelay)