concurrent, realtime write data structure.
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}