rust/src/test/run-pass/issue-687.rs

60 lines
1.4 KiB
Rust
Raw Normal View History

use std;
import vec;
import task;
import comm;
import comm::chan;
import comm::port;
import comm::recv;
import comm::send;
tag msg { closed; received([u8]); }
2011-10-20 20:34:04 -07:00
fn producer(c: chan<[u8]>) {
send(c, [1u8, 2u8, 3u8, 4u8]);
let empty: [u8] = [];
send(c, empty);
}
2012-01-04 21:14:53 -08:00
fn packager(cb: chan<chan<[u8]>>, msg: chan<msg>) {
let p: port<[u8]> = port();
send(cb, chan(p));
2011-07-27 14:19:39 +02:00
while true {
#debug("waiting for bytes");
let data = recv(p);
#debug("got bytes");
if vec::len(data) == 0u {
#debug("got empty bytes, quitting");
break;
}
#debug("sending non-empty buffer of length");
log(debug, vec::len(data));
send(msg, received(data));
#debug("sent non-empty buffer");
}
#debug("sending closed message");
send(msg, closed);
#debug("sent closed message");
}
fn main() {
let p: port<msg> = port();
2012-01-04 21:14:53 -08:00
let ch = chan(p);
let recv_reader: port<chan<[u8]>> = port();
2012-01-04 21:14:53 -08:00
let recv_reader_chan = chan(recv_reader);
let pack = task::spawn {|| packager(recv_reader_chan, ch); };
2011-07-27 14:19:39 +02:00
let source_chan: chan<[u8]> = recv(recv_reader);
2012-01-04 21:14:53 -08:00
let prod = task::spawn {|| producer(source_chan); };
2011-07-27 14:19:39 +02:00
while true {
let msg = recv(p);
2011-07-27 14:19:39 +02:00
alt msg {
closed. { #debug("Got close message"); break; }
2011-07-27 14:19:39 +02:00
received(data) {
#debug("Got data. Length is:");
log(debug, vec::len::<u8>(data));
2011-07-27 14:19:39 +02:00
}
}
}
}