Skip to content

Conversation

@qinsoon
Copy link
Member

@qinsoon qinsoon commented Oct 24, 2025

This PR made some changes to MockVM to allow us to run GC in the tests.

  • Add features mock_test_side_metadata and mock_test_header_metadata. We only test with mock_test_side_metadata (as some plans don't run with header metadata).
  • No longer use lock for the MockVM instance (otherwise it will cause deadlock when we reentry MockVM)
  • Statically initialize a MMTK instance for mock tests.
  • Mock tests now use mock_api to create a mutator. This registers the mutator to mock VM, and can be blocked for GC.
  • Mock tests now properly initialize GC threads, and handle panics in GC threads.
  • Minor changes to print more information for mmap failures.

@qinsoon qinsoon added the PR-extended-testing Run extended tests for the pull request label Oct 27, 2025
@qinsoon qinsoon requested a review from wks October 27, 2025 02:45
@qinsoon qinsoon marked this pull request as ready for review October 27, 2025 02:46
@wks
Copy link
Collaborator

wks commented Oct 27, 2025

std::sync::ReentrantLock is an unstable feature. But a third-party crate parking_lot has an implementation of ReentrantMutex. If that is helpful, we can add the parking_lot as a dependency when the mock_test feature is enabled.

}*/

pub fn reset_cursor(&self, top: Address) {
// top might be Address::ZERO
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is where I think Option<NonZeroAddress> can be useful. See #1223

fn next(&mut self) -> Option<<Self as Iterator>::Item> {
while self.cursor < self.end {
if !self.cursor.is_aligned_to(ObjectReference::ALIGNMENT) {
self.cursor += VM::MIN_ALIGNMENT;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently ObjectReference is required to be aligned to ObjectReference::ALIGNMENT. So even if VM::MIN_ALIGNMENT is smaller than ObjectReference::ALIGNMENT, VO bits can only be set at addresses which are multiples of ObjectReference::ALIGNMENT. I think the algorithm here is wrong (or just outdated). It is pointless to increment the cursor by VM::MIN_ALIGNMENT. It should simply align the cursor up to the next multiple of ObjectReference::ALIGNMENT. And I wonder whether find_last_non_zero_bit_in_metadata_bytes could be more efficient (needs to search forward instead of backward).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PR-extended-testing Run extended tests for the pull request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants