]>
Commit | Line | Data |
---|---|---|
f035d41b XL |
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 | ||
3dfed10e | 22 | fn volatile(db: &dyn VolatileDatabase) -> usize { |
f035d41b XL |
23 | db.salsa_runtime().report_untracked_read(); |
24 | db.atomic_cell().load(Ordering::SeqCst) | |
25 | } | |
26 | ||
3dfed10e | 27 | fn repeat1(db: &dyn VolatileDatabase) -> usize { |
f035d41b XL |
28 | db.volatile() |
29 | } | |
30 | ||
3dfed10e | 31 | fn repeat2(db: &dyn VolatileDatabase) -> usize { |
f035d41b XL |
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); | |
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 | } |