Feature #641 ยป cache_latest_heap.diff
| gc.c (working copy) | ||
|---|---|---|
|
}
|
||
|
}
|
||
|
struct heaps_slot *cached_pointer_to_latest_heap = 0;
|
||
|
static inline int
|
||
|
is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
|
||
|
{
|
||
| ... | ... | |
|
if (p < lomem || p > himem) return Qfalse;
|
||
|
if ((VALUE)p % sizeof(RVALUE) != 0) return Qfalse;
|
||
|
if( cached_pointer_to_latest_heap && (p >= cached_pointer_to_latest_heap->slot) && (p < cached_pointer_to_latest_heap->slot + cached_pointer_to_latest_heap->limit) )
|
||
|
{
|
||
|
return Qtrue;
|
||
|
}
|
||
|
/* check if p looks like a pointer using bsearch*/
|
||
|
lo = 0;
|
||
|
hi = heaps_used;
|
||
| ... | ... | |
|
heap = &heaps[mid];
|
||
|
if (heap->slot <= p) {
|
||
|
if (p < heap->slot + heap->limit)
|
||
|
return Qtrue;
|
||
|
{
|
||
|
cached_pointer_to_latest_heap = heap;
|
||
|
return Qtrue;
|
||
|
}
|
||
|
lo = mid + 1;
|
||
|
}
|
||
|
else {
|
||
| ... | ... | |
|
{
|
||
|
size_t i, j;
|
||
|
RVALUE *last = 0;
|
||
|
for (i = j = 1; j < heaps_used; i++) {
|
||
|
if (heaps[i].limit == 0) {
|
||
|
if (!last) {
|
||
| ... | ... | |
|
}
|
||
|
during_gc++;
|
||
|
objspace->count++;
|
||
|
cached_pointer_to_latest_heap = 0;
|
||
|
GC_PROF_TIMER_START;
|
||
|
GC_PROF_MARK_TIMER_START;
|
||
|
SET_STACK_END;
|
||