|
9 | 9 |
|
10 | 10 | {.push raises: [].}
|
11 | 11 |
|
12 |
| -import std/[sugar, atomics] |
| 12 | +import std/[sugar, atomics, locks] |
13 | 13 |
|
14 | 14 | import pkg/chronos
|
15 | 15 | import pkg/taskpools
|
|
39 | 39 | backendCfg: ptr CircomBn254Cfg
|
40 | 40 | vkp*: ptr CircomKey
|
41 | 41 | taskpool: Taskpool
|
| 42 | + lock: ptr Lock |
42 | 43 |
|
43 | 44 | NormalizedProofInputs*[H] {.borrow: `.`.} = distinct ProofInputs[H]
|
44 | 45 |
|
@@ -97,24 +98,29 @@ proc release*(self: CircomCompat) =
|
97 | 98 | if not isNil(self.vkp):
|
98 | 99 | self.vkp.unsafeAddr.release_key()
|
99 | 100 |
|
| 101 | + if not isNil(self.lock): |
| 102 | + deinitLock(self.lock[]) # Cleanup the lock |
| 103 | + dealloc(self.lock) # Free the memory |
| 104 | + |
100 | 105 | proc circomProveTask(task: ptr ProveTask) {.gcsafe.} =
|
101 |
| - defer: |
102 |
| - discard task[].signal.fireSync() |
| 106 | + withLock task[].circom.lock[]: |
| 107 | + defer: |
| 108 | + discard task[].signal.fireSync() |
103 | 109 |
|
104 |
| - var proofPtr: ptr Proof = nil |
105 |
| - try: |
106 |
| - if ( |
107 |
| - let res = task.circom.backendCfg.prove_circuit(task.ctx, proofPtr.addr) |
108 |
| - res != ERR_OK |
109 |
| - ) or proofPtr == nil: |
110 |
| - task.success.store(false) |
111 |
| - return |
112 |
| - |
113 |
| - copyProof(task.proof, proofPtr[]) |
114 |
| - task.success.store(true) |
115 |
| - finally: |
116 |
| - if proofPtr != nil: |
117 |
| - proofPtr.addr.release_proof() |
| 110 | + var proofPtr: ptr Proof = nil |
| 111 | + try: |
| 112 | + if ( |
| 113 | + let res = task.circom.backendCfg.prove_circuit(task.ctx, proofPtr.addr) |
| 114 | + res != ERR_OK |
| 115 | + ) or proofPtr == nil: |
| 116 | + task.success.store(false) |
| 117 | + return |
| 118 | + |
| 119 | + copyProof(task.proof, proofPtr[]) |
| 120 | + task.success.store(true) |
| 121 | + finally: |
| 122 | + if proofPtr != nil: |
| 123 | + proofPtr.addr.release_proof() |
118 | 124 |
|
119 | 125 | proc asyncProve*[H](
|
120 | 126 | self: CircomCompat, input: NormalizedProofInputs[H], proof: ptr Proof
|
@@ -328,9 +334,11 @@ proc init*(
|
328 | 334 | numSamples = DefaultSamplesNum,
|
329 | 335 | taskpool: Taskpool,
|
330 | 336 | ): CircomCompat =
|
331 |
| - ## Create a new ctx |
332 |
| - ## |
| 337 | + # Allocate and initialize the lock |
| 338 | + var lockPtr = create(Lock) # Allocate memory for the lock |
| 339 | + initLock(lockPtr[]) # Initialize the lock |
333 | 340 |
|
| 341 | + ## Create a new ctx |
334 | 342 | var cfg: ptr CircomBn254Cfg
|
335 | 343 | var zkey = if zkeyPath.len > 0: zkeyPath.cstring else: nil
|
336 | 344 |
|
@@ -359,4 +367,5 @@ proc init*(
|
359 | 367 | backendCfg: cfg,
|
360 | 368 | vkp: vkpPtr,
|
361 | 369 | taskpool: taskpool,
|
| 370 | + lock: lockPtr, |
362 | 371 | )
|
0 commit comments