diff options
| author | Ben Blum <bblum@andrew.cmu.edu> | 2013-07-30 19:20:59 -0400 |
|---|---|---|
| committer | Ben Blum <bblum@andrew.cmu.edu> | 2013-07-31 14:37:22 -0400 |
| commit | 2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf (patch) | |
| tree | 0d1425329ceab3ed0e4062355955de3060e685fb /src/libstd/sys.rs | |
| parent | 389aba09523f805e3b493a5089c6397749b06b67 (diff) | |
| download | rust-2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf.tar.gz rust-2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf.zip | |
Give tasks useful names. #2891
Diffstat (limited to 'src/libstd/sys.rs')
| -rw-r--r-- | src/libstd/sys.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libstd/sys.rs b/src/libstd/sys.rs index 5cf77d901db..4ca5d82265f 100644 --- a/src/libstd/sys.rs +++ b/src/libstd/sys.rs @@ -137,12 +137,13 @@ impl FailWithCause for &'static str { // FIXME #4427: Temporary until rt::rt_fail_ goes away pub fn begin_unwind_(msg: *c_char, file: *c_char, line: size_t) -> ! { - use cell::Cell; use either::Left; + use option::{Some, None}; use rt::{context, OldTaskContext, TaskContext}; use rt::task::Task; use rt::local::Local; use rt::logging::Logger; + use str::Str; let context = context(); match context { @@ -159,20 +160,26 @@ pub fn begin_unwind_(msg: *c_char, file: *c_char, line: size_t) -> ! { let msg = str::raw::from_c_str(msg); let file = str::raw::from_c_str(file); - let outmsg = fmt!("task failed at '%s', %s:%i", - msg, file, line as int); - // XXX: Logging doesn't work correctly in non-task context because it // invokes the local heap if context == TaskContext { // XXX: Logging doesn't work here - the check to call the log // function never passes - so calling the log function directly. - let outmsg = Cell::new(outmsg); do Local::borrow::<Task, ()> |task| { - task.logger.log(Left(outmsg.take())); + let msg = match task.name { + Some(ref name) => + fmt!("task '%s' failed at '%s', %s:%i", + name.as_slice(), msg, file, line as int), + None => + fmt!("task <unnamed> failed at '%s', %s:%i", + msg, file, line as int) + }; + + task.logger.log(Left(msg)); } } else { - rterrln!("%s", outmsg); + rterrln!("failed in non-task context at '%s', %s:%i", + msg, file, line as int); } gc::cleanup_stack_for_failure(); |
