/ src / apatheia / memretainers.nim
memretainers.nim
 1  import std/tables
 2  
 3  import ./types
 4  export types
 5  
 6  type
 7    Retainer* = ref object of RootObj
 8  
 9    SeqRetainer*[T] = ref object of Retainer
10      data*: seq[T]
11  
12    StrRetainer* = ref object of Retainer
13      data*: string
14  
15  var memoryRetainerTable = newTable[uint, seq[Retainer]]()
16  
17  proc retainMemory*(id: JobId, mem: Retainer) {.gcsafe, raises: [].} =
18    {.cast(gcsafe).}:
19      memoryRetainerTable[].withValue(id, value):
20        value[].add(mem)
21      do:
22        memoryRetainerTable[id] = @[mem]
23  
24  proc releaseMemory*(id: JobId) {.gcsafe, raises: [].} =
25    {.cast(gcsafe).}:
26      memoryRetainerTable.del(id)
27  
28  proc retainedMemoryCount*(): int {.gcsafe, raises: [].} =
29    {.cast(gcsafe).}:
30      memoryRetainerTable.len()