This commit is contained in:
Jaremy Creechley 2024-02-21 21:59:19 -07:00
parent b53cced09e
commit 1e75c8458e
2 changed files with 11 additions and 9 deletions

View File

@ -50,6 +50,11 @@ type
template toOpenArray*[T](arr: OpenArrayHolder[T]): auto =
system.toOpenArray(arr.data, 0, arr.size)
proc toArrayHolder*[T](data: seq[T]): OpenArrayHolder[T] =
OpenArrayHolder[T](
data: cast[ptr UncheckedArray[T]](unsafeAddr(data[0])), size: data.len()
)
func jobId*[T](fut: Future[T]): JobId =
JobId fut.id()
@ -93,9 +98,7 @@ template checkJobArgs*[T](exp: seq[T], fut: untyped): OpenArrayHolder[T] =
when T is SupportedSeqTypes:
let rval = SeqRetainer[T](data: exp)
retainMemory(fut.jobId(), rval)
let expPtr = OpenArrayHolder[T](
data: cast[ptr UncheckedArray[T]](unsafeAddr(rval.data[0])), size: rval.data.len()
)
let expPtr = toArrayHolder(rval.data)
expPtr
else:
{.error: "unsupported sequence type for job argument: " & $typeof(seq[T]).}
@ -103,9 +106,7 @@ template checkJobArgs*[T](exp: seq[T], fut: untyped): OpenArrayHolder[T] =
template checkJobArgs*(exp: string, fut: untyped): OpenArrayHolder[char] =
let rval = StrRetainer(data: exp)
retainMemory(fut.jobId(), rval)
let expPtr = OpenArrayHolder[char](
data: cast[ptr UncheckedArray[char]](unsafeAddr(rval.data[0])), size: rval.data.len()
)
let expPtr = toArrayHolder(rval.data)
expPtr
template checkJobArgs*(exp: typed, fut: untyped): auto =

View File

@ -7,6 +7,7 @@ import chronos/unittest2/asynctests
import taskpools
import apatheia/queues
import apatheia/jobs
type
DataObj = ref object
@ -14,8 +15,8 @@ type
proc worker(data: OpenArrayHolder[char], queue: SignalQueue[int]) =
os.sleep(1_000)
echo "worker: ", data
discard queue.send(data.len())
echo "worker: ", data.toOpenArray()
discard queue.send(data.toOpenArray().len())
proc finalizer(obj: DataObj) =
echo "FINALIZE!!"
@ -27,7 +28,7 @@ proc runTest(tp: TaskPool, queue: SignalQueue[int]) {.async.} =
obj.data = "hello world!".toSeq
echo "spawn worker"
tp.spawn worker(obj.data, queue)
tp.spawn worker(toArrayHolder(obj.data), queue)
let res =
await wait(queue).wait(100.milliseconds)