1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#[cfg(loom)] #[test] fn model_check_rwlock() { use awkernel_sync::rwlock; use loom::sync::Arc; loom::model(|| { let n = Arc::new(rwlock::RwLock::new(0)); let mut readers = Vec::new(); let mut writers = Vec::new(); let num_readers = 1; let num_writers = 2; let num_iterations = 1; for _ in 0..num_readers { let n0 = n.clone(); let t = loom::thread::spawn(move || { for _ in 0..num_iterations { let r = n0.read(); let data = r.with(|data| unsafe { *data }); assert_eq!(data, 0); } }); readers.push(t); } for _ in 0..num_writers { let n0 = n.clone(); let t = loom::thread::spawn(move || { for _ in 0..num_iterations { let mut r = n0.write(); r.with_mut(|data| unsafe { *data += 1; *data -= 1; }); } }); writers.push(t); } for t in readers { t.join().unwrap(); } for t in writers { t.join().unwrap(); } }); }