about summary refs log tree commit diff
path: root/src/libcore/logging.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-05-17 17:53:50 -0700
committerBrian Anderson <banderson@mozilla.com>2013-05-17 17:53:50 -0700
commit03a8e59615f7ced4def8adaad41cfcb0fd0f9d29 (patch)
tree560956d27a7945a464d8d8ec742be4ea5fbecb69 /src/libcore/logging.rs
parent2d28d645422c1617be58c8ca7ad9a457264ca850 (diff)
parent018dfaf9a6a25f5dba0ac642ff6c426c549bc4d7 (diff)
downloadrust-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.rs63
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);
     }
 }