From 7fb8f5879d64fa9bf93f53b136989127281a67cb Mon Sep 17 00:00:00 2001 From: Lin Hu Date: Thu, 1 Sep 2022 17:11:04 -0400 Subject: [PATCH] Handling potential overwriting in Concurrent scavenger back out case Update Method fixupForwardedSlot return true or false for the condition to update heap object reference slot(we won't need to update the reference slot if the reference is not fixed up) in order to avoid potential reference slot overwriting(concurrent marking) during Concurrent scavenger back out case. Signed-off-by: Lin Hu --- gc/base/MarkingScheme.cpp | 4 +++- gc/base/MarkingScheme.hpp | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/gc/base/MarkingScheme.cpp b/gc/base/MarkingScheme.cpp index 94566a88884..394d0a5701a 100644 --- a/gc/base/MarkingScheme.cpp +++ b/gc/base/MarkingScheme.cpp @@ -410,7 +410,7 @@ MM_MarkingScheme::createWorkPackets(MM_EnvironmentBase *env) return workPackets; } -void +bool MM_MarkingScheme::fixupForwardedSlot(omrobjectptr_t *slotPtr) { #if defined(OMR_GC_CONCURRENT_SCAVENGER) bool const compressed = _extensions->compressObjectReferences(); @@ -423,10 +423,12 @@ MM_MarkingScheme::fixupForwardedSlot(omrobjectptr_t *slotPtr) { forwardHeader.restoreSelfForwardedPointer(); } else { *slotPtr = forwardPtr; + return true; } } } #endif /* OMR_GC_CONCURRENT_SCAVENGER */ + return false; } uintptr_t diff --git a/gc/base/MarkingScheme.hpp b/gc/base/MarkingScheme.hpp index 3c2c67002db..68c31f32c4e 100644 --- a/gc/base/MarkingScheme.hpp +++ b/gc/base/MarkingScheme.hpp @@ -291,12 +291,13 @@ class MM_MarkingScheme : public MM_BaseVirtual MMINLINE void fixupForwardedSlot(GC_SlotObject *slotObject) { if (_extensions->isConcurrentScavengerEnabled() && _extensions->isScavengerBackOutFlagRaised()) { omrobjectptr_t slot = slotObject->readReferenceFromSlot(); - fixupForwardedSlot(&slot); - slotObject->writeReferenceToSlot(slot); + if (fixupForwardedSlot(&slot)) { + slotObject->writeReferenceToSlot(slot); + } } } - void fixupForwardedSlot(omrobjectptr_t *slotPtr); + bool fixupForwardedSlot(omrobjectptr_t *slotPtr); virtual uintptr_t setupIndexableScanner(MM_EnvironmentBase *env, omrobjectptr_t objectPtr, MM_MarkingSchemeScanReason reason, uintptr_t *sizeToDo, uintptr_t *sizeInElementsToDo, fomrobject_t **basePtr, uintptr_t *flags); /**