From 357abe7db5f06adc14fd6c30ece3f96e8c7fd5e3 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Tue, 7 Jan 2025 17:00:56 +0800 Subject: [PATCH] Minor fixes --- src/policy/marksweepspace/native_ms/global.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/policy/marksweepspace/native_ms/global.rs b/src/policy/marksweepspace/native_ms/global.rs index 3a9bb37383..a83510f723 100644 --- a/src/policy/marksweepspace/native_ms/global.rs +++ b/src/policy/marksweepspace/native_ms/global.rs @@ -342,13 +342,15 @@ impl MarkSweepSpace { /// Mark an object atomically. fn attempt_mark_atomic(&self, object: ObjectReference) -> bool { + let mark_state = 1u8; + loop { let old_value = VM::VMObjectModel::LOCAL_MARK_BIT_SPEC.load_atomic::( object, None, Ordering::SeqCst, ); - if old_value == 1u8 { + if old_value == mark_state { return false; } @@ -356,7 +358,7 @@ impl MarkSweepSpace { .compare_exchange_metadata::( object, old_value, - 1u8, + mark_state, None, Ordering::SeqCst, Ordering::SeqCst, @@ -389,8 +391,7 @@ impl MarkSweepSpace { "Cannot mark an object {} that was not alloced by free list allocator.", object, ); - if !VM::VMObjectModel::LOCAL_MARK_BIT_SPEC.is_marked::(object, Ordering::SeqCst) { - VM::VMObjectModel::LOCAL_MARK_BIT_SPEC.mark::(object, Ordering::SeqCst); + if self.attempt_mark(object) { let block = Block::containing(object); block.set_state(BlockState::Marked); queue.enqueue(object);