fixed-queue 0.4.8

no_std, no_alloc, lock-free, wait-free, use [T; N]. support `Vec`/`VecDeque`/`spsc`/`History`
Documentation
mod common;

use common::*;
use core::time::Duration;
use etime::{expect_time, Etime};
use fixed_queue::sync::Spsc;
use std::collections::BTreeSet;
use std::thread;

#[test]
fn test_base() {
    static SPSC: Spsc<TestUsize, 3> = Spsc::new();
    assert_eq!(SPSC.capacity(), 3);
    let mut sender = SPSC.take_sender().unwrap();
    let mut recver = SPSC.take_recver().unwrap();
    assert!(SPSC.take_sender().is_none());

    assert!(sender.send(TEST1.clone()).is_ok());
    assert!(sender.send(TEST2.clone()).is_ok());
    assert!(sender.send(TEST3.clone()).is_ok());
    assert!(sender.send(TEST4.clone()).is_err());
    assert_eq!(*recver.try_recv().unwrap(), 1);
    assert!(sender.send(TEST5.clone()).is_ok());

    drop(recver);
    let mut recver = SPSC.take_recver().unwrap();
    assert_eq!(*recver.try_recv().unwrap(), 2);
    assert_eq!(*recver.try_recv().unwrap(), 3);
    assert_eq!(*recver.try_recv().unwrap(), 5);
    assert!(recver.try_recv().is_none());
    assert!(sender.send(TEST6.clone()).is_ok());
}

#[test]
fn test_drop() {
    let spsc: Spsc<TestUsize, 3> = Spsc::new();
    let mut sender = spsc.take_sender().unwrap();
    assert!(sender.send(TEST1.clone()).is_ok());
}

#[test]
fn test_spsc() {
    static SPSC: Spsc<TestUsize, 100> = Spsc::new();
    let mut sender = SPSC.take_sender().unwrap();
    let mut recver = SPSC.take_recver().unwrap();
    let mut data_set: BTreeSet<usize> = (0..1000).collect();
    thread::spawn(move || {
        for i in 0..1000 {
            loop {
                let etime = Etime::new();
                etime.tic();
                let result = sender.send(TestUsize::new(i));
                expect_time(etime.toc(), Duration::ZERO..Duration::from_millis(1), |t| {
                    println!("time to push: {:?}", t);
                });
                if result.is_ok() {
                    break;
                } else {
                    thread::yield_now();
                }
            }
        }
    });

    let h = thread::spawn(move || {
        for i in 0..1000 {
            let etime = Etime::new();
            let start = etime.now();
            loop {
                etime.tic();
                let result = recver.try_recv();
                expect_time(etime.toc(), Duration::ZERO..Duration::from_millis(1), |t| {
                    println!("time to pop: {:?}", t);
                });
                if let Some(i) = result {
                    assert!(data_set.remove(&*i));
                    break;
                } else {
                    if etime.now() > start + 1_000_000_000 {
                        panic!("{}:{:?}", i, data_set);
                    }
                    thread::yield_now();
                }
            }
        }
        assert!(data_set.is_empty());
        assert!(recver.try_recv().is_none());
    });
    let etime = Etime::new();
    etime.tic();
    let _ = h.join();
    expect_time(etime.toc(), Duration::ZERO..Duration::ZERO, |t| {
        println!("time to all: {:?}", t);
    });
}