diff options
-rw-r--r-- | gc/mmtk/mmtk.c | 1 | ||||
-rw-r--r-- | gc/mmtk/mmtk.h | 2 | ||||
-rw-r--r-- | gc/mmtk/src/api.rs | 12 | ||||
-rw-r--r-- | test/mmtk/test_configuration.rb | 8 |
4 files changed, 23 insertions, 0 deletions
diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index c8269c9612..3839ffe6d8 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -634,6 +634,7 @@ rb_gc_impl_config_get(void *objspace_ptr) rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_worker_count")), RB_ULONG2NUM(mmtk_worker_count())); rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_plan")), rb_str_new_cstr((const char *)mmtk_plan())); + rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_heap_mode")), rb_str_new_cstr((const char *)mmtk_heap_mode())); return hash; } diff --git a/gc/mmtk/mmtk.h b/gc/mmtk/mmtk.h index 7391971511..14446ff9d6 100644 --- a/gc/mmtk/mmtk.h +++ b/gc/mmtk/mmtk.h @@ -149,6 +149,8 @@ size_t mmtk_worker_count(void); const uint8_t *mmtk_plan(void); +const uint8_t *mmtk_heap_mode(void); + bool mmtk_is_mmtk_object(MMTk_Address addr); #endif /* MMTK_H */ diff --git a/gc/mmtk/src/api.rs b/gc/mmtk/src/api.rs index b68b3953d3..00a119eeea 100644 --- a/gc/mmtk/src/api.rs +++ b/gc/mmtk/src/api.rs @@ -347,6 +347,18 @@ pub extern "C" fn mmtk_plan() -> *const u8 { } } +#[no_mangle] +pub extern "C" fn mmtk_heap_mode() -> *const u8 { + static FIXED_HEAP: &[u8] = b"fixed\0"; + static DYNAMIC_HEAP: &[u8] = b"dynamic\0"; + + match *crate::BINDING.get().unwrap().mmtk.get_options().gc_trigger { + GCTriggerSelector::FixedHeapSize(_) => FIXED_HEAP.as_ptr(), + GCTriggerSelector::DynamicHeapSize(_, _) => DYNAMIC_HEAP.as_ptr(), + _ => panic!("Unknown heap mode") + } +} + // =============== Miscellaneous =============== #[no_mangle] diff --git a/test/mmtk/test_configuration.rb b/test/mmtk/test_configuration.rb index 8ec5997f27..a964918a1f 100644 --- a/test/mmtk/test_configuration.rb +++ b/test/mmtk/test_configuration.rb @@ -21,6 +21,14 @@ module MMTk end end + %w(fixed dynamic).each do |heap| + define_method(:"test_MMTK_HEAP_MODE_#{heap}") do + assert_separately([{ "MMTK_HEAP_MODE" => heap }], <<~RUBY) + assert_equal("#{heap}", GC.config[:mmtk_heap_mode]) + RUBY + end + end + %w(MMTK_THREADS MMTK_HEAP_MIN MMTK_HEAP_MAX MMTK_HEAP_MODE MMTK_PLAN).each do |var| define_method(:"test_invalid_#{var}") do exit_code = assert_in_out_err( |