@@ -24,7 +24,8 @@ thread_local! {
24
24
}
25
25
}
26
26
27
- pub fn on_panic ( obj : & ( Any +Send ) , file : & ' static str , line : u32 ) {
27
+ fn log_panic ( obj : & ( Any +Send ) , file : & ' static str , line : u32 ,
28
+ log_backtrace : bool ) {
28
29
let msg = match obj. downcast_ref :: < & ' static str > ( ) {
29
30
Some ( s) => * s,
30
31
None => match obj. downcast_ref :: < String > ( ) {
@@ -35,37 +36,33 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
35
36
let mut err = Stderr :: new ( ) . ok ( ) ;
36
37
let thread = thread_info:: current_thread ( ) ;
37
38
let name = thread. as_ref ( ) . and_then ( |t| t. name ( ) ) . unwrap_or ( "<unnamed>" ) ;
39
+
40
+ let write = |err : & mut :: io:: Write | {
41
+ let _ = writeln ! ( err, "thread '{}' panicked at '{}', {}:{}" ,
42
+ name, msg, file, line) ;
43
+ if log_backtrace {
44
+ let _ = backtrace:: write ( err) ;
45
+ }
46
+ } ;
47
+
38
48
let prev = LOCAL_STDERR . with ( |s| s. borrow_mut ( ) . take ( ) ) ;
39
49
match ( prev, err. as_mut ( ) ) {
40
50
( Some ( mut stderr) , _) => {
41
51
// FIXME: what to do when the thread printing panics?
42
- let _ = writeln ! ( stderr,
43
- "thread '{}' panicked at '{}', {}:{}\n " ,
44
- name, msg, file, line) ;
45
- if backtrace:: log_enabled ( ) {
46
- let _ = backtrace:: write ( & mut * stderr) ;
47
- }
52
+ write ( & mut * stderr) ;
48
53
let mut s = Some ( stderr) ;
49
54
LOCAL_STDERR . with ( |slot| {
50
55
* slot. borrow_mut ( ) = s. take ( ) ;
51
56
} ) ;
52
57
}
53
- ( None , Some ( ref mut err) ) => {
54
- let _ = writeln ! ( err, "thread '{}' panicked at '{}', {}:{}" ,
55
- name, msg, file, line) ;
56
- if backtrace:: log_enabled ( ) {
57
- let _ = backtrace:: write ( err) ;
58
- }
59
- }
58
+ ( None , Some ( ref mut err) ) => { write ( err) }
60
59
_ => { }
61
60
}
61
+ }
62
62
63
- // If this is a double panic, make sure that we printed a backtrace
64
- // for this panic.
65
- match err {
66
- Some ( ref mut err) if unwind:: panicking ( ) && !backtrace:: log_enabled ( ) => {
67
- let _ = backtrace:: write ( err) ;
68
- }
69
- _ => { }
70
- }
63
+ pub fn on_panic ( obj : & ( Any +Send ) , file : & ' static str , line : u32 ) {
64
+ // If this is a double panic, make sure that we print a backtrace
65
+ // for this panic. Otherwise only print it if logging is enabled.
66
+ let log_backtrace = unwind:: panicking ( ) || backtrace:: log_enabled ( ) ;
67
+ log_panic ( obj, file, line, log_backtrace) ;
71
68
}
0 commit comments