Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skip printing the backtrace for RecvError/SendError #10329

Merged
merged 3 commits into from Apr 5, 2016
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Skip printing the backtrace for RecvError/SendError

We currently get tons of useless backtraces clogging up the output when we have a panic cascade. This adds a handler that outputs a single line when a thread panics due to a sender or receiver hanging up, since this is almost always due to a panic cascade.
  • Loading branch information
Manishearth committed Apr 1, 2016
commit ed3f7f5818156229b7af4e5b1c4834745ffa7342
@@ -9,6 +9,7 @@
#![cfg_attr(feature = "non-geckolib", feature(decode_utf16))]
#![feature(optin_builtin_traits)]
#![feature(plugin)]
#![feature(panic_handler)]
#![feature(reflect_marker)]
#![feature(step_by)]

@@ -5,16 +5,41 @@
use ipc_channel::ipc::IpcSender;
use serde::Serialize;
use std::borrow::ToOwned;
use std::io::{Write, stderr};
use std::panic::{PanicInfo, take_handler, set_handler};
use std::sync::mpsc::Sender;
use std::thread;
use std::thread::Builder;
use thread_state;

#[allow(unused_must_use)]

This comment has been minimized.

@jdm

jdm Apr 1, 2016

Member

Why this addition?

This comment has been minimized.

@Manishearth

Manishearth Apr 1, 2016

Author Member

I skip the result of write!. I don't want to panic within a panic handler, and if stderr is broken I don't see much point of trying to output an error either.

This comment has been minimized.

@eddyb

eddyb Apr 1, 2016

Contributor

let _ = ...;

This comment has been minimized.

@Manishearth

Manishearth Apr 1, 2016

Author Member

done

pub fn spawn_named<F>(name: String, f: F)
where F: FnOnce() + Send + 'static
{
let builder = thread::Builder::new().name(name);
builder.spawn(f).unwrap();

let f_with_handler = move || {
let hook = take_handler();

let new_handler = move |info: &PanicInfo| {
let payload = info.payload();
if let Some(s) = payload.downcast_ref::<String>() {
if s.contains("SendError") {

This comment has been minimized.

@Manishearth

Manishearth Apr 1, 2016

Author Member

We could perhaps improve this check with a better regex match.

write!(stderr(), "Thread \"{}\" panicked with an unwrap of `SendError` (backtrace skipped)\n",
thread::current().name().unwrap_or("<unknown thread>"));
return;
} else if s.contains("RecvError") {
write!(stderr(), "Thread \"{}\" panicked with an unwrap of `RecvError` (backtrace skipped)\n",
thread::current().name().unwrap_or("<unknown thread>"));
return;
}
}
hook(&info);
};
set_handler(new_handler);
f();
};

builder.spawn(f_with_handler).unwrap();
}

/// An abstraction over `Sender<T>` and `IpcSender<T>`, for use in
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.