summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc/mmtk/mmtk.c3
-rw-r--r--gc/mmtk/mmtk.h2
-rw-r--r--gc/mmtk/src/api.rs5
-rw-r--r--gc/mmtk/src/weak_proc.rs4
4 files changed, 14 insertions, 0 deletions
diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c
index b8af39cd99..d5cfda1be9 100644
--- a/gc/mmtk/mmtk.c
+++ b/gc/mmtk/mmtk.c
@@ -1410,6 +1410,7 @@ enum gc_stat_sym {
gc_stat_sym_free_bytes,
gc_stat_sym_starting_heap_address,
gc_stat_sym_last_heap_address,
+ gc_stat_sym_weak_references_count,
gc_stat_sym_last
};
@@ -1428,6 +1429,7 @@ setup_gc_stat_symbols(void)
S(free_bytes);
S(starting_heap_address);
S(last_heap_address);
+ S(weak_references_count);
}
}
@@ -1463,6 +1465,7 @@ rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym)
SET(free_bytes, mmtk_free_bytes());
SET(starting_heap_address, (size_t)mmtk_starting_heap_address());
SET(last_heap_address, (size_t)mmtk_last_heap_address());
+ SET(weak_references_count, mmtk_weak_references_count());
#undef SET
if (!NIL_P(key)) {
diff --git a/gc/mmtk/mmtk.h b/gc/mmtk/mmtk.h
index 4cef1668a4..ffbad1a025 100644
--- a/gc/mmtk/mmtk.h
+++ b/gc/mmtk/mmtk.h
@@ -129,6 +129,8 @@ void mmtk_declare_weak_references(MMTk_ObjectReference object);
bool mmtk_weak_references_alive_p(MMTk_ObjectReference object);
+size_t mmtk_weak_references_count(void);
+
void mmtk_register_pinning_obj(MMTk_ObjectReference obj);
void mmtk_object_reference_write_post(MMTk_Mutator *mutator, MMTk_ObjectReference object);
diff --git a/gc/mmtk/src/api.rs b/gc/mmtk/src/api.rs
index 3515a2408b..5eac068672 100644
--- a/gc/mmtk/src/api.rs
+++ b/gc/mmtk/src/api.rs
@@ -317,6 +317,11 @@ pub extern "C" fn mmtk_weak_references_alive_p(object: ObjectReference) -> bool
object.is_reachable()
}
+#[no_mangle]
+pub extern "C" fn mmtk_weak_references_count() -> usize {
+ binding().weak_proc.weak_references_count()
+}
+
// =============== Compaction ===============
#[no_mangle]
diff --git a/gc/mmtk/src/weak_proc.rs b/gc/mmtk/src/weak_proc.rs
index d0a54f01bf..f103822b73 100644
--- a/gc/mmtk/src/weak_proc.rs
+++ b/gc/mmtk/src/weak_proc.rs
@@ -92,6 +92,10 @@ impl WeakProcessor {
weak_references.push(object);
}
+ pub fn weak_references_count(&self) -> usize {
+ self.weak_references.lock().unwrap().len()
+ }
+
pub fn process_weak_stuff(
&self,
worker: &mut GCWorker<Ruby>,