summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc/mmtk/mmtk.c1
-rw-r--r--gc/mmtk/mmtk.h2
-rw-r--r--gc/mmtk/src/api.rs12
-rw-r--r--test/mmtk/test_configuration.rb8
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(