From aa5c86b4a79f5613708d67a619bc84eead2553b7 Mon Sep 17 00:00:00 2001 From: Victoria Fischer Date: Fri, 17 Oct 2025 14:34:32 +0200 Subject: [PATCH] logging: fix deadlocks with a proper semaphore --- src/logging.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/logging.rs b/src/logging.rs index b619055..b96450c 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -1,13 +1,29 @@ +use embassy_sync::blocking_mutex::{raw::CriticalSectionRawMutex, Mutex}; use esp_println::println; use log::{LevelFilter, Metadata, Record}; +use static_cell::StaticCell; -pub struct RenderbugLogger; +// Provides a threadsafe serial logger +pub struct RenderbugLogger { + lock: Mutex +} + +impl Default for RenderbugLogger { + fn default() -> Self { + Self { + lock: Mutex::new(()) + } + } +} + +static LOGGER: StaticCell = StaticCell::new(); impl RenderbugLogger { pub fn init_logger() { + let logger = LOGGER.init(Default::default()); unsafe { - log::set_logger_racy(&Self).ok(); - log::set_max_level_racy(LevelFilter::Debug); + log::set_logger_racy(logger).ok(); + log::set_max_level_racy(LevelFilter::Info); }; } } @@ -35,11 +51,14 @@ impl log::Log for RenderbugLogger { }; let filename = record.file().map_or("???", |f| {f}); - if filename.chars().nth(0).unwrap() == '/' { - return; - } - let prefix = filename.split('/').next().unwrap(); + let prefix = if filename.chars().nth(0).unwrap() == '/' { + record.module_path_static().unwrap() + } else { + filename.split('/').next().unwrap() + }; let suffix = filename.split('/').next_back().unwrap(); - println!("{color}{}\t{GREY}{prefix}/{suffix}:{}{RESET}\t{}{RESET}", record.level(), record.line().map_or(0, |f| {f}), record.args()) + self.lock.lock(|_| { + println!("{color}{}\t{GREY}{prefix}/{suffix}:{}{RESET}\t{}{RESET}", record.level(), record.line().map_or(0, |f| {f}), record.args()); + }); } }