de7d143176
This commit fixes all of the fallout of the previous commit which is an attempt to refine privacy. There were a few unfortunate leaks which now must be plugged, and the most horrible one is the current `shouldnt_be_public` module now inside `std::rt`. I think that this either needs a slight reorganization of the runtime, or otherwise it needs to just wait for the external users of these modules to get replaced with their `rt` implementations. Other fixes involve making things pub which should be pub, and otherwise updating error messages that now reference privacy instead of referencing an "unresolved name" (yay!).
83 lines
2.1 KiB
Rust
83 lines
2.1 KiB
Rust
// Copyright 2012-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.
|
|
|
|
#[doc(hidden)];
|
|
|
|
use comm::{GenericChan, GenericPort};
|
|
use comm;
|
|
use prelude::*;
|
|
use task;
|
|
use libc::uintptr_t;
|
|
|
|
pub mod dynamic_lib;
|
|
|
|
pub mod finally;
|
|
pub mod intrinsics;
|
|
pub mod simd;
|
|
pub mod extfmt;
|
|
#[cfg(not(test))]
|
|
pub mod lang;
|
|
pub mod sync;
|
|
pub mod atomics;
|
|
pub mod raw;
|
|
|
|
/**
|
|
|
|
Start a new thread outside of the current runtime context and wait
|
|
for it to terminate.
|
|
|
|
The executing thread has no access to a task pointer and will be using
|
|
a normal large stack.
|
|
*/
|
|
pub fn run_in_bare_thread(f: ~fn()) {
|
|
use cell::Cell;
|
|
use rt::shouldnt_be_public::Thread;
|
|
|
|
let f_cell = Cell::new(f);
|
|
let (port, chan) = comm::stream();
|
|
// FIXME #4525: Unfortunate that this creates an extra scheduler but it's
|
|
// necessary since rust_raw_thread_join is blocking
|
|
do task::spawn_sched(task::SingleThreaded) {
|
|
Thread::start(f_cell.take()).join();
|
|
chan.send(());
|
|
}
|
|
port.recv();
|
|
}
|
|
|
|
#[test]
|
|
fn test_run_in_bare_thread() {
|
|
let i = 100;
|
|
do run_in_bare_thread {
|
|
assert_eq!(i, 100);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_run_in_bare_thread_exchange() {
|
|
// Does the exchange heap work without the runtime?
|
|
let i = ~100;
|
|
do run_in_bare_thread {
|
|
assert!(i == ~100);
|
|
}
|
|
}
|
|
|
|
/// 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
|
|
/// you notice weirdness in normal, un-doctored code paths!
|
|
pub fn running_on_valgrind() -> bool {
|
|
#[fixed_stack_segment]; #[inline(never)];
|
|
unsafe { rust_running_on_valgrind() != 0 }
|
|
}
|
|
|
|
extern {
|
|
fn rust_running_on_valgrind() -> uintptr_t;
|
|
}
|