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
commit be4816f509

View file

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