48 lines
1.7 KiB
C
48 lines
1.7 KiB
C
#include "libc/mem/mem.h"
|
|
#include "libc/str/str.h"
|
|
#include "third_party/dlmalloc/dlmalloc.internal.h"
|
|
|
|
/**
|
|
* Prints on stderr the amount of space obtained from the system (both
|
|
* via sbrk and mmap), the maximum amount (which may be more than
|
|
* current if malloc_trim and/or munmap got called), and the current
|
|
* number of bytes allocated via malloc (or realloc, etc) but not yet
|
|
* freed. Note that this is the number of bytes allocated, not the
|
|
* number requested. It will be larger than the number requested because
|
|
* of alignment and bookkeeping overhead. Because it includes alignment
|
|
* wastage as being in use, this figure may be greater than zero even
|
|
* when no user-level chunks are allocated.
|
|
*
|
|
* The reported current and maximum system memory can be inaccurate if a
|
|
* program makes other calls to system memory allocation functions
|
|
* (normally sbrk) outside of malloc.
|
|
*
|
|
* malloc_stats prints only the most commonly interesting statistics.
|
|
* More information can be obtained by calling mallinfo.
|
|
*/
|
|
struct MallocStats dlmalloc_stats(mstate m) {
|
|
struct MallocStats res;
|
|
memset(&res, 0, sizeof(res));
|
|
ensure_initialization();
|
|
if (!PREACTION(m)) {
|
|
check_malloc_state(m);
|
|
if (is_initialized(m)) {
|
|
msegmentptr s = &m->seg;
|
|
res.maxfp = m->max_footprint;
|
|
res.fp = m->footprint;
|
|
res.used = res.fp - (m->topsize + TOP_FOOT_SIZE);
|
|
while (s != 0) {
|
|
mchunkptr q = align_as_chunk(s->base);
|
|
while (segment_holds(s, q) && q != m->top &&
|
|
q->head != FENCEPOST_HEAD) {
|
|
if (!is_inuse(q)) res.used -= chunksize(q);
|
|
q = next_chunk(q);
|
|
}
|
|
s = s->next;
|
|
}
|
|
}
|
|
POSTACTION(m); /* drop lock */
|
|
}
|
|
return res;
|
|
}
|