Skip to content

Commit 8fdec5b

Browse files
committed
Try to avoid panicking during I/O in the signal and panic handlers.
1 parent 4edd159 commit 8fdec5b

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

ports/glutin/backtrace.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use std::fmt::{self, Write};
1313
use backtrace::{BytesOrWideString, PrintFmt};
1414

1515
#[inline(never)]
16-
pub(crate) fn print() {
17-
println!("{:?}", Print {
16+
pub(crate) fn print(w: &mut dyn std::io::Write) -> Result<(), std::io::Error> {
17+
write!(w, "{:?}", Print {
1818
print_fn_address: print as usize,
1919
})
2020
}

ports/glutin/main2.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use servo::config::opts::{self, ArgumentParsingResult};
2929
use servo::config::servo_version;
3030
use servo::servo_config::pref;
3131
use std::env;
32+
use std::io::Write;
3233
use std::panic;
3334
use std::process;
3435
use std::thread;
@@ -57,12 +58,14 @@ fn install_crash_handler() {
5758
use std::sync::atomic;
5859
static BEEN_HERE_BEFORE: atomic::AtomicBool = atomic::AtomicBool::new(false);
5960
if !BEEN_HERE_BEFORE.swap(true, atomic::Ordering::SeqCst) {
60-
print!("Stack trace");
61+
let stdout = std::io::stdout();
62+
let mut stdout = stdout.lock();
63+
let _ = write!(&mut stdout, "Stack trace");
6164
if let Some(name) = thread::current().name() {
62-
print!(" for thread \"{}\"", name);
65+
let _ = write!(&mut stdout, " for thread \"{}\"", name);
6366
}
64-
println!();
65-
backtrace::print();
67+
let _ = write!(&mut stdout, "\n");
68+
let _ = backtrace::print(&mut stdout);
6669
}
6770
unsafe {
6871
_exit(sig);
@@ -131,20 +134,24 @@ pub fn main() {
131134
};
132135
let current_thread = thread::current();
133136
let name = current_thread.name().unwrap_or("<unnamed>");
137+
let stdout = std::io::stdout();
138+
let mut stdout = stdout.lock();
134139
if let Some(location) = info.location() {
135-
println!(
140+
let _ = writeln!(
141+
&mut stdout,
136142
"{} (thread {}, at {}:{})",
137143
msg,
138144
name,
139145
location.file(),
140146
location.line()
141147
);
142148
} else {
143-
println!("{} (thread {})", msg, name);
149+
let _ = writeln!(&mut stdout, "{} (thread {})", msg, name);
144150
}
145151
if env::var("RUST_BACKTRACE").is_ok() {
146-
backtrace::print();
152+
let _ = backtrace::print(&mut stdout);
147153
}
154+
drop(stdout);
148155

149156
error!("{}", msg);
150157
}));

0 commit comments

Comments
 (0)