concurrent, realtime write data structure.
at main 2.1 kB view raw
1#[cfg(test)] 2mod usage_test { 3 use rt_write_lock::Reader; 4 5 #[test] 6 fn create_two_times() { 7 let mut reader: Reader<u32> = Reader::default(); 8 let writer = reader.get_writer().unwrap(); 9 assert!(reader.get_writer().is_none()); 10 drop(writer); 11 reader.get_writer().unwrap(); 12 } 13 14 #[test] 15 fn single_thread() { 16 let mut reader: Reader<u32> = Reader::default(); 17 let mut writer = reader.get_writer().unwrap(); 18 19 let mut write = writer.write(); 20 assert!(reader.get_writer().is_none()); 21 let read = reader.try_read().unwrap(); 22 assert!(*read == 0); 23 assert!(*write == 0); 24 25 *write = 2; 26 assert!(*read == 0); 27 assert!(*write == 2); 28 drop(write); 29 30 let write = writer.write(); 31 assert!(*read == 0); 32 assert!(*write == 2); 33 drop(read); 34 35 assert!(reader.try_read().is_none()); 36 } 37 38 #[test] 39 fn drop_reader_first() { 40 let mut reader: Reader<u32> = Reader::default(); 41 let writer = reader.get_writer().unwrap(); 42 43 // drop order opposite of normal 44 drop(reader); 45 drop(writer); 46 } 47 48 #[test] 49 #[should_panic] 50 fn double_write() { 51 let mut reader: Reader<u32> = Reader::default(); 52 let mut writer = reader.get_writer().unwrap(); 53 54 let write = writer.write(); 55 core::mem::forget(write); 56 writer.write(); 57 } 58 59 #[test] 60 fn threads() { 61 let mut reader: Reader<u32> = Reader::default(); 62 let mut writer = reader.get_writer().unwrap(); 63 64 std::thread::scope(|s| { 65 let read = reader.try_read().unwrap(); 66 assert!(*read == 0); 67 s.spawn(move || { 68 let mut write = writer.write(); 69 *write = 15; 70 }); 71 assert!(*read == 0); 72 drop(read); 73 let read = reader.try_read().unwrap(); 74 assert!(*read == 0 || *read == 15); 75 }); 76 let read = reader.try_read().unwrap(); 77 assert!(*read == 15); 78 } 79}