]> git.lizzy.rs Git - rust.git/commitdiff
Stop logging task failure to task loggers
authorAlex Crichton <alex@alexcrichton.com>
Fri, 18 Oct 2013 01:51:32 +0000 (18:51 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 24 Oct 2013 21:21:57 +0000 (14:21 -0700)
The isn't an ideal patch, and the comment why is in the code. Basically uvio
uses task::unkillable which touches the kill flag for a task, and if the task is
failing due to mismangement of the kill flag, then there will be serious
problems when the task tries to print that it's failing.

src/libstd/rt/task.rs
src/libstd/rt/util.rs

index 16ae28743c523bf36caac207e0aa2eb72272aa6a..b3c65ce4749ded7d9e997fd493484eff9d172170 100644 (file)
@@ -546,7 +546,6 @@ pub fn begin_unwind(msg: *c_char, file: *c_char, line: size_t) -> ! {
     use rt::in_green_task_context;
     use rt::task::Task;
     use rt::local::Local;
-    use rt::logging::Logger;
     use str::Str;
     use c_str::CString;
     use unstable::intrinsics;
@@ -573,16 +572,19 @@ pub fn begin_unwind(msg: *c_char, file: *c_char, line: size_t) -> ! {
         // have been failing due to a lack of memory in the first place...
         let task: *mut Task = Local::unsafe_borrow();
         let n = (*task).name.as_ref().map(|n| n.as_slice()).unwrap_or("<unnamed>");
+
+        // XXX: this should no get forcibly printed to the console, this should
+        //      either be sent to the parent task (ideally), or get printed to
+        //      the task's logger. Right now the logger is actually a uvio
+        //      instance, which uses unkillable blocks internally for various
+        //      reasons. This will cause serious trouble if the task is failing
+        //      due to mismanagment of its own kill flag, so calling our own
+        //      logger in its current state is a bit of a problem.
         match file.as_str() {
             Some(file) => {
-                format_args!(|args| { (*task).logger.log(args) },
-                             "task '{}' failed at '{}', {}:{}",
-                             n, msg, file, line);
-            }
-            None => {
-                format_args!(|args| { (*task).logger.log(args) },
-                             "task '{}' failed at '{}'", n, msg);
+                rterrln!("task '{}' failed at '{}', {}:{}", n, msg, file, line);
             }
+            None => rterrln!("task '{}' failed at '{}'", n, msg),
         }
         if (*task).unwinder.unwinding {
             rtabort!("unwinding again");
index f15aa01db954dec8ddd9819408fca52617f026f5..e859f8e4fdb3517ea2f125dbe2c5a719ca978b6a 100644 (file)
@@ -72,8 +72,8 @@ pub fn default_sched_threads() -> uint {
 pub fn dumb_println(args: &fmt::Arguments) {
     use rt::io::native::stdio::stderr;
     use rt::io::{Writer, io_error, ResourceUnavailable};
-    let mut out = stderr();
 
+    let mut out = stderr();
     let mut again = true;
     do io_error::cond.trap(|e| {
         again = e.kind == ResourceUnavailable;