@@ -14,7 +14,8 @@ use std::from_str::FromStr;
1414use std:: iter:: count;
1515use std:: cmp:: min;
1616use std:: os;
17- use sync:: RWArc ;
17+ use std:: slice:: from_elem;
18+ use sync:: { Arc , RWLock } ;
1819
1920fn A ( i : uint , j : uint ) -> f64 {
2021 ( ( i + j) * ( i + j + 1 ) / 2 + i + 1 ) as f64
@@ -28,17 +29,16 @@ fn dot(v: &[f64], u: &[f64]) -> f64 {
2829 sum
2930}
3031
31- fn mult ( v : RWArc < Vec < f64 > > ,
32- out : RWArc < Vec < f64 > > ,
32+ fn mult ( v : Arc < RWLock < Vec < f64 > > > , out : Arc < RWLock < Vec < f64 > > > ,
3333 f : fn ( & Vec < f64 > , uint ) -> f64 ) {
34- // We launch in different tasks the work to be done. To finish
34+ // We lanch in different tasks the work to be done. To finish
3535 // this fuction, we need to wait for the completion of every
3636 // tasks. To do that, we give to each tasks a wait_chan that we
3737 // drop at the end of the work. At the end of this function, we
3838 // wait until the channel hang up.
3939 let ( tx, rx) = channel ( ) ;
4040
41- let len = out. read ( |out| out . len ( ) ) ;
41+ let len = out. read ( ) . len ( ) ;
4242 let chunk = len / 100 + 1 ;
4343 for chk in count ( 0 , chunk) {
4444 if chk >= len { break ; }
@@ -47,8 +47,8 @@ fn mult(v: RWArc<Vec<f64>>,
4747 let out = out. clone ( ) ;
4848 spawn ( proc ( ) {
4949 for i in range ( chk, min ( len, chk + chunk) ) {
50- let val = v. read ( |v| f ( v , i) ) ;
51- out. write ( |out| * out . get_mut ( i) = val) ;
50+ let val = f ( & * v. read ( ) , i) ;
51+ * out. write ( ) . get_mut ( i) = val;
5252 }
5353 drop ( tx)
5454 } ) ;
@@ -67,7 +67,7 @@ fn mult_Av_impl(v: &Vec<f64> , i: uint) -> f64 {
6767 sum
6868}
6969
70- fn mult_Av ( v : RWArc < Vec < f64 > > , out : RWArc < Vec < f64 > > ) {
70+ fn mult_Av ( v : Arc < RWLock < Vec < f64 > > > , out : Arc < RWLock < Vec < f64 > > > ) {
7171 mult ( v, out, mult_Av_impl) ;
7272}
7373
@@ -79,11 +79,12 @@ fn mult_Atv_impl(v: &Vec<f64> , i: uint) -> f64 {
7979 sum
8080}
8181
82- fn mult_Atv ( v : RWArc < Vec < f64 > > , out : RWArc < Vec < f64 > > ) {
82+ fn mult_Atv ( v : Arc < RWLock < Vec < f64 > > > , out : Arc < RWLock < Vec < f64 > > > ) {
8383 mult ( v, out, mult_Atv_impl) ;
8484}
8585
86- fn mult_AtAv ( v : RWArc < Vec < f64 > > , out : RWArc < Vec < f64 > > , tmp : RWArc < Vec < f64 > > ) {
86+ fn mult_AtAv ( v : Arc < RWLock < Vec < f64 > > > , out : Arc < RWLock < Vec < f64 > > > ,
87+ tmp : Arc < RWLock < Vec < f64 > > > ) {
8788 mult_Av ( v, tmp. clone ( ) ) ;
8889 mult_Atv ( tmp, out) ;
8990}
@@ -97,16 +98,16 @@ fn main() {
9798 } else {
9899 FromStr :: from_str ( args[ 1 ] ) . unwrap ( )
99100 } ;
100- let u = RWArc :: new ( Vec :: from_elem ( n, 1. ) ) ;
101- let v = RWArc :: new ( Vec :: from_elem ( n, 1. ) ) ;
102- let tmp = RWArc :: new ( Vec :: from_elem ( n, 1. ) ) ;
101+ let u = Arc :: new ( RWLock :: new ( Vec :: from_elem ( n, 1. ) ) ) ;
102+ let v = Arc :: new ( RWLock :: new ( Vec :: from_elem ( n, 1. ) ) ) ;
103+ let tmp = Arc :: new ( RWLock :: new ( Vec :: from_elem ( n, 1. ) ) ) ;
103104 for _ in range ( 0 , 10 ) {
104105 mult_AtAv ( u. clone ( ) , v. clone ( ) , tmp. clone ( ) ) ;
105106 mult_AtAv ( v. clone ( ) , u. clone ( ) , tmp. clone ( ) ) ;
106107 }
107108
108- u . read ( |u| v . read ( |v| {
109- println ! ( "{:.9f}" ,
110- ( dot ( u . as_slice ( ) , v . as_slice ( ) ) / dot( v . as_slice( ) , v. as_slice( ) ) ) . sqrt ( ) ) ;
111- } ) )
109+ let u = u . read ( ) ;
110+ let v = v . read ( ) ;
111+ println ! ( "{:.9f}" , ( dot( u . as_slice( ) , v. as_slice( ) ) /
112+ dot ( v . as_slice ( ) , v . as_slice ( ) ) ) . sqrt ( ) ) ;
112113}
0 commit comments