auto merge of #6723 : osaut/rust/arc-remove-get, r=brson
* Remove clone and get functions from ARC. * Update the tests and bench.
This commit is contained in:
commit
5f90f1ca1d
@ -107,7 +107,7 @@ pub impl<'self> Condvar<'self> {
|
||||
****************************************************************************/
|
||||
|
||||
/// An atomically reference counted wrapper for shared immutable state.
|
||||
struct ARC<T> { x: UnsafeAtomicRcBox<T> }
|
||||
pub struct ARC<T> { x: UnsafeAtomicRcBox<T> }
|
||||
|
||||
/// Create an atomically reference counted wrapper.
|
||||
pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
|
||||
@ -118,15 +118,12 @@ pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
|
||||
* Access the underlying data in an atomically reference counted
|
||||
* wrapper.
|
||||
*/
|
||||
pub fn get<'a, T:Const + Owned>(rc: &'a ARC<T>) -> &'a T {
|
||||
rc.get()
|
||||
}
|
||||
|
||||
impl<T:Const+Owned> ARC<T> {
|
||||
pub fn get<'a>(&'a self) -> &'a T {
|
||||
pub impl<T:Const+Owned> ARC<T> {
|
||||
fn get<'a>(&'a self) -> &'a T {
|
||||
unsafe { &*self.x.get_immut() }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Duplicate an atomically reference counted wrapper.
|
||||
*
|
||||
@ -134,13 +131,9 @@ impl<T:Const+Owned> ARC<T> {
|
||||
* object. However, one of the `arc` objects can be sent to another task,
|
||||
* allowing them to share the underlying data.
|
||||
*/
|
||||
pub fn clone<T:Const + Owned>(rc: &ARC<T>) -> ARC<T> {
|
||||
ARC { x: rc.x.clone() }
|
||||
}
|
||||
|
||||
impl<T:Const + Owned> Clone for ARC<T> {
|
||||
fn clone(&self) -> ARC<T> {
|
||||
clone(self)
|
||||
ARC { x: self.x.clone() }
|
||||
}
|
||||
}
|
||||
|
||||
@ -512,17 +505,14 @@ pub impl<'self, T:Const + Owned> RWReadMode<'self, T> {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use core::prelude::*;
|
||||
|
||||
use core::cell::Cell;
|
||||
use arc::*;
|
||||
use arc;
|
||||
|
||||
use core::cell::Cell;
|
||||
use core::task;
|
||||
|
||||
#[test]
|
||||
fn manually_share_arc() {
|
||||
let v = ~[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||
let arc_v = arc::ARC(v);
|
||||
let arc_v = ARC(v);
|
||||
|
||||
let (p, c) = comm::stream();
|
||||
|
||||
@ -530,16 +520,16 @@ mod tests {
|
||||
let p = comm::PortSet::new();
|
||||
c.send(p.chan());
|
||||
|
||||
let arc_v = p.recv();
|
||||
let arc_v : ARC<~[int]> = p.recv();
|
||||
|
||||
let v = copy *arc::get::<~[int]>(&arc_v);
|
||||
let v = copy (*arc_v.get());
|
||||
assert_eq!(v[3], 4);
|
||||
};
|
||||
|
||||
let c = p.recv();
|
||||
c.send(arc::clone(&arc_v));
|
||||
c.send(arc_v.clone());
|
||||
|
||||
assert_eq!((*arc::get(&arc_v))[2], 3);
|
||||
assert_eq!(arc_v.get()[2], 3);
|
||||
assert_eq!(arc_v.get()[4], 5);
|
||||
|
||||
info!(arc_v);
|
||||
|
@ -1,6 +1,6 @@
|
||||
// xfail-pretty
|
||||
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// 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.
|
||||
//
|
||||
@ -234,7 +234,7 @@ fn pbfs(graph: &arc::ARC<graph>, key: node_id) -> bfs_result {
|
||||
black(node_id)
|
||||
};
|
||||
|
||||
let graph_vec = arc::get(graph); // FIXME #3387 requires this temp
|
||||
let graph_vec = graph.get(); // FIXME #3387 requires this temp
|
||||
let mut colors = do vec::from_fn(graph_vec.len()) |i| {
|
||||
if i as node_id == key {
|
||||
gray(key)
|
||||
@ -266,13 +266,13 @@ fn pbfs(graph: &arc::ARC<graph>, key: node_id) -> bfs_result {
|
||||
|
||||
let color = arc::ARC(colors);
|
||||
|
||||
let color_vec = arc::get(&color); // FIXME #3387 requires this temp
|
||||
let color_vec = color.get(); // FIXME #3387 requires this temp
|
||||
colors = do par::mapi(*color_vec) {
|
||||
let colors = arc::clone(&color);
|
||||
let graph = arc::clone(graph);
|
||||
let colors = color.clone();
|
||||
let graph = graph.clone();
|
||||
let result: ~fn(x: uint, y: &color) -> color = |i, c| {
|
||||
let colors = arc::get(&colors);
|
||||
let graph = arc::get(&graph);
|
||||
let colors = colors.get();
|
||||
let graph = graph.get();
|
||||
match *c {
|
||||
white => {
|
||||
let i = i as node_id;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// 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.
|
||||
//
|
||||
@ -18,11 +18,11 @@ fn main() {
|
||||
let arc_v = arc::ARC(v);
|
||||
|
||||
do task::spawn() {
|
||||
let v = *arc::get(&arc_v);
|
||||
let v = arc_v.get();
|
||||
assert_eq!(v[3], 4);
|
||||
};
|
||||
|
||||
assert_eq!((*arc::get(&arc_v))[2], 3);
|
||||
assert_eq!((arc_v.get())[2], 3);
|
||||
|
||||
info!(arc_v);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// 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.
|
||||
//
|
||||
@ -16,11 +16,11 @@ fn main() {
|
||||
let arc_v = arc::ARC(v);
|
||||
|
||||
do task::spawn() { //~ NOTE `arc_v` moved into closure environment here
|
||||
let v = *arc::get(&arc_v);
|
||||
let v = arc_v.get();
|
||||
assert_eq!(v[3], 4);
|
||||
};
|
||||
|
||||
assert!((*arc::get(&arc_v))[2] == 3); //~ ERROR use of moved value: `arc_v`
|
||||
assert_eq!((arc_v.get())[2], 3); //~ ERROR use of moved value: `arc_v`
|
||||
|
||||
info!(arc_v);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user