@@ -7,13 +7,11 @@ use spinning_top::Spinlock;
77/// The global logger instance used for the `log` crate.
88pub static LOGGER : OnceCell < LockedLogger > = OnceCell :: uninit ( ) ;
99
10- /// A [`FrameBufferWriter`] instance protected by a spinlock.
11- pub struct LockedLogger (
12- Spinlock < FrameBufferWriter > ,
13- Spinlock < SerialPort > ,
14- LoggerStatus ,
15- LoggerStatus ,
16- ) ;
10+ /// A logger instance protected by a spinlock.
11+ pub struct LockedLogger {
12+ framebuffer : Option < Spinlock < FrameBufferWriter > > ,
13+ serial : Option < Spinlock < SerialPort > > ,
14+ }
1715
1816impl LockedLogger {
1917 /// Create a new instance that logs to the given framebuffer.
@@ -23,23 +21,33 @@ impl LockedLogger {
2321 frame_buffer_logger_status : LoggerStatus ,
2422 serial_logger_status : LoggerStatus ,
2523 ) -> Self {
26- LockedLogger (
27- Spinlock :: new ( FrameBufferWriter :: new ( framebuffer, info) ) ,
28- Spinlock :: new ( SerialPort :: new ( ) ) ,
29- frame_buffer_logger_status,
30- serial_logger_status,
31- )
24+ let framebuffer = match frame_buffer_logger_status {
25+ LoggerStatus :: Enable => Some ( Spinlock :: new ( FrameBufferWriter :: new ( framebuffer, info) ) ) ,
26+ LoggerStatus :: Disable => None ,
27+ } ;
28+
29+ let serial = match serial_logger_status {
30+ LoggerStatus :: Enable => Some ( Spinlock :: new ( SerialPort :: new ( ) ) ) ,
31+ LoggerStatus :: Disable => None ,
32+ } ;
33+
34+ LockedLogger {
35+ framebuffer,
36+ serial,
37+ }
3238 }
3339
3440 /// Force-unlocks the logger to prevent a deadlock.
3541 ///
3642 /// ## Safety
3743 /// This method is not memory safe and should be only used when absolutely necessary.
3844 pub unsafe fn force_unlock ( & self ) {
39- unsafe {
40- self . 0 . force_unlock ( ) ;
41- self . 1 . force_unlock ( ) ;
42- } ;
45+ if let Some ( framebuffer) = & self . framebuffer {
46+ unsafe { framebuffer. force_unlock ( ) } ;
47+ }
48+ if let Some ( serial) = & self . serial {
49+ unsafe { serial. force_unlock ( ) } ;
50+ }
4351 }
4452}
4553
@@ -49,12 +57,12 @@ impl log::Log for LockedLogger {
4957 }
5058
5159 fn log ( & self , record : & log:: Record ) {
52- if self . 2 == LoggerStatus :: Enable {
53- let mut logger = self . 0 . lock ( ) ;
54- writeln ! ( logger , "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
60+ if let Some ( framebuffer ) = & self . framebuffer {
61+ let mut framebuffer = framebuffer . lock ( ) ;
62+ writeln ! ( framebuffer , "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
5563 }
56- if self . 3 == LoggerStatus :: Enable {
57- let mut serial = self . 1 . lock ( ) ;
64+ if let Some ( serial ) = & self . serial {
65+ let mut serial = serial . lock ( ) ;
5866 writeln ! ( serial, "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
5967 }
6068 }
0 commit comments