commit b44dc8e Author: Jan Beich Date: Fri Oct 12 18:49:59 2012 +0000 Bug 762445 - Add jemalloc3 glue for heap-committed, heap-dirty in about:memory. --- memory/build/mozjemalloc_compat.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git memory/build/mozjemalloc_compat.c memory/build/mozjemalloc_compat.c index 94ad96e..7adfef5 100644 --- memory/build/mozjemalloc_compat.c +++ memory/build/mozjemalloc_compat.c @@ -11,15 +11,50 @@ #define wrap(a) je_ ## a #endif -extern MOZ_IMPORT_API(int) +/* + * CTL_* macros are from memory/jemalloc/src/src/stats.c with changes: + * - drop `t' argument to avoid redundancy in calculating type size + * - require `i' argument for arena number explicitly + */ + +#define CTL_GET(n, v) do { \ + size_t sz = sizeof(v); \ + wrap(mallctl)(n, &v, &sz, NULL, 0); \ +} while (0) + +#define CTL_I_GET(n, v, i) do { \ + size_t mib[6]; \ + size_t miblen = sizeof(mib) / sizeof(mib[0]); \ + size_t sz = sizeof(v); \ + wrap(mallctlnametomib)(n, mib, &miblen); \ + mib[2] = i; \ + wrap(mallctlbymib)(mib, miblen, &v, &sz, NULL, 0); \ +} while (0) + +MOZ_IMPORT_API(int) wrap(mallctl)(const char*, void*, size_t*, void*, size_t); +MOZ_IMPORT_API(int) +wrap(mallctlnametomib)(const char *name, size_t *mibp, size_t *miblenp); +MOZ_IMPORT_API(int) +wrap(mallctlbymib)(const size_t *mib, size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen); MOZ_EXPORT_API(void) jemalloc_stats(jemalloc_stats_t *stats) { - size_t size = sizeof(stats->mapped); - wrap(mallctl)("stats.mapped", &stats->mapped, &size, NULL, 0); - wrap(mallctl)("stats.allocated", &stats->allocated, &size, NULL, 0); - stats->committed = -1; - stats->dirty = -1; + unsigned narenas; + size_t active, allocated, mapped, page, pdirty; + + CTL_GET("arenas.narenas", narenas); + CTL_GET("arenas.page", page); + CTL_GET("stats.active", active); + CTL_GET("stats.allocated", allocated); + CTL_GET("stats.mapped", mapped); + + /* get the summation for all arenas, i == narenas */ + CTL_I_GET("stats.arenas.0.pdirty", pdirty, narenas); + + stats->allocated = allocated; + stats->mapped = mapped; + stats->dirty = pdirty * page; + stats->committed = active + stats->dirty; }