use std::sync::arc::UnsafeArc;
use std::task;
+#[cfg(stage0)]
+use std::kinds::Share;
+
/// As sync::condvar, a mechanism for unlock-and-descheduling and
/// signaling, for use with the Arc types.
pub struct ArcCondvar<'a> {
* Access the underlying data in an atomically reference counted
* wrapper.
*/
-impl<T:Freeze+Send> Arc<T> {
+impl<T: Share + Send> Arc<T> {
/// Create an atomically reference counted wrapper.
#[inline]
pub fn new(data: T) -> Arc<T> {
}
}
-impl<T:Freeze + Send> Clone for Arc<T> {
+impl<T: Share + Send> Clone for Arc<T> {
/**
* Duplicate an atomically reference counted wrapper.
*
pub struct RWArc<T> {
priv x: UnsafeArc<RWArcInner<T>>,
priv marker: marker::NoFreeze,
+ priv marker1: marker::NoShare,
}
-impl<T:Freeze + Send> Clone for RWArc<T> {
+impl<T: Share + Send> Clone for RWArc<T> {
/// Duplicate a rwlock-protected Arc. See arc::clone for more details.
#[inline]
fn clone(&self) -> RWArc<T> {
RWArc { x: self.x.clone(),
- marker: marker::NoFreeze, }
+ marker: marker::NoFreeze,
+ marker1: marker::NoShare, }
}
}
-impl<T:Freeze + Send> RWArc<T> {
+impl<T: Share + Send> RWArc<T> {
/// Create a reader/writer Arc with the supplied data.
pub fn new(user_data: T) -> RWArc<T> {
RWArc::new_with_condvars(user_data, 1)
failed: false, data: user_data
};
RWArc { x: UnsafeArc::new(data),
- marker: marker::NoFreeze, }
+ marker: marker::NoFreeze,
+ marker1: marker::NoShare, }
}
/**
// lock it. This wraps the unsafety, with the justification that the 'lock'
// field is never overwritten; only 'failed' and 'data'.
#[doc(hidden)]
-fn borrow_rwlock<T:Freeze + Send>(state: *mut RWArcInner<T>) -> *RWLock {
+fn borrow_rwlock<T: Share + Send>(state: *mut RWArcInner<T>) -> *RWLock {
unsafe { cast::transmute(&(*state).lock) }
}
priv token: sync::RWLockReadMode<'a>,
}
-impl<'a, T:Freeze + Send> RWWriteMode<'a, T> {
+impl<'a, T: Share + Send> RWWriteMode<'a, T> {
/// Access the pre-downgrade RWArc in write mode.
pub fn write<U>(&mut self, blk: |x: &mut T| -> U) -> U {
match *self {
}
}
-impl<'a, T:Freeze + Send> RWReadMode<'a, T> {
+impl<'a, T: Share + Send> RWReadMode<'a, T> {
/// Access the post-downgrade rwlock in read mode.
pub fn read<U>(&self, blk: |x: &T| -> U) -> U {
match *self {
/// mutation of the contents if there is only a single reference to
/// the data. If there are multiple references the data is automatically
/// cloned and the task modifies the cloned data in place of the shared data.
-impl<T:Clone+Send+Freeze> CowArc<T> {
+impl<T: Clone + Send + Share> CowArc<T> {
/// Create a copy-on-write atomically reference counted wrapper
#[inline]
pub fn new(data: T) -> CowArc<T> {
}
}
-impl<T:Clone+Send+Freeze> Clone for CowArc<T> {
+impl<T: Clone + Send + Share> Clone for CowArc<T> {
/// Duplicate a Copy-on-write Arc. See arc::clone for more details.
fn clone(&self) -> CowArc<T> {
CowArc { x: self.x.clone() }
use std::vec_ng::Vec;
- fn is_freeze<T: Freeze>() {}
+ fn is_share<T: Share>() {}
- // Assert that the AST remains Freeze (#10693).
+ // Assert that the AST remains sharable.
#[test]
- fn ast_is_freeze() {
- is_freeze::<Item>();
+ fn ast_is_share() {
+ is_share::<Item>();
}
// are ASTs encodable?
use std::rc::Rc;
use std::vec_ng::Vec;
+#[cfg(stage0)]
+use std::kinds::Share;
+
pub struct Interner<T> {
priv map: RefCell<HashMap<T, Name>>,
priv vect: RefCell<Vec<T> >,
}
// when traits can extend traits, we should extend index<Name,T> to get []
-impl<T:Eq + Hash + Freeze + Clone + 'static> Interner<T> {
+impl<T: Eq + Hash + Share + Clone + 'static> Interner<T> {
pub fn new() -> Interner<T> {
Interner {
map: RefCell::new(HashMap::new()),
}
#[unsafe_destructor]
-impl<T:Freeze> Drop for arc_destruct<T> {
+impl<T: Share> Drop for arc_destruct<T> {
fn drop(&mut self) {}
}
-fn arc_destruct<T:Freeze>(data: int) -> arc_destruct<T> {
+fn arc_destruct<T: Share>(data: int) -> arc_destruct<T> {
arc_destruct {
_data: data
}
}
-fn arc<T:Freeze>(_data: T) -> arc_destruct<T> {
+fn arc<T: Share>(_data: T) -> arc_destruct<T> {
arc_destruct(0)
}
// Test for traits that inherit from multiple builtin kinds at once,
// testing that all such kinds must be present on implementing types.
-trait Foo : Send+Freeze { }
+trait Foo : Send+Share { }
-impl <T: Freeze> Foo for (T,) { } //~ ERROR cannot implement this trait
+impl <T: Share> Foo for (T,) { } //~ ERROR cannot implement this trait
impl <T: Send> Foo for (T,T) { } //~ ERROR cannot implement this trait
-impl <T: Send+Freeze> Foo for (T,T,T) { } // (ok)
+impl <T: Send+Share> Foo for (T,T,T) { } // (ok)
fn main() { }
// Tests (negatively) the ability for the Self type in default methods
// to use capabilities granted by builtin kinds as supertraits.
-trait Foo : Freeze {
+trait Foo : Share {
fn foo(self, mut chan: Sender<Self>) {
chan.send(self); //~ ERROR does not fulfill `Send`
}
}
-impl <T: Freeze> Foo for T { }
+impl <T: Share> Foo for T { }
fn main() {
let (tx, rx) = channel();
trait Foo : Send { }
-impl <T: Freeze> Foo for T { } //~ ERROR cannot implement this trait
+impl <T: Share> Foo for T { } //~ ERROR cannot implement this trait
fn main() { }
impl <T> Send for X<T> { } //~ ERROR cannot provide an explicit implementation for a builtin kind
impl <T> Sized for X<T> { } //~ ERROR cannot provide an explicit implementation for a builtin kind
-impl <T> Freeze for X<T> { } //~ ERROR cannot provide an explicit implementation for a builtin kind
+impl <T> Share for X<T> { } //~ ERROR cannot provide an explicit implementation for a builtin kind
fn main() { }
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-fn test<T: Freeze>() {}
+fn test<T: Share>() {}
fn main() {
- test::<Sender<int>>(); //~ ERROR: does not fulfill `Freeze`
- test::<Receiver<int>>(); //~ ERROR: does not fulfill `Freeze`
- test::<Sender<int>>(); //~ ERROR: does not fulfill `Freeze`
+ test::<Sender<int>>(); //~ ERROR: does not fulfill `Share`
+ test::<Receiver<int>>(); //~ ERROR: does not fulfill `Share`
+ test::<Sender<int>>(); //~ ERROR: does not fulfill `Share`
}
}
impl A for E {
- fn b<F:Freeze,G>(_x: F) -> F { fail!() } //~ ERROR type parameter 0 requires `Freeze`
+ fn b<F: Share, G>(_x: F) -> F { fail!() } //~ ERROR type parameter 0 requires `Share`
}
fn main() {}
+++ /dev/null
-// Copyright 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.
-
-use std::kinds::marker;
-
-fn foo<P:Freeze>(p: P) { }
-
-fn main()
-{
- foo(marker::NoFreeze); //~ ERROR does not fulfill `Freeze`
-}
--- /dev/null
+// Copyright 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.
+
+use std::kinds::marker;
+
+fn foo<P: Share>(p: P) { }
+
+fn main()
+{
+ foo(marker::NoShare); //~ ERROR does not fulfill `Share`
+}
use std::cell::RefCell;
-fn f<T: Freeze>(_: T) {}
+fn f<T: Share>(_: T) {}
fn main() {
let x = RefCell::new(0);
- f(x); //~ ERROR: which does not fulfill `Freeze`
+ f(x); //~ ERROR: which does not fulfill `Share`
}
+++ /dev/null
-// Copyright 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.
-
-use std::kinds::marker;
-
-enum Foo { A(marker::NoFreeze) }
-
-fn bar<T: Freeze>(_: T) {}
-
-fn main() {
- let x = A(marker::NoFreeze);
- bar(x);
- //~^ ERROR instantiating a type parameter with an incompatible type `Foo`,
- // which does not fulfill `Freeze`
-}
+++ /dev/null
-// Copyright 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.
-
-use std::rc::Rc;
-use std::cell::RefCell;
-
-fn bar<T: Freeze>(_: T) {}
-
-fn main() {
- let x = Rc::new(RefCell::new(5));
- bar(x);
- //~^ ERROR instantiating a type parameter with an incompatible type
- // `std::rc::Rc<std::cell::RefCell<int>>`, which does not fulfill `Freeze`
-}
+++ /dev/null
-// Copyright 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.
-
-use std::kinds::marker;
-
-struct Foo { a: int, m: marker::NoFreeze }
-
-fn bar<T: Freeze>(_: T) {}
-
-fn main() {
- let x = Foo { a: 5, m: marker::NoFreeze };
- bar(x);
- //~^ ERROR instantiating a type parameter with an incompatible type `Foo`,
- // which does not fulfill `Freeze`
-}
--- /dev/null
+// Copyright 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.
+
+use std::kinds::marker;
+
+enum Foo { A(marker::NoShare) }
+
+fn bar<T: Share>(_: T) {}
+
+fn main() {
+ let x = A(marker::NoShare);
+ bar(x);
+ //~^ ERROR instantiating a type parameter with an incompatible type `Foo`,
+ // which does not fulfill `Share`
+}
--- /dev/null
+// Copyright 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.
+
+use std::rc::Rc;
+use std::cell::RefCell;
+
+fn bar<T: Share>(_: T) {}
+
+fn main() {
+ let x = Rc::new(RefCell::new(5));
+ bar(x);
+ //~^ ERROR instantiating a type parameter with an incompatible type
+ // `std::rc::Rc<std::cell::RefCell<int>>`, which does not fulfill `Share`
+}
--- /dev/null
+// Copyright 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.
+
+use std::kinds::marker;
+
+struct Foo { a: int, m: marker::NoShare }
+
+fn bar<T: Share>(_: T) {}
+
+fn main() {
+ let x = Foo { a: 5, m: marker::NoShare };
+ bar(x);
+ //~^ ERROR instantiating a type parameter with an incompatible type `Foo`,
+ // which does not fulfill `Share`
+}
// are const.
-fn foo<T:Freeze>(x: T) -> T { x }
+fn foo<T: Share>(x: T) -> T { x }
struct F { field: int }
// than the traits require.
trait A {
- fn b<C:Freeze,D>(x: C) -> C;
+ fn b<C:Share,D>(x: C) -> C;
}
struct E {
let dogge1 = Dogge { bark_decibels: 100, tricks_known: 42, name: ~"alan_turing" };
let dogge2 = Dogge { bark_decibels: 55, tricks_known: 11, name: ~"albert_einstein" };
let fishe = Goldfyshe { swim_speed: 998, name: ~"alec_guinness" };
- let arc = Arc::new(~[~catte as ~Pet:Freeze+Send,
- ~dogge1 as ~Pet:Freeze+Send,
- ~fishe as ~Pet:Freeze+Send,
- ~dogge2 as ~Pet:Freeze+Send]);
+ let arc = Arc::new(~[~catte as ~Pet:Share+Send,
+ ~dogge1 as ~Pet:Share+Send,
+ ~fishe as ~Pet:Share+Send,
+ ~dogge2 as ~Pet:Share+Send]);
let (tx1, rx1) = channel();
let arc1 = arc.clone();
task::spawn(proc() { check_legs(arc1); tx1.send(()); });
rx3.recv();
}
-fn check_legs(arc: Arc<~[~Pet:Freeze+Send]>) {
+fn check_legs(arc: Arc<~[~Pet:Share+Send]>) {
let mut legs = 0;
for pet in arc.get().iter() {
legs += pet.num_legs();
}
assert!(legs == 12);
}
-fn check_names(arc: Arc<~[~Pet:Freeze+Send]>) {
+fn check_names(arc: Arc<~[~Pet:Share+Send]>) {
for pet in arc.get().iter() {
pet.name(|name| {
assert!(name[0] == 'a' as u8 && name[1] == 'l' as u8);
})
}
}
-fn check_pedigree(arc: Arc<~[~Pet:Freeze+Send]>) {
+fn check_pedigree(arc: Arc<~[~Pet:Share+Send]>) {
for pet in arc.get().iter() {
assert!(pet.of_good_pedigree());
}