Stop logging task failure to task loggers

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.
This commit is contained in:
Alex Crichton 2013-10-17 18:51:32 -07:00
parent 61ed2cfb55
commit e117aa0e2a
2 changed files with 11 additions and 9 deletions

View 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");

View 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;