diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs index 45f36b3280621210bc66e6e45796680acf5516a0..1f48db8805a6596484117358bbb9a986ad61e576 100644 --- a/src/arch/x86_64/start.rs +++ b/src/arch/x86_64/start.rs @@ -84,7 +84,7 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! { KERNEL_SIZE.store(kernel_size, Ordering::SeqCst); // Initialize logger - log::init_logger(); + log::init_logger(|r| println!("{}:{} -- {}", r.target(), r.level(), r.args())); info!("Redox OS starting..."); println!("Kernel: {:X}:{:X}", kernel_base, kernel_base + kernel_size); diff --git a/src/log.rs b/src/log.rs index a33afc50cc328f076e2dd8df6cf08b86af05cf34..e1dd1aa76f1464bc0b2b4e8f88129f593c227abb 100644 --- a/src/log.rs +++ b/src/log.rs @@ -1,4 +1,5 @@ use alloc::collections::VecDeque; +use core::sync::atomic::{AtomicBool, Ordering}; use spin::Mutex; pub static LOG: Mutex<Option<Log>> = Mutex::new(None); @@ -36,6 +37,7 @@ impl Log { struct RedoxLogger { log_func: fn(&log::Record), + pub initialized: AtomicBool, } impl ::log::Log for RedoxLogger { @@ -48,14 +50,26 @@ impl ::log::Log for RedoxLogger { fn flush(&self) {} } -pub fn init_logger() { - ::log::set_max_level(::log::LevelFilter::Info); - match ::log::set_logger(&LOGGER) { - Ok(_) => ::log::info!("Logger initialized."), - Err(e) => println!("Logger setup failed! error: {}", e), +pub fn init_logger(func: fn(&log::Record)) { + unsafe { + match LOGGER.initialized.load(Ordering::SeqCst) { + false => { + ::log::set_max_level(::log::LevelFilter::Info); + LOGGER.log_func = func; + match ::log::set_logger(&LOGGER) { + Ok(_) => ::log::info!("Logger initialized."), + Err(e) => println!("Logger setup failed! error: {}", e), + } + LOGGER.initialized.store(true, Ordering::SeqCst); + }, + true => ::log::info!("Tried to reinitialize the logger, which is not possible. Ignoring."), + } } } -static LOGGER: RedoxLogger = RedoxLogger { log_func: |_| {} }; +static mut LOGGER: RedoxLogger = RedoxLogger { + log_func: |_| {}, + initialized: AtomicBool::new(false), +}; pub use log::{debug, error, info, set_max_level, warn};