|
1 | 1 | use crate::abi::GCThreadTLS; |
2 | 2 |
|
| 3 | +use crate::api::RubyMutator; |
3 | 4 | use crate::{mmtk, upcalls, Ruby}; |
| 5 | +use mmtk::memory_manager; |
4 | 6 | use mmtk::scheduler::*; |
5 | 7 | use mmtk::util::{VMMutatorThread, VMThread, VMWorkerThread}; |
6 | 8 | use mmtk::vm::{Collection, GCThreadContext}; |
7 | | -use mmtk::{memory_manager, MutatorContext}; |
8 | 9 | use std::thread; |
9 | 10 |
|
10 | 11 | pub struct VMCollection {} |
11 | 12 |
|
12 | 13 | impl Collection<Ruby> for VMCollection { |
13 | | - fn stop_all_mutators<F>(tls: VMWorkerThread, _mutator_visitor: F) |
| 14 | + fn stop_all_mutators<F>(tls: VMWorkerThread, mut mutator_visitor: F) |
14 | 15 | where |
15 | 16 | F: FnMut(&'static mut mmtk::Mutator<Ruby>), |
16 | 17 | { |
17 | 18 | (upcalls().stop_the_world)(tls); |
18 | 19 | crate::binding().ppp_registry.pin_ppp_children(tls); |
| 20 | + (upcalls().get_mutators)( |
| 21 | + Self::notify_mutator_ready::<F>, |
| 22 | + &mut mutator_visitor as *mut F as *mut _, |
| 23 | + ); |
19 | 24 | } |
20 | 25 |
|
21 | 26 | fn resume_mutators(tls: VMWorkerThread) { |
@@ -77,15 +82,18 @@ impl Collection<Ruby> for VMCollection { |
77 | 82 | } |
78 | 83 | } |
79 | 84 |
|
80 | | - fn prepare_mutator<T: MutatorContext<Ruby>>( |
81 | | - _tls_worker: VMWorkerThread, |
82 | | - _tls_mutator: VMMutatorThread, |
83 | | - _m: &T, |
84 | | - ) { |
85 | | - // do nothing |
86 | | - } |
87 | | - |
88 | 85 | fn vm_live_bytes() -> usize { |
89 | 86 | (upcalls().vm_live_bytes)() |
90 | 87 | } |
91 | 88 | } |
| 89 | + |
| 90 | +impl VMCollection { |
| 91 | + extern "C" fn notify_mutator_ready<F>(mutator_ptr: *mut RubyMutator, data: *mut libc::c_void) |
| 92 | + where |
| 93 | + F: FnMut(&'static mut mmtk::Mutator<Ruby>), |
| 94 | + { |
| 95 | + let mutator = unsafe { &mut *mutator_ptr }; |
| 96 | + let mutator_visitor = unsafe { &mut *(data as *mut F) }; |
| 97 | + mutator_visitor(mutator); |
| 98 | + } |
| 99 | +} |
0 commit comments