зеркало из https://github.com/github/ruby.git
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.
This commit is contained in:
Родитель
7e72ce0f73
Коммит
4dc5d3c5dd
|
@ -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
|
||||
|
|
6
gc.c
6
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче