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 esp_println::println;
|
||||||
use log::{LevelFilter, Metadata, Record};
|
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 {
|
impl RenderbugLogger {
|
||||||
pub fn init_logger() {
|
pub fn init_logger() {
|
||||||
|
let logger = LOGGER.init(Default::default());
|
||||||
unsafe {
|
unsafe {
|
||||||
log::set_logger_racy(&Self).ok();
|
log::set_logger_racy(logger).ok();
|
||||||
log::set_max_level_racy(LevelFilter::Debug);
|
log::set_max_level_racy(LevelFilter::Info);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -35,11 +51,14 @@ impl log::Log for RenderbugLogger {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let filename = record.file().map_or("???", |f| {f});
|
let filename = record.file().map_or("???", |f| {f});
|
||||||
if filename.chars().nth(0).unwrap() == '/' {
|
let prefix = if filename.chars().nth(0).unwrap() == '/' {
|
||||||
return;
|
record.module_path_static().unwrap()
|
||||||
}
|
} else {
|
||||||
let prefix = filename.split('/').next().unwrap();
|
filename.split('/').next().unwrap()
|
||||||
|
};
|
||||||
let suffix = filename.split('/').next_back().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