Skip to content

Commit e9a60e0

Browse files
authored
Refactor/simplify logger a bit (#888)
* logger: replace Vec<String> buffer with a BufWriter * Don't alloc formatted message * `should_display`
1 parent b3cc9ed commit e9a60e0

File tree

2 files changed

+59
-30
lines changed

2 files changed

+59
-30
lines changed

Cargo.lock

Lines changed: 22 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/utils/logger.rs

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
fmt,
23
sync::{mpsc, Arc, Barrier, OnceLock},
34
thread,
45
};
@@ -116,30 +117,49 @@ struct PrintMessage {
116117
}
117118

118119
impl PrintMessage {
119-
fn to_formatted_message(&self) -> Option<String> {
120-
if !is_running_in_accessible_mode() && !should_display_log(&self.level) {
121-
return None;
120+
fn should_display(&self) -> bool {
121+
if self.level == MessageLevel::Quiet {
122+
return false;
122123
}
123124

125+
if !should_display_log(&self.level) && !is_running_in_accessible_mode() {
126+
return false;
127+
}
128+
129+
if self.level == MessageLevel::Info {
130+
return !is_running_in_accessible_mode() || self.accessible;
131+
}
132+
133+
true
134+
}
135+
}
136+
137+
impl fmt::Display for PrintMessage {
138+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
139+
debug_assert!(
140+
self.should_display(),
141+
"Display called on message that shouldn't be displayed"
142+
);
143+
124144
match self.level {
125145
MessageLevel::Info => {
126146
if !is_running_in_accessible_mode() {
127-
Some(format!("{}[INFO]{} {}", *GREEN, *RESET, self.contents))
147+
write!(f, "{}[INFO]{} {}", *GREEN, *RESET, self.contents)?;
128148
} else if self.accessible {
129-
Some(format!("{}Info:{} {}", *GREEN, *RESET, self.contents))
130-
} else {
131-
None
149+
write!(f, "{}Info:{} {}", *GREEN, *RESET, self.contents)?;
132150
}
133151
}
134152
MessageLevel::Warning => {
135153
if is_running_in_accessible_mode() {
136-
Some(format!("{}Warning:{} {}", *ORANGE, *RESET, self.contents))
154+
write!(f, "{}Warning:{} {}", *ORANGE, *RESET, self.contents)?;
137155
} else {
138-
Some(format!("{}[WARNING]{} {}", *ORANGE, *RESET, self.contents))
156+
write!(f, "{}[WARNING]{} {}", *ORANGE, *RESET, self.contents)?;
139157
}
140158
}
141-
MessageLevel::Quiet => None,
159+
MessageLevel::Quiet => {}
142160
}
161+
162+
Ok(())
143163
}
144164
}
145165

@@ -152,6 +172,7 @@ enum MessageLevel {
152172

153173
mod logger_thread {
154174
use std::{
175+
io::{self, Write},
155176
sync::{mpsc::RecvTimeoutError, Arc, Barrier},
156177
time::Duration,
157178
};
@@ -224,13 +245,13 @@ mod logger_thread {
224245
fn run_logger(log_receiver: LogReceiver) {
225246
const FLUSH_TIMEOUT: Duration = Duration::from_millis(200);
226247

227-
let mut buffer = Vec::<String>::with_capacity(16);
248+
let mut writer = io::BufWriter::new(io::stderr());
228249

229250
loop {
230251
let msg = match log_receiver.recv_timeout(FLUSH_TIMEOUT) {
231252
Ok(msg) => msg,
232253
Err(RecvTimeoutError::Timeout) => {
233-
flush_logs_to_stderr(&mut buffer);
254+
writer.flush().unwrap();
234255
continue;
235256
}
236257
Err(RecvTimeoutError::Disconnected) => unreachable!("sender is static"),
@@ -239,32 +260,20 @@ mod logger_thread {
239260
match msg {
240261
LoggerCommand::Print(msg) => {
241262
// Append message to buffer
242-
if let Some(msg) = msg.to_formatted_message() {
243-
buffer.push(msg);
244-
}
245-
246-
if buffer.len() == buffer.capacity() {
247-
flush_logs_to_stderr(&mut buffer);
263+
if msg.should_display() {
264+
writeln!(writer, "{msg}").unwrap();
248265
}
249266
}
250267
LoggerCommand::Flush { finished_barrier } => {
251-
flush_logs_to_stderr(&mut buffer);
268+
writer.flush().unwrap();
252269
finished_barrier.wait();
253270
}
254271
LoggerCommand::FlushAndShutdown { finished_barrier } => {
255-
flush_logs_to_stderr(&mut buffer);
272+
writer.flush().unwrap();
256273
finished_barrier.wait();
257274
return;
258275
}
259276
}
260277
}
261278
}
262-
263-
fn flush_logs_to_stderr(buffer: &mut Vec<String>) {
264-
if !buffer.is_empty() {
265-
let text = buffer.join("\n");
266-
eprintln!("{text}");
267-
buffer.clear();
268-
}
269-
}
270279
}

0 commit comments

Comments
 (0)