diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-05-17 17:53:50 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-05-17 17:53:50 -0700 |
| commit | 03a8e59615f7ced4def8adaad41cfcb0fd0f9d29 (patch) | |
| tree | 560956d27a7945a464d8d8ec742be4ea5fbecb69 /src/libcore/logging.rs | |
| parent | 2d28d645422c1617be58c8ca7ad9a457264ca850 (diff) | |
| parent | 018dfaf9a6a25f5dba0ac642ff6c426c549bc4d7 (diff) | |
| download | rust-03a8e59615f7ced4def8adaad41cfcb0fd0f9d29.tar.gz rust-03a8e59615f7ced4def8adaad41cfcb0fd0f9d29.zip | |
Merge remote-tracking branch 'brson/io' into incoming
Diffstat (limited to 'src/libcore/logging.rs')
| -rw-r--r-- | src/libcore/logging.rs | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/src/libcore/logging.rs b/src/libcore/logging.rs index cea827298af..b192333999a 100644 --- a/src/libcore/logging.rs +++ b/src/libcore/logging.rs @@ -10,17 +10,16 @@ //! Logging -pub mod rustrt { - use libc; - - pub extern { - unsafe fn rust_log_console_on(); - unsafe fn rust_log_console_off(); - unsafe fn rust_log_str(level: u32, - string: *libc::c_char, - size: libc::size_t); - } -} +use option::*; +use either::*; +use rt; +use rt::logging::{Logger, StdErrLogger}; +use io; +use libc; +use repr; +use vec; +use cast; +use str; /// Turns on logging to stdout globally pub fn console_on() { @@ -55,8 +54,46 @@ pub fn log_type<T>(level: u32, object: &T) { let bytes = do io::with_bytes_writer |writer| { repr::write_repr(writer, object); }; + + match rt::context() { + rt::OldTaskContext => { + unsafe { + let len = bytes.len() as libc::size_t; + rustrt::rust_log_str(level, cast::transmute(vec::raw::to_ptr(bytes)), len); + } + } + _ => { + // XXX: Bad allocation + let msg = str::from_bytes(bytes); + newsched_log_str(msg); + } + } +} + +fn newsched_log_str(msg: ~str) { unsafe { - let len = bytes.len() as libc::size_t; - rustrt::rust_log_str(level, transmute(vec::raw::to_ptr(bytes)), len); + match rt::local_services::unsafe_try_borrow_local_services() { + Some(local) => { + // Use the available logger + (*local).logger.log(Left(msg)); + } + None => { + // There is no logger anywhere, just write to stderr + let mut logger = StdErrLogger; + logger.log(Left(msg)); + } + } + } +} + +pub mod rustrt { + use libc; + + pub extern { + unsafe fn rust_log_console_on(); + unsafe fn rust_log_console_off(); + unsafe fn rust_log_str(level: u32, + string: *libc::c_char, + size: libc::size_t); } } |
