@@ -7,13 +7,11 @@ use spinning_top::Spinlock;
7
7
/// The global logger instance used for the `log` crate.
8
8
pub static LOGGER : OnceCell < LockedLogger > = OnceCell :: uninit ( ) ;
9
9
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
+ }
17
15
18
16
impl LockedLogger {
19
17
/// Create a new instance that logs to the given framebuffer.
@@ -23,23 +21,33 @@ impl LockedLogger {
23
21
frame_buffer_logger_status : LoggerStatus ,
24
22
serial_logger_status : LoggerStatus ,
25
23
) -> 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
+ }
32
38
}
33
39
34
40
/// Force-unlocks the logger to prevent a deadlock.
35
41
///
36
42
/// ## Safety
37
43
/// This method is not memory safe and should be only used when absolutely necessary.
38
44
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
+ }
43
51
}
44
52
}
45
53
@@ -49,12 +57,12 @@ impl log::Log for LockedLogger {
49
57
}
50
58
51
59
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 ( ) ;
55
63
}
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 ( ) ;
58
66
writeln ! ( serial, "{:5}: {}" , record. level( ) , record. args( ) ) . unwrap ( ) ;
59
67
}
60
68
}
0 commit comments