mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-12 11:28:35 +00:00
8235982: AArch64: Insufficient memory barriers in shadow region algorithm
The memory barriers used for synchronizing ParallelCompactData::RegionData::_shadow_state and ParallelCompactData::RegionData::shadow_region are insufficient to prevent reordering of loads. Reviewed-by: tschatzl, sjohanss
This commit is contained in:
parent
079db54d51
commit
995fbebd81
@ -630,25 +630,25 @@ inline bool ParallelCompactData::RegionData::claim()
|
||||
}
|
||||
|
||||
inline bool ParallelCompactData::RegionData::mark_normal() {
|
||||
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, NormalRegion, memory_order_relaxed) == UnusedRegion;
|
||||
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, NormalRegion) == UnusedRegion;
|
||||
}
|
||||
|
||||
inline bool ParallelCompactData::RegionData::mark_shadow() {
|
||||
if (_shadow_state != UnusedRegion) return false;
|
||||
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, ShadowRegion, memory_order_relaxed) == UnusedRegion;
|
||||
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, ShadowRegion) == UnusedRegion;
|
||||
}
|
||||
|
||||
inline void ParallelCompactData::RegionData::mark_filled() {
|
||||
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, FilledShadow, memory_order_relaxed);
|
||||
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, FilledShadow);
|
||||
assert(old == ShadowRegion, "Fail to mark the region as filled");
|
||||
}
|
||||
|
||||
inline bool ParallelCompactData::RegionData::mark_copied() {
|
||||
return Atomic::cmpxchg(&_shadow_state, FilledShadow, CopiedShadow, memory_order_relaxed) == FilledShadow;
|
||||
return Atomic::cmpxchg(&_shadow_state, FilledShadow, CopiedShadow) == FilledShadow;
|
||||
}
|
||||
|
||||
void ParallelCompactData::RegionData::shadow_to_normal() {
|
||||
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, NormalRegion, memory_order_relaxed);
|
||||
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, NormalRegion);
|
||||
assert(old == ShadowRegion, "Fail to mark the region as finish");
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user