From 4dc5d3c5dd43b4cc54517e604c16ecfc808e5481 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Tue, 7 May 2019 14:06:25 +0900 Subject: [PATCH] add new debug_counters about is_pointer_to_heap(). is_pointer_to_heap() is used for conservative marking. To analyze this function's behavior, introduce some debug_counters. --- debug_counter.h | 5 +++++ gc.c | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/debug_counter.h b/debug_counter.h index faf876a8c4..83ae701524 100644 --- a/debug_counter.h +++ b/debug_counter.h @@ -143,6 +143,11 @@ RB_DEBUG_COUNTER(gc_major_shady) RB_DEBUG_COUNTER(gc_major_force) RB_DEBUG_COUNTER(gc_major_oldmalloc) +RB_DEBUG_COUNTER(gc_isptr_trial) +RB_DEBUG_COUNTER(gc_isptr_range) +RB_DEBUG_COUNTER(gc_isptr_align) +RB_DEBUG_COUNTER(gc_isptr_maybe) + /* object allocation counts: * * * obj_newobj: newobj counts diff --git a/gc.c b/gc.c index cf3bb3fac2..5bd0cf75b6 100644 --- a/gc.c +++ b/gc.c @@ -2191,8 +2191,13 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr) register struct heap_page *page; register size_t hi, lo, mid; + RB_DEBUG_COUNTER_INC(gc_isptr_trial); + if (p < heap_pages_lomem || p > heap_pages_himem) return FALSE; + RB_DEBUG_COUNTER_INC(gc_isptr_range); + if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE; + RB_DEBUG_COUNTER_INC(gc_isptr_align); /* check if p looks like a pointer using bsearch*/ lo = 0; @@ -2202,6 +2207,7 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr) page = heap_pages_sorted[mid]; if (page->start <= p) { if (p < page->start + page->total_slots) { + RB_DEBUG_COUNTER_INC(gc_isptr_maybe); return TRUE; } lo = mid + 1;