use mio::Waker;
use std::sync::mpsc::{Receiver, SendError, Sender};
use std::sync::Arc;
pub(crate) fn channel<T>(waker: Arc<Waker>) -> (EventedSender<T>, Receiver<T>) {
let (sender, receiver) = std::sync::mpsc::channel();
let sender = EventedSender::new(sender, waker);
(sender, receiver)
}
pub(crate) struct EventedSender<T> {
inner: Sender<T>,
waker: Arc<Waker>,
}
impl<T> EventedSender<T> {
fn new(inner: Sender<T>, waker: Arc<Waker>) -> EventedSender<T> {
EventedSender { inner, waker }
}
pub fn send(&self, t: T) -> Result<(), SendError<T>> {
self.inner.send(t)?;
self.waker.wake().unwrap();
Ok(())
}
}
impl<T> Clone for EventedSender<T> {
fn clone(&self) -> Self {
EventedSender::new(self.inner.clone(), self.waker.clone())
}
}
#[cfg(test)]
mod test {
use super::*;
use mio::{Poll, Token};
#[test]
fn send() {
let poll = Poll::new().unwrap();
let waker = Arc::new(Waker::new(poll.registry(), Token(0)).unwrap());
let (sender, receiver) = channel(waker);
sender.send('r').unwrap();
let recv = receiver.try_recv().unwrap();
assert_eq!('r', recv);
}
}