logging: fix deadlocks with a proper semaphore
This commit is contained in:
@@ -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());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user