Skip to content

Commit 7a9a6e4

Browse files
committed
std: Port SharedChan to newsched
1 parent 357f087 commit 7a9a6e4

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

src/libstd/comm.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -220,48 +220,58 @@ impl<T: Owned> Peekable<T> for PortSet<T> {
220220

221221
/// A channel that can be shared between many senders.
222222
pub struct SharedChan<T> {
223-
ch: Exclusive<pipesy::Chan<T>>
223+
inner: Either<Exclusive<pipesy::Chan<T>>, rtcomm::SharedChan<T>>
224224
}
225225

226226
impl<T: Owned> SharedChan<T> {
227227
/// Converts a `chan` into a `shared_chan`.
228228
pub fn new(c: Chan<T>) -> SharedChan<T> {
229229
let Chan { inner } = c;
230230
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))
233233
};
234-
SharedChan { ch: exclusive(c) }
234+
SharedChan { inner: c }
235235
}
236236
}
237237

238238
impl<T: Owned> GenericChan<T> for SharedChan<T> {
239239
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+
}
245249
}
250+
Right(ref chan) => chan.send(x)
246251
}
247252
}
248253
}
249254

250255
impl<T: Owned> GenericSmartChan<T> for SharedChan<T> {
251256
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+
}
257266
}
267+
Right(ref chan) => chan.try_send(x)
258268
}
259269
}
260270
}
261271

262272
impl<T: Owned> ::clone::Clone for SharedChan<T> {
263273
fn clone(&self) -> SharedChan<T> {
264-
SharedChan { ch: self.ch.clone() }
274+
SharedChan { inner: self.inner.clone() }
265275
}
266276
}
267277

src/libstd/rt/task.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,18 @@ mod test {
248248
}
249249
}
250250

251+
#[test]
252+
fn comm_shared_chan() {
253+
use comm::*;
254+
255+
do run_in_newsched_task() {
256+
let (port, chan) = stream();
257+
let chan = SharedChan::new(chan);
258+
chan.send(10);
259+
assert!(port.recv() == 10);
260+
}
261+
}
262+
251263
#[test]
252264
fn linked_failure() {
253265
do run_in_newsched_task() {

0 commit comments

Comments
 (0)