]> git.lizzy.rs Git - rust.git/commitdiff
auto merge of #8854 : huonw/rust/rt-papercuts, r=brson
authorbors <bors@rust-lang.org>
Fri, 30 Aug 2013 10:30:43 +0000 (03:30 -0700)
committerbors <bors@rust-lang.org>
Fri, 30 Aug 2013 10:30:43 +0000 (03:30 -0700)
The only user-facing change is handling non-integer (and zero) `RUST_THREADS` more nicely:

```
$ RUST_THREADS=x rustc # old

You've met with a terrible fate, haven't you?

fatal runtime error: runtime tls key not initialized
Aborted
$ RUST_THREADS=x ./x86_64-unknown-linux-gnu/stage2/bin/rustc # new

You've met with a terrible fate, haven't you?

fatal runtime error: `RUST_THREADS` is `x`, should be a positive integer
Aborted
```

The other changes are converting some `for .. in range(x,y)` to `vec::from_fn` or `for .. in x.iter()` as appropriate; and removing a chain of (seemingly) unnecessary pointer casts.

(Also, fixes a typo in `extra::test` from #8823.)

src/libextra/test.rs
src/libstd/rt/args.rs
src/libstd/rt/local_ptr.rs
src/libstd/rt/mod.rs
src/libstd/rt/util.rs
src/test/run-fail/test-tasks-invalid-value.rs [new file with mode: 0644]
src/test/run-fail/test-threads-invalid-value.rs [deleted file]

index 82b62c7dfc0c752daad1d08ee2cea267e2bf0e47..73f6d2e1bda8be85e217c8082f1bdbad9c64c2b5 100644 (file)
@@ -745,7 +745,7 @@ fn get_concurrency() -> uint {
             let opt_n: Option<uint> = FromStr::from_str(s);
             match opt_n {
                 Some(n) if n > 0 => n,
-                _ => fail!("RUST_TEST_TASKS is `%s`, should be a non-negative integer.", s)
+                _ => fail!("RUST_TEST_TASKS is `%s`, should be a positive integer.", s)
             }
         }
         None => {
index baaf3d44e79d3b22231985f60255dd6ec6d5afdd..e5075f8818a0b38f7d525c06e6205186743027d8 100644 (file)
@@ -55,10 +55,11 @@ pub fn clone() -> Option<~[~str]> {
 mod imp {
     use libc;
     use option::{Option, Some, None};
-    use iterator::{Iterator, range};
+    use iterator::Iterator;
     use str;
     use unstable::finally::Finally;
     use util;
+    use vec;
 
     pub unsafe fn init(argc: int, argv: **u8) {
         let args = load_argc_and_argv(argc, argv);
@@ -111,11 +112,9 @@ fn get_global_ptr() -> *mut Option<~~[~str]> {
 
     // Copied from `os`.
     unsafe fn load_argc_and_argv(argc: int, argv: **u8) -> ~[~str] {
-        let mut args = ~[];
-        for i in range(0u, argc as uint) {
-            args.push(str::raw::from_c_str(*(argv as **libc::c_char).offset(i as int)));
+        do vec::from_fn(argc as uint) |i| {
+            str::raw::from_c_str(*(argv as **libc::c_char).offset(i as int))
         }
-        args
     }
 
     #[cfg(stage0)]
index e843fd1adef07aa6e258ac16cc52c628b1b374f7..3f9b7fc83df9822b618ff658f97db38f4cad4999 100644 (file)
@@ -121,27 +121,20 @@ pub unsafe fn borrow<T>(f: &fn(&mut T)) {
 /// For the Scheduler pointer to be aliased
 pub unsafe fn unsafe_borrow<T>() -> *mut T {
     let key = tls_key();
-    let mut void_ptr: *mut c_void = tls::get(key);
+    let void_ptr = tls::get(key);
     if void_ptr.is_null() {
         rtabort!("thread-local pointer is null. bogus!");
     }
-    let ptr: *mut *mut c_void = &mut void_ptr;
-    let ptr: *mut ~T = ptr as *mut ~T;
-    let ptr: *mut T = &mut **ptr;
-    return ptr;
+    void_ptr as *mut T
 }
 
 pub unsafe fn try_unsafe_borrow<T>() -> Option<*mut T> {
     let key = tls_key();
-    let mut void_ptr: *mut c_void = tls::get(key);
+    let void_ptr = tls::get(key);
     if void_ptr.is_null() {
-        return None;
-    }
-    {
-        let ptr: *mut *mut c_void = &mut void_ptr;
-        let ptr: *mut ~T = ptr as *mut ~T;
-        let ptr: *mut T = &mut **ptr;
-        return Some(ptr);
+        None
+    } else {
+        Some(void_ptr as *mut T)
     }
 }
 
index 7728a388c658a689c023f7b583acb00093684ee0..14ff1fd58044f56b3b7717e556ddbbe056a4abbd 100644 (file)
@@ -59,7 +59,7 @@
 use cell::Cell;
 use clone::Clone;
 use container::Container;
-use iterator::{Iterator, range};
+use iterator::Iterator;
 use option::{Option, None, Some};
 use ptr::RawPtr;
 use rt::local::Local;
@@ -71,7 +71,8 @@
 use rt::uv::uvio::UvEventLoop;
 use unstable::atomics::{AtomicInt, SeqCst};
 use unstable::sync::UnsafeArc;
-use vec::{OwnedVector, MutableVector};
+use vec;
+use vec::{OwnedVector, MutableVector, ImmutableVector};
 
 /// The global (exchange) heap.
 pub mod global_heap;
@@ -251,11 +252,7 @@ fn run_(main: ~fn(), use_main_sched: bool) -> int {
 
     // Create a work queue for each scheduler, ntimes. Create an extra
     // for the main thread if that flag is set. We won't steal from it.
-    let mut work_queues = ~[];
-    for _ in range(0u, nscheds) {
-        let work_queue: WorkQueue<~Task> = WorkQueue::new();
-        work_queues.push(work_queue);
-    }
+    let work_queues: ~[WorkQueue<~Task>] = vec::from_fn(nscheds, |_| WorkQueue::new());
 
     // The schedulers.
     let mut scheds = ~[];
@@ -263,13 +260,13 @@ fn run_(main: ~fn(), use_main_sched: bool) -> int {
     // sent the Shutdown message to terminate the schedulers.
     let mut handles = ~[];
 
-    for i in range(0u, nscheds) {
+    for work_queue in work_queues.iter() {
         rtdebug!("inserting a regular scheduler");
 
         // Every scheduler is driven by an I/O event loop.
         let loop_ = ~UvEventLoop::new();
         let mut sched = ~Scheduler::new(loop_,
-                                        work_queues[i].clone(),
+                                        work_queue.clone(),
                                         work_queues.clone(),
                                         sleepers.clone());
         let handle = sched.make_handle();
@@ -358,9 +355,8 @@ fn run_(main: ~fn(), use_main_sched: bool) -> int {
     }
 
     // Run each remaining scheduler in a thread.
-    while !scheds.is_empty() {
+    for sched in scheds.move_rev_iter() {
         rtdebug!("creating regular schedulers");
-        let sched = scheds.pop();
         let sched_cell = Cell::new(sched);
         let thread = do Thread::start {
             let mut sched = sched_cell.take();
index 9113f03ffee1cd9402574ea4db971ffbd30be56c..6f39cbbade3d47265aa7e4201bf7c32860b5012c 100644 (file)
@@ -11,7 +11,7 @@
 use container::Container;
 use from_str::FromStr;
 use libc;
-use option::{Some, None};
+use option::{Some, None, Option};
 use os;
 use str::StrSlice;
 use unstable::atomics::{AtomicInt, INIT_ATOMIC_INT, SeqCst};
@@ -57,7 +57,13 @@ pub fn limit_thread_creation_due_to_osx_and_valgrind() -> bool {
 /// either `RUST_THREADS` or `num_cpus`.
 pub fn default_sched_threads() -> uint {
     match os::getenv("RUST_THREADS") {
-        Some(nstr) => FromStr::from_str(nstr).unwrap(),
+        Some(nstr) => {
+            let opt_n: Option<uint> = FromStr::from_str(nstr);
+            match opt_n {
+                Some(n) if n > 0 => n,
+                _ => rtabort!("`RUST_THREADS` is `%s`, should be a positive integer", nstr)
+            }
+        }
         None => {
             if limit_thread_creation_due_to_osx_and_valgrind() {
                 1
diff --git a/src/test/run-fail/test-tasks-invalid-value.rs b/src/test/run-fail/test-tasks-invalid-value.rs
new file mode 100644 (file)
index 0000000..74531de
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// This checks that RUST_TEST_TASKS not being 1, 2, ... is detected
+// properly.
+
+// error-pattern:should be a positive integer
+// compile-flags: --test
+// exec-env:RUST_TEST_TASKS=foo
+
+#[test]
+fn do_nothing() {}
diff --git a/src/test/run-fail/test-threads-invalid-value.rs b/src/test/run-fail/test-threads-invalid-value.rs
deleted file mode 100644 (file)
index 0050d24..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// This checks that RUST_TEST_TASKS not being 1, 2, ... is detected
-// properly.
-
-// error-pattern:should be a non-negative integer
-// compile-flags: --test
-// exec-env:RUST_TEST_TASKS=foo
-
-#[test]
-fn do_nothing() {}