Skip to content

Commit f6b7614

Browse files
committed
WIP
1 parent 18d35d8 commit f6b7614

File tree

7 files changed

+55
-19
lines changed

7 files changed

+55
-19
lines changed

mmtk/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ openjdk_version = "67d5d2b16aacb2ea948552fab2323ebd0abbe924"
2020
[dependencies]
2121
libc = "0.2"
2222
lazy_static = "1.1"
23+
log = {version = "0.4", features = ["max_level_trace", "release_max_level_off"] }
2324
# Be very careful to commit any changes to the following mmtk dependency, as our CI scripts (including mmtk-core CI)
2425
# rely on matching these lines to modify them: e.g. comment out the git dependency and use the local path.
2526
# These changes are safe:
2627
# - change branch
2728
# - change repo name
2829
# But other changes including adding/removing whitespaces in commented lines may break the CI.
29-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dbd152b29ff54c3f028318e73ac182d681deda9a" }
30+
# mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dbd152b29ff54c3f028318e73ac182d681deda9a" }
3031
# Uncomment the following to build locally
31-
# mmtk = { path = "../repos/mmtk-core" }
32+
mmtk = { path = "/home/yilin/Code/mmtk-core" }
3233

3334
[features]
3435
default = []

mmtk/src/abi.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pub struct InstanceKlass {
131131
// #endif
132132
pub idnum_allocated_count: u16,
133133
pub init_state: u8,
134-
pub reference_type: u8,
134+
pub reference_type: ReferenceType,
135135
pub this_class_index: u16,
136136
// #if INCLUDE_JVMTI
137137
pub jvmti_cached_class_field_map: OpaquePointer, // JvmtiCachedClassFieldMap*
@@ -147,6 +147,18 @@ pub struct InstanceKlass {
147147
pub fields: OpaquePointer, // Array<u2>*
148148
}
149149

150+
#[repr(u8)]
151+
#[derive(Copy, Clone, Debug)]
152+
#[allow(dead_code)]
153+
pub enum ReferenceType {
154+
None, // Regular class
155+
Other, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
156+
Soft, // Subclass of java/lang/ref/SoftReference
157+
Weak, // Subclass of java/lang/ref/WeakReference
158+
Final, // Subclass of java/lang/ref/FinalReference
159+
Phantom // Subclass of java/lang/ref/PhantomReference
160+
}
161+
150162
impl InstanceKlass {
151163
const HEADER_SIZE: usize = mem::size_of::<Self>() / BYTES_IN_WORD;
152164
const VTABLE_START_OFFSET: usize = Self::HEADER_SIZE * BYTES_IN_WORD;

mmtk/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ extern crate libc;
99
extern crate mmtk;
1010
#[macro_use]
1111
extern crate lazy_static;
12+
#[macro_use]
13+
extern crate log;
1214

1315
use std::ptr::null_mut;
1416

@@ -83,7 +85,7 @@ pub struct OpenJDK_Upcalls {
8385
pub number_of_mutators: extern "C" fn() -> usize,
8486
pub schedule_finalizer: extern "C" fn(),
8587
pub prepare_for_roots_re_scanning: extern "C" fn(),
86-
pub object_alignment: extern "C" fn() -> i32,
88+
pub enqueue_reference: extern "C" fn(object: ObjectReference),
8789
}
8890

8991
pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut();

mmtk/src/object_scanning.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,24 @@ impl OopIterate for TypeArrayKlass {
111111
impl OopIterate for InstanceRefKlass {
112112
#[inline]
113113
fn oop_iterate(&self, oop: Oop, closure: &mut impl TransitiveClosure) {
114+
use crate::api::{add_weak_candidate, add_soft_candidate, add_phantom_candidate};
115+
use crate::abi::*;
114116
self.instance_klass.oop_iterate(oop, closure);
115-
let referent_addr = Self::referent_address(oop);
116-
closure.process_edge(referent_addr);
117-
let discovered_addr = Self::discovered_address(oop);
118-
closure.process_edge(discovered_addr);
117+
118+
let reference = ObjectReference::from(oop);
119+
let referent = unsafe { Self::referent_address(oop).load::<ObjectReference>() };
120+
match self.instance_klass.reference_type {
121+
ReferenceType::None => panic!("oop_iterate on InstanceRefKlass with reference_type as None"),
122+
ReferenceType::Weak => add_weak_candidate(reference, referent),
123+
ReferenceType::Soft => add_soft_candidate(reference, referent),
124+
ReferenceType::Phantom => add_phantom_candidate(reference, referent),
125+
_ => {
126+
let referent_addr = Self::referent_address(oop);
127+
closure.process_edge(referent_addr);
128+
let discovered_addr = Self::discovered_address(oop);
129+
closure.process_edge(discovered_addr);
130+
}
131+
}
119132
}
120133
}
121134

mmtk/src/reference_glue.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
use crate::OpenJDK;
2+
use crate::abi::{InstanceRefKlass, Oop};
23
use mmtk::util::opaque_pointer::VMWorkerThread;
34
use mmtk::util::ObjectReference;
45
use mmtk::vm::ReferenceGlue;
5-
use mmtk::TraceLocal;
6+
use mmtk::scheduler::ProcessEdgesWork;
7+
use crate::UPCALLS;
68

79
pub struct VMReferenceGlue {}
810

911
impl ReferenceGlue<OpenJDK> for VMReferenceGlue {
10-
fn set_referent(_reff: ObjectReference, _referent: ObjectReference) {
11-
unimplemented!()
12+
fn set_referent(reff: ObjectReference, referent: ObjectReference) {
13+
let oop = Oop::from(reff);
14+
unsafe { InstanceRefKlass::referent_address(oop).store(referent) };
1215
}
13-
fn get_referent(_object: ObjectReference) -> ObjectReference {
14-
unimplemented!()
16+
fn get_referent(object: ObjectReference) -> ObjectReference {
17+
let oop = Oop::from(object);
18+
unsafe { InstanceRefKlass::referent_address(oop).load::<ObjectReference>() }
1519
}
16-
fn process_reference<T: TraceLocal>(
17-
_trace: &mut T,
18-
_reference: ObjectReference,
19-
_tls: VMWorkerThread,
20-
) -> ObjectReference {
21-
unimplemented!()
20+
fn enqueue_reference(object: ObjectReference) {
21+
unsafe {
22+
((*UPCALLS).enqueue_reference)(object);
23+
}
2224
}
2325
}

openjdk/mmtk.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ typedef struct {
144144
size_t (*number_of_mutators)();
145145
void (*schedule_finalizer)();
146146
void (*prepare_for_roots_re_scanning)();
147+
void (*enqueue_reference)(void* object);
147148
} OpenJDK_Upcalls;
148149

149150
extern void openjdk_gc_init(OpenJDK_Upcalls *calls, size_t heap_size);

openjdk/mmtkUpcalls.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ static void mmtk_prepare_for_roots_re_scanning() {
319319
#endif
320320
}
321321

322+
static void mmtk_enqueue_reference(void* object) {
323+
printf("enqueue object: %p\n", object);
324+
}
325+
322326
OpenJDK_Upcalls mmtk_upcalls = {
323327
mmtk_stop_all_mutators,
324328
mmtk_resume_mutators,
@@ -360,4 +364,5 @@ OpenJDK_Upcalls mmtk_upcalls = {
360364
mmtk_number_of_mutators,
361365
mmtk_schedule_finalizer,
362366
mmtk_prepare_for_roots_re_scanning,
367+
mmtk_enqueue_reference,
363368
};

0 commit comments

Comments
 (0)