Skip to content

Commit dd19785

Browse files
committed
std: Handle prints with literally no context
Printing is an incredibly useful debugging utility, and it's not much help if your debugging prints just trigger an obscure abort when you need them most. In order to handle this case, forcibly fall back to a libc::write implementation of printing whenever a local task is not available. Note that this is *not* a 1:1 fallback. All 1:1 rust tasks will still have a local Task that it can go through (and stdio will be created through the local IO factory), this is only a fallback for "no context" rust code (such as that setting up the context).
1 parent 4538369 commit dd19785

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/libstd/io/stdio.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,17 @@ fn with_task_stdout(f: |&mut Writer|) {
132132
}
133133

134134
None => {
135-
let mut io = stdout();
135+
struct Stdout;
136+
impl Writer for Stdout {
137+
fn write(&mut self, data: &[u8]) {
138+
unsafe {
139+
libc::write(libc::STDOUT_FILENO,
140+
vec::raw::to_ptr(data) as *libc::c_void,
141+
data.len() as libc::size_t);
142+
}
143+
}
144+
}
145+
let mut io = Stdout;
136146
f(&mut io as &mut Writer);
137147
}
138148
}

src/libstd/rt/util.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,22 @@ pub fn default_sched_threads() -> uint {
6868
}
6969

7070
pub fn dumb_println(args: &fmt::Arguments) {
71-
use io::native::file::FileDesc;
7271
use io;
7372
use libc;
74-
let mut out = FileDesc::new(libc::STDERR_FILENO, false);
75-
fmt::writeln(&mut out as &mut io::Writer, args);
73+
use vec;
74+
75+
struct Stderr;
76+
impl io::Writer for Stderr {
77+
fn write(&mut self, data: &[u8]) {
78+
unsafe {
79+
libc::write(libc::STDERR_FILENO,
80+
vec::raw::to_ptr(data) as *libc::c_void,
81+
data.len() as libc::size_t);
82+
}
83+
}
84+
}
85+
let mut w = Stderr;
86+
fmt::writeln(&mut w as &mut io::Writer, args);
7687
}
7788

7889
pub fn abort(msg: &str) -> ! {

0 commit comments

Comments
 (0)