Skip to content

Commit 849233e

Browse files
committed
Update for mmtk/mmtk-core#817.
1 parent 30f95ff commit 849233e

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

mmtk/src/abi.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,10 @@ pub struct RubyUpcalls {
337337
pub resume_mutators: extern "C" fn(tls: VMWorkerThread),
338338
pub block_for_gc: extern "C" fn(tls: VMMutatorThread),
339339
pub number_of_mutators: extern "C" fn() -> usize,
340-
pub reset_mutator_iterator: extern "C" fn(),
341-
pub get_next_mutator: extern "C" fn() -> *mut RubyMutator,
340+
pub get_mutators: extern "C" fn(
341+
visit_mutator: extern "C" fn(*mut RubyMutator, *mut libc::c_void),
342+
data: *mut libc::c_void,
343+
),
342344
pub scan_vm_specific_roots: extern "C" fn(),
343345
pub scan_thread_roots: extern "C" fn(),
344346
pub scan_thread_root: extern "C" fn(mutator_tls: VMMutatorThread, worker_tls: VMWorkerThread),

mmtk/src/active_plan.rs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::marker::PhantomData;
2+
13
use crate::mmtk;
24
use crate::upcalls;
35
use crate::Ruby;
@@ -25,16 +27,39 @@ impl ActivePlan<Ruby> for VMActivePlan {
2527
unimplemented!()
2628
}
2729

28-
fn reset_mutator_iterator() {
29-
(upcalls().reset_mutator_iterator)();
30+
fn mutators<'a>() -> Box<dyn Iterator<Item = &'a mut Mutator<Ruby>> + 'a> {
31+
let mut mutators = vec![];
32+
(upcalls().get_mutators)(
33+
add_mutator_to_vec,
34+
&mut mutators as *mut Vec<*mut Mutator<Ruby>> as _,
35+
);
36+
37+
Box::new(RubyMutatorIterator {
38+
mutators,
39+
cursor: 0,
40+
phantom_data: PhantomData,
41+
})
3042
}
43+
}
44+
45+
extern "C" fn add_mutator_to_vec(mutator: *mut Mutator<Ruby>, mutators: *mut libc::c_void) {
46+
let mutators = unsafe { &mut *(mutators as *mut Vec<*mut Mutator<Ruby>>) };
47+
mutators.push(mutator);
48+
}
49+
50+
struct RubyMutatorIterator<'a> {
51+
mutators: Vec<*mut Mutator<Ruby>>,
52+
cursor: usize,
53+
phantom_data: PhantomData<&'a ()>,
54+
}
55+
56+
impl<'a> Iterator for RubyMutatorIterator<'a> {
57+
type Item = &'a mut Mutator<Ruby>;
3158

32-
fn get_next_mutator() -> Option<&'static mut Mutator<Ruby>> {
33-
let ptr = (upcalls().get_next_mutator)();
34-
if ptr.is_null() {
35-
None
36-
} else {
37-
Some(unsafe { &mut (*ptr) as &'static mut Mutator<Ruby> })
38-
}
59+
fn next(&mut self) -> Option<Self::Item> {
60+
self.mutators.get(self.cursor).cloned().map(|mutator_ptr| {
61+
self.cursor += 1;
62+
unsafe { &mut *mutator_ptr as _ }
63+
})
3964
}
4065
}

0 commit comments

Comments
 (0)