Iterator over heap instances (#8548)

Provide "dumpHeapInstances" for iterating over type statistics
of heaps. This can be used to present structured heap information
as an alternative to "dumpNumberOfInstances".
This commit is contained in:
Emery Hemingway
2018-08-07 08:48:52 +02:00
committed by Andreas Rumpf
parent bbc404d80d
commit be4816f509

View File

@@ -37,22 +37,28 @@ when defined(nimTypeNames):
a[j] = v
if h == 1: break
proc dumpNumberOfInstances* =
# also add the allocated strings to the list of known types:
iterator dumpHeapInstances*(): tuple[name: cstring; count: int; sizes: int] =
## Iterate over summaries of types on heaps.
## This data may be inaccurate if allocations
## are made by the iterator body.
if strDesc.nextType == nil:
strDesc.nextType = nimTypeRoot
strDesc.name = "string"
nimTypeRoot = addr strDesc
var it = nimTypeRoot
while it != nil:
if (it.instances > 0 or it.sizes != 0):
yield (it.name, it.instances, it.sizes)
it = it.nextType
proc dumpNumberOfInstances* =
var a: InstancesInfo
var n = 0
var it = nimTypeRoot
var totalAllocated = 0
while it != nil:
if (it.instances > 0 or it.sizes != 0) and n < a.len:
a[n] = (it.name, it.instances, it.sizes)
inc n
for it in dumpHeapInstances():
a[n] = it
inc n
inc totalAllocated, it.sizes
it = it.nextType
sortInstances(a, n)
for i in 0 .. n-1:
c_fprintf(stdout, "[Heap] %s: #%ld; bytes: %ld\n", a[i][0], a[i][1], a[i][2])