From 8becb6ab5b5159f0d2179ce99b97027cab66f771 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Fri, 16 Feb 2024 14:05:57 -0700 Subject: [PATCH] refactor --- src/apatheia/jobs.nim | 7 +++++-- src/apatheia/memholders.nim | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/apatheia/jobs.nim b/src/apatheia/jobs.nim index 2df5aba..27b9802 100644 --- a/src/apatheia/jobs.nim +++ b/src/apatheia/jobs.nim @@ -42,6 +42,8 @@ type template toOpenArray*[T](arr: OpenArrayHolder[T]): auto = system.toOpenArray(arr.data, 0, arr.size) +func jobId*[T](fut: Future[T]): JobId = JobId fut.id() + proc processJobs*[T](jobs: JobQueue[T]) {.async.} = ## Starts a "detached" async processor for a given job queue. ## @@ -54,6 +56,7 @@ proc processJobs*[T](jobs: JobQueue[T]) {.async.} = let res = await(jobs.queue.wait()).get() trace "got job result", jobResult = $res let (id, ret) = res + releaseMemory(id) # release any retained memory var fut: Future[T] if jobs.futures.pop(id, fut): fut.complete(ret) @@ -64,7 +67,7 @@ proc processJobs*[T](jobs: JobQueue[T]) {.async.} = proc createFuture*[T](jobs: JobQueue[T], name: static string): (JobResult[T], Future[T]) = ## Creates a future that returns the result of the associated job. let fut = newFuture[T](name) - let id = JobId fut.id() + let id = fut.jobId() jobs.futures[id] = fut trace "jobs added: ", numberJobs = jobs.futures.len() return (JobResult[T](id: id, queue: jobs.queue), fut, ) @@ -78,7 +81,7 @@ template checkJobArgs*[T](exp: seq[T], fut: untyped): OpenArrayHolder[T] = # static: # echo "checkJobArgs::SEQ: ", $typeof(exp) let rval = SeqHolder[T](data: exp) - storeMemoryHolder(fut.id().JobId, rval) + fut.jobId().retainMemory(rval) let expPtr = OpenArrayHolder[T](data: cast[ptr UncheckedArray[T]](unsafeAddr(rval.data[0])), size: rval.data.len()) expPtr diff --git a/src/apatheia/memholders.nim b/src/apatheia/memholders.nim index b30a9d2..ac6a2be 100644 --- a/src/apatheia/memholders.nim +++ b/src/apatheia/memholders.nim @@ -12,13 +12,13 @@ type var memHolderTable = newTable[uint, seq[MemHolder]]() -proc storeMemoryHolder*[T: uint](id: T, mem: MemHolder) {.gcsafe, raises: [].} = +proc retainMemory*[T: uint](id: T, mem: MemHolder) {.gcsafe, raises: [].} = {.cast(gcsafe).}: memHolderTable[].withValue(id, value): value[].add(mem) do: memHolderTable[id] = @[mem] -proc releaseMemoryHolder*[T: uint](id: T) {.gcsafe, raises: [].} = +proc releaseMemory*[T: uint](id: T) {.gcsafe, raises: [].} = {.cast(gcsafe).}: memHolderTable.del(id)