logging: fix deadlocks with a proper semaphore

This commit is contained in:
2025-10-17 14:34:32 +02:00
parent f9a04a8c69
commit aa5c86b4a7

View File

@@ -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<CriticalSectionRawMutex, ()>
}
impl Default for RenderbugLogger {
fn default() -> Self {
Self {
lock: Mutex::new(())
}
}
}
static LOGGER: StaticCell<RenderbugLogger> = 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());
});
}
}