diff --git a/src/apatheia/jobs.nim b/src/apatheia/jobs.nim index 74a677e..92050e5 100644 --- a/src/apatheia/jobs.nim +++ b/src/apatheia/jobs.nim @@ -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 = diff --git a/tests/exFailure.nim b/tests/exFailure.nim index 97f3c14..6d9ea66 100644 --- a/tests/exFailure.nim +++ b/tests/exFailure.nim @@ -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)