Skip to content

Commit 8a6cac2

Browse files
committed
Implement SpaceInspector for all policies
1 parent 10883f4 commit 8a6cac2

19 files changed

+480
-96
lines changed

src/mmtk.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,12 @@ impl<VM: VMBinding> MMTK<VM> {
598598
.initialize_object_metadata(object, false)
599599
}
600600

601-
pub fn inspect_spaces<'a>(&'a self) -> Vec<&'a dyn SpaceInspector> {
601+
/// Inspect MMTk spaces. The space inspector allows users to inspect the heap hierarchically,
602+
/// with all levels of regions. Users can further inspect objects in the regions if vo_bit is enabled.
603+
pub fn inspect_spaces(&self) -> Vec<&dyn SpaceInspector> {
602604
let mut ret = vec![];
603605
self.get_plan().for_each_space(&mut |space| {
604-
if let Some(inspector) = space.as_inspector() {
605-
ret.push(inspector);
606-
}
606+
ret.push(space.as_inspector());
607607
});
608608
ret
609609
}

src/policy/copyspace.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ impl<VM: VMBinding> Space<VM> for CopySpace<VM> {
111111
self
112112
}
113113

114+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
115+
self
116+
}
117+
114118
fn get_page_resource(&self) -> &dyn PageResource<VM> {
115119
&self.pr
116120
}
@@ -160,6 +164,22 @@ impl<VM: VMBinding> crate::policy::gc_work::PolicyTraceObject<VM> for CopySpace<
160164
}
161165
}
162166

167+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
168+
impl<VM: VMBinding> SpaceInspector for CopySpace<VM> {
169+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
170+
crate::util::heap::inspection::into_regions::<crate::util::heap::chunk_map::Chunk>(
171+
&mut self.pr.iterate_allocated_regions(),
172+
)
173+
}
174+
175+
fn list_sub_regions(
176+
&self,
177+
_parent_region: &dyn RegionInspector,
178+
) -> Vec<Box<dyn RegionInspector>> {
179+
vec![]
180+
}
181+
}
182+
163183
impl<VM: VMBinding> CopySpace<VM> {
164184
pub fn new(args: crate::policy::space::PlanCreateSpaceArgs<VM>, from_space: bool) -> Self {
165185
let vm_map = args.vm_map;

src/policy/immix/immixspace.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ impl<VM: VMBinding> Space<VM> for ImmixSpace<VM> {
167167
fn as_sft(&self) -> &(dyn SFT + Sync + 'static) {
168168
self
169169
}
170-
fn as_inspector(&self) -> Option<&dyn crate::util::heap::inspection::SpaceInspector> {
171-
Some(self)
170+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
171+
self
172172
}
173173
fn get_page_resource(&self) -> &dyn PageResource<VM> {
174174
&self.pr
@@ -412,7 +412,7 @@ impl<VM: VMBinding> ImmixSpace<VM> {
412412
if self.common.needs_log_bit {
413413
if let MetadataSpec::OnSide(side) = *VM::VMObjectModel::GLOBAL_LOG_BIT_SPEC {
414414
for chunk in self.chunk_map.all_chunks() {
415-
side.bzero_metadata(chunk .start(), Chunk::BYTES);
415+
side.bzero_metadata(chunk.start(), Chunk::BYTES);
416416
}
417417
}
418418
}
@@ -1184,24 +1184,28 @@ impl ClearVOBitsAfterPrepare {
11841184

11851185
mod inspector {
11861186
use super::*;
1187-
use crate::util::heap::inspection::{RegionInspector, SpaceInspector, list_child_regions};
1187+
use crate::util::heap::inspection::{list_sub_regions, RegionInspector, SpaceInspector};
11881188
impl<VM: VMBinding> SpaceInspector for ImmixSpace<VM> {
1189-
fn name(&self) -> &str {
1190-
SFT::name(self)
1189+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
1190+
self.chunk_map
1191+
.all_chunks()
1192+
.map(|r: Chunk| Box::new(r) as Box<dyn RegionInspector>)
1193+
.collect()
11911194
}
11921195

1193-
fn list_regions(&self, parent_region: Option<&dyn RegionInspector>) -> Vec<Box<dyn RegionInspector>> {
1194-
if let Some(parent_region) = parent_region {
1195-
list_child_regions::<Chunk, Block>(parent_region).or_else(|| {
1196-
if !crate::policy::immix::BLOCK_ONLY {
1197-
list_child_regions::<Block, Line>(parent_region)
1198-
} else {
1199-
None
1200-
}
1201-
}).unwrap_or_else(|| vec![])
1202-
} else {
1203-
self.chunk_map.all_chunks().map(|r: Chunk| Box::new(r) as Box<dyn RegionInspector>).collect()
1196+
fn list_sub_regions(
1197+
&self,
1198+
parent_region: &dyn RegionInspector,
1199+
) -> Vec<Box<dyn RegionInspector>> {
1200+
if let Some(regions) = list_sub_regions::<Chunk, Block>(parent_region) {
1201+
return regions;
1202+
}
1203+
if !crate::policy::immix::BLOCK_ONLY {
1204+
if let Some(regions) = list_sub_regions::<Block, Line>(parent_region) {
1205+
return regions;
1206+
}
12041207
}
1208+
vec![]
12051209
}
12061210
}
12071211
}

src/policy/immortalspace.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ impl<VM: VMBinding> Space<VM> for ImmortalSpace<VM> {
9696
fn as_sft(&self) -> &(dyn SFT + Sync + 'static) {
9797
self
9898
}
99+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
100+
self
101+
}
99102
fn get_page_resource(&self) -> &dyn PageResource<VM> {
100103
&self.pr
101104
}
@@ -227,3 +230,23 @@ impl<VM: VMBinding> ImmortalSpace<VM> {
227230
object
228231
}
229232
}
233+
234+
mod inspector {
235+
use super::*;
236+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
237+
238+
impl<VM: VMBinding> SpaceInspector for ImmortalSpace<VM> {
239+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
240+
crate::util::heap::inspection::into_regions::<crate::util::heap::chunk_map::Chunk>(
241+
&mut self.pr.iterate_allocated_regions(),
242+
)
243+
}
244+
245+
fn list_sub_regions(
246+
&self,
247+
_parent_region: &dyn RegionInspector,
248+
) -> Vec<Box<dyn RegionInspector>> {
249+
vec![]
250+
}
251+
}
252+
}

src/policy/largeobjectspace.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ impl<VM: VMBinding> Space<VM> for LargeObjectSpace<VM> {
154154
fn as_sft(&self) -> &(dyn SFT + Sync + 'static) {
155155
self
156156
}
157+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
158+
self
159+
}
157160
fn get_page_resource(&self) -> &dyn PageResource<VM> {
158161
&self.pr
159162
}
@@ -380,3 +383,24 @@ impl<VM: VMBinding> LargeObjectSpace<VM> {
380383
fn get_super_page(cell: Address) -> Address {
381384
cell.align_down(BYTES_IN_PAGE)
382385
}
386+
387+
mod inspector {
388+
use super::*;
389+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
390+
391+
impl<VM: VMBinding> SpaceInspector for LargeObjectSpace<VM> {
392+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
393+
let space = unsafe { &*(self as *const Self) };
394+
vec![Box::new(crate::util::heap::inspection::SpaceAsRegion::new(
395+
space,
396+
))]
397+
}
398+
399+
fn list_sub_regions(
400+
&self,
401+
_parent_region: &dyn RegionInspector,
402+
) -> Vec<Box<dyn RegionInspector>> {
403+
vec![]
404+
}
405+
}
406+
}

src/policy/lockfreeimmortalspace.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ impl<VM: VMBinding> Space<VM> for LockFreeImmortalSpace<VM> {
108108
fn as_sft(&self) -> &(dyn SFT + Sync + 'static) {
109109
self
110110
}
111+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
112+
self
113+
}
111114
fn get_page_resource(&self) -> &dyn PageResource<VM> {
112115
unimplemented!()
113116
}
@@ -271,3 +274,24 @@ impl<VM: VMBinding> LockFreeImmortalSpace<VM> {
271274
space
272275
}
273276
}
277+
278+
mod inspector {
279+
use super::*;
280+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
281+
282+
impl<VM: VMBinding> SpaceInspector for LockFreeImmortalSpace<VM> {
283+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
284+
let space = unsafe { &*(self as *const Self) };
285+
vec![Box::new(crate::util::heap::inspection::SpaceAsRegion::new(
286+
space,
287+
))]
288+
}
289+
290+
fn list_sub_regions(
291+
&self,
292+
_parent_region: &dyn RegionInspector,
293+
) -> Vec<Box<dyn RegionInspector>> {
294+
vec![]
295+
}
296+
}
297+
}

src/policy/markcompactspace.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ impl<VM: VMBinding> Space<VM> for MarkCompactSpace<VM> {
113113
self
114114
}
115115

116+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
117+
self
118+
}
119+
116120
fn get_page_resource(&self) -> &dyn PageResource<VM> {
117121
&self.pr
118122
}
@@ -438,3 +442,23 @@ impl<VM: VMBinding> crate::util::linear_scan::LinearScanObjectSize for MarkCompa
438442
VM::VMObjectModel::get_current_size(object)
439443
}
440444
}
445+
446+
mod inspector {
447+
use super::*;
448+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
449+
450+
impl<VM: VMBinding> SpaceInspector for MarkCompactSpace<VM> {
451+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
452+
crate::util::heap::inspection::into_regions::<crate::util::heap::chunk_map::Chunk>(
453+
&mut self.pr.iterate_allocated_regions(),
454+
)
455+
}
456+
457+
fn list_sub_regions(
458+
&self,
459+
_parent_region: &dyn RegionInspector,
460+
) -> Vec<Box<dyn RegionInspector>> {
461+
vec![]
462+
}
463+
}
464+
}

src/policy/marksweepspace/malloc_ms/global.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ impl<VM: VMBinding> Space<VM> for MallocSpace<VM> {
149149
self
150150
}
151151

152+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
153+
self
154+
}
155+
152156
fn get_page_resource(&self) -> &dyn PageResource<VM> {
153157
unreachable!()
154158
}
@@ -895,3 +899,23 @@ impl<VM: VMBinding> GCWork<VM> for MSSweepChunk<VM> {
895899
self.ms.sweep_chunk(self.chunk);
896900
}
897901
}
902+
903+
mod inspector {
904+
use super::*;
905+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
906+
impl<VM: VMBinding> SpaceInspector for MallocSpace<VM> {
907+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
908+
self.chunk_map
909+
.all_chunks()
910+
.map(|r: Chunk| Box::new(r) as Box<dyn RegionInspector>)
911+
.collect()
912+
}
913+
914+
fn list_sub_regions(
915+
&self,
916+
_parent_region: &dyn RegionInspector,
917+
) -> Vec<Box<dyn RegionInspector>> {
918+
vec![]
919+
}
920+
}
921+
}

src/policy/marksweepspace/native_ms/global.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ impl<VM: VMBinding> Space<VM> for MarkSweepSpace<VM> {
231231
self
232232
}
233233

234+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
235+
self
236+
}
237+
234238
fn get_page_resource(&self) -> &dyn crate::util::heap::PageResource<VM> {
235239
&self.pr
236240
}
@@ -667,3 +671,26 @@ impl<VM: VMBinding> Drop for RecycleBlocks<VM> {
667671
epilogue::debug_assert_counter_zero(&self.counter, "RecycleBlocks::counter");
668672
}
669673
}
674+
675+
mod inspector {
676+
use super::*;
677+
use crate::util::heap::inspection::{list_sub_regions, RegionInspector, SpaceInspector};
678+
impl<VM: VMBinding> SpaceInspector for MarkSweepSpace<VM> {
679+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
680+
self.chunk_map
681+
.all_chunks()
682+
.map(|r: Chunk| Box::new(r) as Box<dyn RegionInspector>)
683+
.collect()
684+
}
685+
686+
fn list_sub_regions(
687+
&self,
688+
parent_region: &dyn RegionInspector,
689+
) -> Vec<Box<dyn RegionInspector>> {
690+
if let Some(regions) = list_sub_regions::<Chunk, Block>(parent_region) {
691+
return regions;
692+
}
693+
vec![]
694+
}
695+
}
696+
}

src/policy/space.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ use downcast_rs::Downcast;
4343
pub trait Space<VM: VMBinding>: 'static + SFT + Sync + Downcast {
4444
fn as_space(&self) -> &dyn Space<VM>;
4545
fn as_sft(&self) -> &(dyn SFT + Sync + 'static);
46-
fn as_inspector(&self) -> Option<&dyn SpaceInspector> {
47-
None
48-
}
46+
fn as_inspector(&self) -> &dyn SpaceInspector;
4947
fn get_page_resource(&self) -> &dyn PageResource<VM>;
5048

5149
/// Get a mutable reference to the underlying page resource, or `None` if the space does not

src/policy/vmspace.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ impl<VM: VMBinding> Space<VM> for VMSpace<VM> {
9999
fn as_sft(&self) -> &(dyn SFT + Sync + 'static) {
100100
self
101101
}
102+
fn as_inspector(&self) -> &dyn crate::util::heap::inspection::SpaceInspector {
103+
self
104+
}
102105
fn get_page_resource(&self) -> &dyn PageResource<VM> {
103106
&self.pr
104107
}
@@ -300,3 +303,24 @@ impl<VM: VMBinding> VMSpace<VM> {
300303
object
301304
}
302305
}
306+
307+
mod inspector {
308+
use super::*;
309+
use crate::util::heap::inspection::{RegionInspector, SpaceInspector};
310+
311+
impl<VM: VMBinding> SpaceInspector for VMSpace<VM> {
312+
fn list_top_regions(&self) -> Vec<Box<dyn RegionInspector>> {
313+
let space = unsafe { &*(self as *const Self) };
314+
vec![Box::new(crate::util::heap::inspection::SpaceAsRegion::new(
315+
space,
316+
))]
317+
}
318+
319+
fn list_sub_regions(
320+
&self,
321+
_parent_region: &dyn RegionInspector,
322+
) -> Vec<Box<dyn RegionInspector>> {
323+
vec![]
324+
}
325+
}
326+
}

src/util/heap/freelistpageresource.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ impl<VM: VMBinding> PageResource<VM> for FreeListPageResource<VM> {
9393
};
9494
new_chunk = true;
9595
}
96-
9796
if page_offset == freelist::FAILURE {
9897
return Result::Err(PRAllocFail);
9998
} else {

0 commit comments

Comments
 (0)