*(place) = start;
*(background_mark_stack_tos++) = (uint8_t*)((size_t)oo | 1);
- int i = num_partial_refs;
+ int num_pushed_refs = num_partial_refs;
+ int num_processed_refs = num_pushed_refs * 16;
go_through_object (method_table(oo), oo, s, ppslot,
start, use_start, (oo + s),
if (contain_pointers_or_collectible (o))
{
*(background_mark_stack_tos++) = o;
- if (--i == 0)
+ if (--num_pushed_refs == 0)
{
//update the start
*place = (uint8_t*)(ppslot+1);
}
}
+ if (--num_processed_refs == 0)
+ {
+ // give foreground GC a chance to run
+ *place = (uint8_t*)(ppslot + 1);
+ goto more_to_do;
+ }
- }
+ }
);
//we are finished with this object
*place = 0;
*(place+1) = 0;
-
+
more_to_do:;
}
else
}
else if (
concurrent_p &&
-#ifndef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP // see comment below
- large_objects_p &&
-#endif // !FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
((CObjectHeader*)o)->IsFree() &&
(next_o > min (high_address, page + WRITE_WATCH_UNIT_SIZE)))
{
dprintf (3,("Last object: %Ix", (size_t)last_object));
last_page = align_write_watch_lower_page (o);
+
+ if (concurrent_p)
+ {
+ allow_fgc();
+ }
}
// When reset_only_p is TRUE, we should only reset pages that are in range