use lfrlock::LfrLock;
use std::thread;
#[derive(Debug, Clone)]
struct Data {
value: i32,
}
#[test]
fn test_multiple_writers() {
let lock = LfrLock::new(Data { value: 0 });
let mut handles = vec![];
for _ in 0..4 {
let lock_clone = lock.clone();
let handle = thread::spawn(move || {
for _ in 0..25 {
lock_clone.update(|old_data| Data {
value: old_data.value + 1,
});
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let data = lock.read();
assert_eq!(data.value, 100);
}
#[test]
fn test_multiple_readers_and_writers() {
let lock = LfrLock::new(Data { value: 0 });
let mut handles = vec![];
for _ in 0..2 {
let lock_clone = lock.clone();
let handle = thread::spawn(move || {
for _ in 0..50 {
lock_clone.update(|old_data| Data {
value: old_data.value + 1,
});
}
});
handles.push(handle);
}
for _ in 0..3 {
let lock_clone = lock.clone();
let handle = thread::spawn(move || {
for _ in 0..100 {
let data = lock_clone.read();
assert!(data.value >= 0 && data.value <= 100);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let data = lock.read();
assert_eq!(data.value, 100);
}