diff options
author | Koichi Sasada <[email protected]> | 2019-05-07 14:06:25 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2019-05-07 14:10:43 +0900 |
commit | 4dc5d3c5dd43b4cc54517e604c16ecfc808e5481 (patch) | |
tree | 1df2d0be74238f4b6e411282577d8d732d428747 | |
parent | 7e72ce0f734113e3e215a74b440092443e957d45 (diff) |
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.
-rw-r--r-- | debug_counter.h | 5 | ||||
-rw-r--r-- | gc.c | 6 |
2 files changed, 11 insertions, 0 deletions
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 @@ -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; |