Skip to content

Commit 6cce34e

Browse files
committed
---
yaml --- r: 98128 b: refs/heads/master c: bf2ab22 h: refs/heads/master v: v3
1 parent b22ebb6 commit 6cce34e

File tree

26 files changed

+172
-320
lines changed

26 files changed

+172
-320
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: 3b32ea8c93bc68e7f690dcbcb3e40230ae9c6e9f
2+
refs/heads/master: bf2ab22cd0eda8e019cb243916e6c127708739cf
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: b6400f998497c3958f40997a71756ead344a776d
55
refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36

trunk/Makefile.in

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

422423
######################################################################
423424
# Subprograms

trunk/configure

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ 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"
384385
valopt prefix "/usr/local" "set installation prefix"
385386
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
386387
valopt llvm-root "" "set LLVM root"
@@ -1042,6 +1043,7 @@ putvar CFG_DISABLE_MANAGE_SUBMODULES
10421043
putvar CFG_ANDROID_CROSS_PATH
10431044
putvar CFG_MINGW32_CROSS_PATH
10441045
putvar CFG_MANDIR
1046+
putvar CFG_DISABLE_INJECT_STD_VERSION
10451047

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

trunk/src/libextra/comm.rs

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

1717
#[allow(missing_doc)];
1818

19+
use std::comm;
20+
1921
/// An extension of `pipes::stream` that allows both sending and receiving.
2022
pub struct DuplexStream<T, U> {
2123
priv chan: Chan<T>,
@@ -40,7 +42,7 @@ impl<T:Send,U:Send> DuplexStream<T, U> {
4042
pub fn recv(&self) -> U {
4143
self.port.recv()
4244
}
43-
pub fn try_recv(&self) -> Option<U> {
45+
pub fn try_recv(&self) -> comm::TryRecvResult<U> {
4446
self.port.try_recv()
4547
}
4648
pub fn recv_opt(&self) -> Option<U> {
@@ -77,11 +79,11 @@ impl<T: Send> SyncPort<T> {
7779
})
7880
}
7981

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-
})
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+
}
8587
}
8688
}
8789

trunk/src/libextra/lib.rs

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

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

trunk/src/libextra/sync.rs

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

2020

2121
use std::borrow;
22+
use std::comm;
2223
use std::unstable::sync::Exclusive;
2324
use std::sync::arc::UnsafeArc;
2425
use std::sync::atomics;
@@ -49,7 +50,7 @@ impl WaitQueue {
4950
// Signals one live task from the queue.
5051
fn signal(&self) -> bool {
5152
match self.head.try_recv() {
52-
Some(ch) => {
53+
comm::Data(ch) => {
5354
// Send a wakeup signal. If the waiter was killed, its port will
5455
// have closed. Keep trying until we get a live task.
5556
if ch.try_send_deferred(()) {
@@ -58,20 +59,20 @@ impl WaitQueue {
5859
self.signal()
5960
}
6061
}
61-
None => false
62+
_ => false
6263
}
6364
}
6465

6566
fn broadcast(&self) -> uint {
6667
let mut count = 0;
6768
loop {
6869
match self.head.try_recv() {
69-
None => break,
70-
Some(ch) => {
70+
comm::Data(ch) => {
7171
if ch.try_send_deferred(()) {
7272
count += 1;
7373
}
7474
}
75+
_ => break
7576
}
7677
}
7778
count

trunk/src/libgreen/sched.rs

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

959959
#[cfg(test)]
960960
mod test {
961+
use std::comm;
961962
use std::task::TaskOpts;
962963
use std::rt::Runtime;
963964
use std::rt::task::Task;
@@ -1376,7 +1377,7 @@ mod test {
13761377
// This task should not be able to starve the sender;
13771378
// The sender should get stolen to another thread.
13781379
do spawn {
1379-
while port.try_recv().is_none() { }
1380+
while port.try_recv() != comm::Data(()) { }
13801381
}
13811382

13821383
chan.send(());
@@ -1393,7 +1394,7 @@ mod test {
13931394
// This task should not be able to starve the other task.
13941395
// The sends should eventually yield.
13951396
do spawn {
1396-
while port.try_recv().is_none() {
1397+
while port.try_recv() != comm::Data(()) {
13971398
chan2.send(());
13981399
}
13991400
}

trunk/src/libnative/lib.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,6 @@ 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-
6642
/// Executes the given procedure after initializing the runtime with the given
6743
/// argc/argv.
6844
///

trunk/src/librustc/front/std_inject.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ 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+
2427
pub fn maybe_inject_libstd_ref(sess: Session, crate: ast::Crate)
2528
-> ast::Crate {
2629
if use_std(&crate) {
@@ -53,11 +56,21 @@ struct StandardLibraryInjector {
5356
sess: Session,
5457
}
5558

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+
5669
impl fold::Folder for StandardLibraryInjector {
5770
fn fold_crate(&mut self, crate: ast::Crate) -> ast::Crate {
5871
let mut vis = ~[ast::ViewItem {
5972
node: ast::ViewItemExternMod(self.sess.ident_of("std"),
60-
None,
73+
with_version("std"),
6174
ast::DUMMY_NODE_ID),
6275
attrs: ~[],
6376
vis: ast::Private,
@@ -67,15 +80,15 @@ impl fold::Folder for StandardLibraryInjector {
6780
if use_uv(&crate) && !self.sess.building_library.get() {
6881
vis.push(ast::ViewItem {
6982
node: ast::ViewItemExternMod(self.sess.ident_of("green"),
70-
None,
83+
with_version("green"),
7184
ast::DUMMY_NODE_ID),
7285
attrs: ~[],
7386
vis: ast::Private,
7487
span: DUMMY_SP
7588
});
7689
vis.push(ast::ViewItem {
7790
node: ast::ViewItemExternMod(self.sess.ident_of("rustuv"),
78-
None,
91+
with_version("rustuv"),
7992
ast::DUMMY_NODE_ID),
8093
attrs: ~[],
8194
vis: ast::Private,

trunk/src/librustc/front/test.rs

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

1414
use driver::session;
1515
use front::config;
16+
use front::std_inject::with_version;
1617

1718
use std::cell::RefCell;
1819
use std::vec;
@@ -292,7 +293,7 @@ fn mk_std(cx: &TestCtxt) -> ast::ViewItem {
292293
ast::DUMMY_NODE_ID))])
293294
} else {
294295
ast::ViewItemExternMod(id_extra,
295-
None,
296+
with_version("extra"),
296297
ast::DUMMY_NODE_ID)
297298
};
298299
ast::ViewItem {

trunk/src/libstd/cleanup.rs

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

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

20+
static RC_IMMORTAL : uint = 0x77777777;
21+
2022
/*
2123
* Box annihilation
2224
*
@@ -25,24 +27,21 @@ type DropGlue<'a> = 'a |**TyDesc, *c_void|;
2527

2628
struct AnnihilateStats {
2729
n_total_boxes: uint,
28-
n_unique_boxes: uint,
2930
n_bytes_freed: uint
3031
}
3132

3233
unsafe fn each_live_alloc(read_next_before: bool,
33-
f: |alloc: *mut raw::Box<()>, uniq: bool| -> bool)
34+
f: |alloc: *mut raw::Box<()>| -> bool)
3435
-> bool {
3536
//! Walks the internal list of allocations
3637
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;
4443

45-
if !f(alloc, uniq) {
44+
if !f(alloc) {
4645
return false;
4746
}
4847

@@ -70,25 +69,19 @@ fn debug_mem() -> bool {
7069
pub unsafe fn annihilate() {
7170
use rt::local_heap::local_free;
7271
use mem;
73-
use managed;
7472

7573
let mut stats = AnnihilateStats {
7674
n_total_boxes: 0,
77-
n_unique_boxes: 0,
7875
n_bytes_freed: 0
7976
};
8077

8178
// Pass 1: Make all boxes immortal.
8279
//
8380
// In this pass, nothing gets freed, so it does not matter whether
8481
// we read the next field before or after the callback.
85-
each_live_alloc(true, |alloc, uniq| {
82+
each_live_alloc(true, |alloc| {
8683
stats.n_total_boxes += 1;
87-
if uniq {
88-
stats.n_unique_boxes += 1;
89-
} else {
90-
(*alloc).ref_count = managed::RC_IMMORTAL;
91-
}
84+
(*alloc).ref_count = RC_IMMORTAL;
9285
true
9386
});
9487

@@ -97,12 +90,10 @@ pub unsafe fn annihilate() {
9790
// In this pass, unique-managed boxes may get freed, but not
9891
// managed boxes, so we must read the `next` field *after* the
9992
// callback, as the original value may have been freed.
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-
}
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);
10697
true
10798
});
10899

@@ -112,22 +103,19 @@ pub unsafe fn annihilate() {
112103
// unique-managed boxes, though I think that none of those are
113104
// left), so we must read the `next` field before, since it will
114105
// not be valid after.
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-
}
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);
122111
true
123112
});
124113

125114
if debug_mem() {
126115
// We do logging here w/o allocation.
127116
debug!("annihilator stats:\n \
128117
total boxes: {}\n \
129-
unique boxes: {}\n \
130118
bytes freed: {}",
131-
stats.n_total_boxes, stats.n_unique_boxes, stats.n_bytes_freed);
119+
stats.n_total_boxes, stats.n_bytes_freed);
132120
}
133121
}

0 commit comments

Comments
 (0)