Skip to content

Commit 72c9b56

Browse files
authored
Edge trait (#160)
Use the new API with Edge trait This commit aims to be a minimal change. We add the Edge trait to API functions, but we still implement Edge with Address so that it still behaves like before.
1 parent 27e5882 commit 72c9b56

File tree

6 files changed

+43
-30
lines changed

6 files changed

+43
-30
lines changed

mmtk/Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mmtk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ once_cell = "1.10.0"
2929
# - change branch
3030
# - change repo name
3131
# But other changes including adding/removing whitespaces in commented lines may break the CI.
32-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "d8bcf90991224cfe06153689b14c3e1eea0e025e" }
32+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "76131c493be38e421f5fb157f9900f850584554f" }
3333
# Uncomment the following to build locally
3434
# mmtk = { path = "../repos/mmtk-core" }
3535

mmtk/src/gc_work.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
use std::sync::atomic::Ordering;
22

3-
use super::{OpenJDK, UPCALLS};
3+
use super::{OpenJDK, OpenJDKEdge, UPCALLS};
44
use mmtk::scheduler::*;
55
use mmtk::vm::RootsWorkFactory;
66
use mmtk::MMTK;
77
use scanning::to_edges_closure;
88

99
macro_rules! scan_roots_work {
1010
($struct_name: ident, $func_name: ident) => {
11-
pub struct $struct_name<F: RootsWorkFactory> {
11+
pub struct $struct_name<F: RootsWorkFactory<OpenJDKEdge>> {
1212
factory: F,
1313
}
1414

15-
impl<F: RootsWorkFactory> $struct_name<F> {
15+
impl<F: RootsWorkFactory<OpenJDKEdge>> $struct_name<F> {
1616
pub fn new(factory: F) -> Self {
1717
Self { factory }
1818
}
1919
}
2020

21-
impl<F: RootsWorkFactory> GCWork<OpenJDK> for $struct_name<F> {
21+
impl<F: RootsWorkFactory<OpenJDKEdge>> GCWork<OpenJDK> for $struct_name<F> {
2222
fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) {
2323
unsafe {
2424
((*UPCALLS).$func_name)(to_edges_closure(&mut self.factory));
@@ -43,17 +43,17 @@ scan_roots_work!(
4343
scan_roots_work!(ScanWeakProcessorRoots, scan_weak_processor_roots);
4444
scan_roots_work!(ScanVMThreadRoots, scan_vm_thread_roots);
4545

46-
pub struct ScanCodeCacheRoots<F: RootsWorkFactory> {
46+
pub struct ScanCodeCacheRoots<F: RootsWorkFactory<OpenJDKEdge>> {
4747
factory: F,
4848
}
4949

50-
impl<F: RootsWorkFactory> ScanCodeCacheRoots<F> {
50+
impl<F: RootsWorkFactory<OpenJDKEdge>> ScanCodeCacheRoots<F> {
5151
pub fn new(factory: F) -> Self {
5252
Self { factory }
5353
}
5454
}
5555

56-
impl<F: RootsWorkFactory> GCWork<OpenJDK> for ScanCodeCacheRoots<F> {
56+
impl<F: RootsWorkFactory<OpenJDKEdge>> GCWork<OpenJDK> for ScanCodeCacheRoots<F> {
5757
fn do_work(&mut self, _worker: &mut GCWorker<OpenJDK>, _mmtk: &'static MMTK<OpenJDK>) {
5858
// Collect all the cached roots
5959
let mut edges = Vec::with_capacity(crate::CODE_CACHE_ROOTS_SIZE.load(Ordering::Relaxed));

mmtk/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,21 @@ pub static GLOBAL_ALLOC_BIT_ADDRESS: uintptr_t =
114114
#[derive(Default)]
115115
pub struct OpenJDK;
116116

117+
/// The type of edges in OpenJDK.
118+
///
119+
/// TODO: We currently make it an alias to Address to make the change minimal.
120+
/// If we support CompressedOOPs, we should define an enum type to support both
121+
/// compressed and uncompressed OOPs.
122+
pub type OpenJDKEdge = Address;
123+
117124
impl VMBinding for OpenJDK {
118125
type VMObjectModel = object_model::VMObjectModel;
119126
type VMScanning = scanning::VMScanning;
120127
type VMCollection = collection::VMCollection;
121128
type VMActivePlan = active_plan::VMActivePlan;
122129
type VMReferenceGlue = reference_glue::VMReferenceGlue;
130+
131+
type VMEdge = OpenJDKEdge;
123132
}
124133

125134
use std::sync::atomic::AtomicBool;

mmtk/src/object_scanning.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
use super::abi::*;
2-
use super::UPCALLS;
2+
use super::{OpenJDKEdge, UPCALLS};
33
use mmtk::util::constants::*;
44
use mmtk::util::opaque_pointer::*;
55
use mmtk::util::{Address, ObjectReference};
66
use mmtk::vm::EdgeVisitor;
77
use std::{mem, slice};
88

99
trait OopIterate: Sized {
10-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor);
10+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>);
1111
}
1212

1313
impl OopIterate for OopMapBlock {
1414
#[inline]
15-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
15+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
1616
let start = oop.get_field_address(self.offset);
1717
for i in 0..self.count as usize {
1818
let edge = start + (i << LOG_BYTES_IN_ADDRESS);
@@ -23,7 +23,7 @@ impl OopIterate for OopMapBlock {
2323

2424
impl OopIterate for InstanceKlass {
2525
#[inline]
26-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
26+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
2727
let oop_maps = self.nonstatic_oop_maps();
2828
for map in oop_maps {
2929
map.oop_iterate(oop, closure)
@@ -33,7 +33,7 @@ impl OopIterate for InstanceKlass {
3333

3434
impl OopIterate for InstanceMirrorKlass {
3535
#[inline]
36-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
36+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
3737
self.instance_klass.oop_iterate(oop, closure);
3838
// if (Devirtualizer::do_metadata(closure)) {
3939
// Klass* klass = java_lang_Class::as_Klass(obj);
@@ -74,7 +74,7 @@ impl OopIterate for InstanceMirrorKlass {
7474

7575
impl OopIterate for InstanceClassLoaderKlass {
7676
#[inline]
77-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
77+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
7878
self.instance_klass.oop_iterate(oop, closure);
7979
// if (Devirtualizer::do_metadata(closure)) {
8080
// ClassLoaderData* cld = java_lang_ClassLoader::loader_data(obj);
@@ -88,7 +88,7 @@ impl OopIterate for InstanceClassLoaderKlass {
8888

8989
impl OopIterate for ObjArrayKlass {
9090
#[inline]
91-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
91+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
9292
let array = unsafe { oop.as_array_oop() };
9393
for oop in unsafe { array.data::<Oop>(BasicType::T_OBJECT) } {
9494
closure.visit_edge(Address::from_ref(oop as &Oop));
@@ -98,15 +98,15 @@ impl OopIterate for ObjArrayKlass {
9898

9999
impl OopIterate for TypeArrayKlass {
100100
#[inline]
101-
fn oop_iterate(&self, _oop: Oop, _closure: &mut impl EdgeVisitor) {
101+
fn oop_iterate(&self, _oop: Oop, _closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
102102
// Performance tweak: We skip processing the klass pointer since all
103103
// TypeArrayKlasses are guaranteed processed via the null class loader.
104104
}
105105
}
106106

107107
impl OopIterate for InstanceRefKlass {
108108
#[inline]
109-
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) {
109+
fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
110110
use crate::abi::*;
111111
use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate};
112112
self.instance_klass.oop_iterate(oop, closure);
@@ -139,7 +139,7 @@ impl InstanceRefKlass {
139139
!*SINGLETON.get_options().no_reference_types
140140
}
141141
#[inline]
142-
fn process_ref_as_strong(oop: Oop, closure: &mut impl EdgeVisitor) {
142+
fn process_ref_as_strong(oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
143143
let referent_addr = Self::referent_address(oop);
144144
closure.visit_edge(referent_addr);
145145
let discovered_addr = Self::discovered_address(oop);
@@ -148,14 +148,14 @@ impl InstanceRefKlass {
148148
}
149149

150150
#[allow(unused)]
151-
fn oop_iterate_slow(oop: Oop, closure: &mut impl EdgeVisitor, tls: OpaquePointer) {
151+
fn oop_iterate_slow(oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>, tls: OpaquePointer) {
152152
unsafe {
153153
((*UPCALLS).scan_object)(closure as *mut _ as _, mem::transmute(oop), tls);
154154
}
155155
}
156156

157157
#[inline]
158-
fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) {
158+
fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor<OpenJDKEdge>) {
159159
let klass_id = oop.klass.id;
160160
debug_assert!(
161161
klass_id as i32 >= 0 && (klass_id as i32) < 6,
@@ -192,7 +192,11 @@ fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) {
192192
}
193193

194194
#[inline]
195-
pub fn scan_object(object: ObjectReference, closure: &mut impl EdgeVisitor, _tls: VMWorkerThread) {
195+
pub fn scan_object(
196+
object: ObjectReference,
197+
closure: &mut impl EdgeVisitor<OpenJDKEdge>,
198+
_tls: VMWorkerThread,
199+
) {
196200
// println!("*****scan_object(0x{:x}) -> \n 0x{:x}, 0x{:x} \n",
197201
// object,
198202
// unsafe { *(object.value() as *const usize) },

mmtk/src/scanning.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::gc_work::*;
2-
use super::{NewBuffer, SINGLETON, UPCALLS};
2+
use super::{NewBuffer, OpenJDKEdge, SINGLETON, UPCALLS};
33
use crate::{EdgesClosure, OpenJDK};
44
use mmtk::memory_manager;
55
use mmtk::scheduler::WorkBucketStage;
@@ -13,7 +13,7 @@ pub struct VMScanning {}
1313

1414
const WORK_PACKET_CAPACITY: usize = 4096;
1515

16-
extern "C" fn report_edges_and_renew_buffer<F: RootsWorkFactory>(
16+
extern "C" fn report_edges_and_renew_buffer<F: RootsWorkFactory<OpenJDKEdge>>(
1717
ptr: *mut Address,
1818
length: usize,
1919
capacity: usize,
@@ -34,7 +34,7 @@ extern "C" fn report_edges_and_renew_buffer<F: RootsWorkFactory>(
3434
NewBuffer { ptr, capacity }
3535
}
3636

37-
pub(crate) fn to_edges_closure<F: RootsWorkFactory>(factory: &mut F) -> EdgesClosure {
37+
pub(crate) fn to_edges_closure<F: RootsWorkFactory<OpenJDKEdge>>(factory: &mut F) -> EdgesClosure {
3838
EdgesClosure {
3939
func: report_edges_and_renew_buffer::<F> as *const _,
4040
data: factory as *mut F as *mut libc::c_void,
@@ -45,7 +45,7 @@ impl Scanning<OpenJDK> for VMScanning {
4545
const SCAN_MUTATORS_IN_SAFEPOINT: bool = false;
4646
const SINGLE_THREAD_MUTATOR_SCANNING: bool = false;
4747

48-
fn scan_object<EV: EdgeVisitor>(
48+
fn scan_object<EV: EdgeVisitor<OpenJDKEdge>>(
4949
tls: VMWorkerThread,
5050
object: ObjectReference,
5151
edge_visitor: &mut EV,
@@ -58,7 +58,7 @@ impl Scanning<OpenJDK> for VMScanning {
5858
// TODO
5959
}
6060

61-
fn scan_thread_roots(_tls: VMWorkerThread, mut factory: impl RootsWorkFactory) {
61+
fn scan_thread_roots(_tls: VMWorkerThread, mut factory: impl RootsWorkFactory<OpenJDKEdge>) {
6262
unsafe {
6363
((*UPCALLS).scan_all_thread_roots)(to_edges_closure(&mut factory));
6464
}
@@ -67,15 +67,15 @@ impl Scanning<OpenJDK> for VMScanning {
6767
fn scan_thread_root(
6868
_tls: VMWorkerThread,
6969
mutator: &'static mut Mutator<OpenJDK>,
70-
mut factory: impl RootsWorkFactory,
70+
mut factory: impl RootsWorkFactory<OpenJDKEdge>,
7171
) {
7272
let tls = mutator.get_tls();
7373
unsafe {
7474
((*UPCALLS).scan_thread_roots)(to_edges_closure(&mut factory), tls);
7575
}
7676
}
7777

78-
fn scan_vm_specific_roots(_tls: VMWorkerThread, factory: impl RootsWorkFactory) {
78+
fn scan_vm_specific_roots(_tls: VMWorkerThread, factory: impl RootsWorkFactory<OpenJDKEdge>) {
7979
memory_manager::add_work_packets(
8080
&SINGLETON,
8181
WorkBucketStage::Prepare,

0 commit comments

Comments
 (0)