aboutsummaryrefslogtreecommitdiffstats
path: root/src/stats.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-01-18 01:01:19 -0800
committerJason Evans <jasone@canonware.com>2017-01-19 14:05:00 -0800
commit66bf773ef2980b0baf6d46a4b65ccedd9f1e1931 (patch)
tree464c46c86e27ee1b6f05fef14f948077dc334c4f /src/stats.c
parent7a61ebe71f7cadd54c68ea5fb0b33f6aee290aef (diff)
downloadplatform_external_jemalloc_new-66bf773ef2980b0baf6d46a4b65ccedd9f1e1931.tar.gz
platform_external_jemalloc_new-66bf773ef2980b0baf6d46a4b65ccedd9f1e1931.tar.bz2
platform_external_jemalloc_new-66bf773ef2980b0baf6d46a4b65ccedd9f1e1931.zip
Test JSON output of malloc_stats_print() and fix bugs.
Implement and test a JSON validation parser. Use the parser to validate JSON output from malloc_stats_print(), with a significant subset of supported output options. This resolves #551.
Diffstat (limited to 'src/stats.c')
-rw-r--r--src/stats.c65
1 files changed, 37 insertions, 28 deletions
diff --git a/src/stats.c b/src/stats.c
index f20fd4ce..020d56bd 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -37,7 +37,7 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque,
bool json, bool large, unsigned i)
{
size_t page;
- bool config_tcache, in_gap, in_gap_prev;
+ bool in_gap, in_gap_prev;
unsigned nbins, j;
CTL_GET("arenas.page", &page, size_t);
@@ -47,7 +47,6 @@ stats_arena_bins_print(void (*write_cb)(void *, const char *), void *cbopaque,
malloc_cprintf(write_cb, cbopaque,
"\t\t\t\t\"bins\": [\n");
} else {
- CTL_GET("config.tcache", &config_tcache, bool);
if (config_tcache) {
malloc_cprintf(write_cb, cbopaque,
"bins: size ind allocated nmalloc"
@@ -700,9 +699,11 @@ stats_general_print(void (*write_cb)(void *, const char *), void *cbopaque,
malloc_cprintf(write_cb, cbopaque,
"\t\t\t\"nbins\": %u,\n", nbins);
- CTL_GET("arenas.nhbins", &uv, unsigned);
- malloc_cprintf(write_cb, cbopaque,
- "\t\t\t\"nhbins\": %u,\n", uv);
+ if (config_tcache) {
+ CTL_GET("arenas.nhbins", &uv, unsigned);
+ malloc_cprintf(write_cb, cbopaque,
+ "\t\t\t\"nhbins\": %u,\n", uv);
+ }
malloc_cprintf(write_cb, cbopaque,
"\t\t\t\"bin\": [\n");
@@ -867,8 +868,10 @@ stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque,
MALLCTL_ARENAS_ALL, bins, large);
if (json) {
malloc_cprintf(write_cb, cbopaque,
- "\t\t\t}%s\n", (ninitialized > 1) ?
- "," : "");
+ "\t\t\t}%s\n",
+ ((destroyed_initialized &&
+ destroyed) || unmerged) ? "," :
+ "");
}
}
@@ -886,31 +889,37 @@ stats_print_helper(void (*write_cb)(void *, const char *), void *cbopaque,
MALLCTL_ARENAS_DESTROYED, bins, large);
if (json) {
malloc_cprintf(write_cb, cbopaque,
- "\t\t\t}%s\n", (ninitialized > 1) ?
- "," : "");
+ "\t\t\t}%s\n", unmerged ? "," :
+ "");
}
}
/* Unmerged stats. */
- for (i = j = 0; i < narenas; i++) {
- if (initialized[i]) {
- if (json) {
- j++;
- malloc_cprintf(write_cb,
- cbopaque,
- "\t\t\t\"%u\": {\n", i);
- } else {
- malloc_cprintf(write_cb,
- cbopaque, "\narenas[%u]:\n",
- i);
- }
- stats_arena_print(write_cb, cbopaque,
- json, i, bins, large);
- if (json) {
- malloc_cprintf(write_cb,
- cbopaque,
- "\t\t\t}%s\n", (j <
- ninitialized) ? "," : "");
+ if (unmerged) {
+ for (i = j = 0; i < narenas; i++) {
+ if (initialized[i]) {
+ if (json) {
+ j++;
+ malloc_cprintf(write_cb,
+ cbopaque,
+ "\t\t\t\"%u\": {\n",
+ i);
+ } else {
+ malloc_cprintf(write_cb,
+ cbopaque,
+ "\narenas[%u]:\n",
+ i);
+ }
+ stats_arena_print(write_cb,
+ cbopaque, json, i, bins,
+ large);
+ if (json) {
+ malloc_cprintf(write_cb,
+ cbopaque,
+ "\t\t\t}%s\n", (j <
+ ninitialized) ? ","
+ : "");
+ }
}
}
}