This commit is contained in:
Jaremy Creechley 2024-02-16 14:56:14 -07:00
parent 1a6569709e
commit 934cb5ed40
4 changed files with 39 additions and 36 deletions

View File

@ -2,7 +2,7 @@ import std/tables
import std/macros
import ./queues
import ./memholders
import ./memretainers
import taskpools
import chronos
@ -35,6 +35,8 @@ type
data*: ptr UncheckedArray[T]
size*: int
SupportedSeqTypes* = byte | SomeInteger | SomeFloat
template toOpenArray*[T](arr: OpenArrayHolder[T]): auto =
system.toOpenArray(arr.data, 0, arr.size)
@ -66,7 +68,7 @@ proc createFuture*[T](jobs: JobQueue[T], name: static string): (JobResult[T], Fu
let fut = newFuture[T](name)
let id = fut.jobId()
jobs.futures[id] = fut
trace "jobs added: ", numberJobs = jobs.futures.len()
trace "job added: ", numberJobs = jobs.futures.len()
return (JobResult[T](id: id, queue: jobs.queue), fut)
proc newJobQueue*[T](
@ -79,9 +81,9 @@ proc newJobQueue*[T](
asyncSpawn(processJobs(result))
template checkJobArgs*[T](exp: seq[T], fut: untyped): OpenArrayHolder[T] =
when T is byte | SomeInteger | SomeFloat:
let rval = SeqHolder[T](data: exp)
fut.jobId().retainMemory(rval)
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()
)

View File

@ -1,30 +0,0 @@
import std/tables
import ./types
export types
type
MemHolder* = ref object of RootObj
SeqHolder*[T] = ref object of MemHolder
data*: seq[T]
StrHolder*[T] = ref object of MemHolder
data*: string
var memHolderTable = newTable[uint, seq[MemHolder]]()
proc retainMemory*(id: JobId, mem: MemHolder) {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memHolderTable[].withValue(id, value):
value[].add(mem)
do:
memHolderTable[id] = @[mem]
proc releaseMemory*(id: JobId) {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memHolderTable.del(id)
proc retainedMemoryCount*(): int {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memHolderTable.len()

View File

@ -0,0 +1,31 @@
import std/tables
import ./types
export types
type
Retainer* = ref object of RootObj
SeqRetainer*[T] = ref object of Retainer
data*: seq[T]
StrRetainer*[T] = ref object of Retainer
data*: string
var memoryRetainerTable = newTable[uint, seq[Retainer]]()
proc retainMemory*(id: JobId, mem: Retainer) {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memoryRetainerTable[].withValue(id, value):
value[].add(mem)
do:
memoryRetainerTable[id] = @[mem]
proc releaseMemory*(id: JobId) {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memoryRetainerTable.del(id)
proc retainedMemoryCount*(): int {.gcsafe, raises: [].} =
{.cast(gcsafe).}:
memoryRetainerTable.len()

View File

@ -8,7 +8,7 @@ import taskpools
import apatheia/queues
import apatheia/jobs
import apatheia/memholders
import apatheia/memretainers
proc addNumsRaw(a, b: float): float =
os.sleep(50)