diff options
| author | bors <bors@rust-lang.org> | 2013-08-30 03:30:43 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-08-30 03:30:43 -0700 |
| commit | 72bf8956298107d36430bbfc4a18177e7b2097c6 (patch) | |
| tree | ffe5019eb5fb0badbc53893291b5973ef104435b /src/libstd/rt | |
| parent | f10e50a4beecbf6afa51870190458d34f216fe54 (diff) | |
| parent | 4fea236a85b61b52fc3e16348886ff32f5b8210b (diff) | |
| download | rust-72bf8956298107d36430bbfc4a18177e7b2097c6.tar.gz rust-72bf8956298107d36430bbfc4a18177e7b2097c6.zip | |
auto merge of #8854 : huonw/rust/rt-papercuts, r=brson
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.)
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/args.rs | 9 | ||||
| -rw-r--r-- | src/libstd/rt/local_ptr.rs | 19 | ||||
| -rw-r--r-- | src/libstd/rt/mod.rs | 18 | ||||
| -rw-r--r-- | src/libstd/rt/util.rs | 10 |
4 files changed, 25 insertions, 31 deletions
diff --git a/src/libstd/rt/args.rs b/src/libstd/rt/args.rs index baaf3d44e79..e5075f8818a 100644 --- a/src/libstd/rt/args.rs +++ b/src/libstd/rt/args.rs @@ -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 @@ mod imp { // 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)] diff --git a/src/libstd/rt/local_ptr.rs b/src/libstd/rt/local_ptr.rs index e843fd1adef..3f9b7fc83df 100644 --- a/src/libstd/rt/local_ptr.rs +++ b/src/libstd/rt/local_ptr.rs @@ -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) } } diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index 7728a388c65..14ff1fd5804 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -59,7 +59,7 @@ Several modules in `core` are clients of `rt`: 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::work_queue::WorkQueue; 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(); diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs index 9113f03ffee..6f39cbbade3 100644 --- a/src/libstd/rt/util.rs +++ b/src/libstd/rt/util.rs @@ -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 |
