Skip to content

Commit 505d937

Browse files
Javad Amiriqinsoon
Javad Amiri
andauthored
Side metadata consistency check (#310)
* add side metadata sanity check * get rid of static side metadata in tests Co-authored-by: Yi Lin <[email protected]>
1 parent 321ce63 commit 505d937

File tree

16 files changed

+1278
-299
lines changed

16 files changed

+1278
-299
lines changed

docs/tutorial/code/mygc_semispace/gc_work.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use crate::vm::VMBinding;
1111
use crate::MMTK;
1212
use crate::plan::PlanConstraints;
1313
use crate::scheduler::WorkerLocal;
14-
use std::marker::PhantomData;
1514
use std::ops::{Deref, DerefMut};
1615
// ANCHOR_END: imports
1716

docs/tutorial/code/mygc_semispace/global.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ use crate::mmtk::MMTK;
44
use crate::plan::global::BasePlan; //Modify
55
use crate::plan::global::CommonPlan; // Add
66
use crate::plan::global::GcStatus; // Add
7-
use crate::plan::mutator_context::Mutator;
8-
use crate::plan::mygc::mutator::create_mygc_mutator;
97
use crate::plan::mygc::mutator::ALLOCATOR_MAPPING;
108
use crate::plan::AllocationSemantics;
119
use crate::plan::Plan;
@@ -20,7 +18,7 @@ use crate::util::heap::layout::heap_layout::VMMap;
2018
use crate::util::heap::layout::vm_layout_constants::{HEAP_END, HEAP_START};
2119
use crate::util::heap::HeapMeta;
2220
use crate::util::heap::VMRequest;
23-
use crate::util::side_metadata::SideMetadataContext;
21+
use crate::util::side_metadata::{SideMetadataSanity, SideMetadataContext};
2422
use crate::util::options::UnsafeOptionsWrapper;
2523
use crate::util::opaque_pointer::*;
2624
use crate::vm::VMBinding;
@@ -177,7 +175,7 @@ impl<VM: VMBinding> MyGC<VM> {
177175
let mut heap = HeapMeta::new(HEAP_START, HEAP_END);
178176
let global_metadata_specs = SideMetadataContext::new_global_specs(&[]);
179177

180-
MyGC {
178+
let res = MyGC {
181179
hi: AtomicBool::new(false),
182180
// ANCHOR: copyspace_new
183181
copyspace0: CopySpace::new(
@@ -201,8 +199,15 @@ impl<VM: VMBinding> MyGC<VM> {
201199
mmapper,
202200
&mut heap,
203201
),
204-
common: CommonPlan::new(vm_map, mmapper, options, heap, &MYGC_CONSTRAINTS, global_metadata_specs),
205-
}
202+
common: CommonPlan::new(vm_map, mmapper, options, heap, &MYGC_CONSTRAINTS, global_metadata_specs.clone()),
203+
};
204+
205+
let mut side_metadata_sanity_checker = SideMetadataSanity::new();
206+
res.common.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
207+
res.copyspace0.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
208+
res.copyspace1.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
209+
210+
res
206211
}
207212
// ANCHOR_END: plan_new
208213

src/plan/gencopy/global.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::util::heap::VMRequest;
2323
use crate::util::options::UnsafeOptionsWrapper;
2424
#[cfg(feature = "sanity")]
2525
use crate::util::sanity::sanity_checker::*;
26-
use crate::util::side_metadata::SideMetadataContext;
26+
use crate::util::side_metadata::{SideMetadataContext, SideMetadataSanity};
2727
use crate::util::VMWorkerThread;
2828
use crate::vm::*;
2929
use crate::{mmtk::MMTK, plan::barriers::BarrierSelector};
@@ -185,7 +185,7 @@ impl<VM: VMBinding> GenCopy<VM> {
185185
};
186186
let global_metadata_specs = SideMetadataContext::new_global_specs(&gencopy_specs);
187187

188-
GenCopy {
188+
let res = GenCopy {
189189
nursery: CopySpace::new(
190190
"nursery",
191191
false,
@@ -226,7 +226,21 @@ impl<VM: VMBinding> GenCopy<VM> {
226226
global_metadata_specs,
227227
),
228228
in_nursery: AtomicBool::default(),
229+
};
230+
231+
{
232+
let mut side_metadata_sanity_checker = SideMetadataSanity::new();
233+
res.common
234+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
235+
res.nursery
236+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
237+
res.copyspace0
238+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
239+
res.copyspace1
240+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
229241
}
242+
243+
res
230244
}
231245

232246
fn request_full_heap_collection(&self) -> bool {

src/plan/global.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use super::controller_collector_context::ControllerCollectorContext;
44
use super::PlanConstraints;
5+
use crate::mmtk::MMTK;
56
use crate::plan::transitive_closure::TransitiveClosure;
67
use crate::plan::Mutator;
78
use crate::policy::immortalspace::ImmortalSpace;
@@ -20,11 +21,12 @@ use crate::util::heap::HeapMeta;
2021
use crate::util::heap::VMRequest;
2122
use crate::util::options::PlanSelector;
2223
use crate::util::options::{Options, UnsafeOptionsWrapper};
24+
use crate::util::side_metadata::SideMetadataSanity;
25+
use crate::util::side_metadata::SideMetadataSpec;
2326
use crate::util::statistics::stats::Stats;
2427
use crate::util::{Address, ObjectReference};
2528
use crate::util::{VMMutatorThread, VMWorkerThread};
2629
use crate::vm::*;
27-
use crate::{mmtk::MMTK, util::side_metadata::SideMetadataSpec};
2830
use downcast_rs::Downcast;
2931
use enum_map::EnumMap;
3032
use std::marker::PhantomData;
@@ -674,6 +676,22 @@ impl<VM: VMBinding> BasePlan<VM> {
674676

675677
space_full || stress_force_gc || heap_full
676678
}
679+
680+
#[allow(unused_variables)] // depending on the enabled features, base may not be used.
681+
pub(crate) fn verify_side_metadata_sanity(
682+
&self,
683+
side_metadata_sanity_checker: &mut SideMetadataSanity,
684+
) {
685+
#[cfg(feature = "code_space")]
686+
self.code_space
687+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
688+
#[cfg(feature = "ro_space")]
689+
self.ro_space
690+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
691+
#[cfg(feature = "vm_space")]
692+
self.vm_space
693+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
694+
}
677695
}
678696

679697
/**
@@ -798,6 +816,18 @@ impl<VM: VMBinding> CommonPlan<VM> {
798816
pub fn get_los(&self) -> &LargeObjectSpace<VM> {
799817
&self.los
800818
}
819+
820+
pub(crate) fn verify_side_metadata_sanity(
821+
&self,
822+
side_metadata_sanity_checker: &mut SideMetadataSanity,
823+
) {
824+
self.base
825+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
826+
self.immortal
827+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
828+
self.los
829+
.verify_side_metadata_sanity(side_metadata_sanity_checker);
830+
}
801831
}
802832

803833
use enum_map::Enum;

src/plan/marksweep/global.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::util::heap::HeapMeta;
2020
use crate::util::options::UnsafeOptionsWrapper;
2121
#[cfg(feature = "sanity")]
2222
use crate::util::sanity::sanity_checker::*;
23-
use crate::util::side_metadata::SideMetadataContext;
23+
use crate::util::side_metadata::{SideMetadataContext, SideMetadataSanity};
2424
use crate::util::VMWorkerThread;
2525
use crate::vm::VMBinding;
2626
use std::sync::Arc;
@@ -128,12 +128,29 @@ impl<VM: VMBinding> MarkSweep<VM> {
128128
options: Arc<UnsafeOptionsWrapper>,
129129
) -> Self {
130130
let heap = HeapMeta::new(HEAP_START, HEAP_END);
131-
let specs = SideMetadataContext::new_global_specs(&[]);
132-
133-
MarkSweep {
134-
ms: MallocSpace::new(specs.clone()),
135-
common: CommonPlan::new(vm_map, mmapper, options, heap, &MS_CONSTRAINTS, specs),
131+
let global_metadata_specs = SideMetadataContext::new_global_specs(&[]);
132+
133+
let res = MarkSweep {
134+
ms: MallocSpace::new(global_metadata_specs.clone()),
135+
common: CommonPlan::new(
136+
vm_map,
137+
mmapper,
138+
options,
139+
heap,
140+
&MS_CONSTRAINTS,
141+
global_metadata_specs,
142+
),
143+
};
144+
145+
{
146+
let mut side_metadata_sanity_checker = SideMetadataSanity::new();
147+
res.common
148+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
149+
res.ms
150+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
136151
}
152+
153+
res
137154
}
138155

139156
pub fn ms_space(&self) -> &MallocSpace<VM> {

src/plan/nogc/global.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::util::heap::HeapMeta;
1717
use crate::util::heap::VMRequest;
1818
use crate::util::opaque_pointer::*;
1919
use crate::util::options::UnsafeOptionsWrapper;
20-
use crate::util::side_metadata::SideMetadataContext;
20+
use crate::util::side_metadata::{SideMetadataContext, SideMetadataSanity};
2121
use crate::vm::VMBinding;
2222
use enum_map::EnumMap;
2323
use std::sync::Arc;
@@ -127,7 +127,7 @@ impl<VM: VMBinding> NoGC<VM> {
127127
&NOGC_CONSTRAINTS,
128128
);
129129

130-
NoGC {
130+
let res = NoGC {
131131
nogc_space,
132132
base: BasePlan::new(
133133
vm_map,
@@ -137,6 +137,14 @@ impl<VM: VMBinding> NoGC<VM> {
137137
&NOGC_CONSTRAINTS,
138138
global_specs,
139139
),
140-
}
140+
};
141+
142+
let mut side_metadata_sanity_checker = SideMetadataSanity::new();
143+
res.base
144+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
145+
res.nogc_space
146+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
147+
148+
res
141149
}
142150
}

src/plan/semispace/global.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::util::opaque_pointer::VMWorkerThread;
2222
use crate::util::options::UnsafeOptionsWrapper;
2323
#[cfg(feature = "sanity")]
2424
use crate::util::sanity::sanity_checker::*;
25-
use crate::util::side_metadata::SideMetadataContext;
25+
use crate::util::side_metadata::{SideMetadataContext, SideMetadataSanity};
2626
use crate::{plan::global::BasePlan, vm::VMBinding};
2727
use std::sync::atomic::{AtomicBool, Ordering};
2828
use std::sync::Arc;
@@ -151,7 +151,7 @@ impl<VM: VMBinding> SemiSpace<VM> {
151151
let mut heap = HeapMeta::new(HEAP_START, HEAP_END);
152152
let global_metadata_specs = SideMetadataContext::new_global_specs(&[]);
153153

154-
SemiSpace {
154+
let res = SemiSpace {
155155
hi: AtomicBool::new(false),
156156
copyspace0: CopySpace::new(
157157
"copyspace0",
@@ -181,7 +181,19 @@ impl<VM: VMBinding> SemiSpace<VM> {
181181
&SS_CONSTRAINTS,
182182
global_metadata_specs,
183183
),
184+
};
185+
186+
{
187+
let mut side_metadata_sanity_checker = SideMetadataSanity::new();
188+
res.common
189+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
190+
res.copyspace0
191+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
192+
res.copyspace1
193+
.verify_side_metadata_sanity(&mut side_metadata_sanity_checker);
184194
}
195+
196+
res
185197
}
186198

187199
pub fn tospace(&self) -> &CopySpace<VM> {

src/policy/mallocspace/global.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::util::heap::layout::heap_layout::VMMap;
77
use crate::util::heap::PageResource;
88
use crate::util::malloc::*;
99
use crate::util::opaque_pointer::*;
10+
use crate::util::side_metadata::SideMetadataSanity;
1011
use crate::util::side_metadata::{SideMetadata, SideMetadataContext, SideMetadataSpec};
1112
use crate::util::Address;
1213
use crate::util::ObjectReference;
@@ -129,6 +130,11 @@ impl<VM: VMBinding> Space<VM> for MallocSpace<VM> {
129130
conversions::bytes_to_pages_up(self.active_bytes.load(Ordering::SeqCst))
130131
+ self.metadata.reserved_pages()
131132
}
133+
134+
fn verify_side_metadata_sanity(&self, side_metadata_sanity_checker: &mut SideMetadataSanity) {
135+
side_metadata_sanity_checker
136+
.verify_metadata_context(std::any::type_name::<Self>(), self.metadata.get_context())
137+
}
132138
}
133139

134140
impl<VM: VMBinding> MallocSpace<VM> {

src/policy/space.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use crate::util::side_metadata::{SideMetadata, SideMetadataContext};
1+
use crate::util::conversions::*;
2+
use crate::util::side_metadata::{SideMetadata, SideMetadataContext, SideMetadataSanity};
23
use crate::util::Address;
34
use crate::util::ObjectReference;
4-
use crate::util::{conversions::*, side_metadata::SideMetadataSpec};
55

66
use crate::util::heap::layout::vm_layout_constants::{AVAILABLE_BYTES, LOG_BYTES_IN_CHUNK};
77
use crate::util::heap::layout::vm_layout_constants::{AVAILABLE_END, AVAILABLE_START};
@@ -428,8 +428,20 @@ pub trait Space<VM: VMBinding>: 'static + SFT + Sync + Downcast {
428428
println!();
429429
}
430430

431-
fn local_side_metadata_specs(&self) -> &[SideMetadataSpec] {
432-
&[]
431+
/// Ensure that the current space's metadata context does not have any issues.
432+
/// Panics with a suitable message if any issue is detected.
433+
/// It also initialises the sanity maps which will then be used if the `extreme_assertions` feature is active.
434+
/// Internally this calls verify_metadata_context() from `util::side_metadata::sanity`
435+
///
436+
/// This function is called once per space by its parent plan but may be called multiple times per policy.
437+
///
438+
/// Arguments:
439+
/// * `side_metadata_sanity_checker`: The `SideMetadataSanity` object instantiated in the calling plan.
440+
fn verify_side_metadata_sanity(&self, side_metadata_sanity_checker: &mut SideMetadataSanity) {
441+
side_metadata_sanity_checker.verify_metadata_context(
442+
std::any::type_name::<Self>(),
443+
self.common().metadata.get_context(),
444+
)
433445
}
434446
}
435447

0 commit comments

Comments
 (0)