summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2025-01-16 16:40:27 -0500
committergit <[email protected]>2025-01-16 21:40:31 +0000
commit179899c6165a3a525a184781c9aafcd816d4f767 (patch)
treed34d1482a549b4e1e789ea17bd8dc460e122c435
parentd05f6a9b8f1b262db234110935ac5f9cba2e7516 (diff)
[ruby/mmtk] Add mmtk_heap_min to GC.config
https://github.com/ruby/mmtk/commit/5bbac70c69
-rw-r--r--gc/mmtk/mmtk.c2
-rw-r--r--gc/mmtk/mmtk.h2
-rw-r--r--gc/mmtk/src/api.rs9
-rw-r--r--test/mmtk/test_configuration.rb11
4 files changed, 24 insertions, 0 deletions
diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c
index 3839ffe6d8..b5be2c295c 100644
--- a/gc/mmtk/mmtk.c
+++ b/gc/mmtk/mmtk.c
@@ -635,6 +635,8 @@ 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()));
+ 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));
return hash;
}
diff --git a/gc/mmtk/mmtk.h b/gc/mmtk/mmtk.h
index 14446ff9d6..fdd6d0c840 100644
--- a/gc/mmtk/mmtk.h
+++ b/gc/mmtk/mmtk.h
@@ -151,6 +151,8 @@ const uint8_t *mmtk_plan(void);
const uint8_t *mmtk_heap_mode(void);
+size_t mmtk_heap_min(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 00a119eeea..00a7846ecf 100644
--- a/gc/mmtk/src/api.rs
+++ b/gc/mmtk/src/api.rs
@@ -359,6 +359,15 @@ pub extern "C" fn mmtk_heap_mode() -> *const u8 {
}
}
+#[no_mangle]
+pub extern "C" fn mmtk_heap_min() -> usize {
+ match *crate::BINDING.get().unwrap().mmtk.get_options().gc_trigger {
+ GCTriggerSelector::FixedHeapSize(_) => 0,
+ GCTriggerSelector::DynamicHeapSize(min_size, _) => min_size,
+ _ => panic!("Unknown heap mode")
+ }
+}
+
// =============== Miscellaneous ===============
#[no_mangle]
diff --git a/test/mmtk/test_configuration.rb b/test/mmtk/test_configuration.rb
index 32d57b430c..56f87afc41 100644
--- a/test/mmtk/test_configuration.rb
+++ b/test/mmtk/test_configuration.rb
@@ -28,6 +28,17 @@ module MMTk
end
end
+ def test_MMTK_HEAP_MIN
+ # TODO: uncomment this test when the infinite loop is fixed
+ # assert_separately([{ "MMTK_HEAP_MODE" => "dynamic", "MMTK_HEAP_MIN" => "1" }], <<~RUBY)
+ # assert_equal(1, GC.config[:mmtk_heap_min])
+ # RUBY
+
+ assert_separately([{ "MMTK_HEAP_MODE" => "dynamic", "MMTK_HEAP_MIN" => "10MiB", "MMTK_HEAP_MAX" => "1GiB" }], <<~RUBY)
+ assert_equal(10 * 1024 * 1024, GC.config[:mmtk_heap_min])
+ 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(