Skip to content

Commit b22ebb6

Browse files
author
lucy
committed
---
yaml --- r: 98127 b: refs/heads/master c: 3b32ea8 h: refs/heads/master i: 98125: 5d59e2a 98123: 532c13e 98119: 1b21ad0 98111: 026a3f6 v: v3
1 parent efe1a94 commit b22ebb6

File tree

28 files changed

+322
-179
lines changed

28 files changed

+322
-179
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: a5ed0c58cb9f38af940403c34e283b68c89f5aa2
2+
refs/heads/master: 3b32ea8c93bc68e7f690dcbcb3e40230ae9c6e9f
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: b6400f998497c3958f40997a71756ead344a776d
55
refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36

trunk/Makefile.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ export CFG_PREFIX
418418
export CFG_LIBDIR
419419
export CFG_RUSTLIBDIR
420420
export CFG_LIBDIR_RELATIVE
421-
export CFG_DISABLE_INJECT_STD_VERSION
422421

423422
######################################################################
424423
# Subprograms

trunk/configure

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ opt clang 0 "prefer clang to gcc for building the runtime"
381381
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
382382
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
383383
opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
384-
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
385384
valopt prefix "/usr/local" "set installation prefix"
386385
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
387386
valopt llvm-root "" "set LLVM root"
@@ -1043,7 +1042,6 @@ putvar CFG_DISABLE_MANAGE_SUBMODULES
10431042
putvar CFG_ANDROID_CROSS_PATH
10441043
putvar CFG_MINGW32_CROSS_PATH
10451044
putvar CFG_MANDIR
1046-
putvar CFG_DISABLE_INJECT_STD_VERSION
10471045

10481046
# Avoid spurious warnings from clang by feeding it original source on
10491047
# ccache-miss rather than preprocessed input.

trunk/src/libextra/comm.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ Higher level communication abstractions.
1616

1717
#[allow(missing_doc)];
1818

19-
use std::comm;
20-
2119
/// An extension of `pipes::stream` that allows both sending and receiving.
2220
pub struct DuplexStream<T, U> {
2321
priv chan: Chan<T>,
@@ -42,7 +40,7 @@ impl<T:Send,U:Send> DuplexStream<T, U> {
4240
pub fn recv(&self) -> U {
4341
self.port.recv()
4442
}
45-
pub fn try_recv(&self) -> comm::TryRecvResult<U> {
43+
pub fn try_recv(&self) -> Option<U> {
4644
self.port.try_recv()
4745
}
4846
pub fn recv_opt(&self) -> Option<U> {
@@ -79,11 +77,11 @@ impl<T: Send> SyncPort<T> {
7977
})
8078
}
8179

82-
pub fn try_recv(&self) -> comm::TryRecvResult<T> {
83-
match self.duplex_stream.try_recv() {
84-
comm::Data(t) => { self.duplex_stream.try_send(()); comm::Data(t) }
85-
state => state,
86-
}
80+
pub fn try_recv(&self) -> Option<T> {
81+
self.duplex_stream.try_recv().map(|val| {
82+
self.duplex_stream.try_send(());
83+
val
84+
})
8785
}
8886
}
8987

trunk/src/libextra/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ Rust extras are part of the standard Rust distribution.
2020
2121
*/
2222

23-
// NOTE: upgrade to 0.10-pre after the next snapshot
24-
#[crate_id = "extra#0.9"];
23+
#[crate_id = "extra#0.10-pre"];
2524
#[comment = "Rust extras"];
2625
#[license = "MIT/ASL2"];
2726
#[crate_type = "rlib"];

trunk/src/libextra/sync.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020

2121
use std::borrow;
22-
use std::comm;
2322
use std::unstable::sync::Exclusive;
2423
use std::sync::arc::UnsafeArc;
2524
use std::sync::atomics;
@@ -50,7 +49,7 @@ impl WaitQueue {
5049
// Signals one live task from the queue.
5150
fn signal(&self) -> bool {
5251
match self.head.try_recv() {
53-
comm::Data(ch) => {
52+
Some(ch) => {
5453
// Send a wakeup signal. If the waiter was killed, its port will
5554
// have closed. Keep trying until we get a live task.
5655
if ch.try_send_deferred(()) {
@@ -59,20 +58,20 @@ impl WaitQueue {
5958
self.signal()
6059
}
6160
}
62-
_ => false
61+
None => false
6362
}
6463
}
6564

6665
fn broadcast(&self) -> uint {
6766
let mut count = 0;
6867
loop {
6968
match self.head.try_recv() {
70-
comm::Data(ch) => {
69+
None => break,
70+
Some(ch) => {
7171
if ch.try_send_deferred(()) {
7272
count += 1;
7373
}
7474
}
75-
_ => break
7675
}
7776
}
7877
count

trunk/src/libgreen/sched.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,6 @@ fn new_sched_rng() -> XorShiftRng {
958958

959959
#[cfg(test)]
960960
mod test {
961-
use std::comm;
962961
use std::task::TaskOpts;
963962
use std::rt::Runtime;
964963
use std::rt::task::Task;
@@ -1377,7 +1376,7 @@ mod test {
13771376
// This task should not be able to starve the sender;
13781377
// The sender should get stolen to another thread.
13791378
do spawn {
1380-
while port.try_recv() != comm::Data(()) { }
1379+
while port.try_recv().is_none() { }
13811380
}
13821381

13831382
chan.send(());
@@ -1394,7 +1393,7 @@ mod test {
13941393
// This task should not be able to starve the other task.
13951394
// The sends should eventually yield.
13961395
do spawn {
1397-
while port.try_recv() != comm::Data(()) {
1396+
while port.try_recv().is_none() {
13981397
chan2.send(());
13991398
}
14001399
}

trunk/src/libnative/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,30 @@ static OS_DEFAULT_STACK_ESTIMATE: uint = 1 << 20;
3939
#[cfg(unix, not(android))]
4040
static OS_DEFAULT_STACK_ESTIMATE: uint = 2 * (1 << 20);
4141

42+
43+
// XXX: this should not exist here
44+
#[cfg(stage0, nativestart)]
45+
#[lang = "start"]
46+
pub fn lang_start(main: *u8, argc: int, argv: **u8) -> int {
47+
use std::cast;
48+
use std::task;
49+
50+
do start(argc, argv) {
51+
// Instead of invoking main directly on this thread, invoke it on
52+
// another spawned thread that we are guaranteed to know the size of the
53+
// stack of. Currently, we do not have a method of figuring out the size
54+
// of the main thread's stack, so for stack overflow detection to work
55+
// we must spawn the task in a subtask which we know the stack size of.
56+
let main: extern "Rust" fn() = unsafe { cast::transmute(main) };
57+
let mut task = task::task();
58+
task.name("<main>");
59+
match do task.try { main() } {
60+
Ok(()) => { os::set_exit_status(0); }
61+
Err(..) => { os::set_exit_status(rt::DEFAULT_ERROR_CODE); }
62+
}
63+
}
64+
}
65+
4266
/// Executes the given procedure after initializing the runtime with the given
4367
/// argc/argv.
4468
///

trunk/src/librustc/driver/driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ pub fn optgroups() -> ~[getopts::groups::OptGroup] {
10111011
for details)", "FEATURE"),
10121012
optopt("", "android-cross-path",
10131013
"The path to the Android NDK", "PATH"),
1014-
optflagopt("W", "warn",
1014+
optmulti("W", "warn",
10151015
"Set lint warnings", "OPT"),
10161016
optmulti("A", "allow",
10171017
"Set lint allowed", "OPT"),

trunk/src/librustc/front/std_inject.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ use syntax::fold;
2121
use syntax::opt_vec;
2222
use syntax::util::small_vector::SmallVector;
2323

24-
// NOTE: upgrade to 0.10-pre after the next snapshot
25-
pub static VERSION: &'static str = "0.9";
26-
2724
pub fn maybe_inject_libstd_ref(sess: Session, crate: ast::Crate)
2825
-> ast::Crate {
2926
if use_std(&crate) {
@@ -56,21 +53,11 @@ struct StandardLibraryInjector {
5653
sess: Session,
5754
}
5855

59-
pub fn with_version(crate: &str) -> Option<(@str, ast::StrStyle)> {
60-
match option_env!("CFG_DISABLE_INJECT_STD_VERSION") {
61-
Some("1") => None,
62-
_ => {
63-
Some((format!("{}\\#{}", crate, VERSION).to_managed(),
64-
ast::CookedStr))
65-
}
66-
}
67-
}
68-
6956
impl fold::Folder for StandardLibraryInjector {
7057
fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
7158
let mut vis = ~[ast::ViewItem {
7259
node: ast::ViewItemExternMod(self.sess.ident_of("std"),
73-
with_version("std"),
60+
None,
7461
ast::DUMMY_NODE_ID),
7562
attrs: ~[],
7663
vis: ast::Private,
@@ -80,15 +67,15 @@ impl fold::Folder for StandardLibraryInjector {
8067
if use_uv(&crate) && !self.sess.building_library.get() {
8168
vis.push(ast::ViewItem {
8269
node: ast::ViewItemExternMod(self.sess.ident_of("green"),
83-
with_version("green"),
70+
None,
8471
ast::DUMMY_NODE_ID),
8572
attrs: ~[],
8673
vis: ast::Private,
8774
span: DUMMY_SP
8875
});
8976
vis.push(ast::ViewItem {
9077
node: ast::ViewItemExternMod(self.sess.ident_of("rustuv"),
91-
with_version("rustuv"),
78+
None,
9279
ast::DUMMY_NODE_ID),
9380
attrs: ~[],
9481
vis: ast::Private,

trunk/src/librustc/front/test.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
use driver::session;
1515
use front::config;
16-
use front::std_inject::with_version;
1716

1817
use std::cell::RefCell;
1918
use std::vec;
@@ -293,7 +292,7 @@ fn mk_std(cx: &TestCtxt) -> ast::ViewItem {
293292
ast::DUMMY_NODE_ID))])
294293
} else {
295294
ast::ViewItemExternMod(id_extra,
296-
with_version("extra"),
295+
None,
297296
ast::DUMMY_NODE_ID)
298297
};
299298
ast::ViewItem {

trunk/src/librustc/lib.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,9 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
227227
return;
228228
}
229229

230-
// Display the available lint options if "-W help" or only "-W" is given.
231230
let lint_flags = vec::append(matches.opt_strs("W"),
232231
matches.opt_strs("warn"));
233-
234-
let show_lint_options = lint_flags.iter().any(|x| x == &~"help") ||
235-
(matches.opt_present("W") && lint_flags.is_empty());
236-
237-
if show_lint_options {
232+
if lint_flags.iter().any(|x| x == &~"help") {
238233
describe_warnings();
239234
return;
240235
}

trunk/src/libstd/cleanup.rs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ use unstable::raw;
1717

1818
type DropGlue<'a> = 'a |**TyDesc, *c_void|;
1919

20-
static RC_IMMORTAL : uint = 0x77777777;
21-
2220
/*
2321
* Box annihilation
2422
*
@@ -27,21 +25,24 @@ static RC_IMMORTAL : uint = 0x77777777;
2725

2826
struct AnnihilateStats {
2927
n_total_boxes: uint,
28+
n_unique_boxes: uint,
3029
n_bytes_freed: uint
3130
}
3231

3332
unsafe fn each_live_alloc(read_next_before: bool,
34-
f: |alloc: *mut raw::Box<()>| -> bool)
33+
f: |alloc: *mut raw::Box<()>, uniq: bool| -> bool)
3534
-> bool {
3635
//! Walks the internal list of allocations
3736
37+
use managed;
3838
use rt::local_heap;
3939

4040
let mut alloc = local_heap::live_allocs();
4141
while alloc != ptr::mut_null() {
4242
let next_before = (*alloc).next;
43+
let uniq = (*alloc).ref_count == managed::RC_MANAGED_UNIQUE;
4344

44-
if !f(alloc) {
45+
if !f(alloc, uniq) {
4546
return false;
4647
}
4748

@@ -69,19 +70,25 @@ fn debug_mem() -> bool {
6970
pub unsafe fn annihilate() {
7071
use rt::local_heap::local_free;
7172
use mem;
73+
use managed;
7274

7375
let mut stats = AnnihilateStats {
7476
n_total_boxes: 0,
77+
n_unique_boxes: 0,
7578
n_bytes_freed: 0
7679
};
7780

7881
// Pass 1: Make all boxes immortal.
7982
//
8083
// In this pass, nothing gets freed, so it does not matter whether
8184
// we read the next field before or after the callback.
82-
each_live_alloc(true, |alloc| {
85+
each_live_alloc(true, |alloc, uniq| {
8386
stats.n_total_boxes += 1;
84-
(*alloc).ref_count = RC_IMMORTAL;
87+
if uniq {
88+
stats.n_unique_boxes += 1;
89+
} else {
90+
(*alloc).ref_count = managed::RC_IMMORTAL;
91+
}
8592
true
8693
});
8794

@@ -90,10 +97,12 @@ pub unsafe fn annihilate() {
9097
// In this pass, unique-managed boxes may get freed, but not
9198
// managed boxes, so we must read the `next` field *after* the
9299
// callback, as the original value may have been freed.
93-
each_live_alloc(false, |alloc| {
94-
let tydesc = (*alloc).type_desc;
95-
let data = &(*alloc).data as *();
96-
((*tydesc).drop_glue)(data as *i8);
100+
each_live_alloc(false, |alloc, uniq| {
101+
if !uniq {
102+
let tydesc = (*alloc).type_desc;
103+
let data = &(*alloc).data as *();
104+
((*tydesc).drop_glue)(data as *i8);
105+
}
97106
true
98107
});
99108

@@ -103,19 +112,22 @@ pub unsafe fn annihilate() {
103112
// unique-managed boxes, though I think that none of those are
104113
// left), so we must read the `next` field before, since it will
105114
// not be valid after.
106-
each_live_alloc(true, |alloc| {
107-
stats.n_bytes_freed +=
108-
(*((*alloc).type_desc)).size
109-
+ mem::size_of::<raw::Box<()>>();
110-
local_free(alloc as *i8);
115+
each_live_alloc(true, |alloc, uniq| {
116+
if !uniq {
117+
stats.n_bytes_freed +=
118+
(*((*alloc).type_desc)).size
119+
+ mem::size_of::<raw::Box<()>>();
120+
local_free(alloc as *i8);
121+
}
111122
true
112123
});
113124

114125
if debug_mem() {
115126
// We do logging here w/o allocation.
116127
debug!("annihilator stats:\n \
117128
total boxes: {}\n \
129+
unique boxes: {}\n \
118130
bytes freed: {}",
119-
stats.n_total_boxes, stats.n_bytes_freed);
131+
stats.n_total_boxes, stats.n_unique_boxes, stats.n_bytes_freed);
120132
}
121133
}

0 commit comments

Comments
 (0)