diff options
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/os.rs | 15 | ||||
| -rw-r--r-- | src/libstd/rt/util.rs | 14 | ||||
| -rw-r--r-- | src/libstd/sync/future.rs | 28 |
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()); + } } |
