lossyq/spsc/
mod.rs

1pub mod noloss;
2
3use std::cell::UnsafeCell;
4use std::sync::Arc;
5use super::cb::{CircularBuffer, CircularBufferIterator};
6
7pub struct Sender<T> {
8  inner: Arc<UnsafeCell<CircularBuffer<T>>>,
9}
10
11unsafe impl<T> Send for Sender<T> { }
12
13pub struct Receiver<T> {
14  inner: Arc<UnsafeCell<CircularBuffer<T>>>,
15}
16
17unsafe impl<T> Send for Receiver<T> { }
18
19pub fn channel<T: Send>(size : usize) -> (Sender<T>, Receiver<T>) {
20    let a = Arc::new(UnsafeCell::new(CircularBuffer::new(size)));
21    (Sender::new(a.clone()), Receiver::new(a))
22}
23
24impl<T: Send> Sender<T> {
25  fn new(inner: Arc<UnsafeCell<CircularBuffer<T>>>) -> Sender<T> {
26    Sender { inner: inner, }
27  }
28
29  #[inline(always)]
30  pub fn put<F>(&mut self, setter: F) -> usize
31      where F : FnMut(&mut Option<T>) {
32    unsafe { (*self.inner.get()).put(setter) }
33  }
34
35  #[inline(always)]
36  pub fn tmp<F>(&mut self, setter: F)
37      where F : FnMut(&mut Option<T>){
38    unsafe { (*self.inner.get()).tmp(setter) }
39  }
40
41  #[inline(always)]
42  pub fn seqno(&self) -> usize{
43    unsafe { (*self.inner.get()).seqno() }
44  }
45}
46
47impl<T: Send> Receiver<T> {
48  fn new(inner: Arc<UnsafeCell<CircularBuffer<T>>>) -> Receiver<T> {
49    Receiver { inner: inner, }
50  }
51
52  #[inline(always)]
53  pub fn iter(&mut self) -> CircularBufferIterator<T> {
54    unsafe { (*self.inner.get()).iter() }
55  }
56
57  #[inline(always)]
58  pub fn seqno(&self) -> usize{
59    unsafe { (*self.inner.get()).seqno() }
60  }
61}
62
63#[cfg(test)]
64pub mod tests;