#![feature(test)]

extern crate mio;
extern crate test;

use mio::*;
use test::Bencher;
use std::sync::Arc;
use std::thread;

#[bench]
fn bench_poll(bench: &mut Bencher) {
    const NUM: usize = 10_000;
    const THREADS: usize = 4;

    let poll = Poll::new().unwrap();
    let mut events = Events::with_capacity(1024);

    let mut registrations = vec![];
    let mut set_readiness = vec![];

    for i in 0..NUM {
        let (r, s) = Registration::new(
            &poll,
            Token(i),
            Ready::readable(),
            PollOpt::edge());

        registrations.push(r);
        set_readiness.push(s);
    }

    let set_readiness = Arc::new(set_readiness);

    bench.iter(move || {
        for mut i in 0..THREADS {
            let set_readiness = set_readiness.clone();
            thread::spawn(move || {
                while i < NUM {
                    set_readiness[i].set_readiness(Ready::readable()).unwrap();
                    i += THREADS;
                }
            });
        }

        let mut n = 0;

        while n < NUM {
            n += poll.poll(&mut events, None).unwrap();
        }
    })
}
