diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-12-12 17:32:35 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-12-24 14:42:00 -0800 |
| commit | dd19785f963fd1045e53447add17ab36ca41fc79 (patch) | |
| tree | 89018b18de5b1b9afde15db1e61e25fc73770d1c /src/libstd/rt/util.rs | |
| parent | 4538369566b8b51fc8371253aa90f9725547a193 (diff) | |
| download | rust-dd19785f963fd1045e53447add17ab36ca41fc79.tar.gz rust-dd19785f963fd1045e53447add17ab36ca41fc79.zip | |
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).
Diffstat (limited to 'src/libstd/rt/util.rs')
| -rw-r--r-- | src/libstd/rt/util.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs index 93721986f3c..2f3e5be39e6 100644 --- a/src/libstd/rt/util.rs +++ b/src/libstd/rt/util.rs @@ -68,11 +68,22 @@ pub fn default_sched_threads() -> uint { } pub fn dumb_println(args: &fmt::Arguments) { - use io::native::file::FileDesc; use io; use libc; - let mut out = FileDesc::new(libc::STDERR_FILENO, false); - fmt::writeln(&mut out as &mut io::Writer, args); + use vec; + + struct Stderr; + impl io::Writer for Stderr { + fn write(&mut self, data: &[u8]) { + unsafe { + libc::write(libc::STDERR_FILENO, + vec::raw::to_ptr(data) as *libc::c_void, + data.len() as libc::size_t); + } + } + } + let mut w = Stderr; + fmt::writeln(&mut w as &mut io::Writer, args); } pub fn abort(msg: &str) -> ! { |
