@@ -220,48 +220,58 @@ impl<T: Owned> Peekable<T> for PortSet<T> {
220
220
221
221
/// A channel that can be shared between many senders.
222
222
pub struct SharedChan < T > {
223
- ch : Exclusive < pipesy:: Chan < T > >
223
+ inner : Either < Exclusive < pipesy:: Chan < T > > , rtcomm :: SharedChan < T > >
224
224
}
225
225
226
226
impl < T : Owned > SharedChan < T > {
227
227
/// Converts a `chan` into a `shared_chan`.
228
228
pub fn new ( c : Chan < T > ) -> SharedChan < T > {
229
229
let Chan { inner } = c;
230
230
let c = match inner {
231
- Left ( c) => c ,
232
- Right ( _ ) => fail ! ( " SharedChan not implemented" )
231
+ Left ( c) => Left ( exclusive ( c ) ) ,
232
+ Right ( c ) => Right ( rtcomm :: SharedChan :: new ( c ) )
233
233
} ;
234
- SharedChan { ch : exclusive ( c ) }
234
+ SharedChan { inner : c }
235
235
}
236
236
}
237
237
238
238
impl < T : Owned > GenericChan < T > for SharedChan < T > {
239
239
fn send ( & self , x : T ) {
240
- unsafe {
241
- let mut xx = Some ( x) ;
242
- do self. ch . with_imm |chan| {
243
- let x = replace ( & mut xx, None ) ;
244
- chan. send ( x. unwrap ( ) )
240
+ match self . inner {
241
+ Left ( ref chan) => {
242
+ unsafe {
243
+ let mut xx = Some ( x) ;
244
+ do chan. with_imm |chan| {
245
+ let x = replace ( & mut xx, None ) ;
246
+ chan. send ( x. unwrap ( ) )
247
+ }
248
+ }
245
249
}
250
+ Right ( ref chan) => chan. send ( x)
246
251
}
247
252
}
248
253
}
249
254
250
255
impl < T : Owned > GenericSmartChan < T > for SharedChan < T > {
251
256
fn try_send ( & self , x : T ) -> bool {
252
- unsafe {
253
- let mut xx = Some ( x) ;
254
- do self. ch . with_imm |chan| {
255
- let x = replace ( & mut xx, None ) ;
256
- chan. try_send ( x. unwrap ( ) )
257
+ match self . inner {
258
+ Left ( ref chan) => {
259
+ unsafe {
260
+ let mut xx = Some ( x) ;
261
+ do chan. with_imm |chan| {
262
+ let x = replace ( & mut xx, None ) ;
263
+ chan. try_send ( x. unwrap ( ) )
264
+ }
265
+ }
257
266
}
267
+ Right ( ref chan) => chan. try_send ( x)
258
268
}
259
269
}
260
270
}
261
271
262
272
impl < T : Owned > :: clone:: Clone for SharedChan < T > {
263
273
fn clone ( & self ) -> SharedChan < T > {
264
- SharedChan { ch : self . ch . clone ( ) }
274
+ SharedChan { inner : self . inner . clone ( ) }
265
275
}
266
276
}
267
277
0 commit comments