< prev index next >
src/share/vm/gc_implementation/shenandoah/shenandoahFreeSet.cpp
Print this page
rev 11463 : Backport Traversal GC
*** 23,32 ****
--- 23,33 ----
#include "precompiled.hpp"
#include "gc_implementation/shenandoah/shenandoahFreeSet.hpp"
#include "gc_implementation/shenandoah/shenandoahHeap.inline.hpp"
+ #include "gc_implementation/shenandoah/shenandoahTraversalGC.hpp"
ShenandoahFreeSet::ShenandoahFreeSet(ShenandoahHeap* heap,size_t max_regions) :
_heap(heap),
_mutator_free_bitmap(max_regions, /* in_resource_area = */ false),
_collector_free_bitmap(max_regions, /* in_resource_area = */ false),
*** 173,182 ****
--- 174,192 ----
increase_used(size * HeapWordSize);
}
// Record actual allocation size
req.set_actual_size(size);
+
+ if (req.is_gc_alloc() && _heap->is_concurrent_traversal_in_progress()) {
+ // Traversal needs to traverse through GC allocs. Adjust TAMS to the new top
+ // so that these allocations appear below TAMS, and thus get traversed.
+ // See top of shenandoahTraversal.cpp for an explanation.
+ _heap->marking_context()->capture_top_at_mark_start(r);
+ _heap->traversal_gc()->traversal_set()->add_region_check_for_duplicates(r);
+ OrderAccess::fence();
+ }
}
if (result == NULL || has_no_alloc_capacity(r)) {
// Region cannot afford this or future allocations. Retire it.
//
< prev index next >