about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/os.rs15
-rw-r--r--src/libstd/rt/util.rs14
-rw-r--r--src/libstd/sync/future.rs28
3 files changed, 43 insertions, 14 deletions
diff --git a/src/libstd/os.rs b/src/libstd/os.rs
index 0747e7ccbe3..dfbf61cc890 100644
--- a/src/libstd/os.rs
+++ b/src/libstd/os.rs
@@ -57,6 +57,16 @@ use libc::c_char;
 #[cfg(windows)]
 use str::OwnedStr;
 
+/// Get the number of cores available
+pub fn num_cpus() -> uint {
+    unsafe {
+        return rust_get_num_cpus();
+    }
+
+    extern {
+        fn rust_get_num_cpus() -> libc::uintptr_t;
+    }
+}
 
 pub static TMPBUF_SZ : uint = 1000u;
 static BUF_BYTES : uint = 2048u;
@@ -1763,6 +1773,11 @@ mod tests {
     }
 
     #[test]
+    fn test_num_cpus() {
+        assert!(os::num_cpus() > 0);
+    }
+
+    #[test]
     fn test_setenv() {
         let n = make_rand_name();
         setenv(n.as_slice(), "VALUE");
diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs
index 670d4aa2061..fa30ddbcc48 100644
--- a/src/libstd/rt/util.rs
+++ b/src/libstd/rt/util.rs
@@ -11,23 +11,11 @@
 use from_str::FromStr;
 use from_str::from_str;
 use libc::uintptr_t;
-use libc;
 use option::{Some, None, Option};
 use os;
 use str::Str;
 use sync::atomics;
 
-/// Get the number of cores available
-pub fn num_cpus() -> uint {
-    unsafe {
-        return rust_get_num_cpus();
-    }
-
-    extern {
-        fn rust_get_num_cpus() -> libc::uintptr_t;
-    }
-}
-
 /// Dynamically inquire about whether we're running under V.
 /// You should usually not use this unless your test definitely
 /// can't run correctly un-altered. Valgrind is there to help
@@ -81,7 +69,7 @@ pub fn default_sched_threads() -> uint {
             if limit_thread_creation_due_to_osx_and_valgrind() {
                 1
             } else {
-                num_cpus()
+                os::num_cpus()
             }
         }
     }
diff --git a/src/libstd/sync/future.rs b/src/libstd/sync/future.rs
index bc748324fcd..ccc67e3f8b0 100644
--- a/src/libstd/sync/future.rs
+++ b/src/libstd/sync/future.rs
@@ -132,7 +132,8 @@ impl<A:Send> Future<A> {
         let (tx, rx) = channel();
 
         spawn(proc() {
-            tx.send(blk());
+            // Don't fail if the other end has hung up
+            let _ = tx.send_opt(blk());
         });
 
         Future::from_receiver(rx)
@@ -144,6 +145,7 @@ mod test {
     use prelude::*;
     use sync::Future;
     use task;
+    use comm::{channel, Sender};
 
     #[test]
     fn test_from_value() {
@@ -206,4 +208,28 @@ mod test {
             assert_eq!(actual, expected);
         });
     }
+
+    #[test]
+    fn test_dropped_future_doesnt_fail() {
+        struct Bomb(Sender<bool>);
+
+        local_data_key!(LOCAL: Bomb)
+
+        impl Drop for Bomb {
+            fn drop(&mut self) {
+                let Bomb(ref tx) = *self;
+                tx.send(task::failing());
+            }
+        }
+
+        // Spawn a future, but drop it immediately. When we receive the result
+        // later on, we should never view the task as having failed.
+        let (tx, rx) = channel();
+        drop(Future::spawn(proc() {
+            LOCAL.replace(Some(Bomb(tx)));
+        }));
+
+        // Make sure the future didn't fail the task.
+        assert!(!rx.recv());
+    }
 }