Skip to content

Commit de28839

Browse files
committed
---
yaml --- r: 138622 b: refs/heads/try2 c: 50c08db h: refs/heads/master v: v3
1 parent 07a7bf7 commit de28839

File tree

89 files changed

+647
-820
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+647
-820
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 405a35c7f8cfaa9c77e71111a184e86d5ea4d637
8+
refs/heads/try2: 50c08dbf0d0150de41fcc7f5e87a97c4ea2bd4f0
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/comm.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
// Transitional -- needs snapshot
12-
#[allow(structural_records)];
13-
1411
use either::{Either, Left, Right};
1512
use kinds::Owned;
1613
use option;
@@ -20,8 +17,8 @@ use vec;
2017

2118
use pipes::{recv, try_recv, wait_many, peek, PacketHeader};
2219

23-
// NOTE Making this public exposes some plumbing from pipes. Needs
24-
// some refactoring
20+
// FIXME #5160: Making this public exposes some plumbing from
21+
// pipes. Needs some refactoring
2522
pub use pipes::Selectable;
2623

2724
/// A trait for things that can send multiple messages.

branches/try2/src/libcore/core.rc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -41,7 +41,7 @@ Implicitly, all crates behave as if they included the following prologue:
4141
url = "https://github.com/mozilla/rust/tree/master/src/libcore")];
4242

4343
#[comment = "The Rust core library"];
44-
#[license = "MIT"];
44+
#[license = "MIT/ASL2"];
4545
#[crate_type = "lib"];
4646

4747

@@ -227,10 +227,6 @@ pub const debug : u32 = 4_u32;
227227

228228
// The runtime interface used by the compiler
229229
#[cfg(notest)] pub mod rt;
230-
// The runtime and compiler interface to fmt!
231-
#[cfg(stage0)]
232-
#[path = "private/extfmt.rs"]
233-
pub mod extfmt;
234230
// Private APIs
235231
pub mod private;
236232

branches/try2/src/libcore/io.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ pub fn FILE_reader(f: *libc::FILE, cleanup: bool) -> @Reader {
504504

505505
pub fn stdin() -> @Reader {
506506
unsafe {
507-
rustrt::rust_get_stdin() as @Reader
507+
@rustrt::rust_get_stdin() as @Reader
508508
}
509509
}
510510

@@ -642,11 +642,11 @@ impl Writer for *libc::FILE {
642642
}
643643
}
644644

645-
pub fn FILE_writer(f: *libc::FILE, cleanup: bool) -> Writer {
645+
pub fn FILE_writer(f: *libc::FILE, cleanup: bool) -> @Writer {
646646
if cleanup {
647-
Wrapper { base: f, cleanup: FILERes(f) } as Writer
647+
@Wrapper { base: f, cleanup: FILERes(f) } as @Writer
648648
} else {
649-
f as Writer
649+
@f as @Writer
650650
}
651651
}
652652

@@ -702,11 +702,11 @@ pub fn FdRes(fd: fd_t) -> FdRes {
702702
}
703703
}
704704

705-
pub fn fd_writer(fd: fd_t, cleanup: bool) -> Writer {
705+
pub fn fd_writer(fd: fd_t, cleanup: bool) -> @Writer {
706706
if cleanup {
707-
Wrapper { base: fd, cleanup: FdRes(fd) } as Writer
707+
@Wrapper { base: fd, cleanup: FdRes(fd) } as @Writer
708708
} else {
709-
fd as Writer
709+
@fd as @Writer
710710
}
711711
}
712712

branches/try2/src/libcore/pipes.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ bounded and unbounded protocols allows for less code duplication.
8282
8383
*/
8484

85-
#[allow(structural_records)]; // Macros -- needs another snapshot
86-
8785
use cmp::Eq;
8886
use cast::{forget, reinterpret_cast, transmute};
8987
use cell::Cell;

branches/try2/src/libcore/private.rs

Lines changed: 4 additions & 186 deletions
Original file line numberDiff line numberDiff line change
@@ -107,20 +107,9 @@ fn compare_and_swap(address: &mut int, oldval: int, newval: int) -> bool {
107107
* Shared state & exclusive ARC
108108
****************************************************************************/
109109

110-
struct UnwrapProtoInner {
111-
contents: Option<(comm::ChanOne<()>, comm::PortOne<bool>)>,
112-
}
113-
114-
// An unwrapper uses this protocol to communicate with the "other" task that
115-
// drops the last refcount on an arc. Unfortunately this can't be a proper
116-
// pipe protocol because the unwrapper has to access both stages at once.
117-
type UnwrapProto = ~UnwrapProtoInner;
118-
119110
struct ArcData<T> {
120111
mut count: libc::intptr_t,
121-
mut unwrapper: int, // either a UnwrapProto or 0
122-
// FIXME(#3224) should be able to make this non-option to save memory, and
123-
// in unwrap() use "let ~ArcData { data: result, _ } = thing" to unwrap it
112+
// FIXME(#3224) should be able to make this non-option to save memory
124113
mut data: Option<T>,
125114
}
126115

@@ -131,37 +120,13 @@ struct ArcDestruct<T> {
131120
impl<T> Drop for ArcDestruct<T>{
132121
fn finalize(&self) {
133122
unsafe {
134-
if self.data.is_null() {
135-
return; // Happens when destructing an unwrapper's handle.
136-
}
137123
do task::unkillable {
138124
let data: ~ArcData<T> = cast::reinterpret_cast(&self.data);
139125
let new_count =
140126
intrinsics::atomic_xsub(&mut data.count, 1) - 1;
141127
assert new_count >= 0;
142128
if new_count == 0 {
143-
// Were we really last, or should we hand off to an
144-
// unwrapper? It's safe to not xchg because the unwrapper
145-
// will set the unwrap lock *before* dropping his/her
146-
// reference. In effect, being here means we're the only
147-
// *awake* task with the data.
148-
if data.unwrapper != 0 {
149-
let mut p: UnwrapProto =
150-
cast::reinterpret_cast(&data.unwrapper);
151-
let (message, response) =
152-
option::swap_unwrap(&mut p.contents);
153-
// Send 'ready' and wait for a response.
154-
comm::send_one(message, ());
155-
// Unkillable wait. Message guaranteed to come.
156-
if comm::recv_one(response) {
157-
// Other task got the data.
158-
cast::forget(data);
159-
} else {
160-
// Other task was killed. drop glue takes over.
161-
}
162-
} else {
163-
// drop glue takes over.
164-
}
129+
// drop glue takes over.
165130
} else {
166131
cast::forget(data);
167132
}
@@ -176,79 +141,6 @@ fn ArcDestruct<T>(data: *libc::c_void) -> ArcDestruct<T> {
176141
}
177142
}
178143

179-
pub unsafe fn unwrap_shared_mutable_state<T:Owned>(rc: SharedMutableState<T>)
180-
-> T {
181-
struct DeathThroes<T> {
182-
mut ptr: Option<~ArcData<T>>,
183-
mut response: Option<comm::ChanOne<bool>>,
184-
}
185-
186-
impl<T> Drop for DeathThroes<T>{
187-
fn finalize(&self) {
188-
unsafe {
189-
let response = option::swap_unwrap(&mut self.response);
190-
// In case we get killed early, we need to tell the person who
191-
// tried to wake us whether they should hand-off the data to
192-
// us.
193-
if task::failing() {
194-
comm::send_one(response, false);
195-
// Either this swap_unwrap or the one below (at "Got
196-
// here") ought to run.
197-
cast::forget(option::swap_unwrap(&mut self.ptr));
198-
} else {
199-
assert self.ptr.is_none();
200-
comm::send_one(response, true);
201-
}
202-
}
203-
}
204-
}
205-
206-
do task::unkillable {
207-
let ptr: ~ArcData<T> = cast::reinterpret_cast(&rc.data);
208-
let (p1,c1) = comm::oneshot(); // ()
209-
let (p2,c2) = comm::oneshot(); // bool
210-
let mut server: UnwrapProto = ~UnwrapProtoInner {
211-
contents: Some((c1,p2))
212-
};
213-
let serverp: int = cast::transmute(server);
214-
// Try to put our server end in the unwrapper slot.
215-
if compare_and_swap(&mut ptr.unwrapper, 0, serverp) {
216-
// Got in. Step 0: Tell destructor not to run. We are now it.
217-
rc.data = ptr::null();
218-
// Step 1 - drop our own reference.
219-
let new_count = intrinsics::atomic_xsub(&mut ptr.count, 1) - 1;
220-
//assert new_count >= 0;
221-
if new_count == 0 {
222-
// We were the last owner. Can unwrap immediately.
223-
// Also we have to free the server endpoints.
224-
let _server: UnwrapProto = cast::transmute(serverp);
225-
option::swap_unwrap(&mut ptr.data)
226-
// drop glue takes over.
227-
} else {
228-
// The *next* person who sees the refcount hit 0 will wake us.
229-
let end_result =
230-
DeathThroes { ptr: Some(ptr),
231-
response: Some(c2) };
232-
let mut p1 = Some(p1); // argh
233-
do task::rekillable {
234-
comm::recv_one(option::swap_unwrap(&mut p1));
235-
}
236-
// Got here. Back in the 'unkillable' without getting killed.
237-
// Recover ownership of ptr, then take the data out.
238-
let ptr = option::swap_unwrap(&mut end_result.ptr);
239-
option::swap_unwrap(&mut ptr.data)
240-
// drop glue takes over.
241-
}
242-
} else {
243-
// Somebody else was trying to unwrap. Avoid guaranteed deadlock.
244-
cast::forget(ptr);
245-
// Also we have to free the (rejected) server endpoints.
246-
let _server: UnwrapProto = cast::transmute(serverp);
247-
fail!(~"Another task is already unwrapping this ARC!");
248-
}
249-
}
250-
}
251-
252144
/**
253145
* COMPLETELY UNSAFE. Used as a primitive for the safe versions in std::arc.
254146
*
@@ -259,7 +151,7 @@ pub type SharedMutableState<T> = ArcDestruct<T>;
259151

260152
pub unsafe fn shared_mutable_state<T:Owned>(data: T) ->
261153
SharedMutableState<T> {
262-
let data = ~ArcData { count: 1, unwrapper: 0, data: Some(data) };
154+
let data = ~ArcData { count: 1, data: Some(data) };
263155
unsafe {
264156
let ptr = cast::transmute(data);
265157
ArcDestruct(ptr)
@@ -413,22 +305,14 @@ pub impl<T:Owned> Exclusive<T> {
413305
}
414306
}
415307

416-
// FIXME(#3724) make this a by-move method on the exclusive
417-
pub fn unwrap_exclusive<T:Owned>(arc: Exclusive<T>) -> T {
418-
let Exclusive { x: x } = arc;
419-
let inner = unsafe { unwrap_shared_mutable_state(x) };
420-
let ExData { data: data, _ } = inner;
421-
data
422-
}
423-
424308
#[cfg(test)]
425309
pub mod tests {
426310
use core::option::{None, Some};
427311

428312
use cell::Cell;
429313
use comm;
430314
use option;
431-
use private::{exclusive, unwrap_exclusive};
315+
use private::exclusive;
432316
use result;
433317
use task;
434318
use uint;
@@ -479,70 +363,4 @@ pub mod tests {
479363
assert *one == 1;
480364
}
481365
}
482-
483-
#[test]
484-
pub fn exclusive_unwrap_basic() {
485-
let x = exclusive(~~"hello");
486-
assert unwrap_exclusive(x) == ~~"hello";
487-
}
488-
489-
#[test]
490-
pub fn exclusive_unwrap_contended() {
491-
let x = exclusive(~~"hello");
492-
let x2 = Cell(x.clone());
493-
do task::spawn {
494-
let x2 = x2.take();
495-
do x2.with |_hello| { }
496-
task::yield();
497-
}
498-
assert unwrap_exclusive(x) == ~~"hello";
499-
500-
// Now try the same thing, but with the child task blocking.
501-
let x = exclusive(~~"hello");
502-
let x2 = Cell(x.clone());
503-
let mut res = None;
504-
do task::task().future_result(|+r| res = Some(r)).spawn {
505-
let x2 = x2.take();
506-
assert unwrap_exclusive(x2) == ~~"hello";
507-
}
508-
// Have to get rid of our reference before blocking.
509-
{ let _x = x; } // FIXME(#3161) util::ignore doesn't work here
510-
let res = option::swap_unwrap(&mut res);
511-
res.recv();
512-
}
513-
514-
#[test] #[should_fail] #[ignore(cfg(windows))]
515-
pub fn exclusive_unwrap_conflict() {
516-
let x = exclusive(~~"hello");
517-
let x2 = Cell(x.clone());
518-
let mut res = None;
519-
do task::task().future_result(|+r| res = Some(r)).spawn {
520-
let x2 = x2.take();
521-
assert unwrap_exclusive(x2) == ~~"hello";
522-
}
523-
assert unwrap_exclusive(x) == ~~"hello";
524-
let res = option::swap_unwrap(&mut res);
525-
// See #4689 for why this can't be just "res.recv()".
526-
assert res.recv() == task::Success;
527-
}
528-
529-
#[test] #[ignore(cfg(windows))]
530-
pub fn exclusive_unwrap_deadlock() {
531-
// This is not guaranteed to get to the deadlock before being killed,
532-
// but it will show up sometimes, and if the deadlock were not there,
533-
// the test would nondeterministically fail.
534-
let result = do task::try {
535-
// a task that has two references to the same exclusive will
536-
// deadlock when it unwraps. nothing to be done about that.
537-
let x = exclusive(~~"hello");
538-
let x2 = x.clone();
539-
do task::spawn {
540-
for 10.times { task::yield(); } // try to let the unwrapper go
541-
fail!(); // punt it awake from its deadlock
542-
}
543-
let _z = unwrap_exclusive(x);
544-
do x2.with |_hello| { }
545-
};
546-
assert result.is_err();
547-
}
548366
}

branches/try2/src/libcore/private/finally.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,10 @@ do || {
2626
use ops::Drop;
2727
use task::{spawn, failing};
2828

29-
#[cfg(stage0)]
30-
pub trait Finally<T> {
31-
fn finally(&self, +dtor: &fn()) -> T;
32-
}
33-
34-
#[cfg(stage1)]
35-
#[cfg(stage2)]
36-
#[cfg(stage3)]
3729
pub trait Finally<T> {
3830
fn finally(&self, dtor: &fn()) -> T;
3931
}
4032

41-
#[cfg(stage0)]
42-
impl<T> Finally<T> for &fn() -> T {
43-
// FIXME #4518: Should not require a mode here
44-
fn finally(&self, +dtor: &fn()) -> T {
45-
let _d = Finallyalizer {
46-
dtor: dtor
47-
};
48-
49-
(*self)()
50-
}
51-
}
52-
53-
#[cfg(stage1)]
54-
#[cfg(stage2)]
55-
#[cfg(stage3)]
5633
impl<T> Finally<T> for &fn() -> T {
5734
fn finally(&self, dtor: &fn()) -> T {
5835
let _d = Finallyalizer {

0 commit comments

Comments
 (0)