about summary refs log tree commit diff
path: root/src/libstd/sys.rs
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2013-07-30 19:20:59 -0400
committerBen Blum <bblum@andrew.cmu.edu>2013-07-31 14:37:22 -0400
commit2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf (patch)
tree0d1425329ceab3ed0e4062355955de3060e685fb /src/libstd/sys.rs
parent389aba09523f805e3b493a5089c6397749b06b67 (diff)
downloadrust-2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf.tar.gz
rust-2e6dc161b6efac1ce2709ab4e1c05c55c01e3abf.zip
Give tasks useful names. #2891
Diffstat (limited to 'src/libstd/sys.rs')
-rw-r--r--src/libstd/sys.rs21
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();