From 62da2362a87c2db5c7dcc813757f45db3b2c18fc Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 12 Feb 2020 13:57:58 +0100 Subject: [PATCH] esp_pm: esp_pm_dump_locks: don't print from a critical section Reported in https://github.com/espressif/esp-idf/issues/1917 --- components/esp_common/src/pm_locks.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/components/esp_common/src/pm_locks.c b/components/esp_common/src/pm_locks.c index 0784676da1..002057290a 100644 --- a/components/esp_common/src/pm_locks.c +++ b/components/esp_common/src/pm_locks.c @@ -173,26 +173,35 @@ esp_err_t esp_pm_dump_locks(FILE* stream) fprintf(stream, "Lock stats:\n"); esp_pm_lock_t* it; + char line[64]; SLIST_FOREACH(it, &s_list, next) { + char *buf = line; + size_t len = sizeof(line) - 1; + line[len] = 0; + size_t cb; + portENTER_CRITICAL(&it->spinlock); if (it->name == NULL) { - fprintf(stream, "lock@%p ", it); + cb = snprintf(buf, len, "lock@%p ", it); } else { - fprintf(stream, "%-15s ", it->name); + cb = snprintf(buf, len, "%-15s ", it->name); } + buf += cb; + len -= cb; #ifdef WITH_PROFILING pm_time_t time_held = it->time_held; if (it->count > 0) { time_held += cur_time - it->last_taken; } - fprintf(stream, "%10s %3d %3d %9d %9lld %3lld%%\n", + snprintf(buf, len, "%10s %3d %3d %9d %9lld %3lld%%\n", s_lock_type_names[it->type], it->arg, it->count, it->times_taken, time_held, (time_held + cur_time_d100 - 1) / cur_time_d100); #else - fprintf(stream, "%10s %3d %3d\n", s_lock_type_names[it->type], it->arg, it->count); + snprintf(buf, len, "%10s %3d %3d\n", s_lock_type_names[it->type], it->arg, it->count); #endif // WITH_PROFILING portEXIT_CRITICAL(&it->spinlock); + fputs(line, stream); } _lock_release(&s_list_lock); #ifdef WITH_PROFILING