diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index b8af39c..27a0519 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -689,8 +689,7 @@ rb_gc_impl_start(void *objspace_ptr, bool full_mark, bool immediate_mark, bool i bool rb_gc_impl_during_gc_p(void *objspace_ptr) { - // TODO - return false; + return mmtk_gc_in_progress_p(); } static void diff --git a/gc/mmtk/mmtk.h b/gc/mmtk/mmtk.h index 4cef166..3e2db66 100644 --- a/gc/mmtk/mmtk.h +++ b/gc/mmtk/mmtk.h @@ -112,6 +112,8 @@ void mmtk_set_gc_enabled(bool enable); bool mmtk_gc_enabled_p(void); +bool mmtk_gc_in_progress_p(void); + MMTk_Address mmtk_alloc(MMTk_Mutator *mutator, size_t size, size_t align, diff --git a/gc/mmtk/src/api.rs b/gc/mmtk/src/api.rs index 3515a24..884a40f 100644 --- a/gc/mmtk/src/api.rs +++ b/gc/mmtk/src/api.rs @@ -267,6 +267,11 @@ pub extern "C" fn mmtk_gc_enabled_p() -> bool { crate::CONFIGURATION.gc_enabled.load(Ordering::Relaxed) } +#[no_mangle] +pub extern "C" fn mmtk_gc_in_progress_p() -> bool { + crate::collection::mutators_stopped() +} + // =============== Object allocation =============== #[no_mangle] diff --git a/gc/mmtk/src/collection.rs b/gc/mmtk/src/collection.rs index 83d046a..667de91 100644 --- a/gc/mmtk/src/collection.rs +++ b/gc/mmtk/src/collection.rs @@ -18,6 +18,11 @@ use std::sync::atomic::Ordering; use std::thread; static CURRENT_GC_MAY_MOVE: AtomicBool = AtomicBool::new(false); +static MUTATORS_STOPPED: AtomicBool = AtomicBool::new(false); + +pub fn mutators_stopped() -> bool { + MUTATORS_STOPPED.load(Ordering::SeqCst) +} pub struct VMCollection {} @@ -31,6 +36,7 @@ impl Collection for VMCollection { F: FnMut(&'static mut mmtk::Mutator), { (upcalls().stop_the_world)(); + MUTATORS_STOPPED.store(true, Ordering::SeqCst); if crate::mmtk().get_plan().current_gc_may_move_object() { CURRENT_GC_MAY_MOVE.store(true, Ordering::Relaxed); @@ -48,6 +54,8 @@ impl Collection for VMCollection { } fn resume_mutators(_tls: VMWorkerThread) { + MUTATORS_STOPPED.store(false, Ordering::SeqCst); + if CURRENT_GC_MAY_MOVE.load(Ordering::Relaxed) { (upcalls().after_updating_jit_code)(); }