use crate::{storage::Heap, traits::*, SharedRb}; use std::{cell::Cell, thread, thread::sleep, time::Duration, vec::Vec}; fn yield_() { sleep(Duration::from_millis(1)); } #[test] fn concurrent() { const MSG: &[u8] = b"The quick brown fox jumps over the lazy dog\0"; let rb = SharedRb::>::new(4); let (mut prod, mut cons) = rb.split(); let pjh = thread::spawn({ let mut msg = MSG; move || { while !msg.is_empty() { prod.read_from(&mut msg, None).transpose().unwrap(); yield_(); } } }); let cjh = thread::spawn(move || { let mut msg = Vec::new(); while msg.last().copied() != Some(0) { cons.write_into(&mut msg, None).transpose().unwrap(); yield_(); } msg }); pjh.join().unwrap(); assert_eq!(cjh.join().unwrap(), MSG); } #[test] fn non_sync() { const N: i32 = 256; let rb = SharedRb::>>::new(4); let (mut prod, mut cons) = rb.split(); let pjh = thread::spawn({ move || { for i in 0..N { while prod.try_push(Cell::new(i)).is_err() { yield_(); } } } }); let cjh = thread::spawn(move || { for i in 0..N { assert_eq!( i, loop { match cons.try_pop() { Some(i) => break i.get(), None => yield_(), } } ); } }); pjh.join().unwrap(); cjh.join().unwrap(); }