Skip to content

Commit

Permalink
Merge pull request #16157 from LinHu2016/supportConcurrentScavenger2
Browse files Browse the repository at this point in the history
Handle Continuation scan during Concurrent Scavenger and Metronome
  • Loading branch information
amicic committed Oct 24, 2022
2 parents ca9e8b4 + c7a0338 commit 1a8e36d
Show file tree
Hide file tree
Showing 16 changed files with 119 additions and 44 deletions.
4 changes: 2 additions & 2 deletions runtime/gc/gctable.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ J9MemoryManagerFunctions MemoryManagerFunctions = {
J9WriteBarrierBatch,
J9WriteBarrierPostClass,
J9WriteBarrierClassBatch,
preMountContinuation,
postUnmountContinuation,
allocateMemoryForSublistFragment,
j9gc_heap_free_memory,
j9gc_heap_total_memory,
Expand Down Expand Up @@ -251,8 +253,6 @@ J9MemoryManagerFunctions MemoryManagerFunctions = {
j9mm_iterate_all_continuation_objects,
ownableSynchronizerObjectCreated,
continuationObjectCreated,
preMountContinuation,
postUnmountContinuation,
j9gc_notifyGCOfClassReplacement,
j9gc_get_jit_string_dedup_policy,
j9gc_stringHashFn,
Expand Down
11 changes: 11 additions & 0 deletions runtime/gc_base/GCExtensions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#endif /* defined(OMR_GC_IDLE_HEAP_MANAGER) */
#include "MemorySpace.hpp"
#include "MemorySubSpace.hpp"
#include "StandardAccessBarrier.hpp"
#include "ObjectModel.hpp"
#include "ReferenceChainWalkerMarkMap.hpp"
#include "SublistPool.hpp"
Expand Down Expand Up @@ -284,3 +285,13 @@ MM_GCExtensions::getContinuationObjectListsExternal(J9VMThread *vmThread)
{
return continuationObjectLists;
}


void
MM_GCExtensions::registerScavenger(MM_Scavenger *scavenger)
{
MM_GCExtensionsBase::registerScavenger(scavenger);
Assert_MM_true(isStandardGC());
Assert_MM_true(isScavengerEnabled());
((MM_StandardAccessBarrier *)accessBarrier)->registerScavenger(scavenger);
}
2 changes: 2 additions & 0 deletions runtime/gc_base/GCExtensions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ class MM_GCExtensions : public MM_GCExtensionsBase {

void computeDefaultMaxHeapForJava(bool enableOriginalJDK8HeapSizeCompatibilityOption);

virtual void registerScavenger(MM_Scavenger *scavenger);

MMINLINE J9HookInterface** getHookInterface() { return J9_HOOK_INTERFACE(hookInterface); };

/**
Expand Down
2 changes: 2 additions & 0 deletions runtime/gc_base/ObjectAccessBarrier.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,8 @@ class MM_ObjectAccessBarrier : public MM_BaseVirtual
virtual bool postObjectRead(J9VMThread *vmThread, J9Object *srcObject, fj9object_t *srcAddress);
virtual bool postObjectRead(J9VMThread *vmThread, J9Class *srcClass, J9Object **srcAddress);

virtual void preMountContinuation(J9VMThread *vmThread, j9object_t contObject) {}
virtual void postUnmountContinuation(J9VMThread *vmThread, j9object_t contObject) {}
/**
* Return back true if object references are compressed
* @return true, if object references are compressed
Expand Down
14 changes: 14 additions & 0 deletions runtime/gc_base/accessBarrier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -835,5 +835,19 @@ j9gc_objaccess_jniDeleteGlobalReference(J9VMThread *vmThread, J9Object *referenc
barrier->jniDeleteGlobalReference(vmThread, reference);
}

void
preMountContinuation(J9VMThread *vmThread, j9object_t object)
{
MM_ObjectAccessBarrier *barrier = MM_GCExtensions::getExtensions(vmThread->javaVM)->accessBarrier;
barrier->preMountContinuation(vmThread, object);
}

void
postUnmountContinuation(J9VMThread *vmThread, j9object_t object)
{
MM_ObjectAccessBarrier *barrier = MM_GCExtensions::getExtensions(vmThread->javaVM)->accessBarrier;
barrier->postUnmountContinuation(vmThread, object);
}

} /* extern "C" */

5 changes: 2 additions & 3 deletions runtime/gc_base/gc_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ extern J9_CFUNC UDATA alwaysCallReferenceArrayCopyHelper(J9JavaVM *javaVM);
extern J9_CFUNC void J9WriteBarrierBatch(J9VMThread *vmThread, j9object_t destinationObject);
extern J9_CFUNC IDATA j9gc_objaccess_indexableReadI16(J9VMThread *vmThread, J9IndexableObject *srcObject, I_32 index, UDATA isVolatile);
extern J9_CFUNC void J9WriteBarrierPost(J9VMThread *vmThread, j9object_t destinationObject, j9object_t storedObject);
extern J9_CFUNC void preMountContinuation(J9VMThread *vmThread, j9object_t object);
extern J9_CFUNC void postUnmountContinuation(J9VMThread *vmThread, j9object_t object);
extern J9_CFUNC UDATA j9gc_heap_total_memory(J9JavaVM *javaVM);
extern J9_CFUNC UDATA j9gc_is_garbagecollection_disabled(J9JavaVM *javaVM);
extern J9_CFUNC UDATA j9gc_allsupported_memorypools(J9JavaVM* javaVM);
Expand Down Expand Up @@ -268,9 +270,6 @@ extern J9_CFUNC void* finalizeForcedClassLoaderUnload(J9VMThread *vmThread);
extern J9_CFUNC UDATA ownableSynchronizerObjectCreated(J9VMThread *vmThread, j9object_t object);
extern J9_CFUNC UDATA continuationObjectCreated(J9VMThread *vmThread, j9object_t object);

extern J9_CFUNC void preMountContinuation(J9VMThread *vmThread, j9object_t object);
extern J9_CFUNC void postUnmountContinuation(J9VMThread *vmThread, j9object_t object);

extern J9_CFUNC void j9gc_notifyGCOfClassReplacement(J9VMThread *vmThread, J9Class *originalClass, J9Class *replacementClass, UDATA isFastHCR);

/* GuaranteedNurseryRange.cpp */
Expand Down
14 changes: 0 additions & 14 deletions runtime/gc_base/modronapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,6 @@

extern "C" {

void
preMountContinuation(J9VMThread *vmThread, j9object_t object)
{
/* need read barrier to handle concurrent scavenger and gcpolicy:metronome case */
}

void
postUnmountContinuation(J9VMThread *vmThread, j9object_t object)
{
/* Conservatively assume that via mutations of stack slots (which are not subject to access barriers),
* all post-write barriers have been triggered on this Continuation object, since it's been mounted. */
vmThread->javaVM->memoryManagerFunctions->J9WriteBarrierBatch(vmThread, object);
}

UDATA
j9gc_modron_global_collect(J9VMThread *vmThread)
{
Expand Down
4 changes: 3 additions & 1 deletion runtime/gc_base/module.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!--
Copyright (c) 2006, 2019 IBM Corp. and others
Copyright (c) 2006, 2022 IBM Corp. and others
This program and the accompanying materials are made available under
the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -53,6 +53,8 @@ SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-excepti
<include path="j9gcstats"/>
<include path="$(OMR_DIR)/gc/stats" type="relativepath"/>
<include path="j9gcgluejava"/>
<include path="$(OMR_DIR)/gc/base/standard" type="relativepath"/>
<include path="j9modronstandard"/>
<include path="j9gcvlhgc"/>
<include path="$(OMR_DIR)/include_core" type="relativepath"/>
</includes>
Expand Down
2 changes: 1 addition & 1 deletion runtime/gc_glue_java/ScavengerDelegate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ class MM_ScavengerDelegate : public MM_BaseNonVirtual {
* prevents scavenging. Percolate collect instead.
*/
bool private_shouldPercolateGarbageCollect_activeJNICriticalRegions(MM_EnvironmentBase *envBase);
bool doContinuationObject(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, MM_ScavengeScanReason reason);

protected:
public:
Expand Down Expand Up @@ -157,6 +156,7 @@ class MM_ScavengerDelegate : public MM_BaseNonVirtual {

void setShouldScavengeUnfinalizedObjects(bool shouldScavenge) { _shouldScavengeUnfinalizedObjects = shouldScavenge; }
void setShouldScavengeContinuationObjects(bool shouldScavenge) { _shouldScavengeContinuationObjects = shouldScavenge; }
bool doContinuationObject(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, MM_ScavengeScanReason reason);

volatile bool getShouldScavengeFinalizableObjects() { return _shouldScavengeFinalizableObjects; }
volatile bool getShouldScavengeUnfinalizedObjects() { return _shouldScavengeUnfinalizedObjects; }
Expand Down
57 changes: 40 additions & 17 deletions runtime/gc_modron_standard/StandardAccessBarrier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,12 @@ MM_StandardAccessBarrier::postObjectStoreImpl(J9VMThread *vmThread, J9Object *ds
{
/* If the source object is NULL, there is no need for a write barrier. */
if(NULL != srcObject) {
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
if (_extensions->isConcurrentScavengerEnabled() && !_extensions->isScavengerBackOutFlagRaised()) {
Assert_MM_false(_extensions->scavenger->isObjectInEvacuateMemory(dstObject));
Assert_MM_false(_extensions->scavenger->isObjectInEvacuateMemory(srcObject));
Assert_MM_false(_scavenger->isObjectInEvacuateMemory(dstObject));
Assert_MM_false(_scavenger->isObjectInEvacuateMemory(srcObject));
}
#endif /* OMR_GC_CONCURRENT_SCAVENGER */

#if defined(OMR_GC_MODRON_CONCURRENT_MARK)
/* Call the concurrent write barrier if required */
Expand Down Expand Up @@ -757,10 +759,10 @@ MM_StandardAccessBarrier::preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *
omrobjectptr_t object = (omrobjectptr_t)*srcAddress;
bool const compressed = compressObjectReferences();

if ((NULL != _extensions->scavenger) && _extensions->scavenger->isObjectInEvacuateMemory(object)) {
if ((NULL != _scavenger) && _scavenger->isObjectInEvacuateMemory(object)) {
MM_EnvironmentStandard *env = MM_EnvironmentStandard::getEnvironment(vmThread->omrVMThread);
Assert_MM_true(_extensions->scavenger->isConcurrentCycleInProgress());
Assert_MM_true(_extensions->scavenger->isMutatorThreadInSyncWithCycle(env));
Assert_MM_true(_scavenger->isConcurrentCycleInProgress());
Assert_MM_true(_scavenger->isMutatorThreadInSyncWithCycle(env));

MM_ForwardedHeader forwardHeader(object, compressed);
omrobjectptr_t forwardPtr = forwardHeader.getForwardedObject();
Expand All @@ -787,8 +789,8 @@ MM_StandardAccessBarrier::preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddre
omrobjectptr_t object = (omrobjectptr_t)*srcAddress;
bool const compressed = compressObjectReferences();

if ((NULL != _extensions->scavenger) && _extensions->scavenger->isObjectInEvacuateMemory(object)) {
Assert_MM_true(_extensions->scavenger->isConcurrentCycleInProgress());
if ((NULL != _scavenger) && _scavenger->isObjectInEvacuateMemory(object)) {
Assert_MM_true(_scavenger->isConcurrentCycleInProgress());

MM_ForwardedHeader forwardHeader(object, compressed);
omrobjectptr_t forwardPtr = forwardHeader.getForwardedObject();
Expand All @@ -812,10 +814,10 @@ MM_StandardAccessBarrier::preObjectRead(J9VMThread *vmThread, J9Class *srcClass,
omrobjectptr_t object = *(volatile omrobjectptr_t *)srcAddress;
bool const compressed = compressObjectReferences();

if ((NULL != _extensions->scavenger) && _extensions->scavenger->isObjectInEvacuateMemory(object)) {
if ((NULL != _scavenger) && _scavenger->isObjectInEvacuateMemory(object)) {
MM_EnvironmentStandard *env = MM_EnvironmentStandard::getEnvironment(vmThread->omrVMThread);
Assert_MM_true(_extensions->scavenger->isConcurrentCycleInProgress());
Assert_MM_true(_extensions->scavenger->isMutatorThreadInSyncWithCycle(env));
Assert_MM_true(_scavenger->isConcurrentCycleInProgress());
Assert_MM_true(_scavenger->isMutatorThreadInSyncWithCycle(env));

MM_ForwardedHeader forwardHeader(object, compressed);
omrobjectptr_t forwardPtr = forwardHeader.getForwardedObject();
Expand All @@ -825,7 +827,7 @@ MM_StandardAccessBarrier::preObjectRead(J9VMThread *vmThread, J9Class *srcClass,
forwardHeader.copyOrWait(forwardPtr);
MM_AtomicOperations::lockCompareExchange((uintptr_t *)srcAddress, (uintptr_t)object, (uintptr_t)forwardPtr);
} else {
omrobjectptr_t destinationObjectPtr = _extensions->scavenger->copyObject(env, &forwardHeader);
omrobjectptr_t destinationObjectPtr = _scavenger->copyObject(env, &forwardHeader);
if (NULL == destinationObjectPtr) {
/* Failure - the scavenger must back out the work it has done. Attempt to return the original object. */
forwardPtr = forwardHeader.setSelfForwardedObject();
Expand Down Expand Up @@ -856,13 +858,13 @@ MM_StandardAccessBarrier::preObjectRead(J9VMThread *vmThread, J9Object *srcObjec
fomrobject_t objectToken = (fomrobject_t)(compressed ? (uintptr_t)*(volatile uint32_t *)srcAddress: *(volatile uintptr_t *)srcAddress);
omrobjectptr_t object = convertPointerFromToken(objectToken);

if (NULL != _extensions->scavenger) {
if (NULL != _scavenger) {
MM_EnvironmentStandard *env = MM_EnvironmentStandard::getEnvironment(vmThread->omrVMThread);
Assert_GC_true_with_message(env, !_extensions->scavenger->isObjectInEvacuateMemory((omrobjectptr_t)srcAddress) || _extensions->isScavengerBackOutFlagRaised(), "readObject %llx in Evacuate\n", srcAddress);
if (_extensions->scavenger->isObjectInEvacuateMemory(object)) {
Assert_GC_true_with_message2(env, _extensions->scavenger->isConcurrentCycleInProgress(),
Assert_GC_true_with_message(env, !_scavenger->isObjectInEvacuateMemory((omrobjectptr_t)srcAddress) || _extensions->isScavengerBackOutFlagRaised(), "readObject %llx in Evacuate\n", srcAddress);
if (_scavenger->isObjectInEvacuateMemory(object)) {
Assert_GC_true_with_message2(env, _scavenger->isConcurrentCycleInProgress(),
"CS not in progress, found a object in Survivor: slot %llx object %llx\n", srcAddress, object);
Assert_MM_true(_extensions->scavenger->isMutatorThreadInSyncWithCycle(env));
Assert_MM_true(_scavenger->isMutatorThreadInSyncWithCycle(env));
/* since object is still in evacuate, srcObject has not been scanned yet => we cannot assert
* if srcObject should (already) be remembered (even if it's old)
*/
Expand All @@ -881,7 +883,7 @@ MM_StandardAccessBarrier::preObjectRead(J9VMThread *vmThread, J9Object *srcObjec
forwardHeader.copyOrWait(forwardPtr);
slotObject.atomicWriteReferenceToSlot(object, forwardPtr);
} else {
omrobjectptr_t destinationObjectPtr = _extensions->scavenger->copyObject(env, &forwardHeader);
omrobjectptr_t destinationObjectPtr = _scavenger->copyObject(env, &forwardHeader);
if (NULL == destinationObjectPtr) {
/* We have no place to copy (or less likely, we lost to another thread forwarding it).
* We are forced to return the original location of the object.
Expand Down Expand Up @@ -1035,3 +1037,24 @@ MM_StandardAccessBarrier::checkClassLive(J9JavaVM *javaVM, J9Class *classPtr)
}
#endif /* defined(J9VM_GC_DYNAMIC_CLASS_UNLOADING) */

void
MM_StandardAccessBarrier::preMountContinuation(J9VMThread *vmThread, j9object_t contObject)
{
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
if (_extensions->isConcurrentScavengerInProgress()) {
/* concurrent scavenger in progress */
MM_EnvironmentStandard *env = (MM_EnvironmentStandard *) MM_EnvironmentBase::getEnvironment(vmThread->omrVMThread);
MM_ScavengeScanReason reason = SCAN_REASON_SCAVENGE;
_scavenger->getDelegate()->doContinuationObject(env, contObject, reason);
}
#endif /* OMR_GC_CONCURRENT_SCAVENGER */
}

void
MM_StandardAccessBarrier::postUnmountContinuation(J9VMThread *vmThread, j9object_t contObject)
{
/* Conservatively assume that via mutations of stack slots (which are not subject to access barriers),
* all post-write barriers have been triggered on this Continuation object, since it's been mounted.
*/
postBatchObjectStore(vmThread, contObject);
}
18 changes: 16 additions & 2 deletions runtime/gc_modron_standard/StandardAccessBarrier.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

/*******************************************************************************
* Copyright (c) 1991, 2021 IBM Corp. and others
* Copyright (c) 1991, 2022 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -49,8 +49,9 @@ class MM_StandardAccessBarrier : public MM_ObjectAccessBarrier
private:
#if defined(J9VM_GC_GENERATIONAL)
MM_GenerationalAccessBarrierComponent _generationalAccessBarrierComponent; /**< Generational Component of Access Barrier */
MM_Scavenger *_scavenger; /**< caching MM_GCExtensions::scavenger */
#endif /* J9VM_GC_GENERATIONAL */
MM_MarkingScheme *_markingScheme;
MM_MarkingScheme *_markingScheme; /**< caching MM_MarkingScheme instance */

void postObjectStoreImpl(J9VMThread *vmThread, J9Object *dstObject, J9Object *srcObject);
void postBatchObjectStoreImpl(J9VMThread *vmThread, J9Object *dstObject);
Expand All @@ -70,11 +71,21 @@ class MM_StandardAccessBarrier : public MM_ObjectAccessBarrier

MM_StandardAccessBarrier(MM_EnvironmentBase *env, MM_MarkingScheme *markingScheme) :
MM_ObjectAccessBarrier(env)
#if defined(J9VM_GC_GENERATIONAL)
, _scavenger(NULL)
#endif /* J9VM_GC_GENERATIONAL */
, _markingScheme(markingScheme)
{
_typeId = __FUNCTION__;
}

void registerScavenger(MM_Scavenger *scavenger)
{
#if defined(J9VM_GC_GENERATIONAL)
_scavenger = scavenger;
#endif /* J9VM_GC_GENERATIONAL */
}

virtual J9Object* asConstantPoolObject(J9VMThread *vmThread, J9Object* toConvert, UDATA allocationFlags);

virtual void rememberObjectImpl(MM_EnvironmentBase *env, J9Object* object);
Expand All @@ -88,6 +99,9 @@ class MM_StandardAccessBarrier : public MM_ObjectAccessBarrier
virtual bool postBatchObjectStore(J9VMThread *vmThread, J9Class *destClass, bool isVolatile=false);
virtual void recentlyAllocatedObject(J9VMThread *vmThread, J9Object *object);

virtual void preMountContinuation(J9VMThread *vmThread, j9object_t contObject);
virtual void postUnmountContinuation(J9VMThread *vmThread, j9object_t contObject);

virtual void* jniGetPrimitiveArrayCritical(J9VMThread* vmThread, jarray array, jboolean *isCopy);
virtual void jniReleasePrimitiveArrayCritical(J9VMThread* vmThread, jarray array, void * elems, jint mode);
virtual const jchar* jniGetStringCritical(J9VMThread* vmThread, jstring str, jboolean *isCopy);
Expand Down
9 changes: 9 additions & 0 deletions runtime/gc_realtime/RealtimeAccessBarrier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -950,5 +950,14 @@ MM_RealtimeAccessBarrier::forwardReferenceArrayCopyIndex(J9VMThread *vmThread, J
return -2;
}

void
MM_RealtimeAccessBarrier::preMountContinuation(J9VMThread *vmThread, j9object_t contObject)
{
MM_EnvironmentRealtime *env = (MM_EnvironmentRealtime *) MM_EnvironmentBase::getEnvironment(vmThread->omrVMThread);
if (isBarrierActive(env)) {
_realtimeGC->getRealtimeDelegate()->scanContinuationObject(env, contObject);
}
}

#endif /* J9VM_GC_REALTIME */

4 changes: 3 additions & 1 deletion runtime/gc_realtime/RealtimeAccessBarrier.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 1991, 2021 IBM Corp. and others
* Copyright (c) 1991, 2022 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -151,6 +151,8 @@ class MM_RealtimeAccessBarrier : public MM_ObjectAccessBarrier
virtual bool preObjectStore(J9VMThread *vmThread, J9Object *destClass, J9Object **destAddress, J9Object *value, bool isVolatile=false);
virtual bool preObjectStore(J9VMThread *vmThread, J9Object **destAddress, J9Object *value, bool isVolatile=false);

virtual void preMountContinuation(J9VMThread *vmThread, j9object_t contObject);

virtual I_32 backwardReferenceArrayCopyIndex(J9VMThread *vmThread, J9IndexableObject *srcObject, J9IndexableObject *destObject, I_32 srcIndex, I_32 destIndex, I_32 lengthInSlots);
virtual I_32 forwardReferenceArrayCopyIndex(J9VMThread *vmThread, J9IndexableObject *srcObject, J9IndexableObject *destObject, I_32 srcIndex, I_32 destIndex, I_32 lengthInSlots);

Expand Down
9 changes: 9 additions & 0 deletions runtime/gc_vlhgc/VLHGCAccessBarrier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -634,3 +634,12 @@ MM_VLHGCAccessBarrier::preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress)

return true;
}

void
MM_VLHGCAccessBarrier::postUnmountContinuation(J9VMThread *vmThread, j9object_t contObject)
{
/* Conservatively assume that via mutations of stack slots (which are not subject to access barriers),
* all post-write barriers have been triggered on this Continuation object, since it's been mounted.
*/
postBatchObjectStore(vmThread, contObject);
}
4 changes: 3 additions & 1 deletion runtime/gc_vlhgc/VLHGCAccessBarrier.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

/*******************************************************************************
* Copyright (c) 1991, 2021 IBM Corp. and others
* Copyright (c) 1991, 2022 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -82,6 +82,8 @@ class MM_VLHGCAccessBarrier : public MM_ObjectAccessBarrier
virtual bool preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
virtual bool preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress);

virtual void postUnmountContinuation(J9VMThread *vmThread, j9object_t contObject);

virtual I_32 backwardReferenceArrayCopyIndex(J9VMThread *vmThread, J9IndexableObject *srcObject, J9IndexableObject *destObject, I_32 srcIndex, I_32 destIndex, I_32 lengthInSlots);
virtual I_32 forwardReferenceArrayCopyIndex(J9VMThread *vmThread, J9IndexableObject *srcObject, J9IndexableObject *destObject, I_32 srcIndex, I_32 destIndex, I_32 lengthInSlots);

Expand Down

0 comments on commit 1a8e36d

Please sign in to comment.