mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
8373116: Genshen: arraycopy_work should be always done for arrays in old gen during young concurrent marking
8372498: [genshen] gc/TestAllocHumongousFragment.java#generational causes intermittent SIGSEGV crashes Reviewed-by: wkemper, kdnilsen
This commit is contained in:
parent
3ea82b9ff9
commit
c9ab330b7b
@ -128,8 +128,8 @@ public:
|
||||
void write_ref_array(HeapWord* start, size_t count);
|
||||
|
||||
private:
|
||||
template <class T>
|
||||
inline void arraycopy_marking(T* dst, size_t count);
|
||||
template <bool IS_GENERATIONAL, class T>
|
||||
void arraycopy_marking(T* dst, size_t count);
|
||||
template <class T>
|
||||
inline void arraycopy_evacuation(T* src, size_t count);
|
||||
template <class T>
|
||||
|
||||
@ -429,7 +429,11 @@ void ShenandoahBarrierSet::arraycopy_barrier(T* src, T* dst, size_t count) {
|
||||
// If marking old or young, we must evaluate the SATB barrier. This will be the only
|
||||
// action if we are not marking old. If we are marking old, we must still evaluate the
|
||||
// load reference barrier for a young collection.
|
||||
arraycopy_marking(dst, count);
|
||||
if (_heap->mode()->is_generational()) {
|
||||
arraycopy_marking<true>(dst, count);
|
||||
} else {
|
||||
arraycopy_marking<false>(dst, count);
|
||||
}
|
||||
}
|
||||
|
||||
if ((gc_state & ShenandoahHeap::EVACUATION) != 0) {
|
||||
@ -441,11 +445,12 @@ void ShenandoahBarrierSet::arraycopy_barrier(T* src, T* dst, size_t count) {
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
template <bool IS_GENERATIONAL, class T>
|
||||
void ShenandoahBarrierSet::arraycopy_marking(T* dst, size_t count) {
|
||||
assert(_heap->is_concurrent_mark_in_progress(), "only during marking");
|
||||
if (ShenandoahSATBBarrier) {
|
||||
if (!_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst))) {
|
||||
if (!_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst)) ||
|
||||
(IS_GENERATIONAL && _heap->heap_region_containing(dst)->is_old() && _heap->is_concurrent_young_mark_in_progress())) {
|
||||
arraycopy_work<T, false, false, true>(dst, count);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user