]> git.proxmox.com Git - rustc.git/blame - vendor/salsa/tests/gc/volatile_tests.rs
New upstream version 1.47.0~beta.2+dfsg1
[rustc.git] / vendor / salsa / tests / gc / volatile_tests.rs
CommitLineData
f035d41b
XL
1use crate::db;
2use salsa::{Database, SweepStrategy};
3use std::sync::atomic::{AtomicUsize, Ordering};
4use std::sync::Arc;
5
6/// Query group for tests for how interned keys interact with GC.
7#[salsa::query_group(Volatile)]
8pub(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
3dfed10e 22fn volatile(db: &dyn VolatileDatabase) -> usize {
f035d41b
XL
23 db.salsa_runtime().report_untracked_read();
24 db.atomic_cell().load(Ordering::SeqCst)
25}
26
3dfed10e 27fn repeat1(db: &dyn VolatileDatabase) -> usize {
f035d41b
XL
28 db.volatile()
29}
30
3dfed10e 31fn repeat2(db: &dyn VolatileDatabase) -> usize {
f035d41b
XL
32 db.volatile()
33}
34
35#[test]
36fn 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]
53fn 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);
3dfed10e 63 VolatileQuery.in_db(&db).sweep(
f035d41b
XL
64 SweepStrategy::default()
65 .discard_everything()
66 .sweep_all_revisions(),
67 );
68
69 let v2 = db.repeat2();
70
71 assert_eq!(v1, v2);
72}