@@ -32,6 +32,7 @@ import ../utils/asynciter
3232import ../ indexingstrategy
3333import ../ errors
3434import ../ utils/ arrayutils
35+ import ../ utils/ uniqueptr
3536
3637import pkg/ stew/ byteutils
3738
9899 success: Atomic [bool ]
99100 erasure: ptr Erasure
100101 blocks: seq [seq [byte ]]
101- parity: Isolated [seq [seq [byte ]]]
102+ parity: UniquePtr [seq [seq [byte ]]]
102103 blockSize, parityLen: int
103104 signal: ThreadSignalPtr
104105
107108 erasure: ptr Erasure
108109 blocks: seq [seq [byte ]]
109110 parity: seq [seq [byte ]]
110- recovered: Isolated [seq [seq [byte ]]]
111+ recovered: UniquePtr [seq [seq [byte ]]]
111112 blockSize, recoveredLen: int
112113 signal: ThreadSignalPtr
113114
@@ -311,8 +312,12 @@ proc leopardEncodeTask(tp: Taskpool, task: ptr EncodeTask) {.gcsafe.} =
311312
312313 task[].success.store (false )
313314 else :
314- var isolatedParity = isolate (parity)
315- task[].parity = move isolatedParity
315+ var isolatedSeq = newSeq [seq [byte ]](task[].parityLen)
316+ for i in 0 ..< task[].parityLen:
317+ var innerSeq = isolate (parity[i])
318+ isolatedSeq[i] = extract (innerSeq)
319+
320+ task[].parity = newUniquePtr (isolatedSeq)
316321 task[].success.store (true )
317322
318323proc asyncEncode * (
@@ -349,12 +354,7 @@ proc asyncEncode*(
349354 if not task.success.load ():
350355 return failure (" Leopard encoding task failed" )
351356
352- defer :
353- task.parity = default (Isolated [seq [seq [byte ]]])
354-
355- var parity = task.parity.extract
356-
357- success parity
357+ success extractValue (task.parity)
358358
359359proc encodeData (
360360 self: ErasureRef , manifest: Manifest , params: EncodingParams
@@ -474,8 +474,12 @@ proc leopardDecodeTask(tp: Taskpool, task: ptr DecodeTask) {.gcsafe.} =
474474 warn " Error from leopard decoder backend!" , error = $ res.error
475475 task[].success.store (false )
476476 else :
477- var isolatedRecovered = isolate (recovered)
478- task[].recovered = move isolatedRecovered
477+ var isolatedSeq = newSeq [seq [byte ]](task[].blocks.len)
478+ for i in 0 ..< task[].blocks.len:
479+ var innerSeq = isolate (recovered[i])
480+ isolatedSeq[i] = extract (innerSeq)
481+
482+ task[].recovered = newUniquePtr (isolatedSeq)
479483 task[].success.store (true )
480484
481485proc asyncDecode * (
@@ -509,15 +513,10 @@ proc asyncDecode*(
509513
510514 return failure (err)
511515
512- defer :
513- task.recovered = default (Isolated [seq [seq [byte ]]])
514-
515516 if not task.success.load ():
516517 return failure (" Leopard decoding task failed" )
517518
518- var recovered = task.recovered.extract
519-
520- success (recovered)
519+ success extractValue (task.recovered)
521520
522521proc decodeInternal (
523522 self: ErasureRef , encoded: Manifest
0 commit comments