Path: blob/master/runtime/gc_glue_java/CompactDelegate.cpp
5990 views
1/*******************************************************************************2* Copyright (c) 2017, 2020 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* 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-exception21*******************************************************************************/2223#include "CompactDelegate.hpp"24#include "CompactSchemeCheckMarkRoots.hpp"25#include "CompactSchemeFixupRoots.hpp"26#include "ConfigurationDelegate.hpp"27#include "HeapMapIterator.hpp"28#include "HeapRegionDescriptorStandard.hpp"29#include "HeapRegionIteratorStandard.hpp"30#include "MarkMap.hpp"31#include "OwnableSynchronizerObjectBuffer.hpp"32#include "OwnableSynchronizerObjectList.hpp"33#include "PointerContiguousArrayIterator.hpp"3435#if defined(OMR_GC_MODRON_COMPACTION)36bool37MM_CompactDelegate::initialize(MM_EnvironmentBase *env, OMR_VM *omrVM, MM_MarkMap *markMap, MM_CompactScheme *compactScheme)38{39_omrVM = omrVM;40_compactScheme = compactScheme;41_markMap = markMap;42return true;43}4445/**46* Free any internal structures associated to the receiver.47*/48void49MM_CompactDelegate::tearDown(MM_EnvironmentBase *env)50{5152}5354void55MM_CompactDelegate::verifyHeap(MM_EnvironmentBase *env, MM_MarkMap *markMap)56{57MM_GCExtensionsBase *extensions = env->getExtensions();58MM_CompactSchemeCheckMarkRoots rootChecker(MM_EnvironmentStandard::getEnvironment(env));59rootChecker.scanAllSlots(env);6061/* Check that the heap alignment is as compaction expects it. Compaction62* expects that the heap will split into a whole number of pages where63* each pages maps to 2 mark bit slots so heap alignment needs to be a multiple64* of the compaction page size65*/66assume0(extensions->heapAlignment % (2 * J9BITS_BITS_IN_SLOT * sizeof(UDATA)) == 0);6768MM_HeapRegionManager *regionManager = env->getExtensions()->getHeap()->getHeapRegionManager();69GC_HeapRegionIteratorStandard regionIterator(regionManager);70MM_HeapRegionDescriptorStandard *region = NULL;7172while(NULL != (region = regionIterator.nextRegion())) {73void *lowAddress = region->getLowAddress();74void *highAddress = region->getHighAddress();75MM_HeapMapIterator markedObjectIterator(extensions, markMap, (UDATA *)lowAddress, (UDATA *)highAddress);7677omrobjectptr_t objectPtr = NULL;78while (NULL != (objectPtr = markedObjectIterator.nextObject())) {79switch(extensions->objectModel.getScanType(objectPtr)) {80case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:81case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:82case GC_ObjectModel::SCAN_MIXED_OBJECT:83case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:84case GC_ObjectModel::SCAN_CLASS_OBJECT:85case GC_ObjectModel::SCAN_CLASSLOADER_OBJECT:86case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:87{88GC_MixedObjectIterator it(_omrVM, objectPtr);89while (GC_SlotObject* slotObject = it.nextSlot()) {90if ((slotObject->readReferenceFromSlot() >= extensions->getHeap()->getHeapBase()) && (slotObject->readReferenceFromSlot() < extensions->getHeap()->getHeapTop())) {91Assert_MM_true (markMap->isBitSet(slotObject->readReferenceFromSlot()));92}93}94break;95}9697case GC_ObjectModel::SCAN_POINTER_ARRAY_OBJECT:98{99GC_PointerContiguousArrayIterator it(_omrVM, objectPtr);100while (GC_SlotObject* slotObject = it.nextSlot()) {101if ((slotObject->readReferenceFromSlot() >= extensions->getHeap()->getHeapBase()) && (slotObject->readReferenceFromSlot() < extensions->getHeap()->getHeapTop())) {102Assert_MM_true (markMap->isBitSet(slotObject->readReferenceFromSlot()));103}104}105break;106}107108case GC_ObjectModel::SCAN_PRIMITIVE_ARRAY_OBJECT:109/* nothing to do */110break;111112default:113Assert_MM_unreachable();114}115}116}117}118119void120MM_CompactDelegate::fixupRoots(MM_EnvironmentBase *env, MM_CompactScheme *compactScheme)121{122MM_CompactSchemeFixupRoots rootScanner(env, compactScheme);123rootScanner.scanAllSlots(env);124}125126void127MM_CompactDelegate::workerCleanupAfterGC(MM_EnvironmentBase *env)128{129/* flush ownable synchronizer object buffer after rebuild the ownableSynchronizerObjectList during fixupObjects */130env->getGCEnvironment()->_ownableSynchronizerObjectBuffer->flush(env);131}132133void134MM_CompactDelegate::mainSetupForGC(MM_EnvironmentBase *env)135{136MM_GCExtensionsBase *extensions = env->getExtensions();137MM_HeapRegionDescriptorStandard *region = NULL;138GC_HeapRegionIteratorStandard regionIterator(extensions->getHeap()->getHeapRegionManager());139while (NULL != (region = regionIterator.nextRegion())) {140MM_HeapRegionDescriptorStandardExtension *regionExtension = MM_ConfigurationDelegate::getHeapRegionDescriptorStandardExtension(env, region);141for (uintptr_t i = 0; i < regionExtension->_maxListIndex; i++) {142MM_OwnableSynchronizerObjectList *list = ®ionExtension->_ownableSynchronizerObjectLists[i];143list->startOwnableSynchronizerProcessing();144}145}146}147148#endif /* OMR_GC_MODRON_COMPACTION */149150151