use std::cell::UnsafeCell;
use std::sync::mpsc::{Sender, Receiver, channel};
use deque::{BufferPool, Worker, Stealer};
use coroutine::{self, Handle};
thread_local!(static COROUTINE_PROCESSOR: UnsafeCell<Processor> = UnsafeCell::new(Processor::new()));
pub enum Message {
NewNeighbor(Stealer<Handle>),
}
pub type ProcessorHandle = Sender<Message>;
pub struct Processor {
work_queue: Worker<Handle>,
work_stealer: Stealer<Handle>,
neighbors: Vec<Stealer<Handle>>,
msg_sender: Sender<Message>,
msg_receiver: Receiver<Message>,
}
impl Processor {
pub fn new() -> Processor {
let pool = BufferPool::new();
let (worker, stealer) = pool.deque();
let (tx, rx) = channel();
Processor {
work_queue: worker,
work_stealer: stealer,
neighbors: vec![],
msg_sender: tx,
msg_receiver: rx,
}
}
pub fn ready(&mut self, h: Handle) {
self.work_queue.push(h)
}
pub fn stealer(&self) -> Stealer<Handle> {
self.work_stealer.clone()
}
pub fn handle(&self) -> ProcessorHandle {
self.msg_sender.clone()
}
}