]> git.proxmox.com Git - rustc.git/blob - vendor/salsa/tests/gc/volatile_tests.rs
New upstream version 1.46.0~beta.2+dfsg1
[rustc.git] / vendor / salsa / tests / gc / volatile_tests.rs
1 use crate::db;
2 use salsa::{Database, SweepStrategy};
3 use std::sync::atomic::{AtomicUsize, Ordering};
4 use std::sync::Arc;
5
6 /// Query group for tests for how interned keys interact with GC.
7 #[salsa::query_group(Volatile)]
8 pub(crate) trait VolatileDatabase: Database {
9 #[salsa::input]
10 fn atomic_cell(&self) -> Arc<AtomicUsize>;
11
12 /// Underlying volatile query.
13 fn volatile(&self) -> usize;
14
15 /// This just executes the intern query and returns the result.
16 fn repeat1(&self) -> usize;
17
18 /// Same as `repeat_intern1`. =)
19 fn repeat2(&self) -> usize;
20 }
21
22 fn volatile(db: &impl VolatileDatabase) -> usize {
23 db.salsa_runtime().report_untracked_read();
24 db.atomic_cell().load(Ordering::SeqCst)
25 }
26
27 fn repeat1(db: &impl VolatileDatabase) -> usize {
28 db.volatile()
29 }
30
31 fn repeat2(db: &impl VolatileDatabase) -> usize {
32 db.volatile()
33 }
34
35 #[test]
36 fn consistency_no_gc() {
37 let mut db = db::DatabaseImpl::default();
38
39 let cell = Arc::new(AtomicUsize::new(22));
40
41 db.set_atomic_cell(cell.clone());
42
43 let v1 = db.repeat1();
44
45 cell.store(23, Ordering::SeqCst);
46
47 let v2 = db.repeat2();
48
49 assert_eq!(v1, v2);
50 }
51
52 #[test]
53 fn consistency_with_gc() {
54 let mut db = db::DatabaseImpl::default();
55
56 let cell = Arc::new(AtomicUsize::new(22));
57
58 db.set_atomic_cell(cell.clone());
59
60 let v1 = db.repeat1();
61
62 cell.store(23, Ordering::SeqCst);
63 db.query(VolatileQuery).sweep(
64 SweepStrategy::default()
65 .discard_everything()
66 .sweep_all_revisions(),
67 );
68
69 let v2 = db.repeat2();
70
71 assert_eq!(v1, v2);
72 }