diff --git a/mongoose.c b/mongoose.c index 23551cca..86a302e4 100644 --- a/mongoose.c +++ b/mongoose.c @@ -3913,29 +3913,28 @@ size_t mg_usage(int task, int metric) { } #endif -static size_t print_stacks(mg_pfn_t fn, void *arg, va_list *ap) { - int i; - int count = (int) mg_usage(-1, MG_USAGE_NUM_TASKS); - size_t len = mg_xprintf(fn, arg, "["); - for (i = 0; i < count; i++) { - const char *name = (const char *) mg_usage(i, MG_USAGE_TASK_NAME); - len += mg_xprintf(fn, arg, "%s{%m:%m,%m:%zu,%m:%zu}", - i == 0 ? "" : ",", MG_ESC("name"), - MG_ESC(name == NULL ? "" : name), MG_ESC("free"), - (size_t) mg_usage(i, MG_USAGE_STACK_FREE), MG_ESC("total"), - (size_t) mg_usage(i, MG_USAGE_STACK_TOTAL)); - } - (void) ap; - return len + mg_xprintf(fn, arg, "]"); +static size_t print_mem_stat(mg_pfn_t fn, void *arg, const char *name, + size_t free, size_t total) { + return mg_xprintf(fn, arg, "{%m:%m,%m:%zu,%m:%zu}", MG_ESC("name"), + MG_ESC(name == NULL ? "" : name), MG_ESC("free"), free, + MG_ESC("total"), total); } size_t mg_print_mem_stats(mg_pfn_t fn, void *arg, va_list *ap) { - size_t heap_total = (size_t) mg_usage(0, MG_USAGE_HEAP_TOTAL); - size_t heap_free = (size_t) mg_usage(0, MG_USAGE_HEAP_FREE); + int i, count; + size_t heap_total = mg_usage(0, MG_USAGE_HEAP_TOTAL); + size_t heap_free = mg_usage(0, MG_USAGE_HEAP_FREE); + size_t len = mg_xprintf(fn, arg, "["); + len += print_mem_stat(fn, arg, "heap", heap_free, heap_total); + count = (int) mg_usage(-1, MG_USAGE_NUM_TASKS); + for (i = 0; i < count; i++) { + const char *name = (const char *) mg_usage(i, MG_USAGE_TASK_NAME); + len += mg_xprintf(fn, arg, ","); + len += print_mem_stat(fn, arg, name, mg_usage(i, MG_USAGE_STACK_FREE), + mg_usage(i, MG_USAGE_STACK_TOTAL)); + } (void) ap; - return mg_xprintf(fn, arg, "{%m:%zu,%m:%zu,%m:%M}", - MG_ESC("heap_total"), heap_total, MG_ESC("heap_free"), - heap_free, MG_ESC("stacks"), print_stacks); + return len + mg_xprintf(fn, arg, "]"); } #if MG_ARCH == MG_ARCH_ESP32 diff --git a/mongoose.h b/mongoose.h index 480ec5f3..995d9476 100644 --- a/mongoose.h +++ b/mongoose.h @@ -4516,8 +4516,8 @@ size_t mg_usage(int task, int metric); #define MG_HEALTH_INIT() mg_health_init() extern size_t mg_print_crash_record(mg_pfn_t, void *, va_list *); -// JSON memory statistics via mg_usage(), suitable for %M: heap_total, heap_free, -// and a stacks array of {name, free, total} +// JSON memory statistics via mg_usage(), suitable for %M: an array of +// {name, free, total} entries, starting with "heap", then task stacks // A zero total means unknown extern size_t mg_print_mem_stats(mg_pfn_t, void *, va_list *); extern void mg_health_init(void); @@ -4540,7 +4540,7 @@ static inline size_t mg_print_crash_record(mg_pfn_t fn, void *arg, } static inline size_t mg_print_mem_stats(mg_pfn_t fn, void *arg, va_list *ap) { (void) ap; - return mg_xprintf(fn, arg, "{}"); + return mg_xprintf(fn, arg, "[]"); } static inline bool mg_health_coredump_begin(size_t *size) { (void) size; diff --git a/src/health.c b/src/health.c index 2be84cfd..351fceda 100644 --- a/src/health.c +++ b/src/health.c @@ -58,29 +58,28 @@ size_t mg_usage(int task, int metric) { } #endif -static size_t print_stacks(mg_pfn_t fn, void *arg, va_list *ap) { - int i; - int count = (int) mg_usage(-1, MG_USAGE_NUM_TASKS); - size_t len = mg_xprintf(fn, arg, "["); - for (i = 0; i < count; i++) { - const char *name = (const char *) mg_usage(i, MG_USAGE_TASK_NAME); - len += mg_xprintf(fn, arg, "%s{%m:%m,%m:%zu,%m:%zu}", - i == 0 ? "" : ",", MG_ESC("name"), - MG_ESC(name == NULL ? "" : name), MG_ESC("free"), - (size_t) mg_usage(i, MG_USAGE_STACK_FREE), MG_ESC("total"), - (size_t) mg_usage(i, MG_USAGE_STACK_TOTAL)); - } - (void) ap; - return len + mg_xprintf(fn, arg, "]"); +static size_t print_mem_stat(mg_pfn_t fn, void *arg, const char *name, + size_t free, size_t total) { + return mg_xprintf(fn, arg, "{%m:%m,%m:%zu,%m:%zu}", MG_ESC("name"), + MG_ESC(name == NULL ? "" : name), MG_ESC("free"), free, + MG_ESC("total"), total); } size_t mg_print_mem_stats(mg_pfn_t fn, void *arg, va_list *ap) { - size_t heap_total = (size_t) mg_usage(0, MG_USAGE_HEAP_TOTAL); - size_t heap_free = (size_t) mg_usage(0, MG_USAGE_HEAP_FREE); + int i, count; + size_t heap_total = mg_usage(0, MG_USAGE_HEAP_TOTAL); + size_t heap_free = mg_usage(0, MG_USAGE_HEAP_FREE); + size_t len = mg_xprintf(fn, arg, "["); + len += print_mem_stat(fn, arg, "heap", heap_free, heap_total); + count = (int) mg_usage(-1, MG_USAGE_NUM_TASKS); + for (i = 0; i < count; i++) { + const char *name = (const char *) mg_usage(i, MG_USAGE_TASK_NAME); + len += mg_xprintf(fn, arg, ","); + len += print_mem_stat(fn, arg, name, mg_usage(i, MG_USAGE_STACK_FREE), + mg_usage(i, MG_USAGE_STACK_TOTAL)); + } (void) ap; - return mg_xprintf(fn, arg, "{%m:%zu,%m:%zu,%m:%M}", - MG_ESC("heap_total"), heap_total, MG_ESC("heap_free"), - heap_free, MG_ESC("stacks"), print_stacks); + return len + mg_xprintf(fn, arg, "]"); } #if MG_ARCH == MG_ARCH_ESP32 diff --git a/src/health.h b/src/health.h index 112510de..e3c38291 100644 --- a/src/health.h +++ b/src/health.h @@ -139,8 +139,8 @@ size_t mg_usage(int task, int metric); #define MG_HEALTH_INIT() mg_health_init() extern size_t mg_print_crash_record(mg_pfn_t, void *, va_list *); -// JSON memory statistics via mg_usage(), suitable for %M: heap_total, heap_free, -// and a stacks array of {name, free, total} +// JSON memory statistics via mg_usage(), suitable for %M: an array of +// {name, free, total} entries, starting with "heap", then task stacks // A zero total means unknown extern size_t mg_print_mem_stats(mg_pfn_t, void *, va_list *); extern void mg_health_init(void); @@ -163,7 +163,7 @@ static inline size_t mg_print_crash_record(mg_pfn_t fn, void *arg, } static inline size_t mg_print_mem_stats(mg_pfn_t fn, void *arg, va_list *ap) { (void) ap; - return mg_xprintf(fn, arg, "{}"); + return mg_xprintf(fn, arg, "[]"); } static inline bool mg_health_coredump_begin(size_t *size) { (void) size;