use crate::setup::{InputQuery, ParDatabase, ParDatabaseImpl};
use crate::signal::Signal;
use salsa::{Database, ParallelDatabase};
use std::sync::Arc;
#[test]
fn in_par_get_set_cancellation() {
let mut db = ParDatabaseImpl::default();
db.query_mut(InputQuery).set('a', 1);
let signal = Arc::new(Signal::default());
let thread1 = std::thread::spawn({
let db = db.snapshot();
let signal = signal.clone();
move || {
assert!(!db.salsa_runtime().is_current_revision_canceled());
signal.signal(1);
while !db.salsa_runtime().is_current_revision_canceled() {
std::thread::yield_now();
}
let v = db.input('a');
let w = db.input('a');
(v, w)
}
});
let thread2 = std::thread::spawn({
let signal = signal.clone();
move || {
signal.wait_for(1);
db.query_mut(InputQuery).set('a', 2);
db.input('a')
}
});
let (a, b) = thread1.join().unwrap();
assert_eq!(a, 1);
assert_eq!(b, 1);
let c = thread2.join().unwrap();
assert_eq!(c, 2);
}