Skip to content

Commit 3d98c8b

Browse files
wksmmtkgc-bot
andauthored
Remove NULL ObjectReference (#265)
Upstream PR: mmtk/mmtk-core#1064 --------- Co-authored-by: mmtkgc-bot <[email protected]>
1 parent 589c9ee commit 3d98c8b

File tree

6 files changed

+99
-67
lines changed

6 files changed

+99
-67
lines changed

mmtk/Cargo.lock

Lines changed: 49 additions & 41 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
@@ -32,7 +32,7 @@ memoffset = "0.9.0"
3232
# - change branch
3333
# - change repo name
3434
# But other changes including adding/removing whitespaces in commented lines may break the CI.
35-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "e79e94e744660c486d5471f252ff05c4248bcea9" }
35+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a02803b4104519ff2289234101a2dd8ceedd1bc7" }
3636
# Uncomment the following to build locally
3737
# mmtk = { path = "../repos/mmtk-core" }
3838

mmtk/src/api.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use mmtk::memory_manager;
88
use mmtk::plan::BarrierSelector;
99
use mmtk::scheduler::GCWorker;
1010
use mmtk::util::alloc::AllocatorSelector;
11+
use mmtk::util::api_util::NullableObjectReference;
1112
use mmtk::util::opaque_pointer::*;
1213
use mmtk::util::{Address, ObjectReference};
1314
use mmtk::AllocationSemantics;
@@ -492,13 +493,8 @@ pub extern "C" fn add_finalizer(object: ObjectReference) {
492493
}
493494

494495
#[no_mangle]
495-
pub extern "C" fn get_finalized_object() -> ObjectReference {
496-
with_singleton!(|singleton| {
497-
match memory_manager::get_finalized_object(singleton) {
498-
Some(obj) => obj,
499-
None => ObjectReference::NULL,
500-
}
501-
})
496+
pub extern "C" fn get_finalized_object() -> NullableObjectReference {
497+
with_singleton!(|singleton| memory_manager::get_finalized_object(singleton).into())
502498
}
503499

504500
thread_local! {

mmtk/src/edges.rs

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -127,37 +127,57 @@ impl<const COMPRESSED: bool> OpenJDKEdge<COMPRESSED> {
127127

128128
/// encode an object pointer to its u32 compressed form
129129
fn compress(o: ObjectReference) -> u32 {
130-
if o.is_null() {
131-
0u32
132-
} else {
133-
((o.to_raw_address() - BASE.load(Ordering::Relaxed)) >> SHIFT.load(Ordering::Relaxed))
134-
as u32
135-
}
130+
((o.to_raw_address() - BASE.load(Ordering::Relaxed)) >> SHIFT.load(Ordering::Relaxed))
131+
as u32
136132
}
137133

138134
/// decode an object pointer from its u32 compressed form
139-
fn decompress(v: u32) -> ObjectReference {
135+
fn decompress(v: u32) -> Option<ObjectReference> {
140136
if v == 0 {
141-
ObjectReference::NULL
137+
None
138+
} else {
139+
// Note on `unsafe`: `v` must be positive here, so the result must be positive.
140+
let objref = unsafe {
141+
ObjectReference::from_raw_address_unchecked(
142+
BASE.load(Ordering::Relaxed) + ((v as usize) << SHIFT.load(Ordering::Relaxed)),
143+
)
144+
};
145+
Some(objref)
146+
}
147+
}
148+
149+
/// Store a null reference in the slot.
150+
pub fn store_null(&self) {
151+
if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
152+
if COMPRESSED {
153+
if self.is_compressed() {
154+
self.x86_write_unaligned::<u32, true>(0)
155+
} else {
156+
self.x86_write_unaligned::<Address, true>(Address::ZERO)
157+
}
158+
} else {
159+
self.x86_write_unaligned::<Address, false>(Address::ZERO)
160+
}
142161
} else {
143-
ObjectReference::from_raw_address(
144-
BASE.load(Ordering::Relaxed) + ((v as usize) << SHIFT.load(Ordering::Relaxed)),
145-
)
162+
debug_assert!(!COMPRESSED);
163+
unsafe { self.addr.store(0) }
146164
}
147165
}
148166
}
149167

150168
impl<const COMPRESSED: bool> Edge for OpenJDKEdge<COMPRESSED> {
151-
fn load(&self) -> ObjectReference {
169+
fn load(&self) -> Option<ObjectReference> {
152170
if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
153171
if COMPRESSED {
154172
if self.is_compressed() {
155173
Self::decompress(self.x86_read_unaligned::<u32, true>())
156174
} else {
157-
self.x86_read_unaligned::<ObjectReference, true>()
175+
let addr = self.x86_read_unaligned::<Address, true>();
176+
ObjectReference::from_raw_address(addr)
158177
}
159178
} else {
160-
self.x86_read_unaligned::<ObjectReference, false>()
179+
let addr = self.x86_read_unaligned::<Address, false>();
180+
ObjectReference::from_raw_address(addr)
161181
}
162182
} else {
163183
debug_assert!(!COMPRESSED);

mmtk/src/object_model.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ impl<const COMPRESSED: bool> ObjectModel<OpenJDK<COMPRESSED>> for VMObjectModel<
2828
) -> ObjectReference {
2929
let bytes = unsafe { Oop::from(from).size::<COMPRESSED>() };
3030
let dst = copy_context.alloc_copy(from, bytes, ::std::mem::size_of::<usize>(), 0, copy);
31+
debug_assert!(!dst.is_zero());
3132
// Copy
3233
let src = from.to_raw_address();
3334
unsafe { std::ptr::copy_nonoverlapping::<u8>(src.to_ptr(), dst.to_mut_ptr(), bytes) }
34-
let to_obj = ObjectReference::from_raw_address(dst);
35+
// Note on onsafe: `alloc_copy` never returns 0.
36+
let to_obj = unsafe { ObjectReference::from_raw_address_unchecked(dst) };
3537
copy_context.post_copy(to_obj, bytes, copy);
3638
to_obj
3739
}
@@ -56,7 +58,8 @@ impl<const COMPRESSED: bool> ObjectModel<OpenJDK<COMPRESSED>> for VMObjectModel<
5658
}
5759

5860
fn get_reference_when_copied_to(_from: ObjectReference, to: Address) -> ObjectReference {
59-
ObjectReference::from_raw_address(to)
61+
debug_assert!(!to.is_zero());
62+
unsafe { ObjectReference::from_raw_address_unchecked(to) }
6063
}
6164

6265
fn get_current_size(object: ObjectReference) -> usize {
@@ -93,7 +96,8 @@ impl<const COMPRESSED: bool> ObjectModel<OpenJDK<COMPRESSED>> for VMObjectModel<
9396
}
9497

9598
fn address_to_ref(address: Address) -> ObjectReference {
96-
ObjectReference::from_raw_address(address)
99+
debug_assert!(!address.is_zero());
100+
unsafe { ObjectReference::from_raw_address_unchecked(address) }
97101
}
98102

99103
fn dump_object(object: ObjectReference) {

0 commit comments

Comments
 (0)