2011-07-22 16:22:20 -07:00
|
|
|
use std;
|
2011-12-13 16:25:51 -08:00
|
|
|
import vec;
|
|
|
|
import task;
|
|
|
|
import comm;
|
|
|
|
import comm::chan;
|
|
|
|
import comm::port;
|
|
|
|
import comm::recv;
|
|
|
|
import comm::send;
|
2011-07-22 16:22:20 -07:00
|
|
|
|
2012-06-25 20:00:46 -07:00
|
|
|
enum msg { closed, received([u8]/~), }
|
2011-07-22 16:22:20 -07:00
|
|
|
|
2012-06-25 20:00:46 -07:00
|
|
|
fn producer(c: chan<[u8]/~>) {
|
|
|
|
send(c, [1u8, 2u8, 3u8, 4u8]/~);
|
|
|
|
let empty: [u8]/~ = []/~;
|
2011-08-13 15:20:11 -07:00
|
|
|
send(c, empty);
|
2011-07-22 16:22:20 -07:00
|
|
|
}
|
|
|
|
|
2012-06-25 20:00:46 -07:00
|
|
|
fn packager(cb: chan<chan<[u8]/~>>, msg: chan<msg>) {
|
|
|
|
let p: port<[u8]/~> = port();
|
2011-08-25 11:20:43 -07:00
|
|
|
send(cb, chan(p));
|
2012-03-09 16:11:56 -08:00
|
|
|
loop {
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("waiting for bytes");
|
2011-08-25 11:20:43 -07:00
|
|
|
let data = recv(p);
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("got bytes");
|
|
|
|
if vec::len(data) == 0u {
|
|
|
|
#debug("got empty bytes, quitting");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#debug("sending non-empty buffer of length");
|
2011-12-22 17:53:53 -08:00
|
|
|
log(debug, vec::len(data));
|
2011-08-13 15:20:11 -07:00
|
|
|
send(msg, received(data));
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("sent non-empty buffer");
|
2011-07-22 16:22:20 -07:00
|
|
|
}
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("sending closed message");
|
2011-08-13 15:20:11 -07:00
|
|
|
send(msg, closed);
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("sent closed message");
|
2011-07-22 16:22:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2011-08-25 11:20:43 -07:00
|
|
|
let p: port<msg> = port();
|
2012-01-04 21:14:53 -08:00
|
|
|
let ch = chan(p);
|
2012-06-25 20:00:46 -07:00
|
|
|
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
|
|
|
|
2012-06-25 20:00:46 -07: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-22 16:22:20 -07:00
|
|
|
|
2012-03-09 16:11:56 -08:00
|
|
|
loop {
|
2011-08-25 11:20:43 -07:00
|
|
|
let msg = recv(p);
|
2011-07-27 14:19:39 +02:00
|
|
|
alt msg {
|
2012-01-19 01:03:57 -08:00
|
|
|
closed { #debug("Got close message"); break; }
|
2011-07-27 14:19:39 +02:00
|
|
|
received(data) {
|
2011-12-22 14:42:52 -08:00
|
|
|
#debug("Got data. Length is:");
|
2011-12-22 17:53:53 -08:00
|
|
|
log(debug, vec::len::<u8>(data));
|
2011-07-27 14:19:39 +02:00
|
|
|
}
|
2011-07-22 16:22:20 -07:00
|
|
|
}
|
|
|
|
}
|
2011-07-18 08:41:35 -07:00
|
|
|
}
|