Skip to content

Instantly share code, notes, and snippets.

@rwy7
Created February 13, 2019 15:34
Show Gist options
  • Save rwy7/eae74d4e8b2bd1d0ab7d3d606f9eb5fb to your computer and use it in GitHub Desktop.
Save rwy7/eae74d4e8b2bd1d0ab7d3d606f9eb5fb to your computer and use it in GitHub Desktop.
--- upstream-master-cli-cpp 2019-02-13 10:27:27.112689338 -0500
+++ /Users/rwyoung/wsp/openj9-openjdk-jdk11/openj9/runtime/gc_glue_java/ScavengerDelegate.cpp 2019-02-06 16:52:43.493697694 -0500
@@ -1,6 +1,6 @@
/*******************************************************************************
- * Copyright (c) 1991, 2018 IBM Corp. and others
+ * Copyright (c) 2019, 2019 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
@@ -21,9 +21,14 @@
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
*******************************************************************************/
-#include "CollectorLanguageInterfaceImpl.hpp"
+#include "omrcfg.h"
+
+#if defined(OMR_GC_MODRON_SCAVENGER)
+
+#include "ScavengerDelegate.hpp"
#include "j9nongenerated.h"
+#include "j9consts.h"
#include "mmhook.h"
#include "mmomrhook_internal.h"
#include "mmprivatehook.h"
@@ -110,38 +115,11 @@
class MM_AllocationContext;
/**
- * Initialization
- */
-MM_CollectorLanguageInterfaceImpl *
-MM_CollectorLanguageInterfaceImpl::newInstance(MM_EnvironmentBase *env)
-{
- MM_CollectorLanguageInterfaceImpl *cliJava = NULL;
-
- cliJava = (MM_CollectorLanguageInterfaceImpl *)env->getForge()->allocate(sizeof(MM_CollectorLanguageInterfaceImpl), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());
- if (NULL != cliJava) {
- new(cliJava) MM_CollectorLanguageInterfaceImpl((J9JavaVM*)env->getLanguageVM());
- if (!cliJava->initialize(env)) {
- cliJava->kill(env);
- cliJava = NULL;
- }
- }
-
- return cliJava;
-}
-
-void
-MM_CollectorLanguageInterfaceImpl::kill(MM_EnvironmentBase *env)
-{
- tearDown(env);
- env->getForge()->free(this);
-}
-
-/**
* Initialize the collector's internal structures and values.
* @return true if initialization completed, false otherwise
*/
bool
-MM_CollectorLanguageInterfaceImpl::initialize(MM_EnvironmentBase *env)
+MM_ScavengerDelegate::initialize(MM_EnvironmentBase *env)
{
return true;
}
@@ -150,13 +128,12 @@
* Free any internal structures associated to the receiver.
*/
void
-MM_CollectorLanguageInterfaceImpl::tearDown(MM_EnvironmentBase *env)
+MM_ScavengerDelegate::tearDown(MM_EnvironmentBase *env)
{
}
-#if defined(OMR_GC_MODRON_SCAVENGER)
void
-MM_CollectorLanguageInterfaceImpl::scavenger_masterSetupForGC(MM_EnvironmentBase * envBase)
+MM_ScavengerDelegate::masterSetupForGC(MM_EnvironmentBase * envBase)
{
/* Remember the candidates of OwnableSynchronizerObject before
* clearing scavenger statistics
@@ -175,31 +152,31 @@
_extensions->scavengerJavaStats._ownableSynchronizerCandidates = ownableSynchronizerCandidates;
/* correspondent lists will be build this scavenge */
- _scavenger_shouldScavengeSoftReferenceObjects = false;
- _scavenger_shouldScavengeWeakReferenceObjects = false;
- _scavenger_shouldScavengePhantomReferenceObjects = false;
+ _shouldScavengeSoftReferenceObjects = false;
+ _shouldScavengeWeakReferenceObjects = false;
+ _shouldScavengePhantomReferenceObjects = false;
/* Record whether finalizable processing is required in this scavenge */
- _scavenger_shouldScavengeFinalizableObjects = _extensions->finalizeListManager->isFinalizableObjectProcessingRequired();
- _scavenger_shouldScavengeUnfinalizedObjects = false;
+ _shouldScavengeFinalizableObjects = _extensions->finalizeListManager->isFinalizableObjectProcessingRequired();
+ _shouldScavengeUnfinalizedObjects = false;
- private_scavenger_setupForOwnableSynchronizerProcessing(MM_EnvironmentStandard::getEnvironment(envBase));
+ private_setupForOwnableSynchronizerProcessing(MM_EnvironmentStandard::getEnvironment(envBase));
return;
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_workerSetupForGC_clearEnvironmentLangStats(MM_EnvironmentBase *envBase)
+MM_ScavengerDelegate::workerSetupForGC_clearEnvironmentLangStats(MM_EnvironmentBase *envBase)
{
/* clear thread-local java-only gc stats */
envBase->getGCEnvironment()->_scavengerJavaStats.clear();
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_reportScavengeEnd(MM_EnvironmentBase * envBase, bool scavengeSuccessful)
+MM_ScavengerDelegate::reportScavengeEnd(MM_EnvironmentBase * envBase, bool scavengeSuccessful)
{
Assert_GC_true_with_message2(envBase, _extensions->scavengerJavaStats._ownableSynchronizerCandidates >= _extensions->scavengerJavaStats._ownableSynchronizerTotalSurvived,
- "[MM_CollectorLanguageInterfaceImpl::scavenger_reportScavengeEnd]: _extensions->scavengerJavaStats: _ownableSynchronizerCandidates=%zu < _ownableSynchronizerTotalSurvived=%zu\n", _extensions->scavengerJavaStats._ownableSynchronizerCandidates, _extensions->scavengerJavaStats._ownableSynchronizerTotalSurvived);
+ "[MM_ScavengerDelegate::reportScavengeEnd]: _extensions->scavengerJavaStats: _ownableSynchronizerCandidates=%zu < _ownableSynchronizerTotalSurvived=%zu\n", _extensions->scavengerJavaStats._ownableSynchronizerCandidates, _extensions->scavengerJavaStats._ownableSynchronizerTotalSurvived);
if (!scavengeSuccessful) {
/* for backout case, the ownableSynchronizerObject lists is restored before scavenge, so all of candidates are survived */
@@ -210,7 +187,7 @@
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_mergeGCStats_mergeLangStats(MM_EnvironmentBase * envBase)
+MM_ScavengerDelegate::mergeGCStats_mergeLangStats(MM_EnvironmentBase * envBase)
{
MM_EnvironmentStandard* env = MM_EnvironmentStandard::getEnvironment(envBase);
@@ -230,11 +207,11 @@
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_masterThreadGarbageCollect_scavengeComplete(MM_EnvironmentBase * envBase)
+MM_ScavengerDelegate::masterThreadGarbageCollect_scavengeComplete(MM_EnvironmentBase * envBase)
{
#if defined(J9VM_GC_FINALIZATION)
/* Alert the finalizer if work needs to be done */
- if(this->scavenger_getFinalizationRequired()) {
+ if(this->getFinalizationRequired()) {
omrthread_monitor_enter(_javaVM->finalizeMasterMonitor);
_javaVM->finalizeMasterFlags |= J9_FINALIZE_FLAGS_MASTER_WAKE_UP;
omrthread_monitor_notify_all(_javaVM->finalizeMasterMonitor);
@@ -244,7 +221,7 @@
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_masterThreadGarbageCollect_scavengeSuccess(MM_EnvironmentBase *envBase)
+MM_ScavengerDelegate::masterThreadGarbageCollect_scavengeSuccess(MM_EnvironmentBase *envBase)
{
/* Once a scavenge has been completed successfully ensure that
* identity hash salt for the nursery gets updated
@@ -263,15 +240,15 @@
* 2. JNI critical sections require that objects cannot be moved.
*/
bool
-MM_CollectorLanguageInterfaceImpl::scavenger_internalGarbageCollect_shouldPercolateGarbageCollect(MM_EnvironmentBase *envBase, PercolateReason * percolateReason, U_32 * percolateType)
+MM_ScavengerDelegate::internalGarbageCollect_shouldPercolateGarbageCollect(MM_EnvironmentBase *envBase, PercolateReason * percolateReason, U_32 * percolateType)
{
bool shouldPercolate = false;
- if (private_scavenger_shouldPercolateGarbageCollect_classUnloading(envBase)) {
+ if (private_shouldPercolateGarbageCollect_classUnloading(envBase)) {
*percolateReason = UNLOADING_CLASSES;
*percolateType = J9MMCONSTANT_IMPLICIT_GC_PERCOLATE_UNLOADING_CLASSES;
shouldPercolate = true;
- } else if (private_scavenger_shouldPercolateGarbageCollect_activeJNICriticalRegions(envBase)) {
+ } else if (private_shouldPercolateGarbageCollect_activeJNICriticalRegions(envBase)) {
Trc_MM_Scavenger_percolate_activeJNICritical(envBase->getLanguageVMThread());
*percolateReason = CRITICAL_REGIONS;
*percolateType = J9MMCONSTANT_IMPLICIT_GC_PERCOLATE_CRITICAL_REGIONS;
@@ -282,11 +259,11 @@
}
GC_ObjectScanner *
-MM_CollectorLanguageInterfaceImpl::scavenger_getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, void *allocSpace, uintptr_t flags)
+MM_ScavengerDelegate::getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, void *allocSpace, uintptr_t flags)
{
-#if defined(OMR_GC_MODRON_SCAVENGER_STRICT)
+#if defined(OMR_GC_MODRON_STRICT)
Assert_MM_true((GC_ObjectScanner::scanHeap == flags) ^ (GC_ObjectScanner::scanRoots == flags));
-#endif /* defined(OMR_GC_MODRON_SCAVENGER_STRICT) */
+#endif /* defined(OMR_GC_MODRON_STRICT) */
GC_ObjectScanner *objectScanner = NULL;
switch(_extensions->objectModel.getScanType(objectPtr)) {
@@ -311,8 +288,8 @@
switch (referenceObjectType) {
case J9_JAVA_CLASS_REFERENCE_WEAK:
referentMustBeCleared = (0 != (referenceObjectOptions & MM_CycleState::references_clear_weak));
- if (!referentMustBeCleared && shouldScavengeReferenceObject && !_scavenger_shouldScavengeWeakReferenceObjects) {
- _scavenger_shouldScavengeWeakReferenceObjects = true;
+ if (!referentMustBeCleared && shouldScavengeReferenceObject && !_shouldScavengeWeakReferenceObjects) {
+ _shouldScavengeWeakReferenceObjects = true;
}
break;
case J9_JAVA_CLASS_REFERENCE_SOFT:
@@ -320,14 +297,14 @@
referentMustBeMarked = referentMustBeMarked || ((0 == (referenceObjectOptions & MM_CycleState::references_soft_as_weak))
&& ((UDATA)J9GC_J9VMJAVALANGSOFTREFERENCE_AGE(env, objectPtr) < _extensions->getDynamicMaxSoftReferenceAge())
);
- if (!referentMustBeCleared && shouldScavengeReferenceObject && !_scavenger_shouldScavengeSoftReferenceObjects) {
- _scavenger_shouldScavengeSoftReferenceObjects = true;
+ if (!referentMustBeCleared && shouldScavengeReferenceObject && !_shouldScavengeSoftReferenceObjects) {
+ _shouldScavengeSoftReferenceObjects = true;
}
break;
case J9_JAVA_CLASS_REFERENCE_PHANTOM:
referentMustBeCleared = (0 != (referenceObjectOptions & MM_CycleState::references_clear_phantom));
- if (!referentMustBeCleared && shouldScavengeReferenceObject && !_scavenger_shouldScavengePhantomReferenceObjects) {
- _scavenger_shouldScavengePhantomReferenceObjects = true;
+ if (!referentMustBeCleared && shouldScavengeReferenceObject && !_shouldScavengePhantomReferenceObjects) {
+ _shouldScavengePhantomReferenceObjects = true;
}
break;
default:
@@ -355,7 +332,7 @@
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
if (!_extensions->isConcurrentScavengerEnabled()) {
if (GC_ObjectScanner::isHeapScan(flags)) {
- private_scavenger_addOwnableSynchronizerObjectInList(env, objectPtr);
+ private_addOwnableSynchronizerObjectInList(env, objectPtr);
}
}
objectScanner = GC_MixedObjectScanner::newInstance(env, objectPtr, allocSpace, flags);
@@ -378,13 +355,13 @@
return objectScanner;
}
-void MM_CollectorLanguageInterfaceImpl::scavenger_flushReferenceObjects(MM_EnvironmentStandard *env)
+void MM_ScavengerDelegate::flushReferenceObjects(MM_EnvironmentStandard *env)
{
env->getGCEnvironment()->_referenceObjectBuffer->flush(env);
}
bool
-MM_CollectorLanguageInterfaceImpl::scavenger_scavengeIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
+MM_ScavengerDelegate::scavengeIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
bool shouldBeRemembered = false;
@@ -410,7 +387,7 @@
}
bool
-MM_CollectorLanguageInterfaceImpl::scavenger_hasIndirectReferentsInNewSpace(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
+MM_ScavengerDelegate::hasIndirectReferentsInNewSpace(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
J9Class *classToScan = J9VM_J9CLASS_FROM_HEAPCLASS((J9VMThread*)env->getLanguageVMThread(), objectPtr);
Assert_MM_true(NULL != classToScan);
@@ -453,7 +430,7 @@
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
void
-MM_CollectorLanguageInterfaceImpl::scavenger_fixupIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
+MM_ScavengerDelegate::fixupIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
J9Class *clazz = J9VM_J9CLASS_FROM_HEAPCLASS((J9VMThread*)env->getLanguageVMThread(), objectPtr);
Assert_MM_true(NULL != clazz);
@@ -475,7 +452,7 @@
#endif /* OMR_GC_CONCURRENT_SCAVENGER */
void
-MM_CollectorLanguageInterfaceImpl::scavenger_backOutIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
+MM_ScavengerDelegate::backOutIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
J9Class *clazz = J9VM_J9CLASS_FROM_HEAPCLASS((J9VMThread*)env->getLanguageVMThread(), objectPtr);
Assert_MM_true(NULL != clazz);
@@ -496,7 +473,7 @@
}
void
-MM_CollectorLanguageInterfaceImpl:: scavenger_backOutIndirectObjects(MM_EnvironmentStandard *env)
+MM_ScavengerDelegate::backOutIndirectObjects(MM_EnvironmentStandard *env)
{
GC_SegmentIterator classSegmentIterator(((J9JavaVM*)_omrVM->_language_vm)->classMemorySegments, MEMORY_TYPE_RAM_CLASS);
J9MemorySegment *classMemorySegment;
@@ -522,7 +499,7 @@
* @param[in] env the environment for the current thread
*/
void
-MM_CollectorLanguageInterfaceImpl::scavenger_reverseForwardedObject(MM_EnvironmentBase *env, MM_ForwardedHeader *originalForwardedHeader)
+MM_ScavengerDelegate::reverseForwardedObject(MM_EnvironmentBase *env, MM_ForwardedHeader *originalForwardedHeader)
{
if (originalForwardedHeader->isForwardedPointer()) {
omrobjectptr_t objectPtr = originalForwardedHeader->getObject();
@@ -572,7 +549,7 @@
#if defined (J9VM_INTERP_COMPRESSED_OBJECT_HEADER)
void
-MM_CollectorLanguageInterfaceImpl::scavenger_fixupDestroyedSlot(MM_EnvironmentBase *env, MM_ForwardedHeader *originalForwardedHeader, MM_MemorySubSpaceSemiSpace *subSpaceNew)
+MM_ScavengerDelegate::fixupDestroyedSlot(MM_EnvironmentBase *env, MM_ForwardedHeader *originalForwardedHeader, MM_MemorySubSpaceSemiSpace *subSpaceNew)
{
/* Nothing to do if overlap slot is not an object reference, and the destroyed slot for indexable objects is the size */
if ((0 != originalForwardedHeader->getPreservedOverlap())
@@ -611,7 +588,7 @@
#endif /* defined (J9VM_INTERP_COMPRESSED_OBJECT_HEADER) */
void
-MM_CollectorLanguageInterfaceImpl::private_scavenger_addOwnableSynchronizerObjectInList(MM_EnvironmentStandard *env, omrobjectptr_t object)
+MM_ScavengerDelegate::private_addOwnableSynchronizerObjectInList(MM_EnvironmentStandard *env, omrobjectptr_t object)
{
omrobjectptr_t link = MM_GCExtensions::getExtensions(_extensions)->accessBarrier->isObjectInOwnableSynchronizerList(object);
/* if isObjectInOwnableSynchronizerList() return NULL, it means the object isn't in OwanbleSynchronizerList,
@@ -629,7 +606,7 @@
}
void
-MM_CollectorLanguageInterfaceImpl::private_scavenger_setupForOwnableSynchronizerProcessing(MM_EnvironmentStandard *env)
+MM_ScavengerDelegate::private_setupForOwnableSynchronizerProcessing(MM_EnvironmentStandard *env)
{
MM_HeapRegionDescriptorStandard *region = NULL;
GC_HeapRegionIteratorStandard regionIterator(_extensions->heapRegionManager);
@@ -647,7 +624,7 @@
}
bool
-MM_CollectorLanguageInterfaceImpl::private_scavenger_shouldPercolateGarbageCollect_classUnloading(MM_EnvironmentBase *envBase)
+MM_ScavengerDelegate::private_shouldPercolateGarbageCollect_classUnloading(MM_EnvironmentBase *envBase)
{
bool shouldGCPercolate = false;
@@ -660,7 +637,7 @@
}
bool
-MM_CollectorLanguageInterfaceImpl::private_scavenger_shouldPercolateGarbageCollect_activeJNICriticalRegions(MM_EnvironmentBase *envBase)
+MM_ScavengerDelegate::private_shouldPercolateGarbageCollect_activeJNICriticalRegions(MM_EnvironmentBase *envBase)
{
bool shouldGCPercolate = false;
@@ -673,12 +650,12 @@
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
bool
-MM_CollectorLanguageInterfaceImpl::scavenger_shouldYield() {
+MM_ScavengerDelegate::shouldYield() {
return (J9_XACCESS_PENDING == ((J9JavaVM*)_omrVM->_language_vm)->exclusiveAccessState);
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_switchConcurrentForThread(MM_EnvironmentBase *env)
+MM_ScavengerDelegate::switchConcurrentForThread(MM_EnvironmentBase *env)
{
PORT_ACCESS_FROM_ENVIRONMENT(env);
J9VMThread *vmThread = (J9VMThread *)env->getOmrVMThread()->_language_vmthread;
@@ -744,18 +721,35 @@
}
}
#endif /* OMR_GC_CONCURRENT_SCAVENGER */
-#endif /* OMR_GC_MODRON_SCAVENGER */
#if defined(OMR_ENV_DATA64) && !defined(OMR_GC_COMPRESSED_POINTERS)
void
-MM_CollectorLanguageInterfaceImpl::scavenger_poisonSlots(MM_EnvironmentBase *env)
+MM_ScavengerDelegate::poisonSlots(MM_EnvironmentBase *env)
{
((MM_ReadBarrierVerifier *)_extensions->accessBarrier)->poisonSlots(env);
}
void
-MM_CollectorLanguageInterfaceImpl::scavenger_healSlots(MM_EnvironmentBase *env)
+MM_ScavengerDelegate::healSlots(MM_EnvironmentBase *env)
{
((MM_ReadBarrierVerifier *)_extensions->accessBarrier)->healSlots(env);
}
#endif /* defined(OMR_ENV_DATA64) && !defined(OMR_GC_COMPRESSED_POINTERS) */
+
+MM_ScavengerDelegate::MM_ScavengerDelegate(MM_EnvironmentBase* env)
+ : _omrVM(MM_GCExtensions::getExtensions(env)->getOmrVM())
+ , _javaVM(MM_GCExtensions::getExtensions(env)->getJavaVM())
+ , _extensions(MM_GCExtensions::getExtensions(env))
+ , _shouldScavengeFinalizableObjects(false)
+ , _shouldScavengeUnfinalizedObjects(false)
+ , _shouldScavengeSoftReferenceObjects(false)
+ , _shouldScavengeWeakReferenceObjects(false)
+ , _shouldScavengePhantomReferenceObjects(false)
+#if defined(J9VM_GC_FINALIZATION)
+ , _finalizationRequired(false)
+#endif /* J9VM_GC_FINALIZATION */
+{
+ _typeId = __FUNCTION__;
+}
+
+#endif /* defined(OMR_GC_MODRON_SCAVENGER) */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment