// From http://golang.org/doc/effective_go.html#leaky_buffer
#[macro_use]
extern crate chan;
use std::thread;
use std::time::Duration;
use chan::{Receiver, Sender};
type Buffer = Vec;
fn main() {
let (free_send, free_recv) = chan::sync(100);
let (serv_send, serv_recv) = chan::sync(0);
thread::spawn(move || client(free_recv, serv_send));
thread::spawn(move || server(free_send, serv_recv));
thread::sleep(Duration::from_millis(500));
}
fn client(free_list: Receiver, server_chan: Sender) {
loop {
let buf;
chan_select! {
default => buf = Vec::with_capacity(1024),
free_list.recv() -> b => buf = b.unwrap(),
}
server_chan.send(buf);
}
}
fn server(free_list: Sender, server_chan: Receiver) {
loop {
let buf = server_chan.recv().unwrap();
chan_select! {
default => {},
free_list.send(buf) => {},
}
}
}