@@ -76,34 +76,42 @@ fn clone<T: const>(rc: &arc<T>) -> arc<T> {
76
76
77
77
// Convenience code for sharing arcs between tasks
78
78
79
- enum proto < T : send const> {
80
- terminate ,
81
- shared_get ( comm :: chan < arc :: arc < T > > )
82
- }
79
+ type get_chan < T : const send > = chan < chan < arc < T > > > ;
80
+
81
+ // (terminate, get )
82
+ type shared_arc < T : const send > = ( shared_arc_res , get_chan < T > ) ;
83
83
84
- resource shared_arc_res< T : send const> ( c: comm:: chan<proto< T > >) {
85
- c. send ( terminate ) ;
84
+ resource shared_arc_res( c: comm:: chan<( ) >) {
85
+ c. send ( ( ) ) ;
86
86
}
87
87
88
- fn shared_arc < T : send const> ( -data : T ) -> shared_arc_res < T > {
88
+ fn shared_arc < T : send const> ( -data : T ) -> shared_arc < T > {
89
89
let a = arc:: arc ( data) ;
90
- let c = task:: spawn_listener :: < proto < T > > ( ) { |p, move a|
90
+ let p = port ( ) ;
91
+ let c = chan ( p) ;
92
+ task:: spawn ( ) { |move a|
91
93
let mut live = true ;
94
+ let terminate = port ( ) ;
95
+ let get = port ( ) ;
96
+
97
+ c. send ( ( chan ( terminate) , chan ( get) ) ) ;
98
+
92
99
while live {
93
- alt p . recv ( ) {
94
- terminate { live = false ; }
95
- shared_get ( cc) {
96
- cc . send ( arc:: clone ( & a) ) ;
100
+ alt comm :: select2 ( terminate , get ) {
101
+ either :: left ( ( ) ) { live = false ; }
102
+ either :: right ( cc) {
103
+ comm :: send ( cc , arc:: clone ( & a) ) ;
97
104
}
98
105
}
99
106
}
100
107
} ;
101
- shared_arc_res ( c)
108
+ let ( terminate, get) = p. recv ( ) ;
109
+ ( shared_arc_res ( terminate) , get)
102
110
}
103
111
104
- fn get_arc<T : send const >( c: comm :: chan<proto< T > >) -> arc:: arc<T > {
112
+ fn get_arc<T : send const >( c: get_chan< T >) -> arc:: arc<T > {
105
113
let p = port ( ) ;
106
- c. send ( shared_get ( chan ( p) ) ) ;
114
+ c. send ( chan ( p) ) ;
107
115
p. recv ( )
108
116
}
109
117
@@ -136,4 +144,23 @@ mod tests {
136
144
137
145
log ( info, arc_v) ;
138
146
}
147
+
148
+ #[ test]
149
+ fn auto_share_arc ( ) {
150
+ let v = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
151
+ let ( res, arc_c) = shared_arc ( v) ;
152
+
153
+ let p = port ( ) ;
154
+ let c = chan ( p) ;
155
+
156
+ task:: spawn ( ) { ||
157
+ let arc_v = get_arc ( arc_c) ;
158
+ let v = * get ( & arc_v) ;
159
+ assert v[ 2 ] == 3 ;
160
+
161
+ c. send ( ( ) ) ;
162
+ } ;
163
+
164
+ assert p. recv ( ) == ( ) ;
165
+ }
139
166
}
0 commit comments