#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_must_use)]
#![allow(deprecated)]
extern crate time;
extern crate water;
use water::Net;
use water::Endpoint;
use water::RawMessage;
use std::io::timer::sleep;
use std::time::duration::Duration;
use time::Timespec;
struct SafeStructure {
a: u64,
b: u32,
c: u8,
}
fn funnyworker(mut net: Net, dbgid: uint) {
let ep: Endpoint = net.new_endpoint();
let mut rawmsg: RawMessage;
sleep(Duration::seconds(1));
let mut sentmsgcnt: u32 = 0u32;
let mut recvmsgcnt: u32 = 0u32;
println!("thread[{}] started", dbgid);
rawmsg = RawMessage::new(32);
while recvmsgcnt < 1001u32 {
loop {
println!("thread[{}] recving", dbgid);
let result = ep.recvorblock(Timespec { sec: 0, nsec: 1000000 });
match result {
Ok(msg) => {
println!("reading message now");
let safestruct: SafeStructure = unsafe { msg.readstruct(0) };
println!("asserting on message");
assert!(safestruct.a == safestruct.b as u64);
assert!(safestruct.c == 0x12);
println!("thread[{}] got message", dbgid);
recvmsgcnt += 1;
},
Err(err) => {
println!("thread[{}] no more messages", dbgid);
break;
}
}
}
println!("thread[{}] sending random message", dbgid);
if sentmsgcnt < 1000u32 {
rawmsg.dstsid = 0;
rawmsg.dsteid = 0;
let safestruct = SafeStructure {
a: 0x12345678,
b: 0x12345678,
c: 0x12,
};
rawmsg.writestructref(0, &safestruct);
ep.send(&rawmsg);
sentmsgcnt += 1;
}
}
let safestruct = SafeStructure {
a: 0x10,
b: 0x10,
c: 0x10,
};
rawmsg.writestructref(0, &safestruct);
ep.send(&rawmsg);
println!("thread[{}]: exiting", dbgid);
}
#[test]
fn simpletest() {
let mut net: Net = Net::new(234);
let netclone = net.clone();
spawn(move || { funnyworker(netclone, 0); });
let netclone = net.clone();
spawn(move || { funnyworker(netclone, 1); });
let netclone = net.clone();
spawn(move || { funnyworker(netclone, 2); });
let ep = net.new_endpoint();
println!("main thread done");
let mut completedcnt: u32 = 0u32;
loop {
let result = ep.recvorblock(Timespec { sec: 1, nsec: 0 });
match result {
Ok(msg) => {
let safestruct: SafeStructure = unsafe { msg.readstruct(0) };
if safestruct.a == safestruct.b as u64 && safestruct.b as u64 == safestruct.c as u64 {
println!("got finished!");
completedcnt += 1;
if completedcnt > 2 {
break;
}
}
},
Err(err) => {
continue;
}
}
}
}
fn main() {
simpletest();
}