From 6a78ffaf164d373b5ad022dc211e2ff34cf18a13 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 17 Jan 2025 10:44:16 -0500 Subject: [PATCH] Add mmtk_heap_max to GC.config --- gc/mmtk/mmtk.c | 1 + gc/mmtk/mmtk.h | 2 ++ gc/mmtk/src/api.rs | 9 +++++++++ test/mmtk/test_configuration.rb | 6 ++++++ 4 files changed, 18 insertions(+) diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index b5be2c2..75f0362 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -637,6 +637,7 @@ rb_gc_impl_config_get(void *objspace_ptr) rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_heap_mode")), rb_str_new_cstr((const char *)mmtk_heap_mode())); size_t heap_min = mmtk_heap_min(); if (heap_min > 0) rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_heap_min")), RB_ULONG2NUM(heap_min)); + rb_hash_aset(hash, ID2SYM(rb_intern_const("mmtk_heap_max")), RB_ULONG2NUM(mmtk_heap_max())); return hash; } diff --git a/gc/mmtk/mmtk.h b/gc/mmtk/mmtk.h index fdd6d0c..00004df 100644 --- a/gc/mmtk/mmtk.h +++ b/gc/mmtk/mmtk.h @@ -153,6 +153,8 @@ const uint8_t *mmtk_heap_mode(void); size_t mmtk_heap_min(void); +size_t mmtk_heap_max(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 00a7846..91718ce 100644 --- a/gc/mmtk/src/api.rs +++ b/gc/mmtk/src/api.rs @@ -368,6 +368,15 @@ pub extern "C" fn mmtk_heap_min() -> usize { } } +#[no_mangle] +pub extern "C" fn mmtk_heap_max() -> usize { + match *crate::BINDING.get().unwrap().mmtk.get_options().gc_trigger { + GCTriggerSelector::FixedHeapSize(max_size) => max_size, + GCTriggerSelector::DynamicHeapSize(_, max_size) => max_size, + _ => panic!("Unknown heap mode") + } +} + // =============== Miscellaneous =============== #[no_mangle] diff --git a/test/mmtk/test_configuration.rb b/test/mmtk/test_configuration.rb index 56f87af..0f60eb6 100644 --- a/test/mmtk/test_configuration.rb +++ b/test/mmtk/test_configuration.rb @@ -39,6 +39,12 @@ def test_MMTK_HEAP_MIN RUBY end + def test_MMTK_HEAP_MAX + assert_separately([{ "MMTK_HEAP_MODE" => "fixed", "MMTK_HEAP_MAX" => "100MiB" }], <<~RUBY) + assert_equal(100 * 1024 * 1024, GC.config[:mmtk_heap_max]) + RUBY + 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(